From 27675fc96e6da8dbb7d7a328def8a07c1a73e37f Mon Sep 17 00:00:00 2001 From: Oleg Mihailik Date: Sat, 25 Feb 2017 23:35:24 +0000 Subject: [PATCH 1/3] Avoid failing TS2695 for eval. --- src/compiler/checker.ts | 2 +- tests/cases/compiler/evalAfter0.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 tests/cases/compiler/evalAfter0.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ac5012a3bf9a9..15782e13610c5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15929,7 +15929,7 @@ namespace ts { checkAssignmentOperator(rightType); return getRegularTypeOfObjectLiteral(rightType); case SyntaxKind.CommaToken: - if (!compilerOptions.allowUnreachableCode && isSideEffectFree(left)) { + if (!compilerOptions.allowUnreachableCode && isSideEffectFree(left) && right.text!=="eval") { error(left, Diagnostics.Left_side_of_comma_operator_is_unused_and_has_no_side_effects); } return rightType; diff --git a/tests/cases/compiler/evalAfter0.ts b/tests/cases/compiler/evalAfter0.ts new file mode 100644 index 0000000000000..ff9a036facaa2 --- /dev/null +++ b/tests/cases/compiler/evalAfter0.ts @@ -0,0 +1,3 @@ +(0,eval)("10"); + +(0,alert)("10"); \ No newline at end of file From 6a88cf0edf01730cb656cb1e97fad9972c2a4fb2 Mon Sep 17 00:00:00 2001 From: Oleg Mihailik Date: Sun, 26 Feb 2017 23:13:50 +0000 Subject: [PATCH 2/3] Better check for right.text, more comments in test --- src/compiler/checker.ts | 6 +++++- tests/cases/compiler/evalAfter0.ts | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 15782e13610c5..ddb1d371a14a0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15929,12 +15929,16 @@ namespace ts { checkAssignmentOperator(rightType); return getRegularTypeOfObjectLiteral(rightType); case SyntaxKind.CommaToken: - if (!compilerOptions.allowUnreachableCode && isSideEffectFree(left) && right.text!=="eval") { + if (!compilerOptions.allowUnreachableCode && isSideEffectFree(left) && !isEvalNode(right)) { error(left, Diagnostics.Left_side_of_comma_operator_is_unused_and_has_no_side_effects); } return rightType; } + function isEvalNode(node: Expression) { + return node.kind === SyntaxKind.Identifier && (node as Identifier).text === "eval"; + } + // Return true if there was no error, false if there was an error. function checkForDisallowedESSymbolOperand(operator: SyntaxKind): boolean { const offendingSymbolOperand = diff --git a/tests/cases/compiler/evalAfter0.ts b/tests/cases/compiler/evalAfter0.ts index ff9a036facaa2..98c0ea78f7dad 100644 --- a/tests/cases/compiler/evalAfter0.ts +++ b/tests/cases/compiler/evalAfter0.ts @@ -1,3 +1,3 @@ -(0,eval)("10"); +(0,eval)("10"); // fine: special case for eval -(0,alert)("10"); \ No newline at end of file +(0,alert)("10"); // error: no side effect left of comma (suspect of missing method name or something) \ No newline at end of file From baef2aa2c17c59669038525e95010581ac273fe1 Mon Sep 17 00:00:00 2001 From: Oleg Mihailik Date: Mon, 27 Feb 2017 01:05:56 +0000 Subject: [PATCH 3/3] Baseline accept --- tests/baselines/reference/evalAfter0.errors.txt | 10 ++++++++++ tests/baselines/reference/evalAfter0.js | 9 +++++++++ tests/cases/compiler/evalAfter0.ts | 3 ++- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/evalAfter0.errors.txt create mode 100644 tests/baselines/reference/evalAfter0.js diff --git a/tests/baselines/reference/evalAfter0.errors.txt b/tests/baselines/reference/evalAfter0.errors.txt new file mode 100644 index 0000000000000..448772eda08b6 --- /dev/null +++ b/tests/baselines/reference/evalAfter0.errors.txt @@ -0,0 +1,10 @@ +tests/cases/compiler/evalAfter0.ts(4,2): error TS2695: Left side of comma operator is unused and has no side effects. + + +==== tests/cases/compiler/evalAfter0.ts (1 errors) ==== + (0,eval)("10"); // fine: special case for eval + + declare var eva; + (0,eva)("10"); // error: no side effect left of comma (suspect of missing method name or something) + ~ +!!! error TS2695: Left side of comma operator is unused and has no side effects. \ No newline at end of file diff --git a/tests/baselines/reference/evalAfter0.js b/tests/baselines/reference/evalAfter0.js new file mode 100644 index 0000000000000..aeaa8f6476cd4 --- /dev/null +++ b/tests/baselines/reference/evalAfter0.js @@ -0,0 +1,9 @@ +//// [evalAfter0.ts] +(0,eval)("10"); // fine: special case for eval + +declare var eva; +(0,eva)("10"); // error: no side effect left of comma (suspect of missing method name or something) + +//// [evalAfter0.js] +(0, eval)("10"); // fine: special case for eval +(0, eva)("10"); // error: no side effect left of comma (suspect of missing method name or something) diff --git a/tests/cases/compiler/evalAfter0.ts b/tests/cases/compiler/evalAfter0.ts index 98c0ea78f7dad..2245150ce6ab3 100644 --- a/tests/cases/compiler/evalAfter0.ts +++ b/tests/cases/compiler/evalAfter0.ts @@ -1,3 +1,4 @@ (0,eval)("10"); // fine: special case for eval -(0,alert)("10"); // error: no side effect left of comma (suspect of missing method name or something) \ No newline at end of file +declare var eva; +(0,eva)("10"); // error: no side effect left of comma (suspect of missing method name or something) \ No newline at end of file