Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ protected void generateInitialDeclaration() {
// refer to the companion type, so we need one forward declaration in any case.
printf("\n@class %s;\n", typeName);

printf("\n@protocol %sCompanion\n", typeName);
printf("\n@protocol %sInternalCompanionProtocol\n", typeName);
for (BodyDeclaration declaration : getInnerDeclarations()) {
if (declaration.getKind().equals(TreeNode.Kind.METHOD_DECLARATION)) {
printMethodDeclaration((MethodDeclaration) declaration, false, true);
Expand All @@ -162,7 +162,8 @@ protected void generateInitialDeclaration() {
if (needsKotlinCompanionClass()) {
printf("\n#pragma clang diagnostic push\n");
printf("#pragma clang diagnostic ignored \"-Wincompatible-property-type\"\n");
printf("@property (readonly, class) id<%sCompanion> companion;\n", typeName);
printf(
"@property (readonly, class) id<%sInternalCompanionProtocol> companion;\n", typeName);
printf("#pragma clang diagnostic pop\n");
}
}
Expand Down Expand Up @@ -485,7 +486,7 @@ protected void printCompanionClassDeclaration() {
if (needsKotlinCompanionClass()) {
printf("\n#pragma clang diagnostic push\n");
printf("#pragma clang diagnostic ignored \"-Wincompatible-property-type\"\n");
printf("@property (readonly, class) id<%sCompanion> companion;\n", typeName);
printf("@property (readonly, class) id<%sInternalCompanionProtocol> companion;\n", typeName);
printf("#pragma clang diagnostic pop\n");
}
println("\n@end");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ protected void generate() {
printf("@implementation %s\n", typeName);
printProperties();
if (needsKotlinCompanionClass()) {
printf("\n+ (id<%sCompanion>)companion {", typeName);
printf("\n return (id<%sCompanion>)self;\n}\n", typeName);
printf("\n+ (id<%sInternalCompanionProtocol>)companion {", typeName);
printf("\n return (id<%sInternalCompanionProtocol>)self;\n}\n", typeName);
}
printStaticAccessors();
printInnerDeclarations();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,15 @@ public static void doSomething() {}
""";
String header = translateSourceFile(source, "Foo", "Foo.h");
assertInTranslation(header, "@class Foo;");
assertInTranslation(header, "@protocol FooCompanion");
assertInTranslation(header, "@protocol FooInternalCompanionProtocol");
// The companion protocol method should be an instance method instead of class method
assertInTranslation(header, "- (void)doSomething;");
assertInTranslation(header, "@property (readonly, class) id<FooCompanion> companion;");
assertInTranslation(
header, "@property (readonly, class) id<FooInternalCompanionProtocol> companion;");

String impl = translateSourceFile(source, "Foo", "Foo.m");
assertInTranslation(impl, "+ (id<FooCompanion>)companion {");
assertInTranslation(impl, "return (id<FooCompanion>)self;");
assertInTranslation(impl, "+ (id<FooInternalCompanionProtocol>)companion {");
assertInTranslation(impl, "return (id<FooInternalCompanionProtocol>)self;");
}

public void testGenericVariablesAreLost() throws IOException {
Expand All @@ -56,9 +57,10 @@ public class Bar<T> {
""";
String header = translateSourceFile(source, "Bar", "Bar.h");
assertInTranslation(header, "@class Bar;");
assertInTranslation(header, "@protocol BarCompanion");
assertInTranslation(header, "@protocol BarInternalCompanionProtocol");
assertInTranslation(header, "- (id)doSomethingWithId:(id)arg;");
assertInTranslation(header, "@property (readonly, class) id<BarCompanion> companion;");
assertInTranslation(
header, "@property (readonly, class) id<BarInternalCompanionProtocol> companion;");
}

public void testBoundGenericMethodTypesArePreserved() throws IOException {
Expand All @@ -73,7 +75,7 @@ public static ThreadLocal<String> identity(ThreadLocal<String> val) {
""";
String header = translateSourceFile(source, "Baz", "Baz.h");
assertInTranslation(header, "@class Baz;");
assertInTranslation(header, "@protocol BazCompanion");
assertInTranslation(header, "@protocol BazInternalCompanionProtocol");
assertInTranslation(
header,
"- (JavaLangThreadLocal<NSString *>"
Expand All @@ -92,7 +94,7 @@ public class Foo {
}
""";
String header = translateSourceFile(source, "Foo", "Foo.h");
assertInTranslation(header, "@protocol FooCompanion");
assertInTranslation(header, "@protocol FooInternalCompanionProtocol");
// Should generate instance property for CONSTANT_VALUE in companion protocol.
assertInTranslation(
header, "@property (readonly) int32_t CONSTANT_VALUE NS_SWIFT_NAME(CONSTANT_VALUE);");
Expand All @@ -114,7 +116,7 @@ public class Foo {
""";
// This should compile successfully without throwing "types without static methods" exception.
String header = translateSourceFile(source, "Foo", "Foo.h");
assertInTranslation(header, "@protocol FooCompanion");
assertInTranslation(header, "@protocol FooInternalCompanionProtocol");
assertInTranslation(
header, "@property (readonly) int32_t CONSTANT_VALUE NS_SWIFT_NAME(CONSTANT_VALUE);");
}
Expand All @@ -130,17 +132,18 @@ public static void doSomething() {}
}
""";
String header = translateSourceFile(source, "Foo", "Foo.h");
assertInTranslation(header, "@protocol FooCompanion");
assertInTranslation(header, "@protocol FooInternalCompanionProtocol");
assertInTranslation(
header, "@property (readonly) int32_t CONSTANT_VALUE NS_SWIFT_NAME(CONSTANT_VALUE);");
assertInTranslation(header, "- (void)doSomething;");
assertInTranslation(header, "@interface Foo : NSObject");
assertInTranslation(header, "@property (readonly, class) id<FooCompanion> companion;");
assertInTranslation(
header, "@property (readonly, class) id<FooInternalCompanionProtocol> companion;");

String impl = translateSourceFile(source, "Foo", "Foo.m");
assertInTranslation(impl, "@implementation Foo");
assertInTranslation(impl, "+ (id<FooCompanion>)companion {");
assertInTranslation(impl, "return (id<FooCompanion>)self;");
assertInTranslation(impl, "+ (id<FooInternalCompanionProtocol>)companion {");
assertInTranslation(impl, "return (id<FooInternalCompanionProtocol>)self;");
}

public void testCompanionPropertiesForPropertyMethods() throws IOException {
Expand All @@ -156,7 +159,7 @@ public static String getBar() {
}
""";
String header = translateSourceFile(source, "Foo", "Foo.h");
assertInTranslation(header, "@protocol FooCompanion");
assertInTranslation(header, "@protocol FooInternalCompanionProtocol");
assertInTranslation(header, "@property (nonatomic, getter=getBar, readonly) NSString * bar;");
assertInTranslation(
header, "@property (class, nonatomic, getter=getBar, readonly) NSString * bar;");
Expand Down