@@ -30,9 +30,18 @@ public enum SyntaxClassification {
30
30
31
31
class _SyntaxClassifier: SyntaxVisitor {
32
32
33
+ /// Don't classify nodes with these IDs or any of their children
34
+ var skipNodeIds : Set < SyntaxNodeId > = [ ]
35
+
36
+ /// The top of the `contextStack` determines the classification for all tokens
37
+ /// encountered that do not have a native classification. If `force` is `true`
38
+ /// the top of the stack also determines the classification of tokens with a
39
+ /// native classification
33
40
private var contextStack : [ ( classification: SyntaxClassification , force: Bool ) ] =
34
41
[ ( classification: . none, force: false ) ]
35
42
43
+ /// The classifications that have determined so far are collected in this
44
+ /// dictionary
36
45
var classifications : [ TokenSyntax : SyntaxClassification ] = [ : ]
37
46
38
47
private func visit(
@@ -82,6 +91,9 @@ class _SyntaxClassifier: SyntaxVisitor {
82
91
% for node in SYNTAX_NODES:
83
92
% if is_visitable( node) :
84
93
override func visit( _ node: ${ node. name} ) {
94
+ if skipNodeIds. contains ( node. raw. id) {
95
+ return
96
+ }
85
97
% if node. is_unknown ( ) or node. is_syntax_collection ( ) :
86
98
super. visit ( node)
87
99
% else:
@@ -114,10 +126,15 @@ class _SyntaxClassifier: SyntaxVisitor {
114
126
}
115
127
116
128
public enum SyntaxClassifier {
117
- /// Classify all tokens in the given syntax tree for syntax highlighting
118
- public static func classifyTokensInTree( _ syntaxTree: SourceFileSyntax )
119
- -> [ TokenSyntax : SyntaxClassification ] {
129
+ /// Classify all tokens in the given syntax tree for syntax highlighting.
130
+ /// If a `IncrementalTreeTransferSession` is passed, only nodes that have
131
+ /// changed since the last transfer will be classified.
132
+ public static func classifyTokensInTree(
133
+ _ syntaxTree: SourceFileSyntax ,
134
+ skipNodes: Set < SyntaxNodeId > = [ ]
135
+ ) -> [ TokenSyntax : SyntaxClassification ] {
120
136
let classifier = _SyntaxClassifier ( )
137
+ classifier. skipNodeIds = skipNodes
121
138
classifier. visit ( syntaxTree)
122
139
return classifier. classifications
123
140
}
0 commit comments