From 6797f5b2932c4dcdc12a3d4f9580d7fb9ae4bbf8 Mon Sep 17 00:00:00 2001 From: blickly Date: Fri, 2 Mar 2018 14:54:33 -0800 Subject: [PATCH] Fix a crash in ScopedAliases when run in type-only summary generation mode ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=187673532 --- .../javascript/jscomp/ScopedAliases.java | 33 +++++++++++++---- .../javascript/jscomp/ScopedAliasesTest.java | 37 ++++++++++++++++++- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/src/com/google/javascript/jscomp/ScopedAliases.java b/src/com/google/javascript/jscomp/ScopedAliases.java index 13a2f3974aa..3833f8c90f9 100644 --- a/src/com/google/javascript/jscomp/ScopedAliases.java +++ b/src/com/google/javascript/jscomp/ScopedAliases.java @@ -221,21 +221,40 @@ public boolean referencesOtherAlias() { public abstract void applyAlias(AbstractCompiler compiler); } + private static boolean isValidAliasRhs(Node rhs) { + switch (rhs.getToken()) { + case GETPROP: + return isValidAliasRhs(rhs.getFirstChild()); + case NAME: + return true; + case CALL: + return NodeUtil.isCallTo(rhs, "goog.module.get"); + default: + return false; + } + } + private static boolean isAliasDefinition(Node nameNode) { if (!nameNode.hasChildren()) { return false; } Node rhs = nameNode.getLastChild(); - return rhs.isQualifiedName() || NodeUtil.isCallTo(rhs, "goog.module.get"); + return isValidAliasRhs(rhs); } - private static String getAliasedNamespace(Node aliasDefinition) { - if (aliasDefinition.isQualifiedName()) { - return aliasDefinition.getQualifiedName(); + private static String getAliasedNamespace(Node rhs) { + switch (rhs.getToken()) { + case GETPROP: + return getAliasedNamespace(rhs.getFirstChild()) + '.' + rhs.getLastChild().getString(); + case NAME: + return rhs.getString(); + case CALL: + checkState(NodeUtil.isCallTo(rhs, "goog.module.get"), rhs); + checkState(rhs.hasTwoChildren(), rhs); + return rhs.getLastChild().getString(); + default: + throw new RuntimeException("Invalid alias RHS:" + rhs); } - checkState(NodeUtil.isCallTo(aliasDefinition, "goog.module.get"), aliasDefinition); - checkState(aliasDefinition.hasTwoChildren(), aliasDefinition); - return aliasDefinition.getLastChild().getString(); } private static class AliasedNode extends AliasUsage { diff --git a/test/com/google/javascript/jscomp/ScopedAliasesTest.java b/test/com/google/javascript/jscomp/ScopedAliasesTest.java index e071e6acdcd..66725392860 100644 --- a/test/com/google/javascript/jscomp/ScopedAliasesTest.java +++ b/test/com/google/javascript/jscomp/ScopedAliasesTest.java @@ -1010,7 +1010,7 @@ public void testIssue2211c() { "});")); } - public void testGoogModuleGet() { + public void testGoogModuleGet1() { test( lines( "goog.provide('provided');", @@ -1027,6 +1027,41 @@ public void testGoogModuleGet() { "")); } + public void testGoogModuleGet2() { + test( + lines( + "goog.provide('foo.baz');", + "", + "goog.scope(function() {", + "", + "const a = goog.module.get('other.thing');", + "const b = a.b;", + "foo.baz = b", + "", + "}); // goog.scope"), + lines( + "goog.provide('foo.baz');", + "foo.baz = goog.module.get('other.thing').b;", + "")); + } + + public void testGoogModuleGet3() { + test( + lines( + "goog.provide('foo.baz');", + "", + "goog.scope(function() {", + "", + "const a = goog.module.get('other.thing').b;", + "foo.baz = a", + "", + "}); // goog.scope"), + lines( + "goog.provide('foo.baz');", + "foo.baz = goog.module.get('other.thing').b;", + "")); + } + public void testObjectPattern() { testScopedNoChanges("", "{foo: ({bar}) => baz};"); }