@@ -2336,7 +2336,7 @@ namespace ts {
23362336 // For `f.prototype.m = function() { this.x = 0; }`, `this.x = 0` should modify `f`'s members, not the function expression.
23372337 if ( isBinaryExpression ( thisContainer . parent ) && thisContainer . parent . operatorToken . kind === SyntaxKind . EqualsToken ) {
23382338 const l = thisContainer . parent . left ;
2339- if ( isPropertyAccessExpression ( l ) && isPropertyAccessExpression ( l . expression ) && l . expression . name . escapedText === "prototype" && isEntityNameExpression ( l . expression . expression ) ) {
2339+ if ( isPropertyAccessEntityNameExpression ( l ) && isPrototypeAccess ( l . expression ) ) {
23402340 constructorSymbol = getJSInitializerSymbolFromName ( l . expression . expression , containerContainer ) ;
23412341 }
23422342 }
@@ -2368,12 +2368,12 @@ namespace ts {
23682368 if ( node . expression . kind === SyntaxKind . ThisKeyword ) {
23692369 bindThisPropertyAssignment ( node ) ;
23702370 }
2371- else if ( isEntityNameExpression ( node ) && node . parent . parent . kind === SyntaxKind . SourceFile ) {
2372- if ( isPropertyAccessExpression ( node . expression ) && node . expression . name . escapedText === "prototype" ) {
2373- bindPrototypePropertyAssignment ( node as PropertyAccessEntityNameExpression , node . parent ) ;
2371+ else if ( isPropertyAccessEntityNameExpression ( node ) && node . parent . parent . kind === SyntaxKind . SourceFile ) {
2372+ if ( isPrototypeAccess ( node . expression ) ) {
2373+ bindPrototypePropertyAssignment ( node , node . parent ) ;
23742374 }
23752375 else {
2376- bindStaticPropertyAssignment ( node as PropertyAccessEntityNameExpression ) ;
2376+ bindStaticPropertyAssignment ( node ) ;
23772377 }
23782378 }
23792379 }
@@ -2436,15 +2436,10 @@ namespace ts {
24362436
24372437 function bindPropertyAssignment ( name : EntityNameExpression , propertyAccess : PropertyAccessEntityNameExpression , isPrototypeProperty : boolean ) {
24382438 let symbol = getJSInitializerSymbolFromName ( name ) ;
2439- let isToplevelNamespaceableInitializer : boolean ;
2440- if ( isBinaryExpression ( propertyAccess . parent ) ) {
2441- const isPrototypeAssignment = isPropertyAccessExpression ( propertyAccess . parent . left ) && propertyAccess . parent . left . name . escapedText === "prototype" ;
2442- isToplevelNamespaceableInitializer = propertyAccess . parent . parent . parent . kind === SyntaxKind . SourceFile &&
2443- ! ! getJavascriptInitializer ( propertyAccess . parent . right , isPrototypeAssignment ) ;
2444- }
2445- else {
2446- isToplevelNamespaceableInitializer = propertyAccess . parent . parent . kind === SyntaxKind . SourceFile ;
2447- }
2439+ const isToplevelNamespaceableInitializer = isBinaryExpression ( propertyAccess . parent )
2440+ ? propertyAccess . parent . parent . parent . kind === SyntaxKind . SourceFile &&
2441+ ! ! getJavascriptInitializer ( propertyAccess . parent . right , isPrototypeAccess ( propertyAccess . parent . left ) )
2442+ : propertyAccess . parent . parent . kind === SyntaxKind . SourceFile ;
24482443 if ( ! isPrototypeProperty && ( ! symbol || ! ( symbol . flags & SymbolFlags . Namespace ) ) && isToplevelNamespaceableInitializer ) {
24492444 // make symbols or add declarations for intermediate containers
24502445 const flags = SymbolFlags . Module | SymbolFlags . JSContainer ;
0 commit comments