我正在寻找扫描一组.cs文件,以查看哪些文件调用a的Value属性Nullable<T>(查找所有引用)。例如,这将匹配:
Value
Nullable<T>
class Program { static void Main() { int? nullable = 123; int value = nullable.Value; } }
我了解了Roslyn并查看了其中的一些示例,但是其中许多已过时,并且API庞大。我将如何去做呢?
解析语法树后,我陷入了困境。这是我到目前为止的内容:
public static void Analyze(string sourceCode) { var tree = CSharpSyntaxTree.ParseText(sourceCode); tree./* ??? What goes here? */ }
您可能正在寻找SymbolFinder类,尤其是FindAllReferences方法。
SymbolFinder
FindAllReferences
听起来您在熟悉罗斯林时遇到了一些麻烦。我提供了一系列博客文章,以帮助人们了解Roslyn,称为Learn Roslyn Now。
正如@SLaks提到的那样,您将需要访问我在第7部分:语义模型简介中介绍的语义模型。
这是一个示例,向您展示如何使用API。如果可以的话,我将使用MSBuildWorkspace磁盘中的项目并将其加载,而不是AdHocWorkspace像这样创建它。
MSBuildWorkspace
AdHocWorkspace
var mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly); var ws = new AdhocWorkspace(); //Create new solution var solId = SolutionId.CreateNewId(); var solutionInfo = SolutionInfo.Create(solId, VersionStamp.Create()); //Create new project var project = ws.AddProject("Sample", "C#"); project = project.AddMetadataReference(mscorlib); //Add project to workspace ws.TryApplyChanges(project.Solution); string text = @" class C { void M() { M(); M(); } }"; var sourceText = SourceText.From(text); //Create new document var doc = ws.AddDocument(project.Id, "NewDoc", sourceText); //Get the semantic model var model = doc.GetSemanticModelAsync().Result; //Get the syntax node for the first invocation to M() var methodInvocation = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<InvocationExpressionSyntax>().First(); var methodSymbol = model.GetSymbolInfo(methodInvocation).Symbol; //Finds all references to M() var referencesToM = SymbolFinder.FindReferencesAsync(methodSymbol, doc.Project.Solution).Result;