2015-09-14 4 views
6

मैं एक कोड विश्लेषक प्रोग्राम करने की कोशिश कर रहा हूं जो विजुअल स्टूडियो 2015 समाधान में किसी अन्य प्रकार से संदर्भित नहीं है।विजुअल स्टूडियो कोड विश्लेषक: शून्य संदर्भों के साथ प्रकार ढूंढना

मेरी समस्या यह है कि मैं यह नहीं समझ सकता कि बिना संदर्भित प्रकारों की सूची कैसे प्राप्त करें।

मैंने डीओएम के माध्यम से कोशिश की है जैसा कि आप नीचे दिए गए कोड से देख सकते हैं, लेकिन मुझे नहीं पता कि नेविगेट करना है और वर्तमान कोड पहले से ही धीमा लगता है।

using Microsoft.CodeAnalysis; 
using Microsoft.CodeAnalysis.CSharp; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 
using Microsoft.CodeAnalysis.Diagnostics; 
using System.Collections.Immutable; 
using System.Linq; 

namespace AlphaSolutions.CodeAnalysis 
{ 
    [DiagnosticAnalyzer(LanguageNames.CSharp)] 
    public class ZeroReferencesDiagnosticAnalyzer : DiagnosticAnalyzer 
    { 
     public const string DiagnosticId = "ZeroReferences"; 

     private static DiagnosticDescriptor rule = new DiagnosticDescriptor(
      DiagnosticId, 
      title: "Type has zero code references", 
      messageFormat: "Type '{0}' is not referenced within the solution", 
      category: "Naming", 
      defaultSeverity: DiagnosticSeverity.Warning, 
      isEnabledByDefault: true, 
      description: "Type should have references." 
      ); 

     public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics 
     { 
      get 
      { 
       return ImmutableArray.Create(rule); 
      } 
     } 

     public override void Initialize(AnalysisContext context) 
     { 
      context.RegisterSyntaxNodeAction(this.AnalyzeSyntaxNode, SyntaxKind.ClassDeclaration); 
     } 

     private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext obj) 
     { 
      var classDeclaration = obj.Node as ClassDeclarationSyntax; 
      if(classDeclaration == null) 
      { 
       return; 
      } 

      var identifierNameSyntaxes = classDeclaration 
       .DescendantNodes() 
       .OfType<IdentifierNameSyntax>() 
       .ToArray() 
       ; 
      if (identifierNameSyntaxes.Length == 0) 
      { 
       return; 
      } 

      //SymbolFinder.FindReferencesAsync(namedTypeSymbol, solution); 
     } 
    } 
} 

मैं भी SymbolFinder.FindReferencesAsync(namedTypeSymbol, solution) की कोशिश की है, लेकिन मैं समझ नहीं Solution के लिए एक संदर्भ प्राप्त करने के लिए कैसे।

Microsoft Answers पर एक उत्तर Roslyn.Services असेंबली से FindReferences विधि का उपयोग करने का सुझाव भी देता है। लेकिन ऐसा लगता है कि असेंबली बहिष्कृत है।

मुझे कोडलेन्स पता है कि मैं संदर्भों की गिनती करता हूं, उस काउंटर तक पहुंच प्राप्त करना एक बेहतर समाधान हो सकता है लेकिन मुझे लगता है कि यह असंभव है।

कोई भी डुप्लिकेट पोस्ट सुझाता है, यह पोस्ट this, this या this का डुप्लिकेट नहीं है। मेरी पोस्ट Roslyn संकलक के लिए विश्लेषकों के लिए विशिष्ट है।

उत्तर

5

रोज़लिन डायग्नोस्टिक विश्लेषक वर्तमान में आपको समाधान-व्यापी (यानी क्रॉस-प्रोजेक्ट) विश्लेषण करने की अनुमति नहीं देते हैं, यही कारण है कि हम आपको Solution ऑब्जेक्ट नहीं देते हैं। यह आंशिक रूप से प्रदर्शन विचारों के लिए था: यदि आपने हर जगह FindReferencesAsync को कॉल करने का प्रयास किया है तो आपके सीपीयू को बहुत भारी दिखाया जाएगा। कोडलेन्स के लिए हम कितने सीपीयू का उपयोग कर रहे थे, इस बारे में बड़ी मात्रा में फीडबैक था, हम नहीं चाहते थे कि 10 डायग्नोस्टिक्स सभी उसी सीपीयू का उपभोग करें। (अपनी खराब लैपटॉप बैटरी की कल्पना करें ...)

यदि आप अधिक सीमित होने के साथ ठीक हैं, तो उन आंतरिक प्रकारों को ढूंढने के लिए कहें जो परियोजना में अप्रयुक्त हैं, वे this analyzer we wrote awhile back पर एक नज़र डालें।

+0

आपके द्वारा लिंक किए गए विश्लेषक कोड को काफी रोचक लग रहा है हालांकि मुझे यकीन नहीं है कि आप किस प्रकार का आंतरिक क्षेत्र का जिक्र कर रहे हैं। क्या यह कोड पहुंच, परियोजना चौड़ा, समाधान चौड़ा, गैर संदर्भित असेंबली है और साझा स्रोत परियोजनाओं नहीं है? –

+0

यह केवल ध्वज प्रकारों को ही एक परियोजना में अप्रयुक्त करने के लिए निर्धारित किया जा सकता है। तो यह ध्वज प्रकार या सदस्यों को निजी या आंतरिक हैं। सार्वजनिक प्रकारों को ध्वजांकित नहीं किया जाएगा, क्योंकि यह किसी भिन्न परियोजना में संदर्भ नहीं ढूंढ सकता है। –

+0

और रोज़लिन के लिए "प्रोजेक्ट" की हमारी परिभाषा वास्तव में "कंपाइलर का आविष्कार" है। साझा परियोजनाओं के लिए, वे दो या दो से अधिक "वास्तविक" परियोजनाओं में फ़ाइलों का योगदान करके काम करते हैं जो वास्तव में सामान संकलित करते हैं। इसलिए यह उन "असली" परियोजनाओं का विश्लेषण कर रहा है, साझा फ़ाइलों के साथ। –

संबंधित मुद्दे