diff --git a/extensions/css-language-features/server/src/pathCompletion.ts b/extensions/css-language-features/server/src/pathCompletion.ts index ecbd9a09843..fb7bd8df9c4 100644 --- a/extensions/css-language-features/server/src/pathCompletion.ts +++ b/extensions/css-language-features/server/src/pathCompletion.ts @@ -69,10 +69,15 @@ function providePathSuggestions(pathValue: string, position: Position, range: Ra const workspaceRoot = resolveWorkspaceRoot(document, workspaceFolders); const currentDocFsPath = URI.parse(document.uri).fsPath; - const paths = providePaths(valueBeforeCursor, currentDocFsPath, workspaceRoot).filter(p => { - // Exclude current doc's path - return path.resolve(currentDocFsPath, '../', p) !== currentDocFsPath; - }); + const paths = providePaths(valueBeforeCursor, currentDocFsPath, workspaceRoot) + .filter(p => { + // Exclude current doc's path + return path.resolve(currentDocFsPath, '../', p) !== currentDocFsPath; + }) + .filter(p => { + // Exclude paths that start with `.` + return p[0] !== '.'; + }); const fullValueRange = isValueQuoted ? shiftRange(range, 1, -1) : range; const replaceRange = pathToReplaceRange(valueBeforeCursor, fullValue, fullValueRange); diff --git a/extensions/css-language-features/server/src/test/completion.test.ts b/extensions/css-language-features/server/src/test/completion.test.ts index 65cfed74d0c..aca18d6463b 100644 --- a/extensions/css-language-features/server/src/test/completion.test.ts +++ b/extensions/css-language-features/server/src/test/completion.test.ts @@ -193,4 +193,14 @@ suite('Completions', () => { ] }, testSCSSUri, folders, 'scss'); }); + + test('Completion should ignore files/folders starting with dot', function () { + let testUri = Uri.file(path.resolve(__dirname, '../../test/pathCompletionFixtures/about/about.css')).toString(); + let folders = [{ name: 'x', uri: Uri.file(path.resolve(__dirname, '../../test')).toString() }]; + + assertCompletions('html { background-image: url("../|")', { + count: 4 + }, testUri, folders); + + }); }); \ No newline at end of file diff --git a/extensions/css-language-features/server/test/pathCompletionFixtures/.foo.js b/extensions/css-language-features/server/test/pathCompletionFixtures/.foo.js new file mode 100644 index 00000000000..adae63e647c --- /dev/null +++ b/extensions/css-language-features/server/test/pathCompletionFixtures/.foo.js @@ -0,0 +1,4 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ \ No newline at end of file diff --git a/extensions/html-language-features/server/src/modes/pathCompletion.ts b/extensions/html-language-features/server/src/modes/pathCompletion.ts index 05448ed9dd2..5b943ff2392 100644 --- a/extensions/html-language-features/server/src/modes/pathCompletion.ts +++ b/extensions/html-language-features/server/src/modes/pathCompletion.ts @@ -78,11 +78,12 @@ function providePaths(valueBeforeCursor: string, activeDocFsPath: string, root?: } try { - return fs.readdirSync(parentDir).map(f => { + const paths = fs.readdirSync(parentDir).map(f => { return isDir(path.resolve(parentDir, f)) ? f + '/' : f; }); + return paths.filter(p => p[0] !== '.'); } catch (e) { return []; } diff --git a/extensions/html-language-features/server/src/test/completions.test.ts b/extensions/html-language-features/server/src/test/completions.test.ts index 7bc12b33731..98a508e2054 100644 --- a/extensions/html-language-features/server/src/test/completions.test.ts +++ b/extensions/html-language-features/server/src/test/completions.test.ts @@ -66,7 +66,7 @@ export function testCompletionFor(value: string, expected: { count?: number, ite let list = mode.doComplete!(document, position); if (expected.count) { - assert.equal(list.items, expected.count); + assert.equal(list.items.length, expected.count); } if (expected.items) { for (let item of expected.items) { @@ -96,7 +96,7 @@ suite('HTML Path Completion', () => { command: 'editor.action.triggerSuggest' }; - const fixtureRoot = path.resolve(__dirname, 'pathCompletionFixtures'); + const fixtureRoot = path.resolve(__dirname, '../../src/test/pathCompletionFixtures'); const fixtureWorkspace = { name: 'fixture', uri: Uri.file(fixtureRoot).toString() }; const indexHtmlUri = Uri.file(path.resolve(fixtureRoot, 'index.html')).toString(); const aboutHtmlUri = Uri.file(path.resolve(fixtureRoot, 'about/about.html')).toString(); @@ -296,6 +296,12 @@ suite('HTML Path Completion', () => { ] }, indexHtmlUri, [fixtureWorkspace]); }); + + test('Completion should ignore files/folders starting with dot', () => { + testCompletionFor('