vscode-css-languageservice 5.4.1 → 6.0.1
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/CHANGELOG.md +5 -1
- package/README.md +1 -0
- package/lib/esm/beautify/beautify-css.js +50 -8
- package/lib/esm/cssLanguageService.d.ts +37 -37
- package/lib/esm/cssLanguageService.js +72 -75
- package/lib/esm/cssLanguageTypes.d.ts +238 -238
- package/lib/esm/cssLanguageTypes.js +42 -42
- package/lib/esm/data/webCustomData.js +21959 -21965
- package/lib/esm/languageFacts/builtinData.js +142 -142
- package/lib/esm/languageFacts/colors.js +469 -472
- package/lib/esm/languageFacts/dataManager.js +88 -92
- package/lib/esm/languageFacts/dataProvider.js +73 -79
- package/lib/esm/languageFacts/entry.js +137 -138
- package/lib/esm/languageFacts/facts.js +8 -8
- package/lib/esm/parser/cssErrors.js +48 -50
- package/lib/esm/parser/cssNodes.js +1502 -2019
- package/lib/esm/parser/cssParser.js +1534 -1566
- package/lib/esm/parser/cssScanner.js +592 -599
- package/lib/esm/parser/cssSymbolScope.js +311 -341
- package/lib/esm/parser/lessParser.js +714 -740
- package/lib/esm/parser/lessScanner.js +57 -78
- package/lib/esm/parser/scssErrors.js +18 -20
- package/lib/esm/parser/scssParser.js +796 -818
- package/lib/esm/parser/scssScanner.js +95 -116
- package/lib/esm/services/cssCodeActions.js +77 -81
- package/lib/esm/services/cssCompletion.js +1054 -1149
- package/lib/esm/services/cssFolding.js +190 -193
- package/lib/esm/services/cssFormatter.js +136 -136
- package/lib/esm/services/cssHover.js +148 -151
- package/lib/esm/services/cssNavigation.js +378 -470
- package/lib/esm/services/cssSelectionRange.js +47 -47
- package/lib/esm/services/cssValidation.js +41 -44
- package/lib/esm/services/lessCompletion.js +378 -397
- package/lib/esm/services/lint.js +518 -532
- package/lib/esm/services/lintRules.js +76 -83
- package/lib/esm/services/lintUtil.js +196 -205
- package/lib/esm/services/pathCompletion.js +157 -231
- package/lib/esm/services/scssCompletion.js +354 -378
- package/lib/esm/services/scssNavigation.js +82 -154
- package/lib/esm/services/selectorPrinting.js +492 -536
- package/lib/esm/utils/arrays.js +40 -46
- package/lib/esm/utils/objects.js +11 -11
- package/lib/esm/utils/resources.js +11 -24
- package/lib/esm/utils/strings.js +102 -104
- package/lib/umd/beautify/beautify-css.js +50 -8
- package/lib/umd/cssLanguageService.d.ts +37 -37
- package/lib/umd/cssLanguageService.js +99 -102
- package/lib/umd/cssLanguageTypes.d.ts +238 -238
- package/lib/umd/cssLanguageTypes.js +89 -88
- package/lib/umd/data/webCustomData.js +21972 -21978
- package/lib/umd/languageFacts/builtinData.js +154 -154
- package/lib/umd/languageFacts/colors.js +492 -495
- package/lib/umd/languageFacts/dataManager.js +101 -104
- package/lib/umd/languageFacts/dataProvider.js +86 -91
- package/lib/umd/languageFacts/entry.js +152 -153
- package/lib/umd/languageFacts/facts.js +29 -29
- package/lib/umd/parser/cssErrors.js +61 -62
- package/lib/umd/parser/cssNodes.js +1587 -2034
- package/lib/umd/parser/cssParser.js +1547 -1578
- package/lib/umd/parser/cssScanner.js +606 -611
- package/lib/umd/parser/cssSymbolScope.js +328 -353
- package/lib/umd/parser/lessParser.js +727 -752
- package/lib/umd/parser/lessScanner.js +70 -90
- package/lib/umd/parser/scssErrors.js +31 -32
- package/lib/umd/parser/scssParser.js +809 -830
- package/lib/umd/parser/scssScanner.js +108 -128
- package/lib/umd/services/cssCodeActions.js +90 -93
- package/lib/umd/services/cssCompletion.js +1067 -1161
- package/lib/umd/services/cssFolding.js +203 -206
- package/lib/umd/services/cssFormatter.js +150 -150
- package/lib/umd/services/cssHover.js +161 -163
- package/lib/umd/services/cssNavigation.js +391 -482
- package/lib/umd/services/cssSelectionRange.js +60 -60
- package/lib/umd/services/cssValidation.js +54 -56
- package/lib/umd/services/lessCompletion.js +391 -409
- package/lib/umd/services/lint.js +531 -544
- package/lib/umd/services/lintRules.js +91 -95
- package/lib/umd/services/lintUtil.js +210 -218
- package/lib/umd/services/pathCompletion.js +171 -244
- package/lib/umd/services/scssCompletion.js +367 -390
- package/lib/umd/services/scssNavigation.js +95 -166
- package/lib/umd/services/selectorPrinting.js +510 -550
- package/lib/umd/utils/arrays.js +55 -61
- package/lib/umd/utils/objects.js +25 -25
- package/lib/umd/utils/resources.js +26 -39
- package/lib/umd/utils/strings.js +120 -122
- package/package.json +11 -11
|
@@ -1,206 +1,203 @@
|
|
|
1
|
-
(function (factory) {
|
|
2
|
-
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
-
var v = factory(require, exports);
|
|
4
|
-
if (v !== undefined) module.exports = v;
|
|
5
|
-
}
|
|
6
|
-
else if (typeof define === "function" && define.amd) {
|
|
7
|
-
define(["require", "exports", "../parser/cssScanner", "../parser/scssScanner", "../parser/lessScanner"], factory);
|
|
8
|
-
}
|
|
9
|
-
})(function (require, exports) {
|
|
10
|
-
/*---------------------------------------------------------------------------------------------
|
|
11
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
12
|
-
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
13
|
-
*--------------------------------------------------------------------------------------------*/
|
|
14
|
-
'use strict';
|
|
15
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.getFoldingRanges = void 0;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
function getFoldingRanges(document, context) {
|
|
21
|
-
|
|
22
|
-
return limitFoldingRanges(ranges, context);
|
|
23
|
-
}
|
|
24
|
-
exports.getFoldingRanges = getFoldingRanges;
|
|
25
|
-
function computeFoldingRanges(document) {
|
|
26
|
-
function getStartLine(t) {
|
|
27
|
-
return document.positionAt(t.offset).line;
|
|
28
|
-
}
|
|
29
|
-
function getEndLine(t) {
|
|
30
|
-
return document.positionAt(t.offset + t.len).line;
|
|
31
|
-
}
|
|
32
|
-
function getScanner() {
|
|
33
|
-
switch (document.languageId) {
|
|
34
|
-
case 'scss':
|
|
35
|
-
return new scssScanner_1.SCSSScanner();
|
|
36
|
-
case 'less':
|
|
37
|
-
return new lessScanner_1.LESSScanner();
|
|
38
|
-
default:
|
|
39
|
-
return new cssScanner_1.Scanner();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function tokenToRange(t, kind) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (startLine !== endLine) {
|
|
46
|
-
return {
|
|
47
|
-
startLine
|
|
48
|
-
endLine
|
|
49
|
-
kind
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
scanner.ignoreComment = false;
|
|
60
|
-
scanner.setSource(document.getText());
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
switch (token.type) {
|
|
65
|
-
case cssScanner_1.TokenType.CurlyL:
|
|
66
|
-
case scssScanner_1.InterpolationFunction:
|
|
67
|
-
{
|
|
68
|
-
delimiterStack.push({ line: getStartLine(token), type: 'brace', isStart: true });
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
case cssScanner_1.TokenType.CurlyR: {
|
|
72
|
-
if (delimiterStack.length !== 0) {
|
|
73
|
-
|
|
74
|
-
if (!prevDelimiter) {
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (prevDelimiter.type === 'brace') {
|
|
79
|
-
/**
|
|
80
|
-
* Other than the case when curly brace is not on a new line by itself, for example
|
|
81
|
-
* .foo {
|
|
82
|
-
* color: red; }
|
|
83
|
-
* Use endLine minus one to show ending curly brace
|
|
84
|
-
*/
|
|
85
|
-
if (prevToken && getEndLine(prevToken) !== endLine) {
|
|
86
|
-
endLine--;
|
|
87
|
-
}
|
|
88
|
-
if (prevDelimiter.line !== endLine) {
|
|
89
|
-
ranges.push({
|
|
90
|
-
startLine: prevDelimiter.line,
|
|
91
|
-
endLine
|
|
92
|
-
kind: undefined
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* In CSS, there is no single line comment prefixed with //
|
|
101
|
-
* All comments are marked as `Comment`
|
|
102
|
-
*/
|
|
103
|
-
case cssScanner_1.TokenType.Comment: {
|
|
104
|
-
|
|
105
|
-
if (marker === '#region') {
|
|
106
|
-
return { line: getStartLine(token), type: 'comment', isStart: true };
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
return { line: getEndLine(token), type: 'comment', isStart: false };
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if (matches) {
|
|
115
|
-
return
|
|
116
|
-
}
|
|
117
|
-
else if (document.languageId === 'scss' || document.languageId === 'less') {
|
|
118
|
-
|
|
119
|
-
if (
|
|
120
|
-
return
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return null;
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
// /* */ comment region folding
|
|
127
|
-
// All #region and #endregion cases
|
|
128
|
-
if (currDelimiter) {
|
|
129
|
-
if (currDelimiter.isStart) {
|
|
130
|
-
delimiterStack.push(currDelimiter);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
|
|
134
|
-
if (!prevDelimiter) {
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
if (prevDelimiter.type === 'comment') {
|
|
138
|
-
if (prevDelimiter.line !== currDelimiter.line) {
|
|
139
|
-
ranges.push({
|
|
140
|
-
startLine: prevDelimiter.line,
|
|
141
|
-
endLine: currDelimiter.line,
|
|
142
|
-
kind: 'region'
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
// Multiline comment case
|
|
149
|
-
else {
|
|
150
|
-
|
|
151
|
-
if (range) {
|
|
152
|
-
ranges.push(range);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
prevToken = token;
|
|
159
|
-
token = scanner.scan();
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return validRanges;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
});
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports", "../parser/cssScanner", "../parser/scssScanner", "../parser/lessScanner"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
/*---------------------------------------------------------------------------------------------
|
|
11
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
12
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
13
|
+
*--------------------------------------------------------------------------------------------*/
|
|
14
|
+
'use strict';
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.getFoldingRanges = void 0;
|
|
17
|
+
const cssScanner_1 = require("../parser/cssScanner");
|
|
18
|
+
const scssScanner_1 = require("../parser/scssScanner");
|
|
19
|
+
const lessScanner_1 = require("../parser/lessScanner");
|
|
20
|
+
function getFoldingRanges(document, context) {
|
|
21
|
+
const ranges = computeFoldingRanges(document);
|
|
22
|
+
return limitFoldingRanges(ranges, context);
|
|
23
|
+
}
|
|
24
|
+
exports.getFoldingRanges = getFoldingRanges;
|
|
25
|
+
function computeFoldingRanges(document) {
|
|
26
|
+
function getStartLine(t) {
|
|
27
|
+
return document.positionAt(t.offset).line;
|
|
28
|
+
}
|
|
29
|
+
function getEndLine(t) {
|
|
30
|
+
return document.positionAt(t.offset + t.len).line;
|
|
31
|
+
}
|
|
32
|
+
function getScanner() {
|
|
33
|
+
switch (document.languageId) {
|
|
34
|
+
case 'scss':
|
|
35
|
+
return new scssScanner_1.SCSSScanner();
|
|
36
|
+
case 'less':
|
|
37
|
+
return new lessScanner_1.LESSScanner();
|
|
38
|
+
default:
|
|
39
|
+
return new cssScanner_1.Scanner();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function tokenToRange(t, kind) {
|
|
43
|
+
const startLine = getStartLine(t);
|
|
44
|
+
const endLine = getEndLine(t);
|
|
45
|
+
if (startLine !== endLine) {
|
|
46
|
+
return {
|
|
47
|
+
startLine,
|
|
48
|
+
endLine,
|
|
49
|
+
kind
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const ranges = [];
|
|
57
|
+
const delimiterStack = [];
|
|
58
|
+
const scanner = getScanner();
|
|
59
|
+
scanner.ignoreComment = false;
|
|
60
|
+
scanner.setSource(document.getText());
|
|
61
|
+
let token = scanner.scan();
|
|
62
|
+
let prevToken = null;
|
|
63
|
+
while (token.type !== cssScanner_1.TokenType.EOF) {
|
|
64
|
+
switch (token.type) {
|
|
65
|
+
case cssScanner_1.TokenType.CurlyL:
|
|
66
|
+
case scssScanner_1.InterpolationFunction:
|
|
67
|
+
{
|
|
68
|
+
delimiterStack.push({ line: getStartLine(token), type: 'brace', isStart: true });
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case cssScanner_1.TokenType.CurlyR: {
|
|
72
|
+
if (delimiterStack.length !== 0) {
|
|
73
|
+
const prevDelimiter = popPrevStartDelimiterOfType(delimiterStack, 'brace');
|
|
74
|
+
if (!prevDelimiter) {
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
let endLine = getEndLine(token);
|
|
78
|
+
if (prevDelimiter.type === 'brace') {
|
|
79
|
+
/**
|
|
80
|
+
* Other than the case when curly brace is not on a new line by itself, for example
|
|
81
|
+
* .foo {
|
|
82
|
+
* color: red; }
|
|
83
|
+
* Use endLine minus one to show ending curly brace
|
|
84
|
+
*/
|
|
85
|
+
if (prevToken && getEndLine(prevToken) !== endLine) {
|
|
86
|
+
endLine--;
|
|
87
|
+
}
|
|
88
|
+
if (prevDelimiter.line !== endLine) {
|
|
89
|
+
ranges.push({
|
|
90
|
+
startLine: prevDelimiter.line,
|
|
91
|
+
endLine,
|
|
92
|
+
kind: undefined
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* In CSS, there is no single line comment prefixed with //
|
|
101
|
+
* All comments are marked as `Comment`
|
|
102
|
+
*/
|
|
103
|
+
case cssScanner_1.TokenType.Comment: {
|
|
104
|
+
const commentRegionMarkerToDelimiter = (marker) => {
|
|
105
|
+
if (marker === '#region') {
|
|
106
|
+
return { line: getStartLine(token), type: 'comment', isStart: true };
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return { line: getEndLine(token), type: 'comment', isStart: false };
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const getCurrDelimiter = (token) => {
|
|
113
|
+
const matches = token.text.match(/^\s*\/\*\s*(#region|#endregion)\b\s*(.*?)\s*\*\//);
|
|
114
|
+
if (matches) {
|
|
115
|
+
return commentRegionMarkerToDelimiter(matches[1]);
|
|
116
|
+
}
|
|
117
|
+
else if (document.languageId === 'scss' || document.languageId === 'less') {
|
|
118
|
+
const matches = token.text.match(/^\s*\/\/\s*(#region|#endregion)\b\s*(.*?)\s*/);
|
|
119
|
+
if (matches) {
|
|
120
|
+
return commentRegionMarkerToDelimiter(matches[1]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
};
|
|
125
|
+
const currDelimiter = getCurrDelimiter(token);
|
|
126
|
+
// /* */ comment region folding
|
|
127
|
+
// All #region and #endregion cases
|
|
128
|
+
if (currDelimiter) {
|
|
129
|
+
if (currDelimiter.isStart) {
|
|
130
|
+
delimiterStack.push(currDelimiter);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const prevDelimiter = popPrevStartDelimiterOfType(delimiterStack, 'comment');
|
|
134
|
+
if (!prevDelimiter) {
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
if (prevDelimiter.type === 'comment') {
|
|
138
|
+
if (prevDelimiter.line !== currDelimiter.line) {
|
|
139
|
+
ranges.push({
|
|
140
|
+
startLine: prevDelimiter.line,
|
|
141
|
+
endLine: currDelimiter.line,
|
|
142
|
+
kind: 'region'
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Multiline comment case
|
|
149
|
+
else {
|
|
150
|
+
const range = tokenToRange(token, 'comment');
|
|
151
|
+
if (range) {
|
|
152
|
+
ranges.push(range);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
prevToken = token;
|
|
159
|
+
token = scanner.scan();
|
|
160
|
+
}
|
|
161
|
+
return ranges;
|
|
162
|
+
}
|
|
163
|
+
function popPrevStartDelimiterOfType(stack, type) {
|
|
164
|
+
if (stack.length === 0) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
168
|
+
if (stack[i].type === type && stack[i].isStart) {
|
|
169
|
+
return stack.splice(i, 1)[0];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* - Sort regions
|
|
176
|
+
* - Remove invalid regions (intersections)
|
|
177
|
+
* - If limit exceeds, only return `rangeLimit` amount of ranges
|
|
178
|
+
*/
|
|
179
|
+
function limitFoldingRanges(ranges, context) {
|
|
180
|
+
const maxRanges = context && context.rangeLimit || Number.MAX_VALUE;
|
|
181
|
+
const sortedRanges = ranges.sort((r1, r2) => {
|
|
182
|
+
let diff = r1.startLine - r2.startLine;
|
|
183
|
+
if (diff === 0) {
|
|
184
|
+
diff = r1.endLine - r2.endLine;
|
|
185
|
+
}
|
|
186
|
+
return diff;
|
|
187
|
+
});
|
|
188
|
+
const validRanges = [];
|
|
189
|
+
let prevEndLine = -1;
|
|
190
|
+
sortedRanges.forEach(r => {
|
|
191
|
+
if (!(r.startLine < prevEndLine && prevEndLine < r.endLine)) {
|
|
192
|
+
validRanges.push(r);
|
|
193
|
+
prevEndLine = r.endLine;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
if (validRanges.length < maxRanges) {
|
|
197
|
+
return validRanges;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
return validRanges.slice(0, maxRanges);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|