Как я могу получить полностью определенное пространство имен из директивы using в Roslyn?

Когда вы наводите курсор на "упрощенный" using Директива VS2015, она показывает вам полное имя. Как бы я получить эту информацию через плагин Roslyn? Будет ли это использовать DiagnosticAnalyzer? CodeFixProvider?

Читая source.roslyn.codeplex.com, вы обнаружите множество информации, в том числе о том, как добавить using заявление, а также как упростить имена типов (в том числе using заявления), но я не могу понять, как пойти в обратном направлении, чтобы получить полное имя.

1 ответ

Решение

С помощью семантической модели вы можете извлекать информацию о семантике, составляющей ваш код (очевидно) - это позволяет вам получить конкретную информацию о типах и других конструкциях.

Например:

void Main()
{
    var tree = CSharpSyntaxTree.ParseText(@"
using X = System.Text;
using Y = System;
using System.IO;

namespace ConsoleApplication1
{
}"
);

    var mscorlib = PortableExecutableReference.CreateFromFile(typeof(object).Assembly.Location);
    var compilation = CSharpCompilation.Create("MyCompilation", syntaxTrees: new[] { tree }, references: new[] { mscorlib });
    var semanticModel = compilation.GetSemanticModel(tree);
    var root = tree.GetRoot();

    // Get usings
    foreach (var usingDirective in root.DescendantNodes().OfType<UsingDirectiveSyntax>())
    {
        var symbol = semanticModel.GetSymbolInfo(usingDirective.Name).Symbol;
        var name = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
        name.Dump();
    }
}

Выход:

глобальный::System.Text
глобальная система::
глобальный::System.IO

Если вы используете SymbolDisplayFormat.CSharpErrorMessageFormat вместо этого вы получите

System.Text
система
System.IO

Ваш выбор, что вас интересует, но, как вы можете видеть, он прекрасно работает с псевдонимами и без них.

Другие вопросы по тегам