Skip to content

Commit d994971

Browse files
authored
feat: allow autoImportFileExcludePatterns to ignore files outside the root (#2480)
part of #2479
1 parent a3a7a91 commit d994971

File tree

3 files changed

+68
-36
lines changed

3 files changed

+68
-36
lines changed

packages/language-server/src/ls-config.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -478,16 +478,25 @@ export class LSConfigManager {
478478
};
479479
}
480480

481-
getTsUserPreferences(lang: TsUserConfigLang, workspacePath: string | null): ts.UserPreferences {
481+
getTsUserPreferences(
482+
lang: TsUserConfigLang,
483+
normalizedWorkspacePath: string | null
484+
): ts.UserPreferences {
482485
const userPreferences = this.tsUserPreferences[lang];
483486

484-
if (!workspacePath || !userPreferences.autoImportFileExcludePatterns) {
487+
if (!normalizedWorkspacePath || !userPreferences.autoImportFileExcludePatterns) {
485488
return userPreferences;
486489
}
487490

488-
let autoImportFileExcludePatterns = this.resolvedAutoImportExcludeCache.get(workspacePath);
491+
let autoImportFileExcludePatterns =
492+
this.resolvedAutoImportExcludeCache.get(normalizedWorkspacePath);
489493

490494
if (!autoImportFileExcludePatterns) {
495+
const version = ts.version.split('.');
496+
const major = parseInt(version[0]);
497+
const minor = parseInt(version[1]);
498+
499+
const gte5_4 = major > 5 || (major === 5 && minor >= 4);
491500
autoImportFileExcludePatterns = userPreferences.autoImportFileExcludePatterns.map(
492501
(p) => {
493502
// Normalization rules: https://github.com/microsoft/TypeScript/pull/49578
@@ -497,17 +506,20 @@ export class LSConfigManager {
497506
return p;
498507
}
499508

500-
return path.join(
501-
workspacePath,
502-
p.startsWith('*')
503-
? '/' + slashNormalized
504-
: isRelative
505-
? p
506-
: '/**/' + slashNormalized
507-
);
509+
// https://github.com/microsoft/vscode/pull/202762
510+
// ts 5.4+ supports leading wildcards
511+
const wildcardPrefix = gte5_4 ? '' : path.parse(normalizedWorkspacePath).root;
512+
return p.startsWith('*')
513+
? wildcardPrefix + slashNormalized
514+
: isRelative
515+
? path.join(normalizedWorkspacePath, p)
516+
: wildcardPrefix + '**/' + slashNormalized;
508517
}
509518
);
510-
this.resolvedAutoImportExcludeCache.set(workspacePath, autoImportFileExcludePatterns);
519+
this.resolvedAutoImportExcludeCache.set(
520+
normalizedWorkspacePath,
521+
autoImportFileExcludePatterns
522+
);
511523
}
512524

513525
return {

packages/language-server/test/plugins/typescript/features/preferences.test.ts

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,14 @@ describe('ts user preferences', function () {
6464
typescript: { ...getPreferences(), ...preferences },
6565
javascript: { ...getPreferences(), ...preferences }
6666
});
67-
return new LSAndTSDocResolver(docManager, [pathToUrl(testFilesDir)], configManager);
67+
return {
68+
lsAndTsDocResolver: new LSAndTSDocResolver(
69+
docManager,
70+
[pathToUrl(testFilesDir)],
71+
configManager
72+
),
73+
configManager
74+
};
6875
}
6976

7077
function getDefaultPreferences(): TsUserPreferencesConfig {
@@ -79,11 +86,8 @@ describe('ts user preferences', function () {
7986

8087
it('provides auto import completion according to preferences', async () => {
8188
const { docManager, document } = setup('code-action.svelte');
82-
const lsAndTsDocResolver = createLSAndTSDocResolver(docManager);
83-
const completionProvider = new CompletionsProviderImpl(
84-
lsAndTsDocResolver,
85-
new LSConfigManager()
86-
);
89+
const { lsAndTsDocResolver, configManager } = createLSAndTSDocResolver(docManager);
90+
const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver, configManager);
8791

8892
const completions = await completionProvider.getCompletions(
8993
document,
@@ -102,15 +106,13 @@ describe('ts user preferences', function () {
102106
context: CodeActionContext
103107
) {
104108
const { docManager, document } = setup(filename);
105-
const lsAndTsDocResolver = createLSAndTSDocResolver(docManager);
106-
const completionProvider = new CompletionsProviderImpl(
107-
lsAndTsDocResolver,
108-
new LSConfigManager()
109-
);
109+
const { lsAndTsDocResolver, configManager } = createLSAndTSDocResolver(docManager);
110+
const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver, configManager);
111+
110112
const codeActionProvider = new CodeActionsProviderImpl(
111113
lsAndTsDocResolver,
112114
completionProvider,
113-
new LSConfigManager()
115+
configManager
114116
);
115117

116118
const codeAction = await codeActionProvider.getCodeActions(document, range, context);
@@ -137,7 +139,7 @@ describe('ts user preferences', function () {
137139

138140
it('provides auto import suggestions according to preferences', async () => {
139141
const { docManager, document } = setup('code-action.svelte');
140-
const lsAndTsDocResolver = createLSAndTSDocResolver(docManager, {
142+
const { lsAndTsDocResolver, configManager } = createLSAndTSDocResolver(docManager, {
141143
suggest: {
142144
autoImports: false,
143145
includeAutomaticOptionalChainCompletions: undefined,
@@ -147,10 +149,7 @@ describe('ts user preferences', function () {
147149
includeCompletionsWithSnippetText: undefined
148150
}
149151
});
150-
const completionProvider = new CompletionsProviderImpl(
151-
lsAndTsDocResolver,
152-
new LSConfigManager()
153-
);
152+
const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver, configManager);
154153

155154
const completions = await completionProvider.getCompletions(
156155
document,
@@ -165,14 +164,14 @@ describe('ts user preferences', function () {
165164

166165
function setupImportModuleSpecifierEndingJs() {
167166
const { docManager, document } = setup('module-specifier-js.svelte');
168-
const lsAndTsDocResolver = createLSAndTSDocResolver(docManager, {
167+
const { lsAndTsDocResolver, configManager } = createLSAndTSDocResolver(docManager, {
169168
preferences: {
170169
...getDefaultPreferences(),
171170
importModuleSpecifierEnding: 'js'
172171
}
173172
});
174173

175-
return { document, lsAndTsDocResolver };
174+
return { document, lsAndTsDocResolver, configManager };
176175
}
177176

178177
it('provides auto import for svelte component when importModuleSpecifierEnding is js', async () => {
@@ -248,16 +247,13 @@ describe('ts user preferences', function () {
248247

249248
async function testExcludeDefinitionDir(pattern: string) {
250249
const { docManager, document } = setup('code-action.svelte');
251-
const lsAndTsDocResolver = createLSAndTSDocResolver(docManager, {
250+
const { lsAndTsDocResolver, configManager } = createLSAndTSDocResolver(docManager, {
252251
preferences: {
253252
...getDefaultPreferences(),
254253
autoImportFileExcludePatterns: [pattern]
255254
}
256255
});
257-
const completionProvider = new CompletionsProviderImpl(
258-
lsAndTsDocResolver,
259-
new LSConfigManager()
260-
);
256+
const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver, configManager);
261257

262258
const completions = await completionProvider.getCompletions(
263259
document,
@@ -280,4 +276,24 @@ describe('ts user preferences', function () {
280276
it('exclude auto import (**/ pattern)', async () => {
281277
await testExcludeDefinitionDir('**/definition');
282278
});
279+
280+
it('exclude auto import outside of the root', async () => {
281+
const { docManager, document } = setup('code-action-outside-root.svelte');
282+
const { lsAndTsDocResolver, configManager } = createLSAndTSDocResolver(docManager, {
283+
preferences: {
284+
...getDefaultPreferences(),
285+
autoImportFileExcludePatterns: ['definitions.ts']
286+
}
287+
});
288+
const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver, configManager);
289+
290+
const completions = await completionProvider.getCompletions(
291+
document,
292+
Position.create(4, 7)
293+
);
294+
295+
const item = completions?.items.find((item) => item.label === 'blubb');
296+
297+
assert.equal(item, undefined);
298+
});
283299
});
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<script lang="ts">
2+
import {} from '../definitions'
3+
blu
4+
</script>

0 commit comments

Comments
 (0)