/* * 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.js.ast.JsName; import com.google.gwt.dev.js.ast.JsProgram; import com.google.gwt.dev.js.ast.JsScope; import java.util.Iterator; /** * A namer that uses long, fully qualified names for maximum unambiguous * debuggability. */ public class JsVerboseNamer extends JsNamer { public static void exec(JsProgram program) { new JsVerboseNamer(program).execImpl(); } public JsVerboseNamer(JsProgram program) { super(program); } @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 (Iterator<JsName> it = scope.getAllNames(); it.hasNext();) { JsName name = it.next(); 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(); if (!isLegal(fullIdent)) { String checkIdent = fullIdent; 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); } } } private boolean isLegal(String newIdent) { // only keywords are forbidden return !JsKeywords.isKeyword(newIdent); } }