Merge
This commit is contained in:
commit
34a831bf70
@ -128,7 +128,7 @@ public class ClassFinder {
|
||||
* the completer to be used for ".java" files. If this remains unassigned
|
||||
* ".java" files will not be loaded.
|
||||
*/
|
||||
public Completer sourceCompleter = null;
|
||||
public Completer sourceCompleter = Completer.NULL_COMPLETER;
|
||||
|
||||
/** The path name of the class file currently being read.
|
||||
*/
|
||||
@ -341,7 +341,7 @@ public class ClassFinder {
|
||||
reader.readClassFile(c);
|
||||
c.flags_field |= getSupplementaryFlags(c);
|
||||
} else {
|
||||
if (sourceCompleter != null) {
|
||||
if (!sourceCompleter.isTerminal()) {
|
||||
sourceCompleter.complete(c);
|
||||
} else {
|
||||
throw new IllegalStateException("Source completer required to read "
|
||||
@ -392,7 +392,7 @@ public class ClassFinder {
|
||||
public ClassSymbol loadClass(Name flatname) throws CompletionFailure {
|
||||
boolean absent = syms.classes.get(flatname) == null;
|
||||
ClassSymbol c = syms.enterClass(flatname);
|
||||
if (c.members_field == null && c.completer != null) {
|
||||
if (c.members_field == null) {
|
||||
try {
|
||||
c.complete();
|
||||
} catch (CompletionFailure ex) {
|
||||
|
@ -96,6 +96,7 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
public Symbol owner;
|
||||
|
||||
/** The completer of this symbol.
|
||||
* This should never equal null (NULL_COMPLETER should be used instead).
|
||||
*/
|
||||
public Completer completer;
|
||||
|
||||
@ -193,6 +194,10 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
return (metadata != null && !metadata.isTypesEmpty());
|
||||
}
|
||||
|
||||
public boolean isCompleted() {
|
||||
return completer.isTerminal();
|
||||
}
|
||||
|
||||
public void prependAttributes(List<Attribute.Compound> l) {
|
||||
if (l.nonEmpty()) {
|
||||
initedMetadata().prepend(l);
|
||||
@ -243,7 +248,7 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
this.flags_field = flags;
|
||||
this.type = type;
|
||||
this.owner = owner;
|
||||
this.completer = null;
|
||||
this.completer = Completer.NULL_COMPLETER;
|
||||
this.erasure_field = null;
|
||||
this.name = name;
|
||||
}
|
||||
@ -568,9 +573,9 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
/** Complete the elaboration of this symbol's definition.
|
||||
*/
|
||||
public void complete() throws CompletionFailure {
|
||||
if (completer != null) {
|
||||
if (completer != Completer.NULL_COMPLETER) {
|
||||
Completer c = completer;
|
||||
completer = null;
|
||||
completer = Completer.NULL_COMPLETER;
|
||||
c.complete(this);
|
||||
}
|
||||
}
|
||||
@ -872,19 +877,19 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
}
|
||||
|
||||
public WriteableScope members() {
|
||||
if (completer != null) complete();
|
||||
complete();
|
||||
return members_field;
|
||||
}
|
||||
|
||||
public long flags() {
|
||||
if (completer != null) complete();
|
||||
complete();
|
||||
return flags_field;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Attribute.Compound> getRawAttributes() {
|
||||
if (completer != null) complete();
|
||||
if (package_info != null && package_info.completer != null) {
|
||||
complete();
|
||||
if (package_info != null) {
|
||||
package_info.complete();
|
||||
mergeAttributes();
|
||||
}
|
||||
@ -1000,24 +1005,24 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
}
|
||||
|
||||
public long flags() {
|
||||
if (completer != null) complete();
|
||||
complete();
|
||||
return flags_field;
|
||||
}
|
||||
|
||||
public WriteableScope members() {
|
||||
if (completer != null) complete();
|
||||
complete();
|
||||
return members_field;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Attribute.Compound> getRawAttributes() {
|
||||
if (completer != null) complete();
|
||||
complete();
|
||||
return super.getRawAttributes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Attribute.TypeCompound> getRawTypeAttributes() {
|
||||
if (completer != null) complete();
|
||||
complete();
|
||||
return super.getRawTypeAttributes();
|
||||
}
|
||||
|
||||
@ -1782,7 +1787,29 @@ public abstract class Symbol extends AnnoConstruct implements Element {
|
||||
/** Symbol completer interface.
|
||||
*/
|
||||
public static interface Completer {
|
||||
|
||||
/** Dummy completer to be used when the symbol has been completed or
|
||||
* does not need completion.
|
||||
*/
|
||||
public final static Completer NULL_COMPLETER = new Completer() {
|
||||
public void complete(Symbol sym) { }
|
||||
public boolean isTerminal() { return true; }
|
||||
};
|
||||
|
||||
void complete(Symbol sym) throws CompletionFailure;
|
||||
|
||||
/** Returns true if this completer is <em>terminal</em>. A terminal
|
||||
* completer is used as a place holder when the symbol is completed.
|
||||
* Calling complete on a terminal completer will not affect the symbol.
|
||||
*
|
||||
* The dummy NULL_COMPLETER and the GraphDependencies completer are
|
||||
* examples of terminal completers.
|
||||
*
|
||||
* @return true iff this completer is terminal
|
||||
*/
|
||||
default boolean isTerminal() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static class CompletionFailure extends RuntimeException {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2015, 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
|
||||
@ -259,49 +259,54 @@ public class Symtab {
|
||||
|
||||
public void synthesizeEmptyInterfaceIfMissing(final Type type) {
|
||||
final Completer completer = type.tsym.completer;
|
||||
if (completer != null) {
|
||||
type.tsym.completer = new Completer() {
|
||||
public void complete(Symbol sym) throws CompletionFailure {
|
||||
try {
|
||||
completer.complete(sym);
|
||||
} catch (CompletionFailure e) {
|
||||
sym.flags_field |= (PUBLIC | INTERFACE);
|
||||
((ClassType) sym.type).supertype_field = objectType;
|
||||
}
|
||||
type.tsym.completer = new Completer() {
|
||||
public void complete(Symbol sym) throws CompletionFailure {
|
||||
try {
|
||||
completer.complete(sym);
|
||||
} catch (CompletionFailure e) {
|
||||
sym.flags_field |= (PUBLIC | INTERFACE);
|
||||
((ClassType) sym.type).supertype_field = objectType;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTerminal() {
|
||||
return completer.isTerminal();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public void synthesizeBoxTypeIfMissing(final Type type) {
|
||||
ClassSymbol sym = enterClass(boxedName[type.getTag().ordinal()]);
|
||||
final Completer completer = sym.completer;
|
||||
if (completer != null) {
|
||||
sym.completer = new Completer() {
|
||||
public void complete(Symbol sym) throws CompletionFailure {
|
||||
try {
|
||||
completer.complete(sym);
|
||||
} catch (CompletionFailure e) {
|
||||
sym.flags_field |= PUBLIC;
|
||||
((ClassType) sym.type).supertype_field = objectType;
|
||||
MethodSymbol boxMethod =
|
||||
new MethodSymbol(PUBLIC | STATIC, names.valueOf,
|
||||
new MethodType(List.of(type), sym.type,
|
||||
List.<Type>nil(), methodClass),
|
||||
sym);
|
||||
sym.members().enter(boxMethod);
|
||||
MethodSymbol unboxMethod =
|
||||
new MethodSymbol(PUBLIC,
|
||||
type.tsym.name.append(names.Value), // x.intValue()
|
||||
new MethodType(List.<Type>nil(), type,
|
||||
List.<Type>nil(), methodClass),
|
||||
sym);
|
||||
sym.members().enter(unboxMethod);
|
||||
}
|
||||
sym.completer = new Completer() {
|
||||
public void complete(Symbol sym) throws CompletionFailure {
|
||||
try {
|
||||
completer.complete(sym);
|
||||
} catch (CompletionFailure e) {
|
||||
sym.flags_field |= PUBLIC;
|
||||
((ClassType) sym.type).supertype_field = objectType;
|
||||
MethodSymbol boxMethod =
|
||||
new MethodSymbol(PUBLIC | STATIC, names.valueOf,
|
||||
new MethodType(List.of(type), sym.type,
|
||||
List.<Type>nil(), methodClass),
|
||||
sym);
|
||||
sym.members().enter(boxMethod);
|
||||
MethodSymbol unboxMethod =
|
||||
new MethodSymbol(PUBLIC,
|
||||
type.tsym.name.append(names.Value), // x.intValue()
|
||||
new MethodType(List.<Type>nil(), type,
|
||||
List.<Type>nil(), methodClass),
|
||||
sym);
|
||||
sym.members().enter(unboxMethod);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTerminal() {
|
||||
return completer.isTerminal();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Enter a synthetic class that is used to mark classes in ct.sym.
|
||||
@ -309,7 +314,7 @@ public class Symtab {
|
||||
private Type enterSyntheticAnnotation(String name) {
|
||||
ClassType type = (ClassType)enterClass(name);
|
||||
ClassSymbol sym = (ClassSymbol)type.tsym;
|
||||
sym.completer = null;
|
||||
sym.completer = Completer.NULL_COMPLETER;
|
||||
sym.flags_field = PUBLIC|ACYCLIC|ANNOTATION|INTERFACE;
|
||||
sym.erasure_field = type;
|
||||
sym.members_field = WriteableScope.create(sym);
|
||||
|
@ -580,12 +580,10 @@ public abstract class Type extends AnnoConstruct implements TypeMirror {
|
||||
}
|
||||
|
||||
public boolean isCompound() {
|
||||
return tsym.completer == null
|
||||
// Compound types can't have a completer. Calling
|
||||
// flags() will complete the symbol causing the
|
||||
// compiler to load classes unnecessarily. This led
|
||||
// to regression 6180021.
|
||||
&& (tsym.flags() & COMPOUND) != 0;
|
||||
// Compound types can't have a (non-terminal) completer. Calling
|
||||
// flags() will complete the symbol causing the compiler to load
|
||||
// classes unnecessarily. This led to regression 6180021.
|
||||
return tsym.isCompleted() && (tsym.flags() & COMPOUND) != 0;
|
||||
}
|
||||
|
||||
public boolean isIntersection() {
|
||||
@ -1124,7 +1122,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror {
|
||||
}
|
||||
|
||||
public void complete() {
|
||||
if (tsym.completer != null) tsym.complete();
|
||||
tsym.complete();
|
||||
}
|
||||
|
||||
@DefinedBy(Api.LANGUAGE_MODEL)
|
||||
@ -1212,7 +1210,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror {
|
||||
Assert.check((csym.flags() & COMPOUND) != 0);
|
||||
supertype_field = bounds.head;
|
||||
interfaces_field = bounds.tail;
|
||||
Assert.check(supertype_field.tsym.completer != null ||
|
||||
Assert.check(!supertype_field.tsym.isCompleted() ||
|
||||
!supertype_field.isInterface(), supertype_field);
|
||||
}
|
||||
|
||||
|
@ -28,11 +28,11 @@ package com.sun.tools.javac.code;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.ElementKind;
|
||||
import javax.lang.model.type.TypeKind;
|
||||
|
||||
import javax.tools.JavaFileObject;
|
||||
|
||||
import com.sun.tools.javac.code.Attribute.Array;
|
||||
import com.sun.tools.javac.code.Attribute.TypeCompound;
|
||||
import com.sun.tools.javac.code.Symbol.TypeSymbol;
|
||||
import com.sun.tools.javac.code.Type.ArrayType;
|
||||
import com.sun.tools.javac.code.Type.CapturedType;
|
||||
import com.sun.tools.javac.code.Type.ClassType;
|
||||
@ -153,8 +153,8 @@ public class TypeAnnotations {
|
||||
|
||||
public enum AnnotationType { DECLARATION, TYPE, NONE, BOTH }
|
||||
|
||||
public List<Attribute> annotationTargets(Attribute.Compound anno) {
|
||||
Attribute.Compound atTarget = anno.type.tsym.getAnnotationTypeMetadata().getTarget();
|
||||
public List<Attribute> annotationTargets(TypeSymbol tsym) {
|
||||
Attribute.Compound atTarget = tsym.getAnnotationTypeMetadata().getTarget();
|
||||
if (atTarget == null) {
|
||||
return null;
|
||||
}
|
||||
@ -177,7 +177,7 @@ public class TypeAnnotations {
|
||||
* a type annotation, or both.
|
||||
*/
|
||||
public AnnotationType annotationTargetType(Attribute.Compound a, Symbol s) {
|
||||
List<Attribute> targets = annotationTargets(a);
|
||||
List<Attribute> targets = annotationTargets(a.type.tsym);
|
||||
return (targets == null) ?
|
||||
AnnotationType.DECLARATION :
|
||||
targets.stream()
|
||||
|
@ -645,7 +645,7 @@ public class Types {
|
||||
Symbol descSym = findDescriptorSymbol(targets.head.tsym);
|
||||
Type descType = findDescriptorType(targets.head);
|
||||
ClassSymbol csym = new ClassSymbol(cflags, name, env.enclClass.sym.outermostClass());
|
||||
csym.completer = null;
|
||||
csym.completer = Completer.NULL_COMPLETER;
|
||||
csym.members_field = WriteableScope.create(csym);
|
||||
MethodSymbol instDescSym = new MethodSymbol(descSym.flags(), descSym.name, descType, csym);
|
||||
csym.members_field.enter(instDescSym);
|
||||
|
@ -243,7 +243,10 @@ public class Annotate {
|
||||
log.error(annotations.head.pos, "already.annotated", Kinds.kindName(s), s);
|
||||
|
||||
Assert.checkNonNull(s, "Symbol argument to actualEnterAnnotations is null");
|
||||
annotateNow(s, annotations, localEnv, false);
|
||||
|
||||
// false is passed as fifth parameter since annotateLater is
|
||||
// never called for a type parameter
|
||||
annotateNow(s, annotations, localEnv, false, false);
|
||||
} finally {
|
||||
if (prevLint != null)
|
||||
chk.setLint(prevLint);
|
||||
@ -327,7 +330,8 @@ public class Annotate {
|
||||
* then continue on with repeating annotations processing.
|
||||
*/
|
||||
private <T extends Attribute.Compound> void annotateNow(Symbol toAnnotate,
|
||||
List<JCAnnotation> withAnnotations, Env<AttrContext> env, boolean typeAnnotations)
|
||||
List<JCAnnotation> withAnnotations, Env<AttrContext> env, boolean typeAnnotations,
|
||||
boolean isTypeParam)
|
||||
{
|
||||
Map<TypeSymbol, ListBuffer<T>> annotated = new LinkedHashMap<>();
|
||||
Map<T, DiagnosticPosition> pos = new HashMap<>();
|
||||
@ -377,7 +381,7 @@ public class Annotate {
|
||||
buf = buf.prepend(lb.first());
|
||||
} else {
|
||||
AnnotationContext<T> ctx = new AnnotationContext<>(env, annotated, pos, typeAnnotations);
|
||||
T res = makeContainerAnnotation(lb.toList(), ctx, toAnnotate);
|
||||
T res = makeContainerAnnotation(lb.toList(), ctx, toAnnotate, isTypeParam);
|
||||
if (res != null)
|
||||
buf = buf.prepend(res);
|
||||
}
|
||||
@ -698,7 +702,7 @@ public class Annotate {
|
||||
* annotation are invalid. This method reports errors/warnings.
|
||||
*/
|
||||
private <T extends Attribute.Compound> T processRepeatedAnnotations(List<T> annotations,
|
||||
AnnotationContext<T> ctx, Symbol on)
|
||||
AnnotationContext<T> ctx, Symbol on, boolean isTypeParam)
|
||||
{
|
||||
T firstOccurrence = annotations.head;
|
||||
List<Attribute> repeated = List.nil();
|
||||
@ -752,7 +756,8 @@ public class Annotate {
|
||||
|
||||
if (!repeated.isEmpty()) {
|
||||
repeated = repeated.reverse();
|
||||
TreeMaker m = make.at(ctx.pos.get(firstOccurrence));
|
||||
DiagnosticPosition pos = ctx.pos.get(firstOccurrence);
|
||||
TreeMaker m = make.at(pos);
|
||||
Pair<MethodSymbol, Attribute> p =
|
||||
new Pair<MethodSymbol, Attribute>(containerValueSymbol,
|
||||
new Attribute.Array(arrayOfOrigAnnoType, repeated));
|
||||
@ -768,7 +773,14 @@ public class Annotate {
|
||||
Attribute.TypeCompound at = new Attribute.TypeCompound(targetContainerType, List.of(p),
|
||||
((Attribute.TypeCompound)annotations.head).position);
|
||||
|
||||
// TODO: annotation applicability checks from below?
|
||||
JCAnnotation annoTree = m.TypeAnnotation(at);
|
||||
if (!chk.validateAnnotationDeferErrors(annoTree))
|
||||
log.error(annoTree.pos(), Errors.DuplicateAnnotationInvalidRepeated(origAnnoType));
|
||||
|
||||
if (!chk.isTypeAnnotation(annoTree, isTypeParam)) {
|
||||
log.error(pos, isTypeParam ? Errors.InvalidRepeatableAnnotationNotApplicable(targetContainerType, on)
|
||||
: Errors.InvalidRepeatableAnnotationNotApplicableInContext(targetContainerType));
|
||||
}
|
||||
|
||||
at.setSynthesized(true);
|
||||
|
||||
@ -925,11 +937,11 @@ public class Annotate {
|
||||
}
|
||||
|
||||
private <T extends Attribute.Compound> T makeContainerAnnotation(List<T> toBeReplaced,
|
||||
AnnotationContext<T> ctx, Symbol sym)
|
||||
AnnotationContext<T> ctx, Symbol sym, boolean isTypeParam)
|
||||
{
|
||||
// Process repeated annotations
|
||||
T validRepeated =
|
||||
processRepeatedAnnotations(toBeReplaced, ctx, sym);
|
||||
processRepeatedAnnotations(toBeReplaced, ctx, sym, isTypeParam);
|
||||
|
||||
if (validRepeated != null) {
|
||||
// Check that the container isn't manually
|
||||
@ -955,7 +967,7 @@ public class Annotate {
|
||||
* Attribute the list of annotations and enter them onto s.
|
||||
*/
|
||||
public void enterTypeAnnotations(List<JCAnnotation> annotations, Env<AttrContext> env,
|
||||
Symbol s, DiagnosticPosition deferPos)
|
||||
Symbol s, DiagnosticPosition deferPos, boolean isTypeParam)
|
||||
{
|
||||
Assert.checkNonNull(s, "Symbol argument to actualEnterTypeAnnotations is nul/");
|
||||
JavaFileObject prev = log.useSource(env.toplevel.sourcefile);
|
||||
@ -965,7 +977,7 @@ public class Annotate {
|
||||
prevLintPos = deferredLintHandler.setPos(deferPos);
|
||||
}
|
||||
try {
|
||||
annotateNow(s, annotations, env, true);
|
||||
annotateNow(s, annotations, env, true, isTypeParam);
|
||||
} finally {
|
||||
if (prevLintPos != null)
|
||||
deferredLintHandler.setPos(prevLintPos);
|
||||
@ -1048,21 +1060,21 @@ public class Annotate {
|
||||
|
||||
@Override
|
||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
||||
enterTypeAnnotations(tree.annotations, env, sym, deferPos);
|
||||
enterTypeAnnotations(tree.annotations, env, sym, deferPos, false);
|
||||
scan(tree.underlyingType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTypeParameter(JCTypeParameter tree) {
|
||||
enterTypeAnnotations(tree.annotations, env, sym, deferPos);
|
||||
enterTypeAnnotations(tree.annotations, env, sym, deferPos, true);
|
||||
scan(tree.bounds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitNewArray(JCNewArray tree) {
|
||||
enterTypeAnnotations(tree.annotations, env, sym, deferPos);
|
||||
enterTypeAnnotations(tree.annotations, env, sym, deferPos, false);
|
||||
for (List<JCAnnotation> dimAnnos : tree.dimAnnotations)
|
||||
enterTypeAnnotations(dimAnnos, env, sym, deferPos);
|
||||
enterTypeAnnotations(dimAnnos, env, sym, deferPos, false);
|
||||
scan(tree.elemtype);
|
||||
scan(tree.elems);
|
||||
}
|
||||
@ -1241,7 +1253,7 @@ public class Annotate {
|
||||
|
||||
private void init() {
|
||||
// Make sure metaDataFor is member entered
|
||||
while (metaDataFor.completer != null)
|
||||
while (!metaDataFor.isCompleted())
|
||||
metaDataFor.complete();
|
||||
|
||||
if (annotationTypeCompleter != null) {
|
||||
|
@ -2425,6 +2425,11 @@ public class Attr extends JCTree.Visitor {
|
||||
resultInfo.checkContext.report(that, cause);
|
||||
result = that.type = types.createErrorType(pt());
|
||||
return;
|
||||
} catch (Throwable t) {
|
||||
//when an unexpected exception happens, avoid attempts to attribute the same tree again
|
||||
//as that would likely cause the same exception again.
|
||||
needsRecovery = false;
|
||||
throw t;
|
||||
} finally {
|
||||
localEnv.info.scope.leave();
|
||||
if (needsRecovery) {
|
||||
|
@ -2268,7 +2268,7 @@ public class Check {
|
||||
}
|
||||
}
|
||||
if (complete)
|
||||
complete = ((c.flags_field & UNATTRIBUTED) == 0) && c.completer == null;
|
||||
complete = ((c.flags_field & UNATTRIBUTED) == 0) && c.isCompleted();
|
||||
if (complete) c.flags_field |= ACYCLIC;
|
||||
return complete;
|
||||
}
|
||||
@ -2999,7 +2999,7 @@ public class Check {
|
||||
|
||||
/** Is the annotation applicable to types? */
|
||||
protected boolean isTypeAnnotation(JCAnnotation a, boolean isTypeParameter) {
|
||||
List<Attribute> targets = typeAnnotations.annotationTargets(a.attribute);
|
||||
List<Attribute> targets = typeAnnotations.annotationTargets(a.annotationType.type.tsym);
|
||||
return (targets == null) ?
|
||||
false :
|
||||
targets.stream()
|
||||
|
@ -320,7 +320,7 @@ public class Enter extends JCTree.Visitor {
|
||||
ClassSymbol c = syms.enterClass(name, tree.packge);
|
||||
c.flatname = names.fromString(tree.packge + "." + name);
|
||||
c.sourcefile = tree.sourcefile;
|
||||
c.completer = null;
|
||||
c.completer = Completer.NULL_COMPLETER;
|
||||
c.members_field = WriteableScope.create(c);
|
||||
tree.packge.package_info = c;
|
||||
}
|
||||
@ -386,7 +386,7 @@ public class Enter extends JCTree.Visitor {
|
||||
typeEnvs.put(c, localEnv);
|
||||
|
||||
// Fill out class fields.
|
||||
c.completer = null; // do not allow the initial completer linger on.
|
||||
c.completer = Completer.NULL_COMPLETER; // do not allow the initial completer linger on.
|
||||
c.flags_field = chk.checkFlags(tree.pos(), tree.mods.flags, c, tree);
|
||||
c.sourcefile = env.toplevel.sourcefile;
|
||||
c.members_field = WriteableScope.create(c);
|
||||
|
@ -641,7 +641,7 @@ public class Lower extends TreeTranslator {
|
||||
c.flatname = chk.localClassName(c);
|
||||
}
|
||||
c.sourcefile = owner.sourcefile;
|
||||
c.completer = null;
|
||||
c.completer = Completer.NULL_COMPLETER;
|
||||
c.members_field = WriteableScope.create(c);
|
||||
c.flags_field = flags;
|
||||
ClassType ctype = (ClassType) c.type;
|
||||
|
@ -25,6 +25,9 @@
|
||||
|
||||
package com.sun.tools.javac.comp;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.tools.javac.code.*;
|
||||
import com.sun.tools.javac.code.Scope.WriteableScope;
|
||||
import com.sun.tools.javac.tree.*;
|
||||
@ -335,43 +338,49 @@ public class MemberEnter extends JCTree.Visitor {
|
||||
return initTreeVisitor.result;
|
||||
}
|
||||
|
||||
/** Visitor class for expressions which might be constant expressions.
|
||||
/** Visitor class for expressions which might be constant expressions,
|
||||
* as per JLS 15.28 (Constant Expressions).
|
||||
*/
|
||||
static class InitTreeVisitor extends JCTree.Visitor {
|
||||
|
||||
private static final Set<Tag> ALLOWED_OPERATORS =
|
||||
EnumSet.of(Tag.POS, Tag.NEG, Tag.NOT, Tag.COMPL, Tag.PLUS, Tag.MINUS,
|
||||
Tag.MUL, Tag.DIV, Tag.MOD, Tag.SL, Tag.SR, Tag.USR,
|
||||
Tag.LT, Tag.LE, Tag.GT, Tag.GE, Tag.EQ, Tag.NE,
|
||||
Tag.BITAND, Tag.BITXOR, Tag.BITOR, Tag.AND, Tag.OR);
|
||||
|
||||
private boolean result = true;
|
||||
|
||||
@Override
|
||||
public void visitTree(JCTree tree) {}
|
||||
|
||||
@Override
|
||||
public void visitNewClass(JCNewClass that) {
|
||||
public void visitTree(JCTree tree) {
|
||||
result = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitNewArray(JCNewArray that) {
|
||||
result = false;
|
||||
public void visitLiteral(JCLiteral that) {}
|
||||
|
||||
@Override
|
||||
public void visitTypeCast(JCTypeCast tree) {
|
||||
tree.expr.accept(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitLambda(JCLambda that) {
|
||||
result = false;
|
||||
public void visitUnary(JCUnary that) {
|
||||
if (!ALLOWED_OPERATORS.contains(that.getTag())) {
|
||||
result = false;
|
||||
return ;
|
||||
}
|
||||
that.arg.accept(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitReference(JCMemberReference that) {
|
||||
result = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitApply(JCMethodInvocation that) {
|
||||
result = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSelect(JCFieldAccess tree) {
|
||||
tree.selected.accept(this);
|
||||
public void visitBinary(JCBinary that) {
|
||||
if (!ALLOWED_OPERATORS.contains(that.getTag())) {
|
||||
result = false;
|
||||
return ;
|
||||
}
|
||||
that.lhs.accept(this);
|
||||
that.rhs.accept(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -387,8 +396,11 @@ public class MemberEnter extends JCTree.Visitor {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTypeCast(JCTypeCast tree) {
|
||||
tree.expr.accept(this);
|
||||
public void visitIdent(JCIdent that) {}
|
||||
|
||||
@Override
|
||||
public void visitSelect(JCFieldAccess tree) {
|
||||
tree.selected.accept(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -903,7 +903,7 @@ public class TypeEnter implements Completer {
|
||||
memberEnter.memberEnter(tree.defs, env);
|
||||
|
||||
if (tree.sym.isAnnotationType()) {
|
||||
Assert.checkNull(tree.sym.completer);
|
||||
Assert.check(tree.sym.isCompleted());
|
||||
tree.sym.setAnnotationTypeMetadata(new AnnotationTypeMetadata(tree.sym, annotate.annotationTypeSourceCompleter()));
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2015, 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
|
||||
@ -1092,7 +1092,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
|
||||
if (cs.classfile != null || cs.kind == ERR) {
|
||||
cs.reset();
|
||||
cs.type = new ClassType(cs.type.getEnclosingType(), null, cs);
|
||||
if (cs.completer == null) {
|
||||
if (cs.isCompleted()) {
|
||||
cs.completer = initialCompleter;
|
||||
}
|
||||
}
|
||||
|
@ -414,6 +414,10 @@ compiler.err.invalid.repeatable.annotation.repeated.and.container.present=\
|
||||
compiler.err.invalid.repeatable.annotation.not.applicable=\
|
||||
container {0} is not applicable to element {1}
|
||||
|
||||
# 0: type
|
||||
compiler.err.invalid.repeatable.annotation.not.applicable.in.context=\
|
||||
container {0} is not applicable in this type context
|
||||
|
||||
# 0: name
|
||||
compiler.err.duplicate.class=\
|
||||
duplicate class: {0}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2015, 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
|
||||
@ -468,6 +468,11 @@ public abstract class Dependencies {
|
||||
sym.completer = this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTerminal() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This visitor is used to generate the special side-effect dependencies
|
||||
* given a graph containing only standard dependencies.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2015, 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
|
||||
@ -796,9 +796,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc {
|
||||
}
|
||||
|
||||
// make sure that this symbol has been completed
|
||||
if (tsym.completer != null) {
|
||||
tsym.complete();
|
||||
}
|
||||
tsym.complete();
|
||||
|
||||
// search imports
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2015, 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,6 +40,7 @@ import javax.tools.StandardJavaFileManager;
|
||||
import javax.tools.StandardLocation;
|
||||
|
||||
import com.sun.tools.javac.code.ClassFinder;
|
||||
import com.sun.tools.javac.code.Symbol.Completer;
|
||||
import com.sun.tools.javac.code.Symbol.CompletionFailure;
|
||||
import com.sun.tools.javac.comp.Enter;
|
||||
import com.sun.tools.javac.tree.JCTree;
|
||||
@ -141,7 +142,7 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler {
|
||||
docenv.docClasses = docClasses;
|
||||
docenv.legacyDoclet = legacyDoclet;
|
||||
|
||||
javadocFinder.sourceCompleter = docClasses ? null : sourceCompleter;
|
||||
javadocFinder.sourceCompleter = docClasses ? Completer.NULL_COMPLETER : sourceCompleter;
|
||||
|
||||
ListBuffer<String> names = new ListBuffer<>();
|
||||
ListBuffer<JCCompilationUnit> classTrees = new ListBuffer<>();
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2005, 2015, 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
|
||||
@ -49,9 +49,9 @@ set -u
|
||||
#----------------------------------------------------------------
|
||||
Cleanup() {
|
||||
Sys rm -rf GooSrc GooJar GooZip GooClass
|
||||
Sys rm -rf SpeSrc SpeJar SpeZip SpeClass
|
||||
Sys rm -rf SpeSrc SpeJar SpeZip SpeClass
|
||||
Sys rm -rf BadSrc BadJar BadZip BadClass
|
||||
Sys rm -rf JarNClass StarJar MixJar StarDir
|
||||
Sys rm -rf JarNClass StarJar MixJar StarDir
|
||||
Sys rm -rf OneDir *.class Main*.java MANIFEST.MF
|
||||
}
|
||||
|
||||
@ -127,11 +127,9 @@ starDir() {
|
||||
printf "Running tests with directory named \"*\"\n"
|
||||
Sys rm -rf ./StarDir
|
||||
Sys mkdir -p StarDir/"*"
|
||||
Sys cp -p "GooClass/Lib3.class" "GooClass/Lib.class" ./
|
||||
Sys cp "GooClass/Lib2.class" "StarDir/*/Lib2.class"
|
||||
Sys "$jar" cf "StarDir/Lib3.jar" "Lib3.class"
|
||||
Sys "$jar" cf "StarDir/*/Lib.jar" "Lib.class"
|
||||
Sys rm -f "./Lib.class" "./Lib3.class"
|
||||
Sys "$jar" cf "StarDir/Lib3.jar" -C GooClass "Lib3.class"
|
||||
Sys "$jar" cf "StarDir/*/Lib.jar" -C GooClass "Lib.class"
|
||||
CheckFiles "StarDir/*/Lib.jar" "StarDir/*/Lib2.class" "StarDir/Lib3.jar"
|
||||
Sys cp Main6.java ./StarDir/.
|
||||
Sys cp Main.java ./StarDir/"*"/.
|
||||
|
@ -0,0 +1,21 @@
|
||||
/**
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8044196
|
||||
* @summary Ensure that containers with target FIELD can't be applied to type parameters.
|
||||
* @compile/fail/ref=InvalidClsTypeParamTarget.out -XDrawDiagnostics InvalidClsTypeParamTarget.java
|
||||
*/
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
class InvalidClsTypeParamTarget {
|
||||
|
||||
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE, ElementType.FIELD})
|
||||
@Repeatable(TC.class)
|
||||
@interface T { int value(); }
|
||||
|
||||
@Target(ElementType.FIELD)
|
||||
@interface TC { T[] value(); }
|
||||
|
||||
class Test<@T(1) @T(2) N> {
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
InvalidClsTypeParamTarget.java:19:16: compiler.err.invalid.repeatable.annotation.not.applicable: InvalidClsTypeParamTarget.TC, InvalidClsTypeParamTarget.Test
|
||||
1 error
|
@ -0,0 +1,20 @@
|
||||
/**
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8044196
|
||||
* @summary Ensure that containers with target METHOD can't be applied to type parameters.
|
||||
* @compile/fail/ref=InvalidMethodTypeParamTarget.out -XDrawDiagnostics InvalidMethodTypeParamTarget.java
|
||||
*/
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
class InvalidMethodTypeParamTarget {
|
||||
|
||||
@Target({ElementType.TYPE_PARAMETER, ElementType.METHOD})
|
||||
@Repeatable(TC.class)
|
||||
@interface T { int value(); }
|
||||
|
||||
@Target(ElementType.METHOD)
|
||||
@interface TC { T[] value(); }
|
||||
|
||||
public <@T(1) @T(2) N> void method() { }
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
InvalidMethodTypeParamTarget.java:19:13: compiler.err.invalid.repeatable.annotation.not.applicable: InvalidMethodTypeParamTarget.TC, <N>method()
|
||||
1 error
|
@ -0,0 +1,24 @@
|
||||
/**
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8044196
|
||||
* @summary Make sure repeatable annotations can't be erroneously applied to type arguments.
|
||||
* @compile/fail/ref=InvalidMethodTypeUse.out -XDrawDiagnostics InvalidMethodTypeUse.java
|
||||
*/
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
class InvalidMethodTypeUse {
|
||||
|
||||
@Target({ElementType.TYPE_USE, ElementType.METHOD, ElementType.TYPE_PARAMETER})
|
||||
@Repeatable(TC.class)
|
||||
@interface T { int value(); }
|
||||
|
||||
@Target({ElementType.METHOD, ElementType.TYPE_PARAMETER})
|
||||
@interface TC { T[] value(); }
|
||||
|
||||
void method() {
|
||||
this.<@T(1) @T(2) String>method2();
|
||||
}
|
||||
|
||||
<@T(3) S> void method2() { }
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
InvalidMethodTypeUse.java:20:15: compiler.err.invalid.repeatable.annotation.not.applicable.in.context: InvalidMethodTypeUse.TC
|
||||
1 error
|
@ -0,0 +1,20 @@
|
||||
/**
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8044196
|
||||
* @summary Make sure repeatable annotations can't be erroneously applied to a cast type
|
||||
* @compile/fail/ref=InvalidRepAnnoOnCast.out -XDrawDiagnostics InvalidRepAnnoOnCast.java
|
||||
*/
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
class InvalidRepAnnoOnCast {
|
||||
|
||||
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
|
||||
@Repeatable(TC.class)
|
||||
@interface T { int value(); }
|
||||
|
||||
@Target(ElementType.TYPE_PARAMETER)
|
||||
@interface TC { T[] value(); }
|
||||
|
||||
String s = (@T(1) @T(2) String) new Object();
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
InvalidRepAnnoOnCast.java:19:17: compiler.err.invalid.repeatable.annotation.not.applicable.in.context: InvalidRepAnnoOnCast.TC
|
||||
1 error
|
@ -0,0 +1,14 @@
|
||||
/**
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8044196
|
||||
* @summary Ensure that a broken type annotation container generates a correct error message.
|
||||
* @compile T.java TC.java
|
||||
* @compile TCBroken.java
|
||||
* @compile/fail/ref=BrokenTypeAnnoContainer.out -XDrawDiagnostics BrokenTypeAnnoContainer.java
|
||||
*/
|
||||
|
||||
class BrokenTypeAnnoContainer {
|
||||
void method() {
|
||||
int ll2 = (@T(1) @T(2) int) 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
BrokenTypeAnnoContainer.java:12:20: compiler.err.duplicate.annotation.invalid.repeated: T
|
||||
1 error
|
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.*;
|
||||
|
||||
@Target(ElementType.TYPE_USE)
|
||||
@Repeatable(TC.class)
|
||||
@interface T { int value(); }
|
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.*;
|
||||
|
||||
@Target(ElementType.TYPE_USE)
|
||||
@interface TC {
|
||||
T[] value();
|
||||
}
|
||||
|
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.*;
|
||||
|
||||
@Target(ElementType.TYPE_USE)
|
||||
@interface TC {
|
||||
T[] value();
|
||||
int foo();
|
||||
}
|
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8044537
|
||||
* @summary Checking ACC_SYNTHETIC flag is generated for access method
|
||||
* generated to access to private methods and fields.
|
||||
* @library /tools/lib /tools/javac/lib ../lib
|
||||
* @build TestBase TestResult InMemoryFileManager ToolBox
|
||||
* @build AccessToPrivateInnerClassMembersTest SyntheticTestDriver ExpectedClass ExpectedClasses
|
||||
* @run main SyntheticTestDriver AccessToPrivateInnerClassMembersTest 1
|
||||
*/
|
||||
|
||||
/**
|
||||
* Access from top level class to inner classes.
|
||||
* Synthetic members:
|
||||
* 1. inner classes for Inner*.
|
||||
* 2. getter/setter for private field var.
|
||||
* 3. access method for private method function().
|
||||
* 4. getter/setter for private field staticVar.
|
||||
* 5. access method for private method staticFunction().
|
||||
* 6. field this in Inner1.
|
||||
* 7. constructor for Inner*.
|
||||
*/
|
||||
@ExpectedClass(className = "AccessToPrivateInnerClassMembersTest",
|
||||
expectedMethods = {"<init>()", "<clinit>()"})
|
||||
@ExpectedClass(className = "AccessToPrivateInnerClassMembersTest$Inner1",
|
||||
expectedMethods = {"<init>(AccessToPrivateInnerClassMembersTest)", "function()"},
|
||||
expectedFields = "var",
|
||||
expectedNumberOfSyntheticMethods = 4,
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
@ExpectedClass(className = "AccessToPrivateInnerClassMembersTest$Inner2",
|
||||
expectedMethods = {"function()", "staticFunction()", "<init>()"},
|
||||
expectedFields = {"staticVar", "var"},
|
||||
expectedNumberOfSyntheticMethods = 7)
|
||||
public class AccessToPrivateInnerClassMembersTest {
|
||||
|
||||
private class Inner1 {
|
||||
private Inner1() {}
|
||||
private int var;
|
||||
private void function() {}
|
||||
}
|
||||
|
||||
{
|
||||
Inner1 inner = new Inner1();
|
||||
inner.var = 0;
|
||||
int i = inner.var;
|
||||
inner.function();
|
||||
}
|
||||
|
||||
private static class Inner2 {
|
||||
private Inner2() {}
|
||||
private int var;
|
||||
private static int staticVar;
|
||||
private void function() {}
|
||||
private static void staticFunction() {}
|
||||
}
|
||||
|
||||
{
|
||||
Inner2 inner = new Inner2();
|
||||
inner.var = 0;
|
||||
int i = inner.var;
|
||||
inner.function();
|
||||
}
|
||||
|
||||
static {
|
||||
Inner2.staticFunction();
|
||||
Inner2.staticVar = 0;
|
||||
int i = Inner2.staticVar;
|
||||
}
|
||||
}
|
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8044537
|
||||
* @summary Checking ACC_SYNTHETIC flag is generated for access method
|
||||
* generated to access to private methods and fields.
|
||||
* @library /tools/lib /tools/javac/lib ../lib
|
||||
* @build TestBase TestResult InMemoryFileManager ToolBox
|
||||
* @build AccessToPrivateSiblingsTest SyntheticTestDriver ExpectedClass ExpectedClasses
|
||||
* @run main SyntheticTestDriver AccessToPrivateSiblingsTest 1
|
||||
*/
|
||||
|
||||
/**
|
||||
* Access from sibling classes to sibling classes.
|
||||
* Synthetic members:
|
||||
* 1. inner classes for Inner*.
|
||||
* 2. getter/setter for private field var.
|
||||
* 3. access method for private method function().
|
||||
* 4. getter/setter for private field staticVar.
|
||||
* 5. access method for private method staticFunction().
|
||||
* 6. field this in Inner1.
|
||||
* 7. constructor for Inner*.
|
||||
*/
|
||||
@ExpectedClass(className = "AccessToPrivateSiblingsTest", expectedMethods = "<init>()")
|
||||
@ExpectedClass(className = "AccessToPrivateSiblingsTest$Inner1",
|
||||
expectedMethods = {"function()", "<init>(AccessToPrivateSiblingsTest)"},
|
||||
expectedFields = "var",
|
||||
expectedNumberOfSyntheticMethods = 4,
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
@ExpectedClass(className = "AccessToPrivateSiblingsTest$Inner2",
|
||||
expectedMethods = "<init>(AccessToPrivateSiblingsTest)",
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
@ExpectedClass(className = "AccessToPrivateSiblingsTest$Inner3",
|
||||
expectedMethods = {"<init>()", "function()", "staticFunction()", "<clinit>()"},
|
||||
expectedFields = {"var", "staticVar"},
|
||||
expectedNumberOfSyntheticMethods = 4)
|
||||
@ExpectedClass(className = "AccessToPrivateSiblingsTest$Inner4",
|
||||
expectedMethods = {"<init>()", "function()", "staticFunction()"},
|
||||
expectedFields = {"var", "staticVar"},
|
||||
expectedNumberOfSyntheticMethods = 4)
|
||||
public class AccessToPrivateSiblingsTest {
|
||||
|
||||
private class Inner1 {
|
||||
private Inner1() {}
|
||||
private int var;
|
||||
private void function() {}
|
||||
|
||||
{
|
||||
Inner3 inner = new Inner3();
|
||||
inner.var = 0;
|
||||
int i = inner.var;
|
||||
inner.function();
|
||||
}
|
||||
}
|
||||
|
||||
private class Inner2 {
|
||||
{
|
||||
Inner1 inner = new Inner1();
|
||||
inner.var = 0;
|
||||
int i = inner.var;
|
||||
inner.function();
|
||||
}
|
||||
}
|
||||
|
||||
private static class Inner3 {
|
||||
private Inner3() {}
|
||||
private int var;
|
||||
private static int staticVar;
|
||||
private void function() {}
|
||||
private static void staticFunction() {}
|
||||
|
||||
static {
|
||||
Inner4 inner = new Inner4();
|
||||
inner.var = 0;
|
||||
int i = inner.var;
|
||||
inner.function();
|
||||
}
|
||||
}
|
||||
|
||||
private static class Inner4 {
|
||||
private Inner4() {}
|
||||
private int var;
|
||||
private static int staticVar;
|
||||
private void function() {}
|
||||
private static void staticFunction() {}
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8044537
|
||||
* @summary Checking ACC_SYNTHETIC flag is generated for assert statement.
|
||||
* @library /tools/lib /tools/javac/lib ../lib
|
||||
* @build TestBase TestResult InMemoryFileManager ToolBox
|
||||
* @build AssertFieldTest SyntheticTestDriver ExpectedClass ExpectedClasses
|
||||
* @run main SyntheticTestDriver AssertFieldTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* Synthetic field for assert.
|
||||
*/
|
||||
@ExpectedClass(className = "AssertFieldTest",
|
||||
expectedMethods = {"<init>()", "function(boolean)", "<clinit>()"},
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
public class AssertFieldTest {
|
||||
|
||||
public void function(boolean flag) {
|
||||
assert flag;
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8044537
|
||||
* @summary Checking ACC_SYNTHETIC flag is generated for bridge method generated for generic method.
|
||||
* @library /tools/lib /tools/javac/lib ../lib
|
||||
* @build TestBase TestResult InMemoryFileManager ToolBox
|
||||
* @build BridgeMethodForGenericMethodTest SyntheticTestDriver ExpectedClass ExpectedClasses
|
||||
* @run main SyntheticTestDriver BridgeMethodForGenericMethodTest
|
||||
*/
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Synthetic method add(Object i) for method add(Integer)
|
||||
*/
|
||||
@ExpectedClass(className = "BridgeMethodForGenericMethodTest",
|
||||
expectedMethods = {"<init>()", "add(java.lang.Integer)"},
|
||||
expectedNumberOfSyntheticMethods = 1)
|
||||
public class BridgeMethodForGenericMethodTest extends ArrayList<Integer> {
|
||||
|
||||
@Override
|
||||
public boolean add(Integer i) {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,122 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8044537
|
||||
* @summary Checking ACC_SYNTHETIC flag is generated for bridge method
|
||||
* generated for lambda expressions and method references.
|
||||
* @library /tools/lib /tools/javac/lib ../lib
|
||||
* @build TestBase TestResult InMemoryFileManager ToolBox
|
||||
* @build BridgeMethodsForLambdaTest SyntheticTestDriver ExpectedClass ExpectedClasses
|
||||
* @run main SyntheticTestDriver BridgeMethodsForLambdaTest 1
|
||||
*/
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
/**
|
||||
* Synthetic members:
|
||||
* 1. inner class for Inner1.
|
||||
* 2. method for () -> {} in Inner1
|
||||
* 3. method for () -> {} in Inner2
|
||||
* 4. method references to private methods.
|
||||
* 5. method for super::function()
|
||||
* 6. method references to private static methods.
|
||||
* 7. access method for private method function().
|
||||
* 8. access method for private static method staticFunction().
|
||||
* 9. method reference to vararg method.
|
||||
* 10. method reference to array's method.
|
||||
* 11. constructors for Inner1 and Inner2.
|
||||
*/
|
||||
@ExpectedClass(className = "BridgeMethodsForLambdaTest",
|
||||
expectedMethods = {"<init>()", "<clinit>()", "function(java.lang.Integer[])"},
|
||||
expectedNumberOfSyntheticMethods = 6)
|
||||
@ExpectedClass(className = "BridgeMethodsForLambdaTest$Inner1",
|
||||
expectedMethods = {"<init>(BridgeMethodsForLambdaTest)", "function()", "run()"},
|
||||
expectedFields = "lambda1",
|
||||
expectedNumberOfSyntheticMethods = 4,
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
@ExpectedClass(className = "BridgeMethodsForLambdaTest$Inner2",
|
||||
expectedMethods = {"<init>()", "staticFunction()"},
|
||||
expectedFields = "lambda1",
|
||||
expectedNumberOfSyntheticMethods = 3)
|
||||
@ExpectedClass(className = "BridgeMethodsForLambdaTest$Inner3",
|
||||
expectedMethods = {"<init>(BridgeMethodsForLambdaTest)", "function()"},
|
||||
expectedNumberOfSyntheticMethods = 1,
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
@ExpectedClass(className = "BridgeMethodsForLambdaTest$Inner4",
|
||||
expectedMethods = {"<init>(BridgeMethodsForLambdaTest)", "function()"},
|
||||
expectedNumberOfSyntheticMethods = 1,
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
public class BridgeMethodsForLambdaTest {
|
||||
|
||||
private class Inner1 implements Runnable {
|
||||
private Inner1() {
|
||||
}
|
||||
private Runnable lambda1 = () -> {
|
||||
};
|
||||
private void function() {
|
||||
}
|
||||
@Override
|
||||
public void run() {
|
||||
}
|
||||
}
|
||||
|
||||
private static class Inner2 {
|
||||
private Runnable lambda1 = () -> {
|
||||
};
|
||||
private static void staticFunction() {
|
||||
}
|
||||
}
|
||||
|
||||
private class Inner3 {
|
||||
public void function() {
|
||||
}
|
||||
}
|
||||
|
||||
private class Inner4 extends Inner3 {
|
||||
@Override
|
||||
public void function() {
|
||||
Runnable r = super::function;
|
||||
}
|
||||
}
|
||||
|
||||
private static int function(Integer...vararg) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
{
|
||||
Inner1 inner = new Inner1();
|
||||
Runnable l1 = inner::function;
|
||||
Runnable l2 = Inner1::new;
|
||||
inner.lambda1 = inner::function;
|
||||
Comparator<Integer> c = BridgeMethodsForLambdaTest::function;
|
||||
IntStream.of(2).mapToObj(int[]::new);
|
||||
}
|
||||
|
||||
static {
|
||||
Inner2 inner = new Inner2();
|
||||
Runnable l1 = Inner2::staticFunction;
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8044537
|
||||
* @summary Checking ACC_SYNTHETIC flag is generated for enum members.
|
||||
* @library /tools/lib /tools/javac/lib ../lib
|
||||
* @build TestBase TestResult InMemoryFileManager ToolBox
|
||||
* @build EnumTest SyntheticTestDriver ExpectedClass ExpectedClasses
|
||||
* @run main SyntheticTestDriver EnumTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* Synthetic members:
|
||||
* 1. field $VALUES.
|
||||
*/
|
||||
@ExpectedClass(className = "EnumTest",
|
||||
expectedMethods = {"values()", "valueOf(java.lang.String)", "<clinit>()", "<init>(java.lang.String, int)"},
|
||||
expectedFields = {"A", "B"},
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
public enum EnumTest {
|
||||
A, B
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.Repeatable;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
@Repeatable(ExpectedClasses.class)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface ExpectedClass {
|
||||
String className();
|
||||
String[] expectedMethods() default {};
|
||||
String[] expectedFields() default {};
|
||||
int expectedNumberOfSyntheticMethods() default 0;
|
||||
int expectedNumberOfSyntheticFields() default 0;
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface ExpectedClasses {
|
||||
ExpectedClass[] value();
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8044537
|
||||
* @summary Checking ACC_SYNTHETIC flag is generated for package-info.
|
||||
* @library /tools/lib /tools/javac/lib ../lib
|
||||
* @build TestBase TestResult InMemoryFileManager ToolBox
|
||||
* @build SyntheticTestDriver ExpectedClass ExpectedClasses
|
||||
* @compile -Xpkginfo:always package_info_test/package-info.java
|
||||
* @run main SyntheticTestDriver package_info_test.package-info 1
|
||||
*/
|
||||
|
||||
public class PackageInfoTest {
|
||||
}
|
@ -0,0 +1,212 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.regex.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.sun.tools.classfile.*;
|
||||
|
||||
/**
|
||||
* The tests work as follows. Firstly, it looks through the test cases
|
||||
* and extracts the appropriate compiled classes. Each test case contains
|
||||
* a set of expected classes, methods and fields. Those class members must not have
|
||||
* the Synthetic attribute, while other found classes, methods and fields must have
|
||||
* the Synthetic attribute if they are not in the set of expected class members.
|
||||
*
|
||||
* Each test executes SyntheticTestDriver specifying the name of test cases and
|
||||
* the number of expected synthetic classes. Each test class is annotated by
|
||||
* annotations which contains non-synthetic class members.
|
||||
*
|
||||
* See the appropriate class for more information about a test case.
|
||||
*/
|
||||
public class SyntheticTestDriver extends TestResult {
|
||||
|
||||
private static final String ACC_SYNTHETIC = "ACC_SYNTHETIC";
|
||||
|
||||
private final String testCaseName;
|
||||
private final Map<String, ClassFile> classes;
|
||||
private final Map<String, ExpectedClass> expectedClasses;
|
||||
|
||||
public static void main(String[] args)
|
||||
throws TestFailedException, ConstantPoolException, IOException, ClassNotFoundException {
|
||||
if (args.length != 1 && args.length != 2) {
|
||||
throw new IllegalArgumentException("Usage: SyntheticTestDriver <class-name> [<number-of-synthetic-classes>]");
|
||||
}
|
||||
int numberOfSyntheticClasses = args.length == 1 ? 0 : Integer.parseInt(args[1]);
|
||||
new SyntheticTestDriver(args[0]).test(numberOfSyntheticClasses);
|
||||
}
|
||||
|
||||
public SyntheticTestDriver(String testCaseName) throws IOException, ConstantPoolException, ClassNotFoundException {
|
||||
Class<?> clazz = Class.forName(testCaseName);
|
||||
this.testCaseName = testCaseName;
|
||||
this.expectedClasses = Stream.of(clazz.getAnnotationsByType(ExpectedClass.class))
|
||||
.collect(Collectors.toMap(ExpectedClass::className, Function.identity()));
|
||||
this.classes = new HashMap<>();
|
||||
Path classDir = getClassDir().toPath();
|
||||
Pattern filePattern = Pattern.compile(Pattern.quote(testCaseName.replace('.', File.separatorChar)) + ".*\\.class");
|
||||
List<Path> paths = Files.walk(classDir)
|
||||
.map(p -> classDir.relativize(p.toAbsolutePath()))
|
||||
.filter(p -> filePattern.matcher(p.toString()).matches())
|
||||
.collect(Collectors.toList());
|
||||
for (Path path : paths) {
|
||||
String className = path.toString().replace(".class", "").replace(File.separatorChar, '.');
|
||||
classes.put(className, readClassFile(classDir.resolve(path).toFile()));
|
||||
}
|
||||
if (classes.isEmpty()) {
|
||||
throw new RuntimeException("Classes have not been found.");
|
||||
}
|
||||
boolean success = classes.entrySet().stream()
|
||||
.allMatch(e -> e.getKey().startsWith(testCaseName));
|
||||
if (!success) {
|
||||
classes.forEach((className, $) -> printf("Found class: %s\n", className));
|
||||
throw new RuntimeException("Found classes are not from the test case : " + testCaseName);
|
||||
}
|
||||
}
|
||||
|
||||
private String getMethodName(ClassFile classFile, Method method)
|
||||
throws ConstantPoolException, Descriptor.InvalidDescriptor {
|
||||
String methodName = method.getName(classFile.constant_pool);
|
||||
String parameters = method.descriptor.getParameterTypes(classFile.constant_pool);
|
||||
return methodName + parameters;
|
||||
}
|
||||
|
||||
public void test(int expectedNumberOfSyntheticClasses) throws TestFailedException {
|
||||
try {
|
||||
addTestCase(testCaseName);
|
||||
Set<String> foundClasses = new HashSet<>();
|
||||
|
||||
int numberOfSyntheticClasses = 0;
|
||||
for (Map.Entry<String, ClassFile> entry : classes.entrySet()) {
|
||||
String className = entry.getKey();
|
||||
ClassFile classFile = entry.getValue();
|
||||
foundClasses.add(className);
|
||||
if (testAttribute(
|
||||
classFile,
|
||||
() -> (Synthetic_attribute) classFile.getAttribute(Attribute.Synthetic),
|
||||
classFile.access_flags::getClassFlags,
|
||||
expectedClasses.keySet(),
|
||||
className,
|
||||
"Testing class " + className)) {
|
||||
++numberOfSyntheticClasses;
|
||||
}
|
||||
ExpectedClass expectedClass = expectedClasses.get(className);
|
||||
Set<String> expectedMethods = expectedClass != null
|
||||
? toSet(expectedClass.expectedMethods())
|
||||
: new HashSet<>();
|
||||
int numberOfSyntheticMethods = 0;
|
||||
Set<String> foundMethods = new HashSet<>();
|
||||
for (Method method : classFile.methods) {
|
||||
String methodName = getMethodName(classFile, method);
|
||||
foundMethods.add(methodName);
|
||||
if (testAttribute(
|
||||
classFile,
|
||||
() -> (Synthetic_attribute) method.attributes.get(Attribute.Synthetic),
|
||||
method.access_flags::getMethodFlags,
|
||||
expectedMethods,
|
||||
methodName,
|
||||
"Testing method " + methodName + " in class "
|
||||
+ className)) {
|
||||
++numberOfSyntheticMethods;
|
||||
}
|
||||
}
|
||||
checkContains(foundMethods, expectedMethods,
|
||||
"Checking that all methods of class " + className
|
||||
+ " without Synthetic attribute have been found");
|
||||
checkEquals(numberOfSyntheticMethods,
|
||||
expectedClass == null ? 0 : expectedClass.expectedNumberOfSyntheticMethods(),
|
||||
"Checking number of synthetic methods in class: " + className);
|
||||
|
||||
Set<String> expectedFields = expectedClass != null
|
||||
? toSet(expectedClass.expectedFields())
|
||||
: new HashSet<>();
|
||||
int numberOfSyntheticFields = 0;
|
||||
Set<String> foundFields = new HashSet<>();
|
||||
for (Field field : classFile.fields) {
|
||||
String fieldName = field.getName(classFile.constant_pool);
|
||||
foundFields.add(fieldName);
|
||||
if (testAttribute(
|
||||
classFile,
|
||||
() -> (Synthetic_attribute) field.attributes.get(Attribute.Synthetic),
|
||||
field.access_flags::getFieldFlags,
|
||||
expectedFields,
|
||||
fieldName,
|
||||
"Testing field " + fieldName + " in class "
|
||||
+ className)) {
|
||||
++numberOfSyntheticFields;
|
||||
}
|
||||
}
|
||||
checkContains(foundFields, expectedFields,
|
||||
"Checking that all fields of class " + className
|
||||
+ " without Synthetic attribute have been found");
|
||||
checkEquals(numberOfSyntheticFields,
|
||||
expectedClass == null ? 0 : expectedClass.expectedNumberOfSyntheticFields(),
|
||||
"Checking number of synthetic fields in class: " + className);
|
||||
}
|
||||
checkContains(foundClasses, expectedClasses.keySet(),
|
||||
"Checking that all classes have been found");
|
||||
checkEquals(numberOfSyntheticClasses, expectedNumberOfSyntheticClasses,
|
||||
"Checking number of synthetic classes");
|
||||
} catch (Exception e) {
|
||||
addFailure(e);
|
||||
} finally {
|
||||
checkStatus();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean testAttribute(ClassFile classFile,
|
||||
Supplier<Synthetic_attribute> getSyntheticAttribute,
|
||||
Supplier<Set<String>> getAccessFlags,
|
||||
Set<String> expectedMembers, String memberName,
|
||||
String info) throws ConstantPoolException {
|
||||
echo(info);
|
||||
String className = classFile.getName();
|
||||
Synthetic_attribute attr = getSyntheticAttribute.get();
|
||||
Set<String> flags = getAccessFlags.get();
|
||||
if (expectedMembers.contains(memberName)) {
|
||||
checkNull(attr, "Member must not have synthetic attribute : "
|
||||
+ memberName);
|
||||
checkFalse(flags.contains(ACC_SYNTHETIC),
|
||||
"Member must not have synthetic flag : " + memberName
|
||||
+ " in class : " + className);
|
||||
return false;
|
||||
} else {
|
||||
return checkNull(attr, "Synthetic attribute should not be generated")
|
||||
&& checkTrue(flags.contains(ACC_SYNTHETIC), "Member must have synthetic flag : "
|
||||
+ memberName + " in class : " + className);
|
||||
}
|
||||
}
|
||||
|
||||
private Set<String> toSet(String[] strings) {
|
||||
HashSet<String> set = new HashSet<>();
|
||||
Collections.addAll(set, strings);
|
||||
return set;
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8044537
|
||||
* @summary Checking ACC_SYNTHETIC flag is generated for "this$0" field.
|
||||
* @library /tools/lib /tools/javac/lib ../lib
|
||||
* @build TestBase TestResult InMemoryFileManager ToolBox
|
||||
* @build ThisFieldTest SyntheticTestDriver ExpectedClass ExpectedClasses
|
||||
* @run main SyntheticTestDriver ThisFieldTest
|
||||
*/
|
||||
|
||||
/**
|
||||
* Synthetic members:
|
||||
* 1. fields this$0 for local and anonymous classes.
|
||||
*/
|
||||
@ExpectedClass(className = "ThisFieldTest",
|
||||
expectedMethods = "<init>()")
|
||||
@ExpectedClass(className = "ThisFieldTest$1Local",
|
||||
expectedMethods = "<init>(ThisFieldTest)",
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
@ExpectedClass(className = "ThisFieldTest$1",
|
||||
expectedMethods = "<init>(ThisFieldTest)",
|
||||
expectedNumberOfSyntheticFields = 1)
|
||||
public class ThisFieldTest {
|
||||
{
|
||||
class Local {
|
||||
}
|
||||
|
||||
new Local() {
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 package_info_test;
|
49
langtools/test/tools/javac/completionDeps/DepsAndAnno.java
Normal file
49
langtools/test/tools/javac/completionDeps/DepsAndAnno.java
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8078600
|
||||
* @summary Make sure -XDcompletionDeps does not cause an infinite loop.
|
||||
* @library /tools/lib
|
||||
* @build ToolBox
|
||||
* @run main/othervm/timeout=10 DepsAndAnno
|
||||
*/
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
public class DepsAndAnno {
|
||||
|
||||
@Target(ElementType.METHOD)
|
||||
@interface Test { }
|
||||
|
||||
public static void main(String[] args) {
|
||||
ToolBox toolBox = new ToolBox();
|
||||
toolBox.new JavacTask(ToolBox.Mode.CMDLINE)
|
||||
.options("-XDcompletionDeps")
|
||||
.outdir(".")
|
||||
.files(ToolBox.testSrc + "/DepsAndAnno.java")
|
||||
.run();
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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.invalid.repeatable.annotation.not.applicable.in.context
|
||||
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Target({ElementType.TYPE_USE, ElementType.METHOD, ElementType.TYPE_PARAMETER})
|
||||
@Repeatable(TC.class)
|
||||
@interface T { int value(); }
|
||||
|
||||
@Target({ElementType.METHOD, ElementType.TYPE_PARAMETER})
|
||||
@interface TC { T[] value(); }
|
||||
|
||||
public class InvalidTypeContextRepeatableAnnotation {
|
||||
void method() {
|
||||
this.<@T(1) @T(2) String>method2();
|
||||
}
|
||||
|
||||
<@T(3) S> void method2() {
|
||||
}
|
||||
}
|
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8077605
|
||||
* @summary Check that when an exception occurs during Attr.visitLambda, an attempt to attribute
|
||||
the lambda again is avoided rather than falling into an infinite recursion.
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import javax.tools.JavaFileObject;
|
||||
import javax.tools.SimpleJavaFileObject;
|
||||
|
||||
import com.sun.tools.javac.api.JavacTaskImpl;
|
||||
import com.sun.tools.javac.api.JavacTool;
|
||||
import com.sun.tools.javac.comp.Attr;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.util.Context;
|
||||
import com.sun.tools.javac.util.Context.Factory;
|
||||
|
||||
public class AvoidInfiniteReattribution {
|
||||
|
||||
public static void main(String... args) throws Exception {
|
||||
new AvoidInfiniteReattribution().run();
|
||||
}
|
||||
|
||||
void run() throws IOException {
|
||||
JavacTool tool = JavacTool.create();
|
||||
JavaSource source = new JavaSource("class Test {" +
|
||||
" I i = STOP -> {};" +
|
||||
" interface I {" +
|
||||
" public void test(int i) {}" +
|
||||
" }" +
|
||||
"}");
|
||||
Context context = new Context();
|
||||
CrashingAttr.preRegister(context);
|
||||
List<JavaSource> inputs = Arrays.asList(source);
|
||||
JavacTaskImpl task =
|
||||
(JavacTaskImpl) tool.getTask(null, null, null, null, null, inputs, context);
|
||||
try {
|
||||
task.analyze(null);
|
||||
throw new AssertionError("Expected exception not seen.");
|
||||
} catch (StopException ex) {
|
||||
//ok
|
||||
}
|
||||
}
|
||||
|
||||
static class CrashingAttr extends Attr {
|
||||
|
||||
static void preRegister(Context context) {
|
||||
context.put(attrKey, (Factory<Attr>) c -> new CrashingAttr(c));
|
||||
}
|
||||
|
||||
CrashingAttr(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override public void visitVarDef(JCVariableDecl tree) {
|
||||
if (tree.name.contentEquals("STOP"))
|
||||
throw new StopException();
|
||||
super.visitVarDef(tree);
|
||||
}
|
||||
}
|
||||
|
||||
static class StopException extends NullPointerException {}
|
||||
|
||||
class JavaSource extends SimpleJavaFileObject {
|
||||
|
||||
String source;
|
||||
|
||||
JavaSource(String source) {
|
||||
super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
|
||||
return source;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
43
langtools/test/tools/javac/lambda/T8077605.java
Normal file
43
langtools/test/tools/javac/lambda/T8077605.java
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8077605
|
||||
* @summary Lambda with parameters in field initializer should not break compilation
|
||||
* (MemberEnter.needsLazyConstValue should detect the initializer cannot be a constant)
|
||||
* @compile T8077605.java
|
||||
*/
|
||||
|
||||
public class T8077605 {
|
||||
static final String C = "" + m(str -> str);
|
||||
|
||||
private static String m(I function) {
|
||||
return null;
|
||||
}
|
||||
|
||||
interface I {
|
||||
public String run(String str);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user