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