This commit is contained in:
Lana Steuck 2015-04-30 17:21:28 -07:00
commit 34a831bf70
48 changed files with 1480 additions and 124 deletions

View File

@ -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) {

View File

@ -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 {

View File

@ -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);

View File

@ -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);
}

View File

@ -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()

View File

@ -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);

View File

@ -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) {

View File

@ -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) {

View File

@ -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()

View File

@ -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);

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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()));
}
}

View File

@ -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;
}
}

View File

@ -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}

View File

@ -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.

View File

@ -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

View File

@ -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<>();

View File

@ -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/"*"/.

View File

@ -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> {
}
}

View File

@ -0,0 +1,2 @@
InvalidClsTypeParamTarget.java:19:16: compiler.err.invalid.repeatable.annotation.not.applicable: InvalidClsTypeParamTarget.TC, InvalidClsTypeParamTarget.Test
1 error

View File

@ -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() { }
}

View File

@ -0,0 +1,2 @@
InvalidMethodTypeParamTarget.java:19:13: compiler.err.invalid.repeatable.annotation.not.applicable: InvalidMethodTypeParamTarget.TC, <N>method()
1 error

View File

@ -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() { }
}

View File

@ -0,0 +1,2 @@
InvalidMethodTypeUse.java:20:15: compiler.err.invalid.repeatable.annotation.not.applicable.in.context: InvalidMethodTypeUse.TC
1 error

View File

@ -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();
}

View File

@ -0,0 +1,2 @@
InvalidRepAnnoOnCast.java:19:17: compiler.err.invalid.repeatable.annotation.not.applicable.in.context: InvalidRepAnnoOnCast.TC
1 error

View File

@ -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;
}
}

View File

@ -0,0 +1,2 @@
BrokenTypeAnnoContainer.java:12:20: compiler.err.duplicate.annotation.invalid.repeated: T
1 error

View File

@ -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(); }

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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() {}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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
}

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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 {
}

View File

@ -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;
}
}

View File

@ -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() {
};
}
}

View File

@ -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;

View 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();
}
}

View 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.
*/
// 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() {
}
}

View File

@ -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;
}
}
}

View 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);
}
}