Skip to content

Commit dcaee83

Browse files
committed
add feature: optionally de-color quoted parts
revert experimental feature: `updatePairMatchFirstWord()` Signed-off-by: Qingpeng Li <qingpeng9802@gmail.com>
1 parent e53595c commit dcaee83

File tree

6 files changed

+240
-363
lines changed

6 files changed

+240
-363
lines changed

package-lock.json

Lines changed: 207 additions & 317 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,11 @@
202202
"Respond to all the selected words."
203203
]
204204
},
205+
"commonLisp.DocumentSemanticTokensProvider.NotColorQuoted": {
206+
"type": "boolean",
207+
"default": false,
208+
"markdownDescription": "If true, any `quote` will NOT be colored."
209+
},
205210
"commonLisp.DocumentSemanticTokensProvider.ExcludedRanges": {
206211
"type": "string",
207212
"default": "comment and string",
@@ -303,24 +308,24 @@
303308
},
304309
"devDependencies": {
305310
"@types/js-yaml": "^4.0.9",
306-
"@types/node": "^20.9.0",
311+
"@types/node": "^20.9.2",
307312
"@types/vscode": "1.63.0",
308313
"@types/webpack-env": "^1.18.4",
309-
"@typescript-eslint/eslint-plugin": "^6.10.0",
314+
"@typescript-eslint/eslint-plugin": "^6.11.0",
310315
"assert": "^2.1.0",
311-
"dependency-cruiser": "^15.2.0",
312-
"esbuild": "^0.19.5",
313-
"eslint": "^8.53.0",
316+
"dependency-cruiser": "^15.3.0",
317+
"esbuild": "^0.19.6",
318+
"eslint": "^8.54.0",
314319
"eslint-import-resolver-typescript": "^3.6.1",
315320
"eslint-plugin-import": "^2.29.0",
316321
"eslint-plugin-node": "^11.1.0",
317322
"eslint-plugin-unused-imports": "^3.0.0",
318323
"fs": "^0.0.1-security",
319324
"js-yaml": "^4.1.0",
320325
"process": "^0.11.10",
321-
"ts-loader": "^9.5.0",
326+
"ts-loader": "^9.5.1",
322327
"typescript": "^5.2.2",
323-
"unimported": "^1.30.0",
328+
"unimported": "^1.31.1",
324329
"webpack": "^5.89.0",
325330
"webpack-cli": "^5.1.4",
326331
"copyfiles": "^2.4.1",

src/web/builders/semantic_tokens_builder/semantic_tokens_builder.ts

Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { DocSymbolInfo } from '../DocSymbolInfo';
66
import { getScopedSameNameWordsExcludeItself } from '../builders_util';
77

88
import { _encodeTokenType, _encodeTokenModifiers, vscodeKindToTokenType } from './token_util';
9-
import { overrideQuote, updateLoop, updatePairMatchFirstWord } from './update_util';
9+
import { overrideQuote, updateLoop } from './update_util';
1010

1111
function genAllPossibleWord(
1212
currDocSymbolInfo: DocSymbolInfo
@@ -61,32 +61,19 @@ function getTokenDict(
6161
const excludedRanges: [number, number][] =
6262
currDocSymbolInfo.docRes.getExcludedRangesForDocumentSemanticTokensProvider(buildingConfig);
6363

64-
// colored position collector
65-
// {index, [encodeTokenType, encodeTokenModifiers]}
66-
// Note that the `index` should be no-translated result, that is,
67-
// `index` should be the 1st character of current string.
68-
// For example, `sb-c::instrument-consing` should be the index of `s` instead of `i`.
69-
let coloredPosMap: Map<number, [number, number]> = new Map<number, [number, number]>();
70-
7164
// overlap in order!
72-
updateTokenDict(currDocSymbolInfo, excludedRanges, needColorDict, 'local', tokensBuilder, coloredPosMap);
73-
74-
// Due to the restrictions below, we cannot make this feature optional
75-
// https://github.com/microsoft/vscode/issues/580
76-
// https://github.com/microsoft/vscode/issues/68647
77-
updatePairMatchFirstWord(currDocSymbolInfo, coloredPosMap, tokensBuilder);
78-
79-
coloredPosMap = new Map<number, [number, number]>();
65+
updateTokenDict(currDocSymbolInfo, excludedRanges, needColorDict, 'local', tokensBuilder);
66+
updateTokenDict(currDocSymbolInfo, excludedRanges, needColorDict, 'global', tokensBuilder);
8067

81-
updateTokenDict(currDocSymbolInfo, excludedRanges, needColorDict, 'global', tokensBuilder, coloredPosMap);
82-
83-
updateLoop(currDocSymbolInfo, excludedRanges, tokensBuilder, coloredPosMap);
84-
updatePairMatchFirstWord(currDocSymbolInfo, coloredPosMap, tokensBuilder);
85-
coloredPosMap = new Map<number, [number, number]>();
68+
updateLoop(currDocSymbolInfo, excludedRanges, tokensBuilder);
8669

8770
// 1. tried to de-color all single-quoted parts
88-
// vscode semantic highlighting does not support multi-line token, does not work
89-
overrideQuote(currDocSymbolInfo, tokensBuilder);
71+
// vscode semantic highlighting does not support multi-line tokens
72+
// so we split the multi-line tokens into multiple single-line tokens manually.
73+
// This may have a negative impact on performance.
74+
if (buildingConfig.get('commonLisp.DocumentSemanticTokensProvider.NotColorQuoted') === true) {
75+
overrideQuote(currDocSymbolInfo, tokensBuilder);
76+
}
9077
//
9178
// 2. tried to de-color all no-formatted strings
9279
// not sure if it can cover all cases or not
@@ -100,7 +87,6 @@ function updateTokenDict(
10087
needColorDict: Map<string, [number, number][]>,
10188
updateScope: 'global' | 'local',
10289
tokensBuilder: vscode.SemanticTokensBuilder,
103-
coloredPosMap: Map<number, [number, number]>,
10490
) {
10591
const isGlobal = updateScope === 'global';
10692
const d = isGlobal ? currDocSymbolInfo.globalDef : currDocSymbolInfo.allLocal;
@@ -125,11 +111,7 @@ function updateTokenDict(
125111

126112
// color def itself
127113
const startPos = item.startPos;
128-
const encoded = setParsedToken(tokensBuilder, item, startPos, isGlobal);
129-
if (encoded !== undefined) {
130-
coloredPosMap.set(item.numRange[0], encoded);
131-
}
132-
114+
setParsedToken(tokensBuilder, item, startPos, isGlobal);
133115
// color its scope
134116
const scopedSameNameWords = getScopedSameNameWordsExcludeItself(item, needColorDict, currDocSymbolInfo);
135117
for (const rang of scopedSameNameWords) {
@@ -138,10 +120,7 @@ function updateTokenDict(
138120
}
139121

140122
const startPos = currDocSymbolInfo.document.positionAt(rang[0]);
141-
const encoded = setParsedToken(tokensBuilder, item, startPos);
142-
if (encoded !== undefined) {
143-
coloredPosMap.set(rang[0], encoded);
144-
}
123+
setParsedToken(tokensBuilder, item, startPos);
145124
}
146125

147126
}
@@ -155,7 +134,7 @@ function setParsedToken(
155134
item: SymbolInfo,
156135
startPos: vscode.Position,
157136
isGlobal = true
158-
): [number, number] | undefined {
137+
) {
159138
const nameStr = item.name;
160139
const packagePrefixIndScope = nameStr.indexOf(':');
161140
let len = nameStr.length;
@@ -168,7 +147,7 @@ function setParsedToken(
168147
isGlobal &&
169148
(subItemName.startsWith('+') && subItemName.endsWith('+')) ||
170149
(subItemName.startsWith('*') && subItemName.endsWith('*'))) {
171-
return undefined;
150+
return;
172151
}
173152
}
174153
startPos = startPos.translate(0, packagePrefixIndScope);
@@ -194,8 +173,6 @@ function setParsedToken(
194173
);
195174
//const key = `${item.name}|${startPos.line},${startPos.character},${item.name.length}`;
196175
//console.log(key);
197-
198-
return [encodedTT, encodedTMs];
199176
}
200177

201178
function buildSemanticTokens(

src/web/builders/semantic_tokens_builder/update_util.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ function updateLoop(
1010
currDocSymbolInfo: DocSymbolInfo,
1111
excludedRanges: [number, number][],
1212
tokensBuilder: vscode.SemanticTokensBuilder,
13-
coloredPosMap: Map<number, [number, number]>,
1413
) {
1514
const document = currDocSymbolInfo.document;
1615
const text = document.getText();
@@ -62,7 +61,6 @@ function updateLoop(
6261
startPos.line, startPos.character, word.length,
6362
encodedTT, encodedTMs
6463
);
65-
coloredPosMap.set(rindex, [encodedTT, encodedTMs]);
6664
//const key = `loop ${word}|${startPos.line},${startPos.character},${word.length}`;
6765
//console.log(key);
6866
}
@@ -145,6 +143,9 @@ function overrideNotFormattedString(
145143
}
146144
}
147145

146+
// Due to the restrictions below, we cannot make this feature optional
147+
// https://github.com/microsoft/vscode/issues/580
148+
// https://github.com/microsoft/vscode/issues/68647
148149
function updatePairMatchFirstWord(
149150
currDocSymbolInfo: DocSymbolInfo,
150151
coloredPosMap: Map<number, [number, number]>,

src/web/entry/WorkspaceConfig.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class WorkspaceConfig {
2323
['commonLisp.DefinitionProvider.ExcludedRanges', ExcludeRanges.None],
2424
['commonLisp.DefinitionProvider.BackQuoteFilter.enabled', true],
2525

26+
['commonLisp.DocumentSemanticTokensProvider.NotColorQuoted', false],
27+
2628
['commonLisp.providers.CompletionItemProviders.user.enabled', true],
2729
['commonLisp.providers.CompletionItemProviders.original.enabled', true],
2830
['commonLisp.providers.CompletionItemProviders.loop.enabled', true],

src/web/provider_interface/StructuredInfo.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class StructuredInfo {
3636
['commonLisp.DefinitionProvider.ExcludedRanges', ExcludeRanges.None],
3737
['commonLisp.ReferenceProvider.ExcludedRanges', ExcludeRanges.CommentString],
3838
['commonLisp.DocumentSemanticTokensProvider.ExcludedRanges', ExcludeRanges.CommentString],
39+
40+
['commonLisp.DocumentSemanticTokensProvider.NotColorQuoted', false],
3941
]);
4042

4143
// dirty flag indicates that the document has been changed,

0 commit comments

Comments
 (0)