Skip to content

Commit

Permalink
Make ControlFlowAnalysis treat MODULE_BODY as a statement block
Browse files Browse the repository at this point in the history
This is a prerequisite to running passes using the CFG on modules

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=230369777
  • Loading branch information
lauraharker committed Jan 22, 2019
1 parent f51ce26 commit e4c0bfc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/com/google/javascript/jscomp/ControlFlowAnalysis.java
Expand Up @@ -340,6 +340,7 @@ public void visit(NodeTraversal t, Node n, Node parent) {
case BLOCK: case BLOCK:
case ROOT: case ROOT:
case SCRIPT: case SCRIPT:
case MODULE_BODY:
handleStmtList(n); handleStmtList(n);
return; return;
case FUNCTION: case FUNCTION:
Expand Down Expand Up @@ -545,6 +546,7 @@ private void handleStmtList(Node node) {
case TRY: case TRY:
break; break;
case ROOT: case ROOT:
// TODO(b/71873602): why is this path necessary?
if (node.isRoot() && node.getNext() != null) { if (node.isRoot() && node.getNext() != null) {
createEdge(node, Branch.UNCOND, node.getNext()); createEdge(node, Branch.UNCOND, node.getNext());
} }
Expand Down
22 changes: 21 additions & 1 deletion test/com/google/javascript/jscomp/ControlFlowAnalysisTest.java
Expand Up @@ -266,14 +266,34 @@ private ControlFlowGraph<Node> createCfg(String input) {
} }


@Test @Test
public void testSimpleStatements() throws IOException { public void testSimpleStatementsInScript() {
String src = "var a; a = a; a = a"; String src = "var a; a = a; a = a";
ControlFlowGraph<Node> cfg = createCfg(src); ControlFlowGraph<Node> cfg = createCfg(src);
assertDownEdge(cfg, Token.SCRIPT, Token.VAR, Branch.UNCOND); assertDownEdge(cfg, Token.SCRIPT, Token.VAR, Branch.UNCOND);
assertCrossEdge(cfg, Token.VAR, Token.EXPR_RESULT, Branch.UNCOND); assertCrossEdge(cfg, Token.VAR, Token.EXPR_RESULT, Branch.UNCOND);
assertCrossEdge(cfg, Token.EXPR_RESULT, Token.EXPR_RESULT, Branch.UNCOND); 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<Node> 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<Node> 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 a simple IF control flow.
@Test @Test
public void testSimpleIf() throws IOException { public void testSimpleIf() throws IOException {
Expand Down

0 comments on commit e4c0bfc

Please sign in to comment.