Skip to content

Commit d7dca14

Browse files
authored
Allow css emmet completions when abbr contains period Fixes microsoft#44352 (microsoft#44781)
* Allow css emmet completions when abbr contains period Fixes microsoft#44352 * Move css related workaround to cssMode microsoft#44352 * getEmbeddedParsedDocument is now not needed * Show emmet completions everywhere inside the embedded css doc
1 parent b3a1b98 commit d7dca14

10 files changed

Lines changed: 45 additions & 27 deletions

File tree

extensions/css/server/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"dependencies": {
1111
"vscode-css-languageservice": "^3.0.7",
12-
"vscode-emmet-helper": "^1.1.38",
12+
"vscode-emmet-helper": "^1.2.0",
1313
"vscode-languageserver": "4.0.0-next.4"
1414
},
1515
"devDependencies": {

extensions/css/server/yarn.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ vscode-css-languageservice@^3.0.7:
2525
vscode-languageserver-types "^3.6.0-next.1"
2626
vscode-nls "^2.0.1"
2727

28-
vscode-emmet-helper@^1.1.38:
29-
version "1.1.38"
30-
resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.1.38.tgz#6b7de1abe39f8b41d4713c4e85ace4a7261ef0d8"
28+
vscode-emmet-helper@^1.2.0:
29+
version "1.2.0"
30+
resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.0.tgz#6b9311be065c9c99d5de2dae18ea0730d9cfb734"
3131
dependencies:
3232
"@emmetio/extract-abbreviation" "0.1.6"
3333
jsonc-parser "^1.0.0"

extensions/emmet/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@
338338
"@emmetio/html-matcher": "^0.3.3",
339339
"@emmetio/css-parser": "ramya-rao-a/css-parser#vscode",
340340
"@emmetio/math-expression": "^0.1.1",
341-
"vscode-emmet-helper": "^1.1.38",
341+
"vscode-emmet-helper": "^1.2.0",
342342
"vscode-languageserver-types": "^3.5.0",
343343
"image-size": "^0.5.2",
344344
"vscode-nls": "3.2.1"

extensions/emmet/yarn.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2052,9 +2052,9 @@ vinyl@~2.0.1:
20522052
remove-trailing-separator "^1.0.1"
20532053
replace-ext "^1.0.0"
20542054

2055-
vscode-emmet-helper@^1.1.38:
2056-
version "1.1.38"
2057-
resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.1.38.tgz#6b7de1abe39f8b41d4713c4e85ace4a7261ef0d8"
2055+
vscode-emmet-helper@^1.2.0:
2056+
version "1.2.0"
2057+
resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.0.tgz#6b9311be065c9c99d5de2dae18ea0730d9cfb734"
20582058
dependencies:
20592059
"@emmetio/extract-abbreviation" "0.1.6"
20602060
jsonc-parser "^1.0.0"

extensions/html/server/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"dependencies": {
1111
"vscode-css-languageservice": "^3.0.6",
12-
"vscode-emmet-helper": "1.1.38",
12+
"vscode-emmet-helper": "1.2.0",
1313
"vscode-html-languageservice": "^2.0.17-next.3",
1414
"vscode-languageserver": "4.0.0-next.4",
1515
"vscode-languageserver-types": "^3.6.0-next.1",

extensions/html/server/src/htmlServerMain.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -284,21 +284,17 @@ connection.onCompletion(async textDocumentPosition => {
284284
items: []
285285
};
286286

287-
if (mode.setCompletionParticipants) {
288-
const emmetCompletionParticipant = getEmmetCompletionParticipants(document, textDocumentPosition.position, mode.getId(), emmetSettings, emmetCompletionList);
287+
const emmetCompletionParticipant = getEmmetCompletionParticipants(document, textDocumentPosition.position, mode.getId(), emmetSettings, emmetCompletionList);
288+
const completionParticipants = [emmetCompletionParticipant];
289+
// Ideally, fix this in the Language Service side
290+
// Check participants' methods before calling them
291+
if (mode.getId() === 'html') {
289292
const pathCompletionParticipant = getPathCompletionParticipant(document, workspaceFolders, pathCompletionList);
290-
291-
// Ideally, fix this in the Language Service side
292-
// Check participants' methods before calling them
293-
if (mode.getId() === 'html') {
294-
mode.setCompletionParticipants([emmetCompletionParticipant, pathCompletionParticipant]);
295-
} else {
296-
mode.setCompletionParticipants([emmetCompletionParticipant]);
297-
}
293+
completionParticipants.push(pathCompletionParticipant);
298294
}
299295

300296
let settings = await getDocumentSettings(document, () => mode.doComplete.length > 2);
301-
let result = mode.doComplete(document, textDocumentPosition.position, settings);
297+
let result = mode.doComplete(document, textDocumentPosition.position, settings, completionParticipants);
302298
result.items = [...pathCompletionList.items, ...result.items];
303299
if (emmetCompletionList && emmetCompletionList.items) {
304300
cachedCompletionList = result;

extensions/html/server/src/modes/cssMode.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { getCSSLanguageService, Stylesheet, ICompletionParticipant } from 'vscod
1010
import { LanguageMode, Settings } from './languageModes';
1111
import { HTMLDocumentRegions, CSS_STYLE_RULE } from './embeddedSupport';
1212
import { Color } from 'vscode-languageserver-protocol/lib/protocol.colorProvider.proposed';
13+
import { extractAbbreviation } from 'vscode-emmet-helper';
1314

1415
export function getCSSMode(documentRegions: LanguageModelCache<HTMLDocumentRegions>): LanguageMode {
1516
let cssLanguageService = getCSSLanguageService();
@@ -27,9 +28,27 @@ export function getCSSMode(documentRegions: LanguageModelCache<HTMLDocumentRegio
2728
let embedded = embeddedCSSDocuments.get(document);
2829
return cssLanguageService.doValidation(embedded, cssStylesheets.get(embedded), settings && settings.css);
2930
},
30-
doComplete(document: TextDocument, position: Position) {
31+
doComplete(document: TextDocument, position: Position, settings: Settings, registeredCompletionParticipants: ICompletionParticipant[]) {
3132
let embedded = embeddedCSSDocuments.get(document);
32-
return cssLanguageService.doComplete(embedded, position, cssStylesheets.get(embedded));
33+
const stylesheet = cssStylesheets.get(embedded);
34+
35+
if (registeredCompletionParticipants) {
36+
const nonEmmetCompletionParticipants = [];
37+
// Css Emmet completions in html files are provided no matter where the cursor is inside the embedded css document
38+
// Mimic the same here, until we solve the issue of css language service not able to parse complete embedded documents when there are errors
39+
for (let i = 0; i < registeredCompletionParticipants.length; i++) {
40+
if (typeof (<any>registeredCompletionParticipants[i]).getId === 'function' && (<any>registeredCompletionParticipants[i]).getId() === 'emmet') {
41+
const extractedResults = extractAbbreviation(document, position, { lookAhead: false, syntax: 'css' });
42+
if (extractedResults && extractedResults.abbreviation) {
43+
registeredCompletionParticipants[i].onCssProperty({ propertyName: extractedResults.abbreviation, range: extractedResults.abbreviationRange });
44+
}
45+
} else {
46+
nonEmmetCompletionParticipants.push(registeredCompletionParticipants[i]);
47+
}
48+
}
49+
cssLanguageService.setCompletionParticipants(nonEmmetCompletionParticipants);
50+
}
51+
return cssLanguageService.doComplete(embedded, position, stylesheet);
3352
},
3453
setCompletionParticipants(registeredCompletionParticipants: ICompletionParticipant[]) {
3554
cssLanguageService.setCompletionParticipants(registeredCompletionParticipants);

extensions/html/server/src/modes/htmlMode.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService): LanguageM
2222
configure(options: any) {
2323
globalSettings = options;
2424
},
25-
doComplete(document: TextDocument, position: Position, settings: Settings = globalSettings) {
25+
doComplete(document: TextDocument, position: Position, settings: Settings = globalSettings, registeredCompletionParticipants: any[]) {
26+
if (registeredCompletionParticipants) {
27+
completionParticipants = registeredCompletionParticipants;
28+
}
2629
let options = settings && settings.html && settings.html.suggest;
2730
let doAutoComplete = settings && settings.html && settings.html.autoClosingTags;
2831
if (doAutoComplete) {

extensions/html/server/src/modes/languageModes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export interface LanguageMode {
3737
getId(): string;
3838
configure?: (options: Settings) => void;
3939
doValidation?: (document: TextDocument, settings?: Settings) => Diagnostic[];
40-
doComplete?: (document: TextDocument, position: Position, settings?: Settings) => CompletionList | null;
40+
doComplete?: (document: TextDocument, position: Position, settings?: Settings, registeredCompletionParticipants?: any[]) => CompletionList | null;
4141
setCompletionParticipants?: (registeredCompletionParticipants: any[]) => void;
4242
doResolve?: (document: TextDocument, item: CompletionItem) => CompletionItem | null;
4343
doHover?: (document: TextDocument, position: Position) => Hover | null;

extensions/html/server/yarn.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ vscode-css-languageservice@^3.0.6:
2525
vscode-languageserver-types "^3.6.0-next.1"
2626
vscode-nls "^2.0.1"
2727

28-
vscode-emmet-helper@1.1.38:
29-
version "1.1.38"
30-
resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.1.38.tgz#6b7de1abe39f8b41d4713c4e85ace4a7261ef0d8"
28+
vscode-emmet-helper@1.2.0:
29+
version "1.2.0"
30+
resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.0.tgz#6b9311be065c9c99d5de2dae18ea0730d9cfb734"
3131
dependencies:
3232
"@emmetio/extract-abbreviation" "0.1.6"
3333
jsonc-parser "^1.0.0"

0 commit comments

Comments
 (0)