Skip to content

Commit

Permalink
During commonjs rewriting, copy any annotations to newly created nodes
Browse files Browse the repository at this point in the history
Closes #2142

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138904389
  • Loading branch information
ChadKillingsworth authored and blickly committed Nov 12, 2016
1 parent 30cc43e commit 1079a81
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 20 deletions.
46 changes: 26 additions & 20 deletions src/com/google/javascript/jscomp/ProcessCommonJSModules.java
Expand Up @@ -898,61 +898,67 @@ private void updateNameReference(
if (newNameIsQualified) {
// Refactor a var declaration to a getprop assignment
Node getProp = NodeUtil.newQName(compiler, newName, nameRef, originalName);
JSDocInfo info = parent.getJSDocInfo();
if (info != null) {
parent.setJSDocInfo(null);
getProp.setJSDocInfo(info);
}

if (nameRef.hasChildren()) {
Node expr =
IR.exprResult(IR.assign(getProp, nameRef.getFirstChild().detachFromParent()))
.useSourceInfoIfMissingFromForTree(nameRef);
parent.getParent().replaceChild(parent, expr);
} else {
parent.getParent().replaceChild(parent, getProp);
parent.getParent()
.replaceChild(parent, IR.exprResult(getProp).useSourceInfoFrom(getProp));
}
} else if (newNameDeclaration != null) {
// Variable is already defined. Convert this to an assignment.
Node name = NodeUtil.newName(compiler, newName, nameRef, originalName);
Node assign = IR.assign(name, nameRef.getFirstChild().detachFromParent());
JSDocInfo info = parent.getJSDocInfo();
if (info != null) {
parent.setJSDocInfo(null);
assign.setJSDocInfo(info);
}

parent
.getParent()
.replaceChild(
parent,
IR.exprResult(IR.assign(name, nameRef.getFirstChild().detachFromParent()))
IR.exprResult(assign)
.useSourceInfoFromForTree(nameRef));
} else {
nameRef.setString(newName);
nameRef.setOriginalName(originalName);
}
break;

case GETPROP:
{
Node name =
newNameIsQualified
? NodeUtil.newQName(compiler, newName, nameRef, originalName)
: NodeUtil.newName(compiler, newName, nameRef, originalName);
parent.replaceChild(nameRef, name);
moveChildrenToNewNode(nameRef, name);

break;
}
default:
{
Node name =
newNameIsQualified
? NodeUtil.newQName(compiler, newName, nameRef, originalName)
: NodeUtil.newName(compiler, newName, nameRef, originalName);

JSDocInfo info = nameRef.getJSDocInfo();
if (info != null) {
nameRef.setJSDocInfo(null);
name.setJSDocInfo(info);
}
parent.replaceChild(nameRef, name);
moveChildrenToNewNode(nameRef, name);
if (nameRef.hasChildren()) {
name.addChildrenToFront(nameRef.removeChildren());
}

break;
}
}

compiler.reportCodeChange();
}

private void moveChildrenToNewNode(Node oldNode, Node newNode) {
while (oldNode.hasChildren()) {
newNode.addChildToBack(oldNode.getFirstChild().detachFromParent());
}
}

/**
* Determine whether the given name Node n is referenced in an export
*
Expand Down
15 changes: 15 additions & 0 deletions test/com/google/javascript/jscomp/ProcessCommonJSModulesTest.java
Expand Up @@ -486,4 +486,19 @@ public void testDestructuringImports() {
"const {foo, bar} = module$other;",
"var baz = module$other.foo + module$other.bar;"));
}

public void testAnnotationsCopied() {
setLanguage(CompilerOptions.LanguageMode.ECMASCRIPT6, CompilerOptions.LanguageMode.ECMASCRIPT5);
setFilename("test");
testModules(
LINE_JOINER.join(
"/** @interface */ var a;",
"/** @type {string} */ a.prototype.foo;",
"module.exports.a = a;"),
LINE_JOINER.join(
"goog.provide('module$test');",
"/** @const */ var module$test = {};",
"/** @interface */ module$test.a;",
"/** @type {string} */ module$test.a.prototype.foo;"));
}
}

0 comments on commit 1079a81

Please sign in to comment.