void check(JavaSource source, ErrorChecker ec, int id) {
    boolean resolutionError = false;
    VarargsMethod selectedMethod = null;

    boolean m1_applicable = m1.isApplicable(actuals);
    boolean m2_applicable = m2.isApplicable(actuals);

    if (!m1_applicable && !m2_applicable) {
      resolutionError = true;
    } else if (m1_applicable && m2_applicable) {
      // most specific
      boolean m1_moreSpecific = m1.isMoreSpecificThan(m2);
      boolean m2_moreSpecific = m2.isMoreSpecificThan(m1);

      resolutionError = m1_moreSpecific == m2_moreSpecific;
      selectedMethod = m1_moreSpecific ? m1 : m2;
    } else {
      selectedMethod = m1_applicable ? m1 : m2;
    }

    if (ec.errorFound != resolutionError) {
      throw new Error(
          "invalid diagnostics for source:\n"
              + source.getCharContent(true)
              + "\nExpected resolution error: "
              + resolutionError
              + "\nFound error: "
              + ec.errorFound
              + "\nCompiler diagnostics:\n"
              + ec.printDiags());
    } else if (!resolutionError) {
      verifyBytecode(selectedMethod, source, id);
    }
  }
 public JavaSource(
     VarargsMethod m1, VarargsMethod m2, TypeKind actual, ArgumentsArity argsArity) {
   super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
   source =
       source_template
           .replaceAll("#V1", m1.toString())
           .replaceAll("#V2", m2.toString())
           .replaceAll("#E", argsArity.asExpressionList(actual));
 }