Lua向C#逻辑迁移 一期 #13

将整个插件代码上传
This commit is contained in:
2025-10-26 21:48:39 +08:00
parent 56994b3927
commit 648386cd73
785 changed files with 53683 additions and 2 deletions

View File

@ -0,0 +1,191 @@
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);
}
}