1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/test/tools/javac/annotations/typeAnnotations/newlocations/NestedTypes.java Wed Apr 27 01:34:52 2016 +0800 1.3 @@ -0,0 +1,212 @@ 1.4 +/* 1.5 + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. 1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.7 + * 1.8 + * This code is free software; you can redistribute it and/or modify it 1.9 + * under the terms of the GNU General Public License version 2 only, as 1.10 + * published by the Free Software Foundation. 1.11 + * 1.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 1.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1.15 + * version 2 for more details (a copy is included in the LICENSE file that 1.16 + * accompanied this code). 1.17 + * 1.18 + * You should have received a copy of the GNU General Public License version 1.19 + * 2 along with this work; if not, write to the Free Software Foundation, 1.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1.21 + * 1.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 1.23 + * or visit www.oracle.com if you need additional information or have any 1.24 + * questions. 1.25 + */ 1.26 + 1.27 +import java.lang.annotation.*; 1.28 +import java.util.Map; 1.29 + 1.30 +/* 1.31 + * @test 1.32 + * @bug 8006775 1.33 + * @summary new type annotation location: nested types 1.34 + * @author Werner Dietl 1.35 + * @compile NestedTypes.java 1.36 + */ 1.37 +class Outer { 1.38 + class Inner { 1.39 + class Inner2 { 1.40 + // m1a-c all have the same parameter type. 1.41 + void m1a(@A Inner2 p1a) {} 1.42 + void m1b(Inner.@A Inner2 p1b) {} 1.43 + void m1c(Outer.Inner.@A Inner2 p1c) {} 1.44 + // notice the difference to m1d 1.45 + void m1d(@A Outer.Inner.Inner2 p1d) {} 1.46 + 1.47 + // m2a-b both have the same parameter type. 1.48 + void m2a(@A Inner.Inner2 p2a) {} 1.49 + void m2b(Outer.@A Inner.Inner2 p2b) {} 1.50 + 1.51 + // The location for @A is the same in m3a-c 1.52 + void m3a(@A Outer p3a) {} 1.53 + void m3b(@A Outer.Inner p3b) {} 1.54 + void m3c(@A Outer.Inner.Inner2 p3c) {} 1.55 + 1.56 + // Test combinations 1.57 + void m4a(@A Outer p3a) {} 1.58 + void m4b(@A Outer. @B Inner p3b) {} 1.59 + void m4c(@A Outer. @B Inner. @C Inner2 p3c) {} 1.60 + } 1.61 + } 1.62 + 1.63 + void m4a(@A Map p4a) {} 1.64 + void m4b(Map.@B Entry p4c) {} 1.65 + // Illegal: 1.66 + // void m4b(@A Map.Entry p4b) {} 1.67 + // void m4c(@A Map.@B Entry p4c) {} 1.68 + 1.69 + void m4c(Map<String,String>.@B Entry<String,String> p4d) {} 1.70 + // Illegal: 1.71 + // void m4d(@A Map<String,String>.@B Entry<String,String> p4d) {} 1.72 + 1.73 + void m4e(MyList<Map.Entry> p4e) {} 1.74 + void m4f(MyList<Map.@B Entry> p4f) {} 1.75 + // Illegal: 1.76 + // void m4g(MyList<@A Map.Entry> p4e) {} 1.77 + // void m4h(MyList<@A Map.@B Entry> p4f) {} 1.78 + 1.79 + class GInner<X> { 1.80 + class GInner2<Y, Z> {} 1.81 + } 1.82 + 1.83 + static class Static {} 1.84 + static class GStatic<X, Y> { 1.85 + static class GStatic2<Z> {} 1.86 + } 1.87 +} 1.88 + 1.89 +class Test1 { 1.90 + // Outer.GStatic<Object,Object>.GStatic2<Object> gs; 1.91 + Outer.GStatic.@A GStatic2<Object> gsgood; 1.92 + // TODO: add failing test 1.93 + // Outer.@A GStatic.GStatic2<Object> gsbad; 1.94 + 1.95 + MyList<@A Outer . @B Inner. @C Inner2> f; 1.96 + @A Outer .GInner<Object>.GInner2<String, Integer> g; 1.97 + 1.98 + // TODO: Make sure that something like this fails gracefully: 1.99 + // MyList<java.@B lang.Object> pkg; 1.100 + 1.101 + @A Outer f1; 1.102 + @A Outer . @B Inner f2 = f1.new @B Inner(); 1.103 + // TODO: ensure type annos on new are stored. 1.104 + @A Outer . @B GInner<@C Object> f3 = f1.new @B GInner<@C Object>(); 1.105 + 1.106 + MyList<@A Outer . @B GInner<@C MyList<@D Object>>. @E GInner2<@F Integer, @G Object>> f4; 1.107 + // MyList<Outer.GInner<Object>.GInner2<Integer>> f4clean; 1.108 + 1.109 + @A Outer . @B GInner<@C MyList<@D Object>>. @E GInner2<@F Integer, @G Object> f4top; 1.110 + 1.111 + MyList<@A Outer . @B GInner<@C MyList<@D Object @E[] @F[]>>. @G GInner2<@H Integer, @I Object> @J[] @K[]> f4arr; 1.112 + 1.113 + @A Outer . @B GInner<@C MyList<@D Object @E[] @F[]>>. @G GInner2<@H Integer, @I Object> @J[] @K[] f4arrtop; 1.114 + 1.115 + MyList<Outer . @B Static> f5; 1.116 + // Illegal: 1.117 + // MyList<@A Outer . @B Static> f5; 1.118 + 1.119 + Outer . @B Static f6; 1.120 + // Illegal: 1.121 + // @A Outer . @B Static f6; 1.122 + 1.123 + Outer . @Bv("B") GStatic<@Cv("C") String, @Dv("D") Object> f7; 1.124 + // Illegal: 1.125 + // @Av("A") Outer . @Bv("B") GStatic<@Cv("C") String, @Dv("D") Object> f7; 1.126 + 1.127 + Outer . @Cv("Data") Static f8; 1.128 + // Illegal: 1.129 + // @A Outer . @Cv("Data") Static f8; 1.130 + 1.131 + MyList<Outer . @Cv("Data") Static> f9; 1.132 + // Illegal: 1.133 + // MyList<@A Outer . @Cv("Data") Static> f9; 1.134 +} 1.135 + 1.136 +class Test2 { 1.137 + void m() { 1.138 + @A Outer f1 = null; 1.139 + @A Outer.@B Inner f2 = null; 1.140 + Outer.@B Static f3 = null; 1.141 + // Illegal: 1.142 + // @A Outer.@B Static f3 = null; 1.143 + @A Outer.@C Inner f4 = null; 1.144 + 1.145 + Outer . @B Static f5 = null; 1.146 + Outer . @Cv("Data") Static f6 = null; 1.147 + MyList<Outer . @Cv("Data") Static> f7 = null; 1.148 + } 1.149 +} 1.150 + 1.151 +class Test3 { 1.152 + void monster(@A Outer p1, 1.153 + @A Outer.@B Inner p2, 1.154 + Outer.@B Static p3, 1.155 + @A Outer.@Cv("Test") Inner p4, 1.156 + Outer . @B Static p5, 1.157 + Outer . @Cv("Data") Static p6, 1.158 + MyList<Outer . @Cv("Data") Static> p7) { 1.159 + } 1.160 +} 1.161 + 1.162 +class Test4 { 1.163 + void m() { 1.164 + @A Outer p1 = new @A Outer(); 1.165 + @A Outer.@B Inner p2 = p1.new @B Inner(); 1.166 + // Illegal: 1.167 + // @A Outer.@B Static p3 = new @A Outer.@B Static(); 1.168 + // Object o3 = new @A Outer.@B Static(); 1.169 + 1.170 + @A Outer.@Cv("Test") Inner p4 = p1.new @Cv("Test") Inner(); 1.171 + Outer . @B Static p5 = new Outer . @B Static(); 1.172 + Outer . @Cv("Data") Static p6 = new Outer . @Cv("Data") Static(); 1.173 + MyList<Outer . @Cv("Data") Static> p7 = new MyList<Outer . @Cv("Data") Static>(); 1.174 + } 1.175 +} 1.176 + 1.177 +class MyList<K> { } 1.178 + 1.179 + 1.180 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.181 +@interface A { } 1.182 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.183 +@interface B { } 1.184 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.185 +@interface C { } 1.186 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.187 +@interface D { } 1.188 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.189 +@interface E { } 1.190 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.191 +@interface F { } 1.192 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.193 +@interface G { } 1.194 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.195 +@interface H { } 1.196 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.197 +@interface I { } 1.198 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.199 +@interface J { } 1.200 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.201 +@interface K { } 1.202 + 1.203 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.204 +@interface Av { String value(); } 1.205 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.206 +@interface Bv { String value(); } 1.207 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.208 +@interface Cv { String value(); } 1.209 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.210 +@interface Dv { String value(); } 1.211 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.212 +@interface Ev { String value(); } 1.213 +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) 1.214 +@interface Fv { String value(); } 1.215 +