2016-11-09 2 views
1

Im essayant d'extraire la partie du code de mon fichier CS en utilisant Roslyn et Im souffrant du problème ci-dessous.#if instruction directive code dans roslyn

Mon C# Code de fichier:

class ConditionalCompilationCode 
    { 
#if Condition2 
      int test2=0; 
#endif 
#if Condition1 
      int test1=0; 
#endif 

     public static void Main1(string[] args) 
     { 
      int test = 0; 
#if Condition1 
      test = 1; 
#else 
      test =2; 
#endif 

#if Condition2 
      test =3; 
#else 
      test = 4; 
#endif 

     } 
#if Condition2 
      private void testmethod1() 
     { 
      test2 = 1; 
     } 
#endif 
#if !Condition2 
     private void testmethod2() 
     { 
      test1 = 1; 
     } 
#endif 
#if Condition1 
     private void testmethod3() 
     { 
      test1 = 1; 
     } 
#endif 
#if !Condition1 
      private void testmethod4() 
     { 
      test2 = 1; 
     } 
#endif 
    } 
} 

Mon code Roslyn:

string fileContent = File.ReadAllText(fileName); 

SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(fileContent); 

var syntaxRootNode = syntaxTree.GetRoot(); 
      if (syntaxRootNode.GetFirstToken().Kind() == SyntaxKind.None) 
       return; 
      foreach (NamespaceDeclarationSyntax namespaceSyntax in syntaxRootNode.DescendantNodes().OfType<NamespaceDeclarationSyntax>().ToArray()) 
      { 

       IEnumerable<SyntaxNode> nodeList = namespaceSyntax.ChildNodes(); 
       string className = null; 
       foreach (SyntaxNode syntaxNode in nodeList) 
       { 
        SyntaxKind kind = syntaxNode.Kind(); 
        switch (kind) 
        { 
         case SyntaxKind.ClassDeclaration: 
          UpdateClassSignature(syntaxNode as TypeDeclarationSyntax);        
          break; 
         case SyntaxKind.EnumDeclaration: 

          break; 
         case SyntaxKind.InterfaceDeclaration: 

          break; 
         case SyntaxKind.StructDeclaration: 

          break; 

        } 

       } 

      } 

    private void UpdateClassSignature(TypeDeclarationSyntax classDeclarationSyntax) 
     { 

      foreach (MemberDeclarationSyntax member in classDeclarationSyntax.Members) 
      { 
       SyntaxKind kind = member.Kind(); 
       switch (kind) 
       { 
        case SyntaxKind.FieldDeclaration: 
         break; 
        case SyntaxKind.PropertyDeclaration: 
         break; 
        case SyntaxKind.MethodDeclaration: 
        case SyntaxKind.ConstructorDeclaration: 
        case SyntaxKind.DestructorDeclaration: 
         break; 
        case SyntaxKind.IndexerDeclaration: 
         ExtractIndexer(member as IndexerDeclarationSyntax, classSign); 
         break; 
        case SyntaxKind.DelegateDeclaration: 
         //TODO: Add Delegate Support. 
         break; 
        case SyntaxKind.OperatorDeclaration: 
        case SyntaxKind.ConversionOperatorDeclaration: 
         //Skip. 
         //TODO: Need to add operator suport. 
         break; 
        case SyntaxKind.EventFieldDeclaration: 
         //TODO: Add support to event. 
         break; 
        case SyntaxKind.EventDeclaration: 
         //TODO: Add support to event. 
         break; 
        case SyntaxKind.EnumDeclaration: 
         break; 
        case SyntaxKind.ClassDeclaration: 
         break; 
        case SyntaxKind.StructDeclaration: 
         break; 
        default: 
         break; 
       } 
      } 
     } 

lors du traitement du fichier ci-dessus CS en utilisant Roslyn, dans les classDeclarationSyntax.Members contient les trois valeurs suivantes :

  1. MethodDeclarationSyntax MethodDeclaration

    public static void Main1(string[] args) 
    { 
        int test = 0; 
        #if Condition1 
        test = 1; 
        #else 
        test =2; 
        #endif 
    
        #if Condition2 
        test =3; 
        #else 
        test = 4; 
        #endif 
    
    } 
    
  2. MethodDeclarationSyntax MethodDeclaration

    private void testmethod2() 
    { 
        test1 = 1; 
    } 
    
  3. MethodDeclarationSyntax MethodDeclaration

    private void testmethod4() 
    { 
        test2 = 1; 
    } 
    

Mon projet a directive "Condition1" seul. Pouvez-vous m'aider à obtenir les codes seulement quand la condition a "Condition1" seul?

Merci d'avance.

+0

Qu'essayez-vous d'accomplir avec ceci? Voulez-vous filtrer une branche conditionnelle? – Ties

+0

@Ties Je veux juste analyser mon fichier CS et traiter les codes actifs dans l'arbre syntaxique analysé. –

Répondre

4

Vous devez transmettre un qui appelle WithPreprocessorSymbols() pour transmettre les symboles que vous souhaitez définir à l'analyseur.

+0

Merci pour votre aide cela a fonctionné. Veuillez vous référer au code ci-dessous: Liste preProcessorSymbols = new Liste (); preProcessorSymbols.Add ("Condition1"); CSharpParseOptions options = CSharpParseOptions.Default; // nouvelles CSharpParseOptions (LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, preProcessorSymbols); options = options.WithPreprocessorSymbols (préprocesseurSymboles); SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText (fileContent, options); ' –