Skip to content

Commit 7ba1dcf

Browse files
committed
Emmet suggestions in non markup/stylesheet languages microsoft#29532
1 parent e692fc7 commit 7ba1dcf

6 files changed

Lines changed: 46 additions & 48 deletions

File tree

extensions/emmet/npm-shrinkwrap.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extensions/emmet/package.json

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,19 @@
2424
"title": "Emmet",
2525
"properties": {
2626
"emmet.showExpandedAbbreviation": {
27-
"type": "boolean",
28-
"default": true,
29-
"description": "Shows expanded emmet abbreviations as suggestions"
27+
"type": ["string"],
28+
"enum": [
29+
"never",
30+
"always",
31+
"inDefaultEmmetModesOnly"
32+
],
33+
"default": "inDefaultEmmetModesOnly",
34+
"description": "Shows expanded emmet abbreviations as suggestions."
3035
},
3136
"emmet.showAbbreviationSuggestions": {
3237
"type": "boolean",
3338
"default": true,
34-
"description": "Shows possible emmet abbreviations as suggestions"
39+
"description": "Shows possible emmet abbreviations as suggestions. Not applicable in stylesheets or when emmet.showExpandedAbbreviation is set to \"never\"."
3540
},
3641
"emmet.includeLanguages": {
3742
"type": "object",
@@ -68,6 +73,6 @@
6873
"@emmetio/html-matcher": "^0.3.1",
6974
"@emmetio/css-parser": "^0.3.0",
7075
"@emmetio/math-expression": "^0.1.1",
71-
"vscode-emmet-helper":"0.0.11"
76+
"vscode-emmet-helper":"0.0.14"
7277
}
7378
}

extensions/emmet/src/abbreviationActions.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { expand } from '@emmetio/expand-abbreviation';
88
import parseStylesheet from '@emmetio/css-parser';
99
import parse from '@emmetio/html-matcher';
1010
import { Node, HtmlNode, Rule } from 'EmmetNode';
11-
import { getNode, getInnerRange, getMappedSyntax } from './util';
12-
import { getExpandOptions, extractAbbreviation, isStyleSheet, isAbbreviationValid } from 'vscode-emmet-helper';
11+
import { getNode, getInnerRange, getMappingForIncludedLanguages } from './util';
12+
import { getExpandOptions, extractAbbreviation, isStyleSheet, isAbbreviationValid, getEmmetMode } from 'vscode-emmet-helper';
1313
import { DocumentStreamReader } from './bufferStream';
1414

1515
interface ExpandAbbreviationInput {
@@ -208,10 +208,15 @@ function getSyntaxFromArgs(args: any): string {
208208
vscode.window.showInformationMessage('Cannot resolve language at cursor.');
209209
return;
210210
}
211-
let syntax = getMappedSyntax(args['language']);
211+
212+
const mappedModes = getMappingForIncludedLanguages();
213+
let language: string = args['language'];
214+
let parentMode: string = args['parentMode'];
215+
216+
let syntax = getEmmetMode(mappedModes[language] ? mappedModes[language] : language);
212217
if (syntax) {
213218
return syntax;
214219
}
215220

216-
return getMappedSyntax(args['parentMode']);
221+
return getEmmetMode(mappedModes[parentMode] ? mappedModes[parentMode] : parentMode);
217222
}

extensions/emmet/src/defaultCompletionProvider.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,25 @@ import parseStylesheet from '@emmetio/css-parser';
88
import parse from '@emmetio/html-matcher';
99
import { Node, HtmlNode } from 'EmmetNode';
1010
import { DocumentStreamReader } from './bufferStream';
11-
import { EmmetCompletionItemProvider, isStyleSheet } from 'vscode-emmet-helper';
11+
import { EmmetCompletionItemProvider, isStyleSheet, getEmmetMode } from 'vscode-emmet-helper';
1212
import { isValidLocationForEmmetAbbreviation } from './abbreviationActions';
13-
import { getSyntax, getNode, getInnerRange, getExcludedModes } from './util';
13+
import { getNode, getInnerRange, getMappingForIncludedLanguages } from './util';
1414

