This commit is contained in:
Lana Steuck 2013-02-11 16:15:09 -08:00
commit e8d53ad94a
64 changed files with 2026 additions and 189 deletions

View File

@ -241,6 +241,7 @@ JAVAC_DIRS = \
javax/annotation/processing \
javax/lang/model \
javax/tools \
jdk/ \
com/sun/source \
com/sun/tools/javac

View File

@ -116,6 +116,7 @@ javac.includes = \
javax/annotation/processing/ \
javax/lang/model/ \
javax/tools/ \
jdk/ \
com/sun/source/ \
com/sun/tools/javac/ \
com/sun/tools/doclint/

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2013, 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
@ -196,10 +196,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
protected void addOverviewComment(Content htmltree) {
if (root.inlineTags().length > 0) {
htmltree.addContent(getMarkerAnchor("overview_description"));
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.subTitle);
addInlineComment(root, div);
htmltree.addContent(div);
addInlineComment(root, htmltree);
}
}
@ -211,7 +208,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
*/
protected void addOverview(Content body) throws IOException {
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.footer);
div.addStyle(HtmlStyle.contentContainer);
addOverviewComment(div);
addTagsInfo(root, div);
body.addContent(div);

View File

@ -496,9 +496,9 @@ public abstract class Symbol implements Element {
return l.toList();
}
public static class DelegatedSymbol extends Symbol {
protected Symbol other;
public DelegatedSymbol(Symbol other) {
public static class DelegatedSymbol<T extends Symbol> extends Symbol {
protected T other;
public DelegatedSymbol(T other) {
super(other.kind, other.flags_field, other.name, other.type, other.owner);
this.other = other;
}
@ -532,6 +532,10 @@ public abstract class Symbol implements Element {
public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
return v.visitSymbol(other, p);
}
public T getUnderlyingSymbol() {
return other;
}
}
/** A class for type symbols. Type variables are represented by instances

View File

@ -570,10 +570,19 @@ public class Lower extends TreeTranslator {
* @param flags The class symbol's flags
* @param owner The class symbol's owner
*/
ClassSymbol makeEmptyClass(long flags, ClassSymbol owner) {
JCClassDecl makeEmptyClass(long flags, ClassSymbol owner) {
return makeEmptyClass(flags, owner, null, true);
}
JCClassDecl makeEmptyClass(long flags, ClassSymbol owner, Name flatname,
boolean addToDefs) {
// Create class symbol.
ClassSymbol c = reader.defineClass(names.empty, owner);
c.flatname = chk.localClassName(c);
if (flatname != null) {
c.flatname = flatname;
} else {
c.flatname = chk.localClassName(c);
}
c.sourcefile = owner.sourcefile;
c.completer = null;
c.members_field = new Scope(c);
@ -597,9 +606,8 @@ public class Lower extends TreeTranslator {
cdef.type = c.type;
// Append class definition tree to owner's definitions.
odef.defs = odef.defs.prepend(cdef);
return c;
if (addToDefs) odef.defs = odef.defs.prepend(cdef);
return cdef;
}
/**************************************************************************
@ -706,7 +714,7 @@ public class Lower extends TreeTranslator {
* and synthethise a class (with makeEmptyClass) if one is not available.
* However, there is a small possibility that an existing class will not
* be generated as expected if it is inside a conditional with a constant
* expression. If that is found to be the case, create an empty class here.
* expression. If that is found to be the case, create an empty class tree here.
*/
private void checkAccessConstructorTags() {
for (List<ClassSymbol> l = accessConstrTags; l.nonEmpty(); l = l.tail) {
@ -714,14 +722,10 @@ public class Lower extends TreeTranslator {
if (isTranslatedClassAvailable(c))
continue;
// Create class definition tree.
JCClassDecl cdef = make.ClassDef(
make.Modifiers(STATIC | SYNTHETIC), names.empty,
List.<JCTypeParameter>nil(),
null, List.<JCExpression>nil(), List.<JCTree>nil());
cdef.sym = c;
cdef.type = c.type;
// add it to the list of classes to be generated
translated.append(cdef);
JCClassDecl cdec = makeEmptyClass(STATIC | SYNTHETIC,
c.outermostClass(), c.flatname, false);
swapAccessConstructorTag(c, cdec.sym);
translated.append(cdec);
}
}
// where
@ -735,6 +739,19 @@ public class Lower extends TreeTranslator {
return false;
}
void swapAccessConstructorTag(ClassSymbol oldCTag, ClassSymbol newCTag) {
for (MethodSymbol methodSymbol : accessConstrs.values()) {
Assert.check(methodSymbol.type.hasTag(METHOD));
MethodType oldMethodType =
(MethodType)methodSymbol.type;
if (oldMethodType.argtypes.head.tsym == oldCTag)
methodSymbol.type =
types.createMethodTypeWithParameters(oldMethodType,
oldMethodType.getParameterTypes().tail
.prepend(newCTag.erasure(types)));
}
}
/**************************************************************************
* Access methods
*************************************************************************/
@ -1211,7 +1228,7 @@ public class Lower extends TreeTranslator {
"1");
ClassSymbol ctag = chk.compiled.get(flatname);
if (ctag == null)
ctag = makeEmptyClass(STATIC | SYNTHETIC, topClass);
ctag = makeEmptyClass(STATIC | SYNTHETIC, topClass).sym;
// keep a record of all tags, to verify that all are generated as required
accessConstrTags = accessConstrTags.prepend(ctag);
return ctag;
@ -1778,7 +1795,7 @@ public class Lower extends TreeTranslator {
if (e.sym.kind == TYP &&
e.sym.name == names.empty &&
(e.sym.flags() & INTERFACE) == 0) return (ClassSymbol) e.sym;
return makeEmptyClass(STATIC | SYNTHETIC, clazz);
return makeEmptyClass(STATIC | SYNTHETIC, clazz).sym;
}
/** Return symbol for "class$" method. If there is no method definition

View File

@ -482,10 +482,8 @@ public class ClassWriter extends ClassFile {
while (i < pool.pp) {
Object value = pool.pool[i];
Assert.checkNonNull(value);
if (value instanceof Method)
value = ((Method)value).m;
else if (value instanceof Variable)
value = ((Variable)value).v;
if (value instanceof Method || value instanceof Variable)
value = ((DelegatedSymbol)value).getUnderlyingSymbol();
if (value instanceof MethodSymbol) {
MethodSymbol m = (MethodSymbol)value;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2013, 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
@ -140,23 +140,23 @@ public class Pool {
return n == null ? -1 : n.intValue();
}
static class Method extends DelegatedSymbol {
MethodSymbol m;
static class Method extends DelegatedSymbol<MethodSymbol> {
UniqueType uniqueType;
Method(MethodSymbol m, Types types) {
super(m);
this.m = m;
this.uniqueType = new UniqueType(m.type, types);
}
public boolean equals(Object other) {
if (!(other instanceof Method)) return false;
MethodSymbol o = ((Method)other).m;
public boolean equals(Object any) {
if (!(any instanceof Method)) return false;
MethodSymbol o = ((Method)any).other;
MethodSymbol m = this.other;
return
o.name == m.name &&
o.owner == m.owner &&
((Method)other).uniqueType.equals(uniqueType);
((Method)any).uniqueType.equals(uniqueType);
}
public int hashCode() {
MethodSymbol m = this.other;
return
m.name.hashCode() * 33 +
m.owner.hashCode() * 9 +
@ -173,21 +173,21 @@ public class Pool {
}
@Override
public boolean equals(Object other) {
if (!super.equals(other)) return false;
if (!(other instanceof DynamicMethod)) return false;
DynamicMethodSymbol dm1 = (DynamicMethodSymbol)m;
DynamicMethodSymbol dm2 = (DynamicMethodSymbol)((DynamicMethod)other).m;
public boolean equals(Object any) {
if (!super.equals(any)) return false;
if (!(any instanceof DynamicMethod)) return false;
DynamicMethodSymbol dm1 = (DynamicMethodSymbol)other;
DynamicMethodSymbol dm2 = (DynamicMethodSymbol)((DynamicMethod)any).other;
return dm1.bsm == dm2.bsm &&
dm1.bsmKind == dm2.bsmKind &&
Arrays.equals(uniqueStaticArgs,
((DynamicMethod)other).uniqueStaticArgs);
((DynamicMethod)any).uniqueStaticArgs);
}
@Override
public int hashCode() {
int hash = super.hashCode();
DynamicMethodSymbol dm = (DynamicMethodSymbol)m;
DynamicMethodSymbol dm = (DynamicMethodSymbol)other;
hash += dm.bsmKind * 7 +
dm.bsm.hashCode() * 11;
for (int i = 0; i < dm.staticArgs.length; i++) {
@ -209,23 +209,23 @@ public class Pool {
}
}
static class Variable extends DelegatedSymbol {
VarSymbol v;
static class Variable extends DelegatedSymbol<VarSymbol> {
UniqueType uniqueType;
Variable(VarSymbol v, Types types) {
super(v);
this.v = v;
this.uniqueType = new UniqueType(v.type, types);
}
public boolean equals(Object other) {
if (!(other instanceof Variable)) return false;
VarSymbol o = ((Variable)other).v;
public boolean equals(Object any) {
if (!(any instanceof Variable)) return false;
VarSymbol o = ((Variable)any).other;
VarSymbol v = other;
return
o.name == v.name &&
o.owner == v.owner &&
((Variable)other).uniqueType.equals(uniqueType);
((Variable)any).uniqueType.equals(uniqueType);
}
public int hashCode() {
VarSymbol v = other;
return
v.name.hashCode() * 33 +
v.owner.hashCode() * 9 +

View File

@ -629,6 +629,8 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
if (!taskListener.isEmpty()) {
TaskEvent e = new TaskEvent(TaskEvent.Kind.PARSE, filename);
taskListener.started(e);
keepComments = true;
genEndPos = true;
}
Parser parser = parserFactory.newParser(content, keepComments(), genEndPos, lineDebugInfo);
tree = parser.parseCompilationUnit();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2013, 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
@ -279,13 +279,7 @@ public class DocCommentParser {
try {
nextChar();
if (isIdentifierStart(ch)) {
int namePos = bp;
nextChar();
while (isIdentifierPart(ch))
nextChar();
int nameLen = bp - namePos;
Name name = names.fromChars(buf, namePos, nameLen);
Name name = readIdentifier();
TagParser tp = tagParsers.get(name);
if (tp == null) {
List<DCTree> content = blockContent();
@ -334,14 +328,9 @@ public class DocCommentParser {
try {
nextChar();
if (isIdentifierStart(ch)) {
int namePos = bp;
nextChar();
while (isIdentifierPart(ch))
nextChar();
int nameLen = bp - namePos;
Name name = readIdentifier();
skipWhitespace();
Name name = names.fromChars(buf, namePos, nameLen);
TagParser tp = tagParsers.get(name);
if (tp == null) {
DCTree text = inlineText();
@ -575,10 +564,8 @@ public class DocCommentParser {
int pos = bp;
if (isJavaIdentifierStart(ch)) {
nextChar();
while (isJavaIdentifierPart(ch))
nextChar();
return m.at(pos).Identifier(names.fromChars(buf, pos, bp - pos));
Name name = readJavaIdentifier();
return m.at(pos).Identifier(name);
}
throw new ParseException("dc.identifier.expected");
@ -703,39 +690,36 @@ public class DocCommentParser {
protected DCTree entity() {
int p = bp;
nextChar();
int namep = bp;
Name name = null;
boolean checkSemi = false;
if (ch == '#') {
int namep = bp;
nextChar();
if (isDecimalDigit(ch)) {
nextChar();
while (isDecimalDigit(ch))
nextChar();
checkSemi = true;
name = names.fromChars(buf, namep, bp - namep);
} else if (ch == 'x' || ch == 'X') {
nextChar();
if (isHexDigit(ch)) {
nextChar();
while (isHexDigit(ch))
nextChar();
checkSemi = true;
name = names.fromChars(buf, namep, bp - namep);
}
}
} else if (isIdentifierStart(ch)) {
nextChar();
while (isIdentifierPart(ch))
nextChar();
checkSemi = true;
name = readIdentifier();
}
if (checkSemi && ch == ';') {
if (name == null)
return erroneous("dc.bad.entity", p);
else {
if (ch != ';')
return erroneous("dc.missing.semicolon", p);
nextChar();
return m.at(p).Entity(names.fromChars(buf, namep, bp - namep - 1));
} else {
String code = checkSemi
? "dc.missing.semicolon"
: "dc.bad.entity";
return erroneous(code, p);
return m.at(p).Entity(name);
}
}
@ -747,11 +731,7 @@ public class DocCommentParser {
int p = bp;
nextChar();
if (isIdentifierStart(ch)) {
int namePos = bp;
nextChar();
while (isIdentifierPart(ch))
nextChar();
int nameLen = bp - namePos;
Name name = readIdentifier();
List<DCTree> attrs = htmlAttrs();
if (attrs != null) {
boolean selfClosing = false;
@ -761,22 +741,16 @@ public class DocCommentParser {
}
if (ch == '>') {
nextChar();
Name name = names.fromChars(buf, namePos, nameLen);
return m.at(p).StartElement(name, attrs, selfClosing);
}
}
} else if (ch == '/') {
nextChar();
if (isIdentifierStart(ch)) {
int namePos = bp;
nextChar();
while (isIdentifierPart(ch))
nextChar();
int nameLen = bp - namePos;
Name name = readIdentifier();
skipWhitespace();
if (ch == '>') {
nextChar();
Name name = names.fromChars(buf, namePos, nameLen);
return m.at(p).EndElement(name);
}
}
@ -822,10 +796,7 @@ public class DocCommentParser {
loop:
while (isIdentifierStart(ch)) {
int namePos = bp;
nextChar();
while (isIdentifierPart(ch))
nextChar();
int nameLen = bp - namePos;
Name name = readIdentifier();
skipWhitespace();
List<DCTree> value = null;
ValueKind vkind = ValueKind.EMPTY;
@ -862,7 +833,6 @@ public class DocCommentParser {
skipWhitespace();
value = v.toList();
}
Name name = names.fromChars(buf, namePos, nameLen);
DCAttribute attr = m.at(namePos).Attribute(name, vkind, value);
attrs.add(attr);
}
@ -897,7 +867,7 @@ public class DocCommentParser {
protected DCErroneous erroneous(String code, int pos) {
int i = bp - 1;
loop:
while (i > 0) {
while (i > pos) {
switch (buf[i]) {
case '\f': case '\n': case '\r':
newline = true;
@ -926,16 +896,24 @@ public class DocCommentParser {
return Character.isUnicodeIdentifierStart(ch);
}
protected boolean isIdentifierPart(char ch) {
return Character.isUnicodeIdentifierPart(ch);
protected Name readIdentifier() {
int start = bp;
nextChar();
while (bp < buflen && Character.isUnicodeIdentifierPart(ch))
nextChar();
return names.fromChars(buf, start, bp - start);
}
protected boolean isJavaIdentifierStart(char ch) {
return Character.isJavaIdentifierStart(ch);
}
protected boolean isJavaIdentifierPart(char ch) {
return Character.isJavaIdentifierPart(ch);
protected Name readJavaIdentifier() {
int start = bp;
nextChar();
while (bp < buflen && Character.isJavaIdentifierPart(ch))
nextChar();
return names.fromChars(buf, start, bp - start);
}
protected boolean isDecimalDigit(char ch) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2013, 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
@ -236,7 +236,7 @@ public class JavadocTokenizer extends JavaTokenizer {
// relative to the best match found in the array.
if (pos == Position.NOPOS)
return Position.NOPOS;
if (pos < 0 || pos >= docComment.length())
if (pos < 0 || pos > docComment.length())
throw new StringIndexOutOfBoundsException(String.valueOf(pos));
if (docPosns == null)
return Position.NOPOS;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2013, 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
@ -119,7 +119,7 @@ public abstract class DCTree implements DocTree {
}
public static abstract class DCBlockTag extends DCTree implements InlineTagTree {
public static abstract class DCBlockTag extends DCTree implements BlockTagTree {
public String getTagName() {
return getKind().tagName;
}
@ -169,7 +169,7 @@ public abstract class DCTree implements DocTree {
}
}
public static class DCAuthor extends DCInlineTag implements AuthorTree {
public static class DCAuthor extends DCBlockTag implements AuthorTree {
public final List<DCTree> name;
DCAuthor(List<DCTree> name) {
@ -640,7 +640,7 @@ public abstract class DCTree implements DocTree {
}
}
public static class DCSince extends DCInlineTag implements SinceTree {
public static class DCSince extends DCBlockTag implements SinceTree {
public final List<DCTree> body;
DCSince(List<DCTree> body) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2013, 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
@ -139,12 +139,13 @@ public class JavadocTool implements DocumentationTool {
@Override
public int run(InputStream in, OutputStream out, OutputStream err, String... arguments) {
PrintWriter err_pw = new PrintWriter(err, true);
PrintWriter out_pw = new PrintWriter(out);
PrintWriter err_pw = new PrintWriter(err == null ? System.err : err, true);
PrintWriter out_pw = new PrintWriter(out == null ? System.out : out);
try {
String standardDocletName = "com.sun.tools.doclets.standard.Standard";
ClassLoader cl = getClass().getClassLoader();
return com.sun.tools.javadoc.Main.execute(
"javadoc", err_pw, err_pw, out_pw, standardDocletName, arguments);
"javadoc", err_pw, err_pw, out_pw, standardDocletName, cl, arguments);
} finally {
err_pw.flush();
out_pw.flush();

View File

@ -0,0 +1,53 @@
/*
* Copyright (c) 2013, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
package jdk;
import java.lang.annotation.*;
/**
* Indicates whether or not a JDK specific type or package is a
* supported part of the JDK.
*
* This annotation should only be applied to types and packages
* <em>outside</em> of the Java SE namespaces of {@code java.*} and
* {@code javax.*} packages. For example, certain portions of {@code
* com.sun.*} are official parts of the JDK meant to be generally
* usable while other portions of {@code com.sun.*} are not. This
* annotation type allows those portions to be easily and
* programmaticly distinguished.
*
* @since 1.8
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.PACKAGE})
@Supported
public @interface Supported {
/**
* Whether or not this package or type is a supported part of the JDK.
*/
boolean value() default true;
}

View File

@ -0,0 +1,32 @@
/*
* @test /nodynamiccopyright/
* @bug 8007096
* @summary DocLint parsing problems with some comments
* @build DocLintTester
* @run main DocLintTester -Xmsgs:-html EndWithIdentifierTest.java
* @run main DocLintTester -Xmsgs -ref EndWithIdentifierTest.out EndWithIdentifierTest.java
* @author jlahoda
*/
/**@deprecated*/
public class EndWithIdentifierTest {
/**{@link*/
private void unfinishedInlineTagName() {}
/**@see List*/
private void endsWithIdentifier() {}
/**&amp*/
private void entityName() {}
/**<a*/
private void tag() {}
/**</a*/
private void tagEnd() {}
/**<a name*/
private void attribute() {}
}

View File

@ -0,0 +1,20 @@
EndWithIdentifierTest.java:14: error: syntax error in reference
/**{@link*/
^
EndWithIdentifierTest.java:17: error: reference not found
/**@see List*/
^
EndWithIdentifierTest.java:20: error: semicolon missing
/**&amp*/
^
EndWithIdentifierTest.java:23: error: malformed HTML
/**<a*/
^
EndWithIdentifierTest.java:26: error: malformed HTML
/**</a*/
^
EndWithIdentifierTest.java:29: error: malformed HTML
/**<a name*/
^
6 errors

View File

@ -0,0 +1,17 @@
/*
* @test /nodynamiccopyright/
* @bug 8007096
* @summary DocLint parsing problems with some comments
* @build DocLintTester
* @run main DocLintTester -Xmsgs:-html UnfinishedInlineTagTest.java
* @run main DocLintTester -Xmsgs -ref UnfinishedInlineTagTest.out UnfinishedInlineTagTest.java
* @author jlahoda
*/
import java.util.List;
/**{@link List
*/
public class UnfinishedInlineTagTest {
}

View File

@ -0,0 +1,5 @@
UnfinishedInlineTagTest.java:14: error: unterminated inline tag
*/
^
1 error

View File

@ -0,0 +1,110 @@
/*
* Copyright (c) 2012, 2013, 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 7199823
* @summary javac generates inner class that can't be verified
* @run main InnerClassCannotBeVerified
*/
import java.util.Arrays;
import javax.tools.JavaFileObject;
import java.net.URI;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler;
import com.sun.source.util.JavacTask;
import com.sun.tools.classfile.ClassFile;
import com.sun.tools.classfile.ConstantPoolException;
import java.io.File;
import java.io.IOException;
public class InnerClassCannotBeVerified {
private static final String errorMessage =
"Compile error while compiling the following source:\n";
public static void main(String... args) throws Exception {
new InnerClassCannotBeVerified().run();
}
void run() throws Exception {
JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
JavaSource source = new JavaSource();
JavacTask ct = (JavacTask)comp.getTask(null, null, null,
null, null, Arrays.asList(source));
try {
if (!ct.call()) {
throw new AssertionError(errorMessage +
source.getCharContent(true));
}
} catch (Throwable ex) {
throw new AssertionError(errorMessage +
source.getCharContent(true));
}
check();
}
private void check() throws IOException, ConstantPoolException {
File file = new File("Test$1.class");
ClassFile classFile = ClassFile.read(file);
boolean inheritsFromObject =
classFile.getSuperclassName().equals("java/lang/Object");
boolean implementsNoInterface = classFile.interfaces.length == 0;
boolean noMethods = classFile.methods.length == 0;
if (!(inheritsFromObject &&
implementsNoInterface &&
noMethods)) {
throw new AssertionError("The inner classes reused as " +
"access constructor tag for this code must be empty");
}
}
class JavaSource extends SimpleJavaFileObject {
String internalSource =
"public class Test {\n" +
" private static class Foo {}\n" +
" public static void main(String[] args){ \n" +
" new Foo();\n" +
" if(false) {\n" +
" new Runnable() {\n" +
" @Override\n" +
" public void run() {\n" +
" System.out.println();\n" +
" }\n" +
" }.run();\n" +
" }\n" +
" }\n" +
"}";
public JavaSource() {
super(URI.create("Test.java"), JavaFileObject.Kind.SOURCE);
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return internalSource;
}
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2013, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 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
@ -174,22 +174,20 @@ public class CombinationsTargetTest1 extends ClassfileTestHelper {
String sourceBase = new String("@Retention("+retentn+")\n" +
"@Target({TYPE_USE,_OTHER_})\n" +
"@ContainedBy( AC.class )\n" +
"@Repeatable( AC.class )\n" +
"@interface A { }\n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,_OTHER_})\n" +
"@ContainerFor(A.class)\n" +
"@interface AC { A[] value(); }\n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,_OTHER_})\n" +
"@ContainedBy( BC.class )\n" +
"@Repeatable( BC.class )\n" +
"@interface B { }\n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,_OTHER_})\n" +
"@ContainerFor(B.class)\n" +
"@interface BC { B[] value(); } \n\n" +
"@Retention("+retentn+")\n" +
@ -198,12 +196,11 @@ public class CombinationsTargetTest1 extends ClassfileTestHelper {
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,TYPE_PARAMETER,_OTHER_})\n" +
"@ContainedBy(DC.class)\n" +
"@Repeatable(DC.class)\n" +
"@interface D { }\n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,TYPE_PARAMETER,_OTHER_})\n" +
"@ContainerFor(D.class) \n" +
"@interface DC { D[] value(); }\n\n");
// Test case sources with sample generated source.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 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
@ -171,32 +171,29 @@ public class CombinationsTargetTest2 extends ClassfileTestHelper {
String sourceBase = new String("@Retention("+retentn+")\n" +
"@Target({TYPE_USE,_OTHER_})\n" +
"@ContainedBy( AC.class )\n" +
"@Repeatable( AC.class )\n" +
"@interface A { }\n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,_OTHER_})\n" +
"@ContainerFor(A.class)\n" +
"@interface AC { A[] value(); }\n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,_OTHER_})\n" +
"@ContainedBy( BC.class )\n" +
"@Repeatable( BC.class )\n" +
"@interface B { }\n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,_OTHER_})\n" +
"@ContainerFor(B.class)\n" +
"@interface BC { B[] value(); } \n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,TYPE_PARAMETER,_OTHER_})\n" +
"@ContainedBy(DC.class)\n" +
"@Repeatable(DC.class)\n" +
"@interface D { }\n\n" +
"@Retention("+retentn+")\n" +
"@Target({TYPE_USE,TYPE_PARAMETER,_OTHER_})\n" +
"@ContainerFor(D.class) \n" +
"@interface DC { D[] value(); }\n\n");
// Test case sources with sample generated source

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,13 +1,5 @@
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.TYPE_PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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
@ -36,6 +28,14 @@ import java.lang.annotation.Target;
* @compile/fail/ref=DotClass.out -XDrawDiagnostics DotClass.java
*/
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.TYPE_PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
@Target({TYPE_USE, TYPE_PARAMETER, TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface A {}

View File

@ -120,7 +120,6 @@ class MyList<E> { }
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@interface RTA { }
@ContainerFor(RTA.class)
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@interface RTAs {
RTA[] value();

View File

@ -1,6 +1,5 @@
/*
* Copyright (c) 2008 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 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
@ -22,8 +21,6 @@
* questions.
*/
import java.lang.annotation.*;
/*
* @test
* @summary test acceptance of varargs annotations
@ -31,6 +28,8 @@ import java.lang.annotation.*;
* @compile Varargs.java
*/
import java.lang.annotation.*;
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@interface A {}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 2013, 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
@ -241,8 +241,8 @@ public class Driver {
sb.append("\n@Repeatable(RTAs.class) @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @interface RTA {}");
sb.append("\n@Repeatable(RTBs.class) @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @interface RTB {}");
sb.append("\n@ContainerFor(RTA.class) @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @interface RTAs { RTA[] value(); }");
sb.append("\n@ContainerFor(RTB.class) @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @interface RTBs { RTB[] value(); }");
sb.append("\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @interface RTAs { RTA[] value(); }");
sb.append("\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @interface RTBs { RTB[] value(); }");
sb.append("\n@Target(value={ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE})");
sb.append("\n@interface Decl {}");

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 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

View File

@ -0,0 +1,227 @@
/*
* Copyright (c) 2010, 2013, 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 8007344
* @summary javac may not make tree end positions and/or doc comments
* available to processors and listeners
* @library /tools/javac/lib
* @build JavacTestingAbstractProcessor
* @run main Test
*/
import java.io.File;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Set;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import com.sun.source.doctree.DocCommentTree;
import com.sun.source.tree.*;
import com.sun.source.util.DocTrees;
import com.sun.source.util.JavacTask;
import com.sun.source.util.SourcePositions;
import com.sun.source.util.TaskEvent;
import com.sun.source.util.TaskListener;
import com.sun.source.util.TreePath;
import com.sun.source.util.TreePathScanner;
import com.sun.tools.javac.api.JavacTool;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.Pretty;
import com.sun.tools.javac.util.Position;
/** Doc comment: Test */
public class Test {
public static final int EXPECT_DOC_COMMENTS = 3;
/** Doc comment: main */
public static void main(String... args) throws Exception {
PrintWriter out = new PrintWriter(System.err);
try {
new Test(out).run();
} finally {
out.flush();
}
}
PrintWriter out;
int errors;
Test(PrintWriter out) {
this.out = out;
}
/** Doc comment: run */
void run() throws Exception {
File testSrc = new File(System.getProperty("test.src"));
File thisFile = new File(testSrc, getClass().getName() + ".java");
JavacTool javac = JavacTool.create();
StandardJavaFileManager fm = javac.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjects(thisFile);
testAnnoProcessor(javac, fm, fos, out, EXPECT_DOC_COMMENTS);
testTaskListener(javac, fm, fos, out, EXPECT_DOC_COMMENTS);
if (errors > 0)
throw new Exception(errors + " errors occurred");
}
void testAnnoProcessor(JavacTool javac, StandardJavaFileManager fm,
Iterable<? extends JavaFileObject> files, PrintWriter out,
int expectedDocComments) {
out.println("Test annotation processor");
JavacTask task = javac.getTask(out, fm, null, null, null, files);
AnnoProc ap = new AnnoProc(DocTrees.instance(task));
task.setProcessors(Arrays.asList(ap));
task.call();
ap.checker.checkDocComments(expectedDocComments);
}
void testTaskListener(JavacTool javac, StandardJavaFileManager fm,
Iterable<? extends JavaFileObject> files, PrintWriter out,
int expectedDocComments) {
out.println("Test task listener");
JavacTask task = javac.getTask(out, fm, null, null, null, files);
TaskListnr tl = new TaskListnr(DocTrees.instance(task));
task.addTaskListener(tl);
task.call();
tl.checker.checkDocComments(expectedDocComments);
}
void error(String msg) {
out.println("Error: " + msg);
errors++;
}
class AnnoProc extends JavacTestingAbstractProcessor {
Checker checker;
AnnoProc(DocTrees trees) {
checker = new Checker(trees);
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element e : roundEnv.getRootElements()) {
checker.scan(checker.trees.getPath(e), null);
}
return true;
}
}
class TaskListnr implements TaskListener {
Checker checker;
TaskListnr(DocTrees trees) {
checker = new Checker(trees);
}
public void started(TaskEvent e) {
if (e.getKind() == TaskEvent.Kind.ANALYZE)
checker.scan(new TreePath(e.getCompilationUnit()), null);
}
public void finished(TaskEvent e) {
}
}
class Checker extends TreePathScanner<Void,Void> {
DocTrees trees;
SourcePositions srcPosns;
int docComments = 0;
Checker(DocTrees trees) {
this.trees = trees;
srcPosns = trees.getSourcePositions();
}
@Override
public Void scan(Tree tree, Void ignore) {
if (tree != null) {
switch (tree.getKind()) {
// HACK: Workaround 8007350
// Some tree nodes do not have endpos set
case ASSIGNMENT:
case BLOCK:
case IDENTIFIER:
case METHOD_INVOCATION:
break;
default:
checkEndPos(getCurrentPath().getCompilationUnit(), tree);
}
}
return super.scan(tree, ignore);
}
@Override
public Void visitClass(ClassTree tree, Void ignore) {
checkComment();
return super.visitClass(tree, ignore);
}
@Override
public Void visitMethod(MethodTree tree, Void ignore) {
checkComment();
return super.visitMethod(tree, ignore);
}
@Override
public Void visitVariable(VariableTree tree, Void ignore) {
checkComment();
return super.visitVariable(tree, ignore);
}
void checkComment() {
DocCommentTree dc = trees.getDocCommentTree(getCurrentPath());
if (dc != null) {
out.println("comment: " + dc.toString().replaceAll("\\s+", " "));
docComments++;
}
}
void checkEndPos(CompilationUnitTree unit, Tree tree) {
long sp = srcPosns.getStartPosition(unit, tree);
long ep = srcPosns.getEndPosition(unit, tree);
if (sp >= 0 && ep == Position.NOPOS) {
error("endpos not set for " + tree.getKind()
+ " " + Pretty.toSimpleString(((JCTree) tree))
+", start:" + sp);
}
}
void checkDocComments(int expected) {
if (docComments != expected) {
error("Unexpected number of doc comments received: "
+ docComments + ", expected: " + expected);
}
}
}
}

View File

@ -26,9 +26,6 @@
* @bug 6306137
* @summary JSR 199: encoding option doesn't affect standard file manager
* @author Peter von der Ahé
* @ignore
* Need to make the contentCache in JavacFileManager be aware of changes to the encoding.
* Need to propogate -source (and -encoding?) down to the JavacFileManager
*/
import java.io.File;

View File

@ -23,7 +23,6 @@
/*
* @test
* @ignore awaits for VM support
* @summary check that javac does not generate bridge methods for defaults
*/

View File

@ -23,7 +23,6 @@
/*
* @test
* @ignore investigate as to whether code generation fails
* @bug 8003280
* @summary Add lambda tests
* Compiler crash when local inner class nested inside lambda captures local variables from enclosing scope

View File

@ -23,7 +23,6 @@
/*
* @test
* @ignore investigate as to whether code generation fails
* @bug 8003280
* @summary Add lambda tests
* check that nested inner class in statement lambdas don't get corrupted return statements

File diff suppressed because it is too large Load Diff

View File

@ -41,14 +41,20 @@ import javax.tools.ToolProvider;
*
* If the property is not set the class will use a heuristic to determine the
* maximum number of threads that can be fired to execute a given test.
*
* This code will have to be revisited if jprt starts using concurrency for
* for running jtreg tests.
*/
public abstract class JavacTestingAbstractThreadedTest {
protected static AtomicInteger numberOfThreads = new AtomicInteger();
protected static int getThreadPoolSize() {
Integer testConc = Integer.getInteger("test.concurrency");
if (testConc != null) return testConc;
int cores = Runtime.getRuntime().availableProcessors();
return Math.max(2, Math.min(8, cores / 2));
numberOfThreads.set(Math.max(2, Math.min(8, cores / 2)));
return numberOfThreads.get();
}
protected static void checkAfterExec() throws InterruptedException {
@ -82,11 +88,18 @@ public abstract class JavacTestingAbstractThreadedTest {
} else if (printCheckCount) {
outWriter.println("Total check executed: " + checkCount.get());
}
/*
* This output is for supporting debugging. It does not mean that a given
* test had executed that number of threads concurrently. The value printed
* here is the maximum possible amount.
*/
closePrinters();
if (printAll) {
System.out.println(errSWriter.toString());
System.out.println(outSWriter.toString());
}
System.out.println("Total number of threads in thread pool: " +
numberOfThreads.get());
}
protected static void closePrinters() {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2013, 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,7 @@
/*
* @test
* @bug 6493690
* @bug 6493690 8007490
* @summary javadoc should have a javax.tools.Tool service provider
* @build APITest
* @run main RunTest
@ -31,6 +31,7 @@
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import javax.tools.DocumentationTool;
import javax.tools.ToolProvider;
@ -46,7 +47,7 @@ public class RunTest extends APITest {
* Verify that run method can be invoked.
*/
@Test
public void testRun() throws Exception {
public void testRunOK() throws Exception {
File testSrc = new File(System.getProperty("test.src"));
File srcFile = new File(testSrc, "pkg/C.java");
File outDir = getOutDir();
@ -77,7 +78,7 @@ public class RunTest extends APITest {
* Verify that run method can be invoked.
*/
@Test
public void testRun2() throws Exception {
public void testRunFail() throws Exception {
File outDir = getOutDir();
String badfile = "badfile.java";
String[] args = { "-d", outDir.getPath(), badfile };
@ -100,5 +101,48 @@ public class RunTest extends APITest {
}
}
/**
* Verify that null args are accepted.
*/
@Test
public void testNullArgs() throws Exception {
File testSrc = new File(System.getProperty("test.src"));
File srcFile = new File(testSrc, "pkg/C.java");
File outDir = getOutDir();
String[] args = { "-d", outDir.getPath(), srcFile.getPath() };
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
PrintStream prevStdout = System.out;
System.setOut(new PrintStream(stdout));
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
PrintStream prevStderr = System.err;
System.setErr(new PrintStream(stderr));
int rc ;
try {
DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
rc = tool.run(null, null, null, args);
} finally {
System.setOut(prevStdout);
System.setErr(prevStderr);
}
System.err.println("stdout >>" + stdout.toString() + "<<");
System.err.println("stderr >>" + stderr.toString() + "<<");
if (rc == 0) {
System.err.println("call succeeded");
checkFiles(outDir, standardExpectFiles);
String out = stdout.toString();
for (String f: standardExpectFiles) {
String f1 = f.replace('/', File.separatorChar);
if (f1.endsWith(".html") && !out.contains(f1))
error("expected string not found: " + f1);
}
} else {
error("call failed");
}
}
}