Как получить аргументы метода для завершения с помощью Рослин?C#

Место общения программистов C#
Ответить
Anonymous
 Как получить аргументы метода для завершения с помощью Рослин?

Сообщение Anonymous »

Я пытаюсь выполнить завершение кода с помощью Roslyn и AvalonEdit.
Например, у пользователя есть код:

Код: Выделить всё

public void Completion(int i,int j) { }
И он печатает:

Код: Выделить всё

 Completion(
Итак, я хочу получить аргументы метода (

Код: Выделить всё

int i, int j
) и выполнить завершение кода.
Я пишу простой код, который работает с '.' и может быть этот код подойдет для буквы '('?

Код: Выделить всё

 public List 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();
List completionDataColl = new List();

// 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?
Или, может быть, мне следует использовать другой способ?

Подробнее здесь: https://stackoverflow.com/questions/391 ... ith-roslyn
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»