【问题标题】:How to get arguments of method to make completion with Roslyn?如何获取方法的参数以使用 Roslyn 完成?
【发布时间】:2016-08-25 13:25:29
【问题描述】:

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

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

然后他打字:

 Completion(

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

我编写了简单的代码,与 '.' 一起使用并且可能此代码适用于“(”字母?

 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。它是空的。 如何获得lhsType? 或者,也许我应该使用其他方式?

【问题讨论】:

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


    【解决方案1】:

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

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

    您可以拨打SemanticModel.GetSymbolInfo()

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2012-11-25
      相关资源
      最近更新 更多