Skip to content

Commit

Permalink
- Uses method renamings to construct function names.
Browse files Browse the repository at this point in the history
- Be a smarter about renaming methods: If the name doesn't look like a selector (no ':') use the name and add the parameter keywords as usual.
	Change on 2015/02/20 by kstanger <kstanger@google.com>
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=86809199
  • Loading branch information
kstanger committed Feb 25, 2015
1 parent 8c26a42 commit 31e3808
Show file tree
Hide file tree
Showing 8 changed files with 104 additions and 65 deletions.
10 changes: 6 additions & 4 deletions jre_emul/Classes/IOSClass.h
Expand Up @@ -198,6 +198,12 @@

CF_EXTERN_C_BEGIN

// Class.forName(String)
IOSClass *IOSClass_forName_(NSString *className);
// Class.forName(String, boolean, ClassLoader)
IOSClass *IOSClass_forName_initialize_classLoader_(
NSString *className, BOOL load, JavaLangClassLoader *loader);

// Lookup a IOSClass from its associated ObjC class, protocol or component type.
IOSClass *IOSClass_fromClass(Class cls);
IOSClass *IOSClass_fromProtocol(Protocol *protocol);
Expand All @@ -219,10 +225,6 @@ IOSClass *IOSClass_arrayType(IOSClass *componentType, jint dimensions);
NSString *IOSClass_GetTranslatedMethodName(
IOSClass *cls, NSString *name, IOSObjectArray *paramTypes);

IOSClass *IOSClass_forNameWithNSString_(NSString *className);
IOSClass *IOSClass_forNameWithNSString_withBoolean_withJavaLangClassLoader_(
NSString *className, BOOL load, JavaLangClassLoader *loader);

// Return value is retained
IOSObjectArray *IOSClass_NewInterfacesFromProtocolList(Protocol **list, unsigned int count);

Expand Down
10 changes: 5 additions & 5 deletions jre_emul/Classes/IOSClass.m
Expand Up @@ -497,7 +497,7 @@ + (IOSClass *)primitiveClassForChar:(unichar)c {
return nil;
}

