diff --git a/translator/src/main/java/com/google/devtools/j2objc/TranslationProcessor.java b/translator/src/main/java/com/google/devtools/j2objc/TranslationProcessor.java index 15ff9e15f7..ffe4310bff 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/TranslationProcessor.java +++ b/translator/src/main/java/com/google/devtools/j2objc/TranslationProcessor.java @@ -21,8 +21,8 @@ import com.google.devtools.j2objc.ast.CompilationUnit; import com.google.devtools.j2objc.ast.PackageDeclaration; import com.google.devtools.j2objc.ast.TreeConverter; -import com.google.devtools.j2objc.file.RegularInputFile; import com.google.devtools.j2objc.file.InputFile; +import com.google.devtools.j2objc.file.RegularInputFile; import com.google.devtools.j2objc.gen.GenerationUnit; import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator; import com.google.devtools.j2objc.gen.ObjectiveCImplementationGenerator; @@ -369,7 +369,7 @@ public static void applyMutations( // After: Functionizer - Changes bindings on MethodDeclaration nodes. // Before: StaticVarRewriter, OperatorRewriter - Doesn't know how to handle // the hasRetainedResult flag on ClassInstanceCreation nodes. - new JavaToIOSMethodTranslator(Options.getMethodMappings()).run(unit); + new JavaToIOSMethodTranslator().run(unit); ticker.tick("JavaToIOSMethodTranslator"); new StaticVarRewriter().run(unit); diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/JavaToIOSMethodTranslator.java b/translator/src/main/java/com/google/devtools/j2objc/translate/JavaToIOSMethodTranslator.java index 24c218fcd6..7cf53be587 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/JavaToIOSMethodTranslator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/JavaToIOSMethodTranslator.java @@ -16,6 +16,7 @@ package com.google.devtools.j2objc.translate; +import com.google.common.collect.ImmutableMap; import com.google.devtools.j2objc.Options; import com.google.devtools.j2objc.ast.Block; import com.google.devtools.j2objc.ast.ClassInstanceCreation; @@ -51,12 +52,37 @@ */ public class JavaToIOSMethodTranslator extends TreeVisitor { - private final ITypeBinding javaLangCloneable; + /** + * We convert all the String constructor invocations to factory method + * invocations because we want to avoid calling [NSString alloc]. + * TODO(kstanger): This may not actually be necessary, investigate. + */ + private static final Map STRING_CONSTRUCTOR_TO_METHOD_MAPPINGS = + ImmutableMap.builder() + .put("java.lang.String.String()V", "string") + .put("java.lang.String.String(Ljava/lang/String;)V", "stringWithString:") + .put("java.lang.String.String([B)V", "stringWithBytes:") + .put("java.lang.String.String([BLjava/lang/String;)V", "stringWithBytes:charsetName:") + .put("java.lang.String.String([BLjava/nio/charset/Charset;)V", "stringWithBytes:charset:") + .put("java.lang.String.String([BI)V", "stringWithBytes:hibyte:") + .put("java.lang.String.String([BII)V", "stringWithBytes:offset:length:") + .put("java.lang.String.String([BIII)V", "stringWithBytes:hibyte:offset:length:") + .put("java.lang.String.String([BIILjava/lang/String;)V", + "stringWithBytes:offset:length:charsetName:") + .put("java.lang.String.String([BIILjava/nio/charset/Charset;)V", + "stringWithBytes:offset:length:charset:") + .put("java.lang.String.String([C)V", "stringWithCharacters:") + .put("java.lang.String.String([CII)V", "stringWithCharacters:offset:length:") + .put("java.lang.String.String([III)V", "stringWithInts:offset:length:") + .put("java.lang.String.String(II[C)V", "stringWithOffset:length:characters:") + .put("java.lang.String.String(Ljava/lang/StringBuffer;)V", "stringWithJavaLangStringBuffer:") + .put("java.lang.String.String(Ljava/lang/StringBuilder;)V", + "stringWithJavaLangStringBuilder:") + .build(); - private final Map methodMappings; + private final ITypeBinding javaLangCloneable; - public JavaToIOSMethodTranslator(Map methodMappings) { - this.methodMappings = NameTable.getMethodMappings(); + public JavaToIOSMethodTranslator() { javaLangCloneable = Types.resolveJavaType("java.lang.Cloneable"); } @@ -92,7 +118,7 @@ public boolean visit(ClassInstanceCreation node) { IMethodBinding binding = node.getMethodBinding(); String key = BindingUtil.getMethodKey(binding); - String selector = methodMappings.get(key); + String selector = STRING_CONSTRUCTOR_TO_METHOD_MAPPINGS.get(key); if (selector != null) { assert !node.hasRetainedResult(); if (key.equals("java.lang.String.String(Ljava/lang/String;)V")) { diff --git a/translator/src/main/java/com/google/devtools/j2objc/util/NameTable.java b/translator/src/main/java/com/google/devtools/j2objc/util/NameTable.java index ca55975729..791cbc147a 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/util/NameTable.java +++ b/translator/src/main/java/com/google/devtools/j2objc/util/NameTable.java @@ -435,12 +435,6 @@ public static String parameterKeyword(ITypeBinding type) { return "with" + capitalize(getParameterTypeKeyword(type)); } - // Needed by JavaToIOSMethodTranslator to convert ClassInstanceCreation nodes - // to MethodInvocation nodes. - public static Map getMethodMappings() { - return instance.methodMappings; - } - // Matches the class name prefix or a parameter declarations of a method // signature. After removing these parts, the selector remains. private static final Pattern SIGNATURE_STRIPPER = diff --git a/translator/src/main/resources/com/google/devtools/j2objc/JRE.mappings b/translator/src/main/resources/com/google/devtools/j2objc/JRE.mappings index 277209d254..498e10225c 100644 --- a/translator/src/main/resources/com/google/devtools/j2objc/JRE.mappings +++ b/translator/src/main/resources/com/google/devtools/j2objc/JRE.mappings @@ -98,23 +98,6 @@ java.lang.Class.isPrimitive()Z = isPrimitive java.lang.Class.newInstance()Ljava/lang/Object; = newInstance # java.lang.String -java.lang.String.String()V = string -java.lang.String.String(Ljava/lang/String;)V = stringWithString: -java.lang.String.String([B)V = stringWithBytes: -java.lang.String.String([BLjava/lang/String;)V = stringWithBytes:charsetName: -java.lang.String.String([BLjava/nio/charset/Charset;)V = stringWithBytes:charset: -java.lang.String.String([BI)V = stringWithBytes:hibyte: -java.lang.String.String([BII)V = stringWithBytes:offset:length: -java.lang.String.String([BIII)V = stringWithBytes:hibyte:offset:length: -java.lang.String.String([BIILjava/lang/String;)V = stringWithBytes:offset:length:charsetName: -java.lang.String.String([BIILjava/nio/charset/Charset;)V = stringWithBytes:offset:length:charset: -java.lang.String.String([C)V = stringWithCharacters: -java.lang.String.String([CII)V = stringWithCharacters:offset:length: -java.lang.String.String([III)V = stringWithInts:offset:length: -java.lang.String.String(II[C)V = stringWithOffset:length:characters: -java.lang.String.String(Ljava/lang/StringBuffer;)V = stringWithJavaLangStringBuffer: -java.lang.String.String(Ljava/lang/StringBuilder;)V = stringWithJavaLangStringBuilder: - java.lang.String.charAt(I)C = charAtWithInt: java.lang.String.codePointAt(I)I = codePointAt: java.lang.String.codePointBefore(I)I = codePointBefore: