in compiler-jx/src/main/java/com/google/javascript/jscomp/RenamePropertiesWithModuleSupport.java [363:500]
public void visit(NodeTraversal t, Node n, Node parent) {
switch (n.getToken()) {
case COMPUTED_PROP:
break;
case GETPROP:
Node propNode = n.getSecondChild();
if (propNode.isString()) {
if (compiler.getCodingConvention().blockRenamingForProperty(
propNode.getString())) {
externedNames.add(propNode.getString());
break;
} else if(propertyNamesToKeep != null && propertyNamesToKeep.contains(propNode.getString())) {
break;
}
maybeMarkCandidate(propNode);
}
break;
case OBJECTLIT:
for (Node key = n.getFirstChild(); key != null; key = key.getNext()) {
if (key.isComputedProp()) {
// We don't want to rename computed properties
continue;
} else if (key.isQuotedString()) {
// Ensure that we never rename some other property in a way
// that could conflict with this quoted key.
quotedNames.add(key.getString());
} else if (compiler.getCodingConvention().blockRenamingForProperty(key.getString())) {
externedNames.add(key.getString());
} else if(propertyNamesToKeep != null && propertyNamesToKeep.contains(key.getString())) {
continue;
} else {
maybeMarkCandidate(key);
}
}
break;
case OBJECT_PATTERN:
// Iterate through all the nodes in the object pattern
for (Node key = n.getFirstChild(); key != null; key = key.getNext()) {
if (key.isComputedProp()) {
// We don't want to rename computed properties
continue;
} else if (key.isQuotedString()) {
// Ensure that we never rename some other property in a way
// that could conflict with this quoted key.
quotedNames.add(key.getString());
} else if (compiler.getCodingConvention().blockRenamingForProperty(key.getString())) {
externedNames.add(key.getString());
} else if(propertyNamesToKeep != null && propertyNamesToKeep.contains(key.getString())) {
continue;
} else {
maybeMarkCandidate(key);
}
}
break;
case GETELEM:
// If this is a quoted property access (e.g. x['myprop']), we need to
// ensure that we never rename some other property in a way that
// could conflict with this quoted name.
Node child = n.getLastChild();
if (child != null && child.isString()) {
quotedNames.add(child.getString());
}
break;
case CALL: {
// We replace property renaming function calls with a string
// containing the renamed property.
Node fnName = n.getFirstChild();
if (compiler
.getCodingConvention()
.isPropertyRenameFunction(fnName.getOriginalQualifiedName())) {
callNodeToParentMap.put(n, parent);
countCallCandidates(t, n);
}
break;
}
case CLASS_MEMBERS:
{
// Replace function names defined in a class scope
for (Node key = n.getFirstChild(); key != null; key = key.getNext()) {
if (key.isComputedProp()) {
// We don't want to rename computed properties.
continue;
} else {
Node member = key.getFirstChild();
String memberDefName = key.getString();
if (member.isFunction()) {
Node fnName = member.getFirstChild();
if (compiler.getCodingConvention().blockRenamingForProperty(memberDefName)) {
externedNames.add(fnName.getString());
} else if(propertyNamesToKeep != null && propertyNamesToKeep.contains(memberDefName)) {
continue;
} else if (memberDefName.equals("constructor")
|| memberDefName.equals("superClass_")) {
// TODO (simarora) is there a better way to identify these externs?
externedNames.add(fnName.getString());
} else {
maybeMarkCandidate(key);
}
}
}
}
break;
}
case FUNCTION:
{
// We eliminate any stub implementations of JSCompiler_renameProperty
// that we encounter.
if (NodeUtil.isFunctionDeclaration(n)) {
String name = n.getFirstChild().getString();
if (NodeUtil.JSC_PROPERTY_NAME_FN.equals(name)) {
toRemove.add(n);
}
} else if (parent.isName()
&& NodeUtil.JSC_PROPERTY_NAME_FN.equals(parent.getString())) {
Node varNode = parent.getParent();
if (varNode.isVar()) {
toRemove.add(parent);
}
} else if (NodeUtil.isFunctionExpression(n)
&& parent.isAssign()
&& parent.getFirstChild().isGetProp()
&& compiler
.getCodingConvention()
.isPropertyRenameFunction(parent.getFirstChild().getOriginalQualifiedName())) {
Node exprResult = parent.getParent();
if (exprResult.isExprResult()
&& NodeUtil.isStatementBlock(exprResult.getParent())
&& exprResult.getFirstChild().isAssign()) {
toRemove.add(exprResult);
}
}
break;
}
default:
break;
}
}