사용자 작성 C# 코드 조각을 구문 분석하고 메서드 호출로 로컬에 정의되지 않은 모든 변수를 바꿔야합니다. 나는. C# 코드의 모든 변수를 메서드로 바꿉니다
public class Foo
{
public dynamic Bar()
{
return Math.Min(x + width, maxWidth);
}
}
이되고있다 : 나는 문자열을 검사 Microsoft.CodeAnalysis.CSharp과 CSharpSyntaxTree을 사용하고
public class Foo
{
public dynamic Bar()
{
return Math.Min(Resolve("x") + Resolve("width"), Resolve("maxWidth"));
}
}
, 그러나 그것은 나에게 대체 수행 할 수있는 충분한 정보를 제공하지 않습니다. 그렇지 않으면 어디서 찾아야할지 모르겠다. 아래 SyntaxTree 레이아웃을 붙여 넣었습니다. 모든 변수는 IdentifierName 노드로 발생하지만 다른 IdentifierNames를 구분하는 방법을 모르겠습니다. 여기에서 어디로 가야합니까?
CompilationUnit[0..99) {
code: public class Foo\n{\n public dynamic Bar()\n {\n return Math.Min(x + width, maxWidth);\n }\n}
tokens: EndOfFileToken[]
nodes{
ClassDeclaration[0..99) {
code: public class Foo\n{\n public dynamic Bar()\n {\n return Math.Min(x + width, maxWidth);\n }\n}
tokens: PublicKeyword[public ] ClassKeyword[class ] IdentifierToken[Foo\n] OpenBraceToken[{\n] CloseBraceToken[}]
nodes{
MethodDeclaration[21..98) {
code: public dynamic Bar()\n {\n return Math.Min(x + width, maxWidth);\n }\n
tokens: PublicKeyword[ public ] IdentifierToken[Bar]
nodes{
IdentifierName[30..38) {
code: dynamic
tokens: IdentifierToken[dynamic ]
}
ParameterList[41..45) {
code: ()\n
tokens: OpenParenToken[(] CloseParenToken[)\n]
}
Block[45..98) {
code: {\n return Math.Min(x + width, maxWidth);\n }\n
tokens: OpenBraceToken[ {\n] CloseBraceToken[ }\n]
nodes{
ReturnStatement[50..93) {
code: return Math.Min(x + width, maxWidth);\n
tokens: ReturnKeyword[ return ] SemicolonToken[;\n]
nodes{
InvocationExpression[61..90) {
code: Math.Min(x + width, maxWidth)
nodes{
SimpleMemberAccessExpression[61..69) {
code: Math.Min
tokens: DotToken[.]
nodes{
IdentifierName[61..65) {
code: Math
tokens: IdentifierToken[Math]
}
IdentifierName[66..69) {
code: Min
tokens: IdentifierToken[Min]
}
}
}
ArgumentList[69..90) {
code: (x + width, maxWidth)
tokens: OpenParenToken[(] CommaToken[, ] CloseParenToken[)]
nodes{
Argument[70..79) {
code: x + width
nodes{
AddExpression[70..79) {
code: x + width
tokens: PlusToken[+ ]
nodes{
IdentifierName[70..72) {
code: x
tokens: IdentifierToken[x ]
}
IdentifierName[74..79) {
code: width
tokens: IdentifierToken[width]
}
}
}
}
}
Argument[81..89) {
code: maxWidth
nodes{
IdentifierName[81..89) {
code: maxWidth
tokens: IdentifierToken[maxWidth]
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
구문 트리로는 충분하지 않습니다. 식별자가 나타내는 내용을 보려면 의미 론적 모델을 살펴야합니다. –
시맨틱 모델을 읽고 읽을 수있는 링크를 제공 할 수 있습니까? –
지금 찾으십시오 ... 저는 잠시 동안 Roslyn을 보지 않았고 API가 지난번 이후로 많이 바뀌 었습니다 –