Ray Cromwell has uploaded a new change for review.

  https://gwt-review.googlesource.com/2230


Change subject: Adds two new optional configuration properties to allow the JsNamer passes to exclude a set of predefined symbols or symbol suffixes in the output. This is to enable better integration with closure compiler which has optimization passes that trigger off o
......................................................................

Adds two new optional configuration properties to allow the JsNamer passes
to exclude a set of predefined symbols or symbol suffixes in the output.
This is to enable better integration with closure compiler which has
optimization passes that trigger off of certain magic symbols.

Change-Id: I0eb0535cd2c7693aae162e246332dc7bca87d241
---
M dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
M dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
M dev/core/src/com/google/gwt/dev/js/JsNamer.java
M dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java
M dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java
M dev/core/src/com/google/gwt/dev/js/JsVerboseNamer.java
M user/src/com/google/gwt/core/CompilerParameters.gwt.xml
7 files changed, 102 insertions(+), 23 deletions(-)



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 6625870..e1162e2 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
@@ -449,16 +449,16 @@
          * function within the program.
          */
         TopFunctionStringInterner.exec(jsProgram);
-        JsObfuscateNamer.exec(jsProgram);
+        JsObfuscateNamer.exec(jsProgram, null);
         break;
       case PRETTY:
         // We don't intern strings in pretty mode to improve readability
-        JsPrettyNamer.exec(jsProgram);
+        JsPrettyNamer.exec(jsProgram, null);
         break;
       case DETAILED:
         // As above with OBFUSCATED
         TopFunctionStringInterner.exec(jsProgram);
