0

Roslyn を使用する場合、CompilationUnitSyntax 内にあるが SemanticModel 内にないノードがあったり、その逆の場合がよくあります。(または、どちらか一方の操作でのみノードを引き出すことができます。たとえば、セマンティック モデルから型情報が必要な場合、クエリを実行するノードは SemanticModel のツリーに存在する必要があります)

彼らが不変性などのためにそれを行った理由はわかりますが、どうやって一貫して戻って、あるツリーから別のツリーに同じトークンを見つけるのですか?? いずれかのツリーを変更する場合は、何らかの方法で作業していたノードを取得する必要があります。それを行うための最良の方法は何ですか?

4

1 に答える 1

1

ツリーを変更しているときに単一の構文ノードを追跡したい場合は、SyntaxAnnotation.

これを使用するには、新しいSyntaxAnnotation(または、その注釈で追加情報を保持する必要がある場合は、カスタムの派生型) を作成し、 annotation.AddAnnotationTo(node)orを呼び出してノードに追加しますnode.WithAdditionalAnnotations(annotation)。ノードは依然として不変であるため、元のノードをツリー内の注釈付きのノードに置き換える必要があることに注意してください。

次に、ツリーにいくつかの変更を加えた後、 などを使用して注釈付きノードを取得できますparentNode.GetAnnotatedNodesAndTokens(annotation).Single().AsNode()。(特定の派生型の注釈によって注釈が付けられたすべてのノードを で取得することもできますparentNode.GetAnnotatedNodesAndTokens(typeof(CustomAnnotationType))。)

于 2013-01-08T14:19:24.163 に答える