Emmet remove dependency on vscode-html-languageservice (#113599)

This commit is contained in:
Raymond Zhao 2020-12-30 10:14:23 -08:00 committed by GitHub
parent 94facfcf06
commit b84858babe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 19 additions and 72 deletions

View file

@ -438,6 +438,6 @@
"@emmetio/math-expression": "^1.0.4", "@emmetio/math-expression": "^1.0.4",
"image-size": "^0.5.2", "image-size": "^0.5.2",
"vscode-emmet-helper": "~2.0.0", "vscode-emmet-helper": "~2.0.0",
"vscode-html-languageservice": "^3.0.3" "vscode-languageserver-textdocument": "^1.0.1"
} }
} }

View file

@ -6,16 +6,14 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { Node, Stylesheet } from 'EmmetFlatNode'; import { Node, Stylesheet } from 'EmmetFlatNode';
import { isValidLocationForEmmetAbbreviation, getSyntaxFromArgs } from './abbreviationActions'; import { isValidLocationForEmmetAbbreviation, getSyntaxFromArgs } from './abbreviationActions';
import { getEmmetHelper, getMappingForIncludedLanguages, parsePartialStylesheet, getEmmetConfiguration, getEmmetMode, isStyleSheet, getFlatNode, allowedMimeTypesInScriptTag, trimQuotes, toLSTextDocument } from './util'; import { getEmmetHelper, getMappingForIncludedLanguages, parsePartialStylesheet, getEmmetConfiguration, getEmmetMode, isStyleSheet, getFlatNode, allowedMimeTypesInScriptTag, toLSTextDocument, getHtmlFlatNode } from './util';
import { getLanguageService, TokenType, Range as LSRange } from 'vscode-html-languageservice'; import { Range as LSRange } from 'vscode-languageserver-textdocument';
import { getRootNode } from './parseDocument'; import { getRootNode } from './parseDocument';
export class DefaultCompletionItemProvider implements vscode.CompletionItemProvider { export class DefaultCompletionItemProvider implements vscode.CompletionItemProvider {
private lastCompletionType: string | undefined; private lastCompletionType: string | undefined;
private htmlLS = getLanguageService();
public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, _: vscode.CancellationToken, context: vscode.CompletionContext): Thenable<vscode.CompletionList | undefined> | undefined { public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, _: vscode.CancellationToken, context: vscode.CompletionContext): Thenable<vscode.CompletionList | undefined> | undefined {
const completionResult = this.provideCompletionItemsInternal(document, position, context); const completionResult = this.provideCompletionItemsInternal(document, position, context);
if (!completionResult) { if (!completionResult) {
@ -82,19 +80,16 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi
default: default:
break; break;
} }
} }
if (validateLocation) { if (validateLocation) {
const parsedLsDoc = this.htmlLS.parseHTMLDocument(lsDoc);
const positionOffset = document.offsetAt(position); const positionOffset = document.offsetAt(position);
const node = parsedLsDoc.findNodeAt(positionOffset); const emmetRootNode = getRootNode(document, true);
const foundNode = getHtmlFlatNode(document.getText(), emmetRootNode, positionOffset, false);
if (node.tag === 'script') { if (foundNode) {
if (node.attributes && 'type' in node.attributes) { if (foundNode.name === 'script') {
const rawTypeAttrValue = node.attributes['type']; const typeNode = foundNode.attributes.find(attr => attr.name.toString() === 'type');
if (rawTypeAttrValue) { if (typeNode) {
const typeAttrValue = trimQuotes(rawTypeAttrValue); const typeAttrValue = typeNode.value.toString();
if (typeAttrValue === 'application/javascript' || typeAttrValue === 'text/javascript') { if (typeAttrValue === 'application/javascript' || typeAttrValue === 'text/javascript') {
if (!getSyntaxFromArgs({ language: 'javascript' })) { if (!getSyntaxFromArgs({ language: 'javascript' })) {
return; return;
@ -102,34 +97,19 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi
validateLocation = false; validateLocation = false;
} }
} }
else if (allowedMimeTypesInScriptTag.includes(typeAttrValue)) {
else if (allowedMimeTypesInScriptTag.indexOf(trimQuotes(rawTypeAttrValue)) > -1) {
validateLocation = false; validateLocation = false;
} }
} else {
return;
} }
} else {
return;
} }
} else if (foundNode.name === 'style') {
else if (node.tag === 'style') { syntax = 'css';
syntax = 'css'; validateLocation = false;
validateLocation = false; } else {
} else { const styleNode = foundNode.attributes.find(attr => attr.name.toString() === 'style');
if (node.attributes && node.attributes['style']) { if (styleNode && styleNode.value.start <= positionOffset && positionOffset <= styleNode.value.end) {
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]) {
syntax = 'css'; syntax = 'css';
validateLocation = false; validateLocation = false;
} }

View file

@ -4,7 +4,6 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
// Based on @sergeche's work on the emmet plugin for atom // 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 path from 'path';
import * as http from 'http'; import * as http from 'http';

View file

@ -639,23 +639,6 @@ export function isStyleAttribute(currentNode: FlatNode | undefined, offset: numb
return offset >= styleAttribute.value.start && offset <= styleAttribute.value.end; 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 { export function isNumber(obj: any): obj is number {
return typeof obj === 'number'; return typeof obj === 'number';
} }

View file

@ -88,26 +88,11 @@ vscode-emmet-helper@~2.0.0:
vscode-nls "^5.0.0" vscode-nls "^5.0.0"
vscode-uri "^2.1.2" 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: vscode-languageserver-textdocument@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f"
integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA== 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: vscode-languageserver-types@^3.15.1:
version "3.15.1" version "3.15.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de"