public void testDeadMethod_InnerClassConstructor() throws IOException {
   String source = "class A {\n" + "  class B {\n" + "    B(int i) {}\n" + "  }\n" + "}\n";
   DeadCodeMap map = DeadCodeMap.builder().addDeadMethod("A$B", "A$B", "(LA;I)V").build();
   setDeadCodeMap(map);
   String translation = translateSourceFile(source, "A", "A.m");
   assertNotInTranslation(translation, "withInt");
 }
 public void testDeadFields() throws IOException {
   String source =
       "import static java.lang.System.out;\n"
           + "import static java.lang.System.in;\n"
           + "class A {\n"
           + "  private static final int foo = 1;\n"
           + "  public static final String bar = \"bar\";\n"
           + "  static final double pi = 3.2; // in Indiana only\n"
           + "  final String baz = null, bah = \"123\";\n"
           + "  private int abc = 9;\n"
           + "}\n";
   DeadCodeMap map =
       DeadCodeMap.builder()
           .addDeadField("A", "foo")
           .addDeadField("A", "baz")
           .addDeadField("java.lang.System", "in")
           .build();
   setDeadCodeMap(map);
   String translation = translateSourceFile(source, "A", "A.h");
   assertTranslation(translation, "#define A_pi 3.2");
   assertTranslation(translation, "NSString *bah_;");
   assertNotInTranslation(translation, "baz");
   translation = getTranslatedFile("A.m");
   assertTranslation(translation, "#define A_foo 1");
   assertTranslation(translation, "NSString *A_bar = @\"bar\";");
   assertTranslation(translation, "abc_ = 9;");
   assertTranslation(translation, "JreStrongAssign(&self->bah_, @\"123\");");
   assertNotInTranslation(translation, "baz");
 }
 public void testConstructorGeneration() throws IOException {
   DeadCodeMap map =
       DeadCodeMap.builder().addDeadClass("A").addDeadMethod("C", "C", "(I)V").build();
   setDeadCodeMap(map);
   addSourceFile(
       "class B {\n" + "  public B(int x, boolean y, String z, java.util.List w) {}\n" + "}",
       "B.java");
   String translation =
       translateSourceFile(
           "class A extends B {\n"
               + "  public A(int i) { super(i, true, \"foo\", new java.util.ArrayList()); }\n"
               + "}\n",
           "A",
           "A.m");
   assertNotInTranslation(translation, "initWithInt");
   assertNotInTranslation(translation, "B_init");
   translation =
       translateSourceFile(
           "class C extends B {\n"
               + "  public C(int i) { super(i, true, \"foo\", new java.util.ArrayList()); }\n"
               + "}\n",
           "C",
           "C.m");
   assertNotInTranslation(translation, "initWithInt");
   assertNotInTranslation(translation, "B_init");
 }
 public void testDeadClass_DeadInnerClassConstructor() throws IOException {
   DeadCodeMap map =
       DeadCodeMap.builder()
           .addDeadField("Foo$A", "z")
           .addDeadField("Foo$A", "this$0")
           .addDeadMethod("Foo$A", "Foo$A", "(LFoo;I)V")
           .addDeadMethod("Foo$A", "f", "()I")
           .build();
   setDeadCodeMap(map);
   String source =
       "public class Foo {\n"
           + "  int y;\n"
           + "  public Foo(int x) { y = x; }\n"
           + "\n"
           + "  class A {\n"
           + "    int z;\n"
           + "    A(int x) { z = x; }\n"
           + "    int f() { return z + y; }\n"
           + "  }\n"
           + "}\n";
   String translation = translateSourceFile(source, "Foo", "Foo.h");
   assertTranslation(translation, "@interface Foo_A");
   assertNotInTranslation(translation, "z_;");
   translation = getTranslatedFile("Foo.m");
   assertNotInTranslation(translation, "Foo *this$0_;");
   assertNotInTranslation(translation, "JreStrongAssign(&self->this$0_, outer$");
   assertNotInTranslation(translation, "self->z_ = x;");
   assertNotInTranslation(translation, "- (jint)f");
 }
 public void testDeadMethod_AnonymousClassMember() throws IOException {
   String source =
       "abstract class B {}\n"
           + "class A {\n"
           + "  private B b = new B() {\n"
           + "    public void foo() {}\n"
           + "  };\n"
           + "}\n";
   DeadCodeMap map = DeadCodeMap.builder().addDeadMethod("A$1", "foo", "()V").build();
   setDeadCodeMap(map);
   String translation = translateSourceFile(source, "A", "A.m");
   assertNotInTranslation(translation, "foo");
 }
 public void testDeadClass_StaticNestedClass() throws IOException {
   DeadCodeMap map = DeadCodeMap.builder().addDeadClass("Foo").build();
   setDeadCodeMap(map);
   String source =
       "class Foo {\n"
           + "  static class Bar {}\n"
           + "}\n"
           + "class Baz extends Foo.Bar {\n"
           + "}\n";
   String translation = translateSourceFile(source, "Foo", "Foo.h");
   assertTranslation(translation, "@interface Foo_Bar : NSObject");
   translation = getTranslatedFile("Foo.m");
   assertTranslation(translation, "Foo_Bar_init");
 }
 public void testDeadClass_FieldRemoval() throws IOException {
   DeadCodeMap map = DeadCodeMap.builder().addDeadClass("Foo").build();
   setDeadCodeMap(map);
   String source =
       "class Foo {\n"
           + "  static final int x = f();\n"
           + "  static final int y = 0;\n"
           + "  static int f() { return 0; }\n"
           + "}\n";
   String translation = translateSourceFile(source, "Foo", "Foo.h");
   assertTranslation(translation, "#define Foo_y 0");
   translation = getTranslatedFile("Foo.m");
   assertNotInTranslation(translation, "jint Foo_x_");
   assertNotInTranslation(translation, "Foo_x_ = Foo_f()");
   assertNotInTranslation(translation, "+ (jint)f");
   assertNotInTranslation(translation, "bar");
 }
 public void testDeadInitializer() throws IOException {
   DeadCodeMap map = DeadCodeMap.builder().addDeadClass("A").build();
   setDeadCodeMap(map);
   String source =
       "class A {\n"
           + "  static final int baz = 9;\n"
           + "  static { System.out.println(\"foo\"); }\n"
           + "  { System.out.println(\"bar\"); }\n"
           + "}\n";
   String translation = translateSourceFile(source, "A", "A.h");
   assertTranslation(translation, "#define A_baz 9");
   translation = getTranslatedFile("A.m");
   assertNotInTranslation(translation, "println");
   assertNotInTranslation(translation, "initialize");
   assertNotInTranslation(translation, "foo");
   assertNotInTranslation(translation, "bar");
 }
 public void testDeadMethod() throws IOException {
   String source =
       "class A {\n"
           + "  private static interface B {\n"
           + "    String bar();\n"
           + "  }\n"
           + "  private void baz() {\n"
           + "    // nothing\n"
           + "  }\n"
           + "}\n";
   DeadCodeMap map =
       DeadCodeMap.builder().addDeadMethod("A$B", "bar", "()Ljava/lang/String;").build();
   setDeadCodeMap(map);
   String translation = translateSourceFile(source, "A", "A.m");
   assertTranslation(translation, "@interface A_B");
   assertNotInTranslation(translation, "bar");
   assertTranslation(translation, "baz");
 }
 public void testDeadEnum() throws IOException {
   DeadCodeMap map = DeadCodeMap.builder().addDeadClass("A$Thing").build();
   setDeadCodeMap(map);
   String source =
       "class A {\n"
           + "  private static void foo() {}\n"
           + "  public enum Thing {\n"
           + "    THING1(27),\n"
           + "    THING2(89) { void bar() {} },\n"
           + "    THING3 { void bar() { foo(); } };\n"
           + "    private Thing(int x) {}\n"
           + "    private Thing() {}\n"
           + "  }\n"
           + "}\n";
   String translation = translateSourceFile(source, "A", "A.m");
   assertNotInTranslation(translation, "initWithInt");
   assertNotInTranslation(translation, "THING1");
   assertNotInTranslation(translation, "THING2");
   assertNotInTranslation(translation, "THING3");
 }
 public void testDeadClass_DeadStaticNestedClass() throws IOException {
   DeadCodeMap map =
       DeadCodeMap.builder()
           .addDeadClass("Foo")
           .addDeadClass("Foo$Bar")
           .addDeadMethod("Foo$Baz", "g", "()V")
           .build();
   setDeadCodeMap(map);
   String source =
       "class Foo {\n"
           + "  static class Bar { void f() {} }\n"
           + "  static class Baz { void g() {} }\n"
           + "}\n";
   String translation = translateSourceFile(source, "Foo", "Foo.h");
   assertTranslation(translation, "@interface Foo_Bar");
   assertNotInTranslation(translation, "- (void)f");
   assertTranslation(translation, "@interface Foo_Baz");
   assertNotInTranslation(translation, "- (void)g");
   translation = getTranslatedFile("Foo.m");
   assertTranslation(translation, "Foo_Bar_init");
   assertNotInTranslation(translation, "- (void)f");
   assertTranslation(translation, "Foo_Baz_init");
   assertNotInTranslation(translation, "- (void)g");
 }