-        JsVerboseNamer.exec(jsProgram);
+        JsVerboseNamer.exec(jsProgram, null);
         break;
       default:
         throw new InternalCompilerException("Unknown output mode");
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index e1a6180..3d59431 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -422,7 +422,7 @@
       switch (options.getOutput()) {
         case OBFUSCATED:
obfuscateMap = JsStringInterner.exec(jprogram, jsProgram, isIE6orUnknown);
-          JsObfuscateNamer.exec(jsProgram);
+          JsObfuscateNamer.exec(jsProgram, propertyOracles);
           if (options.isAggressivelyOptimize()) {
if (JsStackEmulator.getStackMode(propertyOracles) == JsStackEmulator.StackMode.STRIP) {
               boolean changed = false;
@@ -433,18 +433,18 @@
               if (changed) {
                 JsUnusedFunctionRemover.exec(jsProgram);
                 // run again
-                JsObfuscateNamer.exec(jsProgram);
+                JsObfuscateNamer.exec(jsProgram, propertyOracles);
               }
             }
           }
           break;
         case PRETTY:
// We don't intern strings in pretty mode to imprmakeSouove readability
-          JsPrettyNamer.exec(jsProgram);
+          JsPrettyNamer.exec(jsProgram, propertyOracles);
           break;
         case DETAILED:
obfuscateMap = JsStringInterner.exec(jprogram, jsProgram, isIE6orUnknown);
-          JsVerboseNamer.exec(jsProgram);
+          JsVerboseNamer.exec(jsProgram, propertyOracles);
           break;
         default:
           throw new InternalCompilerException("Unknown output mode");
diff --git a/dev/core/src/com/google/gwt/dev/js/JsNamer.java b/dev/core/src/com/google/gwt/dev/js/JsNamer.java
index f9c8b7f..df98be0 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsNamer.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsNamer.java
@@ -15,6 +15,9 @@
  */
 package com.google.gwt.dev.js;

+import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
+import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.dev.js.ast.JsContext;
 import com.google.gwt.dev.js.ast.JsForIn;
 import com.google.gwt.dev.js.ast.JsFunction;
@@ -28,6 +31,9 @@
 import com.google.gwt.dev.js.ast.JsVars;
 import com.google.gwt.dev.js.ast.JsVisitor;

+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;

@@ -35,6 +41,10 @@
  * A class that allocates unique identifiers for JsNames.
  */
 public abstract class JsNamer {
+
+  static final String BLACKLIST = "js.identifier.blacklist";
+  static final String BLACKLIST_SUFFIXES =
+      "js.identifier.blacklist.suffixes";

   private static Set<JsName> collectReferencedNames(JsProgram program) {
     final Set<JsName> referenced = new HashSet<JsName>();
@@ -87,9 +97,43 @@

   protected final Set<JsName> referenced;

-  public JsNamer(JsProgram program) {
+  protected final Collection<String> blacklistedIdents;
+
+  protected final Collection<String> blacklistedSuffixes;
+
+  public JsNamer(JsProgram program, PropertyOracle[] propertyOracles) {
     this.program = program;
     referenced = collectReferencedNames(program);
+    Set<String> blacklist = new HashSet<String>();
+    Collection<String> blacklistSuffixes = new ArrayList<String>();
+    if (propertyOracles != null) {
+      for (PropertyOracle propOracle : propertyOracles) {
+        try {
+          maybeAddToBlacklist(BLACKLIST, blacklist, propOracle);
+ maybeAddToBlacklist(BLACKLIST_SUFFIXES, blacklistSuffixes, propOracle);
+        } catch (BadPropertyValueException e) {
+        }
+      }
+    }
+    blacklistedIdents = Collections.unmodifiableCollection(blacklist);
+ blacklistedSuffixes = Collections.unmodifiableCollection(blacklistSuffixes);
+  }
+
+ private void maybeAddToBlacklist(String propName, Collection<String> blacklist,
+      PropertyOracle propOracle)
+      throws BadPropertyValueException {
+    ConfigurationProperty configProp =
+        propOracle.getConfigurationProperty(propName);
+    if (configProp != null) {
+      // supports multivalue property
+      for (String bannedSymbols : configProp.getValues()) {
+        // and comma separated list
+        String [] idents = bannedSymbols.split(",");
+        for (String ident : idents) {
+          blacklist.add(ident);
+        }
+      }
+    }
   }

   protected final void execImpl() {
@@ -102,4 +146,17 @@
   protected abstract void reset();

   protected abstract void visit(JsScope scope);
+
+  protected boolean isLegalIdent(String newIdent) {
+    if (JsKeywords.isKeyword(newIdent)) {
+      return false;
+    }
+    String lcIdent = newIdent.toLowerCase();
+    for (String suffix : blacklistedSuffixes) {
+      if (lcIdent.endsWith(suffix)) {
+        return false;
+      }
+    }
+    return !blacklistedIdents.contains(newIdent);
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java b/dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java
index 19c7820..988bbf8 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsObfuscateNamer.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.dev.js;

+import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.dev.js.ast.JsName;
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsScope;
@@ -38,7 +39,11 @@
       '2', '3', '4', '5', '6', '7', '8', '9'};

   public static void exec(JsProgram program) {
-    new JsObfuscateNamer(program).execImpl();
+    new JsObfuscateNamer(program, null).execImpl();
+  }
+
+ public static void exec(JsProgram program, PropertyOracle[] propertyOracles) {
+    new JsObfuscateNamer(program, propertyOracles).execImpl();
   }

   /**
@@ -51,8 +56,8 @@
    */
   private final char[] sIdentBuf = new char[6];

-  public JsObfuscateNamer(JsProgram program) {
-    super(program);
+ public JsObfuscateNamer(JsProgram program, PropertyOracle[] propertyOracles) {
+    super(program, propertyOracles);
   }

   @Override
@@ -105,7 +110,7 @@
   }

   private boolean isLegal(JsScope scope, String newIdent) {
-    if (JsKeywords.isKeyword(newIdent)) {
+    if (!isLegalIdent(newIdent)) {
       return false;
     }
     /*
diff --git a/dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java b/dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java
index 6fe40f7..8ebbd96 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsPrettyNamer.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.dev.js;

+import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.dev.js.ast.JsName;
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsScope;
@@ -29,8 +30,8 @@
  */
 public class JsPrettyNamer extends JsNamer {

-  public static void exec(JsProgram program) {
-    new JsPrettyNamer(program).execImpl();
+ public static void exec(JsProgram program, PropertyOracle[] propertyOracles) {
+    new JsPrettyNamer(program, propertyOracles).execImpl();
   }

   /**
@@ -38,8 +39,8 @@
    */
   private Set<String> childIdents = null;

-  public JsPrettyNamer(JsProgram program) {
-    super(program);
+ public JsPrettyNamer(JsProgram program, PropertyOracle[] propertyOracles) {
+    super(program, propertyOracles);
   }

   @Override
@@ -104,9 +105,10 @@

   private boolean isLegal(JsScope scope, Set<String> childIdents,
       String newIdent) {
-    if (JsKeywords.isKeyword(newIdent)) {
+    if (!isLegalIdent(newIdent)) {
       return false;
     }
+
     if (childIdents.contains(newIdent)) {
       // one of my children already claimed this ident
       return false;
diff --git a/dev/core/src/com/google/gwt/dev/js/JsVerboseNamer.java b/dev/core/src/com/google/gwt/dev/js/JsVerboseNamer.java
index 73c3552..567bedc 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsVerboseNamer.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsVerboseNamer.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.dev.js;

+import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.dev.js.ast.JsName;
 import com.google.gwt.dev.js.ast.JsProgram;
 import com.google.gwt.dev.js.ast.JsScope;
@@ -27,12 +28,12 @@
  */
 public class JsVerboseNamer extends JsNamer {

-  public static void exec(JsProgram program) {
-    new JsVerboseNamer(program).execImpl();
+ public static void exec(JsProgram program, PropertyOracle[] propertyOracles) {
+    new JsVerboseNamer(program, propertyOracles).execImpl();
   }

-  public JsVerboseNamer(JsProgram program) {
-    super(program);
+ public JsVerboseNamer(JsProgram program, PropertyOracle[] propertyOracles) {
+    super(program, propertyOracles);
   }

   @Override
@@ -78,8 +79,8 @@
     }
   }

-  private boolean isLegal(String newIdent) {
+  protected boolean isLegal(String newIdent) {
     // only keywords are forbidden
-    return !JsKeywords.isKeyword(newIdent);
+    return isLegalIdent(newIdent);
   }
 }
diff --git a/user/src/com/google/gwt/core/CompilerParameters.gwt.xml b/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
index 6e9dae7..81435a2 100644
--- a/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
+++ b/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
@@ -88,4 +88,18 @@
   <define-property name="compiler.useSymbolMaps" values="true,false"/>
   <set-property name="compiler.useSymbolMaps" value="false"/>

+  <!--
+ Specifies an additional list of Javascript identifiers which are disallowed
+    as symbols in the module output.
+  -->
+  <define-configuration-property name="js.identifier.blacklist"
+                                 is-multi-valued="true"/>
+
+  <!--
+ Specifies an additional list of Javascript identifiers which are disallowed
+    as symbols in the module output if they end with one of the given
+    case insensitive suffixes.
+   -->
+  <define-configuration-property name="js.identifier.blacklist.suffixes"
+                                   is-multi-valued="true"/>
 </module>

--
To view, visit https://gwt-review.googlesource.com/2230
To unsubscribe, visit https://gwt-review.googlesource.com/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0eb0535cd2c7693aae162e246332dc7bca87d241
Gerrit-PatchSet: 1
Gerrit-Project: gwt
Gerrit-Branch: master
Gerrit-Owner: Ray Cromwell <cromwell...@google.com>

--
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors
--- You received this message because you are subscribed to the Google Groups "Google Web Toolkit Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-web-toolkit-contributors+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to