Skip to content

Commit a4d3bdd

Browse files
committed
Inspect all possible module paths when looking for the best one to create a specifier with (microsoft#25850)
* Inspect all possible specifier paths when looking for the best one * Add missing secondary option from test
1 parent bde7115 commit a4d3bdd

13 files changed

+118
-145
lines changed

src/compiler/moduleSpecifiers.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,12 @@ namespace ts.moduleSpecifiers {
194194
const symlinks = mapDefined(files, sf =>
195195
sf.resolvedModules && firstDefinedIterator(sf.resolvedModules.values(), res =>
196196
res && res.resolvedFileName === importedFileName ? res.originalPath : undefined));
197-
return symlinks.length === 0 ? getAllModulePathsUsingIndirectSymlinks(files, getNormalizedAbsolutePath(importedFileName, host.getCurrentDirectory ? host.getCurrentDirectory() : ""), getCanonicalFileName, host) : symlinks;
197+
const cwd = host.getCurrentDirectory ? host.getCurrentDirectory() : "";
198+
const baseOptions = getAllModulePathsUsingIndirectSymlinks(files, getNormalizedAbsolutePath(importedFileName, cwd), getCanonicalFileName, host);
199+
if (symlinks.length === 0) {
200+
return baseOptions;
201+
}
202+
return deduplicate(concatenate(baseOptions, flatMap(symlinks, importedFileName => getAllModulePathsUsingIndirectSymlinks(files, getNormalizedAbsolutePath(importedFileName, cwd), getCanonicalFileName, host))));
198203
}
199204

200205
function getRelativePathNParents(relativePath: string): number {

src/harness/compiler.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ namespace compiler {
5353
public readonly js: ReadonlyMap<string, documents.TextDocument>;
5454
public readonly dts: ReadonlyMap<string, documents.TextDocument>;
5555
public readonly maps: ReadonlyMap<string, documents.TextDocument>;
56+
public symlinks?: vfs.FileSet; // Location to store original symlinks so they may be used in both original and declaration file compilations
5657

5758
private _inputs: documents.TextDocument[] = [];
5859
private _inputsAndOutputs: collections.SortedMap<string, CompilationOutput>;

src/harness/harness.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,9 @@ namespace Harness {
12201220
fs.apply(symlinks);
12211221
}
12221222
const host = new fakes.CompilerHost(fs, options);
1223-
return compiler.compileFiles(host, programFileNames, options);
1223+
const result = compiler.compileFiles(host, programFileNames, options);
1224+
result.symlinks = symlinks;
1225+
return result;
12241226
}
12251227

12261228
export interface DeclarationCompilationContext {
@@ -1261,7 +1263,7 @@ namespace Harness {
12611263
}
12621264

12631265
function addDtsFile(file: TestFile, dtsFiles: TestFile[]) {
1264-
if (vpath.isDeclaration(file.unitName)) {
1266+
if (vpath.isDeclaration(file.unitName) || vpath.isJson(file.unitName)) {
12651267
dtsFiles.push(file);
12661268
}
12671269
else if (vpath.isTypeScript(file.unitName)) {
@@ -1302,12 +1304,12 @@ namespace Harness {
13021304
}
13031305
}
13041306

1305-
export function compileDeclarationFiles(context: DeclarationCompilationContext | undefined) {
1307+
export function compileDeclarationFiles(context: DeclarationCompilationContext | undefined, symlinks: vfs.FileSet | undefined) {
13061308
if (!context) {
13071309
return;
13081310
}
13091311
const { declInputFiles, declOtherFiles, harnessSettings, options, currentDirectory } = context;
1310-
const output = compileFiles(declInputFiles, declOtherFiles, harnessSettings, options, currentDirectory);
1312+
const output = compileFiles(declInputFiles, declOtherFiles, harnessSettings, options, currentDirectory, symlinks);
13111313
return { declInputFiles, declOtherFiles, declResult: output };
13121314
}
13131315

@@ -1686,7 +1688,7 @@ namespace Harness {
16861688
const declFileContext = prepareDeclarationCompilationContext(
16871689
toBeCompiled, otherFiles, result, harnessSettings, options, /*currentDirectory*/ undefined
16881690
);
1689-
const declFileCompilationResult = compileDeclarationFiles(declFileContext);
1691+
const declFileCompilationResult = compileDeclarationFiles(declFileContext, result.symlinks);
16901692

16911693
if (declFileCompilationResult && declFileCompilationResult.declResult.diagnostics.length) {
16921694
jsCode += "\r\n\r\n//// [DtsFileErrors]\r\n";
@@ -1890,6 +1892,7 @@ namespace Harness {
18901892
for (const line of lines) {
18911893
let testMetaData: RegExpExecArray | null;
18921894
const linkMetaData = linkRegex.exec(line);
1895+
linkRegex.lastIndex = 0;
18931896
if (linkMetaData) {
18941897
if (!symlinks) symlinks = {};
18951898
symlinks[linkMetaData[2].trim()] = new vfs.Symlink(linkMetaData[1].trim());

src/testRunner/rwcRunner.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,9 @@ namespace RWC {
198198
inputFiles, otherFiles, compilerResult, /*harnessSettings*/ undefined!, compilerOptions, currentDirectory // TODO: GH#18217
199199
);
200200
// Reset compilerResult before calling into `compileDeclarationFiles` so the memory from the original compilation can be freed
201+
const links = compilerResult.symlinks;
201202
compilerResult = undefined!;
202-
const declFileCompilationResult = Harness.Compiler.compileDeclarationFiles(declContext)!;
203+
const declFileCompilationResult = Harness.Compiler.compileDeclarationFiles(declContext, links)!;
203204

204205
return Harness.Compiler.iterateErrorBaseline(tsconfigFiles.concat(declFileCompilationResult.declInputFiles, declFileCompilationResult.declOtherFiles), declFileCompilationResult.declResult.diagnostics, { caseSensitive, currentDirectory });
205206
}, baselineOpts);

tests/baselines/reference/declarationEmitHasTypesRefOnNamespaceUse.js

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,3 @@ var Src = /** @class */ (function () {
2525
/// <reference types="dep" />
2626
declare class Src implements NS.Dep {
2727
}
28-
29-
30-
//// [DtsFileErrors]
31-
32-
33-
error TS2688: Cannot find type definition file for 'dep'.
34-
/src/index.d.ts(1,23): error TS2688: Cannot find type definition file for 'dep'.
35-
/src/index.d.ts(2,30): error TS2503: Cannot find namespace 'NS'.
36-
37-
38-
!!! error TS2688: Cannot find type definition file for 'dep'.
39-
==== /src/index.d.ts (2 errors) ====
40-
/// <reference types="dep" />
41-
~~~
42-
!!! error TS2688: Cannot find type definition file for 'dep'.
43-
declare class Src implements NS.Dep {
44-
~~
45-
!!! error TS2503: Cannot find namespace 'NS'.
46-
}
47-
48-
==== /deps/dep/dep.d.ts (0 errors) ====
49-
declare namespace NS {
50-
interface Dep {
51-
}
52-
}

tests/baselines/reference/declarationEmitUnnessesaryTypeReferenceNotAdded.js

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,3 @@ exports.default = parseArgs;
4444
//// [index.d.ts]
4545
import minimist = require('minimist');
4646
export default function parseArgs(): minimist.ParsedArgs;
47-
48-
49-
//// [DtsFileErrors]
50-
51-
52-
error TS2688: Cannot find type definition file for 'minimist'.
53-
error TS2688: Cannot find type definition file for 'process'.
54-
/index.d.ts(1,27): error TS2307: Cannot find module 'minimist'.
55-
56-
57-
!!! error TS2688: Cannot find type definition file for 'minimist'.
58-
!!! error TS2688: Cannot find type definition file for 'process'.
59-
==== /index.d.ts (1 errors) ====
60-
import minimist = require('minimist');
61-
~~~~~~~~~~
62-
!!! error TS2307: Cannot find module 'minimist'.
63-
export default function parseArgs(): minimist.ParsedArgs;
64-
65-
==== /node_modules/@types/minimist/minimist.d.ts (0 errors) ====
66-
declare namespace thing {
67-
interface ParsedArgs {}
68-
}
69-
declare function thing(x: any): thing.ParsedArgs;
70-
export = thing;
71-
==== /node_modules/@types/process/process.d.ts (0 errors) ====
72-
declare const thing: any;
73-
export = thing;

tests/baselines/reference/symbolLinkDeclarationEmitModuleNames.js

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -73,44 +73,3 @@ export declare type ControllerClass = Constructor<any>;
7373
//// [usage.d.ts]
7474
import { BindingKey } from '@loopback/context';
7575
export declare const CONTROLLER_CLASS: BindingKey<import("@loopback/context/src/value-promise").Constructor<any>>;
76-
77-
78-
//// [DtsFileErrors]
79-
80-
81-
tests/cases/compiler/monorepo/context/src/bindingkey.d.ts(1,29): error TS2307: Cannot find module '@loopback/context'.
82-
tests/cases/compiler/monorepo/core/src/application.d.ts(1,29): error TS2307: Cannot find module '@loopback/context'.
83-
tests/cases/compiler/monorepo/core/src/usage.d.ts(1,28): error TS2307: Cannot find module '@loopback/context'.
84-
tests/cases/compiler/monorepo/core/src/usage.d.ts(2,58): error TS2307: Cannot find module '@loopback/context/src/value-promise'.
85-
86-
87-
==== tests/cases/compiler/monorepo/core/src/application.d.ts (1 errors) ====
88-
import { Constructor } from "@loopback/context";
89-
~~~~~~~~~~~~~~~~~~~
90-
!!! error TS2307: Cannot find module '@loopback/context'.
91-
export declare type ControllerClass = Constructor<any>;
92-
93-
==== tests/cases/compiler/monorepo/core/src/usage.d.ts (2 errors) ====
94-
import { BindingKey } from '@loopback/context';
95-
~~~~~~~~~~~~~~~~~~~
96-
!!! error TS2307: Cannot find module '@loopback/context'.
97-
export declare const CONTROLLER_CLASS: BindingKey<import("@loopback/context/src/value-promise").Constructor<any>>;
98-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
99-
!!! error TS2307: Cannot find module '@loopback/context/src/value-promise'.
100-
101-
==== /.src/tests/cases/compiler/monorepo/context/src/value-promise.d.ts (0 errors) ====
102-
export declare type Constructor<T> = (...args: any[]) => T;
103-
104-
==== /.src/tests/cases/compiler/monorepo/context/src/bindingkey.d.ts (1 errors) ====
105-
import { Constructor } from "@loopback/context";
106-
~~~~~~~~~~~~~~~~~~~
107-
!!! error TS2307: Cannot find module '@loopback/context'.
108-
export declare class BindingKey<T> {
109-
readonly __type: T;
110-
static create<T extends Constructor<any>>(ctor: T): BindingKey<T>;
111-
}
112-
113-
==== /.src/tests/cases/compiler/monorepo/context/index.d.ts (0 errors) ====
114-
export * from "./src/value-promise";
115-
export * from "./src/bindingkey";
116-
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//// [tests/cases/compiler/symbolLinkDeclarationEmitModuleNamesImportRef.ts] ////
2+
3+
//// [index.d.ts]
4+
export declare const styles: import("styled-components").InterpolationValue[];
5+
6+
//// [package.json]
7+
{
8+
"name": "styled-components",
9+
"version": "3.3.3",
10+
"typings": "typings/styled-components.d.ts"
11+
}
12+
13+
//// [styled-components.d.ts]
14+
export interface InterpolationValue {}
15+
//// [index.ts]
16+
import { styles } from "package-a";
17+
18+
export function getStyles() {
19+
return styles;
20+
}
21+
22+
23+
//// [index.js]
24+
"use strict";
25+
exports.__esModule = true;
26+
var package_a_1 = require("package-a");
27+
function getStyles() {
28+
return package_a_1.styles;
29+
}
30+
exports.getStyles = getStyles;
31+
32+
33+
//// [index.d.ts]
34+
export declare function getStyles(): import("styled-components").InterpolationValue[];
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
=== tests/cases/compiler/Folder/monorepo/core/index.ts ===
2+
import { styles } from "package-a";
3+
>styles : Symbol(styles, Decl(index.ts, 0, 8))
4+
5+
export function getStyles() {
6+
>getStyles : Symbol(getStyles, Decl(index.ts, 0, 35))
7+
8+
return styles;
9+
>styles : Symbol(styles, Decl(index.ts, 0, 8))
10+
}
11+
12+
=== tests/cases/compiler/Folder/monorepo/package-a/index.d.ts ===
13+
export declare const styles: import("styled-components").InterpolationValue[];
14+
>styles : Symbol(styles, Decl(index.d.ts, 0, 20))
15+
>InterpolationValue : Symbol(InterpolationValue, Decl(styled-components.d.ts, 0, 0))
16+
17+
=== tests/cases/compiler/Folder/node_modules/styled-components/typings/styled-components.d.ts ===
18+
export interface InterpolationValue {}
19+
>InterpolationValue : Symbol(InterpolationValue, Decl(styled-components.d.ts, 0, 0))
20+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
=== tests/cases/compiler/Folder/monorepo/core/index.ts ===
2+
import { styles } from "package-a";
3+
>styles : import("tests/cases/compiler/Folder/node_modules/styled-components/typings/styled-components").InterpolationValue[]
4+
5+
export function getStyles() {
6+
>getStyles : () => import("tests/cases/compiler/Folder/node_modules/styled-components/typings/styled-components").InterpolationValue[]
7+
8+
return styles;
9+
>styles : import("tests/cases/compiler/Folder/node_modules/styled-components/typings/styled-components").InterpolationValue[]
10+
}
11+
12+
=== tests/cases/compiler/Folder/monorepo/package-a/index.d.ts ===
13+
export declare const styles: import("styled-components").InterpolationValue[];
14+
>styles : import("tests/cases/compiler/Folder/node_modules/styled-components/typings/styled-components").InterpolationValue[]
15+
>InterpolationValue : import("tests/cases/compiler/Folder/node_modules/styled-components/typings/styled-components").InterpolationValue
16+
17+
=== tests/cases/compiler/Folder/node_modules/styled-components/typings/styled-components.d.ts ===
18+
export interface InterpolationValue {}
19+
>InterpolationValue : InterpolationValue
20+

tests/baselines/reference/symbolLinkDeclarationEmitModuleNamesRootDir.js

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -40,48 +40,3 @@ export declare type ControllerClass = Constructor<any>;
4040
//// [usage.d.ts]
4141
import { BindingKey } from '@loopback/context';
4242
export declare const CONTROLLER_CLASS: BindingKey<import("@loopback/context/src/value-promise").Constructor<any>>;
43-
44-
45-
//// [DtsFileErrors]
46-
47-
48-
tests/cases/compiler/monorepo/core/dist/src/application.d.ts(1,29): error TS2307: Cannot find module '@loopback/context'.
49-
tests/cases/compiler/monorepo/core/dist/src/usage.d.ts(1,28): error TS2307: Cannot find module '@loopback/context'.
50-
tests/cases/compiler/monorepo/core/dist/src/usage.d.ts(2,58): error TS2307: Cannot find module '@loopback/context/src/value-promise'.
51-
52-
53-
==== tests/cases/compiler/monorepo/core/tsconfig.json (0 errors) ====
54-
{
55-
"compilerOptions": {
56-
"rootDir": ".",
57-
"declaration": true,
58-
"outDir": "./dist"
59-
}
60-
}
61-
==== tests/cases/compiler/monorepo/context/src/value-promise.d.ts (0 errors) ====
62-
export type Constructor<T> = (...args: any[]) => T;
63-
==== tests/cases/compiler/monorepo/context/src/bindingkey.d.ts (0 errors) ====
64-
import { Constructor } from "./value-promise"
65-
export declare class BindingKey<T> {
66-
readonly __type: T;
67-
static create<T extends Constructor<any>>(ctor: T): BindingKey<T>;
68-
}
69-
70-
==== tests/cases/compiler/monorepo/context/index.d.ts (0 errors) ====
71-
export * from "./src/value-promise";
72-
export * from "./src/bindingkey";
73-
74-
==== tests/cases/compiler/monorepo/core/dist/src/application.d.ts (1 errors) ====
75-
import { Constructor } from "@loopback/context";
76-
~~~~~~~~~~~~~~~~~~~
77-
!!! error TS2307: Cannot find module '@loopback/context'.
78-
export declare type ControllerClass = Constructor<any>;
79-
80-
==== tests/cases/compiler/monorepo/core/dist/src/usage.d.ts (2 errors) ====
81-
import { BindingKey } from '@loopback/context';
82-
~~~~~~~~~~~~~~~~~~~
83-
!!! error TS2307: Cannot find module '@loopback/context'.
84-
export declare const CONTROLLER_CLASS: BindingKey<import("@loopback/context/src/value-promise").Constructor<any>>;
85-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
86-
!!! error TS2307: Cannot find module '@loopback/context/src/value-promise'.
87-
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// @declaration: true
2+
// @useCaseSensitiveFileNames: false
3+
// @noImplicitReferences: true
4+
// @filename: Folder/monorepo/package-a/index.d.ts
5+
export declare const styles: import("styled-components").InterpolationValue[];
6+
7+
// @filename: Folder/node_modules/styled-components/package.json
8+
{
9+
"name": "styled-components",
10+
"version": "3.3.3",
11+
"typings": "typings/styled-components.d.ts"
12+
}
13+
14+
// @filename: Folder/node_modules/styled-components/typings/styled-components.d.ts
15+
export interface InterpolationValue {}
16+
// @filename: Folder/monorepo/core/index.ts
17+
import { styles } from "package-a";
18+
19+
export function getStyles() {
20+
return styles;
21+
}
22+
23+
// @link: tests/cases/compiler/Folder/node_modules/styled-components -> tests/cases/compiler/Folder/monorepo/package-a/node_modules/styled-components
24+
// @link: tests/cases/compiler/Folder/monorepo/package-a -> tests/cases/compiler/Folder/monorepo/core/node_modules/package-a

tests/cases/fourslash/importNameCodeFix_symlink.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,8 @@ goTo.file("/b.ts");
1818
verify.importFixAtPosition([
1919
`import { foo } from "link";
2020
21+
foo;`,
22+
`import { foo } from "real";
23+
2124
foo;`,
2225
]);

0 commit comments

Comments
 (0)