function assertCompletions(value: string, expected: { count?: number, items?: ItemDescription[] }, testUri: string, workspaceFolders?: WorkspaceFolder[], lang: string = 'css'): void { const offset = value.indexOf('|'); value = value.substr(0, offset) + value.substr(offset + 1); const document = TextDocument.create(testUri, lang, 0, value); const position = document.positionAt(offset); if (!workspaceFolders) { workspaceFolders = [{ name: 'x', uri: testUri.substr(0, testUri.lastIndexOf('/')) }]; } let participantResult = CompletionList.create([]); cssLanguageService.setCompletionParticipants([getPathCompletionParticipant(document, workspaceFolders, participantResult)]); const stylesheet = cssLanguageService.parseStylesheet(document); let list = cssLanguageService.doComplete(document, position, stylesheet)!; list.items = list.items.concat(participantResult.items); if (expected.count) { assert.equal(list.items.length, expected.count); } if (expected.items) { for (let item of expected.items) { assertCompletion(list, item, document, offset); } } }
function assertCompletions(value: string, expected: { count?: number, items?: ItemDescription[] }, uri = testUri, workspaceFolders?: Proposed.WorkspaceFolder[]): void { let offset = value.indexOf('|'); value = value.substr(0, offset) + value.substr(offset + 1); let document = TextDocument.create(uri, 'html', 0, value); let position = document.positionAt(offset); var languageModes = getLanguageModes({ css: true, javascript: true }); var mode = languageModes.getModeAtPosition(document, position); if (!workspaceFolders) { workspaceFolders = [{ name: 'x', uri: path.dirname(uri) }]; } let participantResult = CompletionList.create([]); if (mode.setCompletionParticipants) { mode.setCompletionParticipants([getPathCompletionParticipant(document, workspaceFolders, participantResult)]); } let list = mode.doComplete!(document, position); list.items = list.items.concat(participantResult.items); if (expected.count) { assert.equal(list.items, expected.count); } if (expected.items) { for (let item of expected.items) { assertCompletion(list, item, document, offset); } } }
function assertCompletions(syntax: string, value: string, expectedProposal: string | null, expectedProposalDoc: string | null): void { const offset = value.indexOf('|'); value = value.substr(0, offset) + value.substr(offset + 1); const workspace = { settings: {}, folders: [{ name: 'test', uri: 'test://test' }] }; const document = TextDocument.create('test://test/test.' + syntax, syntax, 0, value); const position = document.positionAt(offset); const documentRegions = getLanguageModelCache<embeddedSupport.HTMLDocumentRegions>(10, 60, document => embeddedSupport.getDocumentRegions(htmlLanguageService, document)); const mode = syntax === 'html' ? getHTMLMode(htmlLanguageService, workspace) : getCSSMode(documentRegions, workspace); const emmetCompletionList = CompletionList.create([], false); const emmetParticipant = getEmmetCompletionParticipants(document, position, document.languageId, {}, emmetCompletionList); const list = mode.doComplete!(document, position, {}, [emmetParticipant]); assert.ok(list); assert.ok(emmetCompletionList); let actualLabels = emmetCompletionList.items.map(c => c.label).sort(); let actualDocs = emmetCompletionList.items.map(c => c.documentation).sort(); if (expectedProposal && expectedProposalDoc) { assert.ok(actualLabels.indexOf(expectedProposal) !== -1, value + ': Not found:' + expectedProposal + ' is ' + actualLabels.join(', ')); assert.ok(actualDocs.indexOf(expectedProposalDoc) !== -1, value + ': Not found:' + expectedProposalDoc + ' is ' + actualDocs.join(', ')); } else { assert.ok(!emmetCompletionList.items.length && !emmetCompletionList.isIncomplete, value + ': No proposals expected, but was ' + actualLabels.join(', ')); } }
export function getCSSMode(documentRegions: LanguageModelCache<HTMLDocumentRegions>, workspace: Workspace): LanguageMode { let cssLanguageService = getCSSLanguageService(); let embeddedCSSDocuments = getLanguageModelCache<TextDocument>(10, 60, document => documentRegions.get(document).getEmbeddedDocument('css')); let cssStylesheets = getLanguageModelCache<Stylesheet>(10, 60, document => cssLanguageService.parseStylesheet(document)); return { getId() { return 'css'; }, doValidation(document: TextDocument, settings = workspace.settings) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.doValidation(embedded, cssStylesheets.get(embedded), settings && settings.css); }, doComplete(document: TextDocument, position: Position, _settings = workspace.settings) { let embedded = embeddedCSSDocuments.get(document); const stylesheet = cssStylesheets.get(embedded); return cssLanguageService.doComplete(embedded, position, stylesheet) || CompletionList.create(); }, doHover(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.doHover(embedded, position, cssStylesheets.get(embedded)); }, findDocumentHighlight(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findDocumentHighlights(embedded, position, cssStylesheets.get(embedded)); }, findDocumentSymbols(document: TextDocument) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findDocumentSymbols(embedded, cssStylesheets.get(embedded)).filter(s => s.name !== CSS_STYLE_RULE); }, findDefinition(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findDefinition(embedded, position, cssStylesheets.get(embedded)); }, findReferences(document: TextDocument, position: Position) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findReferences(embedded, position, cssStylesheets.get(embedded)); }, findDocumentColors(document: TextDocument) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.findDocumentColors(embedded, cssStylesheets.get(embedded)); }, getColorPresentations(document: TextDocument, color: Color, range: Range) { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.getColorPresentations(embedded, cssStylesheets.get(embedded), color, range); }, getFoldingRanges(document: TextDocument): FoldingRange[] { let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.getFoldingRanges(embedded, {}); }, onDocumentRemoved(document: TextDocument) { embeddedCSSDocuments.onDocumentRemoved(document); cssStylesheets.onDocumentRemoved(document); }, dispose() { embeddedCSSDocuments.dispose(); cssStylesheets.dispose(); } }; }