css-variable-lsp 1.0.17 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/docs/SCSS_SASS_SUPPORT_RESEARCH.md +0 -96
- package/out/handlers/callHierarchy.js +0 -128
- package/out/handlers/callHierarchy.js.map +0 -1
- package/out/handlers/codeAction.js +0 -142
- package/out/handlers/codeAction.js.map +0 -1
- package/out/handlers/codeLens.js +0 -41
- package/out/handlers/codeLens.js.map +0 -1
- package/out/handlers/declaration.js +0 -34
- package/out/handlers/declaration.js.map +0 -1
- package/out/handlers/documentHighlight.js +0 -45
- package/out/handlers/documentHighlight.js.map +0 -1
- package/out/handlers/documentLink.js +0 -61
- package/out/handlers/documentLink.js.map +0 -1
- package/out/handlers/documentSync.js +0 -15
- package/out/handlers/documentSync.js.map +0 -1
- package/out/handlers/foldingRange.js +0 -77
- package/out/handlers/foldingRange.js.map +0 -1
- package/out/handlers/formatting.js +0 -99
- package/out/handlers/formatting.js.map +0 -1
- package/out/handlers/implementation.js +0 -35
- package/out/handlers/implementation.js.map +0 -1
- package/out/handlers/inlayHint.js +0 -46
- package/out/handlers/inlayHint.js.map +0 -1
- package/out/handlers/linkedEditingRange.js +0 -45
- package/out/handlers/linkedEditingRange.js.map +0 -1
- package/out/handlers/prepareRename.js +0 -44
- package/out/handlers/prepareRename.js.map +0 -1
- package/out/handlers/selectionRange.js +0 -100
- package/out/handlers/selectionRange.js.map +0 -1
- package/out/handlers/semanticTokens.js +0 -57
- package/out/handlers/semanticTokens.js.map +0 -1
- package/out/handlers/signatureHelp.js +0 -54
- package/out/handlers/signatureHelp.js.map +0 -1
- package/out/handlers/typeDefinition.js +0 -35
- package/out/handlers/typeDefinition.js.map +0 -1
- package/out/hierarchy/callHierarchy.js +0 -119
- package/out/hierarchy/callHierarchy.js.map +0 -1
- package/out/hierarchy/shared/hierarchyTypes.js +0 -45
- package/out/hierarchy/shared/hierarchyTypes.js.map +0 -1
- package/out/hierarchy/shared/variableAnalyzer.js +0 -43
- package/out/hierarchy/shared/variableAnalyzer.js.map +0 -1
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleFoldingRange = handleFoldingRange;
|
|
4
|
-
const node_1 = require("vscode-languageserver/node");
|
|
5
|
-
const csstree = require("css-tree");
|
|
6
|
-
/**
|
|
7
|
-
* Handle folding range requests for CSS documents.
|
|
8
|
-
* Provides folding for:
|
|
9
|
-
* - CSS rule blocks (selector { ... })
|
|
10
|
-
* - At-rules (@media, @keyframes, @supports, etc.)
|
|
11
|
-
* - Multi-line comments
|
|
12
|
-
*/
|
|
13
|
-
function handleFoldingRange(params, documents) {
|
|
14
|
-
const document = documents.get(params.textDocument.uri);
|
|
15
|
-
if (!document) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
const text = document.getText();
|
|
19
|
-
const foldingRanges = [];
|
|
20
|
-
// Parse CSS and find foldable blocks
|
|
21
|
-
try {
|
|
22
|
-
const ast = csstree.parse(text, {
|
|
23
|
-
positions: true,
|
|
24
|
-
onParseError: () => {
|
|
25
|
-
// Ignore parse errors for folding
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
csstree.walk(ast, {
|
|
29
|
-
enter: (node) => {
|
|
30
|
-
// Fold CSS rules (selector { ... })
|
|
31
|
-
if (node.type === "Rule" && node.loc) {
|
|
32
|
-
const startLine = node.loc.start.line - 1; // LSP is 0-based
|
|
33
|
-
const endLine = node.loc.end.line - 1;
|
|
34
|
-
// Only fold if it spans multiple lines
|
|
35
|
-
if (endLine > startLine) {
|
|
36
|
-
foldingRanges.push({
|
|
37
|
-
startLine,
|
|
38
|
-
endLine,
|
|
39
|
-
kind: node_1.FoldingRangeKind.Region,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Fold at-rules (@media, @keyframes, @supports, @font-face, etc.)
|
|
44
|
-
if (node.type === "Atrule" && node.loc && node.block) {
|
|
45
|
-
const startLine = node.loc.start.line - 1;
|
|
46
|
-
const endLine = node.loc.end.line - 1;
|
|
47
|
-
if (endLine > startLine) {
|
|
48
|
-
foldingRanges.push({
|
|
49
|
-
startLine,
|
|
50
|
-
endLine,
|
|
51
|
-
kind: node_1.FoldingRangeKind.Region,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
// If CSS parsing fails, fall back to brace matching
|
|
60
|
-
}
|
|
61
|
-
// Find multi-line comments using regex
|
|
62
|
-
const commentRegex = /\/\*[\s\S]*?\*\//g;
|
|
63
|
-
let match;
|
|
64
|
-
while ((match = commentRegex.exec(text)) !== null) {
|
|
65
|
-
const startPos = document.positionAt(match.index);
|
|
66
|
-
const endPos = document.positionAt(match.index + match[0].length);
|
|
67
|
-
if (endPos.line > startPos.line) {
|
|
68
|
-
foldingRanges.push({
|
|
69
|
-
startLine: startPos.line,
|
|
70
|
-
endLine: endPos.line,
|
|
71
|
-
kind: node_1.FoldingRangeKind.Comment,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return foldingRanges;
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=foldingRange.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"foldingRange.js","sourceRoot":"","sources":["../../src/handlers/foldingRange.ts"],"names":[],"mappings":";;AAeA,gDA0EC;AAzFD,qDAIoC;AAEpC,oCAAoC;AAEpC;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,MAA0B,EAC1B,SAAyD;IAEzD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,qCAAqC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;YAC9B,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,GAAG,EAAE;gBACjB,kCAAkC;YACpC,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YAChB,KAAK,EAAE,CAAC,IAAqB,EAAE,EAAE;gBAC/B,oCAAoC;gBACpC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB;oBAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;oBAEtC,uCAAuC;oBACvC,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;wBACxB,aAAa,CAAC,IAAI,CAAC;4BACjB,SAAS;4BACT,OAAO;4BACP,IAAI,EAAE,uBAAgB,CAAC,MAAM;yBAC9B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,kEAAkE;gBAClE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;oBAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;oBAEtC,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;wBACxB,aAAa,CAAC,IAAI,CAAC;4BACjB,SAAS;4BACT,OAAO;4BACP,IAAI,EAAE,uBAAgB,CAAC,MAAM;yBAC9B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IAED,uCAAuC;IACvC,MAAM,YAAY,GAAG,mBAAmB,CAAC;IACzC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAElE,IAAI,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC;gBACjB,SAAS,EAAE,QAAQ,CAAC,IAAI;gBACxB,OAAO,EAAE,MAAM,CAAC,IAAI;gBACpB,IAAI,EAAE,uBAAgB,CAAC,OAAO;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleDocumentFormatting = handleDocumentFormatting;
|
|
4
|
-
exports.handleDocumentRangeFormatting = handleDocumentRangeFormatting;
|
|
5
|
-
const node_1 = require("vscode-languageserver/node");
|
|
6
|
-
/**
|
|
7
|
-
* Handle document formatting requests.
|
|
8
|
-
* Basic CSS formatting implementation.
|
|
9
|
-
*/
|
|
10
|
-
function handleDocumentFormatting(params, documents) {
|
|
11
|
-
const document = documents.get(params.textDocument.uri);
|
|
12
|
-
if (!document) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
const text = document.getText();
|
|
16
|
-
const formatted = formatCss(text, params.options);
|
|
17
|
-
// Replace entire document
|
|
18
|
-
const fullRange = {
|
|
19
|
-
start: document.positionAt(0),
|
|
20
|
-
end: document.positionAt(text.length),
|
|
21
|
-
};
|
|
22
|
-
return [node_1.TextEdit.replace(fullRange, formatted)];
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Handle document range formatting requests.
|
|
26
|
-
*/
|
|
27
|
-
function handleDocumentRangeFormatting(params, documents) {
|
|
28
|
-
const document = documents.get(params.textDocument.uri);
|
|
29
|
-
if (!document) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
const startOffset = document.offsetAt(params.range.start);
|
|
33
|
-
const endOffset = document.offsetAt(params.range.end);
|
|
34
|
-
const text = document.getText();
|
|
35
|
-
// Format the selected text (basic implementation)
|
|
36
|
-
const selectedText = text.slice(startOffset, endOffset);
|
|
37
|
-
const formatted = formatCss(selectedText, params.options);
|
|
38
|
-
return [node_1.TextEdit.replace(params.range, formatted)];
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Simple CSS formatter.
|
|
42
|
-
* TODO: Integrate a proper parser/formatter like prettier or css-tree's generator if needed.
|
|
43
|
-
* This is a basic rule-based formatter.
|
|
44
|
-
*/
|
|
45
|
-
function formatCss(text, options) {
|
|
46
|
-
const indentChar = options.insertSpaces ? " ".repeat(options.tabSize) : "\t";
|
|
47
|
-
let depth = 0;
|
|
48
|
-
let output = "";
|
|
49
|
-
let insideString = null;
|
|
50
|
-
// Normalize newlines
|
|
51
|
-
const lines = text
|
|
52
|
-
.split(/\r?\n/)
|
|
53
|
-
.map((l) => l.trim())
|
|
54
|
-
.filter((l) => l.length > 0);
|
|
55
|
-
const joined = lines.join(" ");
|
|
56
|
-
// Simple tokenizing
|
|
57
|
-
let i = 0;
|
|
58
|
-
while (i < joined.length) {
|
|
59
|
-
const char = joined[i];
|
|
60
|
-
if (insideString) {
|
|
61
|
-
output += char;
|
|
62
|
-
if (char === insideString && joined[i - 1] !== "\\") {
|
|
63
|
-
insideString = null;
|
|
64
|
-
}
|
|
65
|
-
i++;
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
if (char === '"' || char === "'") {
|
|
69
|
-
insideString = char;
|
|
70
|
-
output += char;
|
|
71
|
-
i++;
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
if (char === "{") {
|
|
75
|
-
depth++;
|
|
76
|
-
output += " {\n" + indentChar.repeat(depth);
|
|
77
|
-
i++;
|
|
78
|
-
}
|
|
79
|
-
else if (char === "}") {
|
|
80
|
-
depth = Math.max(0, depth - 1);
|
|
81
|
-
output = output.trimEnd() + "\n" + indentChar.repeat(depth) + "}";
|
|
82
|
-
// If next char is not a closing brace, add newline
|
|
83
|
-
if (i + 1 < joined.length && joined[i + 1] !== "}") {
|
|
84
|
-
output += "\n" + indentChar.repeat(depth);
|
|
85
|
-
}
|
|
86
|
-
i++;
|
|
87
|
-
}
|
|
88
|
-
else if (char === ";") {
|
|
89
|
-
output += ";\n" + indentChar.repeat(depth);
|
|
90
|
-
i++;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
output += char;
|
|
94
|
-
i++;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return output.trim() + "\n";
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=formatting.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/handlers/formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleImplementation = handleImplementation;
|
|
4
|
-
const node_1 = require("vscode-languageserver/node");
|
|
5
|
-
/**
|
|
6
|
-
* Handle implementation requests for CSS variables.
|
|
7
|
-
* For CSS variables, implementation points to where the variable is actually
|
|
8
|
-
* used or defined (similar to definition for variables).
|
|
9
|
-
*/
|
|
10
|
-
function handleImplementation(params, documents, cssVariableManager) {
|
|
11
|
-
const document = documents.get(params.textDocument.uri);
|
|
12
|
-
if (!document) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
const text = document.getText();
|
|
16
|
-
const offset = document.offsetAt(params.position);
|
|
17
|
-
// Find the word at the cursor position
|
|
18
|
-
const left = text.slice(0, offset).match(/[\w-]*$/);
|
|
19
|
-
const right = text.slice(offset).match(/^[\w-]*/);
|
|
20
|
-
if (!left || !right) {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
const word = left[0] + right[0];
|
|
24
|
-
// Check if it's a CSS variable
|
|
25
|
-
if (word.startsWith("--")) {
|
|
26
|
-
const variables = cssVariableManager.getVariables(word);
|
|
27
|
-
if (variables.length > 0) {
|
|
28
|
-
// For CSS variables, implementation points to the definition
|
|
29
|
-
// This could be enhanced to point to actual usage/implementation sites
|
|
30
|
-
return node_1.Location.create(variables[0].uri, variables[0].range);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=implementation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"implementation.js","sourceRoot":"","sources":["../../src/handlers/implementation.ts"],"names":[],"mappings":";;AAcA,oDAkCC;AAzCD,qDAAsD;AAEtD;;;;GAIG;AACH,SAAgB,oBAAoB,CAClC,MAAkC,EAClC,SAAyD,EACzD,kBAAsC;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElD,uCAAuC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEhC,+BAA+B;IAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,6DAA6D;YAC7D,uEAAuE;YACvE,OAAO,eAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleInlayHints = handleInlayHints;
|
|
4
|
-
const node_1 = require("vscode-languageserver/node");
|
|
5
|
-
/**
|
|
6
|
-
* Handle inlay hint requests for CSS documents.
|
|
7
|
-
* Shows resolved variable values inline after var() usages.
|
|
8
|
-
*/
|
|
9
|
-
function handleInlayHints(params, documents, cssVariableManager) {
|
|
10
|
-
const document = documents.get(params.textDocument.uri);
|
|
11
|
-
if (!document) {
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
const text = document.getText();
|
|
15
|
-
const hints = [];
|
|
16
|
-
// Find all var(--name) usages
|
|
17
|
-
const varRegex = /var\((--[\w-]+)(?:\s*,\s*[^)]+)?\)/g;
|
|
18
|
-
let match;
|
|
19
|
-
while ((match = varRegex.exec(text)) !== null) {
|
|
20
|
-
const variableName = match[1];
|
|
21
|
-
const matchEnd = match.index + match[0].length;
|
|
22
|
-
// Check if this match is within the requested range
|
|
23
|
-
const endPos = document.positionAt(matchEnd);
|
|
24
|
-
if (endPos.line < params.range.start.line ||
|
|
25
|
-
endPos.line > params.range.end.line) {
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
// Get the variable value
|
|
29
|
-
const variables = cssVariableManager.getVariables(variableName);
|
|
30
|
-
if (variables.length === 0) {
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
// Use the first (highest priority) definition
|
|
34
|
-
const value = variables[0].value;
|
|
35
|
-
// Truncate long values
|
|
36
|
-
const displayValue = value.length > 30 ? value.slice(0, 27) + "..." : value;
|
|
37
|
-
hints.push({
|
|
38
|
-
position: endPos,
|
|
39
|
-
label: ` → ${displayValue}`,
|
|
40
|
-
kind: node_1.InlayHintKind.Type,
|
|
41
|
-
paddingLeft: true,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
return hints;
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=inlayHint.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inlayHint.js","sourceRoot":"","sources":["../../src/handlers/inlayHint.ts"],"names":[],"mappings":";;AAYA,4CAmDC;AA/DD,qDAIoC;AAIpC;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,MAAuB,EACvB,SAAyD,EACzD,kBAAsC;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,qCAAqC,CAAC;IACvD,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAE/C,oDAAoD;QACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7C,IACE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;YACrC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EACnC,CAAC;YACD,SAAS;QACX,CAAC;QAED,yBAAyB;QACzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,8CAA8C;QAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEjC,uBAAuB;QACvB,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAE5E,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,MAAM,YAAY,EAAE;YAC3B,IAAI,EAAE,oBAAa,CAAC,IAAI;YACxB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleLinkedEditingRange = handleLinkedEditingRange;
|
|
4
|
-
/**
|
|
5
|
-
* Handle linked editing range requests for CSS variables.
|
|
6
|
-
* Returns ranges that should be edited simultaneously (variable name in definition and usages).
|
|
7
|
-
*/
|
|
8
|
-
function handleLinkedEditingRange(params, documents, cssVariableManager) {
|
|
9
|
-
const document = documents.get(params.textDocument.uri);
|
|
10
|
-
if (!document) {
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
const text = document.getText();
|
|
14
|
-
const offset = document.offsetAt(params.position);
|
|
15
|
-
// Find the word at the cursor position
|
|
16
|
-
const left = text.slice(0, offset).match(/[\w-]*$/);
|
|
17
|
-
const right = text.slice(offset).match(/^[\w-]*/);
|
|
18
|
-
if (!left || !right) {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
const word = left[0] + right[0];
|
|
22
|
-
// Only for CSS variables
|
|
23
|
-
if (!word.startsWith("--")) {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
// Get all references to this variable in the current document
|
|
27
|
-
const references = cssVariableManager.getReferences(word);
|
|
28
|
-
const documentRefs = references.filter((ref) => ref.uri === document.uri);
|
|
29
|
-
if (documentRefs.length === 0) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
// Return all ranges that contain just the variable name
|
|
33
|
-
const ranges = documentRefs
|
|
34
|
-
.map((ref) => ref.nameRange || ref.range)
|
|
35
|
-
.filter((range) => range !== undefined);
|
|
36
|
-
if (ranges.length === 0) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
return {
|
|
40
|
-
ranges,
|
|
41
|
-
// CSS variable names follow this pattern
|
|
42
|
-
wordPattern: "--[\\w-]+",
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=linkedEditingRange.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"linkedEditingRange.js","sourceRoot":"","sources":["../../src/handlers/linkedEditingRange.ts"],"names":[],"mappings":";;AAYA,4DAkDC;AAtDD;;;GAGG;AACH,SAAgB,wBAAwB,CACtC,MAAgC,EAChC,SAAyD,EACzD,kBAAsC;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElD,uCAAuC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEhC,yBAAyB;IACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8DAA8D;IAC9D,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE1E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wDAAwD;IACxD,MAAM,MAAM,GAAY,YAAY;SACjC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC;SACxC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAY,CAAC;IAErD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM;QACN,yCAAyC;QACzC,WAAW,EAAE,WAAW;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handlePrepareRename = handlePrepareRename;
|
|
4
|
-
/**
|
|
5
|
-
* Handle prepare rename requests for CSS variables.
|
|
6
|
-
* Validates that the rename target is a valid CSS variable and returns its range.
|
|
7
|
-
*/
|
|
8
|
-
function handlePrepareRename(params, documents, cssVariableManager) {
|
|
9
|
-
const document = documents.get(params.textDocument.uri);
|
|
10
|
-
if (!document) {
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
const text = document.getText();
|
|
14
|
-
const offset = document.offsetAt(params.position);
|
|
15
|
-
// Find the word at the cursor position
|
|
16
|
-
const left = text.slice(0, offset).match(/[\w-]*$/);
|
|
17
|
-
const right = text.slice(offset).match(/^[\w-]*/);
|
|
18
|
-
if (!left || !right) {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
const word = left[0] + right[0];
|
|
22
|
-
// Only allow renaming CSS variables
|
|
23
|
-
if (!word.startsWith("--")) {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
// Check if this variable exists (either as definition or usage)
|
|
27
|
-
const definitions = cssVariableManager.getVariables(word);
|
|
28
|
-
const usages = cssVariableManager.getVariableUsages(word);
|
|
29
|
-
if (definitions.length === 0 && usages.length === 0) {
|
|
30
|
-
// Variable doesn't exist in the workspace
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
// Calculate the range of the variable name
|
|
34
|
-
const startOffset = offset - left[0].length;
|
|
35
|
-
const endOffset = offset + right[0].length;
|
|
36
|
-
return {
|
|
37
|
-
range: {
|
|
38
|
-
start: document.positionAt(startOffset),
|
|
39
|
-
end: document.positionAt(endOffset),
|
|
40
|
-
},
|
|
41
|
-
placeholder: word,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=prepareRename.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prepareRename.js","sourceRoot":"","sources":["../../src/handlers/prepareRename.ts"],"names":[],"mappings":";;AAQA,kDAgDC;AApDD;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,MAA2B,EAC3B,SAAyD,EACzD,kBAAsC;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElD,uCAAuC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEhC,oCAAoC;IACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,0CAA0C;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3C,OAAO;QACL,KAAK,EAAE;YACL,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;YACvC,GAAG,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;SACpC;QACD,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleSelectionRanges = handleSelectionRanges;
|
|
4
|
-
const csstree = require("css-tree");
|
|
5
|
-
/**
|
|
6
|
-
* Handle selection range requests for CSS documents.
|
|
7
|
-
* Returns nested selection ranges for smart "expand selection" functionality.
|
|
8
|
-
* Selection hierarchy: value → declaration → rule block → at-rule → stylesheet
|
|
9
|
-
*/
|
|
10
|
-
function handleSelectionRanges(params, documents) {
|
|
11
|
-
const document = documents.get(params.textDocument.uri);
|
|
12
|
-
if (!document) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
const text = document.getText();
|
|
16
|
-
const results = [];
|
|
17
|
-
// Parse CSS once
|
|
18
|
-
let ast = null;
|
|
19
|
-
try {
|
|
20
|
-
ast = csstree.parse(text, {
|
|
21
|
-
positions: true,
|
|
22
|
-
parseCustomProperty: true,
|
|
23
|
-
onParseError: () => { },
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
// If parsing fails, return null
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
for (const position of params.positions) {
|
|
31
|
-
const offset = document.offsetAt(position);
|
|
32
|
-
const ranges = findContainingRanges(ast, offset, document);
|
|
33
|
-
if (ranges.length === 0) {
|
|
34
|
-
// Fallback: return the whole document
|
|
35
|
-
results.push({
|
|
36
|
-
range: {
|
|
37
|
-
start: { line: 0, character: 0 },
|
|
38
|
-
end: document.positionAt(text.length),
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
// Build nested SelectionRange from innermost to outermost
|
|
44
|
-
let selectionRange;
|
|
45
|
-
for (let i = ranges.length - 1; i >= 0; i--) {
|
|
46
|
-
selectionRange = {
|
|
47
|
-
range: ranges[i],
|
|
48
|
-
parent: selectionRange,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
results.push(selectionRange);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return results;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Find all AST nodes that contain the given offset, from innermost to outermost.
|
|
58
|
-
*/
|
|
59
|
-
function findContainingRanges(ast, offset, document) {
|
|
60
|
-
const containers = [];
|
|
61
|
-
csstree.walk(ast, {
|
|
62
|
-
enter(node) {
|
|
63
|
-
if (!node.loc)
|
|
64
|
-
return;
|
|
65
|
-
const startOffset = document.offsetAt({
|
|
66
|
-
line: node.loc.start.line - 1,
|
|
67
|
-
character: node.loc.start.column - 1,
|
|
68
|
-
});
|
|
69
|
-
const endOffset = document.offsetAt({
|
|
70
|
-
line: node.loc.end.line - 1,
|
|
71
|
-
character: node.loc.end.column - 1,
|
|
72
|
-
});
|
|
73
|
-
if (offset >= startOffset && offset <= endOffset) {
|
|
74
|
-
// Include useful node types for selection
|
|
75
|
-
if (node.type === "StyleSheet" ||
|
|
76
|
-
node.type === "Rule" ||
|
|
77
|
-
node.type === "Atrule" ||
|
|
78
|
-
node.type === "Block" ||
|
|
79
|
-
node.type === "Declaration" ||
|
|
80
|
-
node.type === "Value" ||
|
|
81
|
-
node.type === "SelectorList" ||
|
|
82
|
-
node.type === "Selector") {
|
|
83
|
-
containers.push({ type: node.type, loc: node.loc });
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
});
|
|
88
|
-
// Convert to Range objects, outermost first (StyleSheet → ... → Value)
|
|
89
|
-
return containers.map((c) => ({
|
|
90
|
-
start: {
|
|
91
|
-
line: c.loc.start.line - 1,
|
|
92
|
-
character: c.loc.start.column - 1,
|
|
93
|
-
},
|
|
94
|
-
end: {
|
|
95
|
-
line: c.loc.end.line - 1,
|
|
96
|
-
character: c.loc.end.column - 1,
|
|
97
|
-
},
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=selectionRange.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selectionRange.js","sourceRoot":"","sources":["../../src/handlers/selectionRange.ts"],"names":[],"mappings":";;AAaA,sDAmDC;AA3DD,oCAAoC;AAGpC;;;;GAIG;AACH,SAAgB,qBAAqB,CACnC,MAA4B,EAC5B,SAAyD;IAEzD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,iBAAiB;IACjB,IAAI,GAAG,GAA2B,IAAI,CAAC;IACvC,IAAI,CAAC;QACH,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;YACxB,SAAS,EAAE,IAAI;YACf,mBAAmB,EAAE,IAAI;YACzB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;SACvB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE3D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;oBAChC,GAAG,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;iBACtC;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,0DAA0D;YAC1D,IAAI,cAA0C,CAAC;YAC/C,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,cAAc,GAAG;oBACf,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;oBAChB,MAAM,EAAE,cAAc;iBACvB,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,cAAe,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAOD;;GAEG;AACH,SAAS,oBAAoB,CAC3B,GAAoB,EACpB,MAAc,EACd,QAAsB;IAEtB,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;QAChB,KAAK,CAAC,IAAqB;YACzB,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE,OAAO;YAEtB,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACpC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;gBAC7B,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;aACrC,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBAClC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;gBAC3B,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;aACnC,CAAC,CAAC;YAEH,IAAI,MAAM,IAAI,WAAW,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;gBACjD,0CAA0C;gBAC1C,IACE,IAAI,CAAC,IAAI,KAAK,YAAY;oBAC1B,IAAI,CAAC,IAAI,KAAK,MAAM;oBACpB,IAAI,CAAC,IAAI,KAAK,QAAQ;oBACtB,IAAI,CAAC,IAAI,KAAK,OAAO;oBACrB,IAAI,CAAC,IAAI,KAAK,aAAa;oBAC3B,IAAI,CAAC,IAAI,KAAK,OAAO;oBACrB,IAAI,CAAC,IAAI,KAAK,cAAc;oBAC5B,IAAI,CAAC,IAAI,KAAK,UAAU,EACxB,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,uEAAuE;IACvE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,KAAK,EAAE;YACL,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;YAC1B,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;SAClC;QACD,GAAG,EAAE;YACH,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;YACxB,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;SAChC;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.semanticTokensLegend = exports.tokenModifiers = exports.tokenTypes = void 0;
|
|
4
|
-
exports.handleSemanticTokens = handleSemanticTokens;
|
|
5
|
-
const node_1 = require("vscode-languageserver/node");
|
|
6
|
-
// Define token types and modifiers
|
|
7
|
-
exports.tokenTypes = [
|
|
8
|
-
"variable",
|
|
9
|
-
"property",
|
|
10
|
-
"value",
|
|
11
|
-
"string",
|
|
12
|
-
"comment",
|
|
13
|
-
];
|
|
14
|
-
exports.tokenModifiers = ["declaration", "readonly", "static"];
|
|
15
|
-
exports.semanticTokensLegend = {
|
|
16
|
-
tokenTypes: exports.tokenTypes,
|
|
17
|
-
tokenModifiers: exports.tokenModifiers,
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Handle semantic tokens requests.
|
|
21
|
-
* Provides syntax highlighting for CSS variables and properties.
|
|
22
|
-
*/
|
|
23
|
-
function handleSemanticTokens(params, documents, cssVariableManager) {
|
|
24
|
-
const document = documents.get(params.textDocument.uri);
|
|
25
|
-
if (!document) {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
const text = document.getText();
|
|
29
|
-
const builder = new node_1.SemanticTokensBuilder();
|
|
30
|
-
// Highlight CSS variables --var-name
|
|
31
|
-
const variableRegex = /--[\w-]+/g;
|
|
32
|
-
let match;
|
|
33
|
-
while ((match = variableRegex.exec(text)) !== null) {
|
|
34
|
-
const startPos = document.positionAt(match.index);
|
|
35
|
-
const length = match[0].length;
|
|
36
|
-
// Determine if it's a declaration or usage
|
|
37
|
-
// Heuristic: check if followed by ":"
|
|
38
|
-
const afterMatch = text.slice(match.index + length);
|
|
39
|
-
const isDeclaration = /^\s*:/.test(afterMatch);
|
|
40
|
-
let variableType = 0; // "variable"
|
|
41
|
-
let modifiers = 0;
|
|
42
|
-
if (isDeclaration) {
|
|
43
|
-
modifiers |= 1 << 0; // "declaration"
|
|
44
|
-
}
|
|
45
|
-
builder.push(startPos.line, startPos.character, length, variableType, modifiers);
|
|
46
|
-
}
|
|
47
|
-
// Highlight var() functions
|
|
48
|
-
const varFuncRegex = /var\(/g;
|
|
49
|
-
while ((match = varFuncRegex.exec(text)) !== null) {
|
|
50
|
-
const startPos = document.positionAt(match.index);
|
|
51
|
-
// Highlight "var"
|
|
52
|
-
builder.push(startPos.line, startPos.character, 3, 1, // "property" (misusing property for function keyword here for distinction)
|
|
53
|
-
0);
|
|
54
|
-
}
|
|
55
|
-
return builder.build();
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=semanticTokens.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"semanticTokens.js","sourceRoot":"","sources":["../../src/handlers/semanticTokens.ts"],"names":[],"mappings":";;;AA2BA,oDAyDC;AApFD,qDAIoC;AAIpC,mCAAmC;AACtB,QAAA,UAAU,GAAG;IACxB,UAAU;IACV,UAAU;IACV,OAAO;IACP,QAAQ;IACR,SAAS;CACV,CAAC;AACW,QAAA,cAAc,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEvD,QAAA,oBAAoB,GAAG;IAClC,UAAU,EAAV,kBAAU;IACV,cAAc,EAAd,sBAAc;CACf,CAAC;AAEF;;;GAGG;AACH,SAAgB,oBAAoB,CAClC,MAA4B,EAC5B,SAAyD,EACzD,kBAAsC;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,4BAAqB,EAAE,CAAC;IAE5C,qCAAqC;IACrC,MAAM,aAAa,GAAG,WAAW,CAAC;IAClC,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAE/B,2CAA2C;QAC3C,sCAAsC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/C,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,aAAa;QACnC,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,IAAI,aAAa,EAAE,CAAC;YAClB,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB;QACvC,CAAC;QAED,OAAO,CAAC,IAAI,CACV,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,SAAS,EAClB,MAAM,EACN,YAAY,EACZ,SAAS,CACV,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC;IAC9B,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,kBAAkB;QAClB,OAAO,CAAC,IAAI,CACV,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,SAAS,EAClB,CAAC,EACD,CAAC,EAAE,2EAA2E;QAC9E,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleSignatureHelp = handleSignatureHelp;
|
|
4
|
-
/**
|
|
5
|
-
* Handle signature help requests for CSS documents.
|
|
6
|
-
* Provides parameter hints for var(--name, fallback) syntax.
|
|
7
|
-
*/
|
|
8
|
-
function handleSignatureHelp(params, documents, cssVariableManager) {
|
|
9
|
-
const document = documents.get(params.textDocument.uri);
|
|
10
|
-
if (!document) {
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
const text = document.getText();
|
|
14
|
-
const offset = document.offsetAt(params.position);
|
|
15
|
-
// Look backwards for "var(" to see if we're inside a var() call
|
|
16
|
-
const textBefore = text.slice(0, offset);
|
|
17
|
-
const varMatch = textBefore.match(/var\(\s*(--[\w-]*)?(?:\s*,\s*)?$/);
|
|
18
|
-
if (!varMatch) {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
// Determine which parameter we're in
|
|
22
|
-
const afterVar = textBefore.slice(textBefore.lastIndexOf("var("));
|
|
23
|
-
const hasComma = afterVar.includes(",");
|
|
24
|
-
const activeParameter = hasComma ? 1 : 0;
|
|
25
|
-
// Get variable info if we have a name
|
|
26
|
-
const varName = varMatch[1];
|
|
27
|
-
let variableInfo = "";
|
|
28
|
-
if (varName) {
|
|
29
|
-
const variables = cssVariableManager.getVariables(varName);
|
|
30
|
-
if (variables.length > 0) {
|
|
31
|
-
variableInfo = ` (current value: ${variables[0].value})`;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
const signature = {
|
|
35
|
-
label: "var(--custom-property, fallback-value)",
|
|
36
|
-
documentation: `CSS custom property (variable) function.${variableInfo}\n\nThe var() function substitutes the value of a custom property.`,
|
|
37
|
-
parameters: [
|
|
38
|
-
{
|
|
39
|
-
label: "--custom-property",
|
|
40
|
-
documentation: "The name of the custom property to use, starting with --",
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
label: "fallback-value",
|
|
44
|
-
documentation: "Optional fallback value used if the property is not defined",
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
};
|
|
48
|
-
return {
|
|
49
|
-
signatures: [signature],
|
|
50
|
-
activeSignature: 0,
|
|
51
|
-
activeParameter,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=signatureHelp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signatureHelp.js","sourceRoot":"","sources":["../../src/handlers/signatureHelp.ts"],"names":[],"mappings":";;AAaA,kDA0DC;AA9DD;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,MAA2B,EAC3B,SAAyD,EACzD,kBAAsC;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElD,gEAAgE;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAEtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzC,sCAAsC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,YAAY,GAAG,oBAAoB,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAyB;QACtC,KAAK,EAAE,wCAAwC;QAC/C,aAAa,EAAE,2CAA2C,YAAY,oEAAoE;QAC1I,UAAU,EAAE;YACV;gBACE,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EACX,0DAA0D;aACrC;YACzB;gBACE,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EACX,6DAA6D;aACxC;SAC1B;KACF,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,CAAC,SAAS,CAAC;QACvB,eAAe,EAAE,CAAC;QAClB,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleTypeDefinition = handleTypeDefinition;
|
|
4
|
-
const node_1 = require("vscode-languageserver/node");
|
|
5
|
-
/**
|
|
6
|
-
* Handle type definition requests for CSS variables.
|
|
7
|
-
* For CSS variables, type definition is similar to definition -
|
|
8
|
-
* it refers to where the variable type/value is defined.
|
|
9
|
-
*/
|
|
10
|
-
function handleTypeDefinition(params, documents, cssVariableManager) {
|
|
11
|
-
const document = documents.get(params.textDocument.uri);
|
|
12
|
-
if (!document) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
const text = document.getText();
|
|
16
|
-
const offset = document.offsetAt(params.position);
|
|
17
|
-
// Find the word at the cursor position
|
|
18
|
-
const left = text.slice(0, offset).match(/[\w-]*$/);
|
|
19
|
-
const right = text.slice(offset).match(/^[\w-]*/);
|
|
20
|
-
if (!left || !right) {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
const word = left[0] + right[0];
|
|
24
|
-
// Check if it's a CSS variable
|
|
25
|
-
if (word.startsWith("--")) {
|
|
26
|
-
const variables = cssVariableManager.getVariables(word);
|
|
27
|
-
if (variables.length > 0) {
|
|
28
|
-
// For CSS variables, type definition points to where the variable is defined
|
|
29
|
-
// This could be enhanced to include type information (color, size, etc.)
|
|
30
|
-
return node_1.Location.create(variables[0].uri, variables[0].range);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=typeDefinition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typeDefinition.js","sourceRoot":"","sources":["../../src/handlers/typeDefinition.ts"],"names":[],"mappings":";;AAcA,oDAkCC;AAzCD,qDAAsD;AAEtD;;;;GAIG;AACH,SAAgB,oBAAoB,CAClC,MAAkC,EAClC,SAAyD,EACzD,kBAAsC;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElD,uCAAuC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEhC,+BAA+B;IAC/B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,6EAA6E;YAC7E,yEAAyE;YACzE,OAAO,eAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|