6852595: Accessing scope using JSR199 API on erroneous tree causes Illegal Argument Exception
Fixed problem with empty DiagnosticSource objects causing IAE in the JCDiagnostic constructor Reviewed-by: jjg
This commit is contained in:
parent
6847ebb65f
commit
1fc0b5c367
@ -303,7 +303,7 @@ public class Attr extends JCTree.Visitor {
|
|||||||
|
|
||||||
public Env<AttrContext> attribExprToTree(JCTree expr, Env<AttrContext> env, JCTree tree) {
|
public Env<AttrContext> attribExprToTree(JCTree expr, Env<AttrContext> env, JCTree tree) {
|
||||||
breakTree = tree;
|
breakTree = tree;
|
||||||
JavaFileObject prev = log.useSource(null);
|
JavaFileObject prev = log.useSource(env.toplevel.sourcefile);
|
||||||
try {
|
try {
|
||||||
attribExpr(expr, env);
|
attribExpr(expr, env);
|
||||||
} catch (BreakAttr b) {
|
} catch (BreakAttr b) {
|
||||||
@ -317,7 +317,7 @@ public class Attr extends JCTree.Visitor {
|
|||||||
|
|
||||||
public Env<AttrContext> attribStatToTree(JCTree stmt, Env<AttrContext> env, JCTree tree) {
|
public Env<AttrContext> attribStatToTree(JCTree stmt, Env<AttrContext> env, JCTree tree) {
|
||||||
breakTree = tree;
|
breakTree = tree;
|
||||||
JavaFileObject prev = log.useSource(null);
|
JavaFileObject prev = log.useSource(env.toplevel.sourcefile);
|
||||||
try {
|
try {
|
||||||
attribStat(stmt, env);
|
attribStat(stmt, env);
|
||||||
} catch (BreakAttr b) {
|
} catch (BreakAttr b) {
|
||||||
|
@ -58,7 +58,7 @@ public abstract class AbstractLog {
|
|||||||
|
|
||||||
protected DiagnosticSource getSource(JavaFileObject file) {
|
protected DiagnosticSource getSource(JavaFileObject file) {
|
||||||
if (file == null)
|
if (file == null)
|
||||||
return null;
|
return DiagnosticSource.NO_SOURCE;
|
||||||
DiagnosticSource s = sourceMap.get(file);
|
DiagnosticSource s = sourceMap.get(file);
|
||||||
if (s == null) {
|
if (s == null) {
|
||||||
s = new DiagnosticSource(file, this);
|
s = new DiagnosticSource(file, this);
|
||||||
|
@ -46,11 +46,22 @@ import static com.sun.tools.javac.util.LayoutCharacters.*;
|
|||||||
* deletion without notice.</b>
|
* deletion without notice.</b>
|
||||||
*/
|
*/
|
||||||
public class DiagnosticSource {
|
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) {
|
public DiagnosticSource(JavaFileObject fo, AbstractLog log) {
|
||||||
this.fileObject = fo;
|
this.fileObject = fo;
|
||||||
this.log = log;
|
this.log = log;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DiagnosticSource() {}
|
||||||
|
|
||||||
/** Return the underlying file object handled by this
|
/** Return the underlying file object handled by this
|
||||||
* DiagnosticSource object.
|
* DiagnosticSource object.
|
||||||
*/
|
*/
|
||||||
@ -134,7 +145,7 @@ public class DiagnosticSource {
|
|||||||
/** Find the line in the buffer that contains the current position
|
/** Find the line in the buffer that contains the current position
|
||||||
* @param pos Character offset into the buffer
|
* @param pos Character offset into the buffer
|
||||||
*/
|
*/
|
||||||
private boolean findLine(int pos) {
|
protected boolean findLine(int pos) {
|
||||||
if (pos == Position.NOPOS)
|
if (pos == Position.NOPOS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
66
langtools/test/tools/javac/api/6852595/T6852595.java
Normal file
66
langtools/test/tools/javac/api/6852595/T6852595.java
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user