191 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Linq;
 | 
						|
using EpicGames.UHT.Types;
 | 
						|
 | 
						|
namespace UnrealSharpScriptGenerator.Tooltip;
 | 
						|
 | 
						|
public static class TooltipParser
 | 
						|
{
 | 
						|
    private static void ParseTooltip(string inTooltip, ref ParsedTooltip outParsedTooltip)
 | 
						|
    {
 | 
						|
        string sourceTooltip = inTooltip;
 | 
						|
        int sourceTooltipParseIndex = 0;
 | 
						|
 | 
						|
        void SkipToNextToken()
 | 
						|
        {
 | 
						|
            while (sourceTooltipParseIndex < sourceTooltip.Length && 
 | 
						|
                   (char.IsWhiteSpace(sourceTooltip[sourceTooltipParseIndex]) ||
 | 
						|
                    sourceTooltip[sourceTooltipParseIndex] == '-'))
 | 
						|
            {
 | 
						|
                ++sourceTooltipParseIndex;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        var tokenStartIndex = sourceTooltipParseIndex;
 | 
						|
 | 
						|
        void ParseSimpleToken(ref ParsedTooltip.TokenString outToken)
 | 
						|
        {
 | 
						|
            while (sourceTooltipParseIndex < sourceTooltip.Length && !char.IsWhiteSpace(sourceTooltip[sourceTooltipParseIndex]))
 | 
						|
            {
 | 
						|
                ++sourceTooltipParseIndex;
 | 
						|
            }
 | 
						|
            
 | 
						|
            outToken.SimpleValue = sourceTooltip.Substring(tokenStartIndex, sourceTooltipParseIndex - tokenStartIndex);
 | 
						|
        }
 | 
						|
 | 
						|
        void ParseComplexToken(ref ParsedTooltip.TokenString outToken)
 | 
						|
        {
 | 
						|
            int startIndex = sourceTooltipParseIndex;
 | 
						|
            while (sourceTooltipParseIndex < sourceTooltip.Length && sourceTooltip[sourceTooltipParseIndex] != '@')
 | 
						|
            {
 | 
						|
                if (char.IsWhiteSpace(sourceTooltip[sourceTooltipParseIndex]))
 | 
						|
                {
 | 
						|
                    if (startIndex != -1)
 | 
						|
                    {
 | 
						|
                        outToken.ComplexValue = sourceTooltip.Substring(startIndex, sourceTooltipParseIndex - startIndex);
 | 
						|
                        startIndex = -1;
 | 
						|
                    }
 | 
						|
 | 
						|
                    while (sourceTooltipParseIndex < sourceTooltip.Length && char.IsWhiteSpace(sourceTooltip[sourceTooltipParseIndex]))
 | 
						|
                    {
 | 
						|
                        ++sourceTooltipParseIndex;
 | 
						|
                    }
 | 
						|
                    
 | 
						|
                    while (sourceTooltipParseIndex < sourceTooltip.Length && char.IsWhiteSpace(sourceTooltip[sourceTooltipParseIndex]))
 | 
						|
                    {
 | 
						|
                        ++sourceTooltipParseIndex;
 | 
						|
                    }
 | 
						|
 | 
						|
                    outToken.ComplexValue += ' ';
 | 
						|
                }
 | 
						|
 | 
						|
                if (sourceTooltipParseIndex < sourceTooltip.Length && sourceTooltip[sourceTooltipParseIndex] != '@')
 | 
						|
                {
 | 
						|
                    if (startIndex == -1)
 | 
						|
                    {
 | 
						|
                        outToken.ComplexValue += sourceTooltip[sourceTooltipParseIndex];
 | 
						|
                    }
 | 
						|
 | 
						|
                    ++sourceTooltipParseIndex;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (startIndex == -1)
 | 
						|
            {
 | 
						|
                outToken.ComplexValue = outToken.ComplexValue.TrimEnd();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                outToken.SimpleValue =
 | 
						|
                    sourceTooltip.Substring(startIndex, sourceTooltipParseIndex - startIndex);
 | 
						|
                outToken.SimpleValue = outToken.SimpleValue.TrimEnd();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        while (sourceTooltipParseIndex < sourceTooltip.Length)
 | 
						|
        {
 | 
						|
            if (sourceTooltip[sourceTooltipParseIndex] == '@')
 | 
						|
            {
 | 
						|
                ++sourceTooltipParseIndex;
 | 
						|
                if (sourceTooltipParseIndex < sourceTooltip.Length && sourceTooltip[sourceTooltipParseIndex] == '@')
 | 
						|
                {
 | 
						|
                    outParsedTooltip.BasicTooltipText += '@';
 | 
						|
                    ++sourceTooltipParseIndex;
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                var tokenName = new ParsedTooltip.TokenString();
 | 
						|
                SkipToNextToken();
 | 
						|
                ParseSimpleToken(ref tokenName);
 | 
						|
 | 
						|
                if (tokenName.Value == "param")
 | 
						|
                {
 | 
						|
                    var paramToken = new ParsedTooltip.ParamToken();
 | 
						|
 | 
						|
                    SkipToNextToken();
 | 
						|
                    ParseSimpleToken(ref paramToken.ParamName);
 | 
						|
 | 
						|
                    SkipToNextToken();
 | 
						|
                    ParseComplexToken(ref paramToken.ParamComment);
 | 
						|
 | 
						|
                    outParsedTooltip.ParamTokens.Add(paramToken);
 | 
						|
                }
 | 
						|
                else if (tokenName.Value is "return" or "returns")
 | 
						|
                {
 | 
						|
                    SkipToNextToken();
 | 
						|
                    ParseComplexToken(ref outParsedTooltip.ReturnToken.ParamComment);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    var miscToken = new ParsedTooltip.MiscToken
 | 
						|
                    {
 | 
						|
                        TokenName = tokenName
 | 
						|
                    };
 | 
						|
 | 
						|
                    SkipToNextToken();
 | 
						|
                    ParseComplexToken(ref miscToken.TokenValue);
 | 
						|
 | 
						|
                    outParsedTooltip.MiscTokens.Add(miscToken);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                outParsedTooltip.BasicTooltipText += sourceTooltip[sourceTooltipParseIndex++];
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static void AppendTooltip(this GeneratorStringBuilder builder, string toolTip)
 | 
						|
    {
 | 
						|
        if (string.IsNullOrEmpty(toolTip))
 | 
						|
        {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        ParsedTooltip parsedTooltip = new();
 | 
						|
        ParseTooltip(toolTip, ref parsedTooltip);
 | 
						|
 | 
						|
        if (!string.IsNullOrEmpty(parsedTooltip.BasicTooltipText))
 | 
						|
        {
 | 
						|
            string[] lines = parsedTooltip.BasicTooltipText.Split(new[] { '\n' }, StringSplitOptions.None);
 | 
						|
            
 | 
						|
            builder.AppendLine("/// <summary>");
 | 
						|
            foreach (var line in lines)
 | 
						|
            {
 | 
						|
                builder.AppendLine($"/// {line}");
 | 
						|
            }
 | 
						|
            builder.AppendLine("/// </summary>");
 | 
						|
        }
 | 
						|
 | 
						|
        if (parsedTooltip.ParamTokens.Any())
 | 
						|
        {
 | 
						|
            foreach (var miscToken in parsedTooltip.ParamTokens)
 | 
						|
            {
 | 
						|
                builder.AppendLine($"/// <param name=\"{miscToken.ParamName.Value}\">{miscToken.ParamComment.Value}</param>");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        var returnToolTip = parsedTooltip.ReturnToken.ParamComment.Value;
 | 
						|
        if (string.IsNullOrEmpty(returnToolTip))
 | 
						|
        {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        builder.AppendLine("/// <returns>");
 | 
						|
        builder.Append(returnToolTip);
 | 
						|
        builder.Append("</returns>");
 | 
						|
    }
 | 
						|
 | 
						|
    public static void AppendTooltip(this GeneratorStringBuilder builder, UhtType type)
 | 
						|
    {
 | 
						|
        string toolTip = type.GetToolTipText();
 | 
						|
        
 | 
						|
        // Skip if the tooltip is just the same as the source name. UHT automatically generates these.
 | 
						|
        if (toolTip == type.SourceName)
 | 
						|
        {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        
 | 
						|
        AppendTooltip(builder, toolTip);
 | 
						|
    }
 | 
						|
} |