提交 baf54ef0 编写于 作者: R Ramya Achutha Rao

Collapse html,css completion provider for emmet

上级 ec959699
......@@ -6,12 +6,12 @@
import * as vscode from 'vscode';
import { expand, createSnippetsRegistry } from '@emmetio/expand-abbreviation';
import { getSyntax, getProfile, extractAbbreviation } from './util';
import { getSyntax, getProfile, extractAbbreviation, isStyleSheet } from './util';
const field = (index, placeholder) => `\${${index}${placeholder ? ':' + placeholder : ''}}`;
const snippetCompletionsCache = new Map<string, vscode.CompletionItem[]>();
export abstract class EmmetCompletionItemProviderBase implements vscode.CompletionItemProvider {
export class EmmetCompletionItemProvider implements vscode.CompletionItemProvider {
public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.CompletionList> {
......@@ -19,15 +19,27 @@ export abstract class EmmetCompletionItemProviderBase implements vscode.Completi
return Promise.resolve(null);
}
let completionItems: vscode.CompletionItem[] = [];
let syntax = getSyntax(document);
let currentWord = getCurrentWord(document, position);
let expandedAbbr = this.getExpandedAbbreviation(document, position);
let abbreviationSuggestions = this.getAbbreviationSuggestions(getSyntax(document), currentWord, (expandedAbbr && currentWord === expandedAbbr.label));
let completionItems = expandedAbbr ? [expandedAbbr, ...abbreviationSuggestions] : abbreviationSuggestions;
if (!isStyleSheet(syntax)) {
if (expandedAbbr) {
// In non stylesheet like syntax, this extension returns expanded abbr plus posssible abbr completions
// To differentiate between the 2, the former is given CompletionItemKind.Value so that it gets a different icon
expandedAbbr.kind = vscode.CompletionItemKind.Value;
}
let abbreviationSuggestions = this.getAbbreviationSuggestions(syntax, currentWord, (expandedAbbr && currentWord === expandedAbbr.label));
completionItems = expandedAbbr ? [expandedAbbr, ...abbreviationSuggestions] : abbreviationSuggestions;
} else {
completionItems = expandedAbbr ? [expandedAbbr] : [];
}
return Promise.resolve(new vscode.CompletionList(completionItems, true));
}
protected getExpandedAbbreviation(document: vscode.TextDocument, position: vscode.Position): vscode.CompletionItem {
getExpandedAbbreviation(document: vscode.TextDocument, position: vscode.Position): vscode.CompletionItem {
if (!vscode.workspace.getConfiguration('emmet')['showExpandedAbbreviation']) {
return;
}
......@@ -53,25 +65,6 @@ export abstract class EmmetCompletionItemProviderBase implements vscode.Completi
return completionitem;
}
abstract getAbbreviationSuggestions(syntax: string, prefix: string, skipExactMatch: boolean): vscode.CompletionItem[];
}
export class EmmetCompletionItemProviderHtml extends EmmetCompletionItemProviderBase {
protected getExpandedAbbreviation(document: vscode.TextDocument, position: vscode.Position): vscode.CompletionItem {
let completionItem = super.getExpandedAbbreviation(document, position);
if (completionItem) {
// In non stylesheet like syntax, this extension returns expanded abbr plus posssible abbr completions
// To differentiate between the 2, the former is given CompletionItemKind.Value so that it gets a different icon
completionItem.kind = vscode.CompletionItemKind.Value;
}
return completionItem;
}
getAbbreviationSuggestions(syntax: string, prefix: string, skipExactMatch: boolean) {
if (!vscode.workspace.getConfiguration('emmet')['showAbbreviationSuggestions'] || !prefix) {
return [];
......@@ -102,19 +95,9 @@ export class EmmetCompletionItemProviderHtml extends EmmetCompletionItemProvider
}
}
export class EmmetCompletionItemProviderCss extends EmmetCompletionItemProviderBase {
public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.CompletionList> {
return super.provideCompletionItems(document, position, token);
}
getAbbreviationSuggestions(syntax: string, prefix: string, skipExactMatch: boolean) {
return [];
}
}
function getCurrentWord(document: vscode.TextDocument, position: vscode.Position): string {
let wordAtPosition = document.getWordRangeAtPosition(position);
......
......@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import { EmmetCompletionItemProviderHtml, EmmetCompletionItemProviderCss } from './emmetCompletionProvider';
import { EmmetCompletionItemProvider } from './emmetCompletionProvider';
import { expandAbbreviation, wrapWithAbbreviation } from './abbreviationActions';
import { removeTag } from './removeTag';
import { updateTag } from './updateTag';
......@@ -21,7 +21,7 @@ interface ISupportedLanguageMode {
triggerCharacters: string[];
}
const HTML_LANGUAGE_MODES: ISupportedLanguageMode[] = [
const LANGUAGE_MODES: ISupportedLanguageMode[] = [
{ id: 'html', triggerCharacters: ['!', '.', '}'] },
{ id: 'jade', triggerCharacters: ['!', '.', '}'] },
{ id: 'slim', triggerCharacters: ['!', '.', '}'] },
......@@ -30,10 +30,8 @@ const HTML_LANGUAGE_MODES: ISupportedLanguageMode[] = [
{ id: 'xsl', triggerCharacters: ['.', '}'] },
{ id: 'javascriptreact', triggerCharacters: ['.'] },
{ id: 'typescriptreact', triggerCharacters: ['.'] }
];
{ id: 'typescriptreact', triggerCharacters: ['.'] },
const CSS_LANGUAGE_MODES: ISupportedLanguageMode[] = [
{ id: 'css', triggerCharacters: [':'] },
{ id: 'scss', triggerCharacters: [':'] },
{ id: 'sass', triggerCharacters: [':'] },
......@@ -42,16 +40,9 @@ const CSS_LANGUAGE_MODES: ISupportedLanguageMode[] = [
];
export function activate(context: vscode.ExtensionContext) {
let completionProviderHtml = new EmmetCompletionItemProviderHtml();
let completionProviderCss = new EmmetCompletionItemProviderCss();
for (let language of HTML_LANGUAGE_MODES) {
const provider = vscode.languages.registerCompletionItemProvider({ language: language.id }, completionProviderHtml, ...language.triggerCharacters);
context.subscriptions.push(provider);
}
for (let language of CSS_LANGUAGE_MODES) {
const provider = vscode.languages.registerCompletionItemProvider({ language: language.id }, completionProviderCss, ...language.triggerCharacters);
let completionProvider = new EmmetCompletionItemProvider();
for (let language of LANGUAGE_MODES) {
const provider = vscode.languages.registerCompletionItemProvider({ language: language.id }, completionProvider, ...language.triggerCharacters);
context.subscriptions.push(provider);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册