Skip to content

Commit db0644b

Browse files
committed
feat(language-service): Support importing the external module's export about the angular metadata.
Enable the developer to disable the auto-import for the external module. If disabled, the completion only includes the info from the file scope and the ng-module scope.
1 parent 3914fe6 commit db0644b

File tree

7 files changed

+32
-5
lines changed

7 files changed

+32
-5
lines changed

.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU=

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
.npmrc=974837034
55
pnpm-lock.yaml=-1331107132
66
yarn.lock=-1794001287
7-
package.json=-951386062
7+
package.json=1038264142
88
pnpm-workspace.yaml=1711114604

client/src/client.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,11 @@ export class AngularLanguageClient implements vscode.Disposable {
316316
args.push('--includeCompletionsWithSnippetText');
317317
}
318318

319+
const includeCompletionsForModuleExports = config.get<boolean>('angular.suggest.autoImports');
320+
if (includeCompletionsForModuleExports) {
321+
args.push('--includeCompletionsForModuleExports');
322+
}
323+
319324
// Sort the versions from oldest to newest.
320325
const angularVersions = (await getAngularVersionsInWorkspace(this.outputChannel))
321326
.sort((a, b) => a.version.greaterThanOrEqual(b.version) ? 1 : -1);

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@
143143
"default": true,
144144
"markdownDescription": "Enable snippet completions from Angular language server. Requires using TypeScript 4.3+ in the workspace."
145145
},
146+
"angular.suggest.autoImports": {
147+
"type": "boolean",
148+
"default": true,
149+
"markdownDescription": "Enable/disable auto import suggestions."
150+
},
146151
"angular.forceStrictTemplates": {
147152
"type": "boolean",
148153
"default": false,

server/src/cmdline_utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ interface CommandLineOptions {
3636
tsdk: string|null;
3737
includeAutomaticOptionalChainCompletions: boolean;
3838
includeCompletionsWithSnippetText: boolean;
39+
includeCompletionsForModuleExports: boolean;
3940
forceStrictTemplates: boolean;
4041
disableBlockSyntax: boolean;
4142
disableLetSyntax: boolean;
@@ -55,6 +56,7 @@ export function parseCommandLine(argv: string[]): CommandLineOptions {
5556
includeAutomaticOptionalChainCompletions:
5657
hasArgument(argv, '--includeAutomaticOptionalChainCompletions'),
5758
includeCompletionsWithSnippetText: hasArgument(argv, '--includeCompletionsWithSnippetText'),
59+
includeCompletionsForModuleExports: hasArgument(argv, '--includeCompletionsForModuleExports'),
5860
forceStrictTemplates: hasArgument(argv, '--forceStrictTemplates'),
5961
disableBlockSyntax: hasArgument(argv, '--disableBlockSyntax'),
6062
disableLetSyntax: hasArgument(argv, '--disableLetSyntax'),

server/src/completion.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ export interface NgCompletionOriginData {
4747

4848
filePath: string;
4949
position: lsp.Position;
50+
51+
tsData?: ts.CompletionEntryData;
5052
}
5153

5254
/**
@@ -135,6 +137,7 @@ export function tsCompletionEntryToLspCompletionItem(
135137
kind: 'ngCompletionOriginData',
136138
filePath: scriptInfo.fileName,
137139
position,
140+
tsData: entry.data,
138141
} as NgCompletionOriginData;
139142
return item;
140143
}

server/src/server.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ function main() {
4747
logToConsole: options.logToConsole,
4848
includeAutomaticOptionalChainCompletions: options.includeAutomaticOptionalChainCompletions,
4949
includeCompletionsWithSnippetText: options.includeCompletionsWithSnippetText,
50+
includeCompletionsForModuleExports: options.includeCompletionsForModuleExports,
5051
forceStrictTemplates: isG3 || options.forceStrictTemplates,
5152
disableBlockSyntax: options.disableBlockSyntax,
5253
disableLetSyntax: options.disableLetSyntax,

server/src/session.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export interface SessionOptions {
3232
logToConsole: boolean;
3333
includeAutomaticOptionalChainCompletions: boolean;
3434
includeCompletionsWithSnippetText: boolean;
35+
includeCompletionsForModuleExports: boolean;
3536
forceStrictTemplates: boolean;
3637
disableBlockSyntax: boolean;
3738
disableLetSyntax: boolean;
@@ -49,7 +50,7 @@ const EMPTY_RANGE = lsp.Range.create(0, 0, 0, 0);
4950
const setImmediateP = promisify(setImmediate);
5051

5152
const defaultFormatOptions: ts.FormatCodeSettings = {};
52-
const defaultPreferences: ts.UserPreferences = {};
53+
let defaultPreferences: ts.UserPreferences = {};
5354

5455
const htmlLS = getHTMLLanguageService();
5556

@@ -70,6 +71,7 @@ export class Session {
7071
private readonly openFiles = new MruTracker();
7172
private readonly includeAutomaticOptionalChainCompletions: boolean;
7273
private readonly includeCompletionsWithSnippetText: boolean;
74+
private readonly includeCompletionsForModuleExports: boolean;
7375
private snippetSupport: boolean|undefined;
7476
private diagnosticsTimeout: NodeJS.Timeout|null = null;
7577
private isProjectLoading = false;
@@ -86,8 +88,14 @@ export class Session {
8688
this.includeAutomaticOptionalChainCompletions =
8789
options.includeAutomaticOptionalChainCompletions;
8890
this.includeCompletionsWithSnippetText = options.includeCompletionsWithSnippetText;
91+
this.includeCompletionsForModuleExports = options.includeCompletionsForModuleExports;
8992
this.logger = options.logger;
9093
this.logToConsole = options.logToConsole;
94+
defaultPreferences =
95+
{
96+
...defaultPreferences,
97+
includeCompletionsForModuleExports: options.includeCompletionsForModuleExports,
98+
}
9199
// Create a connection for the server. The connection uses Node's IPC as a transport.
92100
this.connection = lsp.createConnection({
93101
// cancelUndispatched is a "middleware" to handle all cancellation requests.
@@ -150,6 +158,7 @@ export class Session {
150158
// We don't want the AutoImportProvider projects to be created. See
151159
// https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/#smarter-auto-imports
152160
includePackageJsonAutoImports: 'off',
161+
includeCompletionsForModuleExports: this.includeCompletionsForModuleExports,
153162
},
154163
watchOptions: {
155164
// Used as watch options when not specified by user's `tsconfig`.
@@ -1234,12 +1243,14 @@ export class Session {
12341243
let options: ts.GetCompletionsAtPositionOptions = {};
12351244
const includeCompletionsWithSnippetText =
12361245
this.includeCompletionsWithSnippetText && this.snippetSupport;
1237-
if (this.includeAutomaticOptionalChainCompletions || includeCompletionsWithSnippetText) {
1246+
if (this.includeAutomaticOptionalChainCompletions || includeCompletionsWithSnippetText ||
1247+
this.includeCompletionsForModuleExports) {
12381248
options = {
12391249
includeAutomaticOptionalChainCompletions: this.includeAutomaticOptionalChainCompletions,
12401250
includeCompletionsWithSnippetText: includeCompletionsWithSnippetText,
12411251
includeCompletionsWithInsertText:
12421252
this.includeAutomaticOptionalChainCompletions || includeCompletionsWithSnippetText,
1253+
includeCompletionsForModuleExports: this.includeCompletionsForModuleExports,
12431254
};
12441255
}
12451256

@@ -1269,8 +1280,8 @@ export class Session {
12691280

12701281
const offset = lspPositionToTsPosition(scriptInfo, position);
12711282
const details = languageService.getCompletionEntryDetails(
1272-
filePath, offset, item.insertText ?? item.label, undefined, undefined, undefined,
1273-
undefined);
1283+
filePath, offset, item.insertText ?? item.label, undefined, undefined, defaultPreferences,
1284+
data.tsData);
12741285
if (details === undefined) {
12751286
return item;
12761287
}

0 commit comments

Comments
 (0)