Skip to content

Commit c599342

Browse files
committed
exclude tokens from completion entries
1 parent 499a973 commit c599342

3 files changed

Lines changed: 28 additions & 3 deletions

File tree

packages/ts-plugin/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const plugin = createLanguageServicePlugin((ts, info) => {
4646
info.project,
4747
resolver,
4848
matchesPattern,
49+
config,
4950
);
5051
},
5152
};

packages/ts-plugin/src/language-service/feature/completion.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
import { getCssModuleFileName, isComponentFileName, STYLES_EXPORT_NAME } from '@css-modules-kit/core';
1+
import type { CMKConfig } from '@css-modules-kit/core';
2+
import { getCssModuleFileName, isComponentFileName, isCSSModuleFile, STYLES_EXPORT_NAME } from '@css-modules-kit/core';
23
import ts from 'typescript';
34

45
export function getCompletionsAtPosition(
56
languageService: ts.LanguageService,
7+
config: CMKConfig,
68
): ts.LanguageService['getCompletionsAtPosition'] {
79
return (fileName, position, options, formattingSettings) => {
810
const prior = languageService.getCompletionsAtPosition(fileName, position, options, formattingSettings);
11+
if (!prior) return undefined;
912

10-
if (isComponentFileName(fileName) && prior) {
13+
if (isComponentFileName(fileName)) {
1114
const cssModuleFileName = getCssModuleFileName(fileName);
1215
for (const entry of prior.entries) {
1316
if (isStylesEntryForCSSModuleFile(entry, cssModuleFileName)) {
@@ -20,6 +23,20 @@ export function getCompletionsAtPosition(
2023
}
2124
}
2225
}
26+
if (config.namedExports) {
27+
// When namedExports is enabled, you can write code as follows:
28+
// ```ts
29+
// import { button } from './a.module.css';
30+
// const Button = () => <button className={button}>Click me!</button>;
31+
// ```
32+
// However, it is more common to use namespace imports for styles.
33+
// ```ts
34+
// import * as styles from './a.module.css';
35+
// const Button = () => <button className={styles.button}>Click me!</button>;
36+
// ```
37+
// Therefore, completion for tokens like `button` is disabled.
38+
prior.entries = prior.entries.filter((entry) => !isTokenEntry(entry));
39+
}
2340
return prior;
2441
};
2542
}
@@ -38,6 +55,10 @@ function isStylesEntryForCSSModuleFile(entry: ts.CompletionEntry, cssModuleFileN
3855
);
3956
}
4057

58+
function isTokenEntry(entry: ts.CompletionEntry) {
59+
return entry.source && isCSSModuleFile(entry.source);
60+
}
61+
4162
function isClassNamePropEntry(entry: ts.CompletionEntry) {
4263
return (
4364
entry.name === 'className' &&

packages/ts-plugin/src/language-service/proxy.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { CMKConfig } from '@css-modules-kit/core';
12
import { createExportBuilder, type MatchesPattern, type Resolver } from '@css-modules-kit/core';
23
import type { Language } from '@volar/language-core';
34
import type ts from 'typescript';
@@ -8,12 +9,14 @@ import { getApplicableRefactors, getEditsForRefactor } from './feature/refactor.
89
import { getSemanticDiagnostics } from './feature/semantic-diagnostic.js';
910
import { getSyntacticDiagnostics } from './feature/syntactic-diagnostic.js';
1011

12+
// eslint-disable-next-line max-params
1113
export function proxyLanguageService(
1214
language: Language<string>,
1315
languageService: ts.LanguageService,
1416
project: ts.server.Project,
1517
resolver: Resolver,
1618
matchesPattern: MatchesPattern,
19+
config: CMKConfig,
1720
): ts.LanguageService {
1821
const proxy: ts.LanguageService = Object.create(null);
1922

@@ -44,7 +47,7 @@ export function proxyLanguageService(
4447
);
4548
proxy.getApplicableRefactors = getApplicableRefactors(languageService, project);
4649
proxy.getEditsForRefactor = getEditsForRefactor(languageService);
47-
proxy.getCompletionsAtPosition = getCompletionsAtPosition(languageService);
50+
proxy.getCompletionsAtPosition = getCompletionsAtPosition(languageService, config);
4851
proxy.getCodeFixesAtPosition = getCodeFixesAtPosition(language, languageService, project);
4952

5053
return proxy;

0 commit comments

Comments
 (0)