Skip to content

Commit

Permalink
Suggest const aliases for suggested fixes in goog.requires in files t…
Browse files Browse the repository at this point in the history
…hat use the var foo = goog.require('bar.foo'); style.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=193087075
  • Loading branch information
bangert authored and blickly committed Apr 16, 2018
1 parent 45ba04f commit 64a2db1
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 14 deletions.
28 changes: 14 additions & 14 deletions src/com/google/javascript/refactoring/SuggestedFix.java
Expand Up @@ -698,8 +698,8 @@ public Builder addGoogRequire(Match m, String namespace) {
IR.string(namespace));

String shortName = getShortNameForRequire(namespace);
boolean useConstRequire = usesConstGoogRequires(metadata, script);
if (useConstRequire) {
boolean useAliasedRequire = usesConstGoogRequires(metadata, script);
if (useAliasedRequire) {
googRequireNode = IR.constNode(IR.name(shortName), googRequireNode);
} else {
googRequireNode = IR.exprResult(googRequireNode);
Expand Down Expand Up @@ -805,9 +805,9 @@ private boolean usesConstGoogRequires(final NodeMetadata metadata, Node script)
if (script.isModuleBody()) {
return true;
}
HasConstRequireOrModuleCallback callback = new HasConstRequireOrModuleCallback(metadata);
HasAliasedRequireOrModuleCallback callback = new HasAliasedRequireOrModuleCallback(metadata);
NodeTraversal.traverse(metadata.getCompiler(), script, callback);
return callback.getUsesConstRequires();
return callback.getUsesAliasedRequires();
}

/**
Expand Down Expand Up @@ -969,30 +969,30 @@ static MatchedNodeInfo create(Node node, boolean closurized) {
}

/** Traverse an AST and find {@code goog.module} or {@code const X = goog.require('...');}. */
private static class HasConstRequireOrModuleCallback extends AbstractPreOrderCallback {
private boolean usesConstRequires;
private static class HasAliasedRequireOrModuleCallback extends AbstractPreOrderCallback {
private boolean usesAliasedRequires;
final NodeMetadata metadata;

public HasConstRequireOrModuleCallback(NodeMetadata metadata) {
this.usesConstRequires = false;
public HasAliasedRequireOrModuleCallback(NodeMetadata metadata) {
this.usesAliasedRequires = false;
this.metadata = metadata;
}

boolean getUsesConstRequires() {
return usesConstRequires;
boolean getUsesAliasedRequires() {
return usesAliasedRequires;
}

@Override
public boolean shouldTraverse(NodeTraversal nodeTraversal, Node n, Node parent) {
if (Matchers.googModule().matches(n, metadata) || isConstRequire(n, metadata)) {
usesConstRequires = true;
if (Matchers.googModule().matches(n, metadata) || isAliasedRequire(n, metadata)) {
usesAliasedRequires = true;
return false;
}
return true;
}

private static boolean isConstRequire(Node node, NodeMetadata metadata) {
return node.isConst()
private static boolean isAliasedRequire(Node node, NodeMetadata metadata) {
return NodeUtil.isNameDeclaration(node)
&& node.getFirstFirstChild() != null
&& Matchers.googRequire().matches(node.getFirstFirstChild(), metadata);
}
Expand Down
24 changes: 24 additions & 0 deletions test/com/google/javascript/refactoring/SuggestedFixTest.java
Expand Up @@ -890,6 +890,30 @@ public void testAddRequireConst() {
assertChanges(fix, "", input, expected);
}

@Test
public void testAddRequireVar() {
String input =
Joiner.on('\n').join(
"var bar = goog.require('goog.bar');",
"",
"/** @private */",
"function foo_() {};");
String expected =
Joiner.on('\n').join(
"var bar = goog.require('goog.bar');",
// We add new imports as const per the Google Style Guide;
// TODO(bangert): we could add complexity to add new imports as var if we want to.
"const safe = goog.require('goog.safe');",
"",
"/** @private */",
"function foo_() {};");
Compiler compiler = getCompiler(input);
Node root = compileToScriptRoot(compiler);
Match match = new Match(root.getFirstChild(), new NodeMetadata(compiler));
SuggestedFix fix = new SuggestedFix.Builder().addGoogRequire(match, "goog.safe").build();
assertChanges(fix, "", input, expected);
}

@Test
public void testAddRequireModuleUnchanged() {
String input =
Expand Down

0 comments on commit 64a2db1

Please sign in to comment.