From 6545bf638b8977832c87a7a7ab69682606b25bc6 Mon Sep 17 00:00:00 2001 From: tbreisacher Date: Fri, 10 Nov 2017 13:39:41 -0800 Subject: [PATCH] Return false for yield nodes passed to evaluatesToLocalValue() ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=175329600 --- .../google/javascript/jscomp/NodeUtil.java | 1 + .../javascript/jscomp/NodeUtilTest.java | 29 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/com/google/javascript/jscomp/NodeUtil.java b/src/com/google/javascript/jscomp/NodeUtil.java index e6cc9ab0790..1c3c88d6141 100644 --- a/src/com/google/javascript/jscomp/NodeUtil.java +++ b/src/com/google/javascript/jscomp/NodeUtil.java @@ -4704,6 +4704,7 @@ static boolean evaluatesToLocalValue(Node value, Predicate locals) { case CAST: return evaluatesToLocalValue(value.getFirstChild(), locals); case SPREAD: + case YIELD: case AWAIT: // TODO(johnlenz): we can do better for await if we use type information. That is, // if we know the promise being awaited on is a immutable value type (string, etc) diff --git a/test/com/google/javascript/jscomp/NodeUtilTest.java b/test/com/google/javascript/jscomp/NodeUtilTest.java index 6b5628517ae..40db889c7b0 100644 --- a/test/com/google/javascript/jscomp/NodeUtilTest.java +++ b/test/com/google/javascript/jscomp/NodeUtilTest.java @@ -73,18 +73,30 @@ private static Node getNode(String js) { return var.getFirstChild(); } + private static Node getYieldNode(String js) { + return checkNotNull(getYieldNode(parse(js))); + } + + private static Node getYieldNode(Node root) { + return getNode(root, Token.YIELD); + } + private static Node getAwaitNode(String js) { return checkNotNull(getAwaitNode(parse(js))); } private static Node getAwaitNode(Node root) { + return getNode(root, Token.AWAIT); + } + + private static Node getNode(Node root, Token token) { for (Node n : root.children()) { - if (n.isAwait()) { + if (n.getToken() == token) { return n; } - Node awaitNode = getAwaitNode(n); - if (awaitNode != null) { - return awaitNode; + Node potentialMatch = getNode(n, token); + if (potentialMatch != null) { + return potentialMatch; } } return null; @@ -1628,6 +1640,15 @@ public void testLocalValueAwait() { assertFalse(NodeUtil.evaluatesToLocalValue(expr)); } + public void testLocalValueYield() { + Node expr; + expr = getYieldNode("function *f() { yield; }"); + assertFalse(NodeUtil.evaluatesToLocalValue(expr)); + + expr = getYieldNode("function *f() { yield 'something'; }"); + assertFalse(NodeUtil.evaluatesToLocalValue(expr)); + } + public void testCallSideEffects() { Node callExpr = getNode("new x().method()"); assertTrue(NodeUtil.functionCallHasSideEffects(callExpr));