Author: [email protected]
Date: Wed Apr 22 10:54:17 2009
New Revision: 5269

Modified:
    trunk/user/src/com/google/gwt/user/rebind/rpc/ProblemReport.java
     
trunk/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java

Log:
Adapting ProblemReport.build to use a sublogger for child messages (e.g.  
the subtypes tried for an instantiable type).

Review by: spoon

Modified: trunk/user/src/com/google/gwt/user/rebind/rpc/ProblemReport.java
==============================================================================
--- trunk/user/src/com/google/gwt/user/rebind/rpc/ProblemReport.java     
(original)
+++ trunk/user/src/com/google/gwt/user/rebind/rpc/ProblemReport.java    Wed  
Apr 22 10:54:17 2009
@@ -44,9 +44,43 @@
     */
    public enum Priority { FATAL, DEFAULT, AUXILIARY}

-  private Map<JClassType, List<String>> allProblems;
-  private Map<JClassType, List<String>> auxiliaries;
-  private Map<JClassType, List<String>> fatalProblems;
+  /**
+   * An individual report, which may require multiple entries (expressed as
+   * logs under a branchpoint), but relates to an individual issue.
+   */
+  public class Problem {
+    private String message;
+    private List<String> childMessages;
+
+    private Problem(String message, String[] children) {
+      this.message = message;
+      // most problems don't have sub-messages, so init at zero size
+      childMessages = new ArrayList<String>(children.length);
+      for (int i = 0; i < children.length; i++) {
+        childMessages.add(children[i]);
+      }
+    }
+
+    public void addChild(String message) {
+      childMessages.add(message);
+    }
+
+    public String getPrimaryMessage() {
+      return message;
+    }
+
+    public Iterable<String> getSubMessages() {
+      return childMessages;
+    }
+
+    public boolean hasSubMessages() {
+      return !childMessages.isEmpty();
+    }
+  }
+
+  private Map<JClassType, List<Problem>> allProblems;
+  private Map<JClassType, List<Problem>> auxiliaries;
+  private Map<JClassType, List<Problem>> fatalProblems;
    private JClassType contextType;

    /**
@@ -61,9 +95,9 @@
                o2.getParameterizedQualifiedSourceName());
          }
        };
-    allProblems = new TreeMap<JClassType, List<String>>(comparator);
-    auxiliaries = new TreeMap<JClassType, List<String>>(comparator);
-    fatalProblems = new TreeMap<JClassType, List<String>>(comparator);
+    allProblems = new TreeMap<JClassType, List<Problem>>(comparator);
+    auxiliaries = new TreeMap<JClassType, List<Problem>>(comparator);
+    fatalProblems = new TreeMap<JClassType, List<Problem>>(comparator);
      contextType = null;
    }

@@ -77,7 +111,7 @@
     * @param extraLines additional continuation lines for the message,  
usually
     *    for additional explanations.
     */
