diff --git a/vscode-extension/server/src/semanticTokens.ts b/vscode-extension/server/src/semanticTokens.ts index 88cf526..d8fc0ea 100644 --- a/vscode-extension/server/src/semanticTokens.ts +++ b/vscode-extension/server/src/semanticTokens.ts @@ -39,6 +39,39 @@ export function buildSemanticTokens(document: TextDocument): number[] { return builder.build().data } +// Emit split tokens for NamedArgPrefix (e.g., "color=" → "color" + "=") +function emitNamedArgPrefix( + node: SyntaxNode, + document: TextDocument, + builder: SemanticTokensBuilder +) { + const text = document.getText({ + start: document.positionAt(node.from), + end: document.positionAt(node.to), + }) + + const nameLength = text.length - 1 // Everything except the = + const start = document.positionAt(node.from) + + // Emit token for the name part (e.g., "color") + builder.push( + start.line, + start.character, + nameLength, + TOKEN_TYPES.indexOf(SemanticTokenTypes.property), + 0 + ) + + // Emit token for the "=" part + builder.push( + start.line, + start.character + nameLength, + 1, // Just the = character + TOKEN_TYPES.indexOf(SemanticTokenTypes.operator), + 0 + ) +} + // Walk the tree and collect tokens function walkTree( node: SyntaxNode, @@ -46,12 +79,17 @@ function walkTree( builder: SemanticTokensBuilder, scopeTracker: ScopeTracker ) { - const tokenInfo = getTokenType(node, document, scopeTracker) + // Special handling for NamedArgPrefix to split "name=" into two tokens + if (node.type.id === Terms.NamedArgPrefix) { + emitNamedArgPrefix(node, document, builder) + } else { + const tokenInfo = getTokenType(node, document, scopeTracker) - if (tokenInfo !== undefined) { - const start = document.positionAt(node.from) - const length = node.to - node.from - builder.push(start.line, start.character, length, tokenInfo.type, tokenInfo.modifiers) + if (tokenInfo !== undefined) { + const start = document.positionAt(node.from) + const length = node.to - node.from + builder.push(start.line, start.character, length, tokenInfo.type, tokenInfo.modifiers) + } } let child = node.firstChild @@ -142,12 +180,6 @@ function getTokenType( modifiers: 0, } - case Terms.NamedArgPrefix: - return { - type: TOKEN_TYPES.indexOf(SemanticTokenTypes.property), - modifiers: 0, - } - case Terms.AssignableIdentifier: return { type: TOKEN_TYPES.indexOf(SemanticTokenTypes.variable),