From a580992dc4e28b7a196a37dda0b542159246c396 Mon Sep 17 00:00:00 2001 From: Stefan Haustein Date: Wed, 17 Dec 2025 08:50:31 -0800 Subject: [PATCH] Add Kotlin "@ObjcEnum"-compatible aliases for J2ObjC enum constants. PiperOrigin-RevId: 845787437 --- .../j2objc/gen/TypeDeclarationGenerator.java | 11 +++++++++++ .../google/devtools/j2objc/util/NameTable.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) 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 2106b7f540..f0855d028a 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 @@ -215,6 +215,17 @@ private void printNativeEnum() { } print("\n"); + // Provide aliases for compatibility with kotlin + for (EnumConstantDeclaration constant : constants) { + String nativeConstantName = nameTable.getNativeEnumConstantName(typeElement, constant); + String kotlinConstantName = + nameTable.getNativeKotlinEnumConstantName(typeElement, constant); + if (!nativeConstantName.equals(kotlinConstantName)) { + printf("#define %s %s\n", kotlinConstantName, nativeConstantName); + } + } + print("\n"); + // Use different types for transpiled Java ordinals (which expects ordinals to be int32_t) and // native code using the enum (where stricter ordinal types help clang warnings). printf( 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 348250f8ed..d6c03b1647 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 @@ -1056,6 +1056,22 @@ public String getNativeEnumConstantName( } } + public String getNativeKotlinEnumConstantName( + TypeElement enumTypeElement, EnumConstantDeclaration constantDeclaration) { + return getNativeKotlinEnumConstantName( + enumTypeElement, constantDeclaration.getVariableElement()); + } + + public String getNativeKotlinEnumConstantName( + TypeElement enumTypeElement, VariableElement constantVariableElement) { + // Note that we stick to J2objc type name conventions here, avoiding type name churn in + // addition to the literal name change. + String enumBaseName = getFullName(enumTypeElement) + "_Enum"; + String constantSuffix = getVariableBaseName(constantVariableElement); + constantSuffix = camelCaseName(constantSuffix, true); + return enumBaseName + constantSuffix; + } + public String getNativeEnumSwiftConstantName(EnumConstantDeclaration constantDeclaration) { return camelCaseName(getVariableBaseName(constantDeclaration.getVariableElement()), false); }