From e4c0bfc6d82dfaea3ca4184722f2c1a2e11855f8 Mon Sep 17 00:00:00 2001 From: lharker Date: Tue, 22 Jan 2019 10:49:06 -0800 Subject: [PATCH] Make ControlFlowAnalysis treat MODULE_BODY as a statement block This is a prerequisite to running passes using the CFG on modules ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=230369777 --- .../jscomp/ControlFlowAnalysis.java | 2 ++ .../jscomp/ControlFlowAnalysisTest.java | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/com/google/javascript/jscomp/ControlFlowAnalysis.java b/src/com/google/javascript/jscomp/ControlFlowAnalysis.java index 87371e59dc1..2a53a87234f 100644 --- a/src/com/google/javascript/jscomp/ControlFlowAnalysis.java +++ b/src/com/google/javascript/jscomp/ControlFlowAnalysis.java @@ -340,6 +340,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { case BLOCK: case ROOT: case SCRIPT: + case MODULE_BODY: handleStmtList(n); return; case FUNCTION: @@ -545,6 +546,7 @@ private void handleStmtList(Node node) { case TRY: break; case ROOT: + // TODO(b/71873602): why is this path necessary? if (node.isRoot() && node.getNext() != null) { createEdge(node, Branch.UNCOND, node.getNext()); } diff --git a/test/com/google/javascript/jscomp/ControlFlowAnalysisTest.java b/test/com/google/javascript/jscomp/ControlFlowAnalysisTest.java index 3abbe82255c..84ffec6451f 100644 --- a/test/com/google/javascript/jscomp/ControlFlowAnalysisTest.java +++ b/test/com/google/javascript/jscomp/ControlFlowAnalysisTest.java @@ -266,7 +266,7 @@ private ControlFlowGraph createCfg(String input) { } @Test - public void testSimpleStatements() throws IOException { + public void testSimpleStatementsInScript() { String src = "var a; a = a; a = a"; ControlFlowGraph cfg = createCfg(src); assertDownEdge(cfg, Token.SCRIPT, Token.VAR, Branch.UNCOND); @@ -274,6 +274,26 @@ public void testSimpleStatements() throws IOException { assertCrossEdge(cfg, Token.EXPR_RESULT, Token.EXPR_RESULT, Branch.UNCOND); } + @Test + public void testSimpleStatementsInGoogModule() { + String src = "goog.module('myMod'); var a; a = a; a = a"; + ControlFlowGraph cfg = createCfg(src); + assertDownEdge(cfg, Token.SCRIPT, Token.MODULE_BODY, Branch.UNCOND); + // the EXPR_RESULT is the goog.module(...) call + assertDownEdge(cfg, Token.MODULE_BODY, Token.EXPR_RESULT, Branch.UNCOND); + assertCrossEdge(cfg, Token.EXPR_RESULT, Token.VAR, Branch.UNCOND); // goog.module() -> var a; + } + + @Test + public void testSimpleStatementsInEsModule() { + String src = "var a; a = a; export default a;"; + ControlFlowGraph cfg = createCfg(src); + assertDownEdge(cfg, Token.SCRIPT, Token.MODULE_BODY, Branch.UNCOND); + assertDownEdge(cfg, Token.MODULE_BODY, Token.VAR, Branch.UNCOND); + assertCrossEdge(cfg, Token.VAR, Token.EXPR_RESULT, Branch.UNCOND); + assertCrossEdge(cfg, Token.EXPR_RESULT, Token.EXPORT, Branch.UNCOND); + } + // Test a simple IF control flow. @Test public void testSimpleIf() throws IOException {