2013-01-08 1 views
0

Roslyn에서 작업 할 때 종종 CompilationUnitSyntax에는 있지만 SemanticModel에는 없거나 그 반대의 노드가 있습니다. (또는 시맨틱 모델에서 정보를 입력해야하는 경우, 쿼리하는 노드가 SemanticModel의 트리에 존재해야합니다.)CompilationUnitSyntax 및 SemanticModel에서 노드 찾기

왜 그런지 알 수 있습니다. 그들은 불변성과 그 모든 것을 위해 그것을했습니다. 그러나 어떻게 도대체 당신은 일관되게 돌아가서 한 나무에서 다른 나무로 같은 토큰을 발견합니까? 두 트리 중 하나를 수정하면 어떻게 든 작업하고있는 노드를 검색해야합니다. 가장 좋은 방법은 무엇입니까 ????

+0

질문을 완전히 이해했는지 모릅니다. 예를 들어 주석을 보았습니까? 트리가 변경되는 동안 일부 노드를 추적하는 데 사용할 수 있습니다. – svick

+0

빙고 그게 내가 필요한거야. 예. Roslyn에 대해 질문하는 것이 어렵습니다. "당신은 실제로 무엇을하려고합니까?" 대답은 너무 길다. 질문을 주된 대답으로 다시 쓰면 나는 그것을 표시 할 것입니다. –

답변

1

트리를 변경하는 동안 단일 구문 노드를 추적하려는 경우 SyntaxAnnotation을 사용할 수 있습니다. 다음 annotation.AddAnnotationTo(node) 또는 node.WithAdditionalAnnotations(annotation)를 호출하여 노드에 추가 (해당 주석과 함께 몇 가지 추가 정보를 보관해야하는 경우, 또는 사용자 정의 파생 형)을 사용하려면

SyntaxAnnotation을 만들 수 있습니다. 노드는 여전히 변경할 수 없으므로 트리의 주석 된 노드로 원래 노드를 바꿔야합니다.

그런 다음 트리를 수정 한 후에 parentNode.GetAnnotatedNodesAndTokens(annotation).Single().AsNode()과 같은 것을 사용하여 주석 노드를 다시 가져올 수 있습니다. (특정 파생 유형의 주석으로 주석 처리 된 모든 노드를 parentNode.GetAnnotatedNodesAndTokens(typeof(CustomAnnotationType))으로 가져올 수도 있습니다.

+0

내 실수로 인해 실제로 도움이되지 못했습니다. 기존 트리의 노드에는 주석을 추가 할 수 있지만 주사위는 추가 할 수 없다고 생각했습니다. 나는 CompilationUnitSyntax와 그것의 자손 노드들과 SemanticModel.SyntaxTree.GetRoot 노드 세트로 작업하고 있습니다. 내 진짜 문제는 여기서 임피던스 불일치입니다. 각 노드마다 다른 정보를 얻기 위해 2 세트의 노드를 다루고 있습니다. 그럼 아무것도 수정하면 두 가지를 모두 재현하고 두 가지 모두에서 노드를 다시 찾아야합니다. 더 좋은 방법이 있습니까? 그것은 매우 복잡하고 복잡해지고 있습니다. –

+0

두 노드 집합이 어떻게 서로 어떨까요? 왜 그들 중 한 명과 함께 일할 수 없습니까? – svick

+0

어떻게 CompilationUnitSyntax '트리 노드에서 SemanticModel.GetTypeInfo를 사용할 수 있습니까? CompilationUnitSyntax 트리에서 유형 정보를 가져올 수 없습니다. SimpleLambdaExpressionSyntaxNode의 ConvertedType이 필요합니다. –