2016-08-25 19 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を得ることができないということです。それがnullである。 lhsType? または、たぶん私は別の方法を使用する必要がありますを取得する方法?

答えて

1

私はコード補完(CompletionTypeという名前のこのクラスが見つかりませんでした)自体はありませんが、ここではRoslynのみに基づいた方法があります:意味モデルとメソッド呼び出し使用可能(メソッド呼び出し文字列をInvocationExpressionSyntaxにする

メソッドの引数を取得するには、その意味モデルからSymbolInfoを取得できます。それからあなたはそのシンボルを手に入れます。シンボルにはパラメータ(引数)のリストが含まれています。

あなたは(それがオーバーロードされたメソッドである場合)、結果はあなたにsymbolまたは候補シンボルを提供しますSemanticModel.GetSymbolInfo()

を呼び出すことができます。

メソッドシンボルは、そのメソッドの引数であるパラメータのリストを提供します。

関連する問題