在使用Roslyn时,我经常会有一个CompilationUnitSyntax中的节点,但不是SemanticModel,反之亦然。 (或者我只能通过一个或另一个的操作拉出节点 - 例如,如果您需要来自语义模型的类型信息,则查询的节点必须存在于SemanticModel树中)
我可以看到为什么他们为了不变性而做了这一切,但是你怎么一直回去从一棵树到另一棵树找到相同的标记?如果修改任一树,则必须以某种方式检索正在使用的节点。最好的方法是什么????
答案 0 :(得分:1)
如果要在更改树时跟踪单个语法节点,可以使用SyntaxAnnotation
。
要使用它,请创建新的SyntaxAnnotation
(或自定义派生类型,如果您需要保留该注释的其他信息),然后通过调用annotation.AddAnnotationTo(node)
或{将其添加到节点中{1}}。请记住,节点仍然是不可变的,因此您需要将原始节点替换为树中带注释的节点。
然后,在对树执行某些修改之后,可以使用node.WithAdditionalAnnotations(annotation)
之类的内容返回带注释的节点。 (您还可以通过parentNode.GetAnnotatedNodesAndTokens(annotation).Single().AsNode()
获取由特定派生类型的注释注释的所有节点。)