2016-03-16 2 views
0

Если я использую псевдоним типа в моем источнике:Как получить тип от псевдонима, используя Roslyn анализ автономного

using Something = DateTime; 

А потом я отсылаю к своим членам:

var date = Something.Now; 

Когда я анализирую синтаксическое дерево с Roslyn, у меня будет SimpleMemberAccessExpression для Что-то, не зная, что это просто псевдоним для DateTime.

Есть ли способ узнать, что такое Что-то - это псевдоним семантически? Я бы не хотел разбирать весь файл и отслеживать все псевдонимы.

ответ

1

Чтобы получить тип члена, вам необходимо его решить, используя семантическую модель.

Для следующего фрагмента кода я предполагаю, что у вас есть документ или может иным образом получить SyntaxTree и SemanticModel:

public static async Task GetNameFromDocument(Document document) 
    { 
     var syntaxTree = await document.GetSyntaxTreeAsync(); 
     var semanticModel = await document.GetSemanticModelAsync(); 
     var root = syntaxTree.GetRoot(); 


     MemberAccessExpressionSyntax member = GetMemberAccessExpressionSyntax(root); 
     if (member != null) 
     { 
      var firstChild = member.ChildNodes().ElementAt(0); 
      var typeInfo = semanticModel.GetTypeInfo(firstChild).Type as INamedTypeSymbol; 
      var typeName = typeInfo.Name; 
     } 
    } 

    public static MemberAccessExpressionSyntax GetMemberAccessExpressionSyntax(SyntaxNode node) 
    { 
     return node.DescendantNodes().Where(curr => curr is MemberAccessExpressionSyntax) 
      .ToList().FirstOrDefault() as MemberAccessExpressionSyntax; 
    } 

Вы использовать SyntaxTree, чтобы найти ваше выражение - как вы считаете нужным (у вас есть для замены GetMemberAccessExpressionSyntax) - и впоследствии может использовать семантическую модель для разрешения типа MemberAccessExpression.

Первый ребенок MemberAccessExpressionSyntax всегда должен быть доступным элементом, чтобы вы могли взять узел и получить его тип, используя семантическую модель. Предоставленный тип - это acutal тип, а не псевдоним - typeName будет соответствовать DateTime

+0

Спасибо, он выглядит точно, что я был после, я буду тестировать его позже; это повлияет на работу моего автономного анализатора? (Учитывая, что теперь ему также понадобится семантический анализ, а не только синтаксический анализ). –

+0

Я не испытывал проблем с производительностью после извлечения семантической модели. Кажется, он работает довольно быстро, однако я никогда не тестировал этот тип кода для скорости. – SJP

+0

SemanticModels работают медленнее, но если вам нужно их использовать, используйте их. Вот для чего они! Люди слишком часто тяготеют к нашей синтаксической модели и пишут ошибки в этом процессе. :-) –

Смежные вопросы