如何获得使用Roslyn完成方法的参数?

时间:2016-08-25 13:25:30

标签: c# intellisense roslyn avalonedit roslyn-code-analysis

我尝试使用RoslynAvalonEdit完成代码验证。 例如,用户有代码:

public void Completion(int i,int j) { }

他输入:

 Completion(

所以,我想得到方法(int i, int j)的参数并使代码完成。

我编写简单的代码,与#39;一起使用。'并且这段代码可能适用于'('字母?

 public List<ICompletionData> GetCompletionData(String code,int offset,CompletionType completionType)
    {              
        var syntaxTree = SyntaxFactory.ParseSyntaxTree(code);
        var compilation = CSharpCompilation.Create("foo")
            .AddReferences(Mscorlib)
            .AddSyntaxTrees(syntaxTree);
        var semanticModel = compilation.GetSemanticModel(syntaxTree);
        var textSpan = GetTextSpan(offset,1);// '.' or '(' coordinates                               
        ITypeSymbol lhsType = null;
        if (completionType == CompletionType.DotCompletion)
        {
            var memberAccessNode = (MemberAccessExpressionSyntax)syntaxTree.GetRoot()
           .DescendantNodes(textSpan).Last();
            lhsType = semanticModel.GetTypeInfo(memberAccessNode.Expression).Type;
        }
        else if(completionType==CompletionType.ArgumentListCompletion)
        {
            var arr = syntaxTree.GetRoot().DescendantNodes(textSpan).Last();
            var argumentListMode = (ArgumentListSyntax)syntaxTree.GetRoot().DescendantNodes(textSpan).Last();
            var directive = argumentListMode.GetFirstDirective();
            var arrgs=argumentListMode.Arguments;
            //lhsType = semanticModel.GetTypeInfo(directive).Type;
            //how to get lhsType?
        }

        if (lhsType == null)
            return new List<ICompletionData>();
        List<ICompletionData> completionDataColl = new List<ICompletionData>();

        // and here i make completion data
        foreach (var symbol in lhsType.GetMembers())
        {
            if (!symbol.CanBeReferencedByName
                || symbol.DeclaredAccessibility != Accessibility.Public
                || symbol.IsStatic)
                continue;
        }
   }

问题是,我无法获得ITypeSymbol lhsType。它是null。 如何获得lhsType? 或者,也许我应该用另一种方式?

1 个答案:

答案 0 :(得分:1)

我不知道代码完成(我找不到这个名为 CompletionType 的类)本身,但这里只是一种基于Roslyn的方法:语义模型和方法调用,我相信你有空(使方法调用字符串为 InvocationExpressionSyntax

要获取方法的参数,可以从语义模型中获取其SymbolInfo。然后你得到它的符号。符号包含参数列表(参数)。

您可以拨打SemanticModel.GetSymbolInfo()

结果将为您提供symbol或候选符号(如果它是重载方法)。

方法符号将提供参数列表,该参数列表是该方法的参数。