Как я могу получить полностью определенное пространство имен из директивы 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
Ваш выбор, что вас интересует, но, как вы можете видеть, он прекрасно работает с псевдонимами и без них.