提交 39743eb6 编写于 作者: L lana

Merge

......@@ -37,6 +37,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
......@@ -51,6 +52,7 @@ import com.sun.source.util.TaskEvent;
import com.sun.source.util.TaskListener;
import com.sun.tools.javac.util.ClientCodeException;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.JCDiagnostic;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
......@@ -146,7 +148,7 @@ public class ClientCodeWrapper {
return fo;
}
<T> DiagnosticListener<T> wrap(DiagnosticListener<T> dl) {
<T /*super JavaFileOject*/> DiagnosticListener<T> wrap(DiagnosticListener<T> dl) {
if (isTrusted(dl))
return dl;
return new WrappedDiagnosticListener<T>(dl);
......@@ -158,6 +160,16 @@ public class ClientCodeWrapper {
return new WrappedTaskListener(tl);
}
@SuppressWarnings("unchecked")
private <T> Diagnostic<T> unwrap(final Diagnostic<T> diagnostic) {
if (diagnostic instanceof JCDiagnostic) {
JCDiagnostic d = (JCDiagnostic) diagnostic;
return (Diagnostic<T>) new DiagnosticSourceUnwrapper(d);
} else {
return diagnostic;
}
}
protected boolean isTrusted(Object o) {
Class<?> c = o.getClass();
Boolean trusted = trustedClasses.get(c);
......@@ -534,7 +546,7 @@ public class ClientCodeWrapper {
}
}
protected class WrappedDiagnosticListener<T> implements DiagnosticListener<T> {
protected class WrappedDiagnosticListener<T /*super JavaFileObject*/> implements DiagnosticListener<T> {
protected DiagnosticListener<T> clientDiagnosticListener;
WrappedDiagnosticListener(DiagnosticListener<T> clientDiagnosticListener) {
clientDiagnosticListener.getClass(); // null check
......@@ -544,7 +556,7 @@ public class ClientCodeWrapper {
@Override
public void report(Diagnostic<? extends T> diagnostic) {
try {
clientDiagnosticListener.report(diagnostic);
clientDiagnosticListener.report(unwrap(diagnostic));
} catch (ClientCodeException e) {
throw e;
} catch (RuntimeException e) {
......@@ -555,6 +567,54 @@ public class ClientCodeWrapper {
}
}
public class DiagnosticSourceUnwrapper implements Diagnostic<JavaFileObject> {
public final JCDiagnostic d;
DiagnosticSourceUnwrapper(JCDiagnostic d) {
this.d = d;
}
public Diagnostic.Kind getKind() {
return d.getKind();
}
public JavaFileObject getSource() {
return unwrap(d.getSource());
}
public long getPosition() {
return d.getPosition();
}
public long getStartPosition() {
return d.getStartPosition();
}
public long getEndPosition() {
return d.getEndPosition();
}
public long getLineNumber() {
return d.getLineNumber();
}
public long getColumnNumber() {
return d.getColumnNumber();
}
public String getCode() {
return d.getCode();
}
public String getMessage(Locale locale) {
return d.getMessage(locale);
}
public String toString() {
return d.toString();
}
}
protected class WrappedTaskListener implements TaskListener {
protected TaskListener clientTaskListener;
WrappedTaskListener(TaskListener clientTaskListener) {
......
......@@ -269,10 +269,12 @@ public class Types {
// <editor-fold defaultstate="collapsed" desc="isConvertible">
/**
* Is t a subtype of or convertiable via boxing/unboxing
* convertions to s?
* Is t a subtype of or convertible via boxing/unboxing
* conversion to s?
*/
public boolean isConvertible(Type t, Type s, Warner warn) {
if (t.tag == ERROR)
return true;
boolean tPrimitive = t.isPrimitive();
boolean sPrimitive = s.isPrimitive();
if (tPrimitive == sPrimitive) {
......@@ -2117,6 +2119,8 @@ public class Types {
}
}
List<TypeSymbol> seenTypes = List.nil();
/** members closure visitor methods **/
public CompoundScope visitType(Type t, Boolean skipInterface) {
......@@ -2125,21 +2129,33 @@ public class Types {
@Override
public CompoundScope visitClassType(ClassType t, Boolean skipInterface) {
ClassSymbol csym = (ClassSymbol)t.tsym;
Entry e = _map.get(csym);
if (e == null || !e.matches(skipInterface)) {
CompoundScope membersClosure = new CompoundScope(csym);
if (!skipInterface) {
for (Type i : interfaces(t)) {
membersClosure.addSubScope(visit(i, skipInterface));
if (seenTypes.contains(t.tsym)) {
//this is possible when an interface is implemented in multiple
//superclasses, or when a classs hierarchy is circular - in such
//cases we don't need to recurse (empty scope is returned)
return new CompoundScope(t.tsym);
}
try {
seenTypes = seenTypes.prepend(t.tsym);
ClassSymbol csym = (ClassSymbol)t.tsym;
Entry e = _map.get(csym);
if (e == null || !e.matches(skipInterface)) {
CompoundScope membersClosure = new CompoundScope(csym);
if (!skipInterface) {
for (Type i : interfaces(t)) {
membersClosure.addSubScope(visit(i, skipInterface));
}
}
membersClosure.addSubScope(visit(supertype(t), skipInterface));
membersClosure.addSubScope(csym.members());
e = new Entry(skipInterface, membersClosure);
_map.put(csym, e);
}
membersClosure.addSubScope(visit(supertype(t), skipInterface));
membersClosure.addSubScope(csym.members());
e = new Entry(skipInterface, membersClosure);
_map.put(csym, e);
return e.compoundScope;
}
finally {
seenTypes = seenTypes.tail;
}
return e.compoundScope;
}
@Override
......
......@@ -594,7 +594,15 @@ public class Attr extends JCTree.Visitor {
lintEnv = lintEnv.next;
// Having found the enclosing lint value, we can initialize the lint value for this class
env.info.lint = lintEnv.info.lint.augment(env.info.enclVar.attributes_field, env.info.enclVar.flags());
// ... but ...
// There's a problem with evaluating annotations in the right order, such that
// env.info.enclVar.attributes_field might not yet have been evaluated, and so might be
// null. In that case, calling augment will throw an NPE. To avoid this, for now we
// revert to the jdk 6 behavior and ignore the (unevaluated) attributes.
if (env.info.enclVar.attributes_field == null)
env.info.lint = lintEnv.info.lint;
else
env.info.lint = lintEnv.info.lint.augment(env.info.enclVar.attributes_field, env.info.enclVar.flags());
Lint prevLint = chk.setLint(env.info.lint);
JavaFileObject prevSource = log.useSource(env.toplevel.sourcefile);
......
/*
* Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. 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
......@@ -98,6 +98,7 @@ class RegularFileObject extends BaseFileObject {
@Override
public OutputStream openOutputStream() throws IOException {
fileManager.flushCache(this);
ensureParentDirectoriesExist();
return new FileOutputStream(file);
}
......@@ -128,6 +129,7 @@ class RegularFileObject extends BaseFileObject {
@Override
public Writer openWriter() throws IOException {
fileManager.flushCache(this);
ensureParentDirectoriesExist();
return new OutputStreamWriter(new FileOutputStream(file), fileManager.getEncodingName());
}
......
......@@ -1689,6 +1689,8 @@ public class Gen extends JCTree.Visitor {
// outer instance of a super(...) call appears as first parameter).
genArgs(tree.args,
TreeInfo.symbol(tree.meth).externalType(types).getParameterTypes());
code.statBegin(tree.pos);
code.markStatBegin();
result = m.invoke();
}
......
......@@ -205,6 +205,7 @@ abstract class PathFileObject implements JavaFileObject {
@Override
public OutputStream openOutputStream() throws IOException {
fileManager.flushCache(this);
ensureParentDirectoriesExist();
return Files.newOutputStream(path);
}
......@@ -241,6 +242,7 @@ abstract class PathFileObject implements JavaFileObject {
@Override
public Writer openWriter() throws IOException {
fileManager.flushCache(this);
ensureParentDirectoriesExist();
return new OutputStreamWriter(Files.newOutputStream(path), fileManager.getEncodingName());
}
......
......@@ -27,15 +27,15 @@ package com.sun.tools.javac.parser;
import java.util.*;
import com.sun.tools.javac.tree.*;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.tree.*;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.List;
import static com.sun.tools.javac.util.ListBuffer.lb;
import com.sun.tools.javac.tree.JCTree.*;
import static com.sun.tools.javac.util.ListBuffer.lb;
import static com.sun.tools.javac.parser.Token.*;
/** The parser maps a token sequence into an abstract syntax
......@@ -254,26 +254,44 @@ public class JavacParser implements Parser {
}
private JCErroneous syntaxError(int pos, String key, Token... args) {
return syntaxError(pos, null, key, args);
return syntaxError(pos, List.<JCTree>nil(), key, args);
}
private JCErroneous syntaxError(int pos, List<JCTree> errs, String key, Token... args) {
setErrorEndPos(pos);
reportSyntaxError(pos, key, (Object[])args);
return toP(F.at(pos).Erroneous(errs));
JCErroneous err = F.at(pos).Erroneous(errs);
reportSyntaxError(err, key, (Object[])args);
if (errs != null) {
JCTree last = errs.last();
if (last != null)
storeEnd(last, pos);
}
return toP(err);
}
private int errorPos = Position.NOPOS;
/**
* Report a syntax error at given position using the given
* argument unless one was already reported at the same position.
* Report a syntax using the given the position parameter and arguments,
* unless one was already reported at the same position.
*/
private void reportSyntaxError(int pos, String key, Object... args) {
JCDiagnostic.DiagnosticPosition diag = new JCDiagnostic.SimpleDiagnosticPosition(pos);
reportSyntaxError(diag, key, args);
}
/**
* Report a syntax error using the given DiagnosticPosition object and
* arguments, unless one was already reported at the same position.
*/
private void reportSyntaxError(JCDiagnostic.DiagnosticPosition diagPos, String key, Object... args) {
int pos = diagPos.getPreferredPosition();
if (pos > S.errPos() || pos == Position.NOPOS) {
if (S.token() == EOF)
error(pos, "premature.eof");
else
error(pos, key, args);
if (S.token() == EOF) {
error(diagPos, "premature.eof");
} else {
error(diagPos, key, args);
}
}
S.errPos(pos);
if (S.pos() == errorPos)
......@@ -311,7 +329,7 @@ public class JavacParser implements Parser {
/** Report an illegal start of expression/type error at given position.
*/
JCExpression illegal(int pos) {
setErrorEndPos(S.pos());
setErrorEndPos(pos);
if ((mode & EXPR) != 0)
return syntaxError(pos, "illegal.start.of.expr");
else
......@@ -340,7 +358,7 @@ public class JavacParser implements Parser {
* indexed by the tree nodes they refer to.
* defined only if option flag keepDocComment is set.
*/
Map<JCTree, String> docComments;
private final Map<JCTree, String> docComments;
/** Make an entry into docComments hashtable,
* provided flag keepDocComments is set and given doc comment is non-null.
......@@ -462,6 +480,10 @@ public class JavacParser implements Parser {
return t;
}
JCExpression literal(Name prefix) {
return literal(prefix, S.pos());
}
/**
* Literal =
* INTLITERAL
......@@ -474,8 +496,7 @@ public class JavacParser implements Parser {
* | FALSE
* | NULL
*/
JCExpression literal(Name prefix) {
int pos = S.pos();
JCExpression literal(Name prefix, int pos) {
JCExpression t = errorTree;
switch (S.token()) {
case INTLITERAL:
......@@ -869,7 +890,7 @@ public class JavacParser implements Parser {
(S.token() == INTLITERAL || S.token() == LONGLITERAL) &&
S.radix() == 10) {
mode = EXPR;
t = literal(names.hyphen);
t = literal(names.hyphen, pos);
} else {
t = term3();
return F.at(pos).Unary(unoptag(token), t);
......@@ -1267,15 +1288,17 @@ public class JavacParser implements Parser {
case GTGT:
S.token(GT);
break;
case GT:
S.nextToken();
break;
default:
accept(GT);
args.append(syntaxError(S.pos(), "expected", GT));
break;
}
return args.toList();
}
} else {
syntaxError(S.pos(), "expected", LT);
return List.nil();
return List.<JCExpression>of(syntaxError(S.pos(), "expected", LT));
}
}
......@@ -1300,12 +1323,12 @@ public class JavacParser implements Parser {
return F.at(pos).Wildcard(t, bound);
} else if (S.token() == IDENTIFIER) {
//error recovery
reportSyntaxError(S.prevEndPos(), "expected3",
GT, EXTENDS, SUPER);
TypeBoundKind t = F.at(Position.NOPOS).TypeBoundKind(BoundKind.UNBOUND);
JCExpression wc = toP(F.at(pos).Wildcard(t, null));
JCIdent id = toP(F.at(S.pos()).Ident(ident()));
return F.at(pos).Erroneous(List.<JCTree>of(wc, id));
JCErroneous err = F.at(pos).Erroneous(List.<JCTree>of(wc, id));
reportSyntaxError(err, "expected3", GT, EXTENDS, SUPER);
return err;
} else {
TypeBoundKind t = toP(F.at(pos).TypeBoundKind(BoundKind.UNBOUND));
return toP(F.at(pos).Wildcard(t, null));
......@@ -1391,7 +1414,7 @@ public class JavacParser implements Parser {
while (S.token() == DOT) {
if (diamondFound) {
//cannot select after a diamond
illegal(S.pos());
illegal();
}
int pos = S.pos();
S.nextToken();
......@@ -1419,15 +1442,16 @@ public class JavacParser implements Parser {
pos = typeArgs.head.pos;
}
setErrorEndPos(S.prevEndPos());
reportSyntaxError(pos, "cannot.create.array.with.type.arguments");
return toP(F.at(newpos).Erroneous(typeArgs.prepend(e)));
JCErroneous err = F.at(pos).Erroneous(typeArgs.prepend(e));
reportSyntaxError(err, "cannot.create.array.with.type.arguments");
return toP(err);
}
return e;
} else if (S.token() == LPAREN) {
return classCreatorRest(newpos, null, typeArgs, t);
} else {
reportSyntaxError(S.pos(), "expected2",
LPAREN, LBRACKET);
setErrorEndPos(S.pos());
reportSyntaxError(S.pos(), "expected2", LPAREN, LBRACKET);
t = toP(F.at(newpos).NewClass(null, typeArgs, t, List.<JCExpression>nil(), null));
return toP(F.at(newpos).Erroneous(List.<JCTree>of(t)));
}
......@@ -1457,7 +1481,8 @@ public class JavacParser implements Parser {
if (S.token() == LBRACE) {
return arrayInitializer(newpos, elemtype);
} else {
return syntaxError(S.pos(), "array.dimension.missing");
JCExpression t = toP(F.at(newpos).NewArray(elemtype, List.<JCExpression>nil(), null));
return syntaxError(S.pos(), List.<JCTree>of(t), "array.dimension.missing");
}
} else {
ListBuffer<JCExpression> dims = new ListBuffer<JCExpression>();
......@@ -1843,7 +1868,7 @@ public class JavacParser implements Parser {
/** CatchClause = CATCH "(" FormalParameter ")" Block
*/
JCCatch catchClause() {
protected JCCatch catchClause() {
int pos = S.pos();
accept(CATCH);
accept(LPAREN);
......@@ -1973,7 +1998,7 @@ public class JavacParser implements Parser {
JCModifiers modifiersOpt() {
return modifiersOpt(null);
}
JCModifiers modifiersOpt(JCModifiers partial) {
protected JCModifiers modifiersOpt(JCModifiers partial) {
long flags;
ListBuffer<JCAnnotation> annotations = new ListBuffer<JCAnnotation>();
int pos;
......@@ -2006,6 +2031,7 @@ public class JavacParser implements Parser {
case SYNCHRONIZED: flag = Flags.SYNCHRONIZED; break;
case STRICTFP : flag = Flags.STRICTFP; break;
case MONKEYS_AT : flag = Flags.ANNOTATION; break;
case ERROR : flag = 0; S.nextToken(); break;
default: break loop;
}
if ((flags & flag) != 0) error(S.pos(), "repeated.modifier");
......@@ -2219,9 +2245,12 @@ public class JavacParser implements Parser {
/** Resource = VariableModifiersOpt Type VariableDeclaratorId = Expression
*/
JCTree resource() {
return variableDeclaratorRest(S.pos(), optFinal(Flags.FINAL),
parseType(), ident(), true, null);
protected JCTree resource() {
JCModifiers optFinal = optFinal(Flags.FINAL);
JCExpression type = parseType();
int pos = S.pos();
Name ident = ident();
return variableDeclaratorRest(pos, optFinal, type, ident, true, null);
}
/** CompilationUnit = [ { "@" Annotation } PACKAGE Qualident ";"] {ImportDeclaration} {TypeDeclaration}
......@@ -2568,7 +2597,7 @@ public class JavacParser implements Parser {
* | ModifiersOpt Type Ident
* ( ConstantDeclaratorsRest | InterfaceMethodDeclaratorRest ";" )
*/
List<JCTree> classOrInterfaceBodyDeclaration(Name className, boolean isInterface) {
protected List<JCTree> classOrInterfaceBodyDeclaration(Name className, boolean isInterface) {
if (S.token() == SEMI) {
S.nextToken();
return List.<JCTree>nil();
......@@ -2770,7 +2799,7 @@ public class JavacParser implements Parser {
/** FormalParameter = { FINAL | '@' Annotation } Type VariableDeclaratorId
* LastFormalParameter = { FINAL | '@' Annotation } Type '...' Ident | FormalParameter
*/
JCVariableDecl formalParameter() {
protected JCVariableDecl formalParameter() {
JCModifiers mods = optFinal(Flags.PARAMETER);
JCExpression type = parseType();
if (S.token() == ELLIPSIS) {
......@@ -2788,6 +2817,10 @@ public class JavacParser implements Parser {
log.error(DiagnosticFlag.SYNTAX, pos, key, args);
}
void error(DiagnosticPosition pos, String key, Object ... args) {
log.error(DiagnosticFlag.SYNTAX, pos, key, args);
}
void warning(int pos, String key, Object ... args) {
log.warning(pos, key, args);
}
......@@ -2807,8 +2840,9 @@ public class JavacParser implements Parser {
case JCTree.ERRONEOUS:
return t;
default:
error(t.pos, "not.stmt");
return F.at(t.pos).Erroneous(List.<JCTree>of(t));
JCExpression ret = F.at(t.pos).Erroneous(List.<JCTree>of(t));
error(ret, "not.stmt");
return ret;
}
}
......
......@@ -982,8 +982,16 @@ public class Scanner implements Lexer {
}
/** Sets the current token.
* This method is primarily used to update the token stream when the
* parser is handling the end of nested type arguments such as
* {@code List<List<String>>} and needs to disambiguate between
* repeated use of ">" and relation operators such as ">>" and ">>>". Noting
* that this does not handle arbitrary tokens containing Unicode escape
* sequences.
*/
public void token(Token token) {
pos += this.token.name.length() - token.name.length();
prevEndPos = pos;
this.token = token;
}
......
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. 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
......@@ -94,6 +94,19 @@ public abstract class AbstractLog {
report(diags.error(source, pos, key, args));
}
/** Report an error, unless another error was already reported at same
* source position.
* @param flag A flag to set on the diagnostic
* @param pos The source position at which to report the error.
* @param key The key for the localized error message.
* @param args Fields of the error message.
*/
public void error(DiagnosticFlag flag, DiagnosticPosition pos, String key, Object ... args) {
JCDiagnostic d = diags.error(source, pos, key, args);
d.setFlag(flag);
report(d);
}
/** Report an error, unless another error was already reported at same
* source position.
* @param pos The source position at which to report the error.
......
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. 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
......@@ -322,16 +322,46 @@ public abstract class BaseFileManager {
// <editor-fold defaultstate="collapsed" desc="Content cache">
public CharBuffer getCachedContent(JavaFileObject file) {
SoftReference<CharBuffer> r = contentCache.get(file);
return (r == null ? null : r.get());
ContentCacheEntry e = contentCache.get(file);
if (e == null)
return null;
if (!e.isValid(file)) {
contentCache.remove(file);
return null;
}
return e.getValue();
}
public void cache(JavaFileObject file, CharBuffer cb) {
contentCache.put(file, new SoftReference<CharBuffer>(cb));
contentCache.put(file, new ContentCacheEntry(file, cb));
}
protected final Map<JavaFileObject, SoftReference<CharBuffer>> contentCache
= new HashMap<JavaFileObject, SoftReference<CharBuffer>>();
public void flushCache(JavaFileObject file) {
contentCache.remove(file);
}
protected final Map<JavaFileObject, ContentCacheEntry> contentCache
= new HashMap<JavaFileObject, ContentCacheEntry>();
protected static class ContentCacheEntry {
final long timestamp;
final SoftReference<CharBuffer> ref;
ContentCacheEntry(JavaFileObject file, CharBuffer cb) {
this.timestamp = file.getLastModified();
this.ref = new SoftReference<CharBuffer>(cb);
}
boolean isValid(JavaFileObject file) {
return timestamp == file.getLastModified();
}
CharBuffer getValue() {
return ref.get();
}
}
// </editor-fold>
public static Kind getKind(String name) {
......
......@@ -26,10 +26,8 @@
package javax.tools;
import java.io.File;
import java.io.InputStream;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.Callable;
import javax.annotation.processing.Processor;
......
/*
* Copyright (c) 2011, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7079713
* @summary javac hangs when compiling a class that references a cyclically inherited class
* @run main TestCircularClassfile
*/
import java.io.*;
import java.net.URI;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
import com.sun.source.util.JavacTask;
public class TestCircularClassfile {
enum SourceKind {
A_EXTENDS_B("class B {} class A extends B { void m() {} }"),
B_EXTENDS_A("class A { void m() {} } class B extends A {}");
String sourceStr;
private SourceKind(String sourceStr) {
this.sourceStr = sourceStr;
}
SimpleJavaFileObject getSource() {
return new SimpleJavaFileObject(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE) {
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return sourceStr;
}
};
}
}
enum TestKind {
REPLACE_A("A.class"),
REPLACE_B("B.class");
String targetClass;
private TestKind(String targetClass) {
this.targetClass = targetClass;
}
}
enum ClientKind {
METHOD_CALL1("A a = null; a.m();"),
METHOD_CALL2("B b = null; b.m();"),
CONSTR_CALL1("new A();"),
CONSTR_CALL2("new B();"),
ASSIGN1("A a = null; B b = a;"),
ASSIGN2("B b = null; A a = b;");
String mainMethod;
private ClientKind(String mainMethod) {
this.mainMethod = mainMethod;
}
SimpleJavaFileObject getSource() {
return new SimpleJavaFileObject(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE) {
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return "class Test { public static void main(String[] args) { #M } }"
.replace("#M", mainMethod);
}
};
}
}
public static void main(String... args) throws Exception {
JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
int count = 0;
for (SourceKind sk1 : SourceKind.values()) {
for (SourceKind sk2 : SourceKind.values()) {
for (TestKind tk : TestKind.values()) {
for (ClientKind ck : ClientKind.values()) {
new TestCircularClassfile("sub_"+count++, sk1, sk2, tk, ck).check(comp, fm);
}
}
}
}
}
static String workDir = System.getProperty("user.dir");
String destPath;
SourceKind sk1;
SourceKind sk2;
TestKind tk;
ClientKind ck;
TestCircularClassfile(String destPath, SourceKind sk1, SourceKind sk2, TestKind tk, ClientKind ck) {
this.destPath = destPath;
this.sk1 = sk1;
this.sk2 = sk2;
this.tk = tk;
this.ck = ck;
}
void check(JavaCompiler comp, StandardJavaFileManager fm) throws Exception {
//step 1: compile first source code in the test subfolder
File destDir = new File(workDir, destPath); destDir.mkdir();
//output dir must be set explicitly as we are sharing the fm (see bug 7026941)
fm.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(destDir));
JavacTask ct = (JavacTask)comp.getTask(null, fm, null,
null, null, Arrays.asList(sk1.getSource()));
ct.generate();
//step 2: compile second source code in a temp folder
File tmpDir = new File(destDir, "tmp"); tmpDir.mkdir();
//output dir must be set explicitly as we are sharing the fm (see bug 7026941)
fm.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(tmpDir));
ct = (JavacTask)comp.getTask(null, fm, null,
null, null, Arrays.asList(sk2.getSource()));
ct.generate();
//step 3: move a classfile from the temp folder to the test subfolder
File fileToMove = new File(tmpDir, tk.targetClass);
File target = new File(destDir, tk.targetClass);
target.delete();
boolean success = fileToMove.renameTo(target);
if (!success) {
throw new AssertionError("error when moving file " + tk.targetClass);
}
//step 4: compile the client class against the classes in the test subfolder
//input/output dir must be set explicitly as we are sharing the fm (see bug 7026941)
fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(destDir));
fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(destDir));
ct = (JavacTask)comp.getTask(null, fm, null,
null, null, Arrays.asList(ck.getSource()));
ct.generate();
}
}
/*
* @test /nodynamiccopyright/
* @bug 7085024
* @summary internal error; cannot instantiate Foo
* @compile/fail/ref=T7085024.out -XDrawDiagnostics T7085024.java
*/
class T7085024 {
T7085024 (boolean ret) { } //internal error goes away if constructor accepts a reference type
T7085024 f = new T7085024((NonExistentClass) null );
}
T7085024.java:11:32: compiler.err.cant.resolve.location: kindname.class, NonExistentClass, , , (compiler.misc.location: kindname.class, T7085024, null)
1 error
BadTwr.java:13:39: compiler.err.already.defined: r1, main(java.lang.String...)
BadTwr.java:18:13: compiler.err.already.defined: args, main(java.lang.String...)
BadTwr.java:13:46: compiler.err.already.defined: r1, main(java.lang.String...)
BadTwr.java:18:20: compiler.err.already.defined: args, main(java.lang.String...)
BadTwr.java:21:13: compiler.err.cant.assign.val.to.final.var: thatsIt
BadTwr.java:26:17: compiler.err.already.defined: name, main(java.lang.String...)
BadTwr.java:26:24: compiler.err.already.defined: name, main(java.lang.String...)
4 errors
DuplicateResourceDecl.java:12:45: compiler.err.already.defined: c, main(java.lang.String[])
DuplicateResourceDecl.java:12:56: compiler.err.already.defined: c, main(java.lang.String[])
1 error
ResourceInterface.java:38:13: compiler.err.unreported.exception.implicit.close: ResourceInterface.E1, r2
ResourceInterface.java:38:23: compiler.err.unreported.exception.implicit.close: ResourceInterface.E1, r2
1 error
TwrFlow.java:14:11: compiler.err.except.never.thrown.in.try: java.io.IOException
TwrFlow.java:12:13: compiler.err.unreported.exception.implicit.close: CustomCloseException, twrFlow
TwrFlow.java:12:21: compiler.err.unreported.exception.implicit.close: CustomCloseException, twrFlow
2 errors
TwrLint.java:14:15: compiler.warn.try.explicit.close.call
TwrLint.java:13:13: compiler.warn.try.resource.not.referenced: r3
TwrLint.java:13:21: compiler.warn.try.resource.not.referenced: r3
2 warnings
TwrOnNonResource.java:12:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
TwrOnNonResource.java:15:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
TwrOnNonResource.java:18:13: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
TwrOnNonResource.java:12:30: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
TwrOnNonResource.java:15:30: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
TwrOnNonResource.java:18:30: compiler.err.prob.found.req: (compiler.misc.try.not.applicable.to.type), TwrOnNonResource, java.lang.AutoCloseable
3 errors
......@@ -28,6 +28,7 @@
*/
import com.sun.source.util.JavacTask;
import com.sun.tools.javac.api.ClientCodeWrapper;
import com.sun.tools.javac.api.JavacTool;
import com.sun.tools.javac.util.JCDiagnostic;
import java.net.URI;
......@@ -236,7 +237,7 @@ public class UnusedResourcesTest {
public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
if (diagnostic.getKind() == Diagnostic.Kind.WARNING &&
diagnostic.getCode().contains("try.resource.not.referenced")) {
String varName = ((JCDiagnostic)diagnostic).getArgs()[0].toString();
String varName = unwrap(diagnostic).getArgs()[0].toString();
if (varName.equals(TwrStmt.TWR1.resourceName)) {
unused_r1 = true;
} else if (varName.equals(TwrStmt.TWR2.resourceName)) {
......@@ -246,5 +247,13 @@ public class UnusedResourcesTest {
}
}
}
private JCDiagnostic unwrap(Diagnostic<? extends JavaFileObject> diagnostic) {
if (diagnostic instanceof JCDiagnostic)
return (JCDiagnostic) diagnostic;
if (diagnostic instanceof ClientCodeWrapper.DiagnosticSourceUnwrapper)
return ((ClientCodeWrapper.DiagnosticSourceUnwrapper)diagnostic).d;
throw new IllegalArgumentException();
}
}
}
/*
* Copyright (c) 2011, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7043371
* @summary javac7 fails with NPE during compilation
* @compile T7043371.java
*/
@interface Anno {
String value();
}
class B {
@Anno(value=A.a)
public static final int b = 0;
}
class A {
@Deprecated
public static final String a = "a";
}
/*
* Copyright (c) 2011, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7073477
* @summary NPE in com.sun.tools.javac.code.Symbol$VarSymbol.getConstValue
* @compile T7073477.java
*/
@SuppressWarnings(T7073477A.S)
class T7073477 {
}
class T7073477A {
@SuppressWarnings("")
static final String S = "";
}
/*
* Copyright (c) 20011, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7086261
* @summary javac doesn't report error as expected, it only reports ClientCodeWrapper$DiagnosticSourceUnwrapper
*/
import javax.tools.*;
import com.sun.tools.javac.api.ClientCodeWrapper.DiagnosticSourceUnwrapper;
import com.sun.tools.javac.util.JCDiagnostic;
import java.net.URI;
import java.util.Arrays;
import static javax.tools.StandardLocation.*;
import static javax.tools.JavaFileObject.Kind.*;
public class T7086261 {
static class ErroneousSource extends SimpleJavaFileObject {
public ErroneousSource() {
super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return "class Test { NonexistentClass c = null; }";
}
}
static class DiagnosticChecker implements DiagnosticListener<javax.tools.JavaFileObject> {
public void report(Diagnostic message) {
if (!(message instanceof DiagnosticSourceUnwrapper)) {
throw new AssertionError("Wrapped diagnostic expected!");
}
String actual = message.toString();
JCDiagnostic jd = (JCDiagnostic)((DiagnosticSourceUnwrapper)message).d;
String expected = jd.toString();
if (!actual.equals(expected)) {
throw new AssertionError("expected = " + expected + "\nfound = " + actual);
}
}
};
void test() throws Throwable {
JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
JavaFileManager jfm = javac.getStandardFileManager(null, null, null);
JavaCompiler.CompilationTask task =
javac.getTask(null, jfm, new DiagnosticChecker(), null, null, Arrays.asList(new ErroneousSource()));
task.call();
}
public static void main(String[] args) throws Throwable {
new T7086261().test();
}
}
......@@ -21,10 +21,12 @@
* questions.
*/
import com.sun.tools.javac.file.JavacFileManager;
import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
import java.util.regex.*;
import javax.annotation.processing.Processor;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
......@@ -37,12 +39,11 @@ import javax.tools.ToolProvider;
// import com.sun.tools.javac.Main
// import com.sun.tools.javac.main.Main
import com.sun.tools.javac.api.ClientCodeWrapper;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.JavacMessages;
import com.sun.tools.javac.util.JCDiagnostic;
import java.net.URL;
import java.net.URLClassLoader;
import javax.annotation.processing.Processor;
/**
* Class to handle example code designed to illustrate javac diagnostic messages.
......@@ -397,7 +398,7 @@ class Example implements Comparable<Example> {
if (keys != null) {
for (Diagnostic<? extends JavaFileObject> d: dc.getDiagnostics()) {
scanForKeys((JCDiagnostic) d, keys);
scanForKeys(unwrap(d), keys);
}
}
......@@ -418,6 +419,14 @@ class Example implements Comparable<Example> {
for (JCDiagnostic sd: d.getSubdiagnostics())
scanForKeys(sd, keys);
}
private JCDiagnostic unwrap(Diagnostic<? extends JavaFileObject> diagnostic) {
if (diagnostic instanceof JCDiagnostic)
return (JCDiagnostic) diagnostic;
if (diagnostic instanceof ClientCodeWrapper.DiagnosticSourceUnwrapper)
return ((ClientCodeWrapper.DiagnosticSourceUnwrapper)diagnostic).d;
throw new IllegalArgumentException();
}
}
/**
......
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. 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
......@@ -23,7 +23,6 @@
// key: compiler.err.empty.char.lit
// key: compiler.err.unclosed.char.lit
// key: compiler.err.expected
// key: compiler.err.premature.eof
class X {
......
/*
* Copyright (c) 2011, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7068451
* @summary Regression: javac compiles fixed sources against previous,
* not current, version of generated sources
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
public class T7068451 {
public static void main(String[] args) throws Exception {
new T7068451().run();
}
void run() throws Exception {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
System.err.println("using " + compiler.getClass() + " from " + compiler.getClass().getProtectionDomain().getCodeSource());
File tmp = new File("tmp");
tmp.mkdir();
for (File f: tmp.listFiles())
f.delete();
File input = writeFile(tmp, "X.java", "package p; class X { { p.C.first(); } }");
List<String> opts = Arrays.asList(
"-s", tmp.getPath(),
"-d", tmp.getPath(),
"-XprintRounds");
System.err.println();
System.err.println("FIRST compilation");
System.err.println();
CompilationTask task = compiler.getTask(null, null, null, opts, null,
compiler.getStandardFileManager(null, null, null).getJavaFileObjects(input));
task.setProcessors(Collections.singleton(new Proc("first")));
check("compilation", task.call());
writeFile(tmp, "X.java", "package p; class X { { p.C.second(); } }");
//Thread.sleep(2000);
System.err.println();
System.err.println("SECOND compilation");
System.err.println();
task = compiler.getTask(null, null, null, opts, null,
compiler.getStandardFileManager(null, null, null).getJavaFileObjects(input));
task.setProcessors(Collections.singleton(new Proc("second")));
check("compilation", task.call());
//Thread.sleep(2000);
System.err.println();
System.err.println("SECOND compilation, REPEATED");
System.err.println();
task = compiler.getTask(null, null, null, opts, null,
compiler.getStandardFileManager(null, null, null).getJavaFileObjects(input));
task.setProcessors(Collections.singleton(new Proc("second")));
check("compilation", task.call());
}
void check(String msg, boolean ok) {
System.err.println(msg + ": " + (ok ? "ok" : "failed"));
if (!ok)
throw new AssertionError(msg);
}
static File writeFile(File base, String path, String body) throws IOException {
File f = new File(base, path);
FileWriter out = new FileWriter(f);
out.write(body);
out.close();
System.err.println("wrote " + path + ": " + body);
return f;
}
@SupportedAnnotationTypes("*")
private static class Proc extends AbstractProcessor {
final String m;
Proc(String m) {
this.m = m;
}
int count;
@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (roundEnv.processingOver() || count++ > 0) {
return false;
}
Filer filer = processingEnv.getFiler();
Messager messager = processingEnv.getMessager();
System.err.println("running Proc");
try {
int len = filer.getResource(StandardLocation.SOURCE_OUTPUT, "p", "C.java").getCharContent(false).length();
messager.printMessage(Kind.NOTE, "C.java: found previous content of length " + len);
} catch (FileNotFoundException x) {
messager.printMessage(Kind.NOTE, "C.java: not previously there");
} catch (IOException x) {
messager.printMessage(Kind.ERROR, "while reading: " + x);
}
try {
String body = "package p; public class C { public static void " + m + "() {} }";
Writer w = filer.createSourceFile("p.C").openWriter();
w.write(body);
w.close();
messager.printMessage(Kind.NOTE, "C.java: wrote new content: " + body);
} catch (IOException x) {
messager.printMessage(Kind.ERROR, "while writing: " + x);
}
return true;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latest();
}
}
}
/*
* @test /nodynamiccopyright/
* @bug 7024096
* @summary Stack trace has invalid line numbers
* @author Bruce Chapman
* @compile T7024096.java
* @run main T7024096
*/
public class T7024096 {
private static final int START = 14; // starting line number for the test
public static void main(String[] args) {
T7024096 m = new T7024096();
m.nest(START);
m.nest(START + 1, m.nest(START + 1), m.nest(START + 1),
m.nest(START + 2),
m.nest(START + 3, m.nest(START + 3)));
}
public T7024096 nest(int expectedline, T7024096... args) {
Exception e = new Exception("expected line#: " + expectedline);
int myline = e.getStackTrace()[1].getLineNumber();
if( myline != expectedline) {
throw new RuntimeException("Incorrect line number " +
"expected: " + expectedline +
", got: " + myline, e);
}
System.out.format("Got expected line number %d correct %n", myline);
return null;
}
}
此差异已折叠。
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. 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
......@@ -35,6 +35,7 @@ import javax.lang.model.element.TypeElement;
import javax.tools.*;
import com.sun.source.util.JavacTask;
import com.sun.tools.javac.api.ClientCodeWrapper;
import com.sun.tools.javac.api.JavacTool;
import com.sun.tools.javac.util.JCDiagnostic;
......@@ -171,7 +172,7 @@ public class TestSuppression {
public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
System.err.println((++total) + ": "
+ "resolveError:" + isResolveError((JCDiagnostic) diagnostic) + "\n"
+ "resolveError:" + isResolveError(unwrap(diagnostic)) + "\n"
+ diagnostic);
Diagnostic.Kind dk = diagnostic.getKind();
Integer c = counts.get(dk);
......@@ -181,6 +182,14 @@ public class TestSuppression {
private static boolean isResolveError(JCDiagnostic d) {
return d.isFlagSet(RESOLVE_ERROR);
}
private JCDiagnostic unwrap(Diagnostic<? extends JavaFileObject> diagnostic) {
if (diagnostic instanceof JCDiagnostic)
return (JCDiagnostic) diagnostic;
if (diagnostic instanceof ClientCodeWrapper.DiagnosticSourceUnwrapper)
return ((ClientCodeWrapper.DiagnosticSourceUnwrapper)diagnostic).d;
throw new IllegalArgumentException();
}
}
@SupportedAnnotationTypes("*")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册