Fixes issue #2607; TreeItemLogger now eagerly grabs exception info from a thrown exception to break lingering dependency on user code.  Partial back-port from OOPHM.

Suggested by: zundel
Review by: zundel

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@3609 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/util/log/AbstractTreeLogger.java b/dev/core/src/com/google/gwt/dev/util/log/AbstractTreeLogger.java
index 6d648dc..a1b1b2d 100644
--- a/dev/core/src/com/google/gwt/dev/util/log/AbstractTreeLogger.java
+++ b/dev/core/src/com/google/gwt/dev/util/log/AbstractTreeLogger.java
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.util.log;
 
 import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
 
 import java.util.HashSet;
 
@@ -45,8 +46,12 @@
       + "amount of memory, use the -Xmx flag at startup (java -Xmx128M ...)";
 
   public static String getStackTraceAsString(Throwable e) {
-    // For each cause, print the requested number of entries of its stack trace,
-    // being careful to avoid getting stuck in an infinite loop.
+    // Show the exception info for anything other than "UnableToComplete".
+    if (e == null || e instanceof UnableToCompleteException) {
+      return null;
+    }
+    // For each cause, print the requested number of entries of its stack
+    // trace, being careful to avoid getting stuck in an infinite loop.
     //
     StringBuffer message = new StringBuffer();
     Throwable currentCause = e;
@@ -72,6 +77,13 @@
     return message.toString();
   }
 
+  protected static String getExceptionName(Throwable e) {
+    if (e == null || e instanceof UnableToCompleteException) {
+      return null;
+    }
+    return e.getClass().getSimpleName();
+  }
+
   public int indexWithinMyParent;
 
   private TreeLogger.Type logLevel = TreeLogger.ALL;
diff --git a/dev/core/src/com/google/gwt/dev/util/log/TreeItemLogger.java b/dev/core/src/com/google/gwt/dev/util/log/TreeItemLogger.java
index 2c48f88..62fa5d0 100644
--- a/dev/core/src/com/google/gwt/dev/util/log/TreeItemLogger.java
+++ b/dev/core/src/com/google/gwt/dev/util/log/TreeItemLogger.java
@@ -41,7 +41,9 @@
    * Represents an individual log event.
    */
   public static class LogEvent {
-    public final Throwable caught;
+    public final String exceptionDetail;
+
+    public final String exceptionName;
 
     public final HelpInfo helpInfo;
 
@@ -57,12 +59,13 @@
 
     public LogEvent(TreeItemLogger logger, boolean isBranchCommit, int index,
         Type type, String message, Throwable caught, HelpInfo helpInfo) {
+      this.exceptionDetail = AbstractTreeLogger.getStackTraceAsString(caught);
+      this.exceptionName = AbstractTreeLogger.getExceptionName(caught);
       this.logger = logger;
       this.isBranchCommit = isBranchCommit;
       this.index = index;
       this.type = type;
       this.message = message;
-      this.caught = caught;
       this.helpInfo = helpInfo;
     }
 
@@ -161,13 +164,8 @@
       //
       String label = message;
       if (label == null) {
-        if (caught != null) {
-          label = caught.getMessage();
-
-          if (label == null || label.trim().length() == 0) {
-            label = caught.toString();
-          }
-        }
+        assert (exceptionName != null);
+        label = exceptionName;
       }
       treeItem.setText(label);
 
diff --git a/dev/core/src/com/google/gwt/dev/util/log/TreeLoggerWidget.java b/dev/core/src/com/google/gwt/dev/util/log/TreeLoggerWidget.java
index d21aa6e..595da54 100644
--- a/dev/core/src/com/google/gwt/dev/util/log/TreeLoggerWidget.java
+++ b/dev/core/src/com/google/gwt/dev/util/log/TreeLoggerWidget.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.dev.util.log;
 
-import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.TreeLogger.HelpInfo;
 import com.google.gwt.dev.shell.BrowserWidget;
 import com.google.gwt.dev.util.log.TreeItemLogger.LogEvent;
@@ -317,11 +316,8 @@
 
     // Show the exception info for anything other than "UnableToComplete".
     //
-    if (logEvent != null && logEvent.caught != null) {
-      if (!(logEvent.caught instanceof UnableToCompleteException)) {
-        String stackTrace = AbstractTreeLogger.getStackTraceAsString(logEvent.caught);
-        sb.append(stackTrace);
-      }
+    if (logEvent != null && logEvent.exceptionDetail != null) {
+      sb.append(logEvent.exceptionDetail);
     }
 
     details.setText(sb.toString());