2012-03-28 15 views
7

विवरण Roslyn स्क्रिप्ट/कोड का उपयोग करके सॉर्ट करें और हटाएं (अप्रयुक्त)? मैं कुछ .NET/Roslyn (सेवा के रूप में कंपाइलर) कोड ढूंढ रहा हूं जो एक प्रोजेक्ट के माध्यम से चला सकता है और सॉर्ट का उपयोग करके अप्रयुक्त उपयोग को हटा सकता है। मुझे विश्वास है कि रोज़लिन के साथ यह संभव है? क्या कोई मुझे कोड पर इंगित कर सकता है जो यह पुनः लिख सकता है?विवरण Roslyn स्क्रिप्ट/कोड का उपयोग करके सॉर्ट करें और हटाएं (अप्रयुक्त)?

उत्तर

5

यह दृश्य स्टूडियो में एक सुविधा है, लेकिन मुझे लगता है कि अकादमिक आप इस तरह अपने SyntaxTree से बयान का उपयोग करके एकत्र होगा:

var usings = syntaxTree.Root.DescendentNodes().Where(node is UsingDirectiveSyntax); 

... और नामस्थान प्रतीक तालिका द्वारा हल करने के लिए है कि तुलना इस तरह:

private static IEnumerable<INamespaceSymbol> GetNamespaceSymbol(ISymbol symbol) 
{ 
    if (symbol != null && symbol.ContainingNamespace != null) 
     yield return symbol.ContainingNamespace; 
} 

var ns = semanticModel.SyntaxTree.Root.DescendentNodes().SelectMany(node => 
    GetNamespaceSymbol(semanticModel.GetSemanticInfo(node).Symbol)).Distinct(); 
+1

आप ".OfType ()" के बजाय "का उपयोग कर सकते हैं .Where सॉर्ट करने के लिए उपयोग कर रहा है डायरेक्टिव सिंटैक्स) " –

1

Roslyn के साथ आए संगठनात्मक नमूना प्रोजेक्ट को देखें। यह कुछ वही करता है जो आप चाहते हैं। यह सॉर्टिंग हिस्सा करता है। आपको जेफ शो जैसे सेमेन्टिक मॉडेल का भी उपयोग करना होगा यह निर्धारित करने के लिए कि क्या स्रोत में किसी विशेष नामस्थान का कोई संदर्भ नहीं है।

0

कथन हटाने के लिए, FAQ.cs फ़ाइल में निम्न निर्देशिका में समाधान में FAQ आइटम 30 देखें: (ध्यान दें कि यह रोज़लिन के जून 2012 सीटीपी संस्करण के लिए है)।

% USERPROFILE% \ Documents \ माइक्रोसॉफ्ट रोसलिन CTP - जून 2012 \ CSharp \ APISampleUnitTestsCS

भी एक पूछे जाने वाले प्रश्न जो इस परियोजना के लिए संदर्भित करता है:

http://www.codeplex.com/Download?ProjectName=dlr&DownloadId=386858

यहाँ से नमूना rewriter है नमूना कोड, जो असाइनमेंट स्टेटमेंट को हटा देता है।

// Below SyntaxRewriter removes multiple assignement statements from under the 
// SyntaxNode being visited. 
public class AssignmentStatementRemover : SyntaxRewriter 
{ 
    public override SyntaxNode VisitExpressionStatement(ExpressionStatementSyntax node) 
    { 
     SyntaxNode updatedNode = base.VisitExpressionStatement(node); 

     if (node.Expression.Kind == SyntaxKind.AssignExpression) 
     { 
      if (node.Parent.Kind == SyntaxKind.Block) 
      { 
       // There is a parent block so it is ok to remove the statement completely. 
       updatedNode = null; 
      } 
      else 
      { 
       // The parent context is some statement like an if statement without a block. 
       // Return an empty statement. 
       updatedNode = Syntax.EmptyStatement() 
        .WithLeadingTrivia(updatedNode.GetLeadingTrivia()) 
        .WithTrailingTrivia(updatedNode.GetTrailingTrivia()); 
      } 
     } 
    return updatedNode; 
    } 
} 
1

रोसलिन सीटीपी सितंबर 2012 GetUnusedImportDirectives() विधि, यहाँ बहुत काम की है जो प्रदान करता है।

संशोधित करके व्यवस्थित करें नमूना प्रोजेक्ट मैट संदर्भित आप निर्देशों का उपयोग करके सॉर्टिंग और (अप्रयुक्त) दोनों को प्राप्त कर सकते हैं। इस परियोजना का एक (पुराना) संस्करण यहां पाया जा सकता है: http://go.microsoft.com/fwlink/?LinkId=263977। यह पुरानी हो चुकी है क्योंकि document.GetUpdatedDocument() अब मौजूद नहीं है है,

var document = newSolution.GetDocument(documentId); 
var transformation = document.OrganizeImports(); 
var newDocument = transformation.GetUpdatedDocument(); 

var document = newSolution.GetDocument(documentId); 
var newDocument = document.OrganizeImports(); 

newDocument = RemoveUnusedImportDirectives(newDocument); जोड़ना और निम्न विधि चाल करना होगा प्रदान करने के लिए सरल किया जा सकता। (नोड

private static IDocument RemoveUnusedImportDirectives(IDocument document) 
{ 
    var root = document.GetSyntaxRoot(); 
    var semanticModel = document.GetSemanticModel(); 

    // An IDocument can refer to both a CSharp as well as a VisualBasic source file. 
    // Therefore we need to distinguish those cases and provide appropriate casts. 
    // Since the question was tagged c# only the CSharp way is provided. 
    switch (document.LanguageServices.Language) 
    { 
     case LanguageNames.CSharp: 
      var oldUsings = ((CompilationUnitSyntax)root).Usings; 
      var unusedUsings = ((SemanticModel)semanticModel).GetUnusedImportDirectives(); 
      var newUsings = Syntax.List(oldUsings.Where(item => !unusedUsings.Contains(item))); 
      root = ((CompilationUnitSyntax)root).WithUsings(newUsings); 
      document = document.UpdateSyntaxRoot(root); 
      break; 

     case LanguageNames.VisualBasic: 
      // TODO 
      break; 
    } 
    return document; 
} 
1

मैं इस निम्नलिखित विस्तार विधि का उपयोग usings

internal static SyntaxList<UsingDirectiveSyntax> Sort(this SyntaxList<UsingDirectiveSyntax> usingDirectives, bool placeSystemNamespaceFirst = false) => 
    SyntaxFactory.List(
     usingDirectives 
     .OrderBy(x => x.StaticKeyword.IsKind(SyntaxKind.StaticKeyword) ? 1 : x.Alias == null ? 0 : 2) 
     .ThenBy(x => x.Alias?.ToString()) 
     .ThenByDescending(x => placeSystemNamespaceFirst && x.Name.ToString().StartsWith(nameof(System) + ".")) 
     .ThenBy(x => x.Name.ToString())); 

और

compilationUnit = compilationUnit.WithUsings(SortUsings(compilationUnit.Usings)) 
संबंधित मुद्दे