From 5e1ff7d7646d674c603ec928fac55255e59818d7 Mon Sep 17 00:00:00 2001 From: Stefan Haustein Date: Fri, 31 Jul 2026 06:31:50 -0700 Subject: [PATCH] BEGIN_PUBLIC Rename the internal companion protocol name suffix from "Companion" to "InternalCompanionProtocol" in j2objc transpiler This makes room for actual Companion classes and also makes it obvious that this protocol shouldn't be referenced directly in client code. END_PUBLIC PiperOrigin-RevId: 957106939 --- .../j2objc/gen/TypeDeclarationGenerator.java | 7 +++-- .../gen/TypeImplementationGenerator.java | 4 +-- .../j2objc/gen/GenerateObjCCompanionTest.java | 31 ++++++++++--------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/TypeDeclarationGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/gen/TypeDeclarationGenerator.java index 79179710a3..51b3de8dbd 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/TypeDeclarationGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/TypeDeclarationGenerator.java @@ -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); @@ -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"); } } @@ -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"); diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/TypeImplementationGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/gen/TypeImplementationGenerator.java index 92d8debeb2..a026587146 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/TypeImplementationGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/TypeImplementationGenerator.java @@ -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(); diff --git a/translator/src/test/java/com/google/devtools/j2objc/gen/GenerateObjCCompanionTest.java b/translator/src/test/java/com/google/devtools/j2objc/gen/GenerateObjCCompanionTest.java index e682bee231..87146571d7 100644 --- a/translator/src/test/java/com/google/devtools/j2objc/gen/GenerateObjCCompanionTest.java +++ b/translator/src/test/java/com/google/devtools/j2objc/gen/GenerateObjCCompanionTest.java @@ -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 companion;"); + assertInTranslation( + header, "@property (readonly, class) id companion;"); String impl = translateSourceFile(source, "Foo", "Foo.m"); - assertInTranslation(impl, "+ (id)companion {"); - assertInTranslation(impl, "return (id)self;"); + assertInTranslation(impl, "+ (id)companion {"); + assertInTranslation(impl, "return (id)self;"); } public void testGenericVariablesAreLost() throws IOException { @@ -56,9 +57,10 @@ public class Bar { """; 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 companion;"); + assertInTranslation( + header, "@property (readonly, class) id companion;"); } public void testBoundGenericMethodTypesArePreserved() throws IOException { @@ -73,7 +75,7 @@ public static ThreadLocal identity(ThreadLocal val) { """; String header = translateSourceFile(source, "Baz", "Baz.h"); assertInTranslation(header, "@class Baz;"); - assertInTranslation(header, "@protocol BazCompanion"); + assertInTranslation(header, "@protocol BazInternalCompanionProtocol"); assertInTranslation( header, "- (JavaLangThreadLocal" @@ -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);"); @@ -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);"); } @@ -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 companion;"); + assertInTranslation( + header, "@property (readonly, class) id companion;"); String impl = translateSourceFile(source, "Foo", "Foo.m"); assertInTranslation(impl, "@implementation Foo"); - assertInTranslation(impl, "+ (id)companion {"); - assertInTranslation(impl, "return (id)self;"); + assertInTranslation(impl, "+ (id)companion {"); + assertInTranslation(impl, "return (id)self;"); } public void testCompanionPropertiesForPropertyMethods() throws IOException { @@ -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;");