Skip to content

Commit

Permalink
When preserving goog.require statements, also preserve goog.provides.
Browse files Browse the repository at this point in the history
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124984231
  • Loading branch information
blickly committed Jun 15, 2016
1 parent 03bb2fe commit 4ffe52d
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 26 deletions.
21 changes: 15 additions & 6 deletions src/com/google/javascript/jscomp/CompilerOptions.java
Expand Up @@ -677,8 +677,8 @@ public void setReplaceMessagesWithChromeI18n(
/** Processes goog.provide() and goog.require() calls */
public boolean closurePass;

/** Do not strip goog.require() calls from the code. */
public boolean preserveGoogRequires;
/** Do not strip goog.provide()/goog.require() calls from the code. */
private boolean preserveGoogProvidesAndRequires;

/** Processes jQuery aliases */
public boolean jqueryPass;
Expand Down Expand Up @@ -1121,7 +1121,7 @@ public CompilerOptions() {
locale = null;
markAsCompiled = false;
closurePass = false;
preserveGoogRequires = false;
preserveGoogProvidesAndRequires = false;
jqueryPass = false;
angularPass = false;
polymerPass = false;
Expand Down Expand Up @@ -2260,8 +2260,17 @@ public void setClosurePass(boolean closurePass) {
this.closurePass = closurePass;
}

public void setPreserveGoogRequires(boolean preserveGoogRequires) {
this.preserveGoogRequires = preserveGoogRequires;
@Deprecated
public void setPreserveGoogRequires(boolean preserveGoogProvidesAndRequires) {
setPreserveGoogProvidesAndRequires(preserveGoogProvidesAndRequires);
}

public void setPreserveGoogProvidesAndRequires(boolean preserveGoogProvidesAndRequires) {
this.preserveGoogProvidesAndRequires = preserveGoogProvidesAndRequires;
}

public boolean shouldPreservesGoogProvidesAndRequires() {
return this.preserveGoogProvidesAndRequires;
}

public void setPreserveTypeAnnotations(boolean preserveTypeAnnotations) {
Expand Down Expand Up @@ -2636,7 +2645,7 @@ public String toString() {
.add("preferSingleQuotes", preferSingleQuotes)
.add("preferStableNames", preferStableNames)
.add("preserveDetailedSourceInfo", preservesDetailedSourceInfo())
.add("preserveGoogRequires", preserveGoogRequires)
.add("preserveGoogProvidesAndRequires", preserveGoogProvidesAndRequires)
.add("preserveTypeAnnotations", preserveTypeAnnotations)
.add("prettyPrint", prettyPrint)
.add("preventLibraryInjection", preventLibraryInjection)
Expand Down
2 changes: 1 addition & 1 deletion src/com/google/javascript/jscomp/DefaultPassConfig.java
Expand Up @@ -1176,7 +1176,7 @@ protected HotSwapCompilerPass create(AbstractCompiler compiler) {
compiler,
preprocessorSymbolTable,
options.brokenClosureRequiresLevel,
options.preserveGoogRequires);
options.shouldPreservesGoogProvidesAndRequires());

return new HotSwapCompilerPass() {
@Override
Expand Down
23 changes: 12 additions & 11 deletions src/com/google/javascript/jscomp/ProcessClosurePrimitives.java
Expand Up @@ -159,8 +159,7 @@ class ProcessClosurePrimitives extends AbstractPostOrderCallback
private final JSModuleGraph moduleGraph;

// The goog.provides must be processed in a deterministic order.
private final Map<String, ProvidedName> providedNames =
new LinkedHashMap<>();
private final Map<String, ProvidedName> providedNames = new LinkedHashMap<>();

private final Set<String> knownClosureSubclasses = new HashSet<>();

Expand All @@ -169,19 +168,19 @@ class ProcessClosurePrimitives extends AbstractPostOrderCallback
private final CheckLevel requiresLevel;
private final PreprocessorSymbolTable preprocessorSymbolTable;
private final List<Node> defineCalls = new ArrayList<>();
private final boolean preserveGoogRequires;
private final boolean preserveGoogProvidesAndRequires;

private final List<Node> requiresToBeRemoved = new ArrayList<>();

ProcessClosurePrimitives(AbstractCompiler compiler,
@Nullable PreprocessorSymbolTable preprocessorSymbolTable,
CheckLevel requiresLevel,
boolean preserveGoogRequires) {
boolean preserveGoogProvidesAndRequires) {
this.compiler = compiler;
this.preprocessorSymbolTable = preprocessorSymbolTable;
this.moduleGraph = compiler.getModuleGraph();
this.requiresLevel = requiresLevel;
this.preserveGoogRequires = preserveGoogRequires;
this.preserveGoogProvidesAndRequires = preserveGoogProvidesAndRequires;

// goog is special-cased because it is provided in Closure's base library.
providedNames.put(GOOG,
Expand Down Expand Up @@ -432,7 +431,7 @@ private void processRequireCall(NodeTraversal t, Node n, Node parent) {
// the checks for broken requires turned off. In these cases, we
// allow broken requires to be preserved by the first run to
// let them be caught in the subsequent run.
if (!preserveGoogRequires && (provided != null || requiresLevel.isOn())) {
if (!preserveGoogProvidesAndRequires && (provided != null || requiresLevel.isOn())) {
requiresToBeRemoved.add(parent);
}
}
Expand All @@ -442,6 +441,7 @@ private void processRequireCall(NodeTraversal t, Node n, Node parent) {
* Handles a goog.provide call.
*/
private void processProvideCall(NodeTraversal t, Node n, Node parent) {
Preconditions.checkState(n.isCall());
Node left = n.getFirstChild();
Node arg = left.getNext();
if (verifyProvide(t, left, arg)) {
Expand Down Expand Up @@ -1321,9 +1321,6 @@ void replace() {
// Handle the case where there is a duplicate definition for an explicitly
// provided symbol.
if (candidateDefinition != null && explicitNode != null) {
explicitNode.detachFromParent();
compiler.reportCodeChange();

JSDocInfo info;
if (candidateDefinition.isExprResult()) {
info = candidateDefinition.getFirstChild().getJSDocInfo();
Expand Down Expand Up @@ -1393,9 +1390,13 @@ void replace() {
replacementNode, parentName.replacementNode);
}
}
if (explicitNode != null) {
explicitNode.detachFromParent();
compiler.reportCodeChange();
}
if (explicitNode != null) {
if (preserveGoogProvidesAndRequires && explicitNode.hasChildren()) {
return;
}
explicitNode.detachFromParent();
compiler.reportCodeChange();
}
}
Expand Down
Expand Up @@ -50,14 +50,14 @@ public final class ProcessClosurePrimitivesTest extends Es6CompilerTestCase {
private String additionalCode;
private String additionalEndCode;
private boolean addAdditionalNamespace;
private boolean preserveGoogRequires;
private boolean preserveGoogProvidesAndRequires;
private boolean banGoogBase;

@Override protected void setUp() {
additionalCode = null;
additionalEndCode = null;
addAdditionalNamespace = false;
preserveGoogRequires = false;
preserveGoogProvidesAndRequires = false;
banGoogBase = false;
}

Expand All @@ -76,14 +76,14 @@ protected CompilerOptions getOptions() {
@Override public CompilerPass getProcessor(final Compiler compiler) {
if ((additionalCode == null) && (additionalEndCode == null)) {
return new ProcessClosurePrimitives(
compiler, null, CheckLevel.ERROR, preserveGoogRequires);
compiler, null, CheckLevel.ERROR, preserveGoogProvidesAndRequires);
} else {
return new CompilerPass() {
@Override
public void process(Node externs, Node root) {
// Process the original code.
new ProcessClosurePrimitives(
compiler, null, CheckLevel.OFF, preserveGoogRequires)
compiler, null, CheckLevel.OFF, preserveGoogProvidesAndRequires)
.process(externs, root);

// Inject additional code at the beginning.
Expand Down Expand Up @@ -122,7 +122,7 @@ public void process(Node externs, Node root) {

// Process the tree a second time.
new ProcessClosurePrimitives(
compiler, null, CheckLevel.ERROR, preserveGoogRequires)
compiler, null, CheckLevel.ERROR, preserveGoogProvidesAndRequires)
.process(externs, root);
}
};
Expand Down Expand Up @@ -415,13 +415,13 @@ public void testRemovalOfRequires() {
}

public void testPreserveGoogRequires() {
preserveGoogRequires = true;
preserveGoogProvidesAndRequires = true;
test(
"goog.provide('foo'); goog.require('foo');",
"/** @const */ var foo={}; goog.require('foo');");
"/** @const */ var foo={}; goog.provide('foo'); goog.require('foo');");
test(
"goog.provide('foo'); goog.require('foo'); var a = {};",
"/** @const */ var foo = {}; goog.require('foo'); var a = {};");
"/** @const */ var foo = {}; goog.provide('foo'); goog.require('foo'); var a = {};");
}

public void testRequireErrorCases() {
Expand Down

0 comments on commit 4ffe52d

Please sign in to comment.