blob: 139f08b595b7e98ee2ffacb6eeb3339c9a6e2f44 [file] [log] [blame]
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* 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 8008077 8029721 8042451 8043974
* @summary Test population of reference info for lambda expressions
* javac crash for annotated parameter type of lambda in a field
* @compile -g Driver.java ReferenceInfoUtil.java Lambda.java
* @run main Driver Lambda
* @author Werner Dietl
*/
import static com.sun.tools.classfile.TypeAnnotation.TargetType.*;
public class Lambda {
@TADescription(annotation = "TA", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "TB", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
public String returnMethodRef1() {
return
"class Lambda {" +
" public String getName() { return \"Lambda!\"; }" +
"}" +
"class %TEST_CLASS_NAME% {" +
" java.util.function.Function<Lambda, String> lambda() {" +
" return @TA @TB Lambda::getName;" +
" }" +
"}";
}
@TADescription(annotation = "TA", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "TB", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "TC", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "TD", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1 })
@TADescription(annotation = "TE", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1})
public String returnMethodRef2() {
return
"class Lambda<S, T> {" +
" public String getName() { return \"Lambda!\"; }" +
"}" +
"class %TEST_CLASS_NAME% {" +
" java.util.function.Function<Lambda<Integer, Float>, String> lambda() {" +
" return @TA Lambda<@TB @TC Integer, @TD @TE Float>::getName;" +
" }" +
"}";
}
@TADescription(annotation = "CTA", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "CTB", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "CTC", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1 })
public String returnMethodRef3() {
return
"class Lambda<S, T> {" +
" public String getName() { return \"Lambda!\"; }" +
"}" +
"@Target(ElementType.TYPE_USE)" +
"@interface CTA {" +
" String value();" +
"}" +
"@Target(ElementType.TYPE_USE)" +
"@interface CTB {" +
" int age();" +
"}" +
"@Target(ElementType.TYPE_USE)" +
"@interface CTC {" +
" String name();" +
"}" +
"class %TEST_CLASS_NAME% {" +
" java.util.function.Function<Lambda<Integer, Float>, String> lambda() {" +
" return @CTA(\"x\") Lambda<@CTB(age = 5) Integer, @CTC(name = \"y\") Float>::getName;" +
" }" +
"}";
}
@TADescription(annotation = "TA", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "TB", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
public String returnConstructorRef1() {
return
"class Lambda {" +
" Lambda() { }" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Runnable lambda() {" +
" return @TA @TB Lambda::new;" +
" }" +
"}";
}
@TADescription(annotation = "TA", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "TB", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "TC", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "TD", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1 })
@TADescription(annotation = "TE", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1 })
public String returnConstructorRef2() {
return
"class Lambda<S, T> {" +
" Lambda() { }" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Runnable lambda() {" +
" return @TA Lambda<@TB @TC Integer, @TD @TE Float>::new;" +
" }" +
"}";
}
@TADescription(annotation = "CTA", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "CTB", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "CTC", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1 })
public String returnConstructorRef3() {
return
"class Lambda<S, T> {" +
" Lambda() { }" +
"}" +
"@Target(ElementType.TYPE_USE)" +
"@interface CTA {" +
" String value();" +
"}" +
"@Target(ElementType.TYPE_USE)" +
"@interface CTB {" +
" int age();" +
"}" +
"@Target(ElementType.TYPE_USE)" +
"@interface CTC {" +
" String name();" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Runnable lambda() {" +
" return @CTA(\"x\") Lambda<@CTB(age = 5) Integer, @CTC(name = \"y\") Float>::new;" +
" }" +
"}";
}
@TADescription(annotation = "TA", type = METHOD_REFERENCE_TYPE_ARGUMENT,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 0)
@TADescription(annotation = "TB", type = METHOD_REFERENCE_TYPE_ARGUMENT,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 1)
public String returnMethodRefTA1() {
return
"interface Lambda {" +
" <S, T> void generic(S p1, T p2);" +
"}" +
"class LambdaImpl implements Lambda {" +
" public <S, T> void generic(S p1, T p2) {}" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Lambda lambda(LambdaImpl r) {" +
" return r::<@TA Object, @TB Object>generic;" +
" }" +
"}";
}
@TADescription(annotation = "TA", type = CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 0)
@TADescription(annotation = "TB", type = CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 1)
public String returnConstructorRefTA2() {
return
"interface Lambda {" +
" <S, T> void generic(S p1, T p2);" +
"}" +
"class LambdaImpl implements Lambda {" +
" <S, T> LambdaImpl(S p1, T p2) {}" +
" public <S, T> void generic(S p1, T p2) {}" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Lambda lambda() {" +
" return LambdaImpl::<@TA Object, @TB Object>new;" +
" }" +
"}";
}
@TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
paramIndex = 0)
@TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
paramIndex = 1)
@TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER,
paramIndex = 1, genericLocation = { 3, 0 })
@TADescription(annotation = "TD", type = LOCAL_VARIABLE,
lvarOffset = ReferenceInfoUtil.IGNORE_VALUE,
lvarLength = ReferenceInfoUtil.IGNORE_VALUE,
lvarIndex = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "TE", type = CAST,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 0)
public String returnLambdaExpr1() {
return
"interface LambdaInt {" +
" void lambda(Object p1, List<Object> p2);" +
"}" +
"class %TEST_CLASS_NAME% {" +
" LambdaInt getLambda() {" +
" return (@TA Object x, @TB List<@TC Object> y) -> { @TD Object l = null; System.out.println((@TE Object) l); };" +
" }" +
"}";
}
@TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
paramIndex = 0)
public String lambdaField1() {
return
"class %TEST_CLASS_NAME% {" +
" java.util.function.IntUnaryOperator field = (@TA int y) -> 1;" +
"}";
}
@TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
paramIndex = 0)
public String lambdaField2() {
return
"class %TEST_CLASS_NAME% {" +
" static java.util.function.IntUnaryOperator field = (@TA int y) -> 1;" +
"}";
}
@TADescription(annotation = "RTAs", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
public String returnMethodRefRepeatableAnnotation1() {
return
"class Lambda {" +
" public String getName() { return \"Lambda!\"; }" +
"}" +
"class %TEST_CLASS_NAME% {" +
" java.util.function.Function<Lambda, String> lambda() {" +
" return @RTA @RTA Lambda::getName;" +
" }" +
"}";
}
@TADescription(annotation = "RTAs", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "RTBs", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "RTCs", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "RTDs", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1 })
@TADescription(annotation = "RTEs", type = METHOD_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1})
public String returnMethodRefRepeatableAnnotation2() {
return
"class Lambda<S, T> {" +
" public String getName() { return \"Lambda!\"; }" +
"}" +
"class %TEST_CLASS_NAME% {" +
" java.util.function.Function<Lambda<Integer, Float>, String> lambda() {" +
" return @RTA @RTA Lambda<@RTB @RTB @RTC @RTC Integer, @RTD @RTD @RTE @RTE Float>::getName;" +
" }" +
"}";
}
@TADescription(annotation = "RTAs", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
public String returnConstructorRefRepeatable1() {
return
"class Lambda {" +
" Lambda() { }" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Runnable lambda() {" +
" return @RTA @RTA Lambda::new;" +
" }" +
"}";
}
@TADescription(annotation = "RTAs", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "RTBs", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 0 })
@TADescription(annotation = "RTCs", type = CONSTRUCTOR_REFERENCE,
offset = ReferenceInfoUtil.IGNORE_VALUE,
genericLocation = { 3, 1 })
public String returnConstructorRefRepeatable2() {
return
"class Lambda<S, T> {" +
" Lambda() { }" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Runnable lambda() {" +
" return @RTA @RTA Lambda<@RTB @RTB Integer, @RTC @RTC Float>::new;" +
" }" +
"}";
}
@TADescription(annotation = "RTAs", type = METHOD_REFERENCE_TYPE_ARGUMENT,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 0)
@TADescription(annotation = "RTBs", type = METHOD_REFERENCE_TYPE_ARGUMENT,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 1)
public String returnMethodRefTARepeatableAnnotation1() {
return
"interface Lambda {" +
" <S, T> void generic(S p1, T p2);" +
"}" +
"class LambdaImpl implements Lambda {" +
" public <S, T> void generic(S p1, T p2) {}" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Lambda lambda(LambdaImpl r) {" +
" return r::<@RTA @RTA Object, @RTB @RTB Object>generic;" +
" }" +
"}";
}
@TADescription(annotation = "RTAs", type = CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 0)
@TADescription(annotation = "RTBs", type = CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 1)
public String returnConstructorRefTARepeatableAnnotation2() {
return
"interface Lambda {" +
" <S, T> void generic(S p1, T p2);" +
"}" +
"class LambdaImpl implements Lambda {" +
" <S, T> LambdaImpl(S p1, T p2) {}" +
" public <S, T> void generic(S p1, T p2) {}" +
"}" +
"class %TEST_CLASS_NAME% {" +
" Lambda lambda() {" +
" return LambdaImpl::<@RTA @RTA Object, @RTB @RTB Object>new;" +
" }" +
"}";
}
@TADescription(annotation = "RTAs", type = METHOD_FORMAL_PARAMETER,
paramIndex = 0)
@TADescription(annotation = "RTBs", type = METHOD_FORMAL_PARAMETER,
paramIndex = 1)
@TADescription(annotation = "RTCs", type = METHOD_FORMAL_PARAMETER,
paramIndex = 1, genericLocation = { 3, 0 })
@TADescription(annotation = "RTDs", type = LOCAL_VARIABLE,
lvarOffset = ReferenceInfoUtil.IGNORE_VALUE,
lvarLength = ReferenceInfoUtil.IGNORE_VALUE,
lvarIndex = ReferenceInfoUtil.IGNORE_VALUE)
@TADescription(annotation = "RTEs", type = CAST,
offset = ReferenceInfoUtil.IGNORE_VALUE,
typeIndex = 0)
public String returnLambdaExprRepeatableAnnotation1() {
return
"interface LambdaInt {" +
" void lambda(Object p1, List<Object> p2);" +
"}" +
"class %TEST_CLASS_NAME% {" +
" LambdaInt getLambda() {" +
" return (@RTA @RTA Object x, @RTB @RTB List<@RTC @RTC Object> y) ->" +
" { @RTD @RTD Object l = null; System.out.println((@RTE @RTE Object) l); };" +
" }" +
"}";
}
@TADescription(annotation = "RTAs", type = METHOD_FORMAL_PARAMETER,
paramIndex = 0)
public String lambdaFieldRepeatableAnnotation1() {
return
"class %TEST_CLASS_NAME% {" +
" java.util.function.IntUnaryOperator field = (@RTA @RTA int y) -> 1;" +
"}";
}
@TADescription(annotation = "RTAs", type = METHOD_FORMAL_PARAMETER,
paramIndex = 0)
public String lambdaFieldRepeatableAnnotation2() {
return
"class %TEST_CLASS_NAME% {" +
" static java.util.function.IntUnaryOperator field = (@RTA @RTA int y) -> 1;" +
"}";
}
}