Skip to content

Commit 5f72495

Browse files
committed
Perform circular resolution correctly
1 parent abd03c4 commit 5f72495

File tree

5 files changed

+100
-2
lines changed

5 files changed

+100
-2
lines changed

src/compiler/program.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1565,8 +1565,8 @@ namespace ts {
15651565
const searchPath = combinePaths(primaryPath, ref.fileName);
15661566
const resolvedFile = findLibraryDefinition(searchPath);
15671567
if (resolvedFile) {
1568-
processSourceFile(resolvedFile, /*isDefaultLib*/ false, /*isReference*/ true, file, ref.pos, ref.end);
15691568
resolvedLibraries[ref.fileName] = { primary: true, resolvedFileName: resolvedFile };
1569+
processSourceFile(resolvedFile, /*isDefaultLib*/ false, /*isReference*/ true, file, ref.pos, ref.end);
15701570
foundIt = true;
15711571
break;
15721572
}
@@ -1591,8 +1591,8 @@ namespace ts {
15911591
}
15921592
else {
15931593
// First resolution of this library
1594-
processSourceFile(secondaryResult, /*isDefaultLib*/ false, /*isReference*/ true, file, ref.pos, ref.end);
15951594
resolvedLibraries[ref.fileName] = { primary: false, resolvedFileName: secondaryResult };
1595+
processSourceFile(secondaryResult, /*isDefaultLib*/ false, /*isReference*/ true, file, ref.pos, ref.end);
15961596
}
15971597
}
15981598
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//// [tests/cases/conformance/references/library-reference-8.ts] ////
2+
3+
//// [index.d.ts]
4+
5+
// Don't crash in circular library reference situations
6+
7+
/// <reference library="beta" />
8+
declare var alpha: { a: string };
9+
10+
//// [index.d.ts]
11+
/// <reference library="alpha" />
12+
declare var beta: { b: string };
13+
14+
//// [foo.ts]
15+
/// <reference library="alpha" />
16+
/// <reference library="beta" />
17+
var x: string = alpha.a + beta.b;
18+
19+
20+
21+
//// [foo.js]
22+
/// <reference library="alpha" />
23+
/// <reference library="beta" />
24+
var x = alpha.a + beta.b;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
=== tests/cases/conformance/references/foo.ts ===
2+
/// <reference library="alpha" />
3+
/// <reference library="beta" />
4+
var x: string = alpha.a + beta.b;
5+
>x : Symbol(x, Decl(foo.ts, 2, 3))
6+
>alpha.a : Symbol(a, Decl(index.d.ts, 4, 20))
7+
>alpha : Symbol(alpha, Decl(index.d.ts, 4, 11))
8+
>a : Symbol(a, Decl(index.d.ts, 4, 20))
9+
>beta.b : Symbol(b, Decl(index.d.ts, 1, 19))
10+
>beta : Symbol(beta, Decl(index.d.ts, 1, 11))
11+
>b : Symbol(b, Decl(index.d.ts, 1, 19))
12+
13+
14+
=== tests/cases/conformance/references/typings/alpha/index.d.ts ===
15+
16+
// Don't crash in circular library reference situations
17+
18+
/// <reference library="beta" />
19+
declare var alpha: { a: string };
20+
>alpha : Symbol(alpha, Decl(index.d.ts, 4, 11))
21+
>a : Symbol(a, Decl(index.d.ts, 4, 20))
22+
23+
=== tests/cases/conformance/references/typings/beta/index.d.ts ===
24+
/// <reference library="alpha" />
25+
declare var beta: { b: string };
26+
>beta : Symbol(beta, Decl(index.d.ts, 1, 11))
27+
>b : Symbol(b, Decl(index.d.ts, 1, 19))
28+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
=== tests/cases/conformance/references/foo.ts ===
2+
/// <reference library="alpha" />
3+
/// <reference library="beta" />
4+
var x: string = alpha.a + beta.b;
5+
>x : string
6+
>alpha.a + beta.b : string
7+
>alpha.a : string
8+
>alpha : { a: string; }
9+
>a : string
10+
>beta.b : string
11+
>beta : { b: string; }
12+
>b : string
13+
14+
15+
=== tests/cases/conformance/references/typings/alpha/index.d.ts ===
16+
17+
// Don't crash in circular library reference situations
18+
19+
/// <reference library="beta" />
20+
declare var alpha: { a: string };
21+
>alpha : { a: string; }
22+
>a : string
23+
24+
=== tests/cases/conformance/references/typings/beta/index.d.ts ===
25+
/// <reference library="alpha" />
26+
declare var beta: { b: string };
27+
>beta : { b: string; }
28+
>b : string
29+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// @noImplicitReferences: true
2+
3+
// Don't crash in circular library reference situations
4+
5+
// @filename: typings/alpha/index.d.ts
6+
/// <reference library="beta" />
7+
declare var alpha: { a: string };
8+
9+
// @filename: typings/beta/index.d.ts
10+
/// <reference library="alpha" />
11+
declare var beta: { b: string };
12+
13+
// @filename: foo.ts
14+
/// <reference library="alpha" />
15+
/// <reference library="beta" />
16+
var x: string = alpha.a + beta.b;
17+

0 commit comments

Comments
 (0)