From 04a053aa7f297d04631c9f226915ecd3ba593006 Mon Sep 17 00:00:00 2001 From: blickly Date: Mon, 9 Jan 2017 13:48:26 -0800 Subject: [PATCH] In externs, allow stub definitions for goog.provided names to not have an RHS. This is needed to properly check .i.js files. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=144003191 --- .../jscomp/ProcessClosurePrimitives.java | 15 ++++++++++----- .../google/javascript/jscomp/IntegrationTest.java | 12 ++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/com/google/javascript/jscomp/ProcessClosurePrimitives.java b/src/com/google/javascript/jscomp/ProcessClosurePrimitives.java index ce112221fa5..574e5da8005 100644 --- a/src/com/google/javascript/jscomp/ProcessClosurePrimitives.java +++ b/src/com/google/javascript/jscomp/ProcessClosurePrimitives.java @@ -317,7 +317,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { break; case EXPR_RESULT: - handleTypedefDefinition(t, n); + handleStubDefinition(t, n); break; case CLASS: @@ -486,13 +486,18 @@ private void processDefineCall(NodeTraversal t, Node n, Node parent) { } /** - * Handles a typedef definition for a goog.provided name. + * Handles a stub definition for a goog.provided name + * (e.g. a @typedef or a definition from externs) + * * @param n EXPR_RESULT node. */ - private void handleTypedefDefinition( - NodeTraversal t, Node n) { + private void handleStubDefinition(NodeTraversal t, Node n) { + if (!t.inGlobalHoistScope()) { + return; + } JSDocInfo info = n.getFirstChild().getJSDocInfo(); - if (t.inGlobalHoistScope() && info != null && info.hasTypedefType()) { + boolean hasStubDefinition = info != null && (n.isFromExterns() || info.hasTypedefType()); + if (hasStubDefinition) { String name = n.getFirstChild().getQualifiedName(); if (name != null) { ProvidedName pn = providedNames.get(name); diff --git a/test/com/google/javascript/jscomp/IntegrationTest.java b/test/com/google/javascript/jscomp/IntegrationTest.java index a5be9374b81..230e9f7b2a1 100644 --- a/test/com/google/javascript/jscomp/IntegrationTest.java +++ b/test/com/google/javascript/jscomp/IntegrationTest.java @@ -3852,6 +3852,18 @@ public void testEs6OutDoesntCrash() { test(options, "function f(x) { if (x) var x=5; }", "function f(x) { if (x) x=5; }"); } + public void testExternsProvideIsAllowed() { + CompilerOptions options = createCompilerOptions(); + options.setIncrementalChecks(CompilerOptions.IncrementalCheckMode.CHECK_IJS); + options.setClosurePass(true); + options.setCheckTypes(true); + + externs = ImmutableList.of(SourceFile.fromCode("", + "goog.provide('foo.bar'); /** @type {!Array} */ foo.bar;")); + + test(options, "", ""); + } + // GitHub issue #250: https://github.com/google/closure-compiler/issues/250 public void testInlineStringConcat() { CompilerOptions options = createCompilerOptions();