diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 968a7fd1bfa..8e145cb48a4 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -438,6 +438,6 @@ "@emmetio/math-expression": "^1.0.4", "image-size": "^0.5.2", "vscode-emmet-helper": "~2.0.0", - "vscode-html-languageservice": "^3.0.3" + "vscode-languageserver-textdocument": "^1.0.1" } } diff --git a/extensions/emmet/src/defaultCompletionProvider.ts b/extensions/emmet/src/defaultCompletionProvider.ts index a4f31e5f8c4..bb9226c59b0 100644 --- a/extensions/emmet/src/defaultCompletionProvider.ts +++ b/extensions/emmet/src/defaultCompletionProvider.ts @@ -6,16 +6,14 @@ import * as vscode from 'vscode'; import { Node, Stylesheet } from 'EmmetFlatNode'; import { isValidLocationForEmmetAbbreviation, getSyntaxFromArgs } from './abbreviationActions'; -import { getEmmetHelper, getMappingForIncludedLanguages, parsePartialStylesheet, getEmmetConfiguration, getEmmetMode, isStyleSheet, getFlatNode, allowedMimeTypesInScriptTag, trimQuotes, toLSTextDocument } from './util'; -import { getLanguageService, TokenType, Range as LSRange } from 'vscode-html-languageservice'; +import { getEmmetHelper, getMappingForIncludedLanguages, parsePartialStylesheet, getEmmetConfiguration, getEmmetMode, isStyleSheet, getFlatNode, allowedMimeTypesInScriptTag, toLSTextDocument, getHtmlFlatNode } from './util'; +import { Range as LSRange } from 'vscode-languageserver-textdocument'; import { getRootNode } from './parseDocument'; export class DefaultCompletionItemProvider implements vscode.CompletionItemProvider { private lastCompletionType: string | undefined; - private htmlLS = getLanguageService(); - public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, _: vscode.CancellationToken, context: vscode.CompletionContext): Thenable | undefined { const completionResult = this.provideCompletionItemsInternal(document, position, context); if (!completionResult) { @@ -82,19 +80,16 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi default: break; } - } if (validateLocation) { - - const parsedLsDoc = this.htmlLS.parseHTMLDocument(lsDoc); const positionOffset = document.offsetAt(position); - const node = parsedLsDoc.findNodeAt(positionOffset); - - if (node.tag === 'script') { - if (node.attributes && 'type' in node.attributes) { - const rawTypeAttrValue = node.attributes['type']; - if (rawTypeAttrValue) { - const typeAttrValue = trimQuotes(rawTypeAttrValue); + const emmetRootNode = getRootNode(document, true); + const foundNode = getHtmlFlatNode(document.getText(), emmetRootNode, positionOffset, false); + if (foundNode) { + if (foundNode.name === 'script') { + const typeNode = foundNode.attributes.find(attr => attr.name.toString() === 'type'); + if (typeNode) { + const typeAttrValue = typeNode.value.toString(); if (typeAttrValue === 'application/javascript' || typeAttrValue === 'text/javascript') { if (!getSyntaxFromArgs({ language: 'javascript' })) { return; @@ -102,34 +97,19 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi validateLocation = false; } } - - else if (allowedMimeTypesInScriptTag.indexOf(trimQuotes(rawTypeAttrValue)) > -1) { + else if (allowedMimeTypesInScriptTag.includes(typeAttrValue)) { validateLocation = false; } + } else { + return; } - } else { - return; } - } - else if (node.tag === 'style') { - syntax = 'css'; - validateLocation = false; - } else { - if (node.attributes && node.attributes['style']) { - const scanner = this.htmlLS.createScanner(document.getText(), node.start); - let tokenType = scanner.scan(); - let prevAttr = undefined; - let styleAttrValueRange: [number, number] | undefined = undefined; - while (tokenType !== TokenType.EOS && (scanner.getTokenEnd() <= positionOffset)) { - tokenType = scanner.scan(); - if (tokenType === TokenType.AttributeName) { - prevAttr = scanner.getTokenText(); - } - else if (tokenType === TokenType.AttributeValue && prevAttr === 'style') { - styleAttrValueRange = [scanner.getTokenOffset(), scanner.getTokenEnd()]; - } - } - if (prevAttr === 'style' && styleAttrValueRange && positionOffset > styleAttrValueRange[0] && positionOffset < styleAttrValueRange[1]) { + else if (foundNode.name === 'style') { + syntax = 'css'; + validateLocation = false; + } else { + const styleNode = foundNode.attributes.find(attr => attr.name.toString() === 'style'); + if (styleNode && styleNode.value.start <= positionOffset && positionOffset <= styleNode.value.end) { syntax = 'css'; validateLocation = false; } diff --git a/extensions/emmet/src/imageSizeHelper.ts b/extensions/emmet/src/imageSizeHelper.ts index 13ae22391ba..c761b095b5e 100644 --- a/extensions/emmet/src/imageSizeHelper.ts +++ b/extensions/emmet/src/imageSizeHelper.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Based on @sergeche's work on the emmet plugin for atom -// TODO: Move to https://github.com/emmetio/image-size import * as path from 'path'; import * as http from 'http'; diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts index 97e829ef259..b10b101cc9b 100644 --- a/extensions/emmet/src/util.ts +++ b/extensions/emmet/src/util.ts @@ -639,23 +639,6 @@ export function isStyleAttribute(currentNode: FlatNode | undefined, offset: numb return offset >= styleAttribute.value.start && offset <= styleAttribute.value.end; } - -export function trimQuotes(s: string) { - if (s.length <= 1) { - return s.replace(/['"]/, ''); - } - - if (s[0] === `'` || s[0] === `"`) { - s = s.slice(1); - } - - if (s[s.length - 1] === `'` || s[s.length - 1] === `"`) { - s = s.slice(0, -1); - } - - return s; -} - export function isNumber(obj: any): obj is number { return typeof obj === 'number'; } diff --git a/extensions/emmet/yarn.lock b/extensions/emmet/yarn.lock index 3a097ca54d6..f0a60ef3777 100644 --- a/extensions/emmet/yarn.lock +++ b/extensions/emmet/yarn.lock @@ -88,26 +88,11 @@ vscode-emmet-helper@~2.0.0: vscode-nls "^5.0.0" vscode-uri "^2.1.2" -vscode-html-languageservice@^3.0.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-3.1.4.tgz#0316dff77ee38dc176f40560cbf55e4f64f4f433" - integrity sha512-3M+bm+hNvwQcScVe5/ok9BXvctOiGJ4nlOkkFf+WKSDrYNkarZ/RByKOa1/iylbvZxJUPzbeziembWPe/dMvhw== - dependencies: - vscode-languageserver-textdocument "^1.0.1" - vscode-languageserver-types "3.16.0-next.2" - vscode-nls "^5.0.0" - vscode-uri "^2.1.2" - vscode-languageserver-textdocument@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f" integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA== -vscode-languageserver-types@3.16.0-next.2: - version "3.16.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083" - integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q== - vscode-languageserver-types@^3.15.1: version "3.15.1" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de"