Skip to content

Commit 5aaefe1

Browse files
authored
(feat) respect autoimport config (#713)
If VS Code user disabled auto import suggestions in their config, don't show them #695
1 parent 95170e6 commit 5aaefe1

File tree

4 files changed

+76
-31
lines changed

4 files changed

+76
-31
lines changed

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

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,20 @@ export interface LSSvelteConfig {
167167
};
168168
}
169169

170+
/**
171+
* A subset of the JS/TS VS Code settings which
172+
* are transformed to ts.UserPreferences.
173+
* It may not be available in other IDEs, that's why the keys are optional.
174+
*/
175+
export interface TSUserConfig {
176+
preferences?: TsUserPreferencesConfig;
177+
suggest?: TSSuggestConfig;
178+
}
179+
180+
/**
181+
* A subset of the JS/TS VS Code settings which
182+
* are transformed to ts.UserPreferences.
183+
*/
170184
export interface TsUserPreferencesConfig {
171185
importModuleSpecifier: UserPreferences['importModuleSpecifierPreference'];
172186
importModuleSpecifierEnding: UserPreferences['importModuleSpecifierEnding'];
@@ -177,6 +191,14 @@ export interface TsUserPreferencesConfig {
177191
includePackageJsonAutoImports?: UserPreferences['includePackageJsonAutoImports'];
178192
}
179193

194+
/**
195+
* A subset of the JS/TS VS Code settings which
196+
* are transformed to ts.UserPreferences.
197+
*/
198+
export interface TSSuggestConfig {
199+
autoImports: UserPreferences['includeCompletionsForModuleExports'];
200+
}
201+
180202
export type TsUserConfigLang = 'typescript' | 'javascript';
181203

182204
type DeepPartial<T> = T extends CompilerWarningsSettings
@@ -189,8 +211,12 @@ export class LSConfigManager {
189211
private config: LSConfig = defaultLSConfig;
190212
private listeners: Array<(config: LSConfigManager) => void> = [];
191213
private tsUserPreferences: Record<TsUserConfigLang, UserPreferences> = {
192-
typescript: {},
193-
javascript: {}
214+
typescript: {
215+
includeCompletionsForModuleExports: true
216+
},
217+
javascript: {
218+
includeCompletionsForModuleExports: true
219+
}
194220
};
195221
private prettierConfig: any = {};
196222
private emmetConfig: EmmetConfiguration = {};
@@ -258,28 +284,23 @@ export class LSConfigManager {
258284
return this.prettierConfig;
259285
}
260286

261-
updateTsJsUserPreferences(
262-
config: Record<
263-
TsUserConfigLang,
264-
{
265-
preferences: TsUserPreferencesConfig;
266-
}
267-
>
268-
): void {
287+
updateTsJsUserPreferences(config: Record<TsUserConfigLang, TSUserConfig>): void {
269288
(['typescript', 'javascript'] as const).forEach((lang) => {
270-
if (config[lang]?.preferences) {
271-
this._updateTsUserPreferences(lang, config[lang].preferences);
289+
if (config[lang]) {
290+
this._updateTsUserPreferences(lang, config[lang]);
272291
}
273292
});
274293
}
275294

276-
private _updateTsUserPreferences(lang: TsUserConfigLang, config: TsUserPreferencesConfig) {
277-
this.tsUserPreferences[lang] = Object.assign(this.tsUserPreferences[lang], {
278-
importModuleSpecifierPreference: config.importModuleSpecifier,
279-
importModuleSpecifierEnding: config.importModuleSpecifierEnding,
280-
includePackageJsonAutoImports: config.includePackageJsonAutoImports,
281-
quotePreference: config.quoteStyle
282-
} as UserPreferences);
295+
private _updateTsUserPreferences(lang: TsUserConfigLang, config: TSUserConfig) {
296+
this.tsUserPreferences[lang] = {
297+
...this.tsUserPreferences[lang],
298+
importModuleSpecifierPreference: config.preferences?.importModuleSpecifier,
299+
importModuleSpecifierEnding: config.preferences?.importModuleSpecifierEnding,
300+
includePackageJsonAutoImports: config.preferences?.includePackageJsonAutoImports,
301+
quotePreference: config.preferences?.quoteStyle,
302+
includeCompletionsForModuleExports: config.suggest?.autoImports ?? true
303+
};
283304
}
284305

285306
getTsUserPreferences(lang: TsUserConfigLang) {

packages/language-server/src/plugins/typescript/features/CompletionProvider.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export interface CompletionEntryWithIdentifer extends ts.CompletionEntry, TextDo
3838
type validTriggerCharacter = '.' | '"' | "'" | '`' | '/' | '@' | '<' | '#';
3939

4040
export class CompletionsProviderImpl implements CompletionsProvider<CompletionEntryWithIdentifer> {
41-
constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) { }
41+
constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {}
4242

4343
/**
4444
* The language service throws an error if the character is not a valid trigger character.
@@ -62,7 +62,7 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
6262
return null;
6363
}
6464

65-
const { lang, tsDoc } = this.lsAndTsDocResolver.getLSAndTSDoc(document);
65+
const { lang, tsDoc, userPreferences } = this.lsAndTsDocResolver.getLSAndTSDoc(document);
6666

6767
const filePath = tsDoc.filePath;
6868
if (!filePath) {
@@ -115,7 +115,7 @@ export class CompletionsProviderImpl implements CompletionsProvider<CompletionEn
115115

116116
const completions =
117117
lang.getCompletionsAtPosition(filePath, offset, {
118-
includeCompletionsForModuleExports: true,
118+
...userPreferences,
119119
triggerCharacter: validTriggerCharacter
120120
})?.entries || [];
121121

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

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { CompletionsProviderImpl } from '../../../../src/plugins/typescript/feat
1515
import { LSAndTSDocResolver } from '../../../../src/plugins/typescript/LSAndTSDocResolver';
1616
import { pathToUrl } from '../../../../src/utils';
1717
import { CodeActionsProviderImpl } from '../../../../src/plugins/typescript/features/CodeActionsProvider';
18-
import { LSConfigManager, TsUserPreferencesConfig } from '../../../../src/ls-config';
18+
import { LSConfigManager, TSUserConfig } from '../../../../src/ls-config';
1919

2020
const testFilesDir = join(__dirname, '..', 'testfiles', 'preferences');
2121

@@ -35,19 +35,27 @@ describe('ts user preferences', () => {
3535

3636
const expectedImportEdit = "import { definition } from '~/definition/index';";
3737

38-
function getPreferences(): TsUserPreferencesConfig {
38+
function getPreferences(): TSUserConfig {
3939
return {
40-
importModuleSpecifier: 'non-relative',
41-
importModuleSpecifierEnding: 'index',
42-
quoteStyle: 'single'
40+
preferences: {
41+
importModuleSpecifier: 'non-relative',
42+
importModuleSpecifierEnding: 'index',
43+
quoteStyle: 'single'
44+
},
45+
suggest: {
46+
autoImports: true
47+
}
4348
};
4449
}
4550

46-
function createLSAndTSDocResolver(docManager: DocumentManager) {
51+
function createLSAndTSDocResolver(
52+
docManager: DocumentManager,
53+
preferences?: Partial<TSUserConfig>
54+
) {
4755
const configManager = new LSConfigManager();
4856
configManager.updateTsJsUserPreferences({
49-
typescript: { preferences: getPreferences() },
50-
javascript: { preferences: {} as any }
57+
typescript: { ...getPreferences(), ...preferences },
58+
javascript: { ...getPreferences(), ...preferences }
5159
});
5260
return new LSAndTSDocResolver(docManager, [pathToUrl(testFilesDir)], configManager);
5361
}
@@ -102,4 +110,20 @@ describe('ts user preferences', () => {
102110
]
103111
});
104112
});
113+
114+
it('provides auto import suggestions according to preferences', async () => {
115+
const { docManager, document } = setup('code-action.svelte');
116+
const lsAndTsDocResolver = createLSAndTSDocResolver(docManager, {
117+
suggest: { autoImports: false }
118+
});
119+
const completionProvider = new CompletionsProviderImpl(lsAndTsDocResolver);
120+
121+
const completions = await completionProvider.getCompletions(
122+
document,
123+
Position.create(1, 14)
124+
);
125+
126+
const item = completions?.items.find((item) => item.label === 'definition');
127+
assert.strictEqual(item, undefined, 'Expected no auto import suggestions');
128+
});
105129
});

packages/svelte-vscode/src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ function addRenameFileListener(getLS: () => LanguageClient) {
248248
// In the meantime, just assume it's a single entry and simplify the
249249
// rest of the logic that way.
250250
{
251-
oldUri: oldUri,
251+
oldUri,
252252
newUri: evt.files[0].newUri.toString(true)
253253
}
254254
);

0 commit comments

Comments
 (0)