Roslyn-get возвращает оператор метода c # - PullRequest
0 голосов
/ 26 апреля 2018

С помощью приведенного ниже кода я могу получить ссылки на метод. Теперь я хочу получить операторы возврата этого метода. Я знаю, что я должен использовать ReturnStatementSyntax. Я новичок в Roslyn, поэтому не уверен, как получить инструкции return метода.

public List<ReferencedSymbol> Find(string solutionPath, string methodName)
        {
            var msWorkspace = MSBuildWorkspace.Create();
            var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;
            InvocationExpressionSyntax node = null;
            ISymbol symbol = null;
            bool flag = false;
            foreach (var project in solution.Projects)
            {
                foreach (var document in project.Documents)
                {
                    var model = document.GetSemanticModelAsync().Result;
                    var methodInvocation = document.GetSyntaxRootAsync().Result;
                    node = methodInvocation.DescendantNodes().OfType<InvocationExpressionSyntax>()
                        .Where(x => ((MemberAccessExpressionSyntax)x.Expression).Name.ToString() == methodName)
                        .FirstOrDefault();
                    //I am not sure how should I get return statement for a method using ReturnStatementSyntax
                    var returnStatement = methodInvocation.DescendantNodes().OfType<ReturnStatementSyntax>().ToList();
                    if (node == null) 
                        continue;
                    symbol = model.GetSymbolInfo(node).Symbol;
                    flag = true;
                    break;
                }
                if (flag) break;
            }

            return SymbolFinder.FindReferencesAsync(symbol, solution).Result.ToList();
        }

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете просто сделать это с помощью LINQ. Предположим, у вас есть переменная MethodDeclarationSyntax с именем method, код должен быть:

var returnStatement = method.DescendantNodes().OfType<ReturnStatementSyntax>().FirstOrDefault();

Однако в вашем коде я не вижу признаков MethodDeclarationSyntax. Вы можете получить нужный метод с помощью LINQ. Также, пожалуйста, не звоните .Result. Либо сделайте ваш метод асинхронным, либо используйте не асинхронные перегрузки. Например, вместо .GetRootAsync() используйте .GetRoot()

...