c# - 如何使用 Roslyn 在解决方案中查找 MethodDeclarationSyntax 的所有用法

标签 c# .net roslyn roslyn-code-analysis

我有以下代码:

        var ws = new AdhocWorkspace();
        var project = ws.AddProject("Sample", "C#");
        ws.TryApplyChanges(project.Solution);
        string text = @"
                    class C
                        {
                            private int counter = 0;

                            public void main()
                            {
                                Do();
                            }
                            public void Do()
                            {
                                counter++;
                            }
                        }
                        class D
                        {
                            private int counter = 0;

                            public void Foo()
                            {
                                var c = new C();
                                c.Do();
                            }
                        }";
        var sourceText = SourceText.From(text);
        var doc = ws.AddDocument(project.Id, "NewDoc", sourceText);
        var model = doc.GetSemanticModelAsync().Result;
        var methodDeclaration = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<MethodDeclarationSyntax>().ToList()[1];
        var invocationExpression = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<InvocationExpressionSyntax>().ToList()[0];
        //TODO: If I replace invocationExpression with methodDeclaration IT DOES NOT WORK
        var methodSymbol = model.GetSymbolInfo(invocationExpression ).Symbol;
        //Finds all references to M()
        var referencesToM = SymbolFinder.FindReferencesAsync(methodSymbol, doc.Project.Solution).Result;

如何找到给定 MethodDeclarationSyntax 的解决方案中的所有用法? (对于 InvocationExpressionSyntax 工作正常)

最佳答案

使用 GetDeclaredSymbol 进行节点声明。

// node is methodDeclaration or invocationExpression
var methodSymbol = model.GetSymbolInfo(node).Symbol ?? model.GetDeclaredSymbol(node);

关于c# - 如何使用 Roslyn 在解决方案中查找 MethodDeclarationSyntax 的所有用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44483116/

相关文章:

c# - 在 Windows 应用程序中跟踪屏幕录像机

在 vscode 中调试 C# 源代码生成器

c# - NumLock isKeyLocked 不起作用

c# - 异步更新 ObservableCollection<T> 会导致挂起,并且不会更新 GUI

c# - GZip 往返截断 1 个或多个字节

c# - 如何在 Roslyn 中禁用不必要的 using 指令检查?

c# - Roslyn CodeFix 找不到以前创建的 AdditionalDocument

c# - 将 null 转换到某物中?

c# - 单元测试未到达一段代码

c# - 解决集合的并发问题