@@ -6,6 +6,7 @@ import org.eclipse.lsp4j.SemanticTokensLegend
6
6
import org.eclipse.lsp4j.Range
7
7
import org.javacs.kt.CompiledFile
8
8
import org.javacs.kt.position.range
9
+ import org.javacs.kt.position.offset
9
10
import org.javacs.kt.util.preOrderTraversal
10
11
import org.jetbrains.kotlin.descriptors.ClassDescriptor
11
12
import org.jetbrains.kotlin.descriptors.ClassKind
@@ -51,8 +52,12 @@ val semanticTokensLegend = SemanticTokensLegend(
51
52
52
53
private data class SemanticToken (val range : Range , val type : SemanticTokenType , val modifiers : Set <SemanticTokenModifier > = setOf())
53
54
54
- fun semanticTokens (file : CompiledFile ): List <Int > =
55
- encodeTokens(elementTokens(file.parse, file.compile))
55
+ /* *
56
+ * Computes semantic tokens for the given range in the document.
57
+ * No range means the entire document.
58
+ */
59
+ fun semanticTokens (file : CompiledFile , range : Range ? = null): List <Int > =
60
+ encodeTokens(elementTokens(file.parse, file.compile, range))
56
61
57
62
private fun encodeTokens (tokens : Sequence <SemanticToken >): List <Int > {
58
63
val encoded = mutableListOf<Int >()
@@ -84,9 +89,13 @@ private fun encodeModifiers(modifiers: Set<SemanticTokenModifier>): Int = modifi
84
89
.map { 1 shl it.ordinal }
85
90
.fold(0 , Int ::or )
86
91
87
- private fun elementTokens (element : PsiElement , bindingContext : BindingContext ): Sequence <SemanticToken > = element
88
- .preOrderTraversal()
89
- .mapNotNull { elementToken(it, bindingContext) }
92
+ private fun elementTokens (element : PsiElement , bindingContext : BindingContext , range : Range ? = null): Sequence <SemanticToken > {
93
+ val file = element.containingFile
94
+ val offsets = range?.let { Pair (offset(file.text, it.start), offset(file.text, it.end)) }
95
+ return element
96
+ .preOrderTraversal { offsets?.let { element.textRange.containsRange(it.first, it.second) } ? : true }
97
+ .mapNotNull { elementToken(it, bindingContext) }
98
+ }
90
99
91
100
private fun elementToken (element : PsiElement , bindingContext : BindingContext ): SemanticToken ? {
92
101
val file = element.containingFile
0 commit comments