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