-  public void add(JClassType type, String message, Priority priority,
+  public Problem add(JClassType type, String message, Priority priority,
        String... extraLines) {
      String contextString = "";
      if (contextType != null) {
@@ -85,62 +119,34 @@
            contextType.getParameterizedQualifiedSourceName() + ")";
      }
      message = message + contextString;
-    for (String line : extraLines) {
-      message = message + "\n   " + line;
-    }
+    Problem entry = new Problem(message, extraLines);
      if (priority == Priority.AUXILIARY) {
-      addToMap(type, message, auxiliaries);
-      return;
+      addToMap(type, entry, auxiliaries);
+      return entry;
      }

      // both FATAL and DEFAULT problems go in allProblems...
-    addToMap(type, message, allProblems);
+    addToMap(type, entry, allProblems);

      // only FATAL problems go in fatalProblems...
      if (priority == Priority.FATAL) {
-      addToMap(type, message, fatalProblems);
+      addToMap(type, entry, fatalProblems);
      }
+    return entry;
    }

-  /**
-   * Returns list of auxiliary "problems" logged against a given type.
-   *
-   * @param type type to fetch problems for
-   * @return {...@code null} if no auxiliaries were logged.  Otherwise, a list
-   *   of strings describing messages, including the context in which the
-   *   problem was found.
-   */
-  public List<String> getAuxiliaryMessagesForType(JClassType type) {
-    List<String> list = auxiliaries.get(type);
+  public String getWorstMessageForType(JClassType type) {
+    List<Problem> list = fatalProblems.get(type);
      if (list == null) {
-      list = new ArrayList<String>(0);
+      list = allProblems.get(type);
+      if (list == null) {
+        list = auxiliaries.get(type);
+      }
      }
-    return list;
-  }
-
-  /**
-   * Returns list of problems logged against a given type.
-   *
-   * @param type type to fetch problems for
-   * @return {...@code null} if no problems were logged.  Otherwise, a list
-   *   of strings describing problems, including the context in which the
-   *   problem was found.
-   */
-  public List<String> getProblemsForType(JClassType type) {
-    List<String> list = allProblems.get(type);
      if (list == null) {
-      list = new ArrayList<String>(0);
+      return null;
      }
-    return list;
-  }
-
-  /**
-   * Returns the number of types against which problems were reported.
-   *
-   * @return number of problematic types
-   */
-  public int getProblemTypeCount() {
-    return allProblems.size();
+    return list.get(0).getPrimaryMessage() + (list.size() > 1 ? ",  
etc." : "");
    }

    /**
@@ -189,20 +195,53 @@
    }

    /**
+   * Test accessor returning list of auxiliary "problems" logged against a
+   * given type.
+   *
+   * @param type type to fetch problems for
+   * @return {...@code null} if no auxiliaries were logged.  Otherwise, a list
+   *   of strings describing messages, including the context in which the
+   *   problem was found.
+   */
+  List<Problem> getAuxiliaryMessagesForType(JClassType type) {
+    List<Problem> list = auxiliaries.get(type);
+    if (list == null) {
+      list = new ArrayList<Problem>(0);
+    }
+    return list;
+  }
+
+  /**
+   * Test accessor returning list of problems logged against a given type.
+   *
+   * @param type type to fetch problems for
+   * @return {...@code null} if no problems were logged.  Otherwise, a list
+   *   of strings describing problems, including the context in which the
+   *   problem was found.
+   */
+  List<Problem> getProblemsForType(JClassType type) {
+    List<Problem> list = allProblems.get(type);
+    if (list == null) {
+      list = new ArrayList<Problem>(0);
+    }
+    return list;
+  }
+
+  /**
     * Adds an entry to one of the problem maps.
     *
     * @param type the type to add
     * @param message the message to add for {...@code type}
     * @param map the map to add to
     */
-  private void addToMap(JClassType type, String message,
-      Map<JClassType, List<String>> map) {
-    List<String> entry = map.get(type);
-    if (entry == null) {
-      entry = new ArrayList<String>();
-      map.put(type, entry);
+  private void addToMap(JClassType type, Problem problem,
+      Map<JClassType, List<Problem>> map) {
+    List<Problem> list = map.get(type);
+    if (list == null) {
+      list = new ArrayList<Problem>();
+      map.put(type, list);
      }
-    entry.add(message);
+    list.add(problem);
    }

    /**
@@ -213,10 +252,17 @@
     * @param problems the problems to log
     */
    private void doReport(TreeLogger logger, Type level,
-      Map<JClassType, List<String>> problems) {
+      Map<JClassType, List<Problem>> problems) {
      for (JClassType type : problems.keySet()) {
-      for (String message : problems.get(type)) {
-        logger.log(level, message);
+      for (Problem problem : problems.get(type)) {
+        if (problem.hasSubMessages()) {
+          TreeLogger sublogger = logger.branch(level,  
problem.getPrimaryMessage());
+          for (String sub : problem.getSubMessages()) {
+            sublogger.log(level, sub);
+          }
+        } else {
+          logger.log(level, problem.getPrimaryMessage());
+        }
        }
      }
    }

Modified:  
trunk/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
==============================================================================
---  
trunk/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
         
(original)
+++  
trunk/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
         
Wed Apr 22 10:54:17 2009
@@ -1324,26 +1324,15 @@
      if (possiblyInstantiableTypes.size() == 0) {
        String possibilities[] = new String[candidates.size()];
        for (int i = 0; i < possibilities.length; i++) {
-        JClassType subtype = candidates.get(i);
-        List<String> auxiliaries =  
problems.getAuxiliaryMessagesForType(subtype);
-        List<String> errors = problems.getProblemsForType(subtype);
-        if (errors.isEmpty()) {
-          if (auxiliaries.isEmpty()) {
-            possibilities[i] = "   subtype " +
-              subtype.getParameterizedQualifiedSourceName() +
-              " is not instantiable";
-          } else {
-            // message with have the form "FQCN some-problem-description"
-            possibilities[i] = "   subtype " + auxiliaries.get(0);
-            if (auxiliaries.size() > 1) {
-              possibilities[i] = possibilities[i] + ", etc.";
-            }
-          }
+        JClassType subtype = candidates.get(i);
+        String worstMessage = problems.getWorstMessageForType(subtype);
+        if (worstMessage == null) {
+          possibilities[i] = "   subtype " +
+            subtype.getParameterizedQualifiedSourceName() +
+            " is not instantiable";
          } else {
-          possibilities[i] = "   subtype " + errors.get(0);
-          if (errors.size() > 1 || !auxiliaries.isEmpty()) {
-            possibilities[i] = possibilities[i] + ", etc.";
-          }
+          // message with have the form "FQCN some-problem-description"
+          possibilities[i] = "   subtype " + worstMessage;
          }
        }
        problems.add(baseType, baseType.getParameterizedQualifiedSourceName()

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to