2016-04-04 13 views
2

VS2015'te "basitleştirilmiş" using yönergesinin üzerine geldiğinizde, size tam nitelikli adı gösterir. Bu bilgiyi Roslyn eklentisiyle nasıl edinebilirim? DiagnosticAnalyzer kullanıyor mu? CodeFixProvider mu?Tam nitelikli ad alanını Roslyn'deki bir kullanma yönergesinden nasıl edinebilirim?

source.roslyn.codeplex.com okumak, orada da (using beyanları dahil) tipi adlarını basitleştirmek için nasıl nasıl add a using statement ve dahil orada ton bilgi var, ama içeri anlamaya edemiyorum Tam nitelikli adı almak için geri.

+3

Söz konusu türü almak için semanticmodel'i kullanmanız ve sonra da '.ToDisplayString()' kullanarak tam nitelikli adı bulmanız gerekeceğini varsayalım. –

+0

@JeroenVannevel: Bunu bir cevap olarak yazmalısın. ;-) –

+0

@JasonMalinowski Meşgul oldum ama şimdi bir tane ekledim ;-) Belki de SymbolDisplayFormat'ın kullanılması gerektiğini açıklayabilir misin? SymbolDisplayFormat.FullyQualifiedFormat'nın 'global ::' önekini içermesini beklemiyordum –

cevap

3

Semantik modelde, kodunuzu oluşturan semantiklerle ilgili bilgileri alabilirsiniz (açıkça) - bu, türler ve diğer yapılar hakkında özel bilgi almanızı sağlar.

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(); 
    } 
} 

Çıktı:

küresel :: System.Text
küresel :: Sistem
küresel :: System.IO

Eğer Örneğin

SymbolDisplayFormat.CSharpErrorMessageFormat kullanın,

alırsınız

System.Text
Sistem
System.IO

ilgilendiğiniz ama gördüğünüz gibi takma adları ile ve olmadan da gayet iyi işe yaradığını Tercih sizin.

+0

Örnek kodumu eklemeliydim; root.DescendantNodes() .Toplu () 'noktasına varmış ve sonra düğümünden sonra ne yapacağını anlayamadım. ''Name' denedim ve 'QualifiedNameSyntax' için yayınladıktan sonra tamamen kayboldum. – Jedidja

+0

Çalıştığım 'DiagnosticAnalyzer' örnek semantik modeli içermiyordu, bu yüzden' CodeFixProvider 'aramaya başladım. – Jedidja

+2

Josh Varty'ın bu kavramlar hakkındaki mükemmel izlerini okumanızı öneririm - tam olarak neyin ne olduğunu açıklığa kavuştururlar. https://joshvarty.wordpress.com/learn-roslyn-now/ –

İlgili konular