Skip to content

Commit 4ef662f

Browse files
committed
Defer new check until after everything else has run
1 parent 538130f commit 4ef662f

34 files changed

+700
-1921
lines changed

src/compiler/checker.ts

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2213,6 +2213,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
22132213
var potentialReflectCollisions: Node[] = [];
22142214
var potentialUnusedRenamedBindingElementsInTypes: BindingElement[] = [];
22152215
var awaitedTypeStack: number[] = [];
2216+
var ambiguousVariableDeclarationsWhenWidened: [node: ParameterDeclaration | PropertyDeclaration | PropertySignature | VariableDeclaration | BindingElement, type: Type, widenedLiteralType: Type][] = [];
22162217

22172218
var diagnostics = createDiagnosticCollection();
22182219
var suggestionDiagnostics = createDiagnosticCollection();
@@ -41978,28 +41979,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4197841979
return hasEffectiveModifier(node, ModifierFlags.Private) || isPrivateIdentifierClassElementDeclaration(node);
4197941980
}
4198041981

41981-
function isVisibleExternally(elem: ParameterDeclaration | PropertyDeclaration | PropertySignature | VariableDeclaration | BindingElement | OmittedExpression): boolean {
41982-
if (isOmittedExpression(elem)) {
41983-
return false;
41984-
}
41985-
if (isBindingPattern(elem.name)) {
41986-
return some(elem.name.elements, isVisibleExternally);
41987-
}
41988-
else {
41989-
return isDeclarationVisible(elem);
41990-
}
41991-
}
41992-
4199341982
if (
4199441983
getEmitDeclarations(compilerOptions)
4199541984
&& !(symbol.flags & (SymbolFlags.TypeLiteral | SymbolFlags.Signature))
4199641985
&& !shouldPrintWithInitializer(node)
4199741986
&& !isPrivateDeclaration(node)
41998-
&& isVisibleExternally(node)
4199941987
) {
4200041988
const widenedLiteralType = getWidenedLiteralType(type);
4200141989
if (!isTypeIdenticalTo(type, widenedLiteralType)) {
42002-
error(node.name, Diagnostics.The_type_of_this_declaration_is_ambiguous_and_may_be_observed_as_either_0_or_1, typeToString(widenedLiteralType), typeToString(type));
41990+
ambiguousVariableDeclarationsWhenWidened.push([node, type, widenedLiteralType]);
4200341991
}
4200441992
}
4200541993
}
@@ -46079,6 +46067,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4607946067
clear(potentialWeakMapSetCollisions);
4608046068
clear(potentialReflectCollisions);
4608146069
clear(potentialUnusedRenamedBindingElementsInTypes);
46070+
clear(ambiguousVariableDeclarationsWhenWidened);
4608246071

4608346072
forEach(node.statements, checkSourceElement);
4608446073
checkSourceElement(node.endOfFileToken);
@@ -46103,6 +46092,26 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4610346092
}
4610446093
});
4610546094

46095+
addLazyDiagnostic(() => {
46096+
function isVisibleExternally(elem: ParameterDeclaration | PropertyDeclaration | PropertySignature | VariableDeclaration | BindingElement | OmittedExpression): boolean {
46097+
if (isOmittedExpression(elem)) {
46098+
return false;
46099+
}
46100+
if (isBindingPattern(elem.name)) {
46101+
return some(elem.name.elements, isVisibleExternally);
46102+
}
46103+
else {
46104+
return isDeclarationVisible(elem);
46105+
}
46106+
}
46107+
46108+
for (const [node, type, widenedLiteralType] of ambiguousVariableDeclarationsWhenWidened) {
46109+
if (isVisibleExternally(node)) {
46110+
error(node.name, Diagnostics.The_type_of_this_declaration_is_ambiguous_and_may_be_observed_as_either_0_or_1, typeToString(widenedLiteralType), typeToString(type));
46111+
}
46112+
}
46113+
});
46114+
4610646115
if (
4610746116
compilerOptions.importsNotUsedAsValues === ImportsNotUsedAsValues.Error &&
4610846117
!node.isDeclarationFile &&
@@ -46135,6 +46144,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4613546144
clear(potentialReflectCollisions);
4613646145
}
4613746146

46147+
if (ambiguousVariableDeclarationsWhenWidened.length) {
46148+
// forEach(potentialAmbiguousDeclarationsWhenWidened, checkAmbiguousDeclaration);
46149+
clear(ambiguousVariableDeclarationsWhenWidened);
46150+
}
46151+
4613846152
links.flags |= NodeCheckFlags.TypeChecked;
4613946153
}
4614046154
}

