Added some empty help info docs for JSORestrictionsChecker and LongFromJSNIChecker.  Added infrastructure for propagating the extra help into to the logger.

Review by: knorton


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2344 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java b/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
index 3eac7c4..b575d62 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.TreeLogger.HelpInfo;
 import com.google.gwt.core.ext.typeinfo.CompilationUnitProvider;
 import com.google.gwt.dev.util.CharArrayComparator;
 import com.google.gwt.dev.util.Empty;
@@ -272,7 +273,13 @@
             msgBuf.append(": ");
           }
           msgBuf.append(msg);
-          branch.log(TreeLogger.ERROR, msgBuf.toString(), null);
+
+          HelpInfo helpInfo = null;
+          if (error instanceof GWTProblem) {
+            GWTProblem gwtProblem = (GWTProblem) error;
+            helpInfo = gwtProblem.getHelpInfo();
+          }
+          branch.log(TreeLogger.ERROR, msgBuf.toString(), null, helpInfo);
         }
       }
 
diff --git a/dev/core/src/com/google/gwt/dev/jdt/BinaryTypeReferenceRestrictionsChecker.java b/dev/core/src/com/google/gwt/dev/jdt/BinaryTypeReferenceRestrictionsChecker.java
index 32315d3..8d4382a 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/BinaryTypeReferenceRestrictionsChecker.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/BinaryTypeReferenceRestrictionsChecker.java
@@ -121,8 +121,9 @@
       String qualifiedTypeName = binaryTypeBinding.debugName();
       String error = formatBinaryTypeRefErrorMessage(qualifiedTypeName);
 
+      // TODO(mmendez): provide extra help info?
       GWTProblem.recordInCud(binaryTypeReferenceSite.getExpression(), cud,
-          error);
+          error, null);
     }
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/jdt/FindDeferredBindingSitesVisitor.java b/dev/core/src/com/google/gwt/dev/jdt/FindDeferredBindingSitesVisitor.java
index c62959d..33e6eca 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/FindDeferredBindingSitesVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/FindDeferredBindingSitesVisitor.java
@@ -60,7 +60,7 @@
     Scope scope = site.scope;
     // Safe since CUS.referenceContext is set in its constructor.
     CompilationUnitDeclaration cud = scope.compilationUnitScope().referenceContext;
-    GWTProblem.recordInCud(messageSend, cud, message);
+    GWTProblem.recordInCud(messageSend, cud, message, null);
   }
 
   private final Map<String, DeferredBindingSite> results = new HashMap<String, DeferredBindingSite>();
diff --git a/dev/core/src/com/google/gwt/dev/jdt/GWTProblem.java b/dev/core/src/com/google/gwt/dev/jdt/GWTProblem.java
index d5c51a7..b61688e 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/GWTProblem.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/GWTProblem.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.dev.jdt;
 
+import com.google.gwt.core.ext.TreeLogger.HelpInfo;
+
 import org.eclipse.jdt.core.compiler.IProblem;
 import org.eclipse.jdt.internal.compiler.CompilationResult;
 import org.eclipse.jdt.internal.compiler.ast.ASTNode;
@@ -29,7 +31,7 @@
 public class GWTProblem extends DefaultProblem {
 
   static void recordInCud(ASTNode node, CompilationUnitDeclaration cud,
-      String message) {
+      String message, HelpInfo helpInfo) {
     CompilationResult compResult = cud.compilationResult();
     int[] lineEnds = compResult.getLineSeparatorPositions();
     int startLine = Util.getLineNumber(node.sourceStart(), lineEnds, 0,
@@ -37,14 +39,22 @@
     int startColumn = Util.searchColumnNumber(lineEnds, startLine,
         node.sourceStart());
     DefaultProblem problem = new GWTProblem(compResult.fileName, message,
-        node.sourceStart(), node.sourceEnd(), startLine, startColumn);
+        node.sourceStart(), node.sourceEnd(), startLine, startColumn, helpInfo);
     compResult.record(problem, cud);
   }
 
+  private HelpInfo helpInfo;
+
   public GWTProblem(char[] originatingFileName, String message,
-      int startPosition, int endPosition, int line, int column) {
+      int startPosition, int endPosition, int line, int column,
+      HelpInfo helpInfo) {
     super(originatingFileName, message, IProblem.ExternalProblemNotFixable,
         null, ProblemSeverities.Error, startPosition, endPosition, line, column);
+    this.helpInfo = helpInfo;
+  }
+
+  public HelpInfo getHelpInfo() {
+    return helpInfo;
   }
 
 }
diff --git a/dev/core/src/com/google/gwt/dev/jdt/JSORestrictionsChecker.java b/dev/core/src/com/google/gwt/dev/jdt/JSORestrictionsChecker.java
index 240c9db..5fd4509 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/JSORestrictionsChecker.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/JSORestrictionsChecker.java
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.jdt;
 
 import com.google.gwt.dev.shell.JsValueGlue;
+import com.google.gwt.dev.util.InstalledHelpInfo;
 
 import org.eclipse.jdt.core.compiler.CharOperation;
 import org.eclipse.jdt.internal.compiler.ASTVisitor;
