From d7dca142ad6051e6b1c7397ea73221feb0160f21 Mon Sep 17 00:00:00 2001 From: Ramya Rao Date: Thu, 1 Mar 2018 16:44:28 -0800 Subject: [PATCH] Allow css emmet completions when abbr contains period Fixes #44352 (#44781) * Allow css emmet completions when abbr contains period Fixes #44352 * Move css related workaround to cssMode #44352 * getEmbeddedParsedDocument is now not needed * Show emmet completions everywhere inside the embedded css doc --- extensions/css/server/package.json | 2 +- extensions/css/server/yarn.lock | 6 ++--- extensions/emmet/package.json | 2 +- extensions/emmet/yarn.lock | 6 ++--- extensions/html/server/package.json | 2 +- extensions/html/server/src/htmlServerMain.ts | 18 ++++++--------- extensions/html/server/src/modes/cssMode.ts | 23 +++++++++++++++++-- extensions/html/server/src/modes/htmlMode.ts | 5 +++- .../html/server/src/modes/languageModes.ts | 2 +- extensions/html/server/yarn.lock | 6 ++--- 10 files changed, 45 insertions(+), 27 deletions(-) diff --git a/extensions/css/server/package.json b/extensions/css/server/package.json index de355939b87..21ec29c7af9 100644 --- a/extensions/css/server/package.json +++ b/extensions/css/server/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "vscode-css-languageservice": "^3.0.7", - "vscode-emmet-helper": "^1.1.38", + "vscode-emmet-helper": "^1.2.0", "vscode-languageserver": "4.0.0-next.4" }, "devDependencies": { diff --git a/extensions/css/server/yarn.lock b/extensions/css/server/yarn.lock index 8451e65e824..0c0ace42012 100644 --- a/extensions/css/server/yarn.lock +++ b/extensions/css/server/yarn.lock @@ -25,9 +25,9 @@ vscode-css-languageservice@^3.0.7: vscode-languageserver-types "^3.6.0-next.1" vscode-nls "^2.0.1" -vscode-emmet-helper@^1.1.38: - version "1.1.38" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.1.38.tgz#6b7de1abe39f8b41d4713c4e85ace4a7261ef0d8" +vscode-emmet-helper@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.0.tgz#6b9311be065c9c99d5de2dae18ea0730d9cfb734" dependencies: "@emmetio/extract-abbreviation" "0.1.6" jsonc-parser "^1.0.0" diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 55e2f449afe..eb8cf684566 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -338,7 +338,7 @@ "@emmetio/html-matcher": "^0.3.3", "@emmetio/css-parser": "ramya-rao-a/css-parser#vscode", "@emmetio/math-expression": "^0.1.1", - "vscode-emmet-helper": "^1.1.38", + "vscode-emmet-helper": "^1.2.0", "vscode-languageserver-types": "^3.5.0", "image-size": "^0.5.2", "vscode-nls": "3.2.1" diff --git a/extensions/emmet/yarn.lock b/extensions/emmet/yarn.lock index 76ab5219705..89c4029be2d 100644 --- a/extensions/emmet/yarn.lock +++ b/extensions/emmet/yarn.lock @@ -2052,9 +2052,9 @@ vinyl@~2.0.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vscode-emmet-helper@^1.1.38: - version "1.1.38" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.1.38.tgz#6b7de1abe39f8b41d4713c4e85ace4a7261ef0d8" +vscode-emmet-helper@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.0.tgz#6b9311be065c9c99d5de2dae18ea0730d9cfb734" dependencies: "@emmetio/extract-abbreviation" "0.1.6" jsonc-parser "^1.0.0" diff --git a/extensions/html/server/package.json b/extensions/html/server/package.json index f582578707d..2f50041b17f 100644 --- a/extensions/html/server/package.json +++ b/extensions/html/server/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "vscode-css-languageservice": "^3.0.6", - "vscode-emmet-helper": "1.1.38", + "vscode-emmet-helper": "1.2.0", "vscode-html-languageservice": "^2.0.17-next.3", "vscode-languageserver": "4.0.0-next.4", "vscode-languageserver-types": "^3.6.0-next.1", diff --git a/extensions/html/server/src/htmlServerMain.ts b/extensions/html/server/src/htmlServerMain.ts index 184c0e77c47..8a53884fc45 100644 --- a/extensions/html/server/src/htmlServerMain.ts +++ b/extensions/html/server/src/htmlServerMain.ts @@ -284,21 +284,17 @@ connection.onCompletion(async textDocumentPosition => { items: [] }; - if (mode.setCompletionParticipants) { - const emmetCompletionParticipant = getEmmetCompletionParticipants(document, textDocumentPosition.position, mode.getId(), emmetSettings, emmetCompletionList); + const emmetCompletionParticipant = getEmmetCompletionParticipants(document, textDocumentPosition.position, mode.getId(), emmetSettings, emmetCompletionList); + const completionParticipants = [emmetCompletionParticipant]; + // Ideally, fix this in the Language Service side + // Check participants' methods before calling them + if (mode.getId() === 'html') { const pathCompletionParticipant = getPathCompletionParticipant(document, workspaceFolders, pathCompletionList); - - // Ideally, fix this in the Language Service side - // Check participants' methods before calling them - if (mode.getId() === 'html') { - mode.setCompletionParticipants([emmetCompletionParticipant, pathCompletionParticipant]); - } else { - mode.setCompletionParticipants([emmetCompletionParticipant]); - } + completionParticipants.push(pathCompletionParticipant); } let settings = await getDocumentSettings(document, () => mode.doComplete.length > 2); - let result = mode.doComplete(document, textDocumentPosition.position, settings); + let result = mode.doComplete(document, textDocumentPosition.position, settings, completionParticipants); result.items = [...pathCompletionList.items, ...result.items]; if (emmetCompletionList && emmetCompletionList.items) { cachedCompletionList = result; diff --git a/extensions/html/server/src/modes/cssMode.ts b/extensions/html/server/src/modes/cssMode.ts index 10d1a48646d..13f41c01fdc 100644 --- a/extensions/html/server/src/modes/cssMode.ts +++ b/extensions/html/server/src/modes/cssMode.ts @@ -10,6 +10,7 @@ import { getCSSLanguageService, Stylesheet, ICompletionParticipant } from 'vscod import { LanguageMode, Settings } from './languageModes'; import { HTMLDocumentRegions, CSS_STYLE_RULE } from './embeddedSupport'; import { Color } from 'vscode-languageserver-protocol/lib/protocol.colorProvider.proposed'; +import { extractAbbreviation } from 'vscode-emmet-helper'; export function getCSSMode(documentRegions: LanguageModelCache): LanguageMode { let cssLanguageService = getCSSLanguageService(); @@ -27,9 +28,27 @@ export function getCSSMode(documentRegions: LanguageModelCacheregisteredCompletionParticipants[i]).getId === 'function' && (registeredCompletionParticipants[i]).getId() === 'emmet') { + const extractedResults = extractAbbreviation(document, position, { lookAhead: false, syntax: 'css' }); + if (extractedResults && extractedResults.abbreviation) { + registeredCompletionParticipants[i].onCssProperty({ propertyName: extractedResults.abbreviation, range: extractedResults.abbreviationRange }); + } + } else { + nonEmmetCompletionParticipants.push(registeredCompletionParticipants[i]); + } + } + cssLanguageService.setCompletionParticipants(nonEmmetCompletionParticipants); + } + return cssLanguageService.doComplete(embedded, position, stylesheet); }, setCompletionParticipants(registeredCompletionParticipants: ICompletionParticipant[]) { cssLanguageService.setCompletionParticipants(registeredCompletionParticipants); diff --git a/extensions/html/server/src/modes/htmlMode.ts b/extensions/html/server/src/modes/htmlMode.ts index b6e77720822..aa3fceeeb2d 100644 --- a/extensions/html/server/src/modes/htmlMode.ts +++ b/extensions/html/server/src/modes/htmlMode.ts @@ -22,7 +22,10 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService): LanguageM configure(options: any) { globalSettings = options; }, - doComplete(document: TextDocument, position: Position, settings: Settings = globalSettings) { + doComplete(document: TextDocument, position: Position, settings: Settings = globalSettings, registeredCompletionParticipants: any[]) { + if (registeredCompletionParticipants) { + completionParticipants = registeredCompletionParticipants; + } let options = settings && settings.html && settings.html.suggest; let doAutoComplete = settings && settings.html && settings.html.autoClosingTags; if (doAutoComplete) { diff --git a/extensions/html/server/src/modes/languageModes.ts b/extensions/html/server/src/modes/languageModes.ts index 88fe447c72e..1f527b9b2fa 100644 --- a/extensions/html/server/src/modes/languageModes.ts +++ b/extensions/html/server/src/modes/languageModes.ts @@ -37,7 +37,7 @@ export interface LanguageMode { getId(): string; configure?: (options: Settings) => void; doValidation?: (document: TextDocument, settings?: Settings) => Diagnostic[]; - doComplete?: (document: TextDocument, position: Position, settings?: Settings) => CompletionList | null; + doComplete?: (document: TextDocument, position: Position, settings?: Settings, registeredCompletionParticipants?: any[]) => CompletionList | null; setCompletionParticipants?: (registeredCompletionParticipants: any[]) => void; doResolve?: (document: TextDocument, item: CompletionItem) => CompletionItem | null; doHover?: (document: TextDocument, position: Position) => Hover | null; diff --git a/extensions/html/server/yarn.lock b/extensions/html/server/yarn.lock index 298ecf5c6ba..4c53ce280a1 100644 --- a/extensions/html/server/yarn.lock +++ b/extensions/html/server/yarn.lock @@ -25,9 +25,9 @@ vscode-css-languageservice@^3.0.6: vscode-languageserver-types "^3.6.0-next.1" vscode-nls "^2.0.1" -vscode-emmet-helper@1.1.38: - version "1.1.38" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.1.38.tgz#6b7de1abe39f8b41d4713c4e85ace4a7261ef0d8" +vscode-emmet-helper@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.0.tgz#6b9311be065c9c99d5de2dae18ea0730d9cfb734" dependencies: "@emmetio/extract-abbreviation" "0.1.6" jsonc-parser "^1.0.0"