mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-06 02:33:53 -06:00
Address PR feedback. Always emit parentheses around emit capturing
This commit is contained in:
parent
cd3f711a76
commit
af5dc3e3b3
@ -2509,37 +2509,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
|
||||
/**
|
||||
* Emit ES7 exponentiation operator downlevel using Math.pow
|
||||
* @param node {BinaryExpression} a binary expression node containing exponentiationOperator (**, **=)
|
||||
* @param node a binary expression node containing exponentiationOperator (**, **=)
|
||||
*/
|
||||
function emitExponentiationOperator(node: BinaryExpression) {
|
||||
let leftHandSideExpression = node.left;
|
||||
if (node.operatorToken.kind === SyntaxKind.AsteriskAsteriskEqualsToken) {
|
||||
let synthesizedLHS: ElementAccessExpression | PropertyAccessExpression;
|
||||
|
||||
// This is used to decide whether to emit parenthesis around the expresison.
|
||||
// Parenthesis is required for following cases:
|
||||
// capture variable while emitting right-hand side operand.
|
||||
// a[0] **= a[0] **= 2
|
||||
// _a = a, _a[0] = Math.pow(_a[0], (_b = a, _b[0] = Math.pow(_b[0], 2)));
|
||||
// ^ -> required extra parenthesis controlled by shouldEmitParenthesis
|
||||
// exponentiation compound in variable declaration
|
||||
// var x = a[0] **= a[0] **= 2
|
||||
// var x = (_a = a, _a[0] = Math.pow(_a[0], (_b = a, _b[0] = Math.pow(_b[0], 2))));
|
||||
// ^ -> required extra parenthesis controlled by shouldEmitParenthesis
|
||||
// Otherwise, false
|
||||
let shouldEmitParenthesis = false;
|
||||
|
||||
let shouldEmitParentheses = false;
|
||||
if (isElementAccessExpression(leftHandSideExpression)) {
|
||||
shouldEmitParenthesis = node.parent.kind === SyntaxKind.VariableDeclaration || node.parent.kind === SyntaxKind.BinaryExpression;
|
||||
|
||||
if (shouldEmitParenthesis) {
|
||||
write("(");
|
||||
}
|
||||
shouldEmitParentheses = true;
|
||||
write("(");
|
||||
|
||||
synthesizedLHS = <ElementAccessExpression>createSynthesizedNode(SyntaxKind.ElementAccessExpression, /*startsOnNewLine*/ false);
|
||||
let tempVariable = createAndRecordTempVariable(TempFlags.Auto);
|
||||
emitAssignment(tempVariable, leftHandSideExpression.expression, /*shouldEmitCommaBeforeAssignment*/ false);
|
||||
synthesizedLHS.expression = tempVariable
|
||||
|
||||
let identifier = emitTempVariableAssignment(leftHandSideExpression.expression, /*canDefinedTempVariablesInPlaces*/ false, /*shouldemitCommaBeforeAssignment*/ false);
|
||||
synthesizedLHS.expression = identifier;
|
||||
|
||||
if (leftHandSideExpression.argumentExpression.kind !== SyntaxKind.NumericLiteral &&
|
||||
leftHandSideExpression.argumentExpression.kind !== SyntaxKind.StringLiteral) {
|
||||
@ -2553,16 +2537,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
write(", ");
|
||||
}
|
||||
else if (isPropertyAccessExpression(leftHandSideExpression)) {
|
||||
shouldEmitParenthesis = node.parent.kind === SyntaxKind.VariableDeclaration || node.parent.kind === SyntaxKind.BinaryExpression;
|
||||
|
||||
if (shouldEmitParenthesis) {
|
||||
write("(");
|
||||
}
|
||||
|
||||
shouldEmitParentheses = true;
|
||||
write("(");
|
||||
synthesizedLHS = <PropertyAccessExpression>createSynthesizedNode(SyntaxKind.PropertyAccessExpression, /*startsOnNewLine*/ false);
|
||||
let tempVariable = createAndRecordTempVariable(TempFlags.Auto);
|
||||
synthesizedLHS.expression = tempVariable
|
||||
emitAssignment(tempVariable, leftHandSideExpression.expression, /*shouldEmitCommaBeforeAssignment*/ false);
|
||||
|
||||
let identifier = emitTempVariableAssignment(leftHandSideExpression.expression, /*canDefinedTempVariablesInPlaces*/ false, /*shouldemitCommaBeforeAssignment*/ false);
|
||||
synthesizedLHS.expression = identifier;
|
||||
|
||||
(<PropertyAccessExpression>synthesizedLHS).dotToken = leftHandSideExpression.dotToken;
|
||||
(<PropertyAccessExpression>synthesizedLHS).name = leftHandSideExpression.name;
|
||||
write(", ");
|
||||
@ -2575,7 +2556,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
write(", ");
|
||||
emit(node.right);
|
||||
write(")");
|
||||
if (shouldEmitParenthesis) {
|
||||
if (shouldEmitParentheses) {
|
||||
write(")");
|
||||
}
|
||||
}
|
||||
@ -3254,6 +3235,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
write(";");
|
||||
}
|
||||
|
||||
/**
|
||||
* Emit an assignment to a given identifier, 'name', with a given expression, 'value'.
|
||||
* @param name an identifier as a left-hand-side operand of the assignment
|
||||
* @param value an expression as a right-hand-side operand of the assignment
|
||||
* @param shouldEmitCommaBeforeAssignment a boolean indicating whether to prefix an assignment with comma
|
||||
*/
|
||||
function emitAssignment(name: Identifier, value: Expression, shouldEmitCommaBeforeAssignment: boolean) {
|
||||
if (shouldEmitCommaBeforeAssignment) {
|
||||
write(", ");
|
||||
@ -3285,6 +3272,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create temporary variable, emit an assignment of the variable the given expression
|
||||
* @param expression an expression to assign to the newly created temporary variable
|
||||
* @param canDefineTempVariablesInPlace a boolean indicating whether you can define the temporary variable at an assignment location
|
||||
* @param shouldEmitCommaBeforeAssignment a boolean indicating whether an assignment should prefix with comma
|
||||
*/
|
||||
function emitTempVariableAssignment(expression: Expression, canDefineTempVariablesInPlace: boolean, shouldEmitCommaBeforeAssignment: boolean): Identifier {
|
||||
let identifier = createTempVariable(TempFlags.Auto);
|
||||
if (!canDefineTempVariablesInPlace) {
|
||||
recordTempDeclaration(identifier);
|
||||
}
|
||||
emitAssignment(identifier, expression, shouldEmitCommaBeforeAssignment);
|
||||
return identifier;
|
||||
}
|
||||
|
||||
function emitDestructuring(root: BinaryExpression | VariableDeclaration | ParameterDeclaration, isAssignmentExpressionStatement: boolean, value?: Expression) {
|
||||
let emitCount = 0;
|
||||
|
||||
@ -3325,11 +3327,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
return expr;
|
||||
}
|
||||
|
||||
let identifier = createTempVariable(TempFlags.Auto);
|
||||
if (!canDefineTempVariablesInPlace) {
|
||||
recordTempDeclaration(identifier);
|
||||
}
|
||||
emitAssignment(identifier, expr, /*shouldEmitCommaBeforeAssignment*/ emitCount > 0);
|
||||
let identifier = emitTempVariableAssignment(expr, canDefineTempVariablesInPlace, emitCount > 0);
|
||||
emitCount++;
|
||||
return identifier;
|
||||
}
|
||||
|
||||
@ -36,8 +36,8 @@ function fn1(x2) {
|
||||
}
|
||||
// property accesses
|
||||
var x3;
|
||||
_a = x3, _a.a = Math.pow(_a.a, value);
|
||||
_b = x3, _b['a'] = Math.pow(_b['a'], value);
|
||||
(_a = x3, _a.a = Math.pow(_a.a, value));
|
||||
(_b = x3, _b['a'] = Math.pow(_b['a'], value));
|
||||
// parentheses, the contained expression is reference
|
||||
(x1) = Math.pow((x1), value);
|
||||
function fn2(x4) {
|
||||
|
||||
@ -140,15 +140,15 @@ var Derived = (function (_super) {
|
||||
__extends(Derived, _super);
|
||||
function Derived() {
|
||||
_super.call(this);
|
||||
_a = _super.prototype, _a. = Math.pow(_a., value);
|
||||
(_a = _super.prototype, _a. = Math.pow(_a., value));
|
||||
var _a;
|
||||
}
|
||||
Derived.prototype.foo = function () {
|
||||
_a = _super.prototype, _a. = Math.pow(_a., value);
|
||||
(_a = _super.prototype, _a. = Math.pow(_a., value));
|
||||
var _a;
|
||||
};
|
||||
Derived.sfoo = function () {
|
||||
_a = _super, _a. = Math.pow(_a., value);
|
||||
(_a = _super, _a. = Math.pow(_a., value));
|
||||
var _a;
|
||||
};
|
||||
return Derived;
|
||||
|
||||
@ -19,14 +19,14 @@ array3[j0++] **= array3[j1++] **= array3[j0++] **= 1;
|
||||
//// [emitCompoundExponentiationAssignmentWithIndexingOnLHS1.js]
|
||||
var array0 = [1, 2, 3];
|
||||
var i0 = 0;
|
||||
_a = array0, _i = ++i0, _a[_i] = Math.pow(_a[_i], 2);
|
||||
(_a = array0, _i = ++i0, _a[_i] = Math.pow(_a[_i], 2));
|
||||
var array1 = [1, 2, 3];
|
||||
var i1 = 0;
|
||||
_b = array1, _c = ++i1, _b[_c] = Math.pow(_b[_c], (_d = array1, _e = ++i1, _d[_e] = Math.pow(_d[_e], 2)));
|
||||
(_b = array1, _c = ++i1, _b[_c] = Math.pow(_b[_c], (_d = array1, _e = ++i1, _d[_e] = Math.pow(_d[_e], 2))));
|
||||
var array2 = [1, 2, 3];
|
||||
var i2 = 0;
|
||||
_f = array2, _g = ++i2, _f[_g] = Math.pow(_f[_g], Math.pow(array2[++i2], 2));
|
||||
(_f = array2, _g = ++i2, _f[_g] = Math.pow(_f[_g], Math.pow(array2[++i2], 2)));
|
||||
var array3 = [2, 2, 3];
|
||||
var j0 = 0, j1 = 1;
|
||||
_h = array3, _j = j0++, _h[_j] = Math.pow(_h[_j], (_k = array3, _l = j1++, _k[_l] = Math.pow(_k[_l], (_m = array3, _o = j0++, _m[_o] = Math.pow(_m[_o], 1)))));
|
||||
(_h = array3, _j = j0++, _h[_j] = Math.pow(_h[_j], (_k = array3, _l = j1++, _k[_l] = Math.pow(_k[_l], (_m = array3, _o = j0++, _m[_o] = Math.pow(_m[_o], 1))))));
|
||||
var _a, _i, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
||||
|
||||
@ -17,10 +17,10 @@ function foo() {
|
||||
globalCounter += 1;
|
||||
return { 0: 2 };
|
||||
}
|
||||
_a = foo(), _a[0] = Math.pow(_a[0], foo()[0]);
|
||||
(_a = foo(), _a[0] = Math.pow(_a[0], foo()[0]));
|
||||
var result_foo1 = (_b = foo(), _b[0] = Math.pow(_b[0], foo()[0]));
|
||||
_c = foo(), _c[0] = Math.pow(_c[0], (_d = foo(), _d[0] = Math.pow(_d[0], 2)));
|
||||
(_c = foo(), _c[0] = Math.pow(_c[0], (_d = foo(), _d[0] = Math.pow(_d[0], 2))));
|
||||
var result_foo2 = (_e = foo(), _e[0] = Math.pow(_e[0], (_f = foo(), _f[0] = Math.pow(_f[0], 2))));
|
||||
_g = foo(), _g[0] = Math.pow(_g[0], Math.pow(foo()[0], 2));
|
||||
(_g = foo(), _g[0] = Math.pow(_g[0], Math.pow(foo()[0], 2)));
|
||||
var result_foo3 = (_h = foo(), _h[0] = Math.pow(_h[0], Math.pow(foo()[0], 2)));
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h;
|
||||
|
||||
@ -23,7 +23,7 @@ var object = {
|
||||
this._0 = x;
|
||||
},
|
||||
};
|
||||
_a = object, _a[0] = Math.pow(_a[0], object[0]);
|
||||
_b = object, _b[0] = Math.pow(_b[0], (_c = object, _c[0] = Math.pow(_c[0], 2)));
|
||||
_d = object, _d[0] = Math.pow(_d[0], Math.pow(object[0], 2));
|
||||
(_a = object, _a[0] = Math.pow(_a[0], object[0]));
|
||||
(_b = object, _b[0] = Math.pow(_b[0], (_c = object, _c[0] = Math.pow(_c[0], 2))));
|
||||
(_d = object, _d[0] = Math.pow(_d[0], Math.pow(object[0], 2)));
|
||||
var _a, _b, _c, _d;
|
||||
|
||||
@ -23,7 +23,7 @@ function incrementIdx(max) {
|
||||
return idx;
|
||||
}
|
||||
var array1 = [1, 2, 3, 4, 5];
|
||||
_a = array1, _i = incrementIdx(array1.length), _a[_i] = Math.pow(_a[_i], 3);
|
||||
_b = array1, _c = incrementIdx(array1.length), _b[_c] = Math.pow(_b[_c], (_d = array1, _e = incrementIdx(array1.length), _d[_e] = Math.pow(_d[_e], 2)));
|
||||
_f = array1, _g = incrementIdx(array1.length), _f[_g] = Math.pow(_f[_g], Math.pow(array1[incrementIdx(array1.length)], 2));
|
||||
(_a = array1, _i = incrementIdx(array1.length), _a[_i] = Math.pow(_a[_i], 3));
|
||||
(_b = array1, _c = incrementIdx(array1.length), _b[_c] = Math.pow(_b[_c], (_d = array1, _e = incrementIdx(array1.length), _d[_e] = Math.pow(_d[_e], 2))));
|
||||
(_f = array1, _g = incrementIdx(array1.length), _f[_g] = Math.pow(_f[_g], Math.pow(array1[incrementIdx(array1.length)], 2)));
|
||||
var _a, _i, _b, _c, _d, _e, _f, _g;
|
||||
|
||||
@ -18,10 +18,10 @@ function foo() {
|
||||
globalCounter += 1;
|
||||
return { prop: 2 };
|
||||
}
|
||||
_a = foo(), _a.prop = Math.pow(_a.prop, 2);
|
||||
(_a = foo(), _a.prop = Math.pow(_a.prop, 2));
|
||||
var result0 = (_b = foo(), _b.prop = Math.pow(_b.prop, 2));
|
||||
_c = foo(), _c.prop = Math.pow(_c.prop, (_d = foo(), _d.prop = Math.pow(_d.prop, 2)));
|
||||
(_c = foo(), _c.prop = Math.pow(_c.prop, (_d = foo(), _d.prop = Math.pow(_d.prop, 2))));
|
||||
var result1 = (_e = foo(), _e.prop = Math.pow(_e.prop, (_f = foo(), _f.prop = Math.pow(_f.prop, 2))));
|
||||
_g = foo(), _g.prop = Math.pow(_g.prop, Math.pow(foo().prop, 2));
|
||||
(_g = foo(), _g.prop = Math.pow(_g.prop, Math.pow(foo().prop, 2)));
|
||||
var result2 = (_h = foo(), _h.prop = Math.pow(_h.prop, Math.pow(foo().prop, 2)));
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user