BridgeMethodsForLambdaTest.java revision 3294:9adfb22ff08f
1/*
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 8044537
27 * @summary Checking ACC_SYNTHETIC flag is generated for bridge method
28 *          generated for lambda expressions and method references.
29 * @modules jdk.compiler/com.sun.tools.javac.api
30 *          jdk.compiler/com.sun.tools.javac.file
31 *          jdk.compiler/com.sun.tools.javac.main
32 *          jdk.jdeps/com.sun.tools.classfile
33 *          jdk.jdeps/com.sun.tools.javap
34 * @library /tools/lib /tools/javac/lib ../lib
35 * @build TestBase TestResult InMemoryFileManager ToolBox
36 * @build BridgeMethodsForLambdaTest SyntheticTestDriver ExpectedClass ExpectedClasses
37 * @run main SyntheticTestDriver BridgeMethodsForLambdaTest 1
38 */
39
40import java.util.Comparator;
41import java.util.stream.IntStream;
42
43/**
44 * Synthetic members:
45 * 1. inner class for Inner1.
46 * 2. method for () -> {} in Inner1
47 * 3. method for () -> {} in Inner2
48 * 4. method references to private methods.
49 * 5. method for super::function()
50 * 6. method references to private static methods.
51 * 7. access method for private method function().
52 * 8. access method for private static method staticFunction().
53 * 9. method reference to vararg method.
54 * 10. method reference to array's method.
55 * 11. constructors for Inner1 and Inner2.
56 */
57@ExpectedClass(className = "BridgeMethodsForLambdaTest",
58        expectedMethods = {"<init>()", "<clinit>()", "function(java.lang.Integer[])"},
59        expectedNumberOfSyntheticMethods = 6)
60@ExpectedClass(className = "BridgeMethodsForLambdaTest$Inner1",
61        expectedMethods = {"<init>(BridgeMethodsForLambdaTest)", "function()", "run()"},
62        expectedFields = "lambda1",
63        expectedNumberOfSyntheticMethods = 4,
64        expectedNumberOfSyntheticFields = 1)
65@ExpectedClass(className = "BridgeMethodsForLambdaTest$Inner2",
66        expectedMethods = {"<init>()", "staticFunction()"},
67        expectedFields = "lambda1",
68        expectedNumberOfSyntheticMethods = 3)
69@ExpectedClass(className = "BridgeMethodsForLambdaTest$Inner3",
70        expectedMethods = {"<init>(BridgeMethodsForLambdaTest)", "function()"},
71        expectedNumberOfSyntheticMethods = 1,
72        expectedNumberOfSyntheticFields = 1)
73@ExpectedClass(className = "BridgeMethodsForLambdaTest$Inner4",
74        expectedMethods = {"<init>(BridgeMethodsForLambdaTest)", "function()"},
75        expectedNumberOfSyntheticMethods = 1,
76        expectedNumberOfSyntheticFields = 1)
77public class BridgeMethodsForLambdaTest {
78
79    private class Inner1 implements Runnable {
80        private Inner1() {
81        }
82        private Runnable lambda1 = () -> {
83        };
84        private void function() {
85        }
86        @Override
87        public void run() {
88        }
89    }
90
91    private static class Inner2 {
92        private Runnable lambda1 = () -> {
93        };
94        private static void staticFunction() {
95        }
96    }
97
98    private class Inner3 {
99        public void function() {
100        }
101    }
102
103    private class Inner4 extends Inner3 {
104        @Override
105        public void function() {
106            Runnable r = super::function;
107        }
108    }
109
110    private static int function(Integer...vararg) {
111        return 0;
112    }
113
114    {
115        Inner1 inner = new Inner1();
116        Runnable l1 = inner::function;
117        Runnable l2 = Inner1::new;
118        inner.lambda1 = inner::function;
119        Comparator<Integer> c = BridgeMethodsForLambdaTest::function;
120        IntStream.of(2).mapToObj(int[]::new);
121    }
122
123    static {
124        Inner2 inner = new Inner2();
125        Runnable l1 = Inner2::staticFunction;
126    }
127}
128