2016-11-09 6 views
1

私のCSファイルから以下の問題を抱えてRoslynとImを使用してコードの一部を抽出しようとしています。roslynの#if指示コードの解析

私のC#ファイルコード:

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 
    } 
} 

マイロザリンコード:

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

ロザリンを用いて上記CSファイルの処理中に、classDeclarationSyntax.Membersに次の3つの値が含まれてい:

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

私のプロジェクトだけでは、 "条件1" ディレクティブがあります。条件に "条件1"だけがある場合にのみ、コードを取得する手助けはできますか?

ありがとうございます。

+0

これで何を達成しようとしていますか?条件分岐などを除外しますか? – Ties

+0

@Ties私はCSファイルを解析し、構文解析された構文ツリーでアクティブなコードを処理したいだけです。 –

答えて

4

定義するシンボルをパーサに渡すためにWithPreprocessorSymbols()を呼び出すを渡す必要があります。

+0

ご協力いただきありがとうございます。以下のコードを参照してください: リスト preProcessorSymbols = new List (); preProcessorSymbols.Add( "Condition1"); CSharpParseOptions options = CSharpParseOptions.Default; //新しいCSharpParseOptions(LanguageVersion.CSharp6、DocumentationMode.Parse、SourceCodeKind.Regular、preProcessorSymbols); options = options.WithPreprocessorSymbols(preProcessorSymbols); 構文TreeTree = CSharpSyntaxTree.ParseText(fileContent、options); ' –