6852595: Accessing scope using JSR199 API on erroneous tree causes Illegal Argument Exception
authormcimadamore
Wed, 24 Jun 2009 10:50:54 +0100
changeset 3144 202fa249dc34
parent 3143 0413d5b5b7fd
child 3145 5300990c95bd
6852595: Accessing scope using JSR199 API on erroneous tree causes Illegal Argument Exception Summary: Fixed problem with empty DiagnosticSource objects causing IAE in the JCDiagnostic constructor Reviewed-by: jjg
langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java
langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java
langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java
langtools/test/tools/javac/api/6852595/T6852595.java
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Jun 24 10:50:27 2009 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Jun 24 10:50:54 2009 +0100
@@ -303,7 +303,7 @@
 
     public Env<AttrContext> attribExprToTree(JCTree expr, Env<AttrContext> env, JCTree tree) {
         breakTree = tree;
-        JavaFileObject prev = log.useSource(null);
+        JavaFileObject prev = log.useSource(env.toplevel.sourcefile);
         try {
             attribExpr(expr, env);
         } catch (BreakAttr b) {
@@ -317,7 +317,7 @@
 
     public Env<AttrContext> attribStatToTree(JCTree stmt, Env<AttrContext> env, JCTree tree) {
         breakTree = tree;
-        JavaFileObject prev = log.useSource(null);
+        JavaFileObject prev = log.useSource(env.toplevel.sourcefile);
         try {
             attribStat(stmt, env);
         } catch (BreakAttr b) {
--- a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java	Wed Jun 24 10:50:27 2009 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java	Wed Jun 24 10:50:54 2009 +0100
@@ -58,7 +58,7 @@
 
     protected DiagnosticSource getSource(JavaFileObject file) {
         if (file == null)
-            return null;
+            return DiagnosticSource.NO_SOURCE;
         DiagnosticSource s = sourceMap.get(file);
         if (s == null) {
             s = new DiagnosticSource(file, this);
--- a/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java	Wed Jun 24 10:50:27 2009 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java	Wed Jun 24 10:50:54 2009 +0100
@@ -46,11 +46,22 @@
  *  deletion without notice.</b>
  */
 public class DiagnosticSource {
+
+    /* constant DiagnosticSource to be used when sourcefile is missing */
+    public static final DiagnosticSource NO_SOURCE = new DiagnosticSource() {
+        @Override
+        protected boolean findLine(int pos) {
+            return false;
+        }
+    };
+
     public DiagnosticSource(JavaFileObject fo, AbstractLog log) {
         this.fileObject = fo;
         this.log = log;
     }
 
+    private DiagnosticSource() {}
+
     /** Return the underlying file object handled by this
      *  DiagnosticSource object.
      */
@@ -134,7 +145,7 @@
     /** Find the line in the buffer that contains the current position
      * @param pos      Character offset into the buffer
      */
-    private boolean findLine(int pos) {
+    protected boolean findLine(int pos) {
         if (pos == Position.NOPOS)
             return false;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/api/6852595/T6852595.java	Wed Jun 24 10:50:54 2009 +0100
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug     6852595
+ * @summary Accessing scope using JSR199 API on erroneous tree causes Illegal Argument Exception
+ * @author  mcimadamore
+ */
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.ToolProvider;
+
+import com.sun.source.util.JavacTask;
+import com.sun.source.tree.*;
+import com.sun.source.util.TreePath;
+import com.sun.source.util.Trees;
+import com.sun.tools.javac.api.JavacTrees;
+import com.sun.tools.javac.tree.JCTree.*;
+
+import static javax.tools.JavaFileObject.Kind;
+
+public class T6852595 {
+    public static void main(String[] args) throws IOException {
+        JavaFileObject sfo = new SimpleJavaFileObject(URI.create("myfo:/Test.java"),Kind.SOURCE) {
+            public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+                return "class BadName { Object o = j; }";
+            }
+        };
+        List<? extends JavaFileObject> files = Arrays.asList(sfo);
+        JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
+        JavacTask ct = (JavacTask)tool.getTask(null, null, null, null, null, files);
+        Iterable<? extends CompilationUnitTree> compUnits = ct.parse();
+        CompilationUnitTree cu = compUnits.iterator().next();
+        ClassTree cdef = (ClassTree)cu.getTypeDecls().get(0);
+        JCVariableDecl vdef = (JCVariableDecl)cdef.getMembers().get(0);
+        TreePath path = TreePath.getPath(cu, vdef.init);
+        Trees.instance(ct).getScope(path);
+    }
+}