2016-08-25 6 views
1

Я пытаюсь выполнить код с Roslyn и AvalonEdit. Например, пользователь имеет код:Как получить аргументы метода для завершения с 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: семантическая модель и метод invocation, который, я считаю, у вас есть доступно (введите метод вызова строки a InvocationExpressionSyntax)

Чтобы получить аргументы метода, вы можете получить его SymbolInfo из семантической модели. Затем вы получите свой символ. Символ содержит список параметров (аргументов).

Вы можете позвонить SemanticModel.GetSymbolInfo()

В результате обеспечит вам symbol или кандидатов символов (если это перегруженный метод).

Символ метода предоставит список параметров, которые являются аргументами этого метода.