2016-03-23 10 views
1

StyleCop Analizörlerini, bir sınıf içindeki "benim" üye sırasının (SA1201 tanımlamasından farklı olan) kontrol edilebilmesi için yapılandırılabilir mi? Yani, mülkümün yapıcısı üzerinde olmasını istiyorum, oysa SA1201, bunların, yüklenicinin altına yerleştirilmesini gerektiriyor. Sipariş kuralını devre dışı bırakmak istemiyorum çünkü siparişin kontrol edilmesini sağlamak istiyorum.Kullanıcı tanımlı üye sırasını zorunlu kılmak için StyleCop Analizörlerinde sipariş kuralı yapılandırın

+1

[etiket: roslyn] Sana sokmaya bahsediyoruz hayal StyleCop Roslyn kullanarak uygulanması? Bu analizörün kaynak koduna baktığımda, başka bir konfigürasyonun desteklendiğini sanmıyorum çünkü her şey kodlanmış: https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1201ElementsMustAppearInTheCorrectOrder .cs –

+0

@JeroenVannevel Ona baktım ve buna katından daha iyi bir yaklaşım olduğunu kabul ediyorum. – David

cevap

0

Aşağıdakiler basit bir fikir ortaya koymaktadır, ancak bir tanesi StyleCop-Analizörlerinin ne yaptığına bakmayı düşünmelidir.

Analyzer with Code Fix (NuGet + VSIX) proje şablonunu kullanarak, özellikler bir yöntemden sonra yerleştirildiğinde algılayabilecek bir analizörün ilk taslağını hazırladım. Bunu başarmak için DiagnosticAnalyzer.cs dosyasında (proje yaratma oluşturulur) statik AnalyzeSymbol yönteminin uygulanmasıdır: Bu etiketlenmiş olduğundan beri

private static void AnalyzeSymbol(SymbolAnalysisContext context) 
{ 
    var members = namedTypeSymbol.GetMembers(); 
    var methods = from m in members 
       where (m.Kind == SymbolKind.Method && 
        !m.IsImplicitlyDeclared && m.CanBeReferencedByName) 
       select m; 

    var properties = from m in members 
        where m.Kind == SymbolKind.Property 
        select m; 

    foreach (var p in properties) 
    { 
    foreach (var m in methods) 
    { 
     if (p.Locations.First().SourceSpan.Start > m.Locations.First().SourceSpan.Start) 
     { 
     // For all such symbols, produce a diagnostic. 
     var diagnostic = Diagnostic.Create(Rule, m.Locations[0], m.Name); 
     context.ReportDiagnostic(diagnostic); 
     } 
    } 
    } 
} 
İlgili konular