Allow window. prefix in default-assignment JS decl

This commit is contained in:
Nathan Shively-Sanders
2018-02-09 14:53:34 -08:00
parent 33c084f5df
commit 61ea026b3c
8 changed files with 436 additions and 122 deletions
+5 -1
View File
@@ -18984,6 +18984,9 @@ namespace ts {
}
function checkBinaryExpression(node: BinaryExpression, checkMode?: CheckMode) {
if (node.operatorToken.kind === SyntaxKind.BarBarToken && isInJavaScriptFile(node) && isAssignmentOfDefaultedJavascriptContainerExpression(node.parent)) {
return checkExpression(node.right, checkMode);
}
return checkBinaryLikeExpression(node.left, node.operatorToken, node.right, checkMode, node);
}
@@ -21859,7 +21862,8 @@ namespace ts {
// Node is the primary declaration of the symbol, just validate the initializer
// Don't validate for-in initializer as it is already an error
if (node.initializer && node.parent.parent.kind !== SyntaxKind.ForInStatement) {
checkTypeAssignableTo(checkExpressionCached(node.initializer), type, node, /*headMessage*/ undefined);
const initializer = isInJavaScriptFile(node) && isDeclarationOfDefaultedJavascriptContainerExpression(node) ? (node.initializer as BinaryExpression).right : node.initializer;
checkTypeAssignableTo(checkExpressionCached(initializer), type, node, /*headMessage*/ undefined);
checkParameterInitializer(node);
}
}
+15 -9
View File
@@ -1508,10 +1508,8 @@ namespace ts {
isVariableDeclaration(node) &&
node.initializer &&
isBinaryExpression(node.initializer) &&
// TODO: This will have to change for `var my = window.my || {}`;
isIdentifier(node.initializer.left) &&
isIdentifier(node.name) &&
node.initializer.left.escapedText === node.name.escapedText &&
isSameName(node.name, node.initializer.left as EntityNameExpression) &&
isJavascriptContainerExpression(node.initializer.right);
}
@@ -1534,12 +1532,20 @@ namespace ts {
isJavascriptContainerExpression(node.right.right);
}
function isSameName(left: EntityNameExpression, right: EntityNameExpression): boolean {
if (isIdentifier(left) && isIdentifier(right)) {
return left.escapedText === right.escapedText;
function isSameName(name: EntityNameExpression, initializer: EntityNameExpression): boolean {
if (isIdentifier(name) && isIdentifier(initializer)) {
return name.escapedText === initializer.escapedText;
}
if (isPropertyAccessExpression(left) && isPropertyAccessExpression(right)) {
return left.name.escapedText === right.name.escapedText && isSameName(left.expression, right.expression);
if (isIdentifier(name) && isPropertyAccessExpression(initializer)) {
return (initializer.expression.kind as SyntaxKind.ThisKeyword === SyntaxKind.ThisKeyword ||
isIdentifier(initializer.expression) &&
(initializer.expression.escapedText === "window" as __String ||
initializer.expression.escapedText === "self" as __String ||
initializer.expression.escapedText === "global" as __String)) &&
isSameName(name, initializer.name);
}
if (isPropertyAccessExpression(name) && isPropertyAccessExpression(initializer)) {
return name.name.escapedText === initializer.name.escapedText && isSameName(name.expression, initializer.expression);
}
return false;
}
@@ -1596,7 +1602,7 @@ namespace ts {
return SpecialPropertyAssignmentKind.PrototypeProperty;
}
}
if(isEntityNameExpression(lhs.expression)) {
if (isEntityNameExpression(lhs.expression)) {
return SpecialPropertyAssignmentKind.Property;
}
}