@@ -198,7 +199,8 @@
   }
 
   private void errorOn(ASTNode node, String error) {
-    GWTProblem.recordInCud(node, cud, error);
+    GWTProblem.recordInCud(node, cud, error, new InstalledHelpInfo(
+        "jsoRestrictions.html"));
   }
 
   private boolean isForJSOSubclass(Scope scope) {
diff --git a/dev/core/src/com/google/gwt/dev/jdt/LongFromJSNIChecker.java b/dev/core/src/com/google/gwt/dev/jdt/LongFromJSNIChecker.java
index ff53b63..1c89410 100644
--- a/dev/core/src/com/google/gwt/dev/jdt/LongFromJSNIChecker.java
+++ b/dev/core/src/com/google/gwt/dev/jdt/LongFromJSNIChecker.java
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.jdt;
 
 import com.google.gwt.core.client.UnsafeNativeLong;
+import com.google.gwt.dev.util.InstalledHelpInfo;
 import com.google.gwt.dev.util.JsniRef;
 
 import org.eclipse.jdt.core.compiler.CharOperation;
@@ -224,7 +225,8 @@
     }
 
     private void longAccessError(ASTNode node, String message) {
-      GWTProblem.recordInCud(node, cud, message);
+      GWTProblem.recordInCud(node, cud, message, new InstalledHelpInfo(
+          "longJsniRestriction.html"));
     }
 
     private boolean paramTypesMatch(MethodBinding method, JsniRef jsniRef) {
diff --git a/dev/core/src/com/google/gwt/dev/util/InstalledHelpInfo.java b/dev/core/src/com/google/gwt/dev/util/InstalledHelpInfo.java
new file mode 100644
index 0000000..43a4b63
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/util/InstalledHelpInfo.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2008 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;
+
+import com.google.gwt.core.ext.TreeLogger.HelpInfo;
+import com.google.gwt.util.tools.Utility;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * Help info based on the GWT installation directory.
+ */
+public class InstalledHelpInfo extends HelpInfo {
+  private URL url;
+
+  public InstalledHelpInfo(String htmlDocName) {
+    try {
+      String installPath = Utility.getInstallPath();
+      File file = new File(installPath, "doc");
+      file = new File(file, "helpInfo");
+      file = new File(file, htmlDocName);
+      if (file.isFile() && file.canRead()) {
+        url = file.toURI().toURL();
+      }
+    } catch (RuntimeException e) {
+      // Installation problem; just don't provide help info
+    } catch (MalformedURLException e) {
+      // Unexpected; just don't provide help info
+    }
+  }
+
+  @Override
+  public URL getURL() {
+    return url;
+  }
+}
diff --git a/dev/core/test/com/google/gwt/dev/jdt/GWTProblemTest.java b/dev/core/test/com/google/gwt/dev/jdt/GWTProblemTest.java
index 86388a8..301bcba 100644
--- a/dev/core/test/com/google/gwt/dev/jdt/GWTProblemTest.java
+++ b/dev/core/test/com/google/gwt/dev/jdt/GWTProblemTest.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.dev.jdt;
 
+import com.google.gwt.core.ext.TreeLogger.HelpInfo;
+
 import junit.framework.TestCase;
 
 import org.eclipse.jdt.core.compiler.CategorizedProblem;
@@ -34,14 +36,19 @@
     CompilationUnitDeclaration cud = new CompilationUnitDeclaration(null,
         compilationResult, 0);
 
+    HelpInfo info = new HelpInfo() {
+    };
+
     // Pick an Expression subtype to pass in
-    GWTProblem.recordInCud(new Wildcard(Wildcard.EXTENDS), cud, errorMessage);
+    GWTProblem.recordInCud(new Wildcard(Wildcard.EXTENDS), cud, errorMessage,
+        info);
 
     CategorizedProblem[] errors = compilationResult.getErrors();
     assertEquals(1, errors.length);
-    CategorizedProblem problem = errors[0];
+    GWTProblem problem = (GWTProblem) errors[0];
     assertTrue(problem.isError());
     assertEquals(1, problem.getSourceLineNumber());
     assertEquals(errorMessage, problem.getMessage());
+    assertSame(info, problem.getHelpInfo());
   }
 }
diff --git a/distro-source/core/src/doc/helpInfo/jsoRestrictions.html b/distro-source/core/src/doc/helpInfo/jsoRestrictions.html
new file mode 100644
index 0000000..cf69a7f
--- /dev/null
+++ b/distro-source/core/src/doc/helpInfo/jsoRestrictions.html
@@ -0,0 +1,9 @@
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <title>Restrictions on subclasses of JavaScriptObject</title>
+  </head>
+  <body>
+    TODO(spoon): write some doc!
+  </body>
+</html>
diff --git a/distro-source/core/src/doc/helpInfo/longJsniRestriction.html b/distro-source/core/src/doc/helpInfo/longJsniRestriction.html
new file mode 100644
index 0000000..fdaaac9
--- /dev/null
+++ b/distro-source/core/src/doc/helpInfo/longJsniRestriction.html
@@ -0,0 +1,9 @@
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <title>Restrictions on long values with JSNI</title>
+  </head>
+  <body>
+    TODO(spoon): write some doc!
+  </body>
+</html>