Skip to content

Commit

Permalink
Moves the special case mappings for String constructors into a hard-c…
Browse files Browse the repository at this point in the history
…oded mapping in JavaToIOSMethodTranslator.

	Change on 2015/03/03 by kstanger <kstanger@google.com>
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=87646672
  • Loading branch information
kstanger committed Mar 18, 2015
1 parent 9f611ab commit 021cd16
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 30 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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, String> STRING_CONSTRUCTOR_TO_METHOD_MAPPINGS =
ImmutableMap.<String, String>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<String, String> methodMappings;
private final ITypeBinding javaLangCloneable;

public JavaToIOSMethodTranslator(Map<String, String> methodMappings) {
this.methodMappings = NameTable.getMethodMappings();
public JavaToIOSMethodTranslator() {
javaLangCloneable = Types.resolveJavaType("java.lang.Cloneable");
}

Expand Down Expand Up @@ -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")) {
Expand Down
Expand Up @@ -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<String, String> 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 =
Expand Down
Expand Up @@ -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:
Expand Down

0 comments on commit 021cd16

Please sign in to comment.