Rosyln 的 ToFullString() 输出是否预期包含先前的“#endregion”?
Is it expected for Rosyln's ToFullString() output to contain a previous "#endregion"?
我正在使用 Roslyn 开发一个搜索代码库的小工具。一个功能是我可以搜索某个方法是否存在,如果存在,我 return 将完整的方法文本显示在 UI.
上
我正在使用集成了 Roslyn 的 Visual Studio 2015。我观察到的一个奇怪的情况是特定方法是#region 中的第一个方法。
每当我获得该特定方法的全文时,我都会从前一个区域结尾和当前区域开始部分获得额外的#endregion。
我为区域内的第一个方法获取的示例输出。
#endregion -- why is this coming?
#region Public Methods and Operators
/// <summary>
/// My Method's summary.
/// </summary>
/// <param name="param1">
/// The param1.
/// </param>
/// <returns>
/// returns something
/// </returns>
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SampleMethod(Parameter param1)
{
....
....
sample code
return this.RedirectToAction("sample_action");
}
下面给出了我为获取完整方法文本而编写的代码。
var MethodText = ((MethodDeclarationSyntax)method).ToFullString()
这是预期的工作方式吗?
从语法可视化工具来看,它看起来不太合适。我不完全确定这是否是预期的行为,但感觉并不像你说的那样。
但是,如果您不需要任何文档,您可以使用 ToString()
,它只会 return 方法和其中的所有内容。
ToFullString()
包括开头和结尾的琐事。它似乎一直上升到下一个领先的 SyntaxNode。
在使用 ToFullString()
之前,您现在可以使用类似的方法删除琐事
var trivia = method.DescendantTrivia()
.Where(t => t.IsKind(SyntaxKind.EndRegionDirectiveTrivia));
foreach (var t in trivia)
{
method = method.ReplaceTrivia(t, trivia.ToSyntaxTriviaList()
.Except(st => st.IsKind(SyntaxKind.EndRegionDirectiveTrivia)));
}
method.ToFullString();
我似乎找不到关于 Roslyn Github 问题的任何问题。
编辑:您也没有得到该方法的 #endregion
。我建议删除任何区域语法类型,然后调用 .ToFullString()
解析器有一个通用规则"trivia on a line by itself gets attached to the next real token on some future line"。所以在这种情况下,方法之前的所有琐事都附加到下一个方法。 #endregion 没有做其他事情的特殊情况逻辑。也许应该,但今天不会。
您可能需要编写一些自定义代码来调整您的显示。例如,您可能想要排除所有不是文档评论琐事的琐事。考虑这个更人为的案例:
#region Comment
// some long comment about the method below me
#endregion
void AbandonAllHopeYeWhoEntersHere() { ...}
你想显示吗?老实说,不太确定。
琐事并不琐碎。它涉及在很多情况下弄清楚用户意图,所以我们采用简单的规则而不是大量的启发式方法。 (我们经常考虑将 trivia 重命名为 "complexia" 或其他东西以警告从远处接近的人,但决定不这样做。)
我正在使用 Roslyn 开发一个搜索代码库的小工具。一个功能是我可以搜索某个方法是否存在,如果存在,我 return 将完整的方法文本显示在 UI.
上我正在使用集成了 Roslyn 的 Visual Studio 2015。我观察到的一个奇怪的情况是特定方法是#region 中的第一个方法。
每当我获得该特定方法的全文时,我都会从前一个区域结尾和当前区域开始部分获得额外的#endregion。
我为区域内的第一个方法获取的示例输出。
#endregion -- why is this coming?
#region Public Methods and Operators
/// <summary>
/// My Method's summary.
/// </summary>
/// <param name="param1">
/// The param1.
/// </param>
/// <returns>
/// returns something
/// </returns>
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SampleMethod(Parameter param1)
{
....
....
sample code
return this.RedirectToAction("sample_action");
}
下面给出了我为获取完整方法文本而编写的代码。
var MethodText = ((MethodDeclarationSyntax)method).ToFullString()
这是预期的工作方式吗?
从语法可视化工具来看,它看起来不太合适。我不完全确定这是否是预期的行为,但感觉并不像你说的那样。
但是,如果您不需要任何文档,您可以使用 ToString()
,它只会 return 方法和其中的所有内容。
ToFullString()
包括开头和结尾的琐事。它似乎一直上升到下一个领先的 SyntaxNode。
在使用 ToFullString()
var trivia = method.DescendantTrivia()
.Where(t => t.IsKind(SyntaxKind.EndRegionDirectiveTrivia));
foreach (var t in trivia)
{
method = method.ReplaceTrivia(t, trivia.ToSyntaxTriviaList()
.Except(st => st.IsKind(SyntaxKind.EndRegionDirectiveTrivia)));
}
method.ToFullString();
我似乎找不到关于 Roslyn Github 问题的任何问题。
编辑:您也没有得到该方法的 #endregion
。我建议删除任何区域语法类型,然后调用 .ToFullString()
解析器有一个通用规则"trivia on a line by itself gets attached to the next real token on some future line"。所以在这种情况下,方法之前的所有琐事都附加到下一个方法。 #endregion 没有做其他事情的特殊情况逻辑。也许应该,但今天不会。
您可能需要编写一些自定义代码来调整您的显示。例如,您可能想要排除所有不是文档评论琐事的琐事。考虑这个更人为的案例:
#region Comment
// some long comment about the method below me
#endregion
void AbandonAllHopeYeWhoEntersHere() { ...}
你想显示吗?老实说,不太确定。
琐事并不琐碎。它涉及在很多情况下弄清楚用户意图,所以我们采用简单的规则而不是大量的启发式方法。 (我们经常考虑将 trivia 重命名为 "complexia" 或其他东西以警告从远处接近的人,但决定不这样做。)