From eb91be9bcdafe3c8f868d037c85d21e150519b97 Mon Sep 17 00:00:00 2001 From: tbreisacher Date: Sat, 7 May 2016 12:54:11 -0700 Subject: [PATCH] Make sure that usages in shorthand object literals are counted as usages. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=132907205 --- .../jscomp/CheckRequiresForConstructors.java | 25 +++++++++++++------ .../javascript/jscomp/ExtraRequireTest.java | 14 +++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/com/google/javascript/jscomp/CheckRequiresForConstructors.java b/src/com/google/javascript/jscomp/CheckRequiresForConstructors.java index 5a719a40e98..fc871d16ab9 100644 --- a/src/com/google/javascript/jscomp/CheckRequiresForConstructors.java +++ b/src/com/google/javascript/jscomp/CheckRequiresForConstructors.java @@ -71,6 +71,8 @@ public static enum Mode { private Mode mode; private final Set providedNames = new HashSet<>(); + + // Keys are the local name of a required namespace. Values are the goog.require CALL node. private final Map requires = new HashMap<>(); // Only used in single-file mode. @@ -222,6 +224,12 @@ public void visit(NodeTraversal t, Node n, Node parent) { visitQualifiedName(n); } break; + case STRING_KEY: + if (parent.isObjectLit() && !n.hasChildren()) { + // Object literal shorthand. This is a usage of the name. + visitQualifiedName(n); + } + break; case CALL: visitCallNode(t, n, parent); break; @@ -463,22 +471,24 @@ private void addWeakUsagesOfAllPrefixes(String qualifiedName) { weakUsages.add(qualifiedName); } - private void visitQualifiedName(Node getpropOrName) { - if (getpropOrName.isName() && getpropOrName.getString() != null) { + private void visitQualifiedName(Node n) { + Preconditions.checkState(n.isName() || n.isGetProp() || n.isStringKey(), n); + + if (n.isName() && n.getString() != null) { // If the referenced thing is a goog.require as desugared from goog.module(). - if (getpropOrName.getBooleanProp(Node.GOOG_MODULE_REQUIRE)) { - Node declStatement = NodeUtil.getEnclosingStatement(getpropOrName); + if (n.getBooleanProp(Node.GOOG_MODULE_REQUIRE)) { + Node declStatement = NodeUtil.getEnclosingStatement(n); if (NodeUtil.isNameDeclaration(declStatement)) { for (Node varChild : declStatement.children()) { // Normal declaration. if (varChild.isName()) { - requires.put(varChild.getString(), getpropOrName); + requires.put(varChild.getString(), n); } // Object destructuring declaration. if (varChild.isObjectPattern()) { for (Node objectChild : varChild.children()) { if (objectChild.isStringKey()) { - requires.put(objectChild.getString(), getpropOrName); + requires.put(objectChild.getString(), n); } } } @@ -487,7 +497,8 @@ private void visitQualifiedName(Node getpropOrName) { } } - addWeakUsagesOfAllPrefixes(getpropOrName.getQualifiedName()); + String qualifiedName = n.isStringKey() ? n.getString() : n.getQualifiedName(); + addWeakUsagesOfAllPrefixes(qualifiedName); } private void visitNewNode(NodeTraversal t, Node newNode) { diff --git a/test/com/google/javascript/jscomp/ExtraRequireTest.java b/test/com/google/javascript/jscomp/ExtraRequireTest.java index 4c36e7724b8..80491dd3f1d 100644 --- a/test/com/google/javascript/jscomp/ExtraRequireTest.java +++ b/test/com/google/javascript/jscomp/ExtraRequireTest.java @@ -75,6 +75,20 @@ public void testNoWarning_externsNew() { test(externs, js, js, null, null, null); } + public void testNoWarning_objlitShorthand() { + testSameEs6( + LINE_JOINER.join( + "goog.module('example.module');", + "", + "const X = goog.require('example.X');", + "alert({X});")); + + testSameEs6( + LINE_JOINER.join( + "goog.require('X');", + "alert({X});")); + } + public void testNoWarning_InnerClassInExtends() { String js = LINE_JOINER.join(