diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3228b6bf1dff4..e98d96b6fed34 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7270,7 +7270,7 @@ namespace ts { // Handle variable, parameter or property if (!pushTypeResolution(symbol, TypeSystemPropertyName.Type)) { // Symbol is property of some kind that is merged with something - should use `getTypeOfFuncClassEnumModule` and not `getTypeOfVariableOrParameterOrProperty` - if (symbol.flags & SymbolFlags.ValueModule) { + if (symbol.flags & SymbolFlags.ValueModule && !(symbol.flags & SymbolFlags.Assignment)) { return getTypeOfFuncClassEnumModule(symbol); } return reportCircularityError(symbol); @@ -7340,7 +7340,7 @@ namespace ts { if (!popTypeResolution()) { // Symbol is property of some kind that is merged with something - should use `getTypeOfFuncClassEnumModule` and not `getTypeOfVariableOrParameterOrProperty` - if (symbol.flags & SymbolFlags.ValueModule) { + if (symbol.flags & SymbolFlags.ValueModule && !(symbol.flags & SymbolFlags.Assignment)) { return getTypeOfFuncClassEnumModule(symbol); } return reportCircularityError(symbol); diff --git a/tests/baselines/reference/circularMultipleAssignmentDeclaration.symbols b/tests/baselines/reference/circularMultipleAssignmentDeclaration.symbols new file mode 100644 index 0000000000000..c298d31ee7c0c --- /dev/null +++ b/tests/baselines/reference/circularMultipleAssignmentDeclaration.symbols @@ -0,0 +1,15 @@ +=== tests/cases/conformance/salsa/circularMultipleAssignmentDeclaration.js === +ns.next = ns.next || { shared: {} }; +>ns.next : Symbol(ns.next, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 1, 3)) +>ns : Symbol(ns, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 0, 36)) +>next : Symbol(ns.next, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 1, 3)) +>ns.next : Symbol(ns.next, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 1, 3)) +>ns : Symbol(ns, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 0, 36)) +>next : Symbol(ns.next, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 1, 3)) +>shared : Symbol(shared, Decl(circularMultipleAssignmentDeclaration.js, 0, 22)) + +ns.next.shared.mymethod = {}; +>ns.next : Symbol(ns.next, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 1, 3)) +>ns : Symbol(ns, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 0, 36)) +>next : Symbol(ns.next, Decl(circularMultipleAssignmentDeclaration.js, 0, 0), Decl(circularMultipleAssignmentDeclaration.js, 1, 3)) + diff --git a/tests/baselines/reference/circularMultipleAssignmentDeclaration.types b/tests/baselines/reference/circularMultipleAssignmentDeclaration.types new file mode 100644 index 0000000000000..6b5239ed4e475 --- /dev/null +++ b/tests/baselines/reference/circularMultipleAssignmentDeclaration.types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/salsa/circularMultipleAssignmentDeclaration.js === +ns.next = ns.next || { shared: {} }; +>ns.next = ns.next || { shared: {} } : any +>ns.next : any +>ns : typeof ns +>next : any +>ns.next || { shared: {} } : any +>ns.next : any +>ns : typeof ns +>next : any +>{ shared: {} } : { shared: {}; } +>shared : {} +>{} : {} + +ns.next.shared.mymethod = {}; +>ns.next.shared.mymethod = {} : {} +>ns.next.shared.mymethod : any +>ns.next.shared : any +>ns.next : any +>ns : typeof ns +>next : any +>shared : any +>mymethod : any +>{} : {} + diff --git a/tests/cases/conformance/salsa/circularMultipleAssignmentDeclaration.ts b/tests/cases/conformance/salsa/circularMultipleAssignmentDeclaration.ts new file mode 100644 index 0000000000000..bc2c992dafcc8 --- /dev/null +++ b/tests/cases/conformance/salsa/circularMultipleAssignmentDeclaration.ts @@ -0,0 +1,6 @@ +// @filename:circularMultipleAssignmentDeclaration.js +// @allowJs: true +// @checkJs: true +// @noEmit: true +ns.next = ns.next || { shared: {} }; +ns.next.shared.mymethod = {};