tests/baselines/reference/declFileExportAssignmentImportInternalModule.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@ module.exports = m;
3434

3535
//// [declFileExportAssignmentImportInternalModule.d.ts]
3636
declare namespace m3 {
37+
namespace m2 {
38+
interface connectModule {
39+
(res: any, req: any, next: any): void;
40+
}
41+
interface connectExport {
42+
use: (mod: connectModule) => connectExport;
43+
listen: (port: number) => void;
44+
}
45+
}
46+
var server: {
47+
(): m2.connectExport;
48+
test1: m2.connectModule;
49+
test2(): m2.connectModule;
50+
};
3751
}
3852
import m = m3;
3953
export = m;

tests/baselines/reference/declFileImportModuleWithExportAssignment.js

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ exports.a.test1(null, null, null);
4141

4242
//// [declFileImportModuleWithExportAssignment_0.d.ts]
4343
declare namespace m2 {
44+
interface connectModule {
45+
(res: any, req: any, next: any): void;
46+
}
47+
interface connectExport {
48+
use: (mod: connectModule) => connectExport;
49+
listen: (port: number) => void;
50+
}
4451
}
4552
declare var m2: {
4653
(): m2.connectExport;
@@ -56,47 +63,3 @@ export declare var a: {
5663
test1: a1.connectModule;
5764
test2(): a1.connectModule;
5865
};
59-
60-
61-
//// [DtsFileErrors]
62-
63-
64-
declFileImportModuleWithExportAssignment_0.d.ts(4,12): error TS2694: Namespace 'm2' has no exported member 'connectExport'.
65-
declFileImportModuleWithExportAssignment_0.d.ts(5,15): error TS2694: Namespace 'm2' has no exported member 'connectModule'.
66-
declFileImportModuleWithExportAssignment_0.d.ts(6,17): error TS2694: Namespace 'm2' has no exported member 'connectModule'.
67-
declFileImportModuleWithExportAssignment_1.d.ts(4,12): error TS2694: Namespace 'm2' has no exported member 'connectExport'.
68-
declFileImportModuleWithExportAssignment_1.d.ts(5,15): error TS2694: Namespace 'm2' has no exported member 'connectModule'.
69-
declFileImportModuleWithExportAssignment_1.d.ts(6,17): error TS2694: Namespace 'm2' has no exported member 'connectModule'.
70-
71-
72-
==== declFileImportModuleWithExportAssignment_1.d.ts (3 errors) ====
73-
/**This is on import declaration*/
74-
import a1 = require("./declFileImportModuleWithExportAssignment_0");
75-
export declare var a: {
76-
(): a1.connectExport;
77-
~~~~~~~~~~~~~
78-
!!! error TS2694: Namespace 'm2' has no exported member 'connectExport'.
79-
test1: a1.connectModule;
80-
~~~~~~~~~~~~~
81-
!!! error TS2694: Namespace 'm2' has no exported member 'connectModule'.
82-
test2(): a1.connectModule;
83-
~~~~~~~~~~~~~
84-
!!! error TS2694: Namespace 'm2' has no exported member 'connectModule'.
85-
};
86-
87-
==== declFileImportModuleWithExportAssignment_0.d.ts (3 errors) ====
88-
declare namespace m2 {
89-
}
90-
declare var m2: {
91-
(): m2.connectExport;
92-
~~~~~~~~~~~~~
93-
!!! error TS2694: Namespace 'm2' has no exported member 'connectExport'.
94-
test1: m2.connectModule;
95-
~~~~~~~~~~~~~
96-
!!! error TS2694: Namespace 'm2' has no exported member 'connectModule'.
97-
test2(): m2.connectModule;
98-
~~~~~~~~~~~~~
99-
!!! error TS2694: Namespace 'm2' has no exported member 'connectModule'.
100-
};
101-
export = m2;
102-

tests/baselines/reference/declarationEmitImportInExportAssignmentModule.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,11 @@ module.exports = m;
3030

3131
//// [declarationEmitImportInExportAssignmentModule.d.ts]
3232
declare namespace m {
33+
namespace c {
34+
class c {
35+
}
36+
}
37+
import x = c;
38+
var a: typeof x;
3339
}
3440
export = m;

tests/baselines/reference/declarationMaps.js

Lines changed: 8 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/baselines/reference/declarationMaps.js.map

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)