Display Java method and class names in chrome dev tools.

Chrome dev tools support renaming of functions in compiled
JavaScript by adding a property called displayName to the function.
Throughout dev tools this name will be used instead of the JavaScript
function name, improving the expierence in the debugger, profiler and
timeline.

Change-Id: Ic5d29b7b15772ac996bd6cb310d1370bc28c4d70
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/CompilerOptionsImpl.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/CompilerOptionsImpl.java
index c8c1bf7..96ad98a 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/CompilerOptionsImpl.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/CompilerOptionsImpl.java
@@ -20,6 +20,7 @@
 import com.google.gwt.dev.cfg.Properties;
 import com.google.gwt.dev.jjs.JsOutputOption;
 import com.google.gwt.dev.js.JsNamespaceOption;
+import com.google.gwt.dev.util.arg.DisplayNameMode;
 import com.google.gwt.dev.util.arg.JsInteropMode;
 import com.google.gwt.dev.util.arg.OptionOptimize;
 import com.google.gwt.dev.util.arg.SourceLevel;
@@ -43,6 +44,7 @@
   private final boolean strictPublicResources;
   private final boolean strictSourceResources;
   private final JsInteropMode jsInteropMode;
+  private final DisplayNameMode displayNameMode;
 
   CompilerOptionsImpl(CompileDir compileDir, String moduleName, Options options) {
     this.compileDir = compileDir;
@@ -54,6 +56,7 @@
     this.strictPublicResources = options.enforceStrictResources();
     this.logLevel = options.getLogLevel();
     this.jsInteropMode = options.getJsInteropMode();
+    this.displayNameMode = options.getDisplayNameMode();
   }
 
   @Override
@@ -325,4 +328,9 @@
   public boolean warnMissingDeps() {
     return false;
   }
+
+  @Override
+  public DisplayNameMode getDisplayNameMode() {
+    return displayNameMode;
+  }
 }
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
index 882c179..1b1d3e4 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
@@ -23,7 +23,9 @@
 import com.google.gwt.dev.util.arg.ArgHandlerJsInteropMode;
 import com.google.gwt.dev.util.arg.ArgHandlerLogLevel;
 import com.google.gwt.dev.util.arg.ArgHandlerSourceLevel;
+import com.google.gwt.dev.util.arg.DisplayNameMode;
 import com.google.gwt.dev.util.arg.JsInteropMode;
+import com.google.gwt.dev.util.arg.OptionDisplayNameLevel;
 import com.google.gwt.dev.util.arg.OptionIncrementalCompile;
 import com.google.gwt.dev.util.arg.OptionJsInteropMode;
 import com.google.gwt.dev.util.arg.OptionLogLevel;
@@ -78,6 +80,7 @@
   private boolean strictResources = false;
   private int compileTestRecompiles = 0;
   private JsInteropMode jsInteropMode = JsInteropMode.NONE;