IOSClass *IOSClass_forNameWithNSString_(NSString *className) {
IOSClass *IOSClass_forName_(NSString *className) {
nil_chk(className);
IOSClass *iosClass = nil;
if ([className length] > 0) {
Expand All @@ -518,18 +518,18 @@ + (IOSClass *)primitiveClassForChar:(unichar)c {
}

+ (IOSClass *)forName:(NSString *)className {
return IOSClass_forNameWithNSString_(className);
return IOSClass_forName_(className);
}

IOSClass *IOSClass_forNameWithNSString_withBoolean_withJavaLangClassLoader_(
IOSClass *IOSClass_forName_initialize_classLoader_(
NSString *className, BOOL load, JavaLangClassLoader *loader) {
return IOSClass_forNameWithNSString_(className);
return IOSClass_forName_(className);
}

+ (IOSClass *)forName:(NSString *)className
initialize:(BOOL)load
classLoader:(JavaLangClassLoader *)loader {
return IOSClass_forNameWithNSString_withBoolean_withJavaLangClassLoader_(className, load, loader);
return IOSClass_forName_initialize_classLoader_(className, load, loader);
}

- (id)cast:(id)throwable {
Expand Down
34 changes: 22 additions & 12 deletions jre_emul/Classes/NSString+JavaString.h
Expand Up @@ -285,23 +285,33 @@ destinationBegin:(int)dstBegin;

@end

FOUNDATION_EXPORT NSString *NSString_copyValueOfWithCharArray_(IOSCharArray *chars);
FOUNDATION_EXPORT NSString *NSString_copyValueOfWithCharArray_withInt_withInt_(
IOSCharArray *chars, jint i, jint j);
// String.format(Locale, String, Object...)
FOUNDATION_EXPORT NSString *NSString_formatWithJavaUtilLocale_withNSString_withNSObjectArray_(
JavaUtilLocale *l, NSString *s, IOSObjectArray *objs);
// String.format(String, Object...)
FOUNDATION_EXPORT NSString *NSString_formatWithNSString_withNSObjectArray_(
NSString *s, IOSObjectArray *objs);
FOUNDATION_EXPORT NSString *NSString_valueOfWithBoolean_(jboolean b);
FOUNDATION_EXPORT NSString *NSString_valueOfWithChar_(jchar c);
FOUNDATION_EXPORT NSString *NSString_valueOfWithCharArray_(IOSCharArray *chars);
FOUNDATION_EXPORT NSString *NSString_valueOfWithCharArray_withInt_withInt_(
// String.valueOf(boolean)
FOUNDATION_EXPORT NSString *NSString_valueOfBool_(jboolean b);
// String.valueOf(char)
FOUNDATION_EXPORT NSString *NSString_valueOfChar_(jchar c);
// String.valueOf(char[])
// String.copyValueOf(char[])
FOUNDATION_EXPORT NSString *NSString_valueOfChars_(IOSCharArray *chars);
// String.valueOf(char[], int, int)
// String.copyValueOf(char[], int, int)
FOUNDATION_EXPORT NSString *NSString_valueOfChars_offset_count_(
IOSCharArray *chars, jint i, jint j);
FOUNDATION_EXPORT NSString *NSString_valueOfWithDouble_(jdouble d);
FOUNDATION_EXPORT NSString *NSString_valueOfWithFloat_(jfloat f);
FOUNDATION_EXPORT NSString *NSString_valueOfWithInt_(jint i);
FOUNDATION_EXPORT NSString *NSString_valueOfWithLong_(jlong l);
FOUNDATION_EXPORT NSString *NSString_valueOfWithId_(id o);
// String.valueOf(double)
FOUNDATION_EXPORT NSString *NSString_valueOfDouble_(jdouble d);
// String.valueOf(float)
FOUNDATION_EXPORT NSString *NSString_valueOfFloat_(jfloat f);
// String.valueOf(int)
FOUNDATION_EXPORT NSString *NSString_valueOfInt_(jint i);
// String.valueOf(long)
FOUNDATION_EXPORT NSString *NSString_valueOfLong_(jlong l);
// String.valueOf(Object)
FOUNDATION_EXPORT NSString *NSString_valueOf_(id o);

// Empty class to force category to be loaded.
@interface JreStringCategoryDummy : NSObject
Expand Down
48 changes: 19 additions & 29 deletions jre_emul/Classes/NSString+JavaString.m
Expand Up @@ -59,43 +59,38 @@ id makeException(Class exceptionClass) {

// TODO(tball): remove static method wrappers when reflection invocation calls functions directly.
+ (NSString *)valueOf:(id<NSObject>)obj {
return NSString_valueOfWithId_((id)obj);
return NSString_valueOf_((id)obj);
}

NSString *NSString_valueOfWithId_(id obj) {
NSString *NSString_valueOf_(id obj) {
return obj ? [obj description] : @"null";
}

+ (NSString *)valueOfBool:(BOOL)value {
return NSString_valueOfWithBoolean_(value);
return NSString_valueOfBool_(value);
}

NSString *NSString_valueOfWithBoolean_(BOOL value) {
NSString *NSString_valueOfBool_(BOOL value) {
return value ? @"true" : @"false";
}

+ (NSString *)valueOfChar:(unichar)value {
return NSString_valueOfWithChar_(value);
return NSString_valueOfChar_(value);
}

NSString *NSString_valueOfWithChar_(unichar value) {
NSString *NSString_valueOfChar_(unichar value) {
return [NSString stringWithCharacters:&value length:1];
}

NSString *NSString_valueOfWithCharArray_(IOSCharArray *data) {
return NSString_copyValueOfWithCharArray_withInt_withInt_(data, 0, data->size_);
}

NSString *NSString_copyValueOfWithCharArray_(IOSCharArray *data) {
return NSString_valueOfWithCharArray_(data);
NSString *NSString_valueOfChars_(IOSCharArray *data) {
return NSString_valueOfChars_offset_count_(data, 0, data->size_);
}

+ (NSString *)valueOfChars:(IOSCharArray *)data {
return NSString_valueOfWithCharArray_(data);
return NSString_valueOfChars_(data);
}

NSString *NSString_valueOfWithCharArray_withInt_withInt_(
IOSCharArray *data, jint offset, jint count) {
NSString *NSString_valueOfChars_offset_count_(IOSCharArray *data, jint offset, jint count) {
id exception = nil;
if (offset < 0) {
exception = [[JavaLangStringIndexOutOfBoundsException alloc]
Expand Down Expand Up @@ -126,46 +121,41 @@ + (NSString *)valueOfChars:(IOSCharArray *)data {
return result;
}

NSString *NSString_copyValueOfWithCharArray_withInt_withInt_(
IOSCharArray *data, jint offset, jint count) {
return NSString_valueOfWithCharArray_withInt_withInt_(data, offset, count);
}

+ (NSString *)valueOfChars:(IOSCharArray *)data
offset:(int)offset
count:(int)count {
return NSString_valueOfWithCharArray_withInt_withInt_(data, offset, count);
return NSString_valueOfChars_offset_count_(data, offset, count);
}

+ (NSString *)valueOfDouble:(double)value {
return NSString_valueOfWithDouble_(value);
return NSString_valueOfDouble_(value);
}

NSString *NSString_valueOfWithDouble_(jdouble value) {
NSString *NSString_valueOfDouble_(jdouble value) {
return RealToString_doubleToString(value);
}

+ (NSString *)valueOfFloat:(float)value {
return NSString_valueOfWithFloat_(value);
return NSString_valueOfFloat_(value);
}

NSString *NSString_valueOfWithFloat_(jfloat value) {
NSString *NSString_valueOfFloat_(jfloat value) {
return RealToString_floatToString(value);
}

+ (NSString *)valueOfInt:(int)value {
return NSString_valueOfWithInt_(value);
return NSString_valueOfInt_(value);
}

NSString *NSString_valueOfWithInt_(jint value) {
NSString *NSString_valueOfInt_(jint value) {
return IntegralToString_convertInt(NULL, value);
}

+ (NSString *)valueOfLong:(long long int)value {
return NSString_valueOfWithLong_(value);
return NSString_valueOfLong_(value);
}

NSString *NSString_valueOfWithLong_(jlong value) {
NSString *NSString_valueOfLong_(jlong value) {
return IntegralToString_convertLong(NULL, value);
}

Expand Down
Expand Up @@ -35,9 +35,7 @@
import com.google.devtools.j2objc.util.BindingUtil;
import com.google.devtools.j2objc.util.ErrorUtil;
import com.google.devtools.j2objc.util.NameTable;
import com.google.j2objc.annotations.ObjectiveCName;

import org.eclipse.jdt.core.dom.IAnnotationBinding;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.Modifier;
Expand Down Expand Up @@ -67,9 +65,9 @@ public boolean visit(MethodDeclaration node) {
IMethodBinding method = node.getMethodBinding();

// Check if @ObjectiveCName is used but is mismatched with an overriden method.
IAnnotationBinding annotation = BindingUtil.getAnnotation(method, ObjectiveCName.class);
if (annotation != null) {
String selector = NameTable.getMethodSelectorFromAnnotation(method);
String name = NameTable.getMethodNameFromAnnotation(method);
if (name != null) {
String selector = NameTable.selectorForMethodName(method, name);
String actualSelector = NameTable.getMethodSelector(method);
if (!selector.equals(actualSelector)) {
ErrorUtil.warning("ObjectiveCName(" + selector
Expand Down
Expand Up @@ -479,8 +479,9 @@ public static String getMethodName(IMethodBinding method) {
return name;
}

private static String constructSelector(IMethodBinding method, char delim) {
StringBuilder sb = new StringBuilder(getMethodName(method));
private static String addParamNames(IMethodBinding method, String name, char delim) {
method = method.getMethodDeclaration();
StringBuilder sb = new StringBuilder(name);
ITypeBinding[] paramTypes = method.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
String keyword = parameterKeyword(paramTypes[i]);
Expand All @@ -505,17 +506,29 @@ public static String getMethodSelector(IMethodBinding method) {
return selectorForOriginalBinding(getOriginalMethodBindings(method).get(0));
}

private static String selectorForOriginalBinding(IMethodBinding method) {
private static String getRenamedMethodName(IMethodBinding method) {
method = method.getMethodDeclaration();
String selector = instance.methodMappings.get(BindingUtil.getMethodKey(method));
if (selector != null) {
return selector;
}
selector = getMethodSelectorFromAnnotation(method);
selector = getMethodNameFromAnnotation(method);
if (selector != null) {
return selector;
}
return constructSelector(method, ':');
return null;
}

public static String selectorForMethodName(IMethodBinding method, String name) {
if (name.contains(":")) {
return name;
}
return addParamNames(method, name, ':');
}

private static String selectorForOriginalBinding(IMethodBinding method) {
String selector = getRenamedMethodName(method);
return selectorForMethodName(method, selector != null ? selector : getMethodName(method));
}

/**
Expand Down Expand Up @@ -547,10 +560,16 @@ public static List<String> getExtraSelectors(IMethodBinding method) {
*/
public static String makeFunctionName(IMethodBinding method) {
method = method.getMethodDeclaration();
return getFullName(method.getDeclaringClass()) + '_' + constructSelector(method, '_');
String name = getRenamedMethodName(method);
if (name != null) {
name = name.replaceAll(":", "_");
} else {
name = addParamNames(method, getMethodName(method), '_');
}
return getFullName(method.getDeclaringClass()) + '_' + name;
}

public static String getMethodSelectorFromAnnotation(IMethodBinding method) {
public static String getMethodNameFromAnnotation(IMethodBinding method) {
IAnnotationBinding annotation = BindingUtil.getAnnotation(method, ObjectiveCName.class);
if (annotation != null) {
String value = (String) BindingUtil.getAnnotationValue(annotation, "value");
Expand Down
Expand Up @@ -54,9 +54,9 @@ public void testStringValueOfBoolean() throws IOException {
List<Statement> stmts = translateStatements(source);
assertEquals(2, stmts.size());
String result = generateStatement(stmts.get(0));
assertEquals("NSString *trueString = NSString_valueOfWithBoolean_(YES);", result);
assertEquals("NSString *trueString = NSString_valueOfBool_(YES);", result);
result = generateStatement(stmts.get(1));
assertEquals("NSString *falseString = NSString_valueOfWithBoolean_(NO);", result);
assertEquals("NSString *falseString = NSString_valueOfBool_(NO);", result);
}

/**
Expand All @@ -68,7 +68,7 @@ public void testMethodAndStatementTranslation() throws IOException {
"Test", "Test.m");
assertTranslatedLines(translation,
"- (NSString *)toStringWithBoolean:(jboolean)value {",
"return NSString_valueOfWithBoolean_(value);");
"return NSString_valueOfBool_(value);");
}

public void testStringDefaultConstructor() throws IOException {
Expand Down
Expand Up @@ -177,6 +177,26 @@ public void checkRenameMethodAnnotation(String objcName) throws IOException {
assertTranslation(translation, "[((A *) nil_chk(a)) test:@\"foo\" offset:4];");
}

public void testRenameStaticMethod() throws IOException {
String translation = translateSourceFile("public class Test { "
+ "@com.google.j2objc.annotations.ObjectiveCName(\"foo\") "
+ "static void test(String s, int n) {}}", "Test", "Test.h");
assertTranslatedLines(translation,
"+ (void)fooWithNSString:(NSString *)s",
" withInt:(jint)n;");
assertTranslation(translation, "FOUNDATION_EXPORT void Test_foo(NSString *s, jint n);");
translation = getTranslatedFile("Test.m");
assertTranslatedLines(translation,
"+ (void)fooWithNSString:(NSString *)s",
" withInt:(jint)n {",
" Test_foo(s, n);",
"}");
assertTranslatedLines(translation,
"t_foo(NSString *s, jint n) {",
" Test_init();",
"}");
}

public void testRenameConstructorAnnotationWithFullSignature() throws IOException {
checkRenameConstructorAnnotation("init:(NSString *)s offset:(int)n");
}
Expand Down

0 comments on commit 31e3808

Please sign in to comment.