diff --git a/extensions/emmet/npm-shrinkwrap.json b/extensions/emmet/npm-shrinkwrap.json index a2002c20640..beb4e1d01ad 100644 --- a/extensions/emmet/npm-shrinkwrap.json +++ b/extensions/emmet/npm-shrinkwrap.json @@ -118,9 +118,14 @@ "resolved": "https://registry.npmjs.org/@emmetio/variable-resolver/-/variable-resolver-0.2.1.tgz" }, "vscode-emmet-helper": { - "version": "0.0.18", - "from": "vscode-emmet-helper@0.0.18", - "resolved": "https://registry.npmjs.org/vscode-emmet-helper/-/vscode-emmet-helper-0.0.18.tgz" + "version": "0.0.19", + "from": "vscode-emmet-helper@0.0.19", + "resolved": "https://registry.npmjs.org/vscode-emmet-helper/-/vscode-emmet-helper-0.0.19.tgz" + }, + "vscode-languageserver-types": { + "version": "3.0.3", + "from": "vscode-languageserver-types@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.0.3.tgz" } } } diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 439621a1371..ea3a7a813d0 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -73,6 +73,7 @@ "@emmetio/html-matcher": "^0.3.1", "@emmetio/css-parser": "^0.3.0", "@emmetio/math-expression": "^0.1.1", - "vscode-emmet-helper":"0.0.18" + "vscode-emmet-helper":"0.0.19", + "vscode-languageserver-types": "^3.0.3" } } \ No newline at end of file diff --git a/extensions/emmet/src/abbreviationActions.ts b/extensions/emmet/src/abbreviationActions.ts index 35b6d1ae7e8..f4078256d5d 100644 --- a/extensions/emmet/src/abbreviationActions.ts +++ b/extensions/emmet/src/abbreviationActions.ts @@ -180,7 +180,7 @@ function expandAbbreviationInRange(editor: vscode.TextEditor, expandAbbrList: Ex const anyExpandAbbrInput = expandAbbrList[0]; let expandedText = expandAbbr(anyExpandAbbrInput, newLine); let allRanges = expandAbbrList.map(value => { - return value.rangeToReplace; + return new vscode.Range(value.rangeToReplace.start.line, value.rangeToReplace.start.character, value.rangeToReplace.end.line, value.rangeToReplace.end.character); }); if (expandedText) { editor.insertSnippet(new vscode.SnippetString(expandedText), allRanges); @@ -192,10 +192,12 @@ function expandAbbreviationInRange(editor: vscode.TextEditor, expandAbbrList: Ex * If there is textToWrap, then given preceedingWhiteSpace is applied */ function expandAbbr(input: ExpandAbbreviationInput, newLine: string): string { + const emmetConfig = vscode.workspace.getConfiguration('emmet'); + const expandOptions = getExpandOptions(emmetConfig['syntaxProfiles'], emmetConfig['variables'], input.syntax, input.textToWrap); // Expand the abbreviation let expandedText; try { - expandedText = expand(input.abbreviation, getExpandOptions(input.syntax, input.textToWrap)); + expandedText = expand(input.abbreviation, expandOptions); } catch (e) { vscode.window.showErrorMessage('Failed to expand abbreviation'); } @@ -239,11 +241,11 @@ function getSyntaxFromArgs(args: any): string { const mappedModes = getMappingForIncludedLanguages(); let language: string = (typeof args !== 'object' || !args['language']) ? editor.document.languageId : args['language']; let parentMode: string = typeof args === 'object' ? args['parentMode'] : undefined; - - let syntax = getEmmetMode(mappedModes[language] ? mappedModes[language] : language); + let excludedLanguages = vscode.workspace.getConfiguration('emmet')['exlcudeLanguages'] ? vscode.workspace.getConfiguration('emmet')['exlcudeLanguages'] : []; + let syntax = getEmmetMode((mappedModes[language] ? mappedModes[language] : language), excludedLanguages); if (syntax) { return syntax; } - return getEmmetMode(mappedModes[parentMode] ? mappedModes[parentMode] : parentMode); + return getEmmetMode((mappedModes[parentMode] ? mappedModes[parentMode] : parentMode), excludedLanguages); } \ No newline at end of file diff --git a/extensions/emmet/src/defaultCompletionProvider.ts b/extensions/emmet/src/defaultCompletionProvider.ts index 0ce04b7653e..87d543608ba 100644 --- a/extensions/emmet/src/defaultCompletionProvider.ts +++ b/extensions/emmet/src/defaultCompletionProvider.ts @@ -5,17 +5,19 @@ import * as vscode from 'vscode'; import { HtmlNode } from 'EmmetNode'; -import { EmmetCompletionItemProvider, isStyleSheet, getEmmetMode } from 'vscode-emmet-helper'; +import { doComplete, isStyleSheet, getEmmetMode } from 'vscode-emmet-helper'; import { isValidLocationForEmmetAbbreviation } from './abbreviationActions'; -import { getNode, getInnerRange, getMappingForIncludedLanguages, parse } from './util'; +import { getNode, getInnerRange, getMappingForIncludedLanguages, parse, getEmmetConfiguration } from './util'; export class DefaultCompletionItemProvider implements vscode.CompletionItemProvider { public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable { const mappedLanguages = getMappingForIncludedLanguages(); + const emmetConfig = vscode.workspace.getConfiguration('emmet'); let isSyntaxMapped = mappedLanguages[document.languageId] ? true : false; - let syntax = getEmmetMode(isSyntaxMapped ? mappedLanguages[document.languageId] : document.languageId); + let excludedLanguages = emmetConfig['exlcudeLanguages'] ? emmetConfig['exlcudeLanguages'] : []; + let syntax = getEmmetMode((isSyntaxMapped ? mappedLanguages[document.languageId] : document.languageId), excludedLanguages); if (document.languageId === 'html' || isStyleSheet(document.languageId)) { // Document can be html/css parsed @@ -25,12 +27,27 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi if (!syntax || ((isSyntaxMapped || syntax === 'jsx') - && vscode.workspace.getConfiguration('emmet')['showExpandedAbbreviation'] !== 'always')) { + && emmetConfig['showExpandedAbbreviation'] !== 'always')) { return; } - const emmetCompletionProvider = new EmmetCompletionItemProvider(syntax); - return emmetCompletionProvider.provideCompletionItems(document, position, token); + let result: vscode.CompletionList = doComplete(document, position, syntax, getEmmetConfiguration()); + let newItems: vscode.CompletionItem[] = []; + result.items.forEach(item => { + let newItem = new vscode.CompletionItem(item.label); + newItem.documentation = item.documentation; + newItem.detail = item.detail; + newItem.insertText = new vscode.SnippetString(item.textEdit.newText); + let oldrange = item.textEdit.range; + newItem.range = new vscode.Range(oldrange.start.line, oldrange.start.character, oldrange.end.line, oldrange.end.character); + + newItem.filterText = item.filterText; + newItem.sortText = item.sortText; + newItems.push(newItem); + }); + + + return Promise.resolve(new vscode.CompletionList(newItems, true)); } /** diff --git a/extensions/emmet/src/extension.ts b/extensions/emmet/src/extension.ts index b7c1a9f36f1..dd7254dae44 100644 --- a/extensions/emmet/src/extension.ts +++ b/extensions/emmet/src/extension.ts @@ -19,6 +19,7 @@ import { evaluateMathExpression } from './evaluateMathExpression'; import { incrementDecrement } from './incrementDecrement'; import { LANGUAGE_MODES, getMappingForIncludedLanguages } from './util'; import { updateExtensionsPath } from 'vscode-emmet-helper'; +import * as path from 'path'; export function activate(context: vscode.ExtensionContext) { let completionProvider = new DefaultCompletionItemProvider(); @@ -119,10 +120,20 @@ export function activate(context: vscode.ExtensionContext) { })); - - updateExtensionsPath(); + let extensionsPath = vscode.workspace.getConfiguration('emmet')['extensionsPath']; + if (!path.isAbsolute(extensionsPath)) { + extensionsPath = path.join(vscode.workspace.rootPath, extensionsPath); + } + updateExtensionsPath(extensionsPath); context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(() => { - updateExtensionsPath(); + let newExtensionsPath = vscode.workspace.getConfiguration('emmet')['extensionsPath']; + if (!path.isAbsolute(newExtensionsPath)) { + newExtensionsPath = path.join(vscode.workspace.rootPath, newExtensionsPath); + } + if (extensionsPath !== newExtensionsPath) { + updateExtensionsPath(newExtensionsPath); + extensionsPath = newExtensionsPath; + } })); } diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts index eb11b4873e2..fdbee3a4a09 100644 --- a/extensions/emmet/src/util.ts +++ b/extensions/emmet/src/util.ts @@ -61,7 +61,7 @@ export function getMappingForIncludedLanguages(): any { /** * Parses the given document using emmet parsing modules - * @param document + * @param document */ export function parse(document: vscode.TextDocument, showError: boolean = true): Node { let parseContent = isStyleSheet(document.languageId) ? parseStylesheet : parse; @@ -252,4 +252,13 @@ export function sameNodes(node1: Node, node2: Node): boolean { return (node1.start).isEqual(node2.start) && (node1.end).isEqual(node2.end); } - +export function getEmmetConfiguration() { + const emmetConfig = vscode.workspace.getConfiguration('emmet'); + return { + useNewEmmet: emmetConfig['useNewEmmet'], + showExpandedAbbreviation: emmetConfig['showExpandedAbbreviation'], + showAbbreviationSuggestions: emmetConfig['showAbbreviationSuggestions'], + syntaxProfiles: emmetConfig['syntaxProfiles'], + variables: emmetConfig['variables'] + }; +}