1515
export class DefaultCompletionItemProvider implements vscode.CompletionItemProvider {
1616

1717
public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.CompletionList> {
18-
let syntax = getSyntax(document);
19-
if (getExcludedModes().indexOf(syntax) > -1) {
20-
return;
18+
const mappedLanguages = getMappingForIncludedLanguages();
19+
20+
let isSyntaxMapped = mappedLanguages[document.languageId] ? true : false;
21+
let syntax = getEmmetMode(isSyntaxMapped ? mappedLanguages[document.languageId] : document.languageId);
22+
23+
if (document.languageId === 'html' || isStyleSheet(document.languageId)) {
24+
// Document can be html/css parsed
25+
// Use syntaxHelper to parse file, validate location and update sytnax if needed
26+
syntax = this.syntaxHelper(syntax, document, position);
2127
}
22-
syntax = this.syntaxHelper(syntax, document, position);
2328

24-
if (!syntax) {
29+
if (!syntax || (isSyntaxMapped && vscode.workspace.getConfiguration('emmet')['showExpandedAbbreviation'] !== 'always')) {
2530
return;
2631
}
2732

@@ -30,12 +35,15 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi
3035
}
3136

3237
/**
33-
* Checks whether given position is valid for emmet abbreviation and returns appropriate syntax
38+
* Parses given document to check whether given position is valid for emmet abbreviation and returns appropriate syntax
3439
* @param syntax string language mode of current document
3540
* @param document vscode.Textdocument
3641
* @param position vscode.Position position of the abbreviation that needs to be expanded
3742
*/
3843
private syntaxHelper(syntax: string, document: vscode.TextDocument, position: vscode.Position): string {
44+
if (!syntax) {
45+
return syntax;
46+
}
3947
let parseContent = isStyleSheet(syntax) ? parseStylesheet : parse;
4048
let rootNode: Node = parseContent(new DocumentStreamReader(document));
4149
let currentNode = getNode(rootNode, position);

extensions/emmet/src/extension.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,20 @@ import { fetchEditPoint } from './editPoint';
1717
import { fetchSelectItem } from './selectItem';
1818
import { evaluateMathExpression } from './evaluateMathExpression';
1919
import { incrementDecrement } from './incrementDecrement';
20-
import { LANGUAGE_MODES, getExcludedModes } from './util';
20+
import { LANGUAGE_MODES, getMappingForIncludedLanguages } from './util';
2121
import { updateExtensionsPath } from 'vscode-emmet-helper';
2222

2323
export function activate(context: vscode.ExtensionContext) {
2424
let completionProvider = new DefaultCompletionItemProvider();
25-
let excludedLanguages = getExcludedModes();
2625
Object.keys(LANGUAGE_MODES).forEach(language => {
27-
if (excludedLanguages.indexOf(language) > -1) {
28-
return;
29-
}
3026
const provider = vscode.languages.registerCompletionItemProvider(language, completionProvider, ...LANGUAGE_MODES[language]);
3127
context.subscriptions.push(provider);
3228
});
29+
let includedLanguages = getMappingForIncludedLanguages();
30+
Object.keys(includedLanguages).forEach(language => {
31+
const provider = vscode.languages.registerCompletionItemProvider(language, completionProvider, ...LANGUAGE_MODES[includedLanguages[language]]);
32+
context.subscriptions.push(provider);
33+
});
3334

3435
context.subscriptions.push(vscode.commands.registerCommand('emmet.wrapWithAbbreviation', (args) => {
3536
wrapWithAbbreviation(args);

extensions/emmet/src/util.ts

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export function getSyntax(document: vscode.TextDocument): string {
4646
return document.languageId;
4747
}
4848

49-
export function getIncludedModes(): any {
49+
export function getMappingForIncludedLanguages(): any {
5050
let finalMappedModes = {};
5151
let includeLanguagesConfig = vscode.workspace.getConfiguration('emmet')['includeLanguages'];
5252
let includeLanguages = Object.assign({}, MAPPED_MODES, includeLanguagesConfig ? includeLanguagesConfig : {});
@@ -58,29 +58,8 @@ export function getIncludedModes(): any {
5858
return finalMappedModes;
5959
}
6060

61-
export function getMappedSyntax(syntax: string): string {
62-
if (!syntax) {
63-
return;
64-
}
65-
if (/\b(typescriptreact|javascriptreact|jsx-tags|jsx)\b/.test(syntax)) { // treat tsx like jsx
66-
return 'jsx';
67-
}
68-
if (syntax === 'sass-indented') { // map sass-indented to sass
69-
return 'sass';
70-
}
71-
if (syntax === 'jade') {
72-
return 'pug';
73-
}
74-
if (Object.keys(LANGUAGE_MODES).indexOf(syntax) > -1) {
75-
return syntax;
76-
}
77-
return getIncludedModes()[syntax];
78-
}
7961

80-
export function getExcludedModes(): string[] {
81-
let excludedConfig = vscode.workspace.getConfiguration('emmet')['excludeLanguages'];
82-
return Array.isArray(excludedConfig) ? excludedConfig : [];
83-
}
62+
8463
/**
8564
* Returns node corresponding to given position in the given root node
8665
* @param root

0 commit comments

Comments
 (0)