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 :
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 }
MethodDeclarationSyntax MethodDeclaration
private void testmethod2() { test1 = 1; }
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.
Qu'essayez-vous d'accomplir avec ceci? Voulez-vous filtrer une branche conditionnelle? – Ties
@Ties Je veux juste analyser mon fichier CS et traiter les codes actifs dans l'arbre syntaxique analysé. –