Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions src/harness/fourslashImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -879,7 +879,13 @@ namespace FourSlash {
nameToEntries.set(entry.name, [entry]);
}
else {
if (entries.some(e => e.source === entry.source && this.deepEqual(e.data, entry.data))) {
if (entries.some(e =>
e.source === entry.source &&
e.data?.exportName === entry.data?.exportName &&
e.data?.fileName === entry.data?.fileName &&
e.data?.moduleSpecifier === entry.data?.moduleSpecifier &&
e.data?.ambientModuleName === entry.data?.ambientModuleName
)) {
this.raiseError(`Duplicate completions for ${entry.name}`);
}
entries.push(entry);
Expand Down Expand Up @@ -1280,16 +1286,6 @@ namespace FourSlash {

}

private deepEqual(a: unknown, b: unknown) {
try {
this.assertObjectsEqual(a, b);
return true;
}
catch {
return false;
}
}

public verifyDisplayPartsOfReferencedSymbol(expected: ts.SymbolDisplayPart[]) {
const referencedSymbols = this.findReferencesAtCaret()!;

Expand Down
19 changes: 12 additions & 7 deletions src/server/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1928,20 +1928,25 @@ namespace ts.server {
}
}

/*@internal*/
static readonly compilerOptionsOverrides: CompilerOptions = {
diagnostics: false,
skipLibCheck: true,
sourceMap: false,
types: ts.emptyArray,
lib: ts.emptyArray,
noLib: true,
};

/*@internal*/
static create(dependencySelection: PackageJsonAutoImportPreference, hostProject: Project, moduleResolutionHost: ModuleResolutionHost, documentRegistry: DocumentRegistry): AutoImportProviderProject | undefined {
if (dependencySelection === PackageJsonAutoImportPreference.Off) {
return undefined;
}

const compilerOptions: CompilerOptions = {
const compilerOptions = {
...hostProject.getCompilerOptions(),
noLib: true,
diagnostics: false,
skipLibCheck: true,
types: ts.emptyArray,
lib: ts.emptyArray,
sourceMap: false,
...this.compilerOptionsOverrides,
};

const rootNames = this.getRootFileNames(dependencySelection, hostProject, moduleResolutionHost, compilerOptions);
Expand Down
9 changes: 9 additions & 0 deletions src/testRunner/unittests/tsserver/autoImportProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,15 @@ namespace ts.projectSystem {
assert.isDefined(projectService.configuredProjects.get("/packages/a/tsconfig.json")!.getPackageJsonAutoImportProvider());
assert.isDefined(projectService.configuredProjects.get("/packages/a/tsconfig.json")!.getPackageJsonAutoImportProvider());
});

it("Can use the same document registry bucket key as main program", () => {
for (const option of sourceFileAffectingCompilerOptions) {
assert(
!hasProperty(server.AutoImportProviderProject.compilerOptionsOverrides, option.name),
`'${option.name}' may cause AutoImportProviderProject not to share source files with main program`
);
}
});
});

function setup(files: File[]) {
Expand Down
36 changes: 36 additions & 0 deletions tests/cases/fourslash/server/autoImportProvider6.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/// <reference path="../fourslash.ts" />

// @Filename: /tsconfig.json
//// { "compilerOptions": { "module": "commonjs", "lib": ["es2019"] } }

// @Filename: /package.json
//// { "dependencies": { "antd": "*", "react": "*" } }

// @Filename: /node_modules/@types/react/index.d.ts
//// export declare function Component(): void;

// @Filename: /node_modules/antd/index.d.ts
//// import "react";

// @Filename: /index.ts
//// Component/**/

// react/index.d.ts will be in both the auto import provider program
// and the main program, and will result in duplicate completions
// unless the two programs successfully share the same source file.
// This tests the configuration of the AutoImportProviderProject.
// See also the 'Can use the same document registry bucket key as main program'
// unit test in autoImportProvider.ts.
goTo.marker("");
verify.completions({
marker: "",
includes: [{
name: "Component",
hasAction: true,
source: "/node_modules/@types/react/index",
sortText: completion.SortText.AutoImportSuggestions,
}],
preferences: {
includeCompletionsForModuleExports: true,
},
});