2016-08-25 54 views
1

我试着用RoslynAvalonEdit来完成代码完成。 例如,用户有代码:如何获得使用Roslyn完成方法的参数?

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? 或者,也许我应该用另一种方式?

回答

1

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

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

您可以拨打SemanticModel.GetSymbolInfo()

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

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

相关问题