sar*_*mar 1 c# roslyn roslyn-code-analysis
我试图使用Roslyn从我的CS文件中提取代码的一部分,我遇到了以下问题.
我的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
}
}
Run Code Online (Sandbox Code Playgroud)
我的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在使用roslyn处理上述CS文件时,classDeclarationSyntax.Members包含以下三个值:
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
}
Run Code Online (Sandbox Code Playgroud)MethodDeclarationSyntax MethodDeclaration
private void testmethod2()
{
test1 = 1;
}
Run Code Online (Sandbox Code Playgroud)MethodDeclarationSyntax MethodDeclaration
private void testmethod4()
{
test2 = 1;
}
Run Code Online (Sandbox Code Playgroud)我的项目单独有"Condition1"指令.只有条件单独有"Condition1"时,你能帮助我获取代码吗?
提前致谢.
| 归档时间: |
|
| 查看次数: |
349 次 |
| 最近记录: |