This commit is contained in:
Lana Steuck 2014-04-01 17:25:39 -07:00
commit b683f35613
42 changed files with 992 additions and 116 deletions

View File

@ -74,15 +74,6 @@ public interface ClassDoc extends ProgramElementDoc, Type {
*/
boolean isExternalizable();
/**
* Return true if this class can be used as a target type of a lambda expression
* or method reference.
*
* @return true if this class can be used as a target type of a lambda expression
* or method reference.
*/
boolean isFunctionalInterface();
/**
* Return the serialization methods for this class or
* interface.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2014, 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
@ -29,6 +29,7 @@ import java.util.*;
import com.sun.javadoc.*;
import com.sun.tools.javac.jvm.Profile;
import com.sun.tools.javadoc.RootDocImpl;
import com.sun.tools.doclets.formats.html.markup.*;
import com.sun.tools.doclets.internal.toolkit.*;
import com.sun.tools.doclets.internal.toolkit.builders.*;
@ -528,7 +529,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter
* {@inheritDoc}
*/
public void addFunctionalInterfaceInfo (Content classInfoTree) {
if (classDoc.isFunctionalInterface()) {
if (isFunctionalInterface()) {
Content dt = HtmlTree.DT(getResource("doclet.Functional_Interface"));
Content dl = HtmlTree.DL(dt);
Content dd = new HtmlTree(HtmlTag.DD);
@ -538,6 +539,19 @@ public class ClassWriterImpl extends SubWriterHolderWriter
}
}
public boolean isFunctionalInterface() {
if (configuration.root instanceof RootDocImpl) {
RootDocImpl root = (RootDocImpl) configuration.root;
AnnotationDesc[] annotationDescList = classDoc.annotations();
for (AnnotationDesc annoDesc : annotationDescList) {
if (root.isFunctionalInterface(annoDesc)) {
return true;
}
}
}
return false;
}
/**
* {@inheritDoc}
*/

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2014, 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
@ -1443,7 +1443,8 @@ public class HtmlDocletWriter extends HtmlDocWriter {
}
}
if (configuration.currentcd != containing) {
refMemName = containing.name() + "." + refMemName;
refMemName = (refMem instanceof ConstructorDoc) ?
refMemName : containing.name() + "." + refMemName;
}
if (refMem instanceof ExecutableMemberDoc) {
if (refMemName.indexOf('(') < 0) {

View File

@ -141,6 +141,7 @@ public abstract class Attribute implements AnnotationValue {
* access this attribute.
*/
public final List<Pair<MethodSymbol,Attribute>> values;
public TypeAnnotationPosition position;
private boolean synthesized = false;
@ -154,10 +155,67 @@ public abstract class Attribute implements AnnotationValue {
}
public Compound(Type type,
List<Pair<MethodSymbol,Attribute>> values) {
List<Pair<MethodSymbol,Attribute>> values,
TypeAnnotationPosition position) {
super(type);
this.values = values;
this.position = position;
}
public Compound(Type type,
List<Pair<MethodSymbol,Attribute>> values) {
this(type, values, null);
}
@Override
public TypeAnnotationPosition getPosition() {
if (hasUnknownPosition()) {
if (values.size() != 0) {
Name valueName = values.head.fst.name.table.names.value;
Pair<MethodSymbol, Attribute> res = getElemPair(valueName);
position = res == null ? null : res.snd.getPosition();
}
}
return position;
}
public boolean isContainerTypeCompound() {
if (isSynthesized() && values.size() == 1)
return getFirstEmbeddedTC() != null;
return false;
}
private Compound getFirstEmbeddedTC() {
if (values.size() == 1) {
Pair<MethodSymbol, Attribute> val = values.get(0);
if (val.fst.getSimpleName().contentEquals("value")
&& val.snd instanceof Array) {
Array arr = (Array) val.snd;
if (arr.values.length != 0
&& arr.values[0] instanceof Attribute.TypeCompound)
return (Attribute.TypeCompound) arr.values[0];
}
}
return null;
}
public boolean tryFixPosition() {
if (!isContainerTypeCompound())
return false;
Compound from = getFirstEmbeddedTC();
if (from != null && from.position != null &&
from.position.type != TargetType.UNKNOWN) {
position = from.position;
return true;
}
return false;
}
public boolean hasUnknownPosition() {
return position.type == TargetType.UNKNOWN;
}
public void accept(Visitor v) { v.visitCompound(this); }
/**
@ -215,16 +273,6 @@ public abstract class Attribute implements AnnotationValue {
return (DeclaredType) type;
}
@Override
public TypeAnnotationPosition getPosition() {
if (values.size() != 0) {
Name valueName = values.head.fst.name.table.names.value;
Pair<MethodSymbol, Attribute> res = getElemPair(valueName);
return res == null ? null : res.snd.getPosition();
}
return null;
}
public Map<MethodSymbol, Attribute> getElementValues() {
Map<MethodSymbol, Attribute> valmap = new LinkedHashMap<>();
for (Pair<MethodSymbol, Attribute> value : values)
@ -234,62 +282,15 @@ public abstract class Attribute implements AnnotationValue {
}
public static class TypeCompound extends Compound {
public TypeAnnotationPosition position;
public TypeCompound(Compound compound,
TypeAnnotationPosition position) {
this(compound.type, compound.values, position);
TypeAnnotationPosition position) {
super(compound.type, compound.values, position);
}
public TypeCompound(Type type,
List<Pair<MethodSymbol, Attribute>> values,
TypeAnnotationPosition position) {
super(type, values);
this.position = position;
}
@Override
public TypeAnnotationPosition getPosition() {
if (hasUnknownPosition()) {
position = super.getPosition();
}
return position;
}
public boolean hasUnknownPosition() {
return position.type == TargetType.UNKNOWN;
}
public boolean isContainerTypeCompound() {
if (isSynthesized() && values.size() == 1)
return getFirstEmbeddedTC() != null;
return false;
}
private TypeCompound getFirstEmbeddedTC() {
if (values.size() == 1) {
Pair<MethodSymbol, Attribute> val = values.get(0);
if (val.fst.getSimpleName().contentEquals("value")
&& val.snd instanceof Array) {
Array arr = (Array) val.snd;
if (arr.values.length != 0
&& arr.values[0] instanceof Attribute.TypeCompound)
return (Attribute.TypeCompound) arr.values[0];
}
}
return null;
}
public boolean tryFixPosition() {
if (!isContainerTypeCompound())
return false;
TypeCompound from = getFirstEmbeddedTC();
if (from != null && from.position != null &&
from.position.type != TargetType.UNKNOWN) {
position = from.position;
return true;
}
return false;
List<Pair<MethodSymbol,Attribute>> values,
TypeAnnotationPosition position) {
super(type, values, position);
}
}

View File

@ -219,6 +219,9 @@ public enum Source {
public boolean allowTypeAnnotations() {
return compareTo(JDK1_8) >= 0;
}
public boolean allowAnnotationsAfterTypeParams() {
return compareTo(JDK1_8) >= 0;
}
public boolean allowRepeatedAnnotations() {
return compareTo(JDK1_8) >= 0;
}

View File

@ -1625,7 +1625,7 @@ public class Check {
protection(m.flags()) > protection(other.flags())) {
log.error(TreeInfo.diagnosticPositionFor(m, tree), "override.weaker.access",
cannotOverride(m, other),
other.flags() == 0 ?
(other.flags() & AccessFlags) == 0 ?
"package" :
asFlagSet(other.flags() & AccessFlags));
m.flags_field |= BAD_OVERRIDE;

View File

@ -2919,15 +2919,65 @@ public class Lower extends TreeTranslator {
// constant propagation would require that we take care to
// preserve possible side-effects in the condition expression.
// One common case is equality expressions involving a constant and null.
// Since null is not a constant expression (because null cannot be
// represented in the constant pool), equality checks involving null are
// not captured by Flow.isTrue/isFalse.
// Equality checks involving a constant and null, e.g.
// "" == null
// are safe to simplify as no side-effects can occur.
private boolean isTrue(JCTree exp) {
if (exp.type.isTrue())
return true;
Boolean b = expValue(exp);
return b == null ? false : b;
}
private boolean isFalse(JCTree exp) {
if (exp.type.isFalse())
return true;
Boolean b = expValue(exp);
return b == null ? false : !b;
}
/* look for (in)equality relations involving null.
* return true - if expression is always true
* false - if expression is always false
* null - if expression cannot be eliminated
*/
private Boolean expValue(JCTree exp) {
while (exp.hasTag(PARENS))
exp = ((JCParens)exp).expr;
boolean eq;
switch (exp.getTag()) {
case EQ: eq = true; break;
case NE: eq = false; break;
default:
return null;
}
// we have a JCBinary(EQ|NE)
// check if we have two literals (constants or null)
JCBinary b = (JCBinary)exp;
if (b.lhs.type.hasTag(BOT)) return expValueIsNull(eq, b.rhs);
if (b.rhs.type.hasTag(BOT)) return expValueIsNull(eq, b.lhs);
return null;
}
private Boolean expValueIsNull(boolean eq, JCTree t) {
if (t.type.hasTag(BOT)) return Boolean.valueOf(eq);
if (t.hasTag(LITERAL)) return Boolean.valueOf(!eq);
return null;
}
/** Visitor method for conditional expressions.
*/
@Override
public void visitConditional(JCConditional tree) {
JCTree cond = tree.cond = translate(tree.cond, syms.booleanType);
if (cond.type.isTrue()) {
if (isTrue(cond)) {
result = convert(translate(tree.truepart, tree.type), tree.type);
addPrunedInfo(cond);
} else if (cond.type.isFalse()) {
} else if (isFalse(cond)) {
result = convert(translate(tree.falsepart, tree.type), tree.type);
addPrunedInfo(cond);
} else {
@ -2951,10 +3001,10 @@ public class Lower extends TreeTranslator {
*/
public void visitIf(JCIf tree) {
JCTree cond = tree.cond = translate(tree.cond, syms.booleanType);
if (cond.type.isTrue()) {
if (isTrue(cond)) {
result = translate(tree.thenpart);
addPrunedInfo(cond);
} else if (cond.type.isFalse()) {
} else if (isFalse(cond)) {
if (tree.elsepart != null) {
result = translate(tree.elsepart);
} else {
@ -3333,21 +3383,21 @@ public class Lower extends TreeTranslator {
JCTree lhs = tree.lhs = translate(tree.lhs, formals.head);
switch (tree.getTag()) {
case OR:
if (lhs.type.isTrue()) {
if (isTrue(lhs)) {
result = lhs;
return;
}
if (lhs.type.isFalse()) {
if (isFalse(lhs)) {
result = translate(tree.rhs, formals.tail.head);
return;
}
break;
case AND:
if (lhs.type.isFalse()) {
if (isFalse(lhs)) {
result = lhs;
return;
}
if (lhs.type.isTrue()) {
if (isTrue(lhs)) {
result = translate(tree.rhs, formals.tail.head);
return;
}

View File

@ -2501,6 +2501,8 @@ public class ClassReader {
return;
} catch (IOException ex) {
throw badClassFile("unable.to.access.file", ex.getMessage());
} catch (ArrayIndexOutOfBoundsException ex) {
throw badClassFile("bad.class.file", c.flatname);
} finally {
currentClassFile = previousClassFile;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2014, 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
@ -506,6 +506,11 @@ public class Main {
}
}
if (options.get(XSTDOUT) != null) {
// Stdout reassigned - ask compiler to close it when it is done
comp.closeables = comp.closeables.prepend(log.getWriter(WriterKind.NOTICE));
}
fileManager = context.get(JavaFileManager.class);
if (!files.isEmpty()) {

View File

@ -399,7 +399,6 @@ public enum Option {
public boolean process(OptionHelper helper, String option, String arg) {
try {
Log log = helper.getLog();
// TODO: this file should be closed at the end of compilation
log.setWriters(new PrintWriter(new FileWriter(arg), true));
} catch (java.io.IOException e) {
helper.error("err.error.writing.file", arg, e);

View File

@ -161,6 +161,7 @@ public class JavacParser implements Parser {
this.allowStaticInterfaceMethods = source.allowStaticInterfaceMethods();
this.allowIntersectionTypesInCast = source.allowIntersectionTypesInCast();
this.allowTypeAnnotations = source.allowTypeAnnotations();
this.allowAnnotationsAfterTypeParams = source.allowAnnotationsAfterTypeParams();
this.keepDocComments = keepDocComments;
docComments = newDocCommentTable(keepDocComments, fac);
this.keepLineMap = keepLineMap;
@ -254,6 +255,10 @@ public class JavacParser implements Parser {
*/
boolean allowTypeAnnotations;
/** Switch: should we allow annotations after the method type parameters?
*/
boolean allowAnnotationsAfterTypeParams;
/** Switch: is "this" allowed as an identifier?
* This is needed to parse receiver types.
*/
@ -2026,7 +2031,7 @@ public class JavacParser implements Parser {
/** Creator = [Annotations] Qualident [TypeArguments] ( ArrayCreatorRest | ClassCreatorRest )
*/
JCExpression creator(int newpos, List<JCExpression> typeArgs) {
List<JCAnnotation> newAnnotations = annotationsOpt(Tag.ANNOTATION);
List<JCAnnotation> newAnnotations = typeAnnotationsOpt();
switch (token.kind) {
case BYTE: case SHORT: case CHAR: case INT: case LONG: case FLOAT:
@ -3464,6 +3469,7 @@ public class JavacParser implements Parser {
nextToken();
} else {
if (annosAfterParams.nonEmpty()) {
checkAnnotationsAfterTypeParams(annosAfterParams.head.pos);
mods.annotations = mods.annotations.appendList(annosAfterParams);
if (mods.pos == Position.NOPOS)
mods.pos = mods.annotations.head.pos;
@ -4063,6 +4069,12 @@ public class JavacParser implements Parser {
allowTypeAnnotations = true;
}
}
void checkAnnotationsAfterTypeParams(int pos) {
if (!allowAnnotationsAfterTypeParams) {
log.error(pos, "annotations.after.type.params.not.supported.in.source", source.name);
allowAnnotationsAfterTypeParams = true;
}
}
/*
* a functional source tree and end position mappings

View File

@ -761,14 +761,14 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
public Set<TypeElement> visitType(TypeElement e, Set<TypeElement> p) {
// Type parameters are not considered to be enclosed by a type
scan(e.getTypeParameters(), p);
return scan(e.getEnclosedElements(), p);
return super.visitType(e, p);
}
@Override
public Set<TypeElement> visitExecutable(ExecutableElement e, Set<TypeElement> p) {
// Type parameters are not considered to be enclosed by an executable
scan(e.getTypeParameters(), p);
return scan(e.getEnclosedElements(), p);
return super.visitExecutable(e, p);
}
void addAnnotations(Element e, Set<TypeElement> p) {

View File

@ -137,14 +137,14 @@ public class JavacRoundEnvironment implements RoundEnvironment {
public Set<Element> visitType(TypeElement e, TypeElement p) {
// Type parameters are not considered to be enclosed by a type
scan(e.getTypeParameters(), p);
return scan(e.getEnclosedElements(), p);
return super.visitType(e, p);
}
@Override
public Set<Element> visitExecutable(ExecutableElement e, TypeElement p) {
// Type parameters are not considered to be enclosed by an executable
scan(e.getTypeParameters(), p);
return scan(e.getEnclosedElements(), p);
return super.visitExecutable(e, p);
}
@Override

View File

@ -1709,6 +1709,10 @@ compiler.err.cant.access=\
cannot access {0}\n\
{1}
# 0: class name
compiler.misc.bad.class.file=\
class file is invalid for class {0}
# 0: file name, 1: message segment
compiler.misc.bad.class.file.header=\
bad class file: {0}\n\
@ -2320,6 +2324,11 @@ compiler.err.type.annotations.not.supported.in.source=\
type annotations are not supported in -source {0}\n\
(use -source 8 or higher to enable type annotations)
# 0: string
compiler.err.annotations.after.type.params.not.supported.in.source=\
annotations after method type parameters are not supported in -source {0}\n\
(use -source 8 or higher to enable annotations after method type parameters)
# 0: string
compiler.err.repeatable.annotations.not.supported.in.source=\
repeated annotations are not supported in -source {0}\n\

View File

@ -288,10 +288,6 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc {
return false;
}
public boolean isFunctionalInterface() {
return env.types.isFunctionalInterface(tsym) && env.source.allowLambda();
}
/**
* Return the package that this class is contained in.
*/

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2014, 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
@ -381,6 +381,11 @@ public class RootDocImpl extends DocImpl implements RootDoc {
env.initDoclint(opts, customTagNames);
}
public boolean isFunctionalInterface(AnnotationDesc annotationDesc) {
return annotationDesc.annotationType().qualifiedName().equals(
env.syms.functionalInterfaceType.toString()) && env.source.allowLambda();
}
public boolean showTagMessages() {
return env.showTagMessages();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2014, 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
@ -398,7 +398,8 @@ class SeeTagImpl extends TagImpl implements SeeTag, LayoutCharacters {
private MemberDoc findExecutableMember(String memName, String[] paramarr,
ClassDoc referencedClass) {
if (memName.equals(referencedClass.name())) {
String className = referencedClass.name();
if (memName.equals(className.substring(className.lastIndexOf(".") + 1))) {
return ((ClassDocImpl)referencedClass).findConstructor(memName,
paramarr);
} else { // it's a method.

View File

@ -202,7 +202,6 @@ public class ClassWriter extends BasicWriter {
if (options.verbose) {
println();
indent(+1);
attrWriter.write(cf, cf.attributes, constant_pool);
println("minor version: " + cf.minor_version);
println("major version: " + cf.major_version);
writeList("flags: ", flags.getClassFlags(), "\n");
@ -218,6 +217,10 @@ public class ClassWriter extends BasicWriter {
writeMethods();
indent(-1);
println("}");
if (options.verbose) {
attrWriter.write(cf, cf.attributes, constant_pool);
}
}
// where
class JavaTypePrinter implements Type.Visitor<StringBuilder,StringBuilder> {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2014, 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 8025524
* @bug 8025524 8031625
* @summary Test for constructor name which should be a non-qualified name.
* @author Bhavesh Patel
* @library ../lib/
@ -37,6 +37,21 @@ public class TestConstructors extends JavadocTester {
//Input for string search tests.
private static final String[][] TEST = {
{BUG_ID + FS + "pkg1" + FS + "Outer.html",
"<dt><span class=\"seeLabel\">See Also:</span></dt>" + NL +
"<dd><a href=\"../pkg1/Outer.Inner.html#Inner--\"><code>Inner()</code></a>, " + NL +
"<a href=\"../pkg1/Outer.Inner.html#Inner-int-\"><code>Inner(int)</code></a>, " + NL +
"<a href=\"../pkg1/Outer.Inner.NestedInner.html#NestedInner--\"><code>NestedInner()</code></a>, " + NL +
"<a href=\"../pkg1/Outer.Inner.NestedInner.html#NestedInner-int-\"><code>NestedInner(int)</code></a>, " + NL +
"<a href=\"../pkg1/Outer.html#Outer--\"><code>Outer()</code></a>, " + NL +
"<a href=\"../pkg1/Outer.html#Outer-int-\"><code>Outer(int)</code></a>"
},
{BUG_ID + FS + "pkg1" + FS + "Outer.html",
"Link: <a href=\"../pkg1/Outer.Inner.html#Inner--\"><code>Inner()</code></a>, " +
"<a href=\"../pkg1/Outer.html#Outer-int-\"><code>Outer(int)</code></a>, " +
"<a href=\"../pkg1/Outer.Inner.NestedInner.html#NestedInner-int-\"><code>" +
"NestedInner(int)</code></a>"
},
{BUG_ID + FS + "pkg1" + FS + "Outer.html",
"<a href=\"../pkg1/Outer.html#Outer--\">Outer</a></span>()"
},
@ -87,6 +102,18 @@ public class TestConstructors extends JavadocTester {
},
{BUG_ID + FS + "pkg1" + FS + "Outer.Inner.NestedInner.html",
"Outer.Inner.NestedInner-int-"
},
{BUG_ID + FS + "pkg1" + FS + "Outer.html",
"<a href=\"../pkg1/Outer.Inner.html#Outer.Inner--\"><code>Outer.Inner()</code></a>"
},
{BUG_ID + FS + "pkg1" + FS + "Outer.html",
"<a href=\"../pkg1/Outer.Inner.html#Outer.Inner-int-\"><code>Outer.Inner(int)</code></a>"
},
{BUG_ID + FS + "pkg1" + FS + "Outer.html",
"<a href=\"../pkg1/Outer.Inner.NestedInner.html#Outer.Inner.NestedInner--\"><code>Outer.Inner.NestedInner()</code></a>"
},
{BUG_ID + FS + "pkg1" + FS + "Outer.html",
"<a href=\"../pkg1/Outer.Inner.NestedInner.html#Outer.Inner.NestedInner-int-\"><code>Outer.Inner.NestedInner(int)</code></a>"
}
};

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2014, 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,6 +23,17 @@
package pkg1;
/**
* Test link tag.
* Link: {@link pkg1.Outer.Inner#Inner()}, {@link pkg1.Outer#Outer(int)}, {@link pkg1.Outer.Inner.NestedInner#NestedInner(int)}
*
* @see Outer.Inner#Inner()
* @see Outer.Inner#Inner(int)
* @see Outer.Inner.NestedInner#NestedInner()
* @see Outer.Inner.NestedInner#NestedInner(int)
* @see Outer#Outer()
* @see Outer#Outer(int)
*/
public class Outer {
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2014, 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 8004893 8022738
* @bug 8004893 8022738 8029143
* @summary Make sure that the lambda feature changes work fine in
* javadoc.
* @author bpatel
@ -87,6 +87,11 @@ public class TestLambdaFeature extends JavadocTester {
"<pre>default&nbsp;default&nbsp;void&nbsp;defaultMethod()</pre>"},
{BUG_ID + FS + "pkg" + FS + "B.html",
"<td class=\"colFirst\"><code>default void</code></td>"},
{BUG_ID + FS + "pkg1" + FS + "NotAFuncInf.html",
"<dl>" + NL + "<dt>Functional Interface:</dt>" + NL +
"<dd>This is a functional interface and can therefore be used as " +
"the assignment target for a lambda expression or method " +
"reference.</dd>" + NL + "</dl>"},
{BUG_ID + FS + "pkg" + FS + "B.html",
"<dl>" + NL + "<dt>Functional Interface:</dt>"}
};

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2014, 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,6 +23,7 @@
package pkg;
@FunctionalInterface
public interface A {
public void method1();

View File

@ -23,6 +23,7 @@
package pkg1;
@FunctionalInterface
public interface FuncInf<V> {
V call() throws Exception;

View File

@ -0,0 +1,29 @@
/*
* Copyright (c) 2014, 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.
*/
package pkg1;
public interface NotAFuncInf<V> {
V call() throws Exception;
}

View File

@ -0,0 +1,86 @@
/*
* Copyright (c) 2014, 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 8025505
* @summary Constant folding deficiency
* @library /tools/javac/lib
* @build ToolBox
* @run main ConstFoldTest
*/
import java.net.URL;
import java.util.List;
public class ConstFoldTest {
public static void main(String... args) throws Exception {
new ConstFoldTest().run();
}
// This is the test case. This class should end up
// as straight-line code with no conditionals
class CFTest {
void m() {
int x;
if (1 != 2) x=1; else x=0;
if (1 == 2) x=1; else x=0;
if ("" != null) x=1; else x=0;
if ("" == null) x=1; else x=0;
if (null == null) x=1; else x=0;
if (null != null) x=1; else x=0;
x = 1 != 2 ? 1 : 0;
x = 1 == 2 ? 1 : 0;
x = "" != null ? 1 : 0;
x = "" == null ? 1 : 0;
x = null == null ? 1 : 0;
x = null != null ? 1 : 0;
boolean b;
b = 1 != 2 && true;
b = 1 == 2 || true;
b = ("" != null) && true;
b = ("" == null) || true;
b = (null == null) && true;
b = (null != null) || true;
}
}
// All of the conditionals above should be eliminated.
// these if* bytecodes should not be seen
final String regex = "\\sif(?:null|nonnull|eq|ne){1}\\s";
void run() throws Exception {
URL url = ConstFoldTest.class.getResource("ConstFoldTest$CFTest.class");
String result = ToolBox.javap(new ToolBox.JavaToolArgs().setAllArgs("-c", url.getFile()));
System.out.println(result);
List<String> bad_codes = ToolBox.grep(regex, result, "\n");
if (!bad_codes.isEmpty()) {
for (String code : bad_codes)
System.out.println("Bad OpCode Found: " + code);
throw new Exception("constant folding failed");
}
}
}

View File

@ -0,0 +1,16 @@
/*
* @test /nodynamiccopyright/
* @bug 8035956
* @summary javac, incomplete error message
* @author kizune
*
* @run compile/fail/ref=IncompleteMessageOverride.out -XDrawDiagnostics IncompleteMessageOverride.java
*/
class Super {
static void m() {}
}
class Sub extends Super {
private static void m() {}
}

View File

@ -0,0 +1,2 @@
IncompleteMessageOverride.java:15:25: compiler.err.override.weaker.access: (compiler.misc.cant.override: m(), Sub, m(), Super), package
1 error

View File

@ -0,0 +1,90 @@
/*
* Copyright (c) 2014, 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 7118295
* @summary javac does not explicitly close -Xstdout file
* @run main StdoutCloseTest
*/
import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.main.Main;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class StdoutCloseTest {
public static void main(String[] args) throws Exception {
new StdoutCloseTest().test();
}
static final String program = "public class Test {\n" +
" public boolean test() {\n" +
" int i;\n" +
" if (i > 0) return true;\n" +
" return false;\n" +
" }\n" +
"}\n";
public void test() throws Exception {
final String sourceName = "Test.java";
final String outName = "Test.out";
File source = new File(sourceName);
PrintWriter pw = new PrintWriter(source);
pw.write(program);
pw.flush();
pw.close();
PrintWriter log = compileClass(sourceName, outName);
File outFile = new File(outName);
if (!outFile.exists()) {
throw new Exception("Output file was not created!");
}
if (!log.checkError()) { // will return true if the stream is still open
log.close(); // Close output PrintWriter manually
throw new Exception("Output file was still open!");
}
}
public PrintWriter compileClass(String src, String out) {
List<String> options = new ArrayList<>();
options.add("-Xstdout");
options.add(out);
options.add(src);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
Main compiler = new Main("javac", pw);
compiler.compile(options.toArray(new String[options.size()]));
pw.flush();
if (sw.getBuffer().length() > 0) {
System.err.println(sw.toString());
}
return compiler.log.getWriter(Log.WriterKind.NOTICE);
}
}

View File

@ -6,6 +6,7 @@ CantAnnotateScoping.java:47:18: compiler.err.cant.type.annotate.scoping.1: @TA
CantAnnotateScoping.java:56:37: compiler.err.cant.type.annotate.scoping: @TA,@TA2
CantAnnotateScoping.java:40:14: compiler.err.cant.type.annotate.scoping.1: @TA
CantAnnotateScoping.java:42:34: compiler.err.cant.type.annotate.scoping: @TA,@DA,@TA2
CantAnnotateScoping.java:42:25: compiler.err.annotation.type.not.applicable
CantAnnotateScoping.java:44:38: compiler.err.cant.type.annotate.scoping: @TA,@DA
CantAnnotateScoping.java:44:34: compiler.err.annotation.type.not.applicable
10 errors
11 errors

View File

@ -0,0 +1,195 @@
/*
* Copyright (c) 2014, 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 8035890
* @summary Verify that the parser correctly checks for source level 8 on the new places where
* annotations can appear in 8.
* @run main CheckErrorsForSource7 CheckErrorsForSource7.java
*/
import java.io.File;
import java.io.IOException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.IdentifierTree;
import com.sun.source.tree.Tree.Kind;
import com.sun.source.util.JavacTask;
import com.sun.source.util.TreePathScanner;
import com.sun.source.util.Trees;
import com.sun.tools.javac.api.JavacTool;
import com.sun.tools.javac.file.JavacFileManager;
/**For each place where an annotation can syntactically appear with -source 8, but not with
* -source 7, this test verifies that an error is correctly emitted from the parser for
* the annotation for -source 7. This test first gathers the occurrences of @TA from
* the CheckErrorsForSource7Data class below, and then repeatedly removes all these annotations
* except one and checks the parser reports an expected error. This is needed as as the parser
* typically produces only one 'insufficient source level' error for each new feature used.
*/
public class CheckErrorsForSource7 {
public static void main(String... args) throws IOException, URISyntaxException {
new CheckErrorsForSource7().run(args);
}
private void run(String... args) throws IOException, URISyntaxException {
//the first and only parameter must be the name of the file to be analyzed:
if (args.length != 1) throw new IllegalStateException("Must provide source file!");
File testSrc = new File(System.getProperty("test.src"));
File testFile = new File(testSrc, args[0]);
if (!testFile.canRead()) throw new IllegalStateException("Cannot read the test source");
JavacFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
//gather spans of the @TA annotations into typeAnnotationSpans:
JavacTask task = JavacTool.create().getTask(null,
fm,
null,
Collections.<String>emptyList(),
null,
fm.getJavaFileObjects(testFile));
final Trees trees = Trees.instance(task);
final CompilationUnitTree cut = task.parse().iterator().next();
final List<int[]> typeAnnotationSpans = new ArrayList<>();
new TreePathScanner<Void, Void>() {
@Override
public Void visitAnnotation(AnnotationTree node, Void p) {
if (node.getAnnotationType().getKind() == Kind.IDENTIFIER &&
((IdentifierTree) node.getAnnotationType()).getName().contentEquals("TA")) {
int start = (int) trees.getSourcePositions().getStartPosition(cut, node);
int end = (int) trees.getSourcePositions().getEndPosition(cut, node);
typeAnnotationSpans.add(new int[] {start, end});
}
return null;
}
}.scan(cut, null);
//sort the spans in the reverse order, to simplify removing them from the source:
Collections.sort(typeAnnotationSpans, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o2[0] - o1[0];
}
});
//verify the errors are produce correctly:
String originalSource = cut.getSourceFile().getCharContent(false).toString();
for (int[] toKeep : typeAnnotationSpans) {
//prepare updated source code by removing all the annotations except the toKeep one:
String updated = originalSource;
for (int[] span : typeAnnotationSpans) {
if (span == toKeep) continue;
updated = updated.substring(0, span[0]) + updated.substring(span[1]);
}
//parse and verify:
JavaFileObject updatedFile = new TestFO(cut.getSourceFile().toUri(), updated);
DiagnosticCollector<JavaFileObject> errors = new DiagnosticCollector<>();
JavacTask task2 = JavacTool.create().getTask(null,
fm,
errors,
Arrays.asList("-source", "7"),
null,
Arrays.asList(updatedFile));
task2.parse();
boolean found = false;
for (Diagnostic<? extends JavaFileObject> d : errors.getDiagnostics()) {
if (d.getKind() == Diagnostic.Kind.ERROR && EXPECTED_ERRORS.contains(d.getCode())) {
if (found) {
throw new IllegalStateException("More than one expected error found.");
}
found = true;
}
}
if (!found)
throw new IllegalStateException("Did not produce proper errors for: " + updated);
}
}
static final Set<String> EXPECTED_ERRORS = new HashSet<>(Arrays.asList(
"compiler.err.type.annotations.not.supported.in.source",
"compiler.err.annotations.after.type.params.not.supported.in.source"
));
class TestFO extends SimpleJavaFileObject {
private final String content;
public TestFO(URI uri, String content) {
super(uri, Kind.SOURCE);
this.content = content;
}
@Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return content;
}
@Override public boolean isNameCompatible(String simpleName, Kind kind) {
return true;
}
}
}
//data on which the source level check is verified:
class CheckErrorsForSource7Data {
@Target(ElementType.TYPE_USE)
@interface TA { }
Object n1 = new @TA ArrayList<@TA String>();
Object n2 = new @TA Object() {};
Object [] @TA [] arr @TA[];
<T> @TA int @TA[] ret(Object obj) @TA[] throws @TA Exception {
this.<@TA String>ret(null);
Object c1 = new @TA String[1];
int val = obj instanceof @TA String ? ((@TA String) obj).length() : 0;
List<@TA ?> l;
return null;
}
void vararg(String @TA ... args) { }
abstract class C<@TA T extends @TA Number & @TA Runnable>
extends @TA ArrayList<@TA String>
implements java.util. @TA Comparator<@TA T> { }
interface I extends java.util. @TA Comparator<@TA String> { }
}

View File

@ -1,5 +1,5 @@
DeclarationAnnotation.java:13:21: compiler.err.annotation.type.not.applicable
DeclarationAnnotation.java:10:21: compiler.err.annotation.type.not.applicable
DeclarationAnnotation.java:11:21: compiler.err.annotation.type.not.applicable
DeclarationAnnotation.java:12:21: compiler.err.annotation.type.not.applicable
DeclarationAnnotation.java:13:21: compiler.err.annotation.type.not.applicable
4 errors

View File

@ -0,0 +1,76 @@
/*
* Copyright (c) 2014, 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 6898851
* @summary Compiling against this corrupt class file causes a stacktrace from javac
*/
import java.io.File;
import java.io.FileWriter;
import java.io.StringWriter;
import java.io.PrintWriter;
import java.io.IOException;
import com.sun.tools.classfile.ClassFile;
import com.sun.tools.classfile.ClassWriter;
import com.sun.tools.javac.Main;
public class BadClass {
// Create and compile file containing body; return compiler output
static String makeClass(String dir, String filename, String body) throws IOException {
File file = new File(dir, filename);
try (FileWriter fw = new FileWriter(file)) {
fw.write(body);
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
String args[] = { "-cp", dir, "-d", dir, "-XDrawDiagnostics", file.getPath() };
Main.compile(args, pw);
pw.close();
return sw.toString();
}
public static void main(String... args) throws Exception {
new File("d1").mkdir();
new File("d2").mkdir();
// Step 1. build an empty class with an interface
makeClass("d1", "Empty.java", "abstract class Empty implements Readable {}");
// Step 2. Modify classfile to have invalid constant pool index
ClassFile cf = ClassFile.read(new File("d1","Empty.class"));
cf.interfaces[0] = cf.constant_pool.size() + 10;
ClassWriter cw = new ClassWriter();
cw.write(cf, new File("d2","Empty.class"));
// Step 3. Compile use of invalid class
String result = makeClass("d2", "EmptyUse.java", "class EmptyUse { Empty e; }");
if (!result.contains("compiler.misc.bad.class.file")) {
System.out.println(result);
throw new Exception("test failed");
}
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2014, 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
@ -26,6 +26,7 @@
* @bug 8005166
* @summary Add support for static interface methods
* Smoke test for static interface method hiding
* @run main/timeout=600 InterfaceMethodHidingTest
*/
import com.sun.source.util.JavacTask;

View File

@ -111,3 +111,4 @@ compiler.warn.unknown.enum.constant # in bad class file
compiler.warn.unknown.enum.constant.reason # in bad class file
compiler.warn.override.equals.but.not.hashcode # when a class overrides equals but not hashCode method from Object
compiler.warn.file.from.future # warning for future modification times on files
compiler.misc.bad.class.file # class file is malformed

View File

@ -0,0 +1,34 @@
/*
* Copyright (c) 2014, 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.
*/
// key: compiler.err.annotations.after.type.params.not.supported.in.source
// key: compiler.warn.source.no.bootclasspath
// options: -source 7
@interface Anno { }
class AnnotationsAfterTypeParamsNotSupportedInSource {
<T> @Anno int m() {
return 0;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2014, 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
@ -30,7 +30,7 @@
* @author Maurizio Cimadamore
* @library ../lib
* @build JavacTestingAbstractThreadedTest
* @run main/othervm FunctionalInterfaceConversionTest
* @run main/timeout=600/othervm FunctionalInterfaceConversionTest
*/
// use /othervm to avoid jtreg timeout issues (CODETOOLS-7900047)

View File

@ -0,0 +1,78 @@
/*
* Copyright (c) 2014, 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 8038080
* @summary make sure that all declaration annotations are discovered
* by the processing environment
* @library /tools/javac/lib
* @build JavacTestingAbstractProcessor ProcessingEnvAnnoDiscovery
* @compile/process -processor ProcessingEnvAnnoDiscovery ProcessingEnvAnnoDiscovery.java
*/
import java.lang.annotation.*;
import java.util.Set;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import com.sun.tools.javac.util.*;
@ProcessingEnvAnnoDiscovery.Anno1
public class ProcessingEnvAnnoDiscovery<@ProcessingEnvAnnoDiscovery.Anno4 T>
extends JavacTestingAbstractProcessor {
private int round = 0;
public boolean process(Set<? extends TypeElement> annos, RoundEnvironment rEnv) {
if (round++ == 0) {
System.out.println(annos);
Assert.check(annos.contains(eltUtils.getTypeElement("java.lang.annotation.Target")));
Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno1")));
Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno2")));
Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno3")));
Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno4")));
Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno5")));
Assert.check(annos.size() == 6, "Found extra annotations"); //Anno1-5 + @Target
}
return true;
}
@Anno2
public <@Anno5 K> K m(@Anno3 long foo) {
return null;
}
@interface Anno1 {}
@interface Anno2 {}
@interface Anno3 {}
@Target(ElementType.TYPE_PARAMETER)
@interface Anno4 {}
@Target(ElementType.TYPE_PARAMETER)
@interface Anno5 {}
}

View File

@ -0,0 +1,28 @@
/*
* Copyright (c) 2014, 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.
*/
import java.lang.annotation.*;
import static java.lang.annotation.RetentionPolicy.*;
@Retention(RUNTIME)
public @interface Anno {}

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2014, 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.
*/
/**
* Class to hold annotations for ElementsAnnotatedWithTest.
*/
@AnnotatedElementInfo(annotationName="Anno",
expectedSize=1,
names={"annotatedParameter"})
public class ParameterAnnotations {
private void foo(@Anno Object annotatedParameter) {}
}

View File

@ -23,7 +23,7 @@
/*
* @test
* @bug 6397298 6400986 6425592 6449798 6453386 6508401 6498938 6911854 8030049
* @bug 6397298 6400986 6425592 6449798 6453386 6508401 6498938 6911854 8030049 8038080
* @summary Tests that getElementsAnnotatedWith works properly.
* @author Joseph D. Darcy
* @library /tools/javac/lib
@ -31,12 +31,14 @@
* @compile TestElementsAnnotatedWith.java
* @compile InheritedAnnotation.java
* @compile TpAnno.java
* @compile Anno.java
* @compile -processor TestElementsAnnotatedWith -proc:only SurfaceAnnotations.java
* @compile -processor TestElementsAnnotatedWith -proc:only BuriedAnnotations.java
* @compile -processor TestElementsAnnotatedWith -proc:only Part1.java Part2.java
* @compile -processor TestElementsAnnotatedWith -proc:only C2.java
* @compile -processor TestElementsAnnotatedWith -proc:only Foo.java
* @compile -processor TestElementsAnnotatedWith -proc:only TypeParameterAnnotations.java
* @compile -processor TestElementsAnnotatedWith -proc:only ParameterAnnotations.java
* @compile/fail/ref=ErroneousAnnotations.out -processor TestElementsAnnotatedWith -proc:only -XDrawDiagnostics ErroneousAnnotations.java
* @compile Foo.java
* @compile/process -processor TestElementsAnnotatedWith -proc:only Foo

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2014, 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
@ -40,10 +40,10 @@ public class T4975569
verify("T4975569$Anno", "flags: ACC_INTERFACE, ACC_ABSTRACT, ACC_ANNOTATION");
verify("T4975569$E", "flags: ACC_FINAL, ACC_SUPER, ACC_ENUM");
verify("T4975569$S", "flags: ACC_BRIDGE, ACC_SYNTHETIC",
"InnerClasses:\n static");
"InnerClasses:\n static");
verify("T4975569$V", "void m(java.lang.String...)",
"flags: ACC_VARARGS");
verify("T4975569$Prot", "InnerClasses:\n protected");
verify("T4975569$Prot", "InnerClasses:\n protected");
//verify("T4975569$Priv", "InnerClasses");
if (errors > 0)
throw new Error(errors + " found.");

View File

@ -0,0 +1,67 @@
/*
* Copyright (c) 2014, 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 8035104
* @summary reorder class file attributes in javap listing
*/
import java.io.*;
public class T8035104 {
public static void main(String[] args) throws Exception {
new T8035104().run();
}
public void run() throws Exception {
String[] lines = javap("-v", T8035104.class.getName()).split("[\r\n]+");
int minor = -1;
int SourceFile = -1;
for (int i = 0; i < lines.length; i++) {
String line = lines[i];
if (line.matches(" *minor version: [0-9.]+"))
minor = i;
if (line.matches(" *SourceFile: .+"))
SourceFile = i;
}
if (minor == -1)
throw new Exception("minor version not found");
if (SourceFile == -1)
throw new Exception("SourceFile not found");
if (SourceFile < minor)
throw new Exception("unexpected order of output");
System.out.println("output OK");
}
String javap(String... args) {
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
int rc = com.sun.tools.javap.Main.run(args, out);
out.close();
System.out.println(sw.toString());
System.out.println("javap exited, rc=" + rc);
return sw.toString();
}
}