+  private DisplayNameMode displayNameMode = DisplayNameMode.ABBREVIATED;
 
   /**
    * Sets each option to the appropriate value, based on command-line arguments.
@@ -303,6 +306,7 @@
       registerHandler(new BindAddressFlag());
       registerHandler(new CompileTestFlag());
       registerHandler(new CompileTestRecompilesFlag());
+      registerHandler(new DisplayNameLevel());
       registerHandler(new FailOnErrorFlag());
       registerHandler(new ModuleNameArgument());
       registerHandler(new NoPrecompileFlag());
@@ -700,4 +704,52 @@
       return true;
     }
   }
+
+  private class DisplayNameLevel extends ArgHandlerString {
+
+    public DisplayNameLevel() {
+    }
+
+    @Override
+    public String getPurpose() {
+      return "Emit extra information allow chrome dev tools to display Java identifiers in many" +
+          " places instead of JavaScript functions.";
+    }
+
+    @Override
+    public String getTag() {
+      return "-XdisplayNameMode";
+    }
+
+    @Override
+    public boolean isExperimental() {
+      return true;
+    }
+
+    @Override
+    public boolean setString(String str) {
+      String value = str.toUpperCase();
+      if ("NONE".equals(value)) {
+        displayNameMode = DisplayNameMode.NONE;
+      } else if ("ONLY_METHOD_NAME".equals(value)) {
+        displayNameMode = DisplayNameMode.ONLY_METHOD_NAME;
+      } else if ("ABBREVIATED".equals(value)) {
+        displayNameMode = DisplayNameMode.ABBREVIATED;
+      } else if ("FULL".equals(value)) {
+        displayNameMode = DisplayNameMode.FULL;
+      } else {
+        return false;
+      }
+      return true;
+    }
+
+    @Override
+    public String[] getTagArgs() {
+      return new String[] {"NONE | ONLY_METHOD_NAME | ABBREVIATED | FULL"};
+    }
+  }
+
+  public DisplayNameMode getDisplayNameMode() {
+    return displayNameMode;
+  }
 }
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
index 38dd1c4..49f3510 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
@@ -82,7 +82,7 @@
       new AtomicReference<ResourceLoader>();
   private final CompilerContext.Builder compilerContextBuilder = new CompilerContext.Builder();
   private CompilerContext compilerContext;
-  private Options options;
+  private final Options options;
 
   Recompiler(OutboxDir outboxDir, LauncherDir launcherDir, String inputModuleName, Options options) {
     this.outboxDir = outboxDir;
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/UnmodifiableCompilerOptions.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/UnmodifiableCompilerOptions.java
index 7820658..c3c30f2 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/UnmodifiableCompilerOptions.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/UnmodifiableCompilerOptions.java
@@ -21,6 +21,7 @@
 import com.google.gwt.dev.cfg.Properties;
 import com.google.gwt.dev.jjs.JsOutputOption;
 import com.google.gwt.dev.js.JsNamespaceOption;
+import com.google.gwt.dev.util.arg.DisplayNameMode;
 import com.google.gwt.dev.util.arg.JsInteropMode;
 import com.google.gwt.dev.util.arg.SourceLevel;
 
@@ -299,4 +300,9 @@
   public final void setWorkDir(File dir) {
     throw new UnsupportedOperationException();
   }
+
+  @Override
+  public void setDisplayNameMode(DisplayNameMode displayNameMode) {
+    throw new UnsupportedOperationException();
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/Compiler.java b/dev/core/src/com/google/gwt/dev/Compiler.java
index 11e59a1..77eec76 100644
--- a/dev/core/src/com/google/gwt/dev/Compiler.java
+++ b/dev/core/src/com/google/gwt/dev/Compiler.java
@@ -32,6 +32,7 @@
 import com.google.gwt.dev.util.PersistenceBackedObject;
 import com.google.gwt.dev.util.Util;
 import com.google.gwt.dev.util.arg.ArgHandlerDeployDir;
+import com.google.gwt.dev.util.arg.ArgHandlerDisplayNameLevel;
 import com.google.gwt.dev.util.arg.ArgHandlerExtraDir;
 import com.google.gwt.dev.util.arg.ArgHandlerIncrementalCompile;
 import com.google.gwt.dev.util.arg.ArgHandlerLocalWorkers;
@@ -69,6 +70,7 @@
       registerHandler(new ArgHandlerDeployDir(options));
       registerHandler(new ArgHandlerExtraDir(options));
       registerHandler(new ArgHandlerSaveSourceOutput(options));
+      registerHandler(new ArgHandlerDisplayNameLevel(options));
     }
 
     @Override
diff --git a/dev/core/src/com/google/gwt/dev/DevMode.java b/dev/core/src/com/google/gwt/dev/DevMode.java
index 439507a..d8003af 100644
--- a/dev/core/src/com/google/gwt/dev/DevMode.java
+++ b/dev/core/src/com/google/gwt/dev/DevMode.java
@@ -34,6 +34,7 @@
 import com.google.gwt.dev.util.Util;
 import com.google.gwt.dev.util.arg.ArgHandlerDeployDir;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableUpdateCheck;
+import com.google.gwt.dev.util.arg.ArgHandlerDisplayNameLevel;
 import com.google.gwt.dev.util.arg.ArgHandlerExtraDir;
 import com.google.gwt.dev.util.arg.ArgHandlerIncrementalCompile;
 import com.google.gwt.dev.util.arg.ArgHandlerJsInteropMode;
@@ -242,6 +243,7 @@
       registerHandler(new ArgHandlerModulePathPrefix(options));
       registerHandler(new ArgHandlerWorkDirOptional(options));
       registerHandler(new ArgHandlerDisableUpdateCheck(options));
+      registerHandler(new ArgHandlerDisplayNameLevel(options));
       registerHandler(new ArgHandlerSourceLevel(options));
       registerHandler(new ArgHandlerJsInteropMode(options));
       registerHandler(new ArgHandlerIncrementalCompile(options));
diff --git a/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java b/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
index 68f6105..68c0fc4 100644
--- a/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/PrecompileTaskOptionsImpl.java
@@ -20,6 +20,7 @@
 import com.google.gwt.dev.jjs.JJSOptionsImpl;
 import com.google.gwt.dev.jjs.JsOutputOption;
 import com.google.gwt.dev.js.JsNamespaceOption;
+import com.google.gwt.dev.util.arg.DisplayNameMode;
 import com.google.gwt.dev.util.arg.JsInteropMode;
 import com.google.gwt.dev.util.arg.SourceLevel;
 
@@ -41,6 +42,7 @@
   private boolean validateOnly;
   private boolean warnOverlappingSource;
   private boolean warnMissingDeps;
+  private DisplayNameMode displayNameMode;
 
   public PrecompileTaskOptionsImpl() {
   }
@@ -76,6 +78,7 @@
     setMissingDepsFile(other.getMissingDepsFile());
     setValidateOnly(other.isValidateOnly());
     setEnabledGeneratingOnShards(other.isEnabledGeneratingOnShards());
+    setDisplayNameMode(other.getDisplayNameMode());
   }
 
   @Override
@@ -486,4 +489,14 @@
   @Override public void setJsInteropMode(JsInteropMode mode) {
     jjsOptions.setJsInteropMode(mode);
   }
+
+  @Override
+  public DisplayNameMode getDisplayNameMode() {
+    return displayNameMode;
+  }
+
+  @Override
+  public void setDisplayNameMode(DisplayNameMode displayNameMode) {
+    this.displayNameMode = displayNameMode;
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
index 3c66a3f..67055dd 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
@@ -21,6 +21,7 @@
 import com.google.gwt.dev.util.arg.OptionClusterSimilarFunctions;
 import com.google.gwt.dev.util.arg.OptionDisableCastChecking;
 import com.google.gwt.dev.util.arg.OptionDisableClassMetadata;
+import com.google.gwt.dev.util.arg.OptionDisplayNameLevel;
 import com.google.gwt.dev.util.arg.OptionEnableAssertions;
 import com.google.gwt.dev.util.arg.OptionEnableClosureCompiler;
 import com.google.gwt.dev.util.arg.OptionFragmentCount;
@@ -58,5 +59,5 @@
     OptionStrictPublicResources, OptionSoycHtmlDisabled, OptionEnableClosureCompiler,
     OptionFragmentsMerge, OptionFragmentCount, OptionSourceLevel, OptionNamespace,
     OptionCheckedMode, OptionJsInteropMode, OptionUseDetailedTypeIds,
-    OptionAllowJDTConstantInlining {
+    OptionAllowJDTConstantInlining, OptionDisplayNameLevel {
 }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
index a0a9ebd..a3d2183 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.jjs;
 
 import com.google.gwt.dev.js.JsNamespaceOption;
+import com.google.gwt.dev.util.arg.DisplayNameMode;
 import com.google.gwt.dev.util.arg.JsInteropMode;
 import com.google.gwt.dev.util.arg.OptionOptimize;
 import com.google.gwt.dev.util.arg.SourceLevel;
@@ -57,6 +58,7 @@
   private boolean strictPublicResources = false;
   private JsInteropMode jsInteropMode = JsInteropMode.NONE;
   private boolean useDetailedTypeIds = false;
+  private DisplayNameMode displayNameMode = DisplayNameMode.NONE;
 
   public JJSOptionsImpl() {
   }
@@ -95,6 +97,7 @@
     setNamespace(other.getNamespace());
     setJsInteropMode(other.getJsInteropMode());
     setUseDetailedTypeIds(other.useDetailedTypeIds());
+    setDisplayNameMode(other.getDisplayNameMode());
   }
 
   @Override
@@ -408,4 +411,13 @@
     return useDetailedTypeIds;
   }
 
+  @Override
+  public DisplayNameMode getDisplayNameMode() {
+    return displayNameMode;
+  }
+
+  @Override
+  public void setDisplayNameMode(DisplayNameMode displayNameMode) {
+    this.displayNameMode = displayNameMode;
+  }
 }
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 e76548f..4a882ae 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
@@ -164,6 +164,7 @@
 import com.google.gwt.dev.util.Name.SourceName;
 import com.google.gwt.dev.util.Pair;
 import com.google.gwt.dev.util.StringInterner;
+import com.google.gwt.dev.util.arg.DisplayNameMode;
 import com.google.gwt.dev.util.arg.JsInteropMode;
 import com.google.gwt.dev.util.arg.OptionOptimize;
 import com.google.gwt.dev.util.collect.Stack;
@@ -903,6 +904,14 @@
         // don't add polymorphic JsFuncs, inline decl into vtable assignment
         if (func != null && !polymorphicJsFunctions.contains(func)) {
           globalStmts.add(func.makeStmt());
+
+          if (shouldEmitDisplayNames()) {
+            // get the original method for this function
+            JMethod originalMethod = javaMethodForJSFunction.get(func);
+            JsExprStmt displayNameAssignment =
+                outputDisplayName(func.getName().makeRef(func.getSourceInfo()), originalMethod);
+            globalStmts.add(displayNameAssignment);
+          }
         }
       }
 
@@ -1214,6 +1223,8 @@
 
       JsFunction jsFunc = pop(); // body
 
+      javaMethodForJSFunction.put(jsFunc, x);
+
       if (!program.isInliningAllowed(x)) {
         jsProgram.disallowInlining(jsFunc);
       }
@@ -2605,6 +2616,37 @@
       JsExprStmt polyAssignment = createAssignment(lhs, rhs).makeStmt();
       globalStmts.add(polyAssignment);
       vtableInitForMethodMap.put(polyAssignment, method);
+
+      if (shouldEmitDisplayNames()) {
+        JsExprStmt displayNameAssignment = outputDisplayName(lhs, method);
+        globalStmts.add(displayNameAssignment);
+        vtableInitForMethodMap.put(displayNameAssignment, method);
+      }
+    }
+
+    private JsExprStmt outputDisplayName(JsNameRef function, JMethod method) {
+      JsNameRef displayName = new JsNameRef(function.getSourceInfo(), "displayName");
+      displayName.setQualifier(function);
+      String displayStringName = getDisplayName(method);
+      JsStringLiteral displayMethodName = new JsStringLiteral(function.getSourceInfo(), displayStringName);
+      return createAssignment(displayName, displayMethodName).makeStmt();
+    }
+
+    private boolean shouldEmitDisplayNames() {
+      return displayNames != DisplayNameMode.NONE;
+    }
+
+    private String getDisplayName(JMethod method) {
+      switch (displayNames) {
+        case ONLY_METHOD_NAME:
+          return method.getName();
+        case ABBREVIATED:
+          return method.getEnclosingType().getShortName() + "." + method.getName();
+        case FULL:
+          return method.getEnclosingType().getName() + "." + method.getName();
+        default:
+          throw new RuntimeException("Invalid value for displayNames: " + displayNames);
+      }
     }
 
     /**
@@ -3248,6 +3290,7 @@
 
   private final Map<JAbstractMethodBody, JsFunction> methodBodyMap = Maps.newIdentityHashMap();
   private final Map<HasName, JsName> names = Maps.newIdentityHashMap();
+  private final Map<JsFunction, JMethod> javaMethodForJSFunction = Maps.newIdentityHashMap();
 
   /**
    * Contains JsNames for the Object instance methods, such as equals, hashCode,
@@ -3315,6 +3358,8 @@
 
   private final PermProps props;
 
+  private DisplayNameMode displayNames;
+
   private GenerateJavaScriptAST(TreeLogger logger, JProgram program, JsProgram jsProgram,
       CompilerContext compilerContext, TypeMapper<?> typeMapper,
       Map<StandardSymbolData, JsName> symbolTable, PermProps props) {
@@ -3329,6 +3374,7 @@
     this.output = compilerContext.getOptions().getOutput();
     this.optimize =
         compilerContext.getOptions().getOptimizationLevel() > OptionOptimize.OPTIMIZE_LEVEL_DRAFT;
+    this.displayNames = compilerContext.getOptions().getDisplayNameMode();
     this.hasWholeWorldKnowledge = compilerContext.shouldCompileMonolithic()
         && !compilerContext.getOptions().isIncrementalCompileEnabled();
     this.compilePerFile = compilerContext.getOptions().isIncrementalCompileEnabled();
diff --git a/dev/core/src/com/google/gwt/dev/shell/SuperDevListener.java b/dev/core/src/com/google/gwt/dev/shell/SuperDevListener.java
index ffac0fd..a31a3b6 100644
--- a/dev/core/src/com/google/gwt/dev/shell/SuperDevListener.java
+++ b/dev/core/src/com/google/gwt/dev/shell/SuperDevListener.java
@@ -22,6 +22,7 @@
 import com.google.gwt.core.ext.linker.impl.StandardLinkerContext;
 import com.google.gwt.dev.DevMode.HostedModeOptions;
 import com.google.gwt.dev.cfg.ModuleDef;
+import com.google.gwt.dev.util.arg.DisplayNameMode;
 import com.google.gwt.dev.util.arg.JsInteropMode;
 
 import java.io.File;
@@ -181,6 +182,11 @@
     for (String mod : options.getModuleNames()) {
       args.add(mod);
     }
+
+    if (options.getDisplayNameMode() != DisplayNameMode.ABBREVIATED) {
+      args.add("-XdisplayNameMode");
+      args.add(options.getDisplayNameMode().toString());
+    }
     return args;
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisplayNameLevel.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisplayNameLevel.java
new file mode 100644
index 0000000..571fa6e
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisplayNameLevel.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2014 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.util.arg;
+
+import com.google.gwt.util.tools.ArgHandlerString;
+
+/**
+ * Argument handler set setting the display name setting in the compiler.
+ */
+public class ArgHandlerDisplayNameLevel extends ArgHandlerString {
+
+  private final OptionDisplayNameLevel option;
+
+  public ArgHandlerDisplayNameLevel(OptionDisplayNameLevel option) {
+    this.option = option;
+  }
+
+  @Override
+  public String getPurpose() {
+    return "Emit extra information allow chrome dev tools to display Java identifiers in many" +
+        " places instead of JavaScript functions.";
+  }
+
+  @Override
+  public String getTag() {
+    return "-XdisplayNameMode";
+  }
+
+  @Override
+  public boolean isExperimental() {
+    return true;
+  }
+
+  @Override
+  public boolean setString(String str) {
+    String value = str.toUpperCase();
+    if ("NONE".equals(value)) {
+      option.setDisplayNameMode(DisplayNameMode.NONE);
+    } else if ("ONLY_METHOD_NAME".equals(value)) {
+      option.setDisplayNameMode(DisplayNameMode.ONLY_METHOD_NAME);
+    } else if ("ABBREVIATED".equals(value)) {
+      option.setDisplayNameMode(DisplayNameMode.ABBREVIATED);
+    } else if ("FULL".equals(value)) {
+      option.setDisplayNameMode(DisplayNameMode.FULL);
+    } else {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public String[] getTagArgs() {
+    return new String[] {"NONE | ONLY_METHOD_NAME | ABBREVIATED | FULL"};
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/DisplayNameMode.java b/dev/core/src/com/google/gwt/dev/util/arg/DisplayNameMode.java
new file mode 100644
index 0000000..6ab5023
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/util/arg/DisplayNameMode.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2014 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.util.arg;
+
+/**
+ * Specifies which level of displayNames the GWT compiler outputs for chrome dev tools.
+ */
+public enum DisplayNameMode {
+  /**
+   * Emit no extra information.
+   */
+  NONE,
+  /**
+   * Use the method name as displayName.
+   */
+  ONLY_METHOD_NAME,
+  /**
+   * Use the class and method name as displayName.
+   */
+  ABBREVIATED,
+  /**
+   * Use the full qualified class and method name as displayName.
+   */
+  FULL
+}
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/OptionDisplayNameLevel.java b/dev/core/src/com/google/gwt/dev/util/arg/OptionDisplayNameLevel.java
new file mode 100644
index 0000000..f9e62fe
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/util/arg/OptionDisplayNameLevel.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2014 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.util.arg;
+
+/**
+ * Option to set the level of mapping function names in chrome dev tools.
+ */
+public interface OptionDisplayNameLevel {
+  DisplayNameMode getDisplayNameMode();
+
+  void setDisplayNameMode(DisplayNameMode displayNameMode);
+}