1/*
2 * Copyright (c) 2015, 2016, 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 access method
28 *          generated to access to private methods and fields.
29 * @modules jdk.compiler/com.sun.tools.javac.api
30 *          jdk.compiler/com.sun.tools.javac.main
31 *          jdk.jdeps/com.sun.tools.classfile
32 * @library /tools/lib /tools/javac/lib ../lib
33 * @build toolbox.ToolBox InMemoryFileManager TestResult TestBase
34 * @build AccessToPrivateSiblingsTest SyntheticTestDriver ExpectedClass ExpectedClasses
35 * @run main SyntheticTestDriver AccessToPrivateSiblingsTest 1
36 */
37
38/**
39 * Access from sibling classes to sibling classes.
40 * Synthetic members:
41 * 1. inner classes for Inner*.
42 * 2. getter/setter for private field var.
43 * 3. access method for private method function().
44 * 4. getter/setter for private field staticVar.
45 * 5. access method for private method staticFunction().
46 * 6. field this in Inner1.
47 * 7. constructor for Inner*.
48 */
49@ExpectedClass(className = "AccessToPrivateSiblingsTest", expectedMethods = "<init>()")
50@ExpectedClass(className = "AccessToPrivateSiblingsTest$Inner1",
51        expectedMethods = {"function()", "<init>(AccessToPrivateSiblingsTest)"},
52        expectedFields = "var",
53        expectedNumberOfSyntheticMethods = 4,
54        expectedNumberOfSyntheticFields = 1)
55@ExpectedClass(className = "AccessToPrivateSiblingsTest$Inner2",
56        expectedMethods = "<init>(AccessToPrivateSiblingsTest)",
57        expectedNumberOfSyntheticFields = 1)
58@ExpectedClass(className = "AccessToPrivateSiblingsTest$Inner3",
59        expectedMethods = {"<init>()", "function()", "staticFunction()", "<clinit>()"},
60        expectedFields = {"var", "staticVar"},
61        expectedNumberOfSyntheticMethods = 4)
62@ExpectedClass(className = "AccessToPrivateSiblingsTest$Inner4",
63        expectedMethods = {"<init>()", "function()", "staticFunction()"},
64        expectedFields = {"var", "staticVar"},
65        expectedNumberOfSyntheticMethods = 4)
66public class AccessToPrivateSiblingsTest {
67
68    private class Inner1 {
69        private Inner1() {}
70        private int var;
71        private void function() {}
72
73        {
74            Inner3 inner = new Inner3();
75            inner.var = 0;
76            int i = inner.var;
77            inner.function();
78        }
79    }
80
81    private class Inner2 {
82        {
83            Inner1 inner = new Inner1();
84            inner.var = 0;
85            int i = inner.var;
86            inner.function();
87        }
88    }
89
90    private static class Inner3 {
91        private Inner3() {}
92        private int var;
93        private static int staticVar;
94        private void function() {}
95        private static void staticFunction() {}
96
97        static {
98            Inner4 inner = new Inner4();
99            inner.var = 0;
100            int i = inner.var;
101            inner.function();
102        }
103    }
104
105    private static class Inner4 {
106        private Inner4() {}
107        private int var;
108        private static int staticVar;
109        private void function() {}
110        private static void staticFunction() {}
111    }
112}
113