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);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |