1 /* 2 * Copyright (c) 2014, 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 * @library /testlibrary/selection_resolution/ 27 * @run main Template 28 */ 29 30 import java.util.function.BiConsumer; 31 import java.util.function.Consumer; 32 import java.util.Arrays; 33 import java.util.Collection; 34 import java.util.Collections; 35 import java.util.EnumSet; 36 import java.util.HashSet; 37 import java.util.LinkedList; 38 39 /** 40 * Templates are sets of transformations that are applied to a 41 * SelectionResolutionTestCase.Builder as part of building up a test 42 * case. Templates should contain a collection of different 43 * transforms, all of which represent an "interesting" case in a 44 * general category of cases. 45 * 46 */ 47 public class Template { 48 49 public enum Kind { CLASS, INTERFACE; } 50 51 public final Collection<Consumer<SelectionResolutionTestCase.Builder>> cases; 52 public final String name; 53 54 /** 55 * Create a template from a collection of lambdas that modify a Builder. 56 * 57 * @param name The name of the template. 58 * @param cases The cases in the template. 59 */ 60 public Template(final String name, 61 final Collection<Consumer<SelectionResolutionTestCase.Builder>> cases) { 62 this.cases = cases; 63 this.name = name; 64 } 65 66 /** 67 * Build a template out of a set of lambdas that modify a Builder. 68 * 69 * @param name The name of the template. 70 * @param cases The cases in the template. 71 */ 72 public Template(final String name, 73 final Consumer<SelectionResolutionTestCase.Builder>... cases) { 74 this(name, Arrays.asList(cases)); 75 } 76 77 /** 78 * Build a template out of a set of lambdas that modify a Builder. 79 * Also include all cases from another template. 80 * 81 * @param name The name of the template. 82 * @param include Include all cases from this template. 83 * @param cases The cases in the template. 84 */ 85 public Template(final String name, 86 final Template include, 87 final Consumer<SelectionResolutionTestCase.Builder>... cases) { 88 this(name, new LinkedList(include.cases)); 89 this.cases.addAll(Arrays.asList(cases)); 90 } 91 92 /** 93 * Build a template out of a set of lambdas that modify a Builder. 94 * Also include all cases from another template. 95 * 96 * @param name The name of the template. 97 * @param include Include all cases from this template. 98 * @param cases The cases in the template. 99 */ 100 public Template(final String name, 101 final Template... others) { 102 this(name, new LinkedList()); 103 104 for(final Template template : others) { 105 cases.addAll(template.cases); 106 } 107 } 108 109 /** 110 * Run all cases in the template. This will run each action in 111 * the template and then call the next action on a separate copy 112 * of the builder parameter. 113 * 114 * @param The next action to perform of the Builder. 115 * @param The Builder to modify. 116 */ 117 public void runCases(final Consumer<SelectionResolutionTestCase.Builder> next, 118 final SelectionResolutionTestCase.Builder builder) { 119 for(final Consumer<SelectionResolutionTestCase.Builder> thiscase : cases) { 120 final SelectionResolutionTestCase.Builder localbuilder = builder.copy(); 121 thiscase.accept(localbuilder); 122 next.accept(localbuilder); 123 } 124 } 125 126 public void printCases(final SelectionResolutionTestCase.Builder builder) { 127 int i = 1; 128 System.err.println("Template " + name + ":\n"); 129 for(final Consumer<SelectionResolutionTestCase.Builder> thiscase : cases) { 130 final SelectionResolutionTestCase.Builder localbuilder = builder.copy(); 131 thiscase.accept(localbuilder); 132 System.err.println("Case " + i++); 133 System.err.println(localbuilder); 134 } 135 } 136 137 /* Create an empty class in the given package */ 138 public static final ClassData emptyClass(final ClassData.Package pck) { 139 return new ClassData(pck, null); 140 } 141 142 /* These are functions that are used to build callsite templates */ 143 public static void callsiteIsMethodref(final SelectionResolutionTestCase.Builder builder) { 144 builder.callsite = builder.methodref; 145 } 146 147 public static void callsiteSubclassMethodref(final SelectionResolutionTestCase.Builder builder) { 148 final int callsite = 149 builder.addClass(Template.emptyClass(ClassData.Package.SAME)); 150 builder.hier.addInherit(callsite, builder.methodref); 151 builder.callsite = callsite; 152 } 153 154 public static void callsiteUnrelatedMethodref(final SelectionResolutionTestCase.Builder builder) { 155 final int callsite = 156 builder.addClass(Template.emptyClass(ClassData.Package.SAME)); 157 builder.callsite = callsite; 158 } 159 160 public static void methodrefIsExpected(final SelectionResolutionTestCase.Builder builder) { 161 builder.methodref = builder.expected; 162 } 163 164 public static final Template MethodrefEqualsExpected = 165 new Template("MethodrefEqualsExpected", 166 Template::methodrefIsExpected); 167 168 /***************************** 169 * Set Invoke Template * 170 *****************************/ 171 172 public static final Template SetInvoke(final SelectionResolutionTestCase.InvokeInstruction invoke) { 173 return new Template("SetInvoke(" + invoke + ")", 174 Collections.singleton((builder) -> { 175 builder.invoke = invoke; 176 })); 177 } 178 179 /***************************** 180 * Result Combo Template * 181 *****************************/ 182 public static Template ResultCombo(final EnumSet<Kind> kinds, 183 final EnumSet<MethodData.Access> accesses, 184 final EnumSet<MethodData.Context> contexts, 185 final EnumSet<ClassData.Package> packages) { 186 final LinkedList<Consumer<SelectionResolutionTestCase.Builder>> cases = 187 new LinkedList<>(); 188 189 for (final Kind kind : kinds) { 190 for (final MethodData.Access acc : accesses) { 191 for (final MethodData.Context ctx : contexts) { 192 if (!(acc == MethodData.Access.PRIVATE && 193 ctx == MethodData.Context.ABSTRACT)) { 194 for (final ClassData.Package pck : packages) { 195 cases.add((builder) -> { 196 final MethodData meth = new MethodData(acc, ctx); 197 final ClassData cls = new ClassData(pck, meth); 198 switch(kind) { 199 case CLASS: 200 builder.expected = builder.addClass(cls); 201 break; 202 case INTERFACE: 203 builder.expected = builder.addInterface(cls); 204 break; 205 } 206 }); 207 } 208 } 209 } 210 } 211 } 212 213 return new Template("ResultCombo", cases); 214 } 215 216 public static Template ResolutionOverride(final EnumSet<Kind> kinds, 217 final EnumSet<MethodData.Access> accesses, 218 final EnumSet<MethodData.Context> contexts, 219 final EnumSet<ClassData.Package> packages) { 220 final LinkedList<Consumer<SelectionResolutionTestCase.Builder>> cases = 221 new LinkedList<>(); 222 223 for (final Kind kind : kinds) { 224 for (final MethodData.Access acc : accesses) { 225 for (final MethodData.Context ctx : contexts) { 226 if (!(acc == MethodData.Access.PRIVATE && 227 ctx == MethodData.Context.ABSTRACT)) { 228 for (final ClassData.Package pck : packages) { 229 cases.add((builder) -> { 230 final MethodData meth = new MethodData(acc, ctx); 231 final ClassData cls = new ClassData(pck, meth); 232 int override = -1; 233 switch(kind) { 234 case CLASS: 235 override = builder.addClass(cls); 236 break; 237 case INTERFACE: 238 override = builder.addInterface(cls); 239 break; 240 } 241 builder.hier.addInherit(override, builder.expected); 242 }); 243 } 244 } 245 } 246 } 247 } 248 249 return new Template("ResultCombo", cases); 250 } 251 252 /****************************** 253 * Resolution Templates * 254 ******************************/ 255 256 private static MethodData getMethodData(final MethodData.Access acc, 257 final MethodData.Context ctx) { 258 if (!(acc == MethodData.Access.PUBLIC || 259 acc == MethodData.Access.PLACEHOLDER) && 260 ctx != MethodData.Context.STATIC) { 261 return null; 262 } else { 263 return new MethodData(MethodData.Access.PUBLIC, ctx); 264 } 265 } 266 267 public static final Template MethodrefNotEqualsExpectedClass = 268 new Template("MethodrefNotEqualsExpectedClass", 269 /* Case 1: Inherit from super. 270 * 271 * C2[](res) 272 * C1[C2]() = mref 273 */ 274 (final SelectionResolutionTestCase.Builder builder) -> { 275 final int C2 = builder.expected; 276 final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); 277 builder.hier.addInherit(C1, C2); 278 builder.methodref = C1; 279 }, 280 /* Case 2: Inherit from super. 281 * 282 * C2[](res), I[](def) 283 * C1[C2,I]() = mref 284 */ 285 (final SelectionResolutionTestCase.Builder builder) -> { 286 final ClassData.Package pck = 287 builder.classdata.get(builder.expected).packageId; 288 final MethodData.Context ctx = 289 builder.classdata.get(builder.expected).methoddata.context; 290 final MethodData.Access acc = 291 builder.classdata.get(builder.expected).methoddata.access; 292 final MethodData mdata = getMethodData(acc, ctx); 293 final ClassData withDef = new ClassData(pck, mdata); 294 final int C2 = builder.expected; 295 final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); 296 final int I = builder.addInterface(withDef); 297 builder.hier.addInherit(C1, C2); 298 builder.hier.addInherit(C1, I); 299 builder.methodref = C1; 300 }, 301 /* Case 3: Inherit from super's super. 302 * 303 * C3[](res) 304 * C2[](), I[](def) 305 * C1[C2,I]() = mref 306 */ 307 (final SelectionResolutionTestCase.Builder builder) -> { 308 final ClassData.Package pck = 309 builder.classdata.get(builder.expected).packageId; 310 final MethodData.Context ctx = 311 builder.classdata.get(builder.expected).methoddata.context; 312 final MethodData.Access acc = 313 builder.classdata.get(builder.expected).methoddata.access; 314 final MethodData mdata = getMethodData(acc, ctx); 315 final ClassData withDef = new ClassData(pck, mdata); 316 final int C3 = builder.expected; 317 final int C2 = builder.addClass(emptyClass(pck)); 318 final int C1 = builder.addClass(emptyClass(ClassData.Package.SAME)); 319 final int I = builder.addInterface(withDef); 320 builder.hier.addInherit(C2, C3); 321 builder.hier.addInherit(C1, C2); 322 builder.hier.addInherit(C1, I); 323 builder.methodref = C1; 324 }); 325 326 public static final Template IfaceMethodrefNotEqualsExpected = 327 new Template("IfaceMethodrefNotEqualsExpected", 328 /* Case 1: Inherit from super. 329 * 330 * I2[](res) 331 * I1[I2]() = mref 332 */ 333 (final SelectionResolutionTestCase.Builder builder) -> { 334 final ClassData.Package pck = 335 builder.classdata.get(builder.expected).packageId; 336 final int I2 = builder.expected; 337 final int I1 = builder.addInterface(emptyClass(pck)); 338 builder.hier.addInherit(I1, I2); 339 builder.methodref = I1; 340 }, 341 /* Case 2: Inherit from super, skip private. 342 * 343 * I2[](res) 344 * I2[I3](priv) 345 * I1[I2]() = mref 346 */ 347 (final SelectionResolutionTestCase.Builder builder) -> { 348 final ClassData.Package pck = 349 builder.classdata.get(builder.expected).packageId; 350 final MethodData meth = 351 new MethodData(MethodData.Access.PRIVATE, 352 MethodData.Context.INSTANCE); 353 final ClassData withPrivDef = new ClassData(pck, meth); 354 final int I3 = builder.expected; 355 final int I2 = builder.addInterface(withPrivDef); 356 final int I1 = builder.addInterface(emptyClass(pck)); 357 builder.hier.addInherit(I1, I2); 358 builder.hier.addInherit(I2, I3); 359 builder.methodref = I1; 360 }, 361 /* Case 3: Inherit from super, skip static. 362 * 363 * I2[](res) 364 * I2[I3](stat) 365 * I1[I2]() = mref 366 */ 367 (final SelectionResolutionTestCase.Builder builder) -> { 368 final ClassData.Package pck = 369 builder.classdata.get(builder.expected).packageId; 370 final MethodData meth = 371 new MethodData(MethodData.Access.PUBLIC, 372 MethodData.Context.STATIC); 373 final ClassData withStatDef = new ClassData(pck, meth); 374 final int I3 = builder.expected; 375 final int I2 = builder.addInterface(withStatDef); 376 final int I1 = builder.addInterface(emptyClass(pck)); 377 builder.hier.addInherit(I1, I2); 378 builder.hier.addInherit(I2, I3); 379 builder.methodref = I1; 380 }, 381 /* Case 4: Maximally-specific. 382 * 383 * I3[](def) 384 * I2[I3](res) 385 * I1[I2]() = mref 386 */ 387 (final SelectionResolutionTestCase.Builder builder) -> { 388 final ClassData.Package pck = 389 builder.classdata.get(builder.expected).packageId; 390 final MethodData.Context ctx = 391 builder.classdata.get(builder.expected).methoddata.context; 392 final MethodData.Access acc = 393 builder.classdata.get(builder.expected).methoddata.access; 394 final MethodData mdata = getMethodData(acc, ctx); 395 final ClassData withDef = new ClassData(pck, mdata); 396 final int I3 = builder.addInterface(withDef); 397 final int I2 = builder.expected; 398 final int I1 = builder.addInterface(emptyClass(pck)); 399 builder.hier.addInherit(I1, I2); 400 builder.hier.addInherit(I2, I3); 401 builder.methodref = I1; 402 }, 403 /* Case 5: Diamond, expected at top. 404 * 405 * I4[](res) 406 * I2[I4](), I3[I4]() 407 * I1[I2,I3]() = mref 408 */ 409 (final SelectionResolutionTestCase.Builder builder) -> { 410 final ClassData.Package pck = 411 builder.classdata.get(builder.expected).packageId; 412 final int I4 = builder.expected; 413 final int I3 = builder.addInterface(emptyClass(pck)); 414 final int I2 = builder.addInterface(emptyClass(pck)); 415 final int I1 = builder.addInterface(emptyClass(pck)); 416 builder.hier.addInherit(I1, I2); 417 builder.hier.addInherit(I1, I3); 418 builder.hier.addInherit(I2, I4); 419 builder.hier.addInherit(I3, I4); 420 builder.methodref = I1; 421 }, 422 /* Case 6: Diamond, skip private. 423 * 424 * I4[](res) 425 * I2[I4](priv), I3[I4]() 426 * I1[I2,I3]() = mref 427 */ 428 (final SelectionResolutionTestCase.Builder builder) -> { 429 final ClassData.Package pck = 430 builder.classdata.get(builder.expected).packageId; 431 final MethodData.Context ctx = 432 builder.classdata.get(builder.expected).methoddata.context; 433 final MethodData.Access acc = 434 builder.classdata.get(builder.expected).methoddata.access; 435 final MethodData mdata = getMethodData(acc, ctx); 436 final MethodData meth = 437 new MethodData(MethodData.Access.PRIVATE, 438 MethodData.Context.INSTANCE); 439 final ClassData withPrivDef = new ClassData(pck, meth); 440 final int I4 = builder.expected; 441 final int I3 = builder.addInterface(emptyClass(pck)); 442 final int I2 = builder.addInterface(withPrivDef); 443 final int I1 = builder.addInterface(emptyClass(pck)); 444 builder.hier.addInherit(I1, I2); 445 builder.hier.addInherit(I1, I3); 446 builder.hier.addInherit(I2, I4); 447 builder.hier.addInherit(I3, I4); 448 builder.methodref = I1; 449 }, 450 /* Case 7: Diamond, skip static. 451 * 452 * I4[](res) 453 * I2[I4](stat), I3[I4]() 454 * I1[I2,I3]() = mref 455 */ 456 (final SelectionResolutionTestCase.Builder builder) -> { 457 final ClassData.Package pck = 458 builder.classdata.get(builder.expected).packageId; 459 final MethodData.Context ctx = 460 builder.classdata.get(builder.expected).methoddata.context; 461 final MethodData.Access acc = 462 builder.classdata.get(builder.expected).methoddata.access; 463 final MethodData mdata = getMethodData(acc, ctx); 464 final MethodData meth = 465 new MethodData(MethodData.Access.PUBLIC, 466 MethodData.Context.STATIC); 467 final ClassData withStatDef = new ClassData(pck, meth); 468 final int I4 = builder.expected; 469 final int I3 = builder.addInterface(emptyClass(pck)); 470 final int I2 = builder.addInterface(withStatDef); 471 final int I1 = builder.addInterface(emptyClass(pck)); 472 builder.hier.addInherit(I1, I2); 473 builder.hier.addInherit(I1, I3); 474 builder.hier.addInherit(I2, I4); 475 builder.hier.addInherit(I3, I4); 476 builder.methodref = I1; 477 }, 478 /* Case 8: Diamond, maximally-specific. 479 * 480 * I4[](def) 481 * I2[I4](res), I3[I4]() 482 * I1[I2,I3]() = mref 483 */ 484 (final SelectionResolutionTestCase.Builder builder) -> { 485 final ClassData.Package pck = 486 builder.classdata.get(builder.expected).packageId; 487 final MethodData.Context ctx = 488 builder.classdata.get(builder.expected).methoddata.context; 489 final MethodData.Access acc = 490 builder.classdata.get(builder.expected).methoddata.access; 491 final MethodData mdata = getMethodData(acc, ctx); 492 final ClassData withDef = new ClassData(pck, mdata); 493 final int I4 = builder.addInterface(withDef); 494 final int I3 = builder.addInterface(emptyClass(pck)); 495 final int I2 = builder.expected; 496 final int I1 = builder.addInterface(emptyClass(pck)); 497 builder.hier.addInherit(I1, I2); 498 builder.hier.addInherit(I1, I3); 499 builder.hier.addInherit(I2, I4); 500 builder.hier.addInherit(I3, I4); 501 builder.methodref = I1; 502 }, 503 /* Case 9: Diamond, maximally-specific, skipping private. 504 * 505 * I4[](def) 506 * I2[I4](res), I3[I4](priv) 507 * I1[I2,I3]() = mref 508 */ 509 (final SelectionResolutionTestCase.Builder builder) -> { 510 final ClassData.Package pck = 511 builder.classdata.get(builder.expected).packageId; 512 final MethodData.Context ctx = 513 builder.classdata.get(builder.expected).methoddata.context; 514 final MethodData.Access acc = 515 builder.classdata.get(builder.expected).methoddata.access; 516 final MethodData mdata = getMethodData(acc, ctx); 517 final ClassData withDef = new ClassData(pck, mdata); 518 final MethodData meth = 519 new MethodData(MethodData.Access.PRIVATE, 520 MethodData.Context.INSTANCE); 521 final ClassData withPrivDef = new ClassData(pck, meth); 522 final int I4 = builder.addInterface(withDef); 523 final int I3 = builder.addInterface(withPrivDef); 524 final int I2 = builder.expected; 525 final int I1 = builder.addInterface(emptyClass(pck)); 526 builder.hier.addInherit(I1, I2); 527 builder.hier.addInherit(I1, I3); 528 builder.hier.addInherit(I2, I4); 529 builder.hier.addInherit(I3, I4); 530 builder.methodref = I1; 531 }, 532 /* Case 10: Diamond, maximally-specific, skipping static. 533 * 534 * I4[](def) 535 * I2[I4](res), I3[I4](stat) 536 * I1[I2,I3]() = mref 537 */ 538 (final SelectionResolutionTestCase.Builder builder) -> { 539 final ClassData.Package pck = 540 builder.classdata.get(builder.expected).packageId; 541 final MethodData.Context ctx = 542 builder.classdata.get(builder.expected).methoddata.context; 543 final MethodData.Access acc = 544 builder.classdata.get(builder.expected).methoddata.access; 545 final MethodData mdata = getMethodData(acc, ctx); 546 final ClassData withDef = new ClassData(pck, mdata); 547 final MethodData meth = 548 new MethodData(MethodData.Access.PUBLIC, 549 MethodData.Context.STATIC); 550 final ClassData withStatDef = new ClassData(pck, meth); 551 final int I4 = builder.addInterface(withDef); 552 final int I3 = builder.addInterface(withStatDef); 553 final int I2 = builder.expected; 554 final int I1 = builder.addInterface(emptyClass(pck)); 555 builder.hier.addInherit(I1, I2); 556 builder.hier.addInherit(I1, I3); 557 builder.hier.addInherit(I2, I4); 558 builder.hier.addInherit(I3, I4); 559 builder.methodref = I1; 560 }); 561 562 public static final Template MethodrefNotEqualsExpectedIface = 563 new Template("MethodrefNotEqualsExpectedIface", 564 /* Case 1: Inherit from superinterface. 565 * 566 * I[](res) 567 * C[I]() = mref 568 */ 569 (final SelectionResolutionTestCase.Builder builder) -> { 570 final ClassData.Package pck = 571 builder.classdata.get(builder.expected).packageId; 572 final int I = builder.expected; 573 final int C = builder.addClass(emptyClass(pck)); 574 builder.hier.addInherit(C, I); 575 builder.methodref = C; 576 }, 577 /* Case 2: Diamond, expected at top. 578 * 579 * I3[](res) 580 * I1[I3](), I2[I3]() 581 * C[I1,I2]() = mref 582 */ 583 (final SelectionResolutionTestCase.Builder builder) -> { 584 final ClassData.Package pck = 585 builder.classdata.get(builder.expected).packageId; 586 final int I3 = builder.expected; 587 final int I2 = builder.addInterface(emptyClass(pck)); 588 final int I1 = builder.addInterface(emptyClass(pck)); 589 final int C = builder.addClass(emptyClass(pck)); 590 builder.hier.addInherit(C, I1); 591 builder.hier.addInherit(C, I2); 592 builder.hier.addInherit(I1, I3); 593 builder.hier.addInherit(I2, I3); 594 builder.methodref = C; 595 }, 596 /* Case 3: Diamond, skipping private. 597 * 598 * I3[](def) 599 * I1[I3](priv), I2[I3]() 600 * C[I1,I2]() = mref 601 */ 602 (final SelectionResolutionTestCase.Builder builder) -> { 603 final ClassData.Package pck = 604 builder.classdata.get(builder.expected).packageId; 605 final MethodData.Context ctx = 606 builder.classdata.get(builder.expected).methoddata.context; 607 final MethodData.Access acc = 608 builder.classdata.get(builder.expected).methoddata.access; 609 final MethodData meth = 610 new MethodData(MethodData.Access.PRIVATE, 611 MethodData.Context.INSTANCE); 612 final ClassData withPrivDef = new ClassData(pck, meth); 613 final int I3 = builder.expected; 614 final int I2 = builder.addInterface(emptyClass(pck)); 615 final int I1 = builder.addInterface(withPrivDef); 616 final int C = builder.addClass(emptyClass(pck)); 617 builder.hier.addInherit(C, I1); 618 builder.hier.addInherit(C, I2); 619 builder.hier.addInherit(I1, I3); 620 builder.hier.addInherit(I2, I3); 621 builder.methodref = C; 622 }, 623 /* Case 4: Diamond, skipping static. 624 * 625 * I3[](def) 626 * I1[I3](stat), I2[I3]() 627 * C[I1,I2]() = mref 628 */ 629 (final SelectionResolutionTestCase.Builder builder) -> { 630 final ClassData.Package pck = 631 builder.classdata.get(builder.expected).packageId; 632 final MethodData.Context ctx = 633 builder.classdata.get(builder.expected).methoddata.context; 634 final MethodData.Access acc = 635 builder.classdata.get(builder.expected).methoddata.access; 636 final MethodData meth = 637 new MethodData(MethodData.Access.PUBLIC, 638 MethodData.Context.STATIC); 639 final ClassData withStatDef = new ClassData(pck, meth); 640 final int I3 = builder.expected; 641 final int I2 = builder.addInterface(emptyClass(pck)); 642 final int I1 = builder.addInterface(withStatDef); 643 final int C = builder.addClass(emptyClass(pck)); 644 builder.hier.addInherit(C, I1); 645 builder.hier.addInherit(C, I2); 646 builder.hier.addInherit(I1, I3); 647 builder.hier.addInherit(I2, I3); 648 builder.methodref = C; 649 }, 650 /* Case 5: Diamond, maximally-specific. 651 * 652 * I3[](def) 653 * I1[I3](res), I2[I3]() 654 * C[I1,I2]() = mref 655 */ 656 (final SelectionResolutionTestCase.Builder builder) -> { 657 final ClassData.Package pck = 658 builder.classdata.get(builder.expected).packageId; 659 final MethodData.Context ctx = 660 builder.classdata.get(builder.expected).methoddata.context; 661 final MethodData.Access acc = 662 builder.classdata.get(builder.expected).methoddata.access; 663 final MethodData mdata = getMethodData(acc, ctx); 664 final ClassData withDef = new ClassData(pck, mdata); 665 final int I3 = builder.addInterface(withDef); 666 final int I2 = builder.addInterface(emptyClass(pck)); 667 final int I1 = builder.expected; 668 final int C = builder.addClass(emptyClass(pck)); 669 builder.hier.addInherit(C, I1); 670 builder.hier.addInherit(C, I2); 671 builder.hier.addInherit(I1, I3); 672 builder.hier.addInherit(I2, I3); 673 builder.methodref = C; 674 }, 675 /* Case 6: Diamond, maximally-specific, skipping private. 676 * 677 * I3[](def) 678 * I1[I3](res), I2[I3](priv) 679 * C[I1,I2]() = mref 680 */ 681 (final SelectionResolutionTestCase.Builder builder) -> { 682 final ClassData.Package pck = 683 builder.classdata.get(builder.expected).packageId; 684 final MethodData.Context ctx = 685 builder.classdata.get(builder.expected).methoddata.context; 686 final MethodData.Access acc = 687 builder.classdata.get(builder.expected).methoddata.access; 688 final MethodData mdata = getMethodData(acc, ctx); 689 final ClassData withDef = new ClassData(pck, mdata); 690 final MethodData meth = 691 new MethodData(MethodData.Access.PRIVATE, 692 MethodData.Context.INSTANCE); 693 final ClassData withPrivDef = new ClassData(pck, meth); 694 final int I3 = builder.addInterface(withDef); 695 final int I2 = builder.addInterface(withPrivDef); 696 final int I1 = builder.expected; 697 final int C = builder.addClass(emptyClass(pck)); 698 builder.hier.addInherit(C, I1); 699 builder.hier.addInherit(C, I2); 700 builder.hier.addInherit(I1, I3); 701 builder.hier.addInherit(I2, I3); 702 builder.methodref = C; 703 }, 704 /* Case 7: Diamond, maximally-specific, skipping static. 705 * 706 * I3[](def) 707 * I1[I3](res), I2[I3](stat) 708 * C[I1,I2]() = mref 709 */ 710 (final SelectionResolutionTestCase.Builder builder) -> { 711 final ClassData.Package pck = 712 builder.classdata.get(builder.expected).packageId; 713 final MethodData.Context ctx = 714 builder.classdata.get(builder.expected).methoddata.context; 715 final MethodData.Access acc = 716 builder.classdata.get(builder.expected).methoddata.access; 717 final MethodData mdata = getMethodData(acc, ctx); 718 final ClassData withDef = new ClassData(pck, mdata); 719 final MethodData meth = 720 new MethodData(MethodData.Access.PUBLIC, 721 MethodData.Context.STATIC); 722 final ClassData withStatDef = new ClassData(pck, meth); 723 final int I3 = builder.addInterface(withDef); 724 final int I2 = builder.addInterface(withStatDef); 725 final int I1 = builder.expected; 726 final int C = builder.addClass(emptyClass(pck)); 727 builder.hier.addInherit(C, I1); 728 builder.hier.addInherit(C, I2); 729 builder.hier.addInherit(I1, I3); 730 builder.hier.addInherit(I2, I3); 731 builder.methodref = C; 732 }, 733 /* Case 8: Diamond, with superclass, expected at top. 734 * 735 * I2[](res) 736 * C2[I2](), I1[I2]() 737 * C1[I1,C2]() = mref 738 */ 739 (final SelectionResolutionTestCase.Builder builder) -> { 740 final ClassData.Package pck = 741 builder.classdata.get(builder.expected).packageId; 742 final int I2 = builder.expected; 743 final int I1 = builder.addInterface(emptyClass(pck)); 744 final int C2 = builder.addInterface(emptyClass(pck)); 745 final int C1 = builder.addClass(emptyClass(pck)); 746 builder.hier.addInherit(C1, I1); 747 builder.hier.addInherit(C1, C2); 748 builder.hier.addInherit(I1, I2); 749 builder.hier.addInherit(C2, I2); 750 builder.methodref = C1; 751 }, 752 /* Case 9: Diamond with superclass, maximally-specific. 753 * 754 * I2[](def) 755 * C2[I2](), I1[I2](res), 756 * C1[I1,C2]() = mref 757 */ 758 (final SelectionResolutionTestCase.Builder builder) -> { 759 final ClassData.Package pck = 760 builder.classdata.get(builder.expected).packageId; 761 final MethodData.Context ctx = 762 builder.classdata.get(builder.expected).methoddata.context; 763 final MethodData.Access acc = 764 builder.classdata.get(builder.expected).methoddata.access; 765 final MethodData mdata = getMethodData(acc, ctx); 766 final ClassData withDef = new ClassData(pck, mdata); 767 final int I2 = builder.addInterface(withDef); 768 final int C2 = builder.addClass(emptyClass(pck)); 769 final int I1 = builder.expected; 770 final int C1 = builder.addClass(emptyClass(pck)); 771 builder.hier.addInherit(C1, I1); 772 builder.hier.addInherit(C1, C2); 773 builder.hier.addInherit(I1, I2); 774 builder.hier.addInherit(C2, I2); 775 builder.methodref = C1; 776 }, 777 /* Case 10: Inherit through superclass. 778 * 779 * I[](res) 780 * C2[I]() 781 * C1[C2]() = mref 782 */ 783 (final SelectionResolutionTestCase.Builder builder) -> { 784 final ClassData.Package pck = 785 builder.classdata.get(builder.expected).packageId; 786 final int I = builder.expected; 787 final int C2 = builder.addInterface(emptyClass(pck)); 788 final int C1 = builder.addClass(emptyClass(pck)); 789 builder.hier.addInherit(C1, I); 790 builder.hier.addInherit(C1, C2); 791 builder.hier.addInherit(C2, I); 792 builder.methodref = C1; 793 }, 794 /* Case 11: Diamond, inherit through superclass, 795 * expected at top. 796 * 797 * I3[](res) 798 * I1[I3](), I2[I3]() 799 * C2[I1,I2]() 800 * C1[C2]() = mref 801 */ 802 (final SelectionResolutionTestCase.Builder builder) -> { 803 final ClassData.Package pck = 804 builder.classdata.get(builder.expected).packageId; 805 final int I3 = builder.expected; 806 final int I2 = builder.addInterface(emptyClass(pck)); 807 final int I1 = builder.addInterface(emptyClass(pck)); 808 final int C2 = builder.addClass(emptyClass(pck)); 809 final int C1 = builder.addClass(emptyClass(pck)); 810 builder.hier.addInherit(C2, I1); 811 builder.hier.addInherit(C2, I2); 812 builder.hier.addInherit(I1, I3); 813 builder.hier.addInherit(I2, I3); 814 builder.hier.addInherit(C1, C2); 815 builder.methodref = C1; 816 }, 817 /* Case 12: Diamond through superclass, skip private. 818 * 819 * I3[](res) 820 * I1[I3](priv), I2[I3]() 821 * C2[I1,I2]() 822 * C1[C2]() = mref 823 */ 824 (final SelectionResolutionTestCase.Builder builder) -> { 825 final ClassData.Package pck = 826 builder.classdata.get(builder.expected).packageId; 827 final MethodData.Context ctx = 828 builder.classdata.get(builder.expected).methoddata.context; 829 final MethodData.Access acc = 830 builder.classdata.get(builder.expected).methoddata.access; 831 final MethodData mdata = getMethodData(acc, ctx); 832 final ClassData withDef = new ClassData(pck, mdata); 833 final MethodData meth = 834 new MethodData(MethodData.Access.PRIVATE, 835 MethodData.Context.INSTANCE); 836 final ClassData withPrivDef = new ClassData(pck, meth); 837 final int I3 = builder.expected; 838 final int I2 = builder.addInterface(emptyClass(pck)); 839 final int I1 = builder.addInterface(withPrivDef); 840 final int C2 = builder.addClass(emptyClass(pck)); 841 final int C1 = builder.addClass(emptyClass(pck)); 842 builder.hier.addInherit(C2, I1); 843 builder.hier.addInherit(C2, I2); 844 builder.hier.addInherit(I1, I3); 845 builder.hier.addInherit(I2, I3); 846 builder.hier.addInherit(C1, C2); 847 builder.methodref = C1; 848 }, 849 /* Case 13: Diamond through superclass, skip static. 850 * 851 * I3[](def) 852 * I1[I3](stat), I2[I3]() 853 * C2[I1,I2]() 854 * C1[C2]() = mref 855 */ 856 (final SelectionResolutionTestCase.Builder builder) -> { 857 final ClassData.Package pck = 858 builder.classdata.get(builder.expected).packageId; 859 final MethodData.Context ctx = 860 builder.classdata.get(builder.expected).methoddata.context; 861 final MethodData.Access acc = 862 builder.classdata.get(builder.expected).methoddata.access; 863 final MethodData mdata = getMethodData(acc, ctx); 864 final ClassData withDef = new ClassData(pck, mdata); 865 final MethodData meth = 866 new MethodData(MethodData.Access.PUBLIC, 867 MethodData.Context.STATIC); 868 final ClassData withStatDef = new ClassData(pck, meth); 869 final int I3 = builder.expected; 870 final int I2 = builder.addInterface(emptyClass(pck)); 871 final int I1 = builder.addInterface(withStatDef); 872 final int C2 = builder.addClass(emptyClass(pck)); 873 final int C1 = builder.addClass(emptyClass(pck)); 874 builder.hier.addInherit(C2, I1); 875 builder.hier.addInherit(C2, I2); 876 builder.hier.addInherit(I1, I3); 877 builder.hier.addInherit(I2, I3); 878 builder.hier.addInherit(C1, C2); 879 builder.methodref = C1; 880 }, 881 /* Case 14: Diamond through superclass, maximally-specific. 882 * 883 * I3[](def) 884 * I1[I3](res), I2[I3]() 885 * C2[I1,I2]() 886 * C1[C2]() = mref 887 */ 888 (final SelectionResolutionTestCase.Builder builder) -> { 889 final ClassData.Package pck = 890 builder.classdata.get(builder.expected).packageId; 891 final MethodData.Context ctx = 892 builder.classdata.get(builder.expected).methoddata.context; 893 final MethodData.Access acc = 894 builder.classdata.get(builder.expected).methoddata.access; 895 final MethodData mdata = getMethodData(acc, ctx); 896 final ClassData withDef = new ClassData(pck, mdata); 897 final int I3 = builder.addInterface(withDef); 898 final int I2 = builder.addInterface(emptyClass(pck)); 899 final int I1 = builder.expected; 900 final int C2 = builder.addClass(emptyClass(pck)); 901 final int C1 = builder.addClass(emptyClass(pck)); 902 builder.hier.addInherit(C2, I1); 903 builder.hier.addInherit(C2, I2); 904 builder.hier.addInherit(I1, I3); 905 builder.hier.addInherit(I2, I3); 906 builder.hier.addInherit(C1, C2); 907 builder.methodref = C1; 908 }, 909 /* Case 15: Diamond through superclass, 910 * maximally-specific, skip private. 911 * 912 * I3[](def) 913 * I1[I3](res), I2[I3](priv) 914 * C2[I1,I2]() 915 * C1[C2]() = mref 916 */ 917 (final SelectionResolutionTestCase.Builder builder) -> { 918 final ClassData.Package pck = 919 builder.classdata.get(builder.expected).packageId; 920 final MethodData.Context ctx = 921 builder.classdata.get(builder.expected).methoddata.context; 922 final MethodData.Access acc = 923 builder.classdata.get(builder.expected).methoddata.access; 924 final MethodData mdata = getMethodData(acc, ctx); 925 final ClassData withDef = new ClassData(pck, mdata); 926 final MethodData meth = 927 new MethodData(MethodData.Access.PRIVATE, 928 MethodData.Context.INSTANCE); 929 final ClassData withPrivDef = new ClassData(pck, meth); 930 final int I3 = builder.addInterface(withDef); 931 final int I2 = builder.addInterface(withPrivDef); 932 final int I1 = builder.expected; 933 final int C2 = builder.addClass(emptyClass(pck)); 934 final int C1 = builder.addClass(emptyClass(pck)); 935 builder.hier.addInherit(C2, I1); 936 builder.hier.addInherit(C2, I2); 937 builder.hier.addInherit(I1, I3); 938 builder.hier.addInherit(I2, I3); 939 builder.hier.addInherit(C1, C2); 940 builder.methodref = C1; 941 }, 942 /* Case 16: Diamond through superclass, 943 * maximally-specific, skip static. 944 * 945 * I3[](pub) 946 * I1[I3](res), I2[I3](stat) 947 * C2[I1,I2]() 948 * C1[C2]() = mref 949 */ 950 (final SelectionResolutionTestCase.Builder builder) -> { 951 final ClassData.Package pck = 952 builder.classdata.get(builder.expected).packageId; 953 final MethodData.Context ctx = 954 builder.classdata.get(builder.expected).methoddata.context; 955 final MethodData.Access acc = 956 builder.classdata.get(builder.expected).methoddata.access; 957 final MethodData mdata = getMethodData(acc, ctx); 958 final ClassData withDef = new ClassData(pck, mdata); 959 final MethodData meth = 960 new MethodData(MethodData.Access.PUBLIC, 961 MethodData.Context.STATIC); 962 final ClassData withStatDef = new ClassData(pck, meth); 963 final int I3 = builder.addInterface(withDef); 964 final int I2 = builder.addInterface(withStatDef); 965 final int I1 = builder.expected; 966 final int C2 = builder.addClass(emptyClass(pck)); 967 final int C1 = builder.addClass(emptyClass(pck)); 968 builder.hier.addInherit(C2, I1); 969 builder.hier.addInherit(C2, I2); 970 builder.hier.addInherit(I1, I3); 971 builder.hier.addInherit(I2, I3); 972 builder.hier.addInherit(C1, C2); 973 builder.methodref = C1; 974 }, 975 /* Case 17: Diamond, with superclass, inherit through 976 * superclass, expected at top. 977 * 978 * I2[](res) 979 * C3[I2](), I1[I2]() 980 * C2[I1,C3]() 981 * C1[C2]() = mref 982 */ 983 (final SelectionResolutionTestCase.Builder builder) -> { 984 final ClassData.Package pck = 985 builder.classdata.get(builder.expected).packageId; 986 final int I2 = builder.expected; 987 final int I1 = builder.addInterface(emptyClass(pck)); 988 final int C3 = builder.addInterface(emptyClass(pck)); 989 final int C2 = builder.addClass(emptyClass(pck)); 990 final int C1 = builder.addClass(emptyClass(pck)); 991 builder.hier.addInherit(C2, I1); 992 builder.hier.addInherit(C2, C3); 993 builder.hier.addInherit(I1, I2); 994 builder.hier.addInherit(C3, I2); 995 builder.hier.addInherit(C1, C2); 996 builder.methodref = C1; 997 }, 998 /* Case 18: Diamond, with superclass, inherit through 999 * superclass, maximally-specific. 1000 * 1001 * I2[](def) 1002 * C3[I2](), I1[I2](res), 1003 * C2[I1,C3]() 1004 * C1[I1,C2]() = mref 1005 */ 1006 (final SelectionResolutionTestCase.Builder builder) -> { 1007 final ClassData.Package pck = 1008 builder.classdata.get(builder.expected).packageId; 1009 final MethodData.Context ctx = 1010 builder.classdata.get(builder.expected).methoddata.context; 1011 final MethodData.Access acc = 1012 builder.classdata.get(builder.expected).methoddata.access; 1013 final MethodData mdata = getMethodData(acc, ctx); 1014 final ClassData withDef = new ClassData(pck, mdata); 1015 final int I2 = builder.addInterface(withDef); 1016 final int C3 = builder.addClass(emptyClass(pck)); 1017 final int I1 = builder.expected; 1018 final int C2 = builder.addClass(emptyClass(pck)); 1019 final int C1 = builder.addClass(emptyClass(pck)); 1020 builder.hier.addInherit(C2, I1); 1021 builder.hier.addInherit(C2, C3); 1022 builder.hier.addInherit(I1, I2); 1023 builder.hier.addInherit(C3, I2); 1024 builder.hier.addInherit(C1, C2); 1025 builder.methodref = C1; 1026 }); 1027 1028 public static final Template IfaceMethodrefAmbiguous = 1029 new Template("IfaceMethodrefAmbiguous", 1030 /* Ambiguous. 1031 * 1032 * I2[](def), I3[](def) 1033 * I1[I2]() = mref 1034 */ 1035 (final SelectionResolutionTestCase.Builder builder) -> { 1036 final ClassData.Package pck = 1037 builder.classdata.get(builder.expected).packageId; 1038 final ClassData expected = 1039 builder.classdata.get(builder.expected); 1040 final int I3 = builder.addInterface(expected); 1041 final int I2 = builder.expected; 1042 final int I1 = builder.addInterface(emptyClass(pck)); 1043 builder.hier.addInherit(I1, I2); 1044 builder.hier.addInherit(I1, I3); 1045 builder.methodref = I1; 1046 }); 1047 1048 public static final Template MethodrefAmbiguous = 1049 new Template("MethodrefAmbiguous", 1050 /* Ambiguous. 1051 * 1052 * I1[](def), I2[](def) 1053 * C[I2]() = mref 1054 */ 1055 (final SelectionResolutionTestCase.Builder builder) -> { 1056 final ClassData.Package pck = 1057 builder.classdata.get(builder.expected).packageId; 1058 final ClassData expected = 1059 builder.classdata.get(builder.expected); 1060 final int I1 = builder.addInterface(expected); 1061 final int I2 = builder.expected; 1062 final int C = builder.addClass(emptyClass(pck)); 1063 builder.hier.addInherit(C, I2); 1064 builder.hier.addInherit(C, I1); 1065 builder.methodref = C; 1066 }); 1067 1068 /****************************** 1069 * Callsite Templates * 1070 ******************************/ 1071 1072 public static final Template AllCallsiteCases = 1073 new Template("AllCallsiteCases", 1074 Template::callsiteIsMethodref, 1075 Template::callsiteSubclassMethodref, 1076 Template::callsiteUnrelatedMethodref); 1077 1078 public static final Template InvokespecialCallsiteCases = 1079 new Template("InvokespecialCallsiteCases", 1080 Template::callsiteIsMethodref, 1081 Template::callsiteSubclassMethodref); 1082 1083 public static final Template CallsiteEqualsMethodref = 1084 new Template("CallsiteEqualsMethodref", 1085 Template::callsiteIsMethodref); 1086 1087 public static final Template CallsiteSubclassMethodref = 1088 new Template("CallsiteSubclassMethodref", 1089 Template::callsiteSubclassMethodref); 1090 1091 public static final Template CallsiteUnrelatedToMethodref = 1092 new Template("CallsiteUnrelatedToMethodref", 1093 Template::callsiteUnrelatedMethodref); 1094 1095 public static final Template CallsiteNotEqualsMethodref = 1096 new Template("CallsiteNotEqualsMethodref", 1097 Template::callsiteSubclassMethodref, 1098 Template::callsiteUnrelatedMethodref); 1099 1100 /********************************* 1101 * AbstractMethodError Templates * 1102 *********************************/ 1103 1104 public static final Template ReabstractExpectedIface = 1105 new Template("ReabstractExpectedIface", 1106 (builder) -> {}, 1107 (final SelectionResolutionTestCase.Builder builder) -> { 1108 final ClassData expected = 1109 builder.classdata.get(builder.expected); 1110 final ClassData.Package pck = expected.packageId; 1111 final MethodData.Access acc = 1112 builder.classdata.get(builder.expected).methoddata.access; 1113 final MethodData mdata = 1114 getMethodData(acc, MethodData.Context.STATIC); 1115 final ClassData withDef = new ClassData(pck, mdata); 1116 final int C2 = builder.addInterface(withDef); 1117 final int C1 = builder.expected; 1118 builder.hier.addInherit(C1, C2); 1119 }, 1120 (final SelectionResolutionTestCase.Builder builder) -> { 1121 final ClassData expected = 1122 builder.classdata.get(builder.expected); 1123 final ClassData.Package pck = expected.packageId; 1124 final MethodData.Access acc = 1125 builder.classdata.get(builder.expected).methoddata.access; 1126 final MethodData mdata = 1127 getMethodData(acc, MethodData.Context.INSTANCE); 1128 final ClassData withDef = new ClassData(pck, mdata); 1129 final int C2 = builder.addInterface(withDef); 1130 final int C1 = builder.expected; 1131 builder.hier.addInherit(C1, C2); 1132 }); 1133 1134 public static final Template ReabstractExpectedClass = 1135 new Template("ReabstractExpectedClass", 1136 ReabstractExpectedIface, 1137 (final SelectionResolutionTestCase.Builder builder) -> { 1138 final ClassData expected = 1139 builder.classdata.get(builder.expected); 1140 final ClassData.Package pck = expected.packageId; 1141 final MethodData.Access acc = 1142 builder.classdata.get(builder.expected).methoddata.access; 1143 final MethodData mdata = 1144 getMethodData(acc, MethodData.Context.STATIC); 1145 final ClassData withDef = new ClassData(pck, mdata); 1146 final int C2 = builder.addClass(withDef); 1147 final int C1 = builder.expected; 1148 builder.hier.addInherit(C1, C2); 1149 }, 1150 (final SelectionResolutionTestCase.Builder builder) -> { 1151 final ClassData expected = 1152 builder.classdata.get(builder.expected); 1153 final ClassData.Package pck = expected.packageId; 1154 final MethodData.Access acc = 1155 builder.classdata.get(builder.expected).methoddata.access; 1156 final MethodData mdata = 1157 getMethodData(acc, MethodData.Context.INSTANCE); 1158 final ClassData withDef = new ClassData(pck, mdata); 1159 final int C2 = builder.addClass(withDef); 1160 final int C1 = builder.expected; 1161 builder.hier.addInherit(C1, C2); 1162 }); 1163 1164 public static final Template ReabstractMethodrefResolvedClass = 1165 new Template("ReabstractMethodrefResolvedClass", 1166 /* Case 1: Objectref overrides. 1167 * 1168 * C2[](*) = mref 1169 * C1[C2](res) = oref = expected 1170 */ 1171 (final SelectionResolutionTestCase.Builder builder) -> { 1172 final ClassData.Package pck = 1173 builder.classdata.get(builder.methodref).packageId; 1174 final ClassData oldexpected = 1175 builder.classdata.get(builder.expected); 1176 final MethodData.Access acc = 1177 builder.classdata.get(builder.expected).methoddata.access; 1178 final ClassData withDef = 1179 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1180 final int C2 = builder.methodref; 1181 final int C1 = builder.addClass(withDef); 1182 builder.hier.addInherit(C1, C2); 1183 builder.objectref = C1; 1184 builder.expected = C1; 1185 }, 1186 /* Case 2: Objectref's super overrides. 1187 * 1188 * C3[*](*) = mref 1189 * C2[C3](res) = expected 1190 * C1[C2]() = oref 1191 */ 1192 (final SelectionResolutionTestCase.Builder builder) -> { 1193 final ClassData.Package pck = 1194 builder.classdata.get(builder.methodref).packageId; 1195 final ClassData oldexpected = 1196 builder.classdata.get(builder.expected); 1197 final MethodData.Access acc = 1198 builder.classdata.get(builder.expected).methoddata.access; 1199 final ClassData withDef = 1200 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1201 final int C3 = builder.methodref; 1202 final int C2 = builder.addClass(withDef); 1203 final int C1 = builder.addClass(emptyClass(pck)); 1204 builder.hier.addInherit(C2, C3); 1205 builder.hier.addInherit(C1, C2); 1206 builder.objectref = C1; 1207 builder.expected = C2; 1208 }, 1209 /* Case 3: Objectref's super overrides, skip private. 1210 * 1211 * C3[*](*) = mref 1212 * C2[C3](res) = expected 1213 * C1[C2](priv) = oref 1214 */ 1215 (final SelectionResolutionTestCase.Builder builder) -> { 1216 final ClassData.Package pck = 1217 builder.classdata.get(builder.methodref).packageId; 1218 final ClassData oldexpected = 1219 builder.classdata.get(builder.expected); 1220 final MethodData.Access acc = 1221 builder.classdata.get(builder.expected).methoddata.access; 1222 final ClassData withDef = 1223 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1224 final MethodData meth = 1225 new MethodData(MethodData.Access.PRIVATE, 1226 MethodData.Context.INSTANCE); 1227 final ClassData withPrivDef = new ClassData(pck, meth); 1228 final int C3 = builder.methodref; 1229 final int C2 = builder.addClass(withDef); 1230 final int C1 = builder.addClass(withPrivDef); 1231 builder.hier.addInherit(C2, C3); 1232 builder.hier.addInherit(C1, C2); 1233 builder.objectref = C1; 1234 builder.expected = C2; 1235 }, 1236 /* Case 4: Objectref's super overrides, skip static. 1237 * 1238 * C3[*](*) = mref 1239 * C2[C3](res) = expected 1240 * C1[C2](stat) = oref 1241 */ 1242 (final SelectionResolutionTestCase.Builder builder) -> { 1243 final ClassData.Package pck = 1244 builder.classdata.get(builder.methodref).packageId; 1245 final ClassData oldexpected = 1246 builder.classdata.get(builder.expected); 1247 final MethodData.Access acc = 1248 builder.classdata.get(builder.expected).methoddata.access; 1249 final ClassData withDef = 1250 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1251 final MethodData meth = 1252 new MethodData(MethodData.Access.PUBLIC, 1253 MethodData.Context.STATIC); 1254 final ClassData withStatDef = new ClassData(pck, meth); 1255 final int C3 = builder.methodref; 1256 final int C2 = builder.addClass(withDef); 1257 final int C1 = builder.addClass(withStatDef); 1258 builder.hier.addInherit(C2, C3); 1259 builder.hier.addInherit(C1, C2); 1260 builder.objectref = C1; 1261 builder.expected = C2; 1262 }); 1263 1264 public static final Template ReabstractMethodrefResolvedIface = 1265 new Template("ReabstractMethodrefResolvedIface", 1266 /* Case 1: Objectref overrides. 1267 * 1268 * C2[](*) = mref 1269 * C1[C2](res) = oref = expected 1270 */ 1271 (final SelectionResolutionTestCase.Builder builder) -> { 1272 final ClassData.Package pck = 1273 builder.classdata.get(builder.methodref).packageId; 1274 final ClassData oldexpected = 1275 builder.classdata.get(builder.expected); 1276 final MethodData.Access acc = 1277 builder.classdata.get(builder.expected).methoddata.access; 1278 final ClassData withDef = 1279 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1280 final int C2 = builder.methodref; 1281 final int C1 = builder.addClass(withDef); 1282 builder.hier.addInherit(C1, C2); 1283 builder.objectref = C1; 1284 builder.expected = C1; 1285 }, 1286 /* Case 2: Objectref's super overrides. 1287 * 1288 * C3[](*) = mref 1289 * C2[C3](res) = expected 1290 * C1[C2]() = oref 1291 */ 1292 (final SelectionResolutionTestCase.Builder builder) -> { 1293 final ClassData.Package pck = 1294 builder.classdata.get(builder.methodref).packageId; 1295 final ClassData oldexpected = 1296 builder.classdata.get(builder.expected); 1297 final MethodData.Access acc = 1298 builder.classdata.get(builder.expected).methoddata.access; 1299 final ClassData withDef = 1300 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1301 final int C3 = builder.methodref; 1302 final int C2 = builder.addClass(withDef); 1303 final int C1 = builder.addClass(emptyClass(pck)); 1304 builder.hier.addInherit(C2, C3); 1305 builder.hier.addInherit(C1, C2); 1306 builder.objectref = C1; 1307 builder.expected = C2; 1308 }, 1309 /* Case 3: Objectref's super overrides, skip private. 1310 * 1311 * C3[*](*) = mref 1312 * C2[C3](res) = expected 1313 * C1[C2](priv) = oref 1314 */ 1315 (final SelectionResolutionTestCase.Builder builder) -> { 1316 final ClassData.Package pck = 1317 builder.classdata.get(builder.methodref).packageId; 1318 final ClassData oldexpected = 1319 builder.classdata.get(builder.expected); 1320 final MethodData.Access acc = 1321 builder.classdata.get(builder.expected).methoddata.access; 1322 final ClassData withDef = 1323 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1324 final MethodData meth = 1325 new MethodData(MethodData.Access.PRIVATE, 1326 MethodData.Context.INSTANCE); 1327 final ClassData withPrivDef = new ClassData(pck, meth); 1328 final int C3 = builder.methodref; 1329 final int C2 = builder.addClass(withDef); 1330 final int C1 = builder.addClass(withPrivDef); 1331 builder.hier.addInherit(C2, C3); 1332 builder.hier.addInherit(C1, C2); 1333 builder.objectref = C1; 1334 builder.expected = C2; 1335 }, 1336 /* Case 4: Objectref's super overrides, skip static. 1337 * 1338 * C3[*](*) = mref 1339 * C2[C3](res) = expected 1340 * C1[C2](stat) = oref 1341 */ 1342 (final SelectionResolutionTestCase.Builder builder) -> { 1343 final ClassData.Package pck = 1344 builder.classdata.get(builder.methodref).packageId; 1345 final ClassData oldexpected = 1346 builder.classdata.get(builder.expected); 1347 final MethodData.Access acc = 1348 builder.classdata.get(builder.expected).methoddata.access; 1349 final ClassData withDef = 1350 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1351 final MethodData meth = 1352 new MethodData(MethodData.Access.PUBLIC, 1353 MethodData.Context.STATIC); 1354 final ClassData withStatDef = new ClassData(pck, meth); 1355 final int C3 = builder.methodref; 1356 final int C2 = builder.addClass(withDef); 1357 final int C1 = builder.addClass(withStatDef); 1358 builder.hier.addInherit(C2, C3); 1359 builder.hier.addInherit(C1, C2); 1360 builder.objectref = C1; 1361 builder.expected = C2; 1362 }, 1363 /* Case 5: Overlapping with new interface overriding. 1364 * 1365 * I2[*](def) = old expected 1366 * C2[*](*) = mref, I1[I2](res) = expected 1367 * C1[C2,I2]() = oref 1368 */ 1369 (final SelectionResolutionTestCase.Builder builder) -> { 1370 final ClassData.Package pck = 1371 builder.classdata.get(builder.methodref).packageId; 1372 final ClassData oldexpected = 1373 builder.classdata.get(builder.expected); 1374 final MethodData.Access acc = 1375 builder.classdata.get(builder.expected).methoddata.access; 1376 final ClassData withDef = 1377 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1378 final int C2 = builder.methodref; 1379 final int I2 = builder.expected; 1380 final int I1 = builder.addInterface(withDef); 1381 final int C1 = builder.addClass(emptyClass(pck)); 1382 builder.hier.addInherit(C1, C2); 1383 builder.hier.addInherit(C1, I1); 1384 builder.hier.addInherit(I1, I2); 1385 builder.objectref = C1; 1386 builder.expected = I1; 1387 }, 1388 /* Case 6: Overlapping with new interface, skip private. 1389 * 1390 * I2[*](def) = old expected 1391 * C2[*](*) = mref, I1[I2](res) = expected 1392 * C1[C2,I2](priv) = oref 1393 */ 1394 (final SelectionResolutionTestCase.Builder builder) -> { 1395 final ClassData.Package pck = 1396 builder.classdata.get(builder.methodref).packageId; 1397 final ClassData oldexpected = 1398 builder.classdata.get(builder.expected); 1399 final MethodData.Access acc = 1400 builder.classdata.get(builder.expected).methoddata.access; 1401 final ClassData withDef = 1402 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1403 final MethodData meth = 1404 new MethodData(MethodData.Access.PRIVATE, 1405 MethodData.Context.INSTANCE); 1406 final ClassData withPrivDef = new ClassData(pck, meth); 1407 final int C2 = builder.methodref; 1408 final int I2 = builder.expected; 1409 final int I1 = builder.addInterface(withDef); 1410 final int C1 = builder.addClass(withPrivDef); 1411 builder.hier.addInherit(C1, C2); 1412 builder.hier.addInherit(C1, I1); 1413 builder.hier.addInherit(I1, I2); 1414 builder.objectref = C1; 1415 builder.expected = I1; 1416 }, 1417 /* Case 7: Overlapping with new interface, skip static. 1418 * 1419 * I2[*](def) = old expected 1420 * C2[*](*) = mref, I1[I2](res) = expected 1421 * C1[C2,I2](stat) = oref 1422 */ 1423 (final SelectionResolutionTestCase.Builder builder) -> { 1424 final ClassData.Package pck = 1425 builder.classdata.get(builder.methodref).packageId; 1426 final ClassData oldexpected = 1427 builder.classdata.get(builder.expected); 1428 final MethodData.Access acc = 1429 builder.classdata.get(builder.expected).methoddata.access; 1430 final ClassData withDef = 1431 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1432 final MethodData meth = 1433 new MethodData(MethodData.Access.PUBLIC, 1434 MethodData.Context.STATIC); 1435 final ClassData withStatDef = new ClassData(pck, meth); 1436 final int C2 = builder.methodref; 1437 final int I2 = builder.expected; 1438 final int I1 = builder.addInterface(withDef); 1439 final int C1 = builder.addClass(withStatDef); 1440 builder.hier.addInherit(C1, C2); 1441 builder.hier.addInherit(C1, I1); 1442 builder.hier.addInherit(I1, I2); 1443 builder.objectref = C1; 1444 builder.expected = I1; 1445 }, 1446 /* Case 8: Overlap with objectref's super with new 1447 * interface overriding, inherit through class. 1448 * 1449 * I2[*](def) = old expected 1450 * C3[](*) = mref, I1[I2](res) = expected 1451 * C2[C3,I1]() 1452 * C1[C2]() = oref 1453 */ 1454 (final SelectionResolutionTestCase.Builder builder) -> { 1455 final ClassData.Package pck = 1456 builder.classdata.get(builder.methodref).packageId; 1457 final ClassData oldexpected = 1458 builder.classdata.get(builder.expected); 1459 final MethodData.Access acc = 1460 builder.classdata.get(builder.expected).methoddata.access; 1461 final ClassData withDef = 1462 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1463 final int C3 = builder.methodref; 1464 final int C2 = builder.addClass(emptyClass(pck)); 1465 final int I2 = builder.expected; 1466 final int I1 = builder.addInterface(withDef); 1467 final int C1 = builder.addClass(emptyClass(pck)); 1468 builder.hier.addInherit(C2, C3); 1469 builder.hier.addInherit(C1, C2); 1470 builder.hier.addInherit(C2, I1); 1471 builder.hier.addInherit(I1, I2); 1472 builder.objectref = C1; 1473 builder.expected = I1; 1474 }, 1475 /* Case 9: Overlap with objectref's super with new 1476 * interface double diamond, overriding. 1477 * 1478 * I3[*](def) = old expected 1479 * C3[](*) = mref, I2[I3](def) 1480 * C2[C3,I2](), I1[I2](res) = expected 1481 * C1[C2,I1]() = oref 1482 */ 1483 (final SelectionResolutionTestCase.Builder builder) -> { 1484 final ClassData.Package pck = 1485 builder.classdata.get(builder.methodref).packageId; 1486 final ClassData oldexpected = 1487 builder.classdata.get(builder.expected); 1488 final MethodData.Access acc = 1489 builder.classdata.get(builder.expected).methoddata.access; 1490 final ClassData withDef = 1491 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1492 final int C3 = builder.methodref; 1493 final int C2 = builder.addClass(emptyClass(pck)); 1494 final int I3 = builder.expected; 1495 final int I2 = builder.addInterface(withDef); 1496 final int I1 = builder.addInterface(withDef); 1497 final int C1 = builder.addClass(emptyClass(pck)); 1498 builder.hier.addInherit(C2, C3); 1499 builder.hier.addInherit(C1, C2); 1500 builder.hier.addInherit(C1, I1); 1501 builder.hier.addInherit(C2, I2); 1502 builder.hier.addInherit(I1, I2); 1503 builder.hier.addInherit(I2, I3); 1504 builder.objectref = C1; 1505 builder.expected = I1; 1506 }, 1507 /* Case 10: Overlap with objectref's super with new 1508 * interface double diamond, skip private. 1509 * 1510 * I3[*](def) = old expected 1511 * C3[](*) = mref, I2[I3](res) = expected 1512 * C2[C3,I2](), I1[I2](priv) 1513 * C1[C2,I1]() = oref 1514 */ 1515 (final SelectionResolutionTestCase.Builder builder) -> { 1516 final ClassData.Package pck = 1517 builder.classdata.get(builder.methodref).packageId; 1518 final ClassData oldexpected = 1519 builder.classdata.get(builder.expected); 1520 final MethodData.Access acc = 1521 builder.classdata.get(builder.expected).methoddata.access; 1522 final ClassData withDef = 1523 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1524 final MethodData meth = 1525 new MethodData(MethodData.Access.PRIVATE, 1526 MethodData.Context.INSTANCE); 1527 final ClassData withPrivDef = new ClassData(pck, meth); 1528 final int C3 = builder.methodref; 1529 final int C2 = builder.addClass(emptyClass(pck)); 1530 final int I3 = builder.expected; 1531 final int I2 = builder.addInterface(withDef); 1532 final int I1 = builder.addInterface(withPrivDef); 1533 final int C1 = builder.addClass(emptyClass(pck)); 1534 builder.hier.addInherit(C2, C3); 1535 builder.hier.addInherit(C1, C2); 1536 builder.hier.addInherit(C1, I1); 1537 builder.hier.addInherit(C2, I2); 1538 builder.hier.addInherit(I1, I2); 1539 builder.hier.addInherit(I2, I3); 1540 builder.objectref = C1; 1541 builder.expected = I2; 1542 }, 1543 /* Case 11: Overlap with objectref's super with new 1544 * interface double diamond, skip static. 1545 * 1546 * I3[*](def) = old expected 1547 * C3[](*) = mref, I2[I3](res) = expected 1548 * C2[C3,I2](), I1[I2](stat) 1549 * C1[C2,I1]() = oref 1550 */ 1551 (final SelectionResolutionTestCase.Builder builder) -> { 1552 final ClassData.Package pck = 1553 builder.classdata.get(builder.methodref).packageId; 1554 final ClassData oldexpected = 1555 builder.classdata.get(builder.expected); 1556 final MethodData.Access acc = 1557 builder.classdata.get(builder.expected).methoddata.access; 1558 final ClassData withDef = 1559 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1560 final MethodData meth = 1561 new MethodData(MethodData.Access.PUBLIC, 1562 MethodData.Context.STATIC); 1563 final ClassData withStatDef = new ClassData(pck, meth); 1564 final int C3 = builder.methodref; 1565 final int C2 = builder.addClass(emptyClass(pck)); 1566 final int I3 = builder.expected; 1567 final int I2 = builder.addInterface(withDef); 1568 final int I1 = builder.addInterface(withStatDef); 1569 final int C1 = builder.addClass(emptyClass(pck)); 1570 builder.hier.addInherit(C2, C3); 1571 builder.hier.addInherit(C1, C2); 1572 builder.hier.addInherit(C1, I1); 1573 builder.hier.addInherit(C2, I2); 1574 builder.hier.addInherit(I1, I2); 1575 builder.hier.addInherit(I2, I3); 1576 builder.objectref = C1; 1577 builder.expected = I2; 1578 }, 1579 /* Case 12: Objectref's super overrides, skip interface below. 1580 * 1581 * C3[](*) = mref 1582 * C2[C3](res) = expected, I[](def) 1583 * C1[C2,I]() = oref 1584 */ 1585 (final SelectionResolutionTestCase.Builder builder) -> { 1586 final ClassData.Package pck = 1587 builder.classdata.get(builder.methodref).packageId; 1588 final ClassData oldexpected = 1589 builder.classdata.get(builder.expected); 1590 final MethodData.Access acc = 1591 builder.classdata.get(builder.expected).methoddata.access; 1592 final ClassData withDef = 1593 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1594 final int C3 = builder.methodref; 1595 final int C2 = builder.addClass(withDef); 1596 final int C1 = builder.addClass(emptyClass(pck)); 1597 final int I = builder.addInterface(withDef); 1598 builder.hier.addInherit(C2, C3); 1599 builder.hier.addInherit(C1, C2); 1600 builder.hier.addInherit(C1, I); 1601 builder.objectref = C1; 1602 builder.expected = C2; 1603 }, 1604 /* Case 13: Objectref's super overrides, skip interface above. 1605 * 1606 * C3[](*) = mref, I[](def) 1607 * C2[C3,I](res) = expected 1608 * C1[C2]() = oref 1609 */ 1610 (final SelectionResolutionTestCase.Builder builder) -> { 1611 final ClassData.Package pck = 1612 builder.classdata.get(builder.methodref).packageId; 1613 final ClassData oldexpected = 1614 builder.classdata.get(builder.expected); 1615 final MethodData.Access acc = 1616 builder.classdata.get(builder.expected).methoddata.access; 1617 final ClassData withDef = 1618 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1619 final int C3 = builder.methodref; 1620 final int C2 = builder.addClass(withDef); 1621 final int C1 = builder.addClass(emptyClass(pck)); 1622 final int I = builder.addInterface(withDef); 1623 builder.hier.addInherit(C2, C3); 1624 builder.hier.addInherit(C1, C2); 1625 builder.hier.addInherit(C2, I); 1626 builder.objectref = C1; 1627 builder.expected = C2; 1628 }); 1629 1630 public static final Template ReabstractIfaceMethodrefResolved = 1631 new Template("ReabstractIfaceMethodrefResolved", 1632 /* Case 1: Objectref overrides. 1633 * 1634 * I[](*) = mref 1635 * C[I](res) = oref = expected 1636 */ 1637 (final SelectionResolutionTestCase.Builder builder) -> { 1638 final ClassData.Package pck = 1639 builder.classdata.get(builder.methodref).packageId; 1640 final ClassData oldexpected = 1641 builder.classdata.get(builder.expected); 1642 final MethodData.Access acc = 1643 builder.classdata.get(builder.expected).methoddata.access; 1644 final ClassData withDef = 1645 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1646 final int I = builder.methodref; 1647 final int C = builder.addClass(withDef); 1648 builder.hier.addInherit(C, I); 1649 builder.objectref = C; 1650 builder.expected = C; 1651 }, 1652 /* Case 2: Diamond, methodref at top, overriding. 1653 * 1654 * I3[](*) = mref 1655 * I1[I3](), I2[I3](res) = expected 1656 * C[I1,I2]() = oref 1657 */ 1658 (final SelectionResolutionTestCase.Builder builder) -> { 1659 final ClassData.Package pck = 1660 builder.classdata.get(builder.expected).packageId; 1661 final ClassData oldexpected = 1662 builder.classdata.get(builder.expected); 1663 final MethodData.Access acc = 1664 builder.classdata.get(builder.expected).methoddata.access; 1665 final ClassData withDef = 1666 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1667 final int I3 = builder.methodref; 1668 final int I2 = builder.addInterface(withDef); 1669 final int I1 = builder.addInterface(emptyClass(pck)); 1670 final int C = builder.addClass(emptyClass(pck)); 1671 builder.hier.addInherit(C, I1); 1672 builder.hier.addInherit(C, I2); 1673 builder.hier.addInherit(I1, I3); 1674 builder.hier.addInherit(I2, I3); 1675 builder.objectref = C; 1676 builder.expected = I2; 1677 }, 1678 /* Case 3: Diamond, methodref at top, skip static. 1679 * 1680 * I3[](*) = mref 1681 * I1[I3](), I2[I3](res) = expected 1682 * C[I1,I2](stat) = oref 1683 */ 1684 (final SelectionResolutionTestCase.Builder builder) -> { 1685 final ClassData.Package pck = 1686 builder.classdata.get(builder.expected).packageId; 1687 final ClassData oldexpected = 1688 builder.classdata.get(builder.expected); 1689 final MethodData.Access acc = 1690 builder.classdata.get(builder.expected).methoddata.access; 1691 final ClassData withDef = 1692 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1693 final MethodData meth = 1694 new MethodData(MethodData.Access.PUBLIC, 1695 MethodData.Context.STATIC); 1696 final ClassData withStatDef = new ClassData(pck, meth); 1697 final int I3 = builder.methodref; 1698 final int I2 = builder.addInterface(withDef); 1699 final int I1 = builder.addInterface(emptyClass(pck)); 1700 final int C = builder.addClass(withStatDef); 1701 builder.hier.addInherit(C, I1); 1702 builder.hier.addInherit(C, I2); 1703 builder.hier.addInherit(I1, I3); 1704 builder.hier.addInherit(I2, I3); 1705 builder.objectref = C; 1706 builder.expected = I2; 1707 }, 1708 /* Case 4: Diamond, with superclass, methodref at top, 1709 * class overriding. 1710 * 1711 * I2[](*) = mref 1712 * C2[I2](res) = expected, I1[I2]() 1713 * C1[I1,C2]() = oref 1714 */ 1715 (final SelectionResolutionTestCase.Builder builder) -> { 1716 final ClassData.Package pck = 1717 builder.classdata.get(builder.expected).packageId; 1718 final ClassData oldexpected = 1719 builder.classdata.get(builder.expected); 1720 final MethodData.Access acc = 1721 builder.classdata.get(builder.expected).methoddata.access; 1722 final ClassData withDef = 1723 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1724 final int I2 = builder.methodref; 1725 final int I1 = builder.addInterface(emptyClass(pck)); 1726 final int C2 = builder.addClass(withDef); 1727 final int C1 = builder.addClass(emptyClass(pck)); 1728 builder.hier.addInherit(C1, I1); 1729 builder.hier.addInherit(C1, C2); 1730 builder.hier.addInherit(I1, I2); 1731 builder.hier.addInherit(C2, I2); 1732 builder.objectref = C1; 1733 builder.expected = C2; 1734 }, 1735 /* Case 5: Diamond, with superclass, methodref at top, 1736 * class overriding, skip static. 1737 * 1738 * I2[](*) = mref 1739 * C2[I2](res) = expected, I1[I2]() 1740 * C1[I1,C2](stat) = oref 1741 */ 1742 (final SelectionResolutionTestCase.Builder builder) -> { 1743 final ClassData.Package pck = 1744 builder.classdata.get(builder.expected).packageId; 1745 final ClassData oldexpected = 1746 builder.classdata.get(builder.expected); 1747 final MethodData.Access acc = 1748 builder.classdata.get(builder.expected).methoddata.access; 1749 final ClassData withDef = 1750 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1751 final MethodData meth = 1752 new MethodData(MethodData.Access.PUBLIC, 1753 MethodData.Context.STATIC); 1754 final ClassData withStatDef = new ClassData(pck, meth); 1755 final int I2 = builder.methodref; 1756 final int I1 = builder.addInterface(emptyClass(pck)); 1757 final int C2 = builder.addClass(withDef); 1758 final int C1 = builder.addClass(withStatDef); 1759 builder.hier.addInherit(C1, I1); 1760 builder.hier.addInherit(C1, C2); 1761 builder.hier.addInherit(I1, I2); 1762 builder.hier.addInherit(C2, I2); 1763 builder.objectref = C1; 1764 builder.expected = C2; 1765 }, 1766 /* Case 6: Diamond, with superclass, expected at top, 1767 * interface overriding 1768 * 1769 * I2[](*) = mref 1770 * C2[I2](), I1[I2](res) = expected 1771 * C1[I1,C2]() = oref 1772 */ 1773 (final SelectionResolutionTestCase.Builder builder) -> { 1774 final ClassData.Package pck = 1775 builder.classdata.get(builder.expected).packageId; 1776 final ClassData oldexpected = 1777 builder.classdata.get(builder.expected); 1778 final MethodData.Access acc = 1779 builder.classdata.get(builder.expected).methoddata.access; 1780 final ClassData withDef = 1781 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1782 final int I2 = builder.methodref; 1783 final int I1 = builder.addInterface(withDef); 1784 final int C2 = builder.addClass(emptyClass(pck)); 1785 final int C1 = builder.addClass(emptyClass(pck)); 1786 builder.hier.addInherit(C1, I1); 1787 builder.hier.addInherit(C1, C2); 1788 builder.hier.addInherit(I1, I2); 1789 builder.hier.addInherit(C2, I2); 1790 builder.objectref = C1; 1791 builder.expected = I1; 1792 }, 1793 /* Case 7: Diamond, with superclass, expected at top, 1794 * interface skip static 1795 * 1796 * I2[](*) = mref 1797 * C2[I2](), I1[I2](res) = expected 1798 * C1[I1,C2](stat) = oref 1799 */ 1800 (final SelectionResolutionTestCase.Builder builder) -> { 1801 final ClassData.Package pck = 1802 builder.classdata.get(builder.expected).packageId; 1803 final ClassData oldexpected = 1804 builder.classdata.get(builder.expected); 1805 final MethodData.Access acc = 1806 builder.classdata.get(builder.expected).methoddata.access; 1807 final ClassData withDef = 1808 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1809 final MethodData meth = 1810 new MethodData(MethodData.Access.PUBLIC, 1811 MethodData.Context.STATIC); 1812 final ClassData withStatDef = new ClassData(pck, meth); 1813 final int I2 = builder.methodref; 1814 final int I1 = builder.addInterface(withDef); 1815 final int C2 = builder.addClass(emptyClass(pck)); 1816 final int C1 = builder.addClass(withStatDef); 1817 builder.hier.addInherit(C1, I1); 1818 builder.hier.addInherit(C1, C2); 1819 builder.hier.addInherit(I1, I2); 1820 builder.hier.addInherit(C2, I2); 1821 builder.objectref = C1; 1822 builder.expected = I1; 1823 }, 1824 /* Case 8: Y, with superclass, overlaping, expected 1825 * at top, class overrides 1826 * 1827 * C2[I2](res) = expected, I1[](*) = mref 1828 * C1[I1,C2]() = oref 1829 */ 1830 (final SelectionResolutionTestCase.Builder builder) -> { 1831 final ClassData.Package pck = 1832 builder.classdata.get(builder.expected).packageId; 1833 final ClassData oldexpected = 1834 builder.classdata.get(builder.expected); 1835 final MethodData.Access acc = 1836 builder.classdata.get(builder.expected).methoddata.access; 1837 final ClassData withDef = 1838 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1839 final int I1 = builder.methodref; 1840 final int C2 = builder.addClass(withDef); 1841 final int C1 = builder.addClass(emptyClass(pck)); 1842 builder.hier.addInherit(C1, I1); 1843 builder.hier.addInherit(C1, C2); 1844 builder.objectref = C1; 1845 builder.expected = C2; 1846 }, 1847 /* Case 9: Diamond, with superclass, overlaping, expected 1848 * at top, class overrides 1849 * 1850 * I2[](def) = old expected 1851 * C2[I2](res) = expected, I1[](*) = mref 1852 * C1[I1,C2]() = oref 1853 */ 1854 (final SelectionResolutionTestCase.Builder builder) -> { 1855 final ClassData.Package pck = 1856 builder.classdata.get(builder.expected).packageId; 1857 final ClassData oldexpected = 1858 builder.classdata.get(builder.expected); 1859 final MethodData.Access acc = 1860 builder.classdata.get(builder.expected).methoddata.access; 1861 final ClassData withDef = 1862 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1863 final int I2 = builder.expected; 1864 final int I1 = builder.methodref; 1865 final int C2 = builder.addClass(withDef); 1866 final int C1 = builder.addClass(emptyClass(pck)); 1867 builder.hier.addInherit(C1, I1); 1868 builder.hier.addInherit(C1, C2); 1869 builder.hier.addInherit(C2, I2); 1870 builder.objectref = C1; 1871 builder.expected = C2; 1872 }, 1873 /* Case 10: Diamond, with superclass, overlaping, expected 1874 * at top, class overrides, skipping static 1875 * 1876 * I2[](def) = old expected 1877 * C2[I2](res) = expected, I1[](*) = mref 1878 * C1[I1,C2](stat) = oref 1879 */ 1880 (final SelectionResolutionTestCase.Builder builder) -> { 1881 final ClassData.Package pck = 1882 builder.classdata.get(builder.expected).packageId; 1883 final ClassData oldexpected = 1884 builder.classdata.get(builder.expected); 1885 final MethodData.Access acc = 1886 builder.classdata.get(builder.expected).methoddata.access; 1887 final ClassData withDef = 1888 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1889 final MethodData meth = 1890 new MethodData(MethodData.Access.PUBLIC, 1891 MethodData.Context.STATIC); 1892 final ClassData withStatDef = new ClassData(pck, meth); 1893 final int I2 = builder.expected; 1894 final int I1 = builder.methodref; 1895 final int C2 = builder.addClass(withDef); 1896 final int C1 = builder.addClass(withStatDef); 1897 builder.hier.addInherit(C1, I1); 1898 builder.hier.addInherit(C1, C2); 1899 builder.hier.addInherit(C2, I2); 1900 builder.objectref = C1; 1901 builder.expected = C2; 1902 }, 1903 /* Case 11: Superclass overrides. 1904 * 1905 * I[](*) = mref 1906 * C2[I](res) = expected 1907 * C1[C2]() = oref 1908 */ 1909 (final SelectionResolutionTestCase.Builder builder) -> { 1910 final ClassData.Package pck = 1911 builder.classdata.get(builder.expected).packageId; 1912 final MethodData.Access acc = 1913 builder.classdata.get(builder.expected).methoddata.access; 1914 final ClassData withDef = 1915 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1916 final int I = builder.methodref; 1917 final int C2 = builder.addClass(withDef); 1918 final int C1 = builder.addClass(emptyClass(pck)); 1919 builder.hier.addInherit(C1, I); 1920 builder.hier.addInherit(C1, C2); 1921 builder.hier.addInherit(C2, I); 1922 builder.objectref = C1; 1923 }, 1924 /* Case 12: Superclass overrides, skipping static. 1925 * 1926 * I[](*) = mref 1927 * C2[I](res) = expected 1928 * C1[C2](stat) = oref 1929 */ 1930 (final SelectionResolutionTestCase.Builder builder) -> { 1931 final ClassData.Package pck = 1932 builder.classdata.get(builder.expected).packageId; 1933 final MethodData.Access acc = 1934 builder.classdata.get(builder.expected).methoddata.access; 1935 final ClassData withDef = 1936 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1937 final MethodData meth = 1938 new MethodData(MethodData.Access.PUBLIC, 1939 MethodData.Context.STATIC); 1940 final ClassData withStatDef = new ClassData(pck, meth); 1941 final int I = builder.methodref; 1942 final int C2 = builder.addClass(withDef); 1943 final int C1 = builder.addClass(withStatDef); 1944 builder.hier.addInherit(C1, I); 1945 builder.hier.addInherit(C1, C2); 1946 builder.hier.addInherit(C2, I); 1947 builder.objectref = C1; 1948 }, 1949 /* Case 13: Double diamond, with superclass, inherit through 1950 * superclass, expected at top. 1951 * 1952 * I3[](def) = old expected 1953 * C3[I3](), I2[*](*) = mref 1954 * C2[I2,C3](), I1[I2](res) = expected 1955 * C1[C2,I1]() = oref 1956 */ 1957 (final SelectionResolutionTestCase.Builder builder) -> { 1958 final ClassData.Package pck = 1959 builder.classdata.get(builder.expected).packageId; 1960 final ClassData oldexpected = 1961 builder.classdata.get(builder.expected); 1962 final MethodData.Access acc = 1963 builder.classdata.get(builder.expected).methoddata.access; 1964 final ClassData withDef = 1965 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1966 final int I3 = builder.expected; 1967 final int I2 = builder.methodref; 1968 final int I1 = builder.addInterface(withDef); 1969 final int C3 = builder.addClass(emptyClass(pck)); 1970 final int C2 = builder.addClass(emptyClass(pck)); 1971 final int C1 = builder.addClass(emptyClass(pck)); 1972 builder.hier.addInherit(C2, I2); 1973 builder.hier.addInherit(C2, C3); 1974 builder.hier.addInherit(C3, I3); 1975 builder.hier.addInherit(C1, C2); 1976 builder.hier.addInherit(I1, I2); 1977 builder.hier.addInherit(C1, I1); 1978 builder.objectref = C1; 1979 builder.expected = I1; 1980 }, 1981 /* Case 14: Double diamond, with superclass, inherit through 1982 * superclass, expected at top. 1983 * 1984 * I3[](def) = mref 1985 * C3[I3](), I2[*](*) = expected 1986 * C2[I2,C3](), I1[I2](priv) 1987 * C1[C2,I1]() = oref 1988 */ 1989 (final SelectionResolutionTestCase.Builder builder) -> { 1990 final ClassData.Package pck = 1991 builder.classdata.get(builder.expected).packageId; 1992 final ClassData oldexpected = 1993 builder.classdata.get(builder.expected); 1994 final MethodData.Access acc = 1995 builder.classdata.get(builder.expected).methoddata.access; 1996 final ClassData withDef = 1997 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 1998 final MethodData meth = 1999 new MethodData(MethodData.Access.PRIVATE, 2000 MethodData.Context.INSTANCE); 2001 final ClassData withPrivDef = new ClassData(pck, meth); 2002 final int I3 = builder.methodref; 2003 final int I2 = builder.addInterface(withDef); 2004 final int I1 = builder.addInterface(withPrivDef); 2005 final int C3 = builder.addClass(emptyClass(pck)); 2006 final int C2 = builder.addClass(emptyClass(pck)); 2007 final int C1 = builder.addClass(emptyClass(pck)); 2008 builder.hier.addInherit(C2, I2); 2009 builder.hier.addInherit(C2, C3); 2010 builder.hier.addInherit(C3, I3); 2011 builder.hier.addInherit(C1, C2); 2012 builder.hier.addInherit(I1, I2); 2013 builder.hier.addInherit(C1, I1); 2014 builder.objectref = C1; 2015 builder.expected = I2; 2016 }, 2017 /* Case 15: Double diamond, with superclass, inherit through 2018 * superclass, expected at top. 2019 * 2020 * I3[](def) = mref 2021 * C3[I3](), I2[*](*) = expected 2022 * C2[I2,C3](), I1[I2](stat) 2023 * C1[C2,I1]() = oref 2024 */ 2025 (final SelectionResolutionTestCase.Builder builder) -> { 2026 final ClassData.Package pck = 2027 builder.classdata.get(builder.expected).packageId; 2028 final ClassData oldexpected = 2029 builder.classdata.get(builder.expected); 2030 final MethodData.Access acc = 2031 builder.classdata.get(builder.expected).methoddata.access; 2032 final ClassData withDef = 2033 new ClassData(pck, new MethodData(acc, MethodData.Context.ABSTRACT)); 2034 final MethodData meth = 2035 new MethodData(MethodData.Access.PUBLIC, 2036 MethodData.Context.STATIC); 2037 final ClassData withStatDef = new ClassData(pck, meth); 2038 final int I3 = builder.methodref; 2039 final int I2 = builder.addInterface(withDef); 2040 final int I1 = builder.addInterface(withStatDef); 2041 final int C3 = builder.addClass(emptyClass(pck)); 2042 final int C2 = builder.addClass(emptyClass(pck)); 2043 final int C1 = builder.addClass(emptyClass(pck)); 2044 builder.hier.addInherit(C2, I2); 2045 builder.hier.addInherit(C2, C3); 2046 builder.hier.addInherit(C3, I3); 2047 builder.hier.addInherit(C1, C2); 2048 builder.hier.addInherit(I1, I2); 2049 builder.hier.addInherit(C1, I1); 2050 builder.objectref = C1; 2051 builder.expected = I2; 2052 }); 2053 2054 /****************************** 2055 * Abstract Overrides * 2056 ******************************/ 2057 2058 public static final Template OverrideAbstractExpectedIface = 2059 Template.ResolutionOverride(EnumSet.of(Template.Kind.INTERFACE), 2060 EnumSet.of(MethodData.Access.PUBLIC), 2061 EnumSet.allOf(MethodData.Context.class), 2062 EnumSet.of(ClassData.Package.SAME)); 2063 2064 public static final Template OverrideAbstractExpectedClass = 2065 Template.ResolutionOverride(EnumSet.allOf(Template.Kind.class), 2066 EnumSet.of(MethodData.Access.PUBLIC), 2067 EnumSet.allOf(MethodData.Context.class), 2068 EnumSet.of(ClassData.Package.SAME)); 2069 2070 public static final Template SelectionOverrideAbstract = 2071 new Template("SelectionOverrideAbstract", 2072 (final SelectionResolutionTestCase.Builder builder) -> { 2073 final ClassData expected = 2074 builder.classdata.get(builder.expected); 2075 final MethodData olddef = 2076 expected.methoddata; 2077 if (MethodData.Context.ABSTRACT == olddef.context) { 2078 final ClassData.Package pck = expected.packageId; 2079 final MethodData.Access acc = olddef.access; 2080 final MethodData mdata = 2081 getMethodData(MethodData.Access.PUBLIC, 2082 MethodData.Context.INSTANCE); 2083 final ClassData withDef = new ClassData(pck, mdata); 2084 final int C2 = builder.objectref; 2085 final int C1 = builder.addClass(withDef); 2086 builder.hier.addInherit(C1, C2); 2087 builder.objectref = C1; 2088 builder.expected = C1; 2089 } 2090 }); 2091 2092 2093 /****************************** 2094 * Ignored Abstract Templates * 2095 ******************************/ 2096 2097 public static final Template IgnoredAbstract = 2098 new Template("IgnoredAbstract", 2099 (builder) -> {}, 2100 (final SelectionResolutionTestCase.Builder builder) -> { 2101 final ClassData methodref = 2102 builder.classdata.get(builder.methodref); 2103 final ClassData.Package pck = methodref.packageId; 2104 final MethodData mdata = 2105 getMethodData(MethodData.Access.PUBLIC, 2106 MethodData.Context.ABSTRACT); 2107 final ClassData withDef = new ClassData(pck, mdata); 2108 final int C2 = builder.addInterface(withDef); 2109 final int C1 = builder.methodref; 2110 builder.hier.addInherit(C1, C2); 2111 }); 2112 2113 /****************************** 2114 * Selection Templates * 2115 ******************************/ 2116 2117 2118 2119 public static final Template TrivialObjectref = 2120 new Template("TrivialObjectref", 2121 Collections.singleton((builder) -> { 2122 builder.objectref = builder.methodref; 2123 })); 2124 2125 public static final Template TrivialObjectrefNotEqualMethodref = 2126 new Template("TrivialObjectrefNotEqualMethodref", 2127 Collections.singleton( 2128 (final SelectionResolutionTestCase.Builder builder) -> { 2129 final ClassData oldexpected = 2130 builder.classdata.get(builder.expected); 2131 final ClassData.Package pck = oldexpected.packageId; 2132 final int C2 = builder.methodref; 2133 final int C1 = builder.addClass(emptyClass(pck)); 2134 builder.hier.addInherit(C1, C2); 2135 builder.objectref = C1; 2136 })); 2137 2138 public static final Template MethodrefSelectionResolvedIsClassNoOverride = 2139 new Template("MethodrefSelectionResolvedIsClassNoOverride", 2140 /* Trivial. 2141 * 2142 * C[](*) = mref = oref 2143 */ 2144 (builder) -> { 2145 builder.objectref = builder.methodref; 2146 }, 2147 /* Case 1: Inherit from super. 2148 * 2149 * C2[](*) = mref 2150 * C1[C2]() = oref 2151 */ 2152 (final SelectionResolutionTestCase.Builder builder) -> { 2153 final ClassData.Package pck = 2154 builder.classdata.get(builder.methodref).packageId; 2155 final int C2 = builder.methodref; 2156 final int C1 = builder.addClass(emptyClass(pck)); 2157 builder.hier.addInherit(C1, C2); 2158 builder.objectref = C1; 2159 }, 2160 /* Case 2: Objectref has private def. 2161 * 2162 * C2[](*) = mref 2163 * C1[C2](priv) = oref 2164 */ 2165 (final SelectionResolutionTestCase.Builder builder) -> { 2166 final ClassData.Package pck = 2167 builder.classdata.get(builder.methodref).packageId; 2168 final ClassData oldexpected = 2169 builder.classdata.get(builder.expected); 2170 final MethodData meth = 2171 new MethodData(MethodData.Access.PRIVATE, 2172 MethodData.Context.INSTANCE); 2173 final ClassData withDef = new ClassData(pck, meth); 2174 final int C2 = builder.methodref; 2175 final int C1 = builder.addClass(withDef); 2176 builder.hier.addInherit(C1, C2); 2177 builder.objectref = C1; 2178 }, 2179 /* Case 3: Objectref has static def. 2180 * 2181 * C2[](*) = mref 2182 * C1[C2](stat) = oref 2183 */ 2184 (final SelectionResolutionTestCase.Builder builder) -> { 2185 final ClassData.Package pck = 2186 builder.classdata.get(builder.methodref).packageId; 2187 final ClassData oldexpected = 2188 builder.classdata.get(builder.expected); 2189 final MethodData meth = 2190 new MethodData(MethodData.Access.PUBLIC, 2191 MethodData.Context.STATIC); 2192 final ClassData withDef = new ClassData(pck, meth); 2193 final int C2 = builder.methodref; 2194 final int C1 = builder.addClass(withDef); 2195 builder.hier.addInherit(C1, C2); 2196 builder.objectref = C1; 2197 }, 2198 /* Case 4: Skip inherit from interface. 2199 * 2200 * C2[](*) = mref, I[](def) 2201 * C1[C2,I]() = oref 2202 */ 2203 (final SelectionResolutionTestCase.Builder builder) -> { 2204 final ClassData oldexpected = 2205 builder.classdata.get(builder.expected); 2206 final ClassData.Package pck = oldexpected.packageId; 2207 final MethodData.Context ctx = 2208 builder.classdata.get(builder.expected).methoddata.context; 2209 final MethodData.Access acc = 2210 builder.classdata.get(builder.expected).methoddata.access; 2211 final MethodData mdata = getMethodData(acc, ctx); 2212 final ClassData withDef = new ClassData(pck, mdata); 2213 final int C2 = builder.methodref; 2214 final int C1 = builder.addClass(emptyClass(pck)); 2215 final int I = builder.addInterface(withDef); 2216 builder.hier.addInherit(C1, C2); 2217 builder.hier.addInherit(C1, I); 2218 builder.objectref = C1; 2219 }, 2220 /* Case 5: Objectref's super has a private def. 2221 * 2222 * C3[*](*) = mref 2223 * C2[C3](res) = expected 2224 * C1[C2]() = oref 2225 */ 2226 (final SelectionResolutionTestCase.Builder builder) -> { 2227 final ClassData.Package pck = 2228 builder.classdata.get(builder.methodref).packageId; 2229 final ClassData oldexpected = 2230 builder.classdata.get(builder.expected); 2231 final MethodData meth = 2232 new MethodData(MethodData.Access.PRIVATE, 2233 MethodData.Context.INSTANCE); 2234 final ClassData withDef = 2235 new ClassData(pck, meth); 2236 final int C3 = builder.methodref; 2237 final int C2 = builder.addClass(withDef); 2238 final int C1 = builder.addClass(emptyClass(pck)); 2239 builder.hier.addInherit(C2, C3); 2240 builder.hier.addInherit(C1, C2); 2241 builder.objectref = C1; 2242 }, 2243 /* Case 6: Objectref's super has a static def. 2244 * 2245 * C3[*](*) = mref 2246 * C2[C3](res) = expected 2247 * C1[C2]() = oref 2248 */ 2249 (final SelectionResolutionTestCase.Builder builder) -> { 2250 final ClassData.Package pck = 2251 builder.classdata.get(builder.methodref).packageId; 2252 final ClassData oldexpected = 2253 builder.classdata.get(builder.expected); 2254 final MethodData meth = 2255 new MethodData(MethodData.Access.PUBLIC, 2256 MethodData.Context.STATIC); 2257 final ClassData withDef = 2258 new ClassData(pck, meth); 2259 final int C3 = builder.methodref; 2260 final int C2 = builder.addClass(withDef); 2261 final int C1 = builder.addClass(emptyClass(pck)); 2262 builder.hier.addInherit(C2, C3); 2263 builder.hier.addInherit(C1, C2); 2264 builder.objectref = C1; 2265 }); 2266 2267 public static final Template MethodrefSelectionResolvedIsClassOverride = 2268 new Template("MethodrefSelectionResolvedIsClassOverride", 2269 /* Case 7: Objectref overrides. 2270 * 2271 * C2[](*) = mref 2272 * C1[C2](res) = oref = expected 2273 */ 2274 (final SelectionResolutionTestCase.Builder builder) -> { 2275 final ClassData.Package pck = 2276 builder.classdata.get(builder.methodref).packageId; 2277 final ClassData oldexpected = 2278 builder.classdata.get(builder.expected); 2279 final ClassData withDef = 2280 new ClassData(pck, oldexpected.methoddata); 2281 final int C2 = builder.methodref; 2282 final int C1 = builder.addClass(withDef); 2283 builder.hier.addInherit(C1, C2); 2284 builder.objectref = C1; 2285 builder.expected = C1; 2286 }, 2287 /* Case 8: Objectref's super overrides. 2288 * 2289 * C3[*](*) = mref 2290 * C2[C3](res) 2291 * C1[C2]() = oref 2292 */ 2293 (final SelectionResolutionTestCase.Builder builder) -> { 2294 final ClassData.Package pck = 2295 builder.classdata.get(builder.methodref).packageId; 2296 final ClassData oldexpected = 2297 builder.classdata.get(builder.expected); 2298 final ClassData withDef = 2299 new ClassData(pck, oldexpected.methoddata); 2300 final int C3 = builder.methodref; 2301 final int C2 = builder.addClass(withDef); 2302 final int C1 = builder.addClass(emptyClass(pck)); 2303 builder.hier.addInherit(C2, C3); 2304 builder.hier.addInherit(C1, C2); 2305 builder.objectref = C1; 2306 builder.expected = C2; 2307 }, 2308 /* Case 9: Objectref's super overrides, 2309 * objectref has a private def. 2310 * 2311 * C3[*](*) = mref 2312 * C2[C3](res) 2313 * C1[C2](priv) = oref 2314 */ 2315 (final SelectionResolutionTestCase.Builder builder) -> { 2316 final ClassData.Package pck = 2317 builder.classdata.get(builder.methodref).packageId; 2318 final ClassData oldexpected = 2319 builder.classdata.get(builder.expected); 2320 final ClassData withDef = 2321 new ClassData(pck, oldexpected.methoddata); 2322 final MethodData meth = 2323 new MethodData(MethodData.Access.PRIVATE, 2324 MethodData.Context.INSTANCE); 2325 final ClassData withPrivDef = 2326 new ClassData(pck, meth); 2327 final int C3 = builder.methodref; 2328 final int C2 = builder.addClass(withDef); 2329 final int C1 = builder.addClass(withPrivDef); 2330 builder.hier.addInherit(C2, C3); 2331 builder.hier.addInherit(C1, C2); 2332 builder.objectref = C1; 2333 builder.expected = C2; 2334 }, 2335 /* Case 10: Objectref's super overrides, 2336 * objectref has a static def. 2337 * 2338 * C3[*](*) = mref 2339 * C2[C3](res) 2340 * C1[C2](stat) = oref 2341 */ 2342 (final SelectionResolutionTestCase.Builder builder) -> { 2343 final ClassData.Package pck = 2344 builder.classdata.get(builder.methodref).packageId; 2345 final ClassData oldexpected = 2346 builder.classdata.get(builder.expected); 2347 final ClassData withDef = 2348 new ClassData(pck, oldexpected.methoddata); 2349 final MethodData meth = 2350 new MethodData(MethodData.Access.PUBLIC, 2351 MethodData.Context.STATIC); 2352 final ClassData withPrivDef = 2353 new ClassData(pck, meth); 2354 final int C3 = builder.methodref; 2355 final int C2 = builder.addClass(withDef); 2356 final int C1 = builder.addClass(withPrivDef); 2357 builder.hier.addInherit(C2, C3); 2358 builder.hier.addInherit(C1, C2); 2359 builder.objectref = C1; 2360 builder.expected = C2; 2361 }); 2362 2363 public static final Template MethodrefSelectionResolvedIsClass = 2364 new Template("MethodrefSelectionResolvedIsClass", 2365 MethodrefSelectionResolvedIsClassNoOverride, 2366 MethodrefSelectionResolvedIsClassOverride); 2367 2368 public static final Template MethodrefSelectionPackageSkip = 2369 new Template("MethodrefSelectionPackageSkip", 2370 MethodrefSelectionResolvedIsClass, 2371 /* Case 11: Objectref has public def in other package. 2372 * 2373 * C2[](*) = mref 2374 * Other.C1[C2](pub) = oref 2375 */ 2376 (final SelectionResolutionTestCase.Builder builder) -> { 2377 final ClassData.Package pck = 2378 builder.classdata.get(builder.methodref).packageId; 2379 final ClassData oldexpected = 2380 builder.classdata.get(builder.expected); 2381 final MethodData meth = 2382 new MethodData(MethodData.Access.PUBLIC, 2383 MethodData.Context.INSTANCE); 2384 final ClassData withDef = 2385 new ClassData(ClassData.Package.OTHER, meth); 2386 final int C2 = builder.methodref; 2387 final int C1 = builder.addClass(withDef); 2388 builder.hier.addInherit(C1, C2); 2389 builder.objectref = C1; 2390 }, 2391 /* Case 12: Objectref has package private def in other package. 2392 * 2393 * C2[](*) = mref 2394 * Other.C1[C2](pack) = oref 2395 */ 2396 (final SelectionResolutionTestCase.Builder builder) -> { 2397 final ClassData.Package pck = 2398 builder.classdata.get(builder.methodref).packageId; 2399 final ClassData oldexpected = 2400 builder.classdata.get(builder.expected); 2401 final MethodData meth = 2402 new MethodData(MethodData.Access.PACKAGE, 2403 MethodData.Context.INSTANCE); 2404 final ClassData withDef = 2405 new ClassData(ClassData.Package.OTHER, meth); 2406 final int C2 = builder.methodref; 2407 final int C1 = builder.addClass(withDef); 2408 builder.hier.addInherit(C1, C2); 2409 builder.objectref = C1; 2410 }, 2411 /* Case 13: Objectref has protected def in other package. 2412 * 2413 * C2[](*) = mref 2414 * Other.C1[C2](prot) = oref 2415 */ 2416 (final SelectionResolutionTestCase.Builder builder) -> { 2417 final ClassData.Package pck = 2418 builder.classdata.get(builder.methodref).packageId; 2419 final ClassData oldexpected = 2420 builder.classdata.get(builder.expected); 2421 final MethodData meth = 2422 new MethodData(MethodData.Access.PROTECTED, 2423 MethodData.Context.INSTANCE); 2424 final ClassData withDef = 2425 new ClassData(ClassData.Package.OTHER, meth); 2426 final int C2 = builder.methodref; 2427 final int C1 = builder.addClass(withDef); 2428 builder.hier.addInherit(C1, C2); 2429 builder.objectref = C1; 2430 }, 2431 /* Case 14: Objectref's super has a public def in other package. 2432 * 2433 * C3[*](*) = mref 2434 * Other.C2[C3](pub) = expected 2435 * C1[C2]() = oref 2436 */ 2437 (final SelectionResolutionTestCase.Builder builder) -> { 2438 final ClassData.Package pck = 2439 builder.classdata.get(builder.methodref).packageId; 2440 final ClassData oldexpected = 2441 builder.classdata.get(builder.expected); 2442 final MethodData meth = 2443 new MethodData(MethodData.Access.PUBLIC, 2444 MethodData.Context.INSTANCE); 2445 final ClassData withDef = 2446 new ClassData(ClassData.Package.OTHER, meth); 2447 final int C3 = builder.methodref; 2448 final int C2 = builder.addClass(withDef); 2449 final int C1 = builder.addClass(emptyClass(pck)); 2450 builder.hier.addInherit(C2, C3); 2451 builder.hier.addInherit(C1, C2); 2452 builder.objectref = C1; 2453 }, 2454 /* Case 15: Objectref's super has a package 2455 * private def in other package. 2456 * 2457 * C3[*](*) = mref 2458 * Other.C2[C3](pack) = expected 2459 * C1[C2]() = oref 2460 */ 2461 (final SelectionResolutionTestCase.Builder builder) -> { 2462 final ClassData.Package pck = 2463 builder.classdata.get(builder.methodref).packageId; 2464 final ClassData oldexpected = 2465 builder.classdata.get(builder.expected); 2466 final MethodData meth = 2467 new MethodData(MethodData.Access.PACKAGE, 2468 MethodData.Context.INSTANCE); 2469 final ClassData withDef = 2470 new ClassData(ClassData.Package.OTHER, meth); 2471 final int C3 = builder.methodref; 2472 final int C2 = builder.addClass(withDef); 2473 final int C1 = builder.addClass(emptyClass(pck)); 2474 builder.hier.addInherit(C2, C3); 2475 builder.hier.addInherit(C1, C2); 2476 builder.objectref = C1; 2477 }, 2478 /* Case 16: Objectref's super has a protected def 2479 * in other package. 2480 * 2481 * C3[*](*) = mref 2482 * Other.C2[C3](pack) = expected 2483 * C1[C2]() = oref 2484 */ 2485 (final SelectionResolutionTestCase.Builder builder) -> { 2486 final ClassData.Package pck = 2487 builder.classdata.get(builder.methodref).packageId; 2488 final ClassData oldexpected = 2489 builder.classdata.get(builder.expected); 2490 final MethodData meth = 2491 new MethodData(MethodData.Access.PROTECTED, 2492 MethodData.Context.INSTANCE); 2493 final ClassData withDef = 2494 new ClassData(ClassData.Package.OTHER, meth); 2495 final int C3 = builder.methodref; 2496 final int C2 = builder.addClass(withDef); 2497 final int C1 = builder.addClass(emptyClass(pck)); 2498 builder.hier.addInherit(C2, C3); 2499 builder.hier.addInherit(C1, C2); 2500 builder.objectref = C1; 2501 }, 2502 /* Case 17: Transitive override. 2503 * 2504 * C3[*](*) = mref 2505 * C2[C3](pub) 2506 * Other.C1[C2](pack) = oref, expected 2507 */ 2508 (final SelectionResolutionTestCase.Builder builder) -> { 2509 final ClassData.Package pck = 2510 builder.classdata.get(builder.expected).packageId; 2511 final ClassData oldexpected = 2512 builder.classdata.get(builder.expected); 2513 final MethodData meth = 2514 new MethodData(MethodData.Access.PUBLIC, 2515 MethodData.Context.INSTANCE); 2516 final MethodData packmeth = 2517 new MethodData(MethodData.Access.PACKAGE, 2518 MethodData.Context.INSTANCE); 2519 final ClassData withPubDef = new ClassData(pck, meth); 2520 final ClassData withPackDef = 2521 new ClassData(ClassData.Package.OTHER, packmeth); 2522 final int C3 = builder.methodref; 2523 final int C2 = builder.addClass(withPubDef); 2524 final int C1 = builder.addClass(withPackDef); 2525 builder.hier.addInherit(C2, C3); 2526 builder.hier.addInherit(C1, C2); 2527 builder.objectref = C1; 2528 builder.expected = C1; 2529 }, 2530 /* Case 18: Objectref's has a public def in other 2531 * package, skip private. 2532 * 2533 * C3[*](*) = mref 2534 * Other.C2[C3](priv) 2535 * C1[C2](pub) = oref, expected 2536 */ 2537 (final SelectionResolutionTestCase.Builder builder) -> { 2538 final ClassData.Package pck = 2539 builder.classdata.get(builder.methodref).packageId; 2540 final ClassData oldexpected = 2541 builder.classdata.get(builder.expected); 2542 final MethodData meth = 2543 new MethodData(MethodData.Access.PUBLIC, 2544 MethodData.Context.INSTANCE); 2545 final ClassData withDef = 2546 new ClassData(ClassData.Package.OTHER, meth); 2547 final MethodData privmeth = 2548 new MethodData(MethodData.Access.PRIVATE, 2549 MethodData.Context.INSTANCE); 2550 final ClassData withPrivDef = 2551 new ClassData(pck, privmeth); 2552 final int C3 = builder.methodref; 2553 final int C2 = builder.addClass(withPrivDef); 2554 final int C1 = builder.addClass(withDef); 2555 builder.hier.addInherit(C2, C3); 2556 builder.hier.addInherit(C1, C2); 2557 builder.objectref = C1; 2558 }, 2559 /* Case 19: Objectref's has a package private def in other 2560 * package, skip private. 2561 * 2562 * C3[*](*) = mref 2563 * Other.C2[C3](priv) 2564 * C1[C2](pack) = oref, expected 2565 */ 2566 (final SelectionResolutionTestCase.Builder builder) -> { 2567 final ClassData.Package pck = 2568 builder.classdata.get(builder.methodref).packageId; 2569 final ClassData oldexpected = 2570 builder.classdata.get(builder.expected); 2571 final MethodData meth = 2572 new MethodData(MethodData.Access.PACKAGE, 2573 MethodData.Context.INSTANCE); 2574 final ClassData withDef = 2575 new ClassData(ClassData.Package.OTHER, meth); 2576 final MethodData privmeth = 2577 new MethodData(MethodData.Access.PRIVATE, 2578 MethodData.Context.INSTANCE); 2579 final ClassData withPrivDef = 2580 new ClassData(pck, privmeth); 2581 final int C3 = builder.methodref; 2582 final int C2 = builder.addClass(withPrivDef); 2583 final int C1 = builder.addClass(withDef); 2584 builder.hier.addInherit(C2, C3); 2585 builder.hier.addInherit(C1, C2); 2586 builder.objectref = C1; 2587 }, 2588 /* Case 20: Objectref's has a protected def in other 2589 * package, skip private. 2590 * 2591 * C3[*](*) = mref 2592 * Other.C2[C3](priv) 2593 * C1[C2](pro) = oref, expected 2594 */ 2595 (final SelectionResolutionTestCase.Builder builder) -> { 2596 final ClassData.Package pck = 2597 builder.classdata.get(builder.methodref).packageId; 2598 final ClassData oldexpected = 2599 builder.classdata.get(builder.expected); 2600 final MethodData meth = 2601 new MethodData(MethodData.Access.PROTECTED, 2602 MethodData.Context.INSTANCE); 2603 final ClassData withDef = 2604 new ClassData(ClassData.Package.OTHER, meth); 2605 final MethodData privmeth = 2606 new MethodData(MethodData.Access.PRIVATE, 2607 MethodData.Context.INSTANCE); 2608 final ClassData withPrivDef = 2609 new ClassData(pck, privmeth); 2610 final int C3 = builder.methodref; 2611 final int C2 = builder.addClass(withPrivDef); 2612 final int C1 = builder.addClass(withDef); 2613 builder.hier.addInherit(C2, C3); 2614 builder.hier.addInherit(C1, C2); 2615 builder.objectref = C1; 2616 }, 2617 /* Case 21: Objectref's super has a public def in other 2618 * package, skip private. 2619 * 2620 * C3[*](*) = mref 2621 * Other.C2[C3](pub) = expected 2622 * C1[C2](priv) = oref 2623 */ 2624 (final SelectionResolutionTestCase.Builder builder) -> { 2625 final ClassData.Package pck = 2626 builder.classdata.get(builder.methodref).packageId; 2627 final ClassData oldexpected = 2628 builder.classdata.get(builder.expected); 2629 final MethodData meth = 2630 new MethodData(MethodData.Access.PUBLIC, 2631 MethodData.Context.INSTANCE); 2632 final ClassData withDef = 2633 new ClassData(ClassData.Package.OTHER, meth); 2634 final MethodData privmeth = 2635 new MethodData(MethodData.Access.PRIVATE, 2636 MethodData.Context.INSTANCE); 2637 final ClassData withPrivDef = 2638 new ClassData(pck, privmeth); 2639 final int C3 = builder.methodref; 2640 final int C2 = builder.addClass(withDef); 2641 final int C1 = builder.addClass(withPrivDef); 2642 builder.hier.addInherit(C2, C3); 2643 builder.hier.addInherit(C1, C2); 2644 builder.objectref = C1; 2645 }, 2646 /* Case 22: Objectref's superhas a package private 2647 * def in other package, skip private. 2648 * 2649 * C3[*](*) = mref 2650 * Other.C2[C3](pack) = expected 2651 * C1[C2](priv) = oref 2652 */ 2653 (final SelectionResolutionTestCase.Builder builder) -> { 2654 final ClassData.Package pck = 2655 builder.classdata.get(builder.methodref).packageId; 2656 final ClassData oldexpected = 2657 builder.classdata.get(builder.expected); 2658 final MethodData meth = 2659 new MethodData(MethodData.Access.PACKAGE, 2660 MethodData.Context.INSTANCE); 2661 final ClassData withDef = 2662 new ClassData(ClassData.Package.OTHER, meth); 2663 final MethodData privmeth = 2664 new MethodData(MethodData.Access.PRIVATE, 2665 MethodData.Context.INSTANCE); 2666 final ClassData withPrivDef = 2667 new ClassData(pck, privmeth); 2668 final int C3 = builder.methodref; 2669 final int C2 = builder.addClass(withDef); 2670 final int C1 = builder.addClass(withPrivDef); 2671 builder.hier.addInherit(C2, C3); 2672 builder.hier.addInherit(C1, C2); 2673 builder.objectref = C1; 2674 }, 2675 /* Case 23: Objectref's super has a protected def 2676 * in other package, skip private. 2677 * 2678 * C3[*](*) = mref 2679 * Other.C2[C3](pro) = expected 2680 * C1[C2](priv) = oref 2681 */ 2682 (final SelectionResolutionTestCase.Builder builder) -> { 2683 final ClassData.Package pck = 2684 builder.classdata.get(builder.methodref).packageId; 2685 final ClassData oldexpected = 2686 builder.classdata.get(builder.expected); 2687 final MethodData meth = 2688 new MethodData(MethodData.Access.PROTECTED, 2689 MethodData.Context.INSTANCE); 2690 final ClassData withDef = 2691 new ClassData(ClassData.Package.OTHER, meth); 2692 final MethodData privmeth = 2693 new MethodData(MethodData.Access.PRIVATE, 2694 MethodData.Context.INSTANCE); 2695 final ClassData withPrivDef = 2696 new ClassData(pck, privmeth); 2697 final int C3 = builder.methodref; 2698 final int C2 = builder.addClass(withPrivDef); 2699 final int C1 = builder.addClass(withDef); 2700 builder.hier.addInherit(C2, C3); 2701 builder.hier.addInherit(C1, C2); 2702 builder.objectref = C1; 2703 }, 2704 /* Case 24: Transitive override, skip private in between. 2705 * 2706 * C4[*](*) = mref 2707 * C3[C4](pub) 2708 * C2[C3](priv) 2709 * Other.C1[C2](pack) = oref, expected 2710 */ 2711 (final SelectionResolutionTestCase.Builder builder) -> { 2712 final ClassData.Package pck = 2713 builder.classdata.get(builder.expected).packageId; 2714 final ClassData oldexpected = 2715 builder.classdata.get(builder.expected); 2716 final MethodData meth = 2717 new MethodData(MethodData.Access.PUBLIC, 2718 MethodData.Context.INSTANCE); 2719 final MethodData packmeth = 2720 new MethodData(MethodData.Access.PACKAGE, 2721 MethodData.Context.INSTANCE); 2722 final ClassData withPubDef = new ClassData(pck, meth); 2723 final ClassData withPackDef = 2724 new ClassData(ClassData.Package.OTHER, packmeth); 2725 final MethodData privmeth = 2726 new MethodData(MethodData.Access.PRIVATE, 2727 MethodData.Context.INSTANCE); 2728 final ClassData withPrivDef = 2729 new ClassData(pck, privmeth); 2730 final int C4 = builder.methodref; 2731 final int C3 = builder.addClass(withPubDef); 2732 final int C2 = builder.addClass(withPrivDef); 2733 final int C1 = builder.addClass(withPackDef); 2734 builder.hier.addInherit(C3, C4); 2735 builder.hier.addInherit(C2, C3); 2736 builder.hier.addInherit(C1, C2); 2737 builder.objectref = C1; 2738 builder.expected = C1; 2739 }, 2740 /* Case 25: Transitive override, skip private in between. 2741 * 2742 * C4[*](*) = mref 2743 * C3[C4](pub) 2744 * Other.C2[C3](pack) = expected 2745 * C1[C2](pack) = oref 2746 */ 2747 (final SelectionResolutionTestCase.Builder builder) -> { 2748 final ClassData.Package pck = 2749 builder.classdata.get(builder.expected).packageId; 2750 final ClassData oldexpected = 2751 builder.classdata.get(builder.expected); 2752 final MethodData meth = 2753 new MethodData(MethodData.Access.PUBLIC, 2754 MethodData.Context.INSTANCE); 2755 final MethodData packmeth = 2756 new MethodData(MethodData.Access.PACKAGE, 2757 MethodData.Context.INSTANCE); 2758 final ClassData withPubDef = new ClassData(pck, meth); 2759 final ClassData withPackDef = 2760 new ClassData(ClassData.Package.OTHER, packmeth); 2761 final MethodData privmeth = 2762 new MethodData(MethodData.Access.PRIVATE, 2763 MethodData.Context.INSTANCE); 2764 final ClassData withPrivDef = 2765 new ClassData(pck, privmeth); 2766 final int C4 = builder.methodref; 2767 final int C3 = builder.addClass(withPubDef); 2768 final int C2 = builder.addClass(withPackDef); 2769 final int C1 = builder.addClass(withPrivDef); 2770 builder.hier.addInherit(C3, C4); 2771 builder.hier.addInherit(C2, C3); 2772 builder.hier.addInherit(C1, C2); 2773 builder.objectref = C2; 2774 builder.expected = C2; 2775 }); 2776 2777 public static final Template MethodrefSelectionResolvedIsIfaceNoOverride = 2778 new Template("MethodrefSelectionResolvedIsIfaceNoOverride", 2779 /* Trivial objectref. 2780 * 2781 * C[](*) = mref = oref 2782 */ 2783 (builder) -> { 2784 builder.objectref = builder.methodref; 2785 }, 2786 /* Case 1: Inherit from super. 2787 * 2788 * C2[](*) = mref 2789 * C1[C2]() = oref 2790 */ 2791 (final SelectionResolutionTestCase.Builder builder) -> { 2792 final ClassData.Package pck = 2793 builder.classdata.get(builder.methodref).packageId; 2794 final int C2 = builder.methodref; 2795 final int C1 = builder.addClass(emptyClass(pck)); 2796 builder.hier.addInherit(C1, C2); 2797 builder.objectref = C1; 2798 }, 2799 /* Case 2: Objectref has private def. 2800 * 2801 * C2[](*) = mref 2802 * C1[C2](priv) = oref 2803 */ 2804 (final SelectionResolutionTestCase.Builder builder) -> { 2805 final ClassData.Package pck = 2806 builder.classdata.get(builder.methodref).packageId; 2807 final ClassData oldexpected = 2808 builder.classdata.get(builder.expected); 2809 final MethodData meth = 2810 new MethodData(MethodData.Access.PRIVATE, 2811 MethodData.Context.INSTANCE); 2812 final ClassData withDef = new ClassData(pck, meth); 2813 final int C2 = builder.methodref; 2814 final int C1 = builder.addClass(withDef); 2815 builder.hier.addInherit(C1, C2); 2816 builder.objectref = C1; 2817 }, 2818 /* Case 3: Objectref has static def. 2819 * 2820 * C2[](*) = mref 2821 * C1[C2](stat) = oref 2822 */ 2823 (final SelectionResolutionTestCase.Builder builder) -> { 2824 final ClassData.Package pck = 2825 builder.classdata.get(builder.methodref).packageId; 2826 final ClassData oldexpected = 2827 builder.classdata.get(builder.expected); 2828 final MethodData meth = 2829 new MethodData(MethodData.Access.PUBLIC, 2830 MethodData.Context.STATIC); 2831 final ClassData withDef = new ClassData(pck, meth); 2832 final int C2 = builder.methodref; 2833 final int C1 = builder.addClass(withDef); 2834 builder.hier.addInherit(C1, C2); 2835 builder.objectref = C1; 2836 }, 2837 /* Case 4: Overlapping. 2838 * 2839 * I[*](res) = expected 2840 * C2[*](*) = mref 2841 * C1[C2,I]() = oref 2842 */ 2843 (final SelectionResolutionTestCase.Builder builder) -> { 2844 final ClassData.Package pck = 2845 builder.classdata.get(builder.methodref).packageId; 2846 final int C2 = builder.methodref; 2847 final int I = builder.expected; 2848 final int C1 = builder.addClass(emptyClass(pck)); 2849 builder.hier.addInherit(C1, C2); 2850 builder.hier.addInherit(C1, I); 2851 builder.objectref = C1; 2852 }, 2853 /* Case 5: Overlapping with new interface. 2854 * 2855 * I2[*](res) = expected 2856 * C2[*](*) = mref, I1[I2]() 2857 * C1[C2,I2]() = oref 2858 */ 2859 (final SelectionResolutionTestCase.Builder builder) -> { 2860 final ClassData.Package pck = 2861 builder.classdata.get(builder.methodref).packageId; 2862 final int C2 = builder.methodref; 2863 final int I2 = builder.expected; 2864 final int I1 = builder.addInterface(emptyClass(pck)); 2865 final int C1 = builder.addClass(emptyClass(pck)); 2866 builder.hier.addInherit(C1, C2); 2867 builder.hier.addInherit(C1, I1); 2868 builder.hier.addInherit(I1, I2); 2869 builder.objectref = C1; 2870 }, 2871 /* Case 6: Overlapping with new interface with private def. 2872 * 2873 * I2[*](res) = expected 2874 * C2[*](*) = mref, I1[I2](priv) 2875 * C1[C2,I2]() = oref 2876 */ 2877 (final SelectionResolutionTestCase.Builder builder) -> { 2878 final ClassData.Package pck = 2879 builder.classdata.get(builder.methodref).packageId; 2880 final MethodData meth = 2881 new MethodData(MethodData.Access.PRIVATE, 2882 MethodData.Context.INSTANCE); 2883 final ClassData withPrivDef = 2884 new ClassData(pck, meth); 2885 final int C2 = builder.methodref; 2886 final int I2 = builder.expected; 2887 final int I1 = builder.addInterface(withPrivDef); 2888 final int C1 = builder.addClass(emptyClass(pck)); 2889 builder.hier.addInherit(C1, C2); 2890 builder.hier.addInherit(C1, I1); 2891 builder.hier.addInherit(I1, I2); 2892 builder.objectref = C1; 2893 }, 2894 /* Case 7: Overlapping with new interface with static def. 2895 * 2896 * I2[*](res) = expected 2897 * C2[*](*) = mref, I1[I2](stat) 2898 * C1[C2,I2]() = oref 2899 */ 2900 (final SelectionResolutionTestCase.Builder builder) -> { 2901 final ClassData.Package pck = 2902 builder.classdata.get(builder.methodref).packageId; 2903 final MethodData meth = 2904 new MethodData(MethodData.Access.PUBLIC, 2905 MethodData.Context.STATIC); 2906 final ClassData withStatDef = 2907 new ClassData(pck, meth); 2908 final int C2 = builder.methodref; 2909 final int I2 = builder.expected; 2910 final int I1 = builder.addInterface(withStatDef); 2911 final int C1 = builder.addClass(emptyClass(pck)); 2912 builder.hier.addInherit(C1, C2); 2913 builder.hier.addInherit(C1, I1); 2914 builder.hier.addInherit(I1, I2); 2915 builder.objectref = C1; 2916 }, 2917 /* Case 8: Objectref's super has a private def. 2918 * 2919 * C3[*](*) = mref 2920 * C2[C3](priv) 2921 * C1[C2]() = oref 2922 */ 2923 (final SelectionResolutionTestCase.Builder builder) -> { 2924 final ClassData.Package pck = 2925 builder.classdata.get(builder.methodref).packageId; 2926 final ClassData oldexpected = 2927 builder.classdata.get(builder.expected); 2928 final MethodData meth = 2929 new MethodData(MethodData.Access.PRIVATE, 2930 MethodData.Context.INSTANCE); 2931 final ClassData withDef = 2932 new ClassData(pck, meth); 2933 final int C3 = builder.methodref; 2934 final int C2 = builder.addClass(withDef); 2935 final int C1 = builder.addClass(emptyClass(pck)); 2936 builder.hier.addInherit(C2, C3); 2937 builder.hier.addInherit(C1, C2); 2938 builder.objectref = C1; 2939 }, 2940 /* Case 9: Objectref's super has a static def. 2941 * 2942 * C3[*](*) = mref 2943 * C2[C3](stat) 2944 * C1[C2]() = oref 2945 */ 2946 (final SelectionResolutionTestCase.Builder builder) -> { 2947 final ClassData.Package pck = 2948 builder.classdata.get(builder.methodref).packageId; 2949 final ClassData oldexpected = 2950 builder.classdata.get(builder.expected); 2951 final MethodData meth = 2952 new MethodData(MethodData.Access.PUBLIC, 2953 MethodData.Context.STATIC); 2954 final ClassData withDef = 2955 new ClassData(pck, meth); 2956 final int C3 = builder.methodref; 2957 final int C2 = builder.addClass(withDef); 2958 final int C1 = builder.addClass(emptyClass(pck)); 2959 builder.hier.addInherit(C2, C3); 2960 builder.hier.addInherit(C1, C2); 2961 builder.objectref = C1; 2962 }, 2963 /* Case 10: Overlap with objectref's super. 2964 * 2965 * I[*](res) = expected 2966 * C3[](*) = mref 2967 * C2[C3,I]() 2968 * C1[C2]() = oref 2969 */ 2970 (final SelectionResolutionTestCase.Builder builder) -> { 2971 final ClassData.Package pck = 2972 builder.classdata.get(builder.methodref).packageId; 2973 final int C3 = builder.methodref; 2974 final int C2 = builder.addClass(emptyClass(pck)); 2975 final int I = builder.expected; 2976 final int C1 = builder.addClass(emptyClass(pck)); 2977 builder.hier.addInherit(C2, C3); 2978 builder.hier.addInherit(C1, C2); 2979 builder.hier.addInherit(C2, I); 2980 builder.objectref = C1; 2981 }, 2982 /* Case 11: Overlap with objectref's super with new interface. 2983 * 2984 * I2[*](res) = expected 2985 * C3[](*) = mref, I1[I2]() 2986 * C2[C3,I1]() 2987 * C1[C2]() = oref 2988 */ 2989 (final SelectionResolutionTestCase.Builder builder) -> { 2990 final ClassData.Package pck = 2991 builder.classdata.get(builder.methodref).packageId; 2992 final int C3 = builder.methodref; 2993 final int C2 = builder.addClass(emptyClass(pck)); 2994 final int I2 = builder.expected; 2995 final int I1 = builder.addInterface(emptyClass(pck)); 2996 final int C1 = builder.addClass(emptyClass(pck)); 2997 builder.hier.addInherit(C2, C3); 2998 builder.hier.addInherit(C1, C2); 2999 builder.hier.addInherit(C2, I1); 3000 builder.hier.addInherit(I1, I2); 3001 builder.objectref = C1; 3002 }, 3003 /* Case 12: Overlap with objectref's super with new 3004 * interface with private def. 3005 * 3006 * I2[*](res) = expected 3007 * C3[](*) = mref, I1[I2](priv) 3008 * C2[C3,I1]() 3009 * C1[C2]() = oref 3010 */ 3011 (final SelectionResolutionTestCase.Builder builder) -> { 3012 final ClassData.Package pck = 3013 builder.classdata.get(builder.methodref).packageId; 3014 final MethodData meth = 3015 new MethodData(MethodData.Access.PRIVATE, 3016 MethodData.Context.INSTANCE); 3017 final ClassData withPrivDef = 3018 new ClassData(pck, meth); 3019 final int C3 = builder.methodref; 3020 final int C2 = builder.addClass(emptyClass(pck)); 3021 final int I2 = builder.expected; 3022 final int I1 = builder.addInterface(withPrivDef); 3023 final int C1 = builder.addClass(emptyClass(pck)); 3024 builder.hier.addInherit(C2, C3); 3025 builder.hier.addInherit(C1, C2); 3026 builder.hier.addInherit(C2, I1); 3027 builder.hier.addInherit(I1, I2); 3028 builder.objectref = C1; 3029 }, 3030 /* Case 13: Overlap with objectref's super with new 3031 * interface with static def. 3032 * 3033 * I2[*](res) = expected 3034 * C3[](*) = mref, I1[I2](stat) 3035 * C2[C3,I1]() 3036 * C1[C2]() = oref 3037 */ 3038 (final SelectionResolutionTestCase.Builder builder) -> { 3039 final ClassData.Package pck = 3040 builder.classdata.get(builder.methodref).packageId; 3041 final MethodData meth = 3042 new MethodData(MethodData.Access.PUBLIC, 3043 MethodData.Context.STATIC); 3044 final ClassData withStatDef = 3045 new ClassData(pck, meth); 3046 final int C3 = builder.methodref; 3047 final int C2 = builder.addClass(emptyClass(pck)); 3048 final int I2 = builder.expected; 3049 final int I1 = builder.addInterface(withStatDef); 3050 final int C1 = builder.addClass(emptyClass(pck)); 3051 builder.hier.addInherit(C2, C3); 3052 builder.hier.addInherit(C1, C2); 3053 builder.hier.addInherit(C2, I1); 3054 builder.hier.addInherit(I1, I2); 3055 builder.objectref = C1; 3056 }, 3057 /* Case 14: Overlap with objectref's super with new 3058 * interface double diamond. 3059 * 3060 * I3[*](res) = expected 3061 * C3[](*) = mref, I2[I3]() 3062 * C2[C3,I2](), I1[I2]() 3063 * C1[C2,I1]() = oref 3064 */ 3065 (final SelectionResolutionTestCase.Builder builder) -> { 3066 final ClassData.Package pck = 3067 builder.classdata.get(builder.methodref).packageId; 3068 final int C3 = builder.methodref; 3069 final int C2 = builder.addClass(emptyClass(pck)); 3070 final int I3 = builder.expected; 3071 final int I2 = builder.addInterface(emptyClass(pck)); 3072 final int I1 = builder.addInterface(emptyClass(pck)); 3073 final int C1 = builder.addClass(emptyClass(pck)); 3074 builder.hier.addInherit(C2, C3); 3075 builder.hier.addInherit(C1, C2); 3076 builder.hier.addInherit(C1, I1); 3077 builder.hier.addInherit(C2, I2); 3078 builder.hier.addInherit(I1, I2); 3079 builder.objectref = C1; 3080 }, 3081 /* Case 15: Overlapping with new interface with private def. 3082 * 3083 * C2[*](*) = mref, I1[](priv) 3084 * C1[C2,I2]() = oref 3085 */ 3086 (final SelectionResolutionTestCase.Builder builder) -> { 3087 final ClassData.Package pck = 3088 builder.classdata.get(builder.methodref).packageId; 3089 final MethodData meth = 3090 new MethodData(MethodData.Access.PRIVATE, 3091 MethodData.Context.INSTANCE); 3092 final ClassData withPrivDef = 3093 new ClassData(pck, meth); 3094 final int C2 = builder.methodref; 3095 final int I1 = builder.addInterface(withPrivDef); 3096 final int C1 = builder.addClass(emptyClass(pck)); 3097 builder.hier.addInherit(C1, C2); 3098 builder.hier.addInherit(C1, I1); 3099 builder.objectref = C1; 3100 }, 3101 /* Case 16: Overlapping with new interface with static def. 3102 * 3103 * C2[*](*) = mref, I1[](stat) 3104 * C1[C2,I2]() = oref 3105 */ 3106 (final SelectionResolutionTestCase.Builder builder) -> { 3107 final ClassData.Package pck = 3108 builder.classdata.get(builder.methodref).packageId; 3109 final MethodData meth = 3110 new MethodData(MethodData.Access.PUBLIC, 3111 MethodData.Context.STATIC); 3112 final ClassData withStatDef = 3113 new ClassData(pck, meth); 3114 final int C2 = builder.methodref; 3115 final int I1 = builder.addInterface(withStatDef); 3116 final int C1 = builder.addClass(emptyClass(pck)); 3117 builder.hier.addInherit(C1, C2); 3118 builder.hier.addInherit(C1, I1); 3119 builder.objectref = C1; 3120 }); 3121 3122 public static final Template MethodrefSelectionResolvedIsIface = 3123 new Template("MethodrefSelectionResolvedIsIface", 3124 MethodrefSelectionResolvedIsIfaceNoOverride, 3125 /* Case 17: Objectref overrides. 3126 * 3127 * C2[](*) = mref 3128 * C1[C2](res) = oref = expected 3129 */ 3130 (final SelectionResolutionTestCase.Builder builder) -> { 3131 final ClassData.Package pck = 3132 builder.classdata.get(builder.methodref).packageId; 3133 final ClassData oldexpected = 3134 builder.classdata.get(builder.expected); 3135 final ClassData withDef = 3136 new ClassData(pck, oldexpected.methoddata); 3137 final int C2 = builder.methodref; 3138 final int C1 = builder.addClass(withDef); 3139 builder.hier.addInherit(C1, C2); 3140 builder.objectref = C1; 3141 builder.expected = C1; 3142 }, 3143 /* Case 18: Overlapping with new interface overriding. 3144 * 3145 * I2[*](def) = old expected 3146 * C2[*](*) = mref, I1[I2](res) = expected 3147 * C1[C2,I2]() = oref 3148 */ 3149 (final SelectionResolutionTestCase.Builder builder) -> { 3150 final ClassData.Package pck = 3151 builder.classdata.get(builder.methodref).packageId; 3152 final ClassData oldexpected = 3153 builder.classdata.get(builder.expected); 3154 final ClassData withDef = 3155 new ClassData(pck, oldexpected.methoddata); 3156 final int C2 = builder.methodref; 3157 final int I2 = builder.expected; 3158 final int I1 = builder.addInterface(withDef); 3159 final int C1 = builder.addClass(emptyClass(pck)); 3160 builder.hier.addInherit(C1, C2); 3161 builder.hier.addInherit(C1, I1); 3162 builder.hier.addInherit(I1, I2); 3163 builder.objectref = C1; 3164 builder.expected = I1; 3165 }, 3166 /* Case 19: Objectref's super overrides. 3167 * 3168 * C3[](*) = mref 3169 * C2[C3](res) = expected 3170 * C1[C2]() = oref 3171 */ 3172 (final SelectionResolutionTestCase.Builder builder) -> { 3173 final ClassData.Package pck = 3174 builder.classdata.get(builder.methodref).packageId; 3175 final ClassData oldexpected = 3176 builder.classdata.get(builder.expected); 3177 final ClassData withDef = 3178 new ClassData(pck, oldexpected.methoddata); 3179 final int C3 = builder.methodref; 3180 final int C2 = builder.addClass(withDef); 3181 final int C1 = builder.addClass(emptyClass(pck)); 3182 builder.hier.addInherit(C2, C3); 3183 builder.hier.addInherit(C1, C2); 3184 builder.objectref = C1; 3185 builder.expected = C2; 3186 }, 3187 /* Case 20: Overlap with objectref's super with 3188 * new interface overriding. 3189 * 3190 * I2[*](def) = old expected 3191 * C3[](*) = mref, I1[I2](res) = expected 3192 * C2[C3,I1]() 3193 * C1[C2]() = oref 3194 */ 3195 (final SelectionResolutionTestCase.Builder builder) -> { 3196 final ClassData.Package pck = 3197 builder.classdata.get(builder.methodref).packageId; 3198 final ClassData oldexpected = 3199 builder.classdata.get(builder.expected); 3200 final ClassData withDef = 3201 new ClassData(pck, oldexpected.methoddata); 3202 final int C3 = builder.methodref; 3203 final int C2 = builder.addClass(emptyClass(pck)); 3204 final int I2 = builder.expected; 3205 final int I1 = builder.addInterface(withDef); 3206 final int C1 = builder.addClass(emptyClass(pck)); 3207 builder.hier.addInherit(C2, C3); 3208 builder.hier.addInherit(C1, C2); 3209 builder.hier.addInherit(C2, I1); 3210 builder.hier.addInherit(I1, I2); 3211 builder.objectref = C1; 3212 builder.expected = I1; 3213 }, 3214 /* Case 21: Overlap with objectref's super with new 3215 * interface double diamond, overriding. 3216 * 3217 * I3[*](def) = old expected 3218 * C3[](*) = mref, I2[I3](def) 3219 * C2[C3,I2](), I1[I2](res) = expected 3220 * C1[C2,I1]() = oref 3221 */ 3222 (final SelectionResolutionTestCase.Builder builder) -> { 3223 final ClassData.Package pck = 3224 builder.classdata.get(builder.methodref).packageId; 3225 final ClassData oldexpected = 3226 builder.classdata.get(builder.expected); 3227 final ClassData withDef = 3228 new ClassData(pck, oldexpected.methoddata); 3229 final int C3 = builder.methodref; 3230 final int C2 = builder.addClass(emptyClass(pck)); 3231 final int I3 = builder.expected; 3232 final int I2 = builder.addInterface(withDef); 3233 final int I1 = builder.addInterface(withDef); 3234 final int C1 = builder.addClass(emptyClass(pck)); 3235 builder.hier.addInherit(C2, C3); 3236 builder.hier.addInherit(C1, C2); 3237 builder.hier.addInherit(C1, I1); 3238 builder.hier.addInherit(C2, I2); 3239 builder.hier.addInherit(I1, I2); 3240 builder.hier.addInherit(I2, I3); 3241 builder.objectref = C1; 3242 builder.expected = I1; 3243 }, 3244 /* Case 22: Objectref's super overrides, skip private. 3245 * 3246 * C3[](*) = mref 3247 * C2[C3](res) = expected 3248 * C1[C2](priv) = oref 3249 */ 3250 (final SelectionResolutionTestCase.Builder builder) -> { 3251 final ClassData.Package pck = 3252 builder.classdata.get(builder.methodref).packageId; 3253 final ClassData oldexpected = 3254 builder.classdata.get(builder.expected); 3255 final MethodData meth = 3256 new MethodData(MethodData.Access.PRIVATE, 3257 MethodData.Context.INSTANCE); 3258 final ClassData withPrivDef = 3259 new ClassData(pck, meth); 3260 final ClassData withDef = 3261 new ClassData(pck, oldexpected.methoddata); 3262 final int C3 = builder.methodref; 3263 final int C2 = builder.addClass(withDef); 3264 final int C1 = builder.addClass(withPrivDef); 3265 builder.hier.addInherit(C2, C3); 3266 builder.hier.addInherit(C1, C2); 3267 builder.objectref = C1; 3268 builder.expected = C2; 3269 }, 3270 /* Case 23: Objectref's super overrides, skip static. 3271 * 3272 * C3[](*) = mref 3273 * C2[C3](res) = expected 3274 * C1[C2](stat) = oref 3275 */ 3276 (final SelectionResolutionTestCase.Builder builder) -> { 3277 final ClassData.Package pck = 3278 builder.classdata.get(builder.methodref).packageId; 3279 final ClassData oldexpected = 3280 builder.classdata.get(builder.expected); 3281 final MethodData meth = 3282 new MethodData(MethodData.Access.PUBLIC, 3283 MethodData.Context.STATIC); 3284 final ClassData withStatDef = 3285 new ClassData(pck, meth); 3286 final ClassData withDef = 3287 new ClassData(pck, oldexpected.methoddata); 3288 final int C3 = builder.methodref; 3289 final int C2 = builder.addClass(withDef); 3290 final int C1 = builder.addClass(withStatDef); 3291 builder.hier.addInherit(C2, C3); 3292 builder.hier.addInherit(C1, C2); 3293 builder.objectref = C1; 3294 builder.expected = C2; 3295 }, 3296 /* Case 24: Overlap with objectref's super with new 3297 * interface double diamond, overriding, skip private. 3298 * 3299 * I3[*](def) = old expected 3300 * C3[](*) = mref, I2[I3](res) = expected 3301 * C2[C3,I2](), I1[I2](priv) 3302 * C1[C2,I1]() = oref 3303 */ 3304 (final SelectionResolutionTestCase.Builder builder) -> { 3305 final ClassData.Package pck = 3306 builder.classdata.get(builder.methodref).packageId; 3307 final ClassData oldexpected = 3308 builder.classdata.get(builder.expected); 3309 final ClassData withDef = 3310 new ClassData(pck, oldexpected.methoddata); 3311 final MethodData meth = 3312 new MethodData(MethodData.Access.PRIVATE, 3313 MethodData.Context.INSTANCE); 3314 final ClassData withPrivDef = 3315 new ClassData(pck, meth); 3316 final int C3 = builder.methodref; 3317 final int C2 = builder.addClass(emptyClass(pck)); 3318 final int I3 = builder.expected; 3319 final int I2 = builder.addInterface(withDef); 3320 final int I1 = builder.addInterface(withPrivDef); 3321 final int C1 = builder.addClass(emptyClass(pck)); 3322 builder.hier.addInherit(C2, C3); 3323 builder.hier.addInherit(C1, C2); 3324 builder.hier.addInherit(C1, I1); 3325 builder.hier.addInherit(C2, I2); 3326 builder.hier.addInherit(I1, I2); 3327 builder.hier.addInherit(I2, I3); 3328 builder.objectref = C1; 3329 builder.expected = I2; 3330 }, 3331 /* Case 25: Overlap with objectref's super with new 3332 * interface double diamond, overriding, skip static. 3333 * 3334 * I3[*](def) = old expected 3335 * C3[](*) = mref, I2[I3](res) = expected 3336 * C2[C3,I2](), I1[I2](stat) 3337 * C1[C2,I1]() = oref 3338 */ 3339 (final SelectionResolutionTestCase.Builder builder) -> { 3340 final ClassData.Package pck = 3341 builder.classdata.get(builder.methodref).packageId; 3342 final ClassData oldexpected = 3343 builder.classdata.get(builder.expected); 3344 final ClassData withDef = 3345 new ClassData(pck, oldexpected.methoddata); 3346 final MethodData meth = 3347 new MethodData(MethodData.Access.PUBLIC, 3348 MethodData.Context.STATIC); 3349 final ClassData withStatDef = 3350 new ClassData(pck, meth); 3351 final int C3 = builder.methodref; 3352 final int C2 = builder.addClass(emptyClass(pck)); 3353 final int I3 = builder.expected; 3354 final int I2 = builder.addInterface(withDef); 3355 final int I1 = builder.addInterface(withStatDef); 3356 final int C1 = builder.addClass(emptyClass(pck)); 3357 builder.hier.addInherit(C2, C3); 3358 builder.hier.addInherit(C1, C2); 3359 builder.hier.addInherit(C1, I1); 3360 builder.hier.addInherit(C2, I2); 3361 builder.hier.addInherit(I1, I2); 3362 builder.hier.addInherit(I2, I3); 3363 builder.objectref = C1; 3364 builder.expected = I2; 3365 }, 3366 /* Case 26: Skip interface method after class overrides. 3367 * 3368 * C3[](*) = mref 3369 * C2[C3](res) = expected, I[](def) 3370 * C1[C2, I]() = oref 3371 */ 3372 (final SelectionResolutionTestCase.Builder builder) -> { 3373 final ClassData.Package pck = 3374 builder.classdata.get(builder.methodref).packageId; 3375 final ClassData oldexpected = 3376 builder.classdata.get(builder.expected); 3377 final ClassData withDef = 3378 new ClassData(pck, oldexpected.methoddata); 3379 final int C3 = builder.methodref; 3380 final int C2 = builder.addClass(withDef); 3381 final int C1 = builder.addClass(emptyClass(pck)); 3382 final int I = builder.addInterface(withDef); 3383 builder.hier.addInherit(C2, C3); 3384 builder.hier.addInherit(C1, C2); 3385 builder.hier.addInherit(C1, I); 3386 builder.objectref = C1; 3387 builder.expected = C2; 3388 }, 3389 /* Case 27: Skip interface method after class overrides. 3390 * 3391 * C3[](*) = mref, I[](def) 3392 * C2[C3,I](res) = expected 3393 * C1[C2]() = oref 3394 */ 3395 (final SelectionResolutionTestCase.Builder builder) -> { 3396 final ClassData.Package pck = 3397 builder.classdata.get(builder.methodref).packageId; 3398 final ClassData oldexpected = 3399 builder.classdata.get(builder.expected); 3400 final ClassData withDef = 3401 new ClassData(pck, oldexpected.methoddata); 3402 final int C3 = builder.methodref; 3403 final int C2 = builder.addClass(withDef); 3404 final int C1 = builder.addClass(emptyClass(pck)); 3405 final int I = builder.addInterface(withDef); 3406 builder.hier.addInherit(C2, C3); 3407 builder.hier.addInherit(C1, C2); 3408 builder.hier.addInherit(C2, I); 3409 builder.objectref = C1; 3410 builder.expected = C2; 3411 }, 3412 /* Case 28: Overlap with objectref's super with new 3413 * interface double diamond, overriding. 3414 * 3415 * I3[*](def) = old expected 3416 * C3[](*) = mref, I2[I3](def) 3417 * C2[C3,I2](res) = expected, I1[I2](def) = expected 3418 * C1[C2,I1]() = oref 3419 */ 3420 (final SelectionResolutionTestCase.Builder builder) -> { 3421 final ClassData.Package pck = 3422 builder.classdata.get(builder.methodref).packageId; 3423 final ClassData oldexpected = 3424 builder.classdata.get(builder.expected); 3425 final ClassData withDef = 3426 new ClassData(pck, oldexpected.methoddata); 3427 final int C3 = builder.methodref; 3428 final int C2 = builder.addClass(withDef); 3429 final int I3 = builder.expected; 3430 final int I2 = builder.addInterface(withDef); 3431 final int I1 = builder.addInterface(withDef); 3432 final int C1 = builder.addClass(emptyClass(pck)); 3433 builder.hier.addInherit(C2, C3); 3434 builder.hier.addInherit(C1, C2); 3435 builder.hier.addInherit(C1, I1); 3436 builder.hier.addInherit(C2, I2); 3437 builder.hier.addInherit(I1, I2); 3438 builder.hier.addInherit(I2, I3); 3439 builder.objectref = C1; 3440 builder.expected = C2; 3441 }); 3442 3443 public static final Template IfaceMethodrefSelectionNoOverride = 3444 new Template("IfaceMethodrefSelectionNoOverride", 3445 /* Case 1: Inherit from super. 3446 * 3447 * I[](*) = mref 3448 * C[I]() = oref 3449 */ 3450 (final SelectionResolutionTestCase.Builder builder) -> { 3451 final ClassData.Package pck = 3452 builder.classdata.get(builder.methodref).packageId; 3453 final int I = builder.methodref; 3454 final int C = builder.addClass(emptyClass(pck)); 3455 builder.hier.addInherit(C, I); 3456 builder.objectref = C; 3457 }, 3458 /* Case 2: Objectref has static def 3459 * 3460 * I[](*) = mref 3461 * C[I](stat) = oref 3462 */ 3463 (final SelectionResolutionTestCase.Builder builder) -> { 3464 final ClassData.Package pck = 3465 builder.classdata.get(builder.methodref).packageId; 3466 final MethodData meth = 3467 new MethodData(MethodData.Access.PUBLIC, 3468 MethodData.Context.STATIC); 3469 final ClassData withStatDef = 3470 new ClassData(pck, meth); 3471 final int I = builder.methodref; 3472 final int C = builder.addClass(withStatDef); 3473 builder.hier.addInherit(C, I); 3474 builder.objectref = C; 3475 }, 3476 /* Case 3: Diamond, methodref at top. 3477 * 3478 * I3[](*) = mref 3479 * I1[I3](), I2[I3]() 3480 * C[I1,I2]() = oref 3481 */ 3482 (final SelectionResolutionTestCase.Builder builder) -> { 3483 final ClassData.Package pck = 3484 builder.classdata.get(builder.expected).packageId; 3485 final int I3 = builder.methodref; 3486 final int I2 = builder.addInterface(emptyClass(pck)); 3487 final int I1 = builder.addInterface(emptyClass(pck)); 3488 final int C = builder.addClass(emptyClass(pck)); 3489 builder.hier.addInherit(C, I1); 3490 builder.hier.addInherit(C, I2); 3491 builder.hier.addInherit(I1, I3); 3492 builder.hier.addInherit(I2, I3); 3493 builder.objectref = C; 3494 }, 3495 /* Case 4: Diamond, methodref at top, skip private def 3496 * 3497 * I3[](*) = mref 3498 * I1[I3](), I2[I3](priv) 3499 * C[I1,I2]() = oref 3500 */ 3501 (final SelectionResolutionTestCase.Builder builder) -> { 3502 final ClassData.Package pck = 3503 builder.classdata.get(builder.expected).packageId; 3504 final MethodData meth = 3505 new MethodData(MethodData.Access.PRIVATE, 3506 MethodData.Context.INSTANCE); 3507 final ClassData withPrivDef = 3508 new ClassData(pck, meth); 3509 final int I3 = builder.methodref; 3510 final int I2 = builder.addInterface(withPrivDef); 3511 final int I1 = builder.addInterface(emptyClass(pck)); 3512 final int C = builder.addClass(emptyClass(pck)); 3513 builder.hier.addInherit(C, I1); 3514 builder.hier.addInherit(C, I2); 3515 builder.hier.addInherit(I1, I3); 3516 builder.hier.addInherit(I2, I3); 3517 builder.objectref = C; 3518 }, 3519 /* Case 5: Diamond, methodref at top, skip static def 3520 * 3521 * I3[](*) = mref 3522 * I1[I3](), I2[I3](stat) 3523 * C[I1,I2]() = oref 3524 */ 3525 (final SelectionResolutionTestCase.Builder builder) -> { 3526 final ClassData.Package pck = 3527 builder.classdata.get(builder.expected).packageId; 3528 final MethodData meth = 3529 new MethodData(MethodData.Access.PUBLIC, 3530 MethodData.Context.STATIC); 3531 final ClassData withStatDef = 3532 new ClassData(pck, meth); 3533 final int I3 = builder.methodref; 3534 final int I2 = builder.addInterface(withStatDef); 3535 final int I1 = builder.addInterface(emptyClass(pck)); 3536 final int C = builder.addClass(emptyClass(pck)); 3537 builder.hier.addInherit(C, I1); 3538 builder.hier.addInherit(C, I2); 3539 builder.hier.addInherit(I1, I3); 3540 builder.hier.addInherit(I2, I3); 3541 builder.objectref = C; 3542 }, 3543 /* Case 6: Diamond, overlap with resolution. 3544 * 3545 * I3[](res) = expected 3546 * I1[I3](), I2[](*) = mref 3547 * C[I1,I2]() = oref 3548 */ 3549 (final SelectionResolutionTestCase.Builder builder) -> { 3550 final ClassData.Package pck = 3551 builder.classdata.get(builder.expected).packageId; 3552 final int I3 = builder.expected; 3553 final int I2 = builder.methodref; 3554 final int I1 = builder.addInterface(emptyClass(pck)); 3555 final int C = builder.addClass(emptyClass(pck)); 3556 builder.hier.addInherit(C, I1); 3557 builder.hier.addInherit(C, I2); 3558 builder.hier.addInherit(I1, I3); 3559 builder.objectref = C; 3560 }, 3561 /* Case 7: Diamond, with superclass, expected at top. 3562 * 3563 * I2[](*) = mref 3564 * C2[I2](), I1[I2]() 3565 * C1[I1,C2]() = oref 3566 */ 3567 (final SelectionResolutionTestCase.Builder builder) -> { 3568 final ClassData.Package pck = 3569 builder.classdata.get(builder.expected).packageId; 3570 final int I2 = builder.methodref; 3571 final int I1 = builder.addInterface(emptyClass(pck)); 3572 final int C2 = builder.addClass(emptyClass(pck)); 3573 final int C1 = builder.addClass(emptyClass(pck)); 3574 builder.hier.addInherit(C1, I1); 3575 builder.hier.addInherit(C1, C2); 3576 builder.hier.addInherit(I1, I2); 3577 builder.hier.addInherit(C2, I2); 3578 builder.objectref = C1; 3579 }, 3580 /* Case 8: Diamond, with superclass, expected at top, 3581 * class has static def. 3582 * 3583 * I2[](*) = mref 3584 * C2[I2](stat), I1[I2]() 3585 * C1[I1,C2]() = oref 3586 */ 3587 (final SelectionResolutionTestCase.Builder builder) -> { 3588 final ClassData.Package pck = 3589 builder.classdata.get(builder.expected).packageId; 3590 final MethodData meth = 3591 new MethodData(MethodData.Access.PUBLIC, 3592 MethodData.Context.STATIC); 3593 final ClassData withStatDef = 3594 new ClassData(pck, meth); 3595 final int I2 = builder.methodref; 3596 final int I1 = builder.addInterface(emptyClass(pck)); 3597 final int C2 = builder.addClass(withStatDef); 3598 final int C1 = builder.addClass(emptyClass(pck)); 3599 builder.hier.addInherit(C1, I1); 3600 builder.hier.addInherit(C1, C2); 3601 builder.hier.addInherit(I1, I2); 3602 builder.hier.addInherit(C2, I2); 3603 builder.objectref = C1; 3604 }, 3605 /* Case 9: Diamond, with superclass, expected at top, 3606 * interface has private def 3607 * 3608 * I2[](*) = mref 3609 * C2[I2](), I1[I2](priv) 3610 * C1[I1,C2]() = oref 3611 */ 3612 (final SelectionResolutionTestCase.Builder builder) -> { 3613 final ClassData.Package pck = 3614 builder.classdata.get(builder.expected).packageId; 3615 final MethodData meth = 3616 new MethodData(MethodData.Access.PRIVATE, 3617 MethodData.Context.INSTANCE); 3618 final ClassData withPrivDef = 3619 new ClassData(pck, meth); 3620 final int I2 = builder.methodref; 3621 final int I1 = builder.addInterface(withPrivDef); 3622 final int C2 = builder.addClass(emptyClass(pck)); 3623 final int C1 = builder.addClass(emptyClass(pck)); 3624 builder.hier.addInherit(C1, I1); 3625 builder.hier.addInherit(C1, C2); 3626 builder.hier.addInherit(I1, I2); 3627 builder.hier.addInherit(C2, I2); 3628 builder.objectref = C1; 3629 }, 3630 /* Case 10: Diamond, with superclass, expected at top, 3631 * interface has static def 3632 * 3633 * I2[](*) = mref 3634 * C2[I2](), I1[I2](stat) 3635 * C1[I1,C2]() = oref 3636 */ 3637 (final SelectionResolutionTestCase.Builder builder) -> { 3638 final ClassData.Package pck = 3639 builder.classdata.get(builder.expected).packageId; 3640 final MethodData meth = 3641 new MethodData(MethodData.Access.PUBLIC, 3642 MethodData.Context.STATIC); 3643 final ClassData withPrivDef = 3644 new ClassData(pck, meth); 3645 final int I2 = builder.methodref; 3646 final int I1 = builder.addInterface(withPrivDef); 3647 final int C2 = builder.addClass(emptyClass(pck)); 3648 final int C1 = builder.addClass(emptyClass(pck)); 3649 builder.hier.addInherit(C1, I1); 3650 builder.hier.addInherit(C1, C2); 3651 builder.hier.addInherit(I1, I2); 3652 builder.hier.addInherit(C2, I2); 3653 builder.objectref = C1; 3654 }, 3655 /* Case 11: Y, with superclass, expected 3656 * at top. 3657 * 3658 * C2[](), I1[](*) = mref 3659 * C1[I1,C2]() = oref 3660 */ 3661 (final SelectionResolutionTestCase.Builder builder) -> { 3662 final ClassData.Package pck = 3663 builder.classdata.get(builder.expected).packageId; 3664 final int I1 = builder.methodref; 3665 final int C2 = builder.addClass(emptyClass(pck)); 3666 final int C1 = builder.addClass(emptyClass(pck)); 3667 builder.hier.addInherit(C1, I1); 3668 builder.hier.addInherit(C1, C2); 3669 builder.objectref = C1; 3670 }, 3671 /* Case 12: Y, with superclass, expected 3672 * at top, class has static def 3673 * 3674 * C2[](stat), I1[](*) = mref 3675 * C1[I1,C2]() = oref 3676 */ 3677 (final SelectionResolutionTestCase.Builder builder) -> { 3678 final ClassData.Package pck = 3679 builder.classdata.get(builder.expected).packageId; 3680 final MethodData meth = 3681 new MethodData(MethodData.Access.PUBLIC, 3682 MethodData.Context.STATIC); 3683 final ClassData withStatDef = 3684 new ClassData(pck, meth); 3685 final int I1 = builder.methodref; 3686 final int C2 = builder.addClass(emptyClass(pck)); 3687 final int C1 = builder.addClass(emptyClass(pck)); 3688 builder.hier.addInherit(C1, I1); 3689 builder.hier.addInherit(C1, C2); 3690 builder.objectref = C1; 3691 }, 3692 /* Case 13: Diamond, with superclass, overlapping, expected 3693 * at top. 3694 * 3695 * I2[](res) = expected 3696 * C2[I2](), I1[](*) = mref 3697 * C1[I1,C2]() = oref 3698 */ 3699 (final SelectionResolutionTestCase.Builder builder) -> { 3700 final ClassData.Package pck = 3701 builder.classdata.get(builder.expected).packageId; 3702 final int I2 = builder.expected; 3703 final int I1 = builder.methodref; 3704 final int C2 = builder.addClass(emptyClass(pck)); 3705 final int C1 = builder.addClass(emptyClass(pck)); 3706 builder.hier.addInherit(C1, I1); 3707 builder.hier.addInherit(C1, C2); 3708 builder.hier.addInherit(C2, I2); 3709 builder.objectref = C1; 3710 }, 3711 /* Case 14: Diamond, with superclass, overlapping, expected 3712 * at top, class has static def 3713 * 3714 * I2[](def) = expected 3715 * C2[I2](stat), I1[](*) = mref 3716 * C1[I1,C2]() = oref 3717 */ 3718 (final SelectionResolutionTestCase.Builder builder) -> { 3719 final ClassData.Package pck = 3720 builder.classdata.get(builder.expected).packageId; 3721 final MethodData meth = 3722 new MethodData(MethodData.Access.PUBLIC, 3723 MethodData.Context.STATIC); 3724 final ClassData withStatDef = 3725 new ClassData(pck, meth); 3726 final int I2 = builder.expected; 3727 final int I1 = builder.methodref; 3728 final int C2 = builder.addClass(withStatDef); 3729 final int C1 = builder.addClass(emptyClass(pck)); 3730 builder.hier.addInherit(C1, I1); 3731 builder.hier.addInherit(C1, C2); 3732 builder.hier.addInherit(C2, I2); 3733 builder.objectref = C1; 3734 }, 3735 /* Case 15: Inherit through superclass. 3736 * 3737 * I[](*) = mref 3738 * C2[I]() 3739 * C1[C2]() = oref 3740 */ 3741 (final SelectionResolutionTestCase.Builder builder) -> { 3742 final ClassData.Package pck = 3743 builder.classdata.get(builder.expected).packageId; 3744 final int I = builder.methodref; 3745 final int C2 = builder.addClass(emptyClass(pck)); 3746 final int C1 = builder.addClass(emptyClass(pck)); 3747 builder.hier.addInherit(C1, I); 3748 builder.hier.addInherit(C1, C2); 3749 builder.hier.addInherit(C2, I); 3750 builder.objectref = C1; 3751 }, 3752 /* Case 16: Superclass has static def. 3753 * 3754 * I[](*) = mref 3755 * C2[I](stat) = expected 3756 * C1[C2]() = oref 3757 */ 3758 (final SelectionResolutionTestCase.Builder builder) -> { 3759 final ClassData.Package pck = 3760 builder.classdata.get(builder.expected).packageId; 3761 final MethodData meth = 3762 new MethodData(MethodData.Access.PUBLIC, 3763 MethodData.Context.STATIC); 3764 final ClassData withStatDef = 3765 new ClassData(pck, meth); 3766 final int I = builder.methodref; 3767 final int C2 = builder.addClass(withStatDef); 3768 final int C1 = builder.addClass(emptyClass(pck)); 3769 builder.hier.addInherit(C1, I); 3770 builder.hier.addInherit(C1, C2); 3771 builder.hier.addInherit(C2, I); 3772 builder.objectref = C1; 3773 }, 3774 /* Case 17: Diamond, inherit through superclass, 3775 * methodref at top. 3776 * 3777 * I3[](*) = mref 3778 * I1[I3](), I2[I3]() 3779 * C2[I1,I2]() 3780 * C1[C2]() = oref 3781 */ 3782 (final SelectionResolutionTestCase.Builder builder) -> { 3783 final ClassData.Package pck = 3784 builder.classdata.get(builder.expected).packageId; 3785 final int I3 = builder.methodref; 3786 final int I2 = builder.addInterface(emptyClass(pck)); 3787 final int I1 = builder.addInterface(emptyClass(pck)); 3788 final int C2 = builder.addClass(emptyClass(pck)); 3789 final int C1 = builder.addClass(emptyClass(pck)); 3790 builder.hier.addInherit(C2, I1); 3791 builder.hier.addInherit(C2, I2); 3792 builder.hier.addInherit(I1, I3); 3793 builder.hier.addInherit(I2, I3); 3794 builder.hier.addInherit(C1, C2); 3795 builder.objectref = C1; 3796 }, 3797 /* Case 18: Diamond, with superclass, inherit through 3798 * superclass, methodref at top. 3799 * 3800 * I2[](*) = mref 3801 * C3[I2](), I1[I2]() 3802 * C2[I1,C3]() 3803 * C1[C2]() = oref 3804 */ 3805 (final SelectionResolutionTestCase.Builder builder) -> { 3806 final ClassData.Package pck = 3807 builder.classdata.get(builder.expected).packageId; 3808 final int I2 = builder.methodref; 3809 final int I1 = builder.addInterface(emptyClass(pck)); 3810 final int C3 = builder.addClass(emptyClass(pck)); 3811 final int C2 = builder.addClass(emptyClass(pck)); 3812 final int C1 = builder.addClass(emptyClass(pck)); 3813 builder.hier.addInherit(C2, I1); 3814 builder.hier.addInherit(C2, C3); 3815 builder.hier.addInherit(I1, I2); 3816 builder.hier.addInherit(C3, I2); 3817 builder.hier.addInherit(C1, C2); 3818 builder.objectref = C1; 3819 }, 3820 /* Case 19: Diamond, inherit through superclass, 3821 * expected at top, skip private. 3822 * 3823 * I3[](*) = mref 3824 * I1[I3](), I2[I3](priv) 3825 * C2[I1,I2]() 3826 * C1[C2]() = oref 3827 */ 3828 (final SelectionResolutionTestCase.Builder builder) -> { 3829 final ClassData.Package pck = 3830 builder.classdata.get(builder.expected).packageId; 3831 final MethodData meth = 3832 new MethodData(MethodData.Access.PRIVATE, 3833 MethodData.Context.INSTANCE); 3834 final ClassData withPrivDef = 3835 new ClassData(pck, meth); 3836 final int I3 = builder.methodref; 3837 final int I2 = builder.addInterface(withPrivDef); 3838 final int I1 = builder.addInterface(emptyClass(pck)); 3839 final int C2 = builder.addClass(emptyClass(pck)); 3840 final int C1 = builder.addClass(emptyClass(pck)); 3841 builder.hier.addInherit(C2, I1); 3842 builder.hier.addInherit(C2, I2); 3843 builder.hier.addInherit(I1, I3); 3844 builder.hier.addInherit(I2, I3); 3845 builder.hier.addInherit(C1, C2); 3846 builder.objectref = C1; 3847 }, 3848 /* Case 20: Diamond, inherit through superclass, 3849 * expected at top, skip static. 3850 * 3851 * I3[](*) = mref 3852 * I1[I3](), I2[I3](stat) 3853 * C2[I1,I2]() 3854 * C1[C2]() = oref 3855 */ 3856 (final SelectionResolutionTestCase.Builder builder) -> { 3857 final ClassData.Package pck = 3858 builder.classdata.get(builder.expected).packageId; 3859 final MethodData meth = 3860 new MethodData(MethodData.Access.PUBLIC, 3861 MethodData.Context.STATIC); 3862 final ClassData withStatDef = 3863 new ClassData(pck, meth); 3864 final int I3 = builder.methodref; 3865 final int I2 = builder.addInterface(withStatDef); 3866 final int I1 = builder.addInterface(emptyClass(pck)); 3867 final int C2 = builder.addClass(emptyClass(pck)); 3868 final int C1 = builder.addClass(emptyClass(pck)); 3869 builder.hier.addInherit(C2, I1); 3870 builder.hier.addInherit(C2, I2); 3871 builder.hier.addInherit(I1, I3); 3872 builder.hier.addInherit(I2, I3); 3873 builder.hier.addInherit(C1, C2); 3874 builder.objectref = C1; 3875 }, 3876 /* Case 21: Diamond, inherit through superclass, 3877 * overlapping, expected at top. 3878 * 3879 * I3[](res) = expected 3880 * I1[I3](), I2[*](*) = mref 3881 * C2[I1,I2]() 3882 * C1[C2]() = oref 3883 */ 3884 (final SelectionResolutionTestCase.Builder builder) -> { 3885 final ClassData.Package pck = 3886 builder.classdata.get(builder.expected).packageId; 3887 final int I3 = builder.expected; 3888 final int I2 = builder.methodref; 3889 final int I1 = builder.addInterface(emptyClass(pck)); 3890 final int C2 = builder.addClass(emptyClass(pck)); 3891 final int C1 = builder.addClass(emptyClass(pck)); 3892 builder.hier.addInherit(C2, I1); 3893 builder.hier.addInherit(C2, I2); 3894 builder.hier.addInherit(I1, I3); 3895 builder.hier.addInherit(C1, C2); 3896 builder.objectref = C1; 3897 }, 3898 /* Case 22: Y, with superclass, inherit through 3899 * superclass, expected at top. 3900 * 3901 * C3[](), I1[*](*) = mref 3902 * C2[I1,C3]() 3903 * C1[C2]() = oref 3904 */ 3905 (final SelectionResolutionTestCase.Builder builder) -> { 3906 final ClassData.Package pck = 3907 builder.classdata.get(builder.expected).packageId; 3908 final int I1 = builder.methodref; 3909 final int C3 = builder.addClass(emptyClass(pck)); 3910 final int C2 = builder.addClass(emptyClass(pck)); 3911 final int C1 = builder.addClass(emptyClass(pck)); 3912 builder.hier.addInherit(C2, I1); 3913 builder.hier.addInherit(C2, C3); 3914 builder.hier.addInherit(C1, C2); 3915 builder.objectref = C1; 3916 }, 3917 /* Case 23: Diamond, with superclass, inherit through 3918 * superclass, overlapping, expected at top. 3919 * 3920 * I2[](res) = expected 3921 * C3[I2](), I1[*](*) = mref 3922 * C2[I1,C3]() 3923 * C1[C2]() = oref 3924 */ 3925 (final SelectionResolutionTestCase.Builder builder) -> { 3926 final ClassData.Package pck = 3927 builder.classdata.get(builder.expected).packageId; 3928 final int I2 = builder.expected; 3929 final int I1 = builder.methodref; 3930 final int C3 = builder.addClass(emptyClass(pck)); 3931 final int C2 = builder.addClass(emptyClass(pck)); 3932 final int C1 = builder.addClass(emptyClass(pck)); 3933 builder.hier.addInherit(C2, I1); 3934 builder.hier.addInherit(C2, C3); 3935 builder.hier.addInherit(C3, I2); 3936 builder.hier.addInherit(C1, C2); 3937 builder.objectref = C1; 3938 }, 3939 /* Case 24: Double diamond, with superclass, inherit through 3940 * superclass, overlapping expected at top. 3941 * 3942 * I3[](res) = expected 3943 * C3[I3](), I2[*](*) = mref 3944 * C2[I2,C3](), I1[I2]() 3945 * C1[C2,I1]() = oref 3946 */ 3947 (final SelectionResolutionTestCase.Builder builder) -> { 3948 final ClassData.Package pck = 3949 builder.classdata.get(builder.expected).packageId; 3950 final int I3 = builder.expected; 3951 final int I2 = builder.methodref; 3952 final int I1 = builder.addInterface(emptyClass(pck)); 3953 final int C3 = builder.addClass(emptyClass(pck)); 3954 final int C2 = builder.addClass(emptyClass(pck)); 3955 final int C1 = builder.addClass(emptyClass(pck)); 3956 builder.hier.addInherit(C2, I2); 3957 builder.hier.addInherit(C2, C3); 3958 builder.hier.addInherit(C3, I3); 3959 builder.hier.addInherit(C1, C2); 3960 builder.hier.addInherit(I1, I2); 3961 builder.hier.addInherit(C1, I1); 3962 builder.objectref = C1; 3963 }, 3964 /* Case 25: Double diamond, with superclass, inherit through 3965 * superclass, skip private. 3966 * 3967 * I3[](def) = old expected 3968 * C3[I3](), I2[*](*) = mref 3969 * C2[I2,C3](), I1[I2](priv) 3970 * C1[C2,I1]() = oref 3971 */ 3972 (final SelectionResolutionTestCase.Builder builder) -> { 3973 final ClassData.Package pck = 3974 builder.classdata.get(builder.expected).packageId; 3975 final MethodData meth = 3976 new MethodData(MethodData.Access.PRIVATE, 3977 MethodData.Context.INSTANCE); 3978 final ClassData withPrivDef = 3979 new ClassData(pck, meth); 3980 final int I3 = builder.expected; 3981 final int I2 = builder.methodref; 3982 final int I1 = builder.addInterface(withPrivDef); 3983 final int C3 = builder.addClass(emptyClass(pck)); 3984 final int C2 = builder.addClass(emptyClass(pck)); 3985 final int C1 = builder.addClass(emptyClass(pck)); 3986 builder.hier.addInherit(C2, I2); 3987 builder.hier.addInherit(C2, C3); 3988 builder.hier.addInherit(C3, I3); 3989 builder.hier.addInherit(C1, C2); 3990 builder.hier.addInherit(I1, I2); 3991 builder.hier.addInherit(C1, I1); 3992 builder.objectref = C1; 3993 }, 3994 /* Case 26: Double diamond, with superclass, inherit through 3995 * superclass, skip static. 3996 * 3997 * I3[](def) = old expected 3998 * C3[I3](), I2[*](*) = mref 3999 * C2[I2,C3](), I1[I2](stat) 4000 * C1[C2,I1]() = oref 4001 */ 4002 (final SelectionResolutionTestCase.Builder builder) -> { 4003 final ClassData.Package pck = 4004 builder.classdata.get(builder.expected).packageId; 4005 final MethodData meth = 4006 new MethodData(MethodData.Access.PUBLIC, 4007 MethodData.Context.STATIC); 4008 final ClassData withStatDef = 4009 new ClassData(pck, meth); 4010 final int I3 = builder.expected; 4011 final int I2 = builder.methodref; 4012 final int I1 = builder.addInterface(withStatDef); 4013 final int C3 = builder.addClass(emptyClass(pck)); 4014 final int C2 = builder.addClass(emptyClass(pck)); 4015 final int C1 = builder.addClass(emptyClass(pck)); 4016 builder.hier.addInherit(C2, I2); 4017 builder.hier.addInherit(C2, C3); 4018 builder.hier.addInherit(C3, I3); 4019 builder.hier.addInherit(C1, C2); 4020 builder.hier.addInherit(I1, I2); 4021 builder.hier.addInherit(C1, I1); 4022 builder.objectref = C1; 4023 }); 4024 4025 public static final Template IfaceMethodrefSelection = 4026 new Template("IfaceMethodrefSelection", 4027 IfaceMethodrefSelectionNoOverride, 4028 /* Case 27: Objectref overrides. 4029 * 4030 * I[](*) = mref 4031 * C[I](res) = oref = expected 4032 */ 4033 (final SelectionResolutionTestCase.Builder builder) -> { 4034 final ClassData.Package pck = 4035 builder.classdata.get(builder.methodref).packageId; 4036 final ClassData oldexpected = 4037 builder.classdata.get(builder.expected); 4038 final ClassData withDef = 4039 new ClassData(pck, oldexpected.methoddata); 4040 final int I = builder.methodref; 4041 final int C = builder.addClass(withDef); 4042 builder.hier.addInherit(C, I); 4043 builder.objectref = C; 4044 builder.expected = C; 4045 }, 4046 /* Case 28: Diamond, methodref at top, overriding. 4047 * 4048 * I3[](*) = mref 4049 * I1[I3](), I2[I3](res) = expected 4050 * C[I1,I2]() = oref 4051 */ 4052 (final SelectionResolutionTestCase.Builder builder) -> { 4053 final ClassData.Package pck = 4054 builder.classdata.get(builder.expected).packageId; 4055 final ClassData oldexpected = 4056 builder.classdata.get(builder.expected); 4057 final ClassData withDef = 4058 new ClassData(pck, oldexpected.methoddata); 4059 final int I3 = builder.methodref; 4060 final int I2 = builder.addInterface(withDef); 4061 final int I1 = builder.addInterface(emptyClass(pck)); 4062 final int C = builder.addClass(emptyClass(pck)); 4063 builder.hier.addInherit(C, I1); 4064 builder.hier.addInherit(C, I2); 4065 builder.hier.addInherit(I1, I3); 4066 builder.hier.addInherit(I2, I3); 4067 builder.objectref = C; 4068 builder.expected = I2; 4069 }, 4070 /* Case 29: Diamond, with superclass, expected at top, 4071 * class overriding. 4072 * 4073 * I2[](*) = mref 4074 * C2[I2](res) = expected, I1[I2]() 4075 * C1[I1,C2]() = oref 4076 */ 4077 (final SelectionResolutionTestCase.Builder builder) -> { 4078 final ClassData.Package pck = 4079 builder.classdata.get(builder.expected).packageId; 4080 final ClassData oldexpected = 4081 builder.classdata.get(builder.expected); 4082 final ClassData withDef = 4083 new ClassData(pck, oldexpected.methoddata); 4084 final int I2 = builder.methodref; 4085 final int I1 = builder.addInterface(emptyClass(pck)); 4086 final int C2 = builder.addClass(withDef); 4087 final int C1 = builder.addClass(emptyClass(pck)); 4088 builder.hier.addInherit(C1, I1); 4089 builder.hier.addInherit(C1, C2); 4090 builder.hier.addInherit(I1, I2); 4091 builder.hier.addInherit(C2, I2); 4092 builder.objectref = C1; 4093 builder.expected = C2; 4094 }, 4095 /* Case 30: Diamond, with superclass, expected at top, 4096 * interface overriding 4097 * 4098 * I2[](*) = mref 4099 * C2[I2](), I1[I2](res) = expected 4100 * C1[I1,C2]() = oref 4101 */ 4102 (final SelectionResolutionTestCase.Builder builder) -> { 4103 final ClassData.Package pck = 4104 builder.classdata.get(builder.expected).packageId; 4105 final ClassData oldexpected = 4106 builder.classdata.get(builder.expected); 4107 final ClassData withDef = 4108 new ClassData(pck, oldexpected.methoddata); 4109 final int I2 = builder.methodref; 4110 final int I1 = builder.addInterface(withDef); 4111 final int C2 = builder.addClass(emptyClass(pck)); 4112 final int C1 = builder.addClass(emptyClass(pck)); 4113 builder.hier.addInherit(C1, I1); 4114 builder.hier.addInherit(C1, C2); 4115 builder.hier.addInherit(I1, I2); 4116 builder.hier.addInherit(C2, I2); 4117 builder.objectref = C1; 4118 builder.expected = I1; 4119 }, 4120 /* Case 31: Y, with superclass, overlaping, expected 4121 * at top, class overrides 4122 * 4123 * C2[](res) = expected, I1[](*) = mref 4124 * C1[I1,C2]() = oref 4125 */ 4126 (final SelectionResolutionTestCase.Builder builder) -> { 4127 final ClassData.Package pck = 4128 builder.classdata.get(builder.expected).packageId; 4129 final ClassData oldexpected = 4130 builder.classdata.get(builder.expected); 4131 final ClassData withDef = 4132 new ClassData(pck, oldexpected.methoddata); 4133 final int I1 = builder.methodref; 4134 final int C2 = builder.addClass(withDef); 4135 final int C1 = builder.addClass(emptyClass(pck)); 4136 builder.hier.addInherit(C1, I1); 4137 builder.hier.addInherit(C1, C2); 4138 builder.objectref = C1; 4139 builder.expected = C2; 4140 }, 4141 /* Case 32: Diamond, with superclass, overlaping, expected 4142 * at top, class overrides 4143 * 4144 * I2[](def) = old expected 4145 * C2[I2](res) = expected, I1[](*) = mref 4146 * C1[I1,C2]() = oref 4147 */ 4148 (final SelectionResolutionTestCase.Builder builder) -> { 4149 final ClassData.Package pck = 4150 builder.classdata.get(builder.expected).packageId; 4151 final ClassData oldexpected = 4152 builder.classdata.get(builder.expected); 4153 final ClassData withDef = 4154 new ClassData(pck, oldexpected.methoddata); 4155 final int I2 = builder.expected; 4156 final int I1 = builder.methodref; 4157 final int C2 = builder.addClass(withDef); 4158 final int C1 = builder.addClass(emptyClass(pck)); 4159 builder.hier.addInherit(C1, I1); 4160 builder.hier.addInherit(C1, C2); 4161 builder.hier.addInherit(C2, I2); 4162 builder.objectref = C1; 4163 builder.expected = C2; 4164 }, 4165 /* Case 33: Superclass overrides. 4166 * 4167 * I[](*) = mref 4168 * C2[I](res) = expected 4169 * C1[C2]() = oref 4170 */ 4171 (final SelectionResolutionTestCase.Builder builder) -> { 4172 final ClassData.Package pck = 4173 builder.classdata.get(builder.expected).packageId; 4174 final ClassData oldexpected = 4175 builder.classdata.get(builder.expected); 4176 final ClassData withDef = 4177 new ClassData(pck, oldexpected.methoddata); 4178 final int I = builder.methodref; 4179 final int C2 = builder.addClass(withDef); 4180 final int C1 = builder.addClass(emptyClass(pck)); 4181 builder.hier.addInherit(C1, I); 4182 builder.hier.addInherit(C1, C2); 4183 builder.hier.addInherit(C2, I); 4184 builder.expected = C2; 4185 builder.objectref = C1; 4186 }, 4187 /* Case 34: Diamond, inherit through superclass, 4188 * expected at top, override. 4189 * 4190 * I3[](*) = mref 4191 * I1[I3](), I2[I3](res) = expected 4192 * C2[I1,I2]() 4193 * C1[C2]() = oref 4194 */ 4195 (final SelectionResolutionTestCase.Builder builder) -> { 4196 final ClassData.Package pck = 4197 builder.classdata.get(builder.expected).packageId; 4198 final ClassData oldexpected = 4199 builder.classdata.get(builder.expected); 4200 final ClassData withDef = 4201 new ClassData(pck, oldexpected.methoddata); 4202 final int I3 = builder.methodref; 4203 final int I2 = builder.addInterface(withDef); 4204 final int I1 = builder.addInterface(emptyClass(pck)); 4205 final int C2 = builder.addClass(emptyClass(pck)); 4206 final int C1 = builder.addClass(emptyClass(pck)); 4207 builder.hier.addInherit(C2, I1); 4208 builder.hier.addInherit(C2, I2); 4209 builder.hier.addInherit(I1, I3); 4210 builder.hier.addInherit(I2, I3); 4211 builder.hier.addInherit(C1, C2); 4212 builder.objectref = C1; 4213 builder.expected = I2; 4214 }, 4215 /* Case 35: Y, with superclass, inherit through 4216 * superclass, overlapping, expected at top. 4217 * 4218 * C3[](res) = expected, I1[*](*) = mref 4219 * C2[I1,C3]() 4220 * C1[C2]() = oref 4221 */ 4222 (final SelectionResolutionTestCase.Builder builder) -> { 4223 final ClassData.Package pck = 4224 builder.classdata.get(builder.expected).packageId; 4225 final ClassData oldexpected = 4226 builder.classdata.get(builder.expected); 4227 final ClassData withDef = 4228 new ClassData(pck, oldexpected.methoddata); 4229 final int I1 = builder.methodref; 4230 final int C3 = builder.addClass(withDef); 4231 final int C2 = builder.addClass(emptyClass(pck)); 4232 final int C1 = builder.addClass(emptyClass(pck)); 4233 builder.hier.addInherit(C2, I1); 4234 builder.hier.addInherit(C2, C3); 4235 builder.hier.addInherit(C1, C2); 4236 builder.objectref = C1; 4237 builder.expected = C3; 4238 }, 4239 /* Case 36: Diamond, with superclass, inherit through 4240 * superclass, overlapping, expected at top. 4241 * 4242 * I2[](*) = oldexpected 4243 * C3[I2](res) = expected, I1[*](*) = mref 4244 * C2[I1,C3]() 4245 * C1[C2]() = oref 4246 */ 4247 (final SelectionResolutionTestCase.Builder builder) -> { 4248 final ClassData.Package pck = 4249 builder.classdata.get(builder.expected).packageId; 4250 final ClassData oldexpected = 4251 builder.classdata.get(builder.expected); 4252 final ClassData withDef = 4253 new ClassData(pck, oldexpected.methoddata); 4254 final int I2 = builder.expected; 4255 final int I1 = builder.methodref; 4256 final int C3 = builder.addClass(withDef); 4257 final int C2 = builder.addClass(emptyClass(pck)); 4258 final int C1 = builder.addClass(emptyClass(pck)); 4259 builder.hier.addInherit(C2, I1); 4260 builder.hier.addInherit(C2, C3); 4261 builder.hier.addInherit(C3, I2); 4262 builder.hier.addInherit(C1, C2); 4263 builder.objectref = C1; 4264 builder.expected = C3; 4265 }, 4266 /* Case 37: Double diamond, with superclass, inherit through 4267 * superclass, overriding. 4268 * 4269 * I3[](def) = old expected 4270 * C3[I3](), I2[*](*) = mref 4271 * C2[I2,C3](), I1[I2](res) = expected 4272 * C1[C2,I1]() = oref 4273 */ 4274 (final SelectionResolutionTestCase.Builder builder) -> { 4275 final ClassData.Package pck = 4276 builder.classdata.get(builder.expected).packageId; 4277 final ClassData oldexpected = 4278 builder.classdata.get(builder.expected); 4279 final ClassData withDef = 4280 new ClassData(pck, oldexpected.methoddata); 4281 final int I3 = builder.expected; 4282 final int I2 = builder.methodref; 4283 final int I1 = builder.addInterface(withDef); 4284 final int C3 = builder.addClass(emptyClass(pck)); 4285 final int C2 = builder.addClass(emptyClass(pck)); 4286 final int C1 = builder.addClass(emptyClass(pck)); 4287 builder.hier.addInherit(C2, I2); 4288 builder.hier.addInherit(C2, C3); 4289 builder.hier.addInherit(C3, I3); 4290 builder.hier.addInherit(C1, C2); 4291 builder.hier.addInherit(I1, I2); 4292 builder.hier.addInherit(C1, I1); 4293 builder.objectref = C1; 4294 builder.expected = I1; 4295 }, 4296 /* Case 38: Double diamond, with superclass, inherit through 4297 * superclass, skip private. 4298 * 4299 * I3[](def) = old expected 4300 * C3[I3](), I2[*](*) = mref 4301 * C2[I2,C3](), I1[I2](priv) 4302 * C1[C2,I1]() = oref 4303 */ 4304 (final SelectionResolutionTestCase.Builder builder) -> { 4305 final ClassData.Package pck = 4306 builder.classdata.get(builder.expected).packageId; 4307 final ClassData oldexpected = 4308 builder.classdata.get(builder.expected); 4309 final ClassData withDef = 4310 new ClassData(pck, oldexpected.methoddata); 4311 final MethodData meth = 4312 new MethodData(MethodData.Access.PRIVATE, 4313 MethodData.Context.INSTANCE); 4314 final ClassData withPrivDef = 4315 new ClassData(pck, meth); 4316 final int I3 = builder.expected; 4317 final int I2 = builder.methodref; 4318 final int I1 = builder.addInterface(withPrivDef); 4319 final int C3 = builder.addClass(emptyClass(pck)); 4320 final int C2 = builder.addClass(emptyClass(pck)); 4321 final int C1 = builder.addClass(emptyClass(pck)); 4322 builder.hier.addInherit(C2, I2); 4323 builder.hier.addInherit(C2, C3); 4324 builder.hier.addInherit(C3, I3); 4325 builder.hier.addInherit(C1, C2); 4326 builder.hier.addInherit(I1, I2); 4327 builder.hier.addInherit(C1, I1); 4328 builder.objectref = C1; 4329 }, 4330 /* Case 39: Double diamond, with superclass, inherit through 4331 * superclass, skip static. 4332 * 4333 * I3[](def) = old expected 4334 * C3[I3](), I2[*](*) = mref 4335 * C2[I2,C3](), I1[I2](stat) 4336 * C1[C2,I1]() = oref 4337 */ 4338 (final SelectionResolutionTestCase.Builder builder) -> { 4339 final ClassData.Package pck = 4340 builder.classdata.get(builder.expected).packageId; 4341 final ClassData oldexpected = 4342 builder.classdata.get(builder.expected); 4343 final ClassData withDef = 4344 new ClassData(pck, oldexpected.methoddata); 4345 final MethodData meth = 4346 new MethodData(MethodData.Access.PUBLIC, 4347 MethodData.Context.STATIC); 4348 final ClassData withStatDef = 4349 new ClassData(pck, meth); 4350 final int I3 = builder.expected; 4351 final int I2 = builder.methodref; 4352 final int I1 = builder.addInterface(withStatDef); 4353 final int C3 = builder.addClass(emptyClass(pck)); 4354 final int C2 = builder.addClass(emptyClass(pck)); 4355 final int C1 = builder.addClass(emptyClass(pck)); 4356 builder.hier.addInherit(C2, I2); 4357 builder.hier.addInherit(C2, C3); 4358 builder.hier.addInherit(C3, I3); 4359 builder.hier.addInherit(C1, C2); 4360 builder.hier.addInherit(I1, I2); 4361 builder.hier.addInherit(C1, I1); 4362 builder.objectref = C1; 4363 }, 4364 /* Case 40: Superclass overrides. 4365 * 4366 * I[](*) = mref 4367 * C3[I](res) = expected 4368 * C2[C3](stat) = expected 4369 * C1[C2]() = oref 4370 */ 4371 (final SelectionResolutionTestCase.Builder builder) -> { 4372 final ClassData.Package pck = 4373 builder.classdata.get(builder.expected).packageId; 4374 final ClassData oldexpected = 4375 builder.classdata.get(builder.expected); 4376 final ClassData withDef = 4377 new ClassData(pck, oldexpected.methoddata); 4378 final MethodData meth = 4379 new MethodData(MethodData.Access.PUBLIC, 4380 MethodData.Context.STATIC); 4381 final ClassData withStatDef = 4382 new ClassData(pck, meth); 4383 final int I = builder.methodref; 4384 final int C3 = builder.addClass(withDef); 4385 final int C2 = builder.addClass(withStatDef); 4386 final int C1 = builder.addClass(emptyClass(pck)); 4387 builder.hier.addInherit(C1, I); 4388 builder.hier.addInherit(C1, C2); 4389 builder.hier.addInherit(C2, C3); 4390 builder.hier.addInherit(C2, I); 4391 builder.expected = C3; 4392 builder.objectref = C1; 4393 }); 4394 4395 public static final Template IfaceMethodrefSelectionOverrideNonPublic = 4396 new Template("IfaceMethodrefSelection", 4397 /* Case 1: Objectref overrides. 4398 * 4399 * I[](*) = mref 4400 * C[I](priv) = oref = expected 4401 */ 4402 (final SelectionResolutionTestCase.Builder builder) -> { 4403 final ClassData.Package pck = 4404 builder.classdata.get(builder.methodref).packageId; 4405 final ClassData oldexpected = 4406 builder.classdata.get(builder.expected); 4407 final MethodData meth = 4408 new MethodData(MethodData.Access.PRIVATE, 4409 MethodData.Context.INSTANCE); 4410 final ClassData withDef = 4411 new ClassData(pck, meth); 4412 final int I = builder.methodref; 4413 final int C = builder.addClass(withDef); 4414 builder.hier.addInherit(C, I); 4415 builder.objectref = C; 4416 builder.expected = C; 4417 }, 4418 /* Case 2: Objectref overrides. 4419 * 4420 * I[](*) = mref 4421 * C[I](prot) = oref = expected 4422 */ 4423 (final SelectionResolutionTestCase.Builder builder) -> { 4424 final ClassData.Package pck = 4425 builder.classdata.get(builder.methodref).packageId; 4426 final ClassData oldexpected = 4427 builder.classdata.get(builder.expected); 4428 final MethodData meth = 4429 new MethodData(MethodData.Access.PROTECTED, 4430 MethodData.Context.INSTANCE); 4431 final ClassData withDef = 4432 new ClassData(pck, meth); 4433 final int I = builder.methodref; 4434 final int C = builder.addClass(withDef); 4435 builder.hier.addInherit(C, I); 4436 builder.objectref = C; 4437 builder.expected = C; 4438 }, 4439 /* Case 3: Objectref overrides package private. 4440 * 4441 * I[](*) = mref 4442 * C[I](pack) = oref = expected 4443 */ 4444 (final SelectionResolutionTestCase.Builder builder) -> { 4445 final ClassData.Package pck = 4446 builder.classdata.get(builder.methodref).packageId; 4447 final ClassData oldexpected = 4448 builder.classdata.get(builder.expected); 4449 final MethodData meth = 4450 new MethodData(MethodData.Access.PACKAGE, 4451 MethodData.Context.INSTANCE); 4452 final ClassData withDef = 4453 new ClassData(pck, meth); 4454 final int I = builder.methodref; 4455 final int C = builder.addClass(withDef); 4456 builder.hier.addInherit(C, I); 4457 builder.objectref = C; 4458 builder.expected = C; 4459 }, 4460 /* Case 4: Diamond, with superclass, expected at top, 4461 * class overriding with private. 4462 * 4463 * I2[](*) = mref 4464 * C2[I2](priv) = expected, I1[I2]() 4465 * C1[I1,C2]() = oref 4466 */ 4467 (final SelectionResolutionTestCase.Builder builder) -> { 4468 final ClassData.Package pck = 4469 builder.classdata.get(builder.expected).packageId; 4470 final ClassData oldexpected = 4471 builder.classdata.get(builder.expected); 4472 final MethodData meth = 4473 new MethodData(MethodData.Access.PRIVATE, 4474 MethodData.Context.INSTANCE); 4475 final ClassData withDef = 4476 new ClassData(pck, meth); 4477 final int I2 = builder.methodref; 4478 final int I1 = builder.addInterface(emptyClass(pck)); 4479 final int C2 = builder.addClass(withDef); 4480 final int C1 = builder.addClass(emptyClass(pck)); 4481 builder.hier.addInherit(C1, I1); 4482 builder.hier.addInherit(C1, C2); 4483 builder.hier.addInherit(I1, I2); 4484 builder.hier.addInherit(C2, I2); 4485 builder.objectref = C1; 4486 builder.expected = C2; 4487 }, 4488 /* Case 5: Diamond, with superclass, expected at top, 4489 * class overriding with package private. 4490 * 4491 * I2[](*) = mref 4492 * C2[I2](pack) = expected, I1[I2]() 4493 * C1[I1,C2]() = oref 4494 */ 4495 (final SelectionResolutionTestCase.Builder builder) -> { 4496 final ClassData.Package pck = 4497 builder.classdata.get(builder.expected).packageId; 4498 final ClassData oldexpected = 4499 builder.classdata.get(builder.expected); 4500 final MethodData meth = 4501 new MethodData(MethodData.Access.PACKAGE, 4502 MethodData.Context.INSTANCE); 4503 final ClassData withDef = 4504 new ClassData(pck, meth); 4505 final int I2 = builder.methodref; 4506 final int I1 = builder.addInterface(emptyClass(pck)); 4507 final int C2 = builder.addClass(withDef); 4508 final int C1 = builder.addClass(emptyClass(pck)); 4509 builder.hier.addInherit(C1, I1); 4510 builder.hier.addInherit(C1, C2); 4511 builder.hier.addInherit(I1, I2); 4512 builder.hier.addInherit(C2, I2); 4513 builder.objectref = C1; 4514 builder.expected = C2; 4515 }, 4516 /* Case 6: Diamond, with superclass, expected at top, 4517 * class overriding with protected. 4518 * 4519 * I2[](*) = mref 4520 * C2[I2](prot) = expected, I1[I2]() 4521 * C1[I1,C2]() = oref 4522 */ 4523 (final SelectionResolutionTestCase.Builder builder) -> { 4524 final ClassData.Package pck = 4525 builder.classdata.get(builder.expected).packageId; 4526 final ClassData oldexpected = 4527 builder.classdata.get(builder.expected); 4528 final MethodData meth = 4529 new MethodData(MethodData.Access.PROTECTED, 4530 MethodData.Context.INSTANCE); 4531 final ClassData withDef = 4532 new ClassData(pck, meth); 4533 final int I2 = builder.methodref; 4534 final int I1 = builder.addInterface(emptyClass(pck)); 4535 final int C2 = builder.addClass(withDef); 4536 final int C1 = builder.addClass(emptyClass(pck)); 4537 builder.hier.addInherit(C1, I1); 4538 builder.hier.addInherit(C1, C2); 4539 builder.hier.addInherit(I1, I2); 4540 builder.hier.addInherit(C2, I2); 4541 builder.objectref = C1; 4542 builder.expected = C2; 4543 }, 4544 /* Case 7: Y, with superclass, overlaping, expected 4545 * at top, class overrides 4546 * 4547 * C2[](priv) = expected, I1[](*) = mref 4548 * C1[I1,C2]() = oref 4549 */ 4550 (final SelectionResolutionTestCase.Builder builder) -> { 4551 final ClassData.Package pck = 4552 builder.classdata.get(builder.expected).packageId; 4553 final ClassData oldexpected = 4554 builder.classdata.get(builder.expected); 4555 final MethodData meth = 4556 new MethodData(MethodData.Access.PRIVATE, 4557 MethodData.Context.INSTANCE); 4558 final ClassData withDef = 4559 new ClassData(pck, meth); 4560 final int I1 = builder.methodref; 4561 final int C2 = builder.addClass(withDef); 4562 final int C1 = builder.addClass(emptyClass(pck)); 4563 builder.hier.addInherit(C1, I1); 4564 builder.hier.addInherit(C1, C2); 4565 builder.objectref = C1; 4566 builder.expected = C2; 4567 }, 4568 /* Case 8: Y, with superclass, overlaping, expected 4569 * at top, class overrides 4570 * 4571 * C2[](prot) = expected, I1[](*) = mref 4572 * C1[I1,C2]() = oref 4573 */ 4574 (final SelectionResolutionTestCase.Builder builder) -> { 4575 final ClassData.Package pck = 4576 builder.classdata.get(builder.expected).packageId; 4577 final ClassData oldexpected = 4578 builder.classdata.get(builder.expected); 4579 final MethodData meth = 4580 new MethodData(MethodData.Access.PROTECTED, 4581 MethodData.Context.INSTANCE); 4582 final ClassData withDef = 4583 new ClassData(pck, meth); 4584 final int I1 = builder.methodref; 4585 final int C2 = builder.addClass(withDef); 4586 final int C1 = builder.addClass(emptyClass(pck)); 4587 builder.hier.addInherit(C1, I1); 4588 builder.hier.addInherit(C1, C2); 4589 builder.objectref = C1; 4590 builder.expected = C2; 4591 }, 4592 /* Case 9: Y, with superclass, overlaping, expected 4593 * at top, class overrides 4594 * 4595 * C2[](pack) = expected, I1[](*) = mref 4596 * C1[I1,C2]() = oref 4597 */ 4598 (final SelectionResolutionTestCase.Builder builder) -> { 4599 final ClassData.Package pck = 4600 builder.classdata.get(builder.expected).packageId; 4601 final ClassData oldexpected = 4602 builder.classdata.get(builder.expected); 4603 final MethodData meth = 4604 new MethodData(MethodData.Access.PACKAGE, 4605 MethodData.Context.INSTANCE); 4606 final ClassData withDef = 4607 new ClassData(pck, meth); 4608 final int I1 = builder.methodref; 4609 final int C2 = builder.addClass(withDef); 4610 final int C1 = builder.addClass(emptyClass(pck)); 4611 builder.hier.addInherit(C1, I1); 4612 builder.hier.addInherit(C1, C2); 4613 builder.objectref = C1; 4614 builder.expected = C2; 4615 }, 4616 /* Case 10: Diamond, with superclass, overlaping, expected 4617 * at top, class overrides 4618 * 4619 * I2[](def) = old expected 4620 * C2[I2](priv) = expected, I1[](*) = mref 4621 * C1[I1,C2]() = oref 4622 */ 4623 (final SelectionResolutionTestCase.Builder builder) -> { 4624 final ClassData.Package pck = 4625 builder.classdata.get(builder.expected).packageId; 4626 final ClassData oldexpected = 4627 builder.classdata.get(builder.expected); 4628 final MethodData meth = 4629 new MethodData(MethodData.Access.PRIVATE, 4630 MethodData.Context.INSTANCE); 4631 final ClassData withDef = 4632 new ClassData(pck, meth); 4633 final int I2 = builder.expected; 4634 final int I1 = builder.methodref; 4635 final int C2 = builder.addClass(withDef); 4636 final int C1 = builder.addClass(emptyClass(pck)); 4637 builder.hier.addInherit(C1, I1); 4638 builder.hier.addInherit(C1, C2); 4639 builder.hier.addInherit(C2, I2); 4640 builder.objectref = C1; 4641 builder.expected = C2; 4642 }, 4643 /* Case 11: Diamond, with superclass, overlaping, expected 4644 * at top, class overrides 4645 * 4646 * I2[](def) = old expected 4647 * C2[I2](pack) = expected, I1[](*) = mref 4648 * C1[I1,C2]() = oref 4649 */ 4650 (final SelectionResolutionTestCase.Builder builder) -> { 4651 final ClassData.Package pck = 4652 builder.classdata.get(builder.expected).packageId; 4653 final ClassData oldexpected = 4654 builder.classdata.get(builder.expected); 4655 final MethodData meth = 4656 new MethodData(MethodData.Access.PACKAGE, 4657 MethodData.Context.INSTANCE); 4658 final ClassData withDef = 4659 new ClassData(pck, meth); 4660 final int I2 = builder.expected; 4661 final int I1 = builder.methodref; 4662 final int C2 = builder.addClass(withDef); 4663 final int C1 = builder.addClass(emptyClass(pck)); 4664 builder.hier.addInherit(C1, I1); 4665 builder.hier.addInherit(C1, C2); 4666 builder.hier.addInherit(C2, I2); 4667 builder.objectref = C1; 4668 builder.expected = C2; 4669 }, 4670 /* Case 12: Diamond, with superclass, overlaping, expected 4671 * at top, class overrides 4672 * 4673 * I2[](def) = old expected 4674 * C2[I2](prot) = expected, I1[](*) = mref 4675 * C1[I1,C2]() = oref 4676 */ 4677 (final SelectionResolutionTestCase.Builder builder) -> { 4678 final ClassData.Package pck = 4679 builder.classdata.get(builder.expected).packageId; 4680 final ClassData oldexpected = 4681 builder.classdata.get(builder.expected); 4682 final MethodData meth = 4683 new MethodData(MethodData.Access.PROTECTED, 4684 MethodData.Context.INSTANCE); 4685 final ClassData withDef = 4686 new ClassData(pck, meth); 4687 final int I2 = builder.expected; 4688 final int I1 = builder.methodref; 4689 final int C2 = builder.addClass(withDef); 4690 final int C1 = builder.addClass(emptyClass(pck)); 4691 builder.hier.addInherit(C1, I1); 4692 builder.hier.addInherit(C1, C2); 4693 builder.hier.addInherit(C2, I2); 4694 builder.objectref = C1; 4695 builder.expected = C2; 4696 }, 4697 /* Case 13: Superclass overrides. 4698 * 4699 * I[](*) = mref 4700 * C2[I](priv) = expected 4701 * C1[C2]() = oref 4702 */ 4703 (final SelectionResolutionTestCase.Builder builder) -> { 4704 final ClassData.Package pck = 4705 builder.classdata.get(builder.expected).packageId; 4706 final ClassData oldexpected = 4707 builder.classdata.get(builder.expected); 4708 final MethodData meth = 4709 new MethodData(MethodData.Access.PRIVATE, 4710 MethodData.Context.INSTANCE); 4711 final ClassData withDef = 4712 new ClassData(pck, meth); 4713 final int I = builder.methodref; 4714 final int C2 = builder.addClass(withDef); 4715 final int C1 = builder.addClass(emptyClass(pck)); 4716 builder.hier.addInherit(C1, I); 4717 builder.hier.addInherit(C1, C2); 4718 builder.hier.addInherit(C2, I); 4719 builder.expected = C2; 4720 builder.objectref = C1; 4721 }, 4722 /* Case 14: Superclass overrides. 4723 * 4724 * I[](*) = mref 4725 * C2[I](prot) = expected 4726 * C1[C2]() = oref 4727 */ 4728 (final SelectionResolutionTestCase.Builder builder) -> { 4729 final ClassData.Package pck = 4730 builder.classdata.get(builder.expected).packageId; 4731 final ClassData oldexpected = 4732 builder.classdata.get(builder.expected); 4733 final MethodData meth = 4734 new MethodData(MethodData.Access.PROTECTED, 4735 MethodData.Context.INSTANCE); 4736 final ClassData withDef = 4737 new ClassData(pck, meth); 4738 final int I = builder.methodref; 4739 final int C2 = builder.addClass(withDef); 4740 final int C1 = builder.addClass(emptyClass(pck)); 4741 builder.hier.addInherit(C1, I); 4742 builder.hier.addInherit(C1, C2); 4743 builder.hier.addInherit(C2, I); 4744 builder.expected = C2; 4745 builder.objectref = C1; 4746 }, 4747 /* Case 15: Superclass overrides. 4748 * 4749 * I[](*) = mref 4750 * C2[I](pack) = expected 4751 * C1[C2]() = oref 4752 */ 4753 (final SelectionResolutionTestCase.Builder builder) -> { 4754 final ClassData.Package pck = 4755 builder.classdata.get(builder.expected).packageId; 4756 final ClassData oldexpected = 4757 builder.classdata.get(builder.expected); 4758 final MethodData meth = 4759 new MethodData(MethodData.Access.PACKAGE, 4760 MethodData.Context.INSTANCE); 4761 final ClassData withDef = 4762 new ClassData(pck, meth); 4763 final int I = builder.methodref; 4764 final int C2 = builder.addClass(withDef); 4765 final int C1 = builder.addClass(emptyClass(pck)); 4766 builder.hier.addInherit(C1, I); 4767 builder.hier.addInherit(C1, C2); 4768 builder.hier.addInherit(C2, I); 4769 builder.expected = C2; 4770 builder.objectref = C1; 4771 }); 4772 4773 /*********************** 4774 * Ambiguous selection * 4775 ***********************/ 4776 4777 public static final Template MethodrefAmbiguousResolvedIsIface = 4778 new Template("MethodrefAmbiguousResolvedIsIface", 4779 /* Inherit from interface. 4780 * 4781 * C2[](*) = mref, I[](any) 4782 * C1[C2,I]() = oref 4783 */ 4784 (final SelectionResolutionTestCase.Builder builder) -> { 4785 final ClassData oldexpected = 4786 builder.classdata.get(builder.expected); 4787 final ClassData.Package pck = oldexpected.packageId; 4788 final MethodData.Context ctx = oldexpected.methoddata.context; 4789 final MethodData mdata = 4790 new MethodData(MethodData.Access.PUBLIC, ctx); 4791 final ClassData withDef = new ClassData(pck, mdata); 4792 final int C2 = builder.methodref; 4793 final int C1 = builder.addClass(emptyClass(pck)); 4794 final int I = builder.addInterface(withDef); 4795 builder.hier.addInherit(C1, C2); 4796 builder.hier.addInherit(C1, I); 4797 builder.objectref = C1; 4798 }); 4799 4800 public static final Template IfaceMethodrefAmbiguousResolvedIsIface = 4801 new Template("IfaceMethodrefAmbiguousResolvedIsIface", 4802 /* Inherit from interface. 4803 * 4804 * I1[](*) = mref, I2[](any) 4805 * C1[I1,I2]() = oref 4806 */ 4807 (final SelectionResolutionTestCase.Builder builder) -> { 4808 final ClassData oldexpected = 4809 builder.classdata.get(builder.expected); 4810 final ClassData.Package pck = oldexpected.packageId; 4811 final MethodData.Context ctx = oldexpected.methoddata.context; 4812 final MethodData mdata = 4813 new MethodData(MethodData.Access.PUBLIC, ctx); 4814 final ClassData withDef = new ClassData(pck, mdata); 4815 final int I1 = builder.methodref; 4816 final int C = builder.addClass(emptyClass(pck)); 4817 final int I2 = builder.addInterface(withDef); 4818 builder.hier.addInherit(C, I1); 4819 builder.hier.addInherit(C, I2); 4820 builder.objectref = C; 4821 }); 4822 4823 public static final Template InvokespecialAmbiguousResolvedIsIface = 4824 new Template("InvokespecialAmbiguousResolvedIsIface", 4825 /* Inherit from interface. 4826 * 4827 * C2[](*) = csite, I[](any) 4828 * C1[C2,I]() = oref 4829 */ 4830 (final SelectionResolutionTestCase.Builder builder) -> { 4831 final ClassData oldexpected = 4832 builder.classdata.get(builder.expected); 4833 final ClassData.Package pck = oldexpected.packageId; 4834 final MethodData.Context ctx = oldexpected.methoddata.context; 4835 final MethodData mdata = 4836 new MethodData(MethodData.Access.PUBLIC, ctx); 4837 final ClassData withDef = new ClassData(pck, mdata); 4838 final int C2 = builder.callsite; 4839 final int C1 = builder.addClass(emptyClass(pck)); 4840 final int I = builder.addInterface(withDef); 4841 builder.hier.addInherit(C1, C2); 4842 builder.hier.addInherit(C1, I); 4843 builder.objectref = C1; 4844 }); 4845 4846 /****************************** 4847 * invokespecial Templates * 4848 ******************************/ 4849 4850 // Create this by taking MethodrefSelection and replacing 4851 // methodref with callsite. 4852 public static final Template ObjectrefAssignableToCallsite = 4853 new Template("ObjectrefAssignableToCallsite", 4854 /* Case 1: Objectref equals callsite 4855 * 4856 * C[](*) = csite = oref 4857 */ 4858 (builder) -> { 4859 builder.objectref = builder.callsite; 4860 }, 4861 /* Case 2: Inherit from super. 4862 * 4863 * C2[](*) = csite 4864 * C1[C2]() = oref 4865 */ 4866 (final SelectionResolutionTestCase.Builder builder) -> { 4867 final ClassData.Package pck = 4868 builder.classdata.get(builder.callsite).packageId; 4869 final int C2 = builder.callsite; 4870 final int C1 = builder.addClass(emptyClass(pck)); 4871 builder.hier.addInherit(C1, C2); 4872 builder.objectref = C1; 4873 }); 4874 4875 public static final Template ObjectrefExactSubclassOfCallsite = 4876 new Template("ObjectrefSubclassOfCallsite", 4877 /* Inherit from super. 4878 * 4879 * C2[](*) = csite 4880 * C1[C2]() = oref 4881 */ 4882 (final SelectionResolutionTestCase.Builder builder) -> { 4883 final ClassData.Package pck = 4884 builder.classdata.get(builder.callsite).packageId; 4885 final int C2 = builder.callsite; 4886 final int C1 = builder.addClass(emptyClass(pck)); 4887 builder.hier.addInherit(C1, C2); 4888 builder.objectref = C1; 4889 }); 4890 4891 public static final Template ObjectrefEqualsOrExactSubclassOfCallsite = 4892 new Template("ObjectrefEqualsOrExactSubclassOfCallsite", 4893 (final SelectionResolutionTestCase.Builder builder) -> { 4894 builder.objectref = builder.callsite; 4895 }, 4896 /* Inherit from super. 4897 * 4898 * C2[](*) = csite 4899 * C1[C2]() = oref 4900 */ 4901 (final SelectionResolutionTestCase.Builder builder) -> { 4902 final ClassData.Package pck = 4903 builder.classdata.get(builder.callsite).packageId; 4904 final int C2 = builder.callsite; 4905 final int C1 = builder.addClass(emptyClass(pck)); 4906 builder.hier.addInherit(C1, C2); 4907 builder.objectref = C1; 4908 }); 4909 4910 public static final Template ObjectrefEqualsCallsite = 4911 new Template("TrivialObjectref", 4912 Collections.singleton((builder) -> { 4913 builder.objectref = builder.callsite; 4914 })); 4915 4916 public static final Template ObjectrefSubclassOfSubclassOfCallsite = 4917 new Template("ObjectrefSubclassOfCallsite", 4918 /* Inherit from super. 4919 * 4920 * C3[](*) = csite 4921 * C2[C3]() 4922 * C1[C2]() = oref 4923 */ 4924 (final SelectionResolutionTestCase.Builder builder) -> { 4925 final ClassData.Package pck = 4926 builder.classdata.get(builder.callsite).packageId; 4927 final int C3 = builder.callsite; 4928 final int C2 = builder.addClass(emptyClass(pck)); 4929 final int C1 = builder.addClass(emptyClass(pck)); 4930 builder.hier.addInherit(C2, C3); 4931 builder.hier.addInherit(C1, C2); 4932 builder.objectref = C1; 4933 }); 4934 4935 private static class Placeholder extends ClassData { 4936 private final String placeholder; 4937 4938 4939 private Placeholder(final String placeholder, 4940 final MethodData methoddata) { 4941 super(ClassData.Package.PLACEHOLDER, methoddata); 4942 this.placeholder = placeholder; 4943 } 4944 4945 private Placeholder(final String placeholder) { 4946 this(placeholder, null); 4947 } 4948 4949 public String toString() { 4950 return " = <Placeholder for " + placeholder + ">\n\n"; 4951 } 4952 4953 public static final Placeholder objectref = new Placeholder("objectref"); 4954 public static final Placeholder methodref = new Placeholder("methodref"); 4955 public static final Placeholder callsite = new Placeholder("callsite"); 4956 public static final Placeholder expected = 4957 new Placeholder("expected", 4958 new MethodData(MethodData.Access.PLACEHOLDER, 4959 MethodData.Context.PLACEHOLDER)); 4960 } 4961 4962 public static void main(String... args) { 4963 4964 System.err.println("*** Resolution Templates ***\n"); 4965 final SelectionResolutionTestCase.Builder withExpectedIface = 4966 new SelectionResolutionTestCase.Builder(); 4967 withExpectedIface.expected = 4968 withExpectedIface.addInterface(Placeholder.expected); 4969 final SelectionResolutionTestCase.Builder withExpectedClass = 4970 new SelectionResolutionTestCase.Builder(); 4971 withExpectedClass.expected = 4972 withExpectedClass.addClass(Placeholder.expected); 4973 4974 MethodrefNotEqualsExpectedClass.printCases(withExpectedClass); 4975 MethodrefNotEqualsExpectedIface.printCases(withExpectedIface); 4976 IfaceMethodrefNotEqualsExpected.printCases(withExpectedIface); 4977 MethodrefAmbiguous.printCases(withExpectedIface); 4978 IfaceMethodrefAmbiguous.printCases(withExpectedIface); 4979 ReabstractExpectedIface.printCases(withExpectedIface); 4980 ReabstractExpectedClass.printCases(withExpectedClass); 4981 4982 final SelectionResolutionTestCase.Builder methodrefExpectedIface = 4983 withExpectedIface.copy(); 4984 methodrefExpectedIface.methodref = 4985 methodrefExpectedIface.addClass(Placeholder.methodref); 4986 final SelectionResolutionTestCase.Builder methodrefExpectedClass = 4987 withExpectedClass.copy(); 4988 methodrefExpectedClass.methodref = 4989 methodrefExpectedClass.addClass(Placeholder.methodref); 4990 final SelectionResolutionTestCase.Builder ifaceMethodref = 4991 withExpectedIface.copy(); 4992 ifaceMethodref.methodref = 4993 ifaceMethodref.addInterface(Placeholder.methodref); 4994 4995 IgnoredAbstract.printCases(methodrefExpectedIface); 4996 MethodrefSelectionResolvedIsClass.printCases(methodrefExpectedClass); 4997 MethodrefSelectionResolvedIsIface.printCases(methodrefExpectedIface); 4998 IfaceMethodrefSelection.printCases(ifaceMethodref); 4999 IfaceMethodrefSelectionOverrideNonPublic.printCases(ifaceMethodref); 5000 5001 } 5002 5003 }