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