diff --git a/extensions/html/server/src/modes/pathCompletion.ts b/extensions/html/server/src/modes/pathCompletion.ts index 29eaa36c0ea..05429801c40 100644 --- a/extensions/html/server/src/modes/pathCompletion.ts +++ b/extensions/html/server/src/modes/pathCompletion.ts @@ -4,20 +4,21 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TextDocument, Position, CompletionList, CompletionItemKind } from 'vscode-languageserver-types'; +import { TextDocument, Position, CompletionList, CompletionItemKind, TextEdit } from 'vscode-languageserver-types'; import { WorkspaceFolder } from 'vscode-languageserver-protocol/lib/protocol.workspaceFolders.proposed'; import * as path from 'path'; import * as fs from 'fs'; import uri from 'vscode-uri'; +import { ICompletionParticipant } from 'vscode-html-languageservice/lib/htmlLanguageService'; export function getPathCompletionParticipant( document: TextDocument, position: Position, result: CompletionList, workspaceFolders: WorkspaceFolder[] | undefined -) { +): ICompletionParticipant { return { - onHtmlAttributeValue: (tag, attributeName, attributeValue) => { + onHtmlAttributeValue: ({ tag, attribute, value, range }) => { const pathTagAndAttribute: { [t: string]: string } = { a: 'href', script: 'src', @@ -27,35 +28,37 @@ export function getPathCompletionParticipant( const isDir = (p: string) => fs.statSync(p).isDirectory(); - if (pathTagAndAttribute[tag] && pathTagAndAttribute[tag] === attributeName) { - const currPath = attributeValue.replace(/['"]/g, ''); + if (pathTagAndAttribute[tag] && pathTagAndAttribute[tag] === attribute) { + const currPath = value.replace(/['"]/g, ''); - let resolvedPath; - if (currPath.startsWith('/')) { + let resolvedDirPath; + if (currPath[0] === ('/')) { if (!workspaceFolders || workspaceFolders.length === 0) { return; } for (let i = 0; i < workspaceFolders.length; i++) { if (document.uri.indexOf(workspaceFolders[i].uri) !== -1) { - resolvedPath = path.resolve(uri.parse(workspaceFolders[i].uri).fsPath); + resolvedDirPath = path.resolve(uri.parse(workspaceFolders[i].uri).fsPath); } } } else { - resolvedPath = path.resolve(uri.parse(document.uri).fsPath, '..', currPath); + resolvedDirPath = path.resolve(uri.parse(document.uri).fsPath, '..', currPath); } - if (resolvedPath && isDir(resolvedPath)) { - const filesAndFolders = fs.readdirSync(resolvedPath); + if (resolvedDirPath && isDir(resolvedDirPath)) { + const filesAndFolders = fs.readdirSync(resolvedDirPath); if (!result.items) { result.items = []; } for (let i = 0; i < filesAndFolders.length; i++) { - const kind = isDir(path.resolve(resolvedPath, filesAndFolders[i])) + const resolvedCompletionItemPath = path.resolve(resolvedDirPath, filesAndFolders[i]); + const kind = isDir(resolvedCompletionItemPath) ? CompletionItemKind.Folder : CompletionItemKind.File; result.items.push({ label: filesAndFolders[i], - kind + kind, + textEdit: TextEdit.replace(range, filesAndFolders[i]) }); } }