Skip to content

Commit

Permalink
Return false for yield nodes passed to evaluatesToLocalValue()
Browse files Browse the repository at this point in the history
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175329600
  • Loading branch information
tbreisacher committed Nov 13, 2017
1 parent 2d38d91 commit 6545bf6
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
1 change: 1 addition & 0 deletions src/com/google/javascript/jscomp/NodeUtil.java
Expand Up @@ -4704,6 +4704,7 @@ static boolean evaluatesToLocalValue(Node value, Predicate<Node> 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)
Expand Down
29 changes: 25 additions & 4 deletions test/com/google/javascript/jscomp/NodeUtilTest.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
Expand Down

0 comments on commit 6545bf6

Please sign in to comment.