【发布时间】:2019-01-07 18:23:34
【问题描述】:
我正在为 Roslyn 编写一个需要标记属性返回类型的分析器。我让它标记属性声明本身。我查看了调试器,但找不到以返回类型令牌为目标的位置。
例子:
// important code for analzyer
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzeSyntax, SyntaxKind.MethodDeclaration, SyntaxKind.PropertyDeclaration);
}
private static void AnalyzeSyntax(SyntaxNodeAnalysisContext context)
{
var propertySymbol = context.ContainingSymbol as IPropertySymbol;
var propertyType = propertySymbol.Type;
if (propertyType.Name != "Class1") return;
var diagnostic = Diagnostic.Create(Rule, propertySymbol.Locations[0], propertyType.Name);
context.ReportDiagnostic(diagnostic);
break;
}
// example where it should be working
public class Usage
{
public Class1 Test { get; set; }
}
它目前将绿色波浪线放在Usage.Test 属性名称下,但我希望它在该属性的返回类型下。
context.ContainingSymbol 有一个Locations 属性,但它只指定了一个位置,并且它专门指向Test。 context.Node 指定了覆盖整个属性的其他几个跨度,但它不是完整的 Location 对象,所以我不能使用它们。
编辑 1
显然,我在 .Net Standard 和 VS 2017 中执行此操作很重要。.Net 4.5 分析器可以通过 MSBuildWorkspace 和 SymbolFinder 类访问用法,但 .Net Standard 没有 @987654330 @ 出于某种原因,我无法将当前解决方案传递给SymbolFinder.FindReferencesAsync()。
【问题讨论】:
-
你试过
propertyType.Locations[0]吗?如果它仍然对您不起作用,您可以检索属性的相应声明语法节点 (propertySymbol.DeclaringSyntaxReferences[0]) 并查看其中的返回类型节点 -
是的,
propertyType.Locations[0]是我现在的代码中的内容,但它似乎没有生成报告(在我的情况下是编译器警告)。我在语法参考中看不到如何到达返回类型节点。唯一的公共成员是Span和SyntaxTree,它们不太有用。 -
关于现在正在生成的报告,我的意思是我将其提交给
ReportDiagnostics()方法,但没有任何反应。没有波浪线,也没有编译器警告。