一尘不染

使用Roslyn查找对方法的所有引用

c#

我正在寻找扫描一组.cs文件,以查看哪些文件调用a的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? */
}

阅读 510

收藏
2020-05-19

共1个答案

一尘不染

您可能正在寻找SymbolFinder类,尤其是FindAllReferences方法。

听起来您在熟悉罗斯林时遇到了一些麻烦。我提供了一系列博客文章,以帮助人们了解Roslyn,称为Learn Roslyn Now

正如@SLaks提到的那样,您将需要访问我在第7部分:语义模型简介中介绍的语义模型。

这是一个示例,向您展示如何使用API​​。如果可以的话,我将使用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;
2020-05-19