Skip to content

Commit b85f5eb

Browse files
committed
implemented semantic highlighting for lambda definitions
1 parent 82f3a31 commit b85f5eb

File tree

4 files changed

+28
-21
lines changed

4 files changed

+28
-21
lines changed

server/src/parser/parser.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,9 @@ function assignment(state: State, token: Token) {
8686
} else {
8787
let top = peek(stack);
8888
if (top?.tokenType === Colon || top?.tokenType === DoubleColon) {
89-
token.assignment = [top];
90-
stack.pop();
91-
if (stack.length > 0) {
92-
token.assignment.push(...stack);
93-
clear(stack);
89+
token.assignment = [];
90+
while ((top = stack.pop())) {
91+
token.assignment.push(top);
9492
}
9593
}
9694
stack.push(token);

server/src/parser/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ export function tokenId(token: Token) {
166166
return (token.tokenType.tokenTypeIdx?.toString(16) || "").padStart(2, "0");
167167
}
168168

169+
export function lamdaDefinition(token: Token) {
170+
return token.assignment?.find((value) => value.tokenType === LCurly);
171+
}
172+
169173
export const enum FindKind {
170174
Reference,
171175
Definition,

server/src/qLangServer.ts

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ import {
7474
WhiteSpace,
7575
RCurly,
7676
local,
77+
LCurly,
78+
lamdaDefinition,
7779
} from "./parser";
7880
import { lint } from "./linter";
7981
import { readFileSync } from "node:fs";
@@ -158,7 +160,7 @@ export default class QLangServer {
158160
semanticTokensProvider: {
159161
full: true,
160162
legend: {
161-
tokenTypes: ["variable"],
163+
tokenTypes: ["variable", "function"],
162164
tokenModifiers: ["declaration", "readonly"],
163165
},
164166
},
@@ -468,18 +470,21 @@ export default class QLangServer {
468470
let character = 0;
469471
let delta = 0;
470472
for (const token of tokens) {
471-
if (assignable(token) && local(token, tokens)) {
472-
line = range.start.line;
473-
character = range.start.character;
474-
range = rangeFromToken(token);
475-
delta = range.start.line - line;
476-
result.data.push(
477-
delta,
478-
delta ? range.start.character : range.start.character - character,
479-
token.image.length,
480-
0,
481-
3,
482-
);
473+
if (assignable(token)) {
474+
let kind = lamdaDefinition(token) ? 1 : local(token, tokens) ? 0 : -1;
475+
if (kind >= 0) {
476+
line = range.start.line;
477+
character = range.start.character;
478+
range = rangeFromToken(token);
479+
delta = range.start.line - line;
480+
result.data.push(
481+
delta,
482+
delta ? range.start.character : range.start.character - character,
483+
token.image.length,
484+
kind,
485+
3,
486+
);
487+
}
483488
}
484489
}
485490
return result;

test/suite/qLangServer.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -384,19 +384,19 @@ describe("qLangServer", () => {
384384
it("should tokenize local variables", () => {
385385
const params = createDocument("a:{[b;c]d:1;b*c*d}");
386386
const result = server.onSemanticTokens(params);
387-
assert.strictEqual(result.data.length, 30);
387+
assert.strictEqual(result.data.length, 35);
388388
});
389389

390390
it("should ignore qualified variables", () => {
391391
const params = createDocument("a:{.ns.b:1;.ns.b}");
392392
const result = server.onSemanticTokens(params);
393-
assert.strictEqual(result.data.length, 0);
393+
assert.strictEqual(result.data.length, 5);
394394
});
395395

396396
it("should detect empty lists", () => {
397397
const params = createDocument("a:{b:();b}");
398398
const result = server.onSemanticTokens(params);
399-
assert.strictEqual(result.data.length, 10);
399+
assert.strictEqual(result.data.length, 15);
400400
});
401401
});
402402

0 commit comments

Comments
 (0)