Skip to content

Commit 31701b6

Browse files
author
Andy
authored
Merge pull request #14884 from Microsoft/binary-expression
getSpecialPropertyAssignmentKind: Always check for BinaryExpression *outside*, always check for JS file *inside*
2 parents 25f0750 + dd06cbb commit 31701b6

File tree

3 files changed

+27
-32
lines changed

3 files changed

+27
-32
lines changed

src/compiler/binder.ts

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ namespace ts {
259259
case SyntaxKind.ExportAssignment:
260260
return (<ExportAssignment>node).isExportEquals ? "export=" : "default";
261261
case SyntaxKind.BinaryExpression:
262-
switch (getSpecialPropertyAssignmentKind(node)) {
262+
switch (getSpecialPropertyAssignmentKind(node as BinaryExpression)) {
263263
case SpecialPropertyAssignmentKind.ModuleExports:
264264
// module.exports = ...
265265
return "export=";
@@ -2017,30 +2017,28 @@ namespace ts {
20172017
}
20182018
break;
20192019
case SyntaxKind.BinaryExpression:
2020-
if (isInJavaScriptFile(node)) {
2021-
const specialKind = getSpecialPropertyAssignmentKind(node);
2022-
switch (specialKind) {
2023-
case SpecialPropertyAssignmentKind.ExportsProperty:
2024-
bindExportsPropertyAssignment(<BinaryExpression>node);
2025-
break;
2026-
case SpecialPropertyAssignmentKind.ModuleExports:
2027-
bindModuleExportsAssignment(<BinaryExpression>node);
2028-
break;
2029-
case SpecialPropertyAssignmentKind.PrototypeProperty:
2030-
bindPrototypePropertyAssignment(<BinaryExpression>node);
2031-
break;
2032-
case SpecialPropertyAssignmentKind.ThisProperty:
2033-
bindThisPropertyAssignment(<BinaryExpression>node);
2034-
break;
2035-
case SpecialPropertyAssignmentKind.Property:
2036-
bindStaticPropertyAssignment(<BinaryExpression>node);
2037-
break;
2038-
case SpecialPropertyAssignmentKind.None:
2039-
// Nothing to do
2040-
break;
2041-
default:
2042-
Debug.fail("Unknown special property assignment kind");
2043-
}
2020+
const specialKind = getSpecialPropertyAssignmentKind(node as BinaryExpression);
2021+
switch (specialKind) {
2022+
case SpecialPropertyAssignmentKind.ExportsProperty:
2023+
bindExportsPropertyAssignment(<BinaryExpression>node);
2024+
break;
2025+
case SpecialPropertyAssignmentKind.ModuleExports:
2026+
bindModuleExportsAssignment(<BinaryExpression>node);
2027+
break;
2028+
case SpecialPropertyAssignmentKind.PrototypeProperty:
2029+
bindPrototypePropertyAssignment(<BinaryExpression>node);
2030+
break;
2031+
case SpecialPropertyAssignmentKind.ThisProperty:
2032+
bindThisPropertyAssignment(<BinaryExpression>node);
2033+
break;
2034+
case SpecialPropertyAssignmentKind.Property:
2035+
bindStaticPropertyAssignment(<BinaryExpression>node);
2036+
break;
2037+
case SpecialPropertyAssignmentKind.None:
2038+
// Nothing to do
2039+
break;
2040+
default:
2041+
Debug.fail("Unknown special property assignment kind");
20442042
}
20452043
return checkStrictModeBinaryExpression(<BinaryExpression>node);
20462044
case SyntaxKind.CatchClause:

src/compiler/checker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11929,8 +11929,8 @@ namespace ts {
1192911929
// If this is a function in a JS file, it might be a class method. Check if it's the RHS
1193011930
// of a x.prototype.y = function [name]() { .... }
1193111931
if (container.kind === SyntaxKind.FunctionExpression &&
11932-
isInJavaScriptFile(container.parent) &&
11933-
getSpecialPropertyAssignmentKind(container.parent) === SpecialPropertyAssignmentKind.PrototypeProperty) {
11932+
container.parent.kind === SyntaxKind.BinaryExpression &&
11933+
getSpecialPropertyAssignmentKind(container.parent as BinaryExpression) === SpecialPropertyAssignmentKind.PrototypeProperty) {
1193411934
// Get the 'x' of 'x.prototype.y = f' (here, 'f' is 'container')
1193511935
const className = (((container.parent as BinaryExpression) // x.prototype.y = f
1193611936
.left as PropertyAccessExpression) // x.prototype.y
@@ -21641,7 +21641,7 @@ namespace ts {
2164121641
}
2164221642

2164321643
function getSpecialPropertyAssignmentSymbolFromEntityName(entityName: EntityName | PropertyAccessExpression) {
21644-
const specialPropertyAssignmentKind = getSpecialPropertyAssignmentKind(entityName.parent.parent);
21644+
const specialPropertyAssignmentKind = getSpecialPropertyAssignmentKind(entityName.parent.parent as BinaryExpression);
2164521645
switch (specialPropertyAssignmentKind) {
2164621646
case SpecialPropertyAssignmentKind.ExportsProperty:
2164721647
case SpecialPropertyAssignmentKind.PrototypeProperty:

src/compiler/utilities.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,13 +1450,10 @@ namespace ts {
14501450

14511451
/// Given a BinaryExpression, returns SpecialPropertyAssignmentKind for the various kinds of property
14521452
/// assignments we treat as special in the binder
1453-
export function getSpecialPropertyAssignmentKind(expression: Node): SpecialPropertyAssignmentKind {
1453+
export function getSpecialPropertyAssignmentKind(expression: ts.BinaryExpression): SpecialPropertyAssignmentKind {
14541454
if (!isInJavaScriptFile(expression)) {
14551455
return SpecialPropertyAssignmentKind.None;
14561456
}
1457-
if (expression.kind !== SyntaxKind.BinaryExpression) {
1458-
return SpecialPropertyAssignmentKind.None;
1459-
}
14601457
const expr = <BinaryExpression>expression;
14611458
if (expr.operatorToken.kind !== SyntaxKind.EqualsToken || expr.left.kind !== SyntaxKind.PropertyAccessExpression) {
14621459
return SpecialPropertyAssignmentKind.None;

0 commit comments

Comments
 (0)