diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 27ec079f614ab..8b04eb6226461 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -3432,6 +3432,9 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void { bindExportsPropertyAssignment(node as BindableStaticPropertyAssignmentExpression); } else if (hasDynamicName(node)) { + if (!parentSymbol) { + return; + } bindAnonymousDeclaration(node, SymbolFlags.Property | SymbolFlags.Assignment, InternalSymbolName.Computed); const sym = bindPotentiallyMissingNamespaces(parentSymbol, node.left.expression, isTopLevelNamespaceAssignment(node.left), /*isPrototypeProperty*/ false, /*containerIsClass*/ false); addLateBoundAssignmentDeclarationToSymbol(node, sym); diff --git a/tests/baselines/reference/lateboundWindowToplevelAssignment.symbols b/tests/baselines/reference/lateboundWindowToplevelAssignment.symbols new file mode 100644 index 0000000000000..f1779520e44c5 --- /dev/null +++ b/tests/baselines/reference/lateboundWindowToplevelAssignment.symbols @@ -0,0 +1,14 @@ +//// [tests/cases/conformance/salsa/lateboundWindowToplevelAssignment.ts] //// + +=== lateboundWindowToplevelAssignment.js === +const UPDATE_MARKER_FUNC = 'updateMarkerPosition'; +>UPDATE_MARKER_FUNC : Symbol(UPDATE_MARKER_FUNC, Decl(lateboundWindowToplevelAssignment.js, 0, 5)) + +window[UPDATE_MARKER_FUNC] = () => {}; +>window : Symbol(window, Decl(lib.dom.d.ts, --, --)) +>UPDATE_MARKER_FUNC : Symbol(UPDATE_MARKER_FUNC, Decl(lateboundWindowToplevelAssignment.js, 0, 5)) + +window[UPDATE_MARKER_FUNC](); +>window : Symbol(window, Decl(lib.dom.d.ts, --, --)) +>UPDATE_MARKER_FUNC : Symbol(UPDATE_MARKER_FUNC, Decl(lateboundWindowToplevelAssignment.js, 0, 5)) + diff --git a/tests/baselines/reference/lateboundWindowToplevelAssignment.types b/tests/baselines/reference/lateboundWindowToplevelAssignment.types new file mode 100644 index 0000000000000..1f9ab09aaebe8 --- /dev/null +++ b/tests/baselines/reference/lateboundWindowToplevelAssignment.types @@ -0,0 +1,28 @@ +//// [tests/cases/conformance/salsa/lateboundWindowToplevelAssignment.ts] //// + +=== lateboundWindowToplevelAssignment.js === +const UPDATE_MARKER_FUNC = 'updateMarkerPosition'; +>UPDATE_MARKER_FUNC : "updateMarkerPosition" +> : ^^^^^^^^^^^^^^^^^^^^^^ +>'updateMarkerPosition' : "updateMarkerPosition" +> : ^^^^^^^^^^^^^^^^^^^^^^ + +window[UPDATE_MARKER_FUNC] = () => {}; +>window[UPDATE_MARKER_FUNC] = () => {} : () => void +> : ^^^^^^^^^^ +>window[UPDATE_MARKER_FUNC] : error +>window : Window & typeof globalThis +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>UPDATE_MARKER_FUNC : "updateMarkerPosition" +> : ^^^^^^^^^^^^^^^^^^^^^^ +>() => {} : () => void +> : ^^^^^^^^^^ + +window[UPDATE_MARKER_FUNC](); +>window[UPDATE_MARKER_FUNC]() : error +>window[UPDATE_MARKER_FUNC] : error +>window : Window & typeof globalThis +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>UPDATE_MARKER_FUNC : "updateMarkerPosition" +> : ^^^^^^^^^^^^^^^^^^^^^^ + diff --git a/tests/cases/conformance/salsa/lateboundWindowToplevelAssignment.ts b/tests/cases/conformance/salsa/lateboundWindowToplevelAssignment.ts new file mode 100644 index 0000000000000..afbdb3bef273e --- /dev/null +++ b/tests/cases/conformance/salsa/lateboundWindowToplevelAssignment.ts @@ -0,0 +1,7 @@ +// @filename: lateboundWindowToplevelAssignment.js +// @allowJs: true +// @checkJs: true +// @noEmit: true +const UPDATE_MARKER_FUNC = 'updateMarkerPosition'; +window[UPDATE_MARKER_FUNC] = () => {}; +window[UPDATE_MARKER_FUNC]();