Fri, 03 May 2013 09:56:56 -0700
8012728: Normalize @ignore comments on langtools tests
Reviewed-by: vromero, mcimadamore
jjg@1643 | 1 | /* |
jjg@1643 | 2 | * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. |
jjg@1643 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
jjg@1643 | 4 | * |
jjg@1643 | 5 | * This code is free software; you can redistribute it and/or modify it |
jjg@1643 | 6 | * under the terms of the GNU General Public License version 2 only, as |
jjg@1643 | 7 | * published by the Free Software Foundation. |
jjg@1643 | 8 | * |
jjg@1643 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
jjg@1643 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
jjg@1643 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
jjg@1643 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
jjg@1643 | 13 | * accompanied this code). |
jjg@1643 | 14 | * |
jjg@1643 | 15 | * You should have received a copy of the GNU General Public License version |
jjg@1643 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
jjg@1643 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
jjg@1643 | 18 | * |
jjg@1643 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
jjg@1643 | 20 | * or visit www.oracle.com if you need additional information or have any |
jjg@1643 | 21 | * questions. |
jjg@1643 | 22 | */ |
jjg@1643 | 23 | |
jjg@1643 | 24 | /* |
jjg@1643 | 25 | * @test |
jjg@1643 | 26 | * @bug 8005220 |
jjg@1643 | 27 | * @summary javap must display repeating annotations |
jjg@1643 | 28 | */ |
jjg@1643 | 29 | import java.io.*; |
jjg@1643 | 30 | import java.util.*; |
jjg@1643 | 31 | |
jjg@1643 | 32 | /** |
jjg@1643 | 33 | * This class extends the abstract {@link Tester} test-driver, and |
jjg@1643 | 34 | * encapusulates a number of test-case classes (i.e. classes extending |
jjg@1643 | 35 | * this class and annotated with {@code TestCase}). |
jjg@1643 | 36 | * <p> |
jjg@1643 | 37 | * By default (no argument), this test runs all test-cases, except |
jjg@1643 | 38 | * if annotated with {@code ignore}. |
jjg@1643 | 39 | * <p> |
jjg@1643 | 40 | * Individual test cases can be executed using a run action. |
jjg@1643 | 41 | * <p> |
jjg@1643 | 42 | * Example: @run main RepeatingTypeAnnotations RepeatingTypeAnnotations$TC4 |
jjg@1643 | 43 | * <p> |
jjg@1643 | 44 | * Note: when specific test-cases are run, additional debug output is |
jjg@1643 | 45 | * produced to help debugging. Test annotated with {@code ignore} |
jjg@1643 | 46 | * can be executed explicitly. |
jjg@1643 | 47 | */ |
jjg@1643 | 48 | public class RepeatingTypeAnnotations extends Tester { |
jjg@1643 | 49 | |
jjg@1643 | 50 | /** |
jjg@1643 | 51 | * Main method instantiates test and run test-cases. |
jjg@1643 | 52 | */ |
jjg@1643 | 53 | public static void main(String... args) throws Exception { |
jjg@1643 | 54 | Tester tester = new RepeatingTypeAnnotations(); |
jjg@1643 | 55 | tester.run(args); |
jjg@1643 | 56 | } |
jjg@1643 | 57 | |
jjg@1643 | 58 | /** |
jjg@1643 | 59 | * Testcases are classes extending {@code RepeatingTypeAnnotations}, |
jjg@1643 | 60 | * and calling {@link setSrc}, followed by one or more invocations |
jjg@1643 | 61 | * of {@link verify} in the body of the constructor. |
jjg@1643 | 62 | */ |
jjg@1643 | 63 | public RepeatingTypeAnnotations() { |
jjg@1643 | 64 | setSrc(new TestSource(template)); |
jjg@1643 | 65 | } |
jjg@1643 | 66 | |
jjg@1643 | 67 | /** |
jjg@1643 | 68 | * Common template for test cases. The line TESTCASE is |
jjg@1643 | 69 | * replaced with the specific lines of individual tests. |
jjg@1643 | 70 | */ |
jjg@1643 | 71 | private static final String[] template = { |
jjg@1643 | 72 | "import java.lang.annotation.*;", |
jjg@1643 | 73 | "class Test {", |
jjg@1643 | 74 | " @Repeatable(As.class)", |
jjg@1643 | 75 | " @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})", |
jjg@1643 | 76 | " @Retention(RetentionPolicy.CLASS)", |
jjg@1643 | 77 | " @interface A {", |
jjg@1643 | 78 | " Class f() default int.class;", |
jjg@1643 | 79 | " }", |
jjg@1643 | 80 | |
jjg@1643 | 81 | " @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})", |
jjg@1643 | 82 | " @Retention(RetentionPolicy.CLASS)", |
jjg@1643 | 83 | " @interface As { A[] value(); }", |
jjg@1643 | 84 | |
jjg@1643 | 85 | " @Repeatable(Bs.class)", |
jjg@1643 | 86 | " @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})", |
jjg@1643 | 87 | " @Retention(RetentionPolicy.CLASS)", |
jjg@1643 | 88 | " @interface B {", |
jjg@1643 | 89 | " Class f() default int.class;", |
jjg@1643 | 90 | " }", |
jjg@1643 | 91 | |
jjg@1643 | 92 | " @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})", |
jjg@1643 | 93 | " @Retention(RetentionPolicy.CLASS)", |
jjg@1643 | 94 | " @interface Bs { B[] value(); }", |
jjg@1643 | 95 | |
jjg@1643 | 96 | " @Repeatable(Cs.class)", |
jjg@1643 | 97 | " @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})", |
jjg@1643 | 98 | " @Retention(RetentionPolicy.RUNTIME)", |
jjg@1643 | 99 | " @interface C {", |
jjg@1643 | 100 | " Class f() default int.class;", |
jjg@1643 | 101 | " }", |
jjg@1643 | 102 | |
jjg@1643 | 103 | " @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})", |
jjg@1643 | 104 | " @Retention(RetentionPolicy.RUNTIME)", |
jjg@1643 | 105 | " @interface Cs { C[] value(); }", |
jjg@1643 | 106 | "TESTCASE", |
jjg@1643 | 107 | "}" |
jjg@1643 | 108 | }; |
jjg@1643 | 109 | |
jjg@1643 | 110 | /* |
jjg@1643 | 111 | * The test cases covers annotation in the following locations: |
jjg@1643 | 112 | * - static and non-static fields |
jjg@1643 | 113 | * - local variables |
jjg@1643 | 114 | * - constructor and method return type and parameter types |
jjg@1643 | 115 | * - casts in class and method contexts. |
jjg@1643 | 116 | * For the above locations the test-cases covers: |
jjg@1643 | 117 | * - single annotation type |
jjg@1643 | 118 | * - two annotation types with same retention |
jjg@1643 | 119 | * - two annotation types with different retention |
jjg@1643 | 120 | * - three annotation types, two of same retention, one different. |
jjg@1643 | 121 | */ |
jjg@1643 | 122 | |
jjg@1643 | 123 | @TestCase |
jjg@1721 | 124 | @ignore // 8008082: missing type annotation for cast |
jjg@1643 | 125 | public static class TC1 extends RepeatingTypeAnnotations { |
jjg@1643 | 126 | public TC1() { |
jjg@1643 | 127 | setSrc(" static String so = \"hello world\";", |
jjg@1643 | 128 | " public @A @A @A Object o = (@A @A @A String) Test.so;"); |
jjg@1643 | 129 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 130 | "0: #25(#26=[@#27(),@#27(),@#27()]): FIELD", |
jjg@1643 | 131 | "1: #25(#26=[@#27(),@#27(),@#27()]): CAST, offset=5"); |
jjg@1643 | 132 | } |
jjg@1643 | 133 | } |
jjg@1643 | 134 | |
jjg@1643 | 135 | @TestCase |
jjg@1643 | 136 | public static class TC2 extends RepeatingTypeAnnotations { |
jjg@1643 | 137 | public TC2() { |
jjg@1643 | 138 | setSrc(" static String so = \"hello world\";", |
jjg@1643 | 139 | " public @A @B @A Object o = (@B @A @B String) Test.so;"); |
jjg@1643 | 140 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 141 | "0: #25(#26=[@#27(),@#27()]): FIELD", |
jjg@1643 | 142 | "1: #28(): FIELD", |
jjg@1643 | 143 | "2: #29(#26=[@#28(),@#28()]): CAST, offset=5", |
jjg@1643 | 144 | "3: #27(): CAST, offset=5"); |
jjg@1643 | 145 | } |
jjg@1643 | 146 | } |
jjg@1643 | 147 | |
jjg@1643 | 148 | @TestCase |
jjg@1643 | 149 | public static class TC3 extends RepeatingTypeAnnotations { |
jjg@1643 | 150 | public TC3() { |
jjg@1643 | 151 | setSrc(" static String so = \"hello world\";", |
jjg@1643 | 152 | " public @A @A @C Object o = (@B @C @B String) Test.so;"); |
jjg@1643 | 153 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 154 | "0: #25(): FIELD", |
jjg@1643 | 155 | "1: #25(): CAST, offset=5", |
jjg@1643 | 156 | "RuntimeVisibleTypeAnnotations", |
jjg@1643 | 157 | "0: #27(#28=[@#29(),@#29()]): FIELD", |
jjg@1643 | 158 | "1: #30(#28=[@#31(),@#31()]): CAST, offset=5"); |
jjg@1643 | 159 | } |
jjg@1643 | 160 | } |
jjg@1643 | 161 | |
jjg@1643 | 162 | @TestCase |
jjg@1643 | 163 | public static class TC4 extends RepeatingTypeAnnotations { |
jjg@1643 | 164 | public TC4() { |
jjg@1643 | 165 | setSrc(" static String so = \"hello world\";", |
jjg@1643 | 166 | " public @A @B @C Object o = (@C @B @A String) Test.so;"); |
jjg@1643 | 167 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 168 | "RuntimeVisibleTypeAnnotations", |
jjg@1643 | 169 | "0: #25(): FIELD", |
jjg@1643 | 170 | "1: #25(): CAST, offset=5", |
jjg@1643 | 171 | "0: #27(): FIELD", |
jjg@1643 | 172 | "1: #28(): FIELD", |
jjg@1643 | 173 | "2: #28(): CAST, offset=5", |
jjg@1643 | 174 | "3: #27(): CAST, offset=5"); |
jjg@1643 | 175 | } |
jjg@1643 | 176 | } |
jjg@1643 | 177 | |
jjg@1643 | 178 | @TestCase |
jjg@1721 | 179 | @ignore // 8008082: missing type annotation for cast |
jjg@1643 | 180 | public static class TC5 extends RepeatingTypeAnnotations { |
jjg@1643 | 181 | public TC5() { |
jjg@1643 | 182 | setSrc(" static String so = \"hello world\";", |
jjg@1643 | 183 | " public static @A @A @A Object o = (@B @B @B String) Test.so;"); |
jjg@1643 | 184 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 185 | "0: #25(#26=[@#27(),@#27(),@#27()]): FIELD", |
jjg@1643 | 186 | "1: #28(#26=[@#29(),@#29(),@#29()]): CAST, offset=5, type_index=0"); |
jjg@1643 | 187 | } |
jjg@1643 | 188 | } |
jjg@1643 | 189 | |
jjg@1643 | 190 | @TestCase |
jjg@1643 | 191 | public static class TC6 extends RepeatingTypeAnnotations { |
jjg@1643 | 192 | public TC6() { |
jjg@1643 | 193 | setSrc(" static String so = \"hello world\";", |
jjg@1643 | 194 | " public static @A @B @A Object o = (@B @A @B String) Test.so;"); |
jjg@1643 | 195 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 196 | "0: #25(#26=[@#27(),@#27()]): FIELD", |
jjg@1643 | 197 | "1: #28(): FIELD", |
jjg@1643 | 198 | "2: #29(#26=[@#28(),@#28()]): CAST, offset=5", |
jjg@1643 | 199 | "3: #27(): CAST, offset=5"); |
jjg@1643 | 200 | } |
jjg@1643 | 201 | } |
jjg@1643 | 202 | |
jjg@1643 | 203 | @TestCase |
jjg@1643 | 204 | public static class TC7 extends RepeatingTypeAnnotations { |
jjg@1643 | 205 | public TC7() { |
jjg@1643 | 206 | setSrc(" static String so = \"hello world\";", |
jjg@1643 | 207 | " public static @A @A @C Object o = (@B @C @B String) Test.so;"); |
jjg@1643 | 208 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 209 | "RuntimeVisibleTypeAnnotations", |
jjg@1643 | 210 | "0: #25(): FIELD", |
jjg@1643 | 211 | "1: #25(): CAST, offset=5", |
jjg@1643 | 212 | "0: #27(#28=[@#29(),@#29()]): FIELD", |
jjg@1643 | 213 | "1: #30(#28=[@#31(),@#31()]): CAST, offset=5"); |
jjg@1643 | 214 | } |
jjg@1643 | 215 | } |
jjg@1643 | 216 | |
jjg@1643 | 217 | @TestCase |
jjg@1643 | 218 | public static class TC8 extends RepeatingTypeAnnotations { |
jjg@1643 | 219 | public TC8() { |
jjg@1643 | 220 | setSrc(" static String so = \"hello world\";", |
jjg@1643 | 221 | " public static @A @B @C Object o = (@C @B @A String) Test.so;"); |
jjg@1643 | 222 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 223 | "RuntimeVisibleTypeAnnotations", |
jjg@1643 | 224 | "0: #25(): FIELD", |
jjg@1643 | 225 | "1: #25(): CAST, offset=5", |
jjg@1643 | 226 | "0: #27(): FIELD", |
jjg@1643 | 227 | "1: #28(): FIELD", |
jjg@1643 | 228 | "2: #28(): CAST, offset=5", |
jjg@1643 | 229 | "3: #27(): CAST, offset=5"); |
jjg@1643 | 230 | } |
jjg@1643 | 231 | } |
jjg@1643 | 232 | |
jjg@1643 | 233 | @TestCase |
jjg@1721 | 234 | @ignore // 8008082: missing type annotation for cast |
jjg@1643 | 235 | public static class TC9 extends RepeatingTypeAnnotations { |
jjg@1643 | 236 | public TC9() { |
jjg@1643 | 237 | setSrc(" public Test(@A @A @A Object o, @A int i, long l) {", |
jjg@1643 | 238 | " @A @A @A String ls = (@B @B @B String) o;", |
jjg@1643 | 239 | " }"); |
jjg@1643 | 240 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 241 | "0: #34(#35=[@#36(),@#36(),@#36()]): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 242 | "1: #36(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 243 | "2: #37(#35=[@#38(),@#38(),@#38()]): CAST, offset=4, type_index=0", |
jjg@1643 | 244 | "3: #34(#35=[@#36(),@#36(),@#36()]): LOCAL_VARIABLE, {start_pc=10, length=1, index=5}"); |
jjg@1643 | 245 | } |
jjg@1643 | 246 | } |
jjg@1643 | 247 | |
jjg@1643 | 248 | @TestCase |
jjg@1643 | 249 | public static class TC10 extends RepeatingTypeAnnotations { |
jjg@1643 | 250 | public TC10() { |
jjg@1643 | 251 | setSrc(" public Test(@A @A @B Object o, @A @B int i, long l) {", |
jjg@1643 | 252 | " @A @A @B String ls = (@B @A @B String) o;", |
jjg@1643 | 253 | " }"); |
jjg@1643 | 254 | verify("RuntimeInvisibleTypeAnnotations:", |
jjg@1643 | 255 | "0: #34(#35=[@#36(),@#36()]): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 256 | "1: #37(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 257 | "2: #36(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 258 | "3: #37(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 259 | "4: #38(#35=[@#37(),@#37()]): CAST, offset=4, type_index=0", |
jjg@1643 | 260 | "5: #36(): CAST, offset=4, type_index=0", |
jjg@1643 | 261 | "6: #34(#35=[@#36(),@#36()]): LOCAL_VARIABLE, {start_pc=10, length=1, index=5}", |
jjg@1643 | 262 | "7: #37(): LOCAL_VARIABLE, {start_pc=10, length=1, index=5}"); |
jjg@1643 | 263 | } |
jjg@1643 | 264 | } |
jjg@1643 | 265 | |
jjg@1643 | 266 | @TestCase |
jjg@1643 | 267 | public static class TC11 extends RepeatingTypeAnnotations { |
jjg@1643 | 268 | public TC11() { |
jjg@1643 | 269 | setSrc(" public Test(@C @C @A Object o, @A @B int i, long l) {", |
jjg@1643 | 270 | " @C @C @A String ls = (@A @A @C String) o;", |
jjg@1643 | 271 | " }"); |
jjg@1643 | 272 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 273 | "RuntimeVisibleTypeAnnotations", |
jjg@1643 | 274 | "0: #34(#35=[@#36(),@#36()]): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 275 | "1: #36(): CAST, offset=4", |
jjg@1643 | 276 | "2: #34(#35=[@#36(),@#36()]): LOCAL_VARIABLE, {start_pc=10, length=1, index=5}", |
jjg@1643 | 277 | "0: #38(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 278 | "1: #38(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 279 | "2: #39(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 280 | "3: #40(#35=[@#38(),@#38()]): CAST, offset=4", |
jjg@1643 | 281 | "4: #38(): LOCAL_VARIABLE, {start_pc=10, length=1, index=5}"); |
jjg@1643 | 282 | } |
jjg@1643 | 283 | } |
jjg@1643 | 284 | |
jjg@1643 | 285 | @TestCase |
jjg@1643 | 286 | public static class TC12 extends RepeatingTypeAnnotations { |
jjg@1643 | 287 | public TC12() { |
jjg@1643 | 288 | setSrc(" public Test(@A @B @C Object o, @A @C int i, long l) {", |
jjg@1643 | 289 | " @A @B @C String ls = (@C @A @B String) o;", |
jjg@1643 | 290 | " }"); |
jjg@1643 | 291 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 292 | "RuntimeVisibleTypeAnnotations", |
jjg@1643 | 293 | "0: #34(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 294 | "1: #34(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 295 | "2: #34(): CAST, offset=4", |
jjg@1643 | 296 | "3: #34(): LOCAL_VARIABLE, {start_pc=10, length=1, index=5}", |
jjg@1643 | 297 | "0: #36(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 298 | "1: #37(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 299 | "2: #36(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 300 | "3: #36(): CAST, offset=4", |
jjg@1643 | 301 | "4: #37(): CAST, offset=4", |
jjg@1643 | 302 | "5: #36(): LOCAL_VARIABLE, {start_pc=10, length=1, index=5}", |
jjg@1643 | 303 | "6: #37(): LOCAL_VARIABLE, {start_pc=10, length=1, index=5}"); |
jjg@1643 | 304 | } |
jjg@1643 | 305 | } |
jjg@1643 | 306 | |
jjg@1643 | 307 | @TestCase |
jjg@1721 | 308 | @ignore // 8008082: missing type annotation for cast |
jjg@1643 | 309 | public static class TC13 extends RepeatingTypeAnnotations { |
jjg@1643 | 310 | public TC13() { |
jjg@1643 | 311 | setSrc(" public @A @A @A String foo(@A @A @A Object o, @A int i, long l) {", |
jjg@1643 | 312 | " @A @A @A String ls = (@B @B @B String) o;", |
jjg@1643 | 313 | " return (@A @A @A String) o;", |
jjg@1643 | 314 | " }"); |
jjg@1643 | 315 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 316 | "0: #36(#37=[@#38(),@#38(),@#38()]): METHOD_RETURN", |
jjg@1643 | 317 | "1: #36(#37=[@#38(),@#38(),@#38()]): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 318 | "2: #38(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 319 | "3: #39(#37=[@#40(),@#40(),@#40()]): CAST, offset=0, type_index=0", |
jjg@1643 | 320 | "4: #36(#37=[@#38(),@#38(),@#38()]): CAST, offset=6, type_index=0", |
jjg@1643 | 321 | "5: #36(#37=[@#38(),@#38(),@#38()]): LOCAL_VARIABLE, {start_pc=6, length=5, index=5}"); |
jjg@1643 | 322 | } |
jjg@1643 | 323 | } |
jjg@1643 | 324 | |
jjg@1643 | 325 | @TestCase |
jjg@1643 | 326 | public static class TC14 extends RepeatingTypeAnnotations { |
jjg@1643 | 327 | public TC14() { |
jjg@1643 | 328 | setSrc(" public @A @B @B String foo(@A @A @B Object o, @A @B int i, long l) {", |
jjg@1643 | 329 | " @A @A @B String ls = (@B @A @B String) o;", |
jjg@1643 | 330 | " return (@A @B @B String) o;", |
jjg@1643 | 331 | " }"); |
jjg@1643 | 332 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 333 | "0: #36(): METHOD_RETURN", |
jjg@1643 | 334 | "1: #37(#38=[@#39(),@#39()]): METHOD_RETURN", |
jjg@1643 | 335 | "2: #40(#38=[@#36(),@#36()]): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 336 | "3: #39(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 337 | "4: #36(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 338 | "5: #39(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 339 | "6: #37(#38=[@#39(),@#39()]): CAST, offset=0", |
jjg@1643 | 340 | "7: #36(): CAST, offset=0", |
jjg@1643 | 341 | "8: #36(): CAST, offset=6", |
jjg@1643 | 342 | "9: #37(#38=[@#39(),@#39()]): CAST, offset=6", |
jjg@1643 | 343 | "10: #40(#38=[@#36(),@#36()]): LOCAL_VARIABLE, {start_pc=6, length=5, index=5}", |
jjg@1643 | 344 | "11: #39(): LOCAL_VARIABLE, {start_pc=6, length=5, index=5}"); |
jjg@1643 | 345 | } |
jjg@1643 | 346 | } |
jjg@1643 | 347 | |
jjg@1643 | 348 | @TestCase |
jjg@1643 | 349 | public static class TC15 extends RepeatingTypeAnnotations { |
jjg@1643 | 350 | public TC15() { |
jjg@1643 | 351 | setSrc(" public @A @A @C String foo(@C @C @A Object o, @A @B int i, long l) {", |
jjg@1643 | 352 | " @C @C @A String ls = (@A @A @C String) o;", |
jjg@1643 | 353 | " return (@C @B @B String) o;", |
jjg@1643 | 354 | " }"); |
jjg@1643 | 355 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 356 | "RuntimeVisibleTypeAnnotations", |
jjg@1643 | 357 | "0: #36(): METHOD_RETURN", |
jjg@1643 | 358 | "1: #37(#38=[@#36(),@#36()]): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 359 | "2: #36(): CAST, offset=0", |
jjg@1643 | 360 | "3: #36(): CAST, offset=6", |
jjg@1643 | 361 | "4: #37(#38=[@#36(),@#36()]): LOCAL_VARIABLE, {start_pc=6, length=5, index=5}", |
jjg@1643 | 362 | "0: #40(#38=[@#41(),@#41()]): METHOD_RETURN", |
jjg@1643 | 363 | "1: #41(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 364 | "2: #41(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 365 | "3: #42(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 366 | "4: #40(#38=[@#41(),@#41()]): CAST, offset=0", |
jjg@1643 | 367 | "5: #43(#38=[@#42(),@#42()]): CAST, offset=6", |
jjg@1643 | 368 | "6: #41(): LOCAL_VARIABLE, {start_pc=6, length=5, index=5}"); |
jjg@1643 | 369 | } |
jjg@1643 | 370 | } |
jjg@1643 | 371 | |
jjg@1643 | 372 | @TestCase |
jjg@1643 | 373 | public static class TC16 extends RepeatingTypeAnnotations { |
jjg@1643 | 374 | public TC16() { |
jjg@1643 | 375 | setSrc(" public @A @B @C String foo(@A @B @C Object o, @A @C int i, long l) {", |
jjg@1643 | 376 | " @A @B @C String ls = (@C @A @B String) o;", |
jjg@1643 | 377 | " return (@B @A @C String) o;", |
jjg@1643 | 378 | " }"); |
jjg@1643 | 379 | verify("RuntimeInvisibleTypeAnnotations", |
jjg@1643 | 380 | "RuntimeVisibleTypeAnnotations", |
jjg@1643 | 381 | "0: #36(): METHOD_RETURN", |
jjg@1643 | 382 | "1: #36(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 383 | "2: #36(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 384 | "3: #36(): CAST, offset=0", |
jjg@1643 | 385 | "4: #36(): CAST, offset=6", |
jjg@1643 | 386 | "5: #36(): LOCAL_VARIABLE, {start_pc=6, length=5, index=5}", |
jjg@1643 | 387 | "0: #38(): METHOD_RETURN", |
jjg@1643 | 388 | "1: #39(): METHOD_RETURN", |
jjg@1643 | 389 | "2: #38(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 390 | "3: #39(): METHOD_FORMAL_PARAMETER, param_index=0", |
jjg@1643 | 391 | "4: #38(): METHOD_FORMAL_PARAMETER, param_index=1", |
jjg@1643 | 392 | "5: #38(): CAST, offset=0", |
jjg@1643 | 393 | "6: #39(): CAST, offset=0", |
jjg@1643 | 394 | "7: #39(): CAST, offset=6", |
jjg@1643 | 395 | "8: #38(): CAST, offset=6", |
jjg@1643 | 396 | "9: #38(): LOCAL_VARIABLE, {start_pc=6, length=5, index=5}", |
jjg@1643 | 397 | "10: #39(): LOCAL_VARIABLE, {start_pc=6, length=5, index=5}"); |
jjg@1643 | 398 | } |
jjg@1643 | 399 | } |
jjg@1643 | 400 | } |