blob: 1d5382804e49895cbed9f867c3e4f6dbe73e57f3 [file] [log] [blame]
/*
* Copyright 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.js;
import com.google.gwt.dev.cfg.ConfigurationProperties;
import com.google.gwt.dev.js.ast.JsName;
import com.google.gwt.dev.js.ast.JsProgram;
import com.google.gwt.dev.js.ast.JsScope;
/**
* A namer that uses long, fully qualified names for maximum unambiguous
* debuggability.
*/
public class JsVerboseNamer extends JsNamer {
public static void exec(JsProgram program, ConfigurationProperties config) throws IllegalNameException {
new JsVerboseNamer(program, config).execImpl();
}
public JsVerboseNamer(JsProgram program, ConfigurationProperties config) {
super(program, config);
}
@Override
protected void reset() {
// Nothing to do.
}
@Override
protected void visit(JsScope scope) {
// Visit children.
for (JsScope child : scope.getChildren()) {
visit(child);
}
// Visit all my idents.
for (JsName name : scope.getAllNames()) {
if (!referenced.contains(name)) {
// Don't allocate idents for non-referenced names.
continue;
}
if (!name.isObfuscatable()) {
// Unobfuscatable names become themselves.
name.setShortIdent(name.getIdent());
continue;
}
String fullIdent = name.getIdent();
// Fixes package-info.java classes.
fullIdent = fullIdent.replace("-", "_");
if (!isLegal(fullIdent)) {
String checkIdent;
for (int i = 0; true; ++i) {
checkIdent = fullIdent + "_" + i;
if (isLegal(checkIdent)) {
break;
}
}
name.setShortIdent(checkIdent);
} else {
// set each name's short ident to its full ident
name.setShortIdent(fullIdent);
}
}
}
protected boolean isLegal(String newIdent) {
return reserved.isAvailable(newIdent);
}
}