mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Allow window. prefix in default-assignment JS decl
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user