Small refactor for creating unobfuscatable JsNames.

Change-Id: I408ecc48d0cb997f219bd138924fcf8083cc5eb7
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
index f9ad04a..c40f4d5 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
@@ -47,7 +47,6 @@
 import com.google.gwt.dev.js.ast.JsContext;
 import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsModVisitor;
-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 com.google.gwt.dev.resource.ResourceOracle;
@@ -436,8 +435,7 @@
     Reader r = new StringReader(program);
     JsProgram jsProgram = new JsProgram();
     JsScope topScope = jsProgram.getScope();
-    JsName funcName = topScope.declareName(getModuleFunctionName());
-    funcName.setObfuscatable(false);
+    topScope.declareUnobfuscatableName(getModuleFunctionName());
 
     try {
       SourceInfo sourceInfo = jsProgram.createSourceInfo(1,
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index d24ae56..0da095f 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -440,8 +440,7 @@
       } else {
         JsName jsName;
         if (x.isJsProperty()) {
-          jsName = scopeStack.peek().declareName(name, name);
-          jsName.setObfuscatable(false);
+          jsName = scopeStack.peek().declareUnobfuscatableName(name);
         } else {
           jsName = scopeStack.peek().declareName(mangleName, name);
         }
@@ -719,24 +718,17 @@
 
     private final Map<String, Object> exportedMembersByExportName = new TreeMap<String, Object>();
 
-    private final JsName arrayLength = objectScope.declareName("length");
-
     private final Map<JClassType, JsFunction> clinitMap = Maps.newHashMap();
 
     private JMethod currentMethod = null;
 
-    private final JsName globalTemp = topScope.declareName("_");
+    private final JsName arrayLength = objectScope.declareUnobfuscatableName("length");
 
-    private final JsName prototype = objectScope.declareName("prototype");
+    private final JsName globalTemp = topScope.declareUnobfuscatableName("_");
 
-    private final JsName call = objectScope.declareName("call");
+    private final JsName prototype = objectScope.declareUnobfuscatableName("prototype");
 
-    {
-      globalTemp.setObfuscatable(false);
-      prototype.setObfuscatable(false);
-      call.setObfuscatable(false);
-      arrayLength.setObfuscatable(false);
-    }
+    private final JsName call = objectScope.declareUnobfuscatableName("call");
 
     /**
      * Holds any local variable declarations which must be inserted into the current JS function
@@ -2575,8 +2567,7 @@
     private void generateToStringAlias(JClassType x, List<JsStatement> globalStmts) {
       JMethod toStringMethod = program.getIndexedMethod("Object.toString");
       if (x.getMethods().contains(toStringMethod)) {
-        JsName toStringName = objectScope.declareName("toString");
-        toStringName.setObfuscatable(false);
+        JsName toStringName = objectScope.declareUnobfuscatableName("toString");
         generateVTableAlias(globalStmts, toStringMethod, toStringName);
       }
     }
@@ -2651,8 +2642,7 @@
 
         if (method.exposesJsMethod()) {
           String jsName = method.getJsName();
-          JsName exportedName = interfaceScope.declareName(jsName, jsName);
-          exportedName.setObfuscatable(false);
+          JsName exportedName = interfaceScope.declareUnobfuscatableName(jsName);
           generateVTableAlias(globalStmts, method, exportedName);
         }
 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
index 6860e88..184ef75 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
@@ -444,7 +444,7 @@
       names = new JsName[stringNames.length];
       for (int i = 0; i < stringNames.length; i++) {
         names[i] = new JsName(null, stringNames[i], stringNames[i]);
-        names[i].setObfuscatable(false);
+        names[i].setUnobfuscatable();
       }
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/js/JsSymbolResolver.java b/dev/core/src/com/google/gwt/dev/js/JsSymbolResolver.java
index beeb750..67d4970 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsSymbolResolver.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsSymbolResolver.java
@@ -37,15 +37,13 @@
         name = getScope().findExistingName(ident);
         if (name == null) {
           // No clue what this is; create a new unobfuscatable name
-          name = program.getScope().declareName(ident);
-          name.setObfuscatable(false);
+          name = program.getScope().declareUnobfuscatableName(ident);
         }
       } else {
         name = program.getObjectScope().findExistingName(ident);
         if (name == null) {
           // No clue what this is; create a new unobfuscatable name
-          name = program.getObjectScope().declareName(ident);
-          name.setObfuscatable(false);
+          name = program.getObjectScope().declareUnobfuscatableName(ident);
         }
       }
       x.resolve(name);
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsName.java b/dev/core/src/com/google/gwt/dev/js/ast/JsName.java
index b0eb6a7..3b85f27 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsName.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsName.java
@@ -76,8 +76,8 @@
     return ref;
   }
 
-  public void setObfuscatable(boolean isObfuscatable) {
-    this.isObfuscatable = isObfuscatable;
+  public void setUnobfuscatable() {
+    this.isObfuscatable = false;
   }
 
   public void setShortIdent(String shortIdent) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsRootName.java b/dev/core/src/com/google/gwt/dev/js/ast/JsRootName.java
index ef7411f..4b76591 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsRootName.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsRootName.java
@@ -34,11 +34,11 @@
 
   JsRootName(JsRootScope rootScope, String ident) {
     super(rootScope, ident, ident);
-    super.setObfuscatable(false);
+    super.setUnobfuscatable();
   }
 
   @Override
-  public void setObfuscatable(boolean isObfuscatable) {
+  public void setUnobfuscatable() {
     throw new UnsupportedOperationException("Root names are immutable");
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java b/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java
index 45ee198..9c4072f 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsScope.java
@@ -82,6 +82,18 @@
   }
 
   /**
+   * Gets a name object associated with the specified ident in this scope, creating it if necessary,
+   * and makes it non obfuscatable.
+   *
+   * @param ident An identifier that is unique within this scope.
+   */
+  public final JsName declareUnobfuscatableName(String ident) {
+    JsName name = declareName(ident);
+    name.setUnobfuscatable();
+    return name;
+  }
+
+  /**
    * Attempts to find the name object for the specified ident, searching in this scope, and if not
    * found, in the parent scopes.
    *
diff --git a/dev/core/test/com/google/gwt/dev/js/JsNamerTest.java b/dev/core/test/com/google/gwt/dev/js/JsNamerTest.java
index c81399b..bb24cfa 100644
--- a/dev/core/test/com/google/gwt/dev/js/JsNamerTest.java
+++ b/dev/core/test/com/google/gwt/dev/js/JsNamerTest.java
@@ -146,7 +146,7 @@
       String functionName = "foo" + JsIncrementalNamer.RESERVED_IDENT_SUFFIX;
       JsProgram jsProgram = parseJs(
           "function " + functionName + "() { return 42; }");
-      jsProgram.getScope().findExistingName(functionName).setObfuscatable(false);
+      jsProgram.getScope().findExistingName(functionName).setUnobfuscatable();
       rename(jsProgram, JsOutputOption.OBFUSCATED, true);
       fail("Naming an unobfuscatable identifier containing the reserved suffix should have "
           + "thrown an exception in JsIncrementalNamer.");