Skip to content

Commit 7f4d031

Browse files
authored
Kotlin: hide from Java what can be hidden for enumerations (#1799)
---------- Motivation ---------- The elements with 'internal' Kotlin visibility become 'public' when they are accessed from Java. Because of that internal enumerations become fully visible in Java. The 'JvmSynthetic' can be used on the aliasing enumerators and on the value field of enumeration to hide as much as we can. ---------- Solution ---------- This commit: 1. Implements 'JvmSynthetic' handling in mustache templates for enumerations. 2. Adjusts smoke tests to showcase that 'JvmSynthetic' is generated. 3. Removes Kotlin-Java interoperability test to show, that mentioned elements cannot be access by Java. Signed-off-by: Patryk Wrobel <183546751+pwrobeldev@users.noreply.github.com>
1 parent f08cb8e commit 7f4d031

6 files changed

Lines changed: 16 additions & 14 deletions

File tree

functional-tests/functional/android/src/test/java/com/here/android/test/VisibilityAttributeTest.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,9 @@ public void internalFieldCtorCanBeCalled() {
103103
@Test
104104
public void valueOfInternalEnumCanBeAccessed() {
105105
SomeInternalEnum someObject = SomeInternalEnum.TWO;
106-
assertEquals(2, someObject.value);
107106
assertEquals(SomeInternalEnum.TWO, someObject);
108107
}
109108

110-
@Test
111-
public void internalAliasOfEnumCanBeAccessed() {
112-
SomeInternalEnum someObject = SomeInternalEnum.SINGLE;
113-
assertEquals(1, someObject.value);
114-
assertEquals(SomeInternalEnum.ONE, someObject);
115-
}
116-
117109
@Test
118110
public void internaInterfaceFromJavaCanBeUsed() {
119111
ImplementationOfSomeInternalInterface someInterfaceImpl = new ImplementationOfSomeInternalInterface();

gluecodium/src/main/resources/templates/kotlin/KotlinEnumeration.mustache

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@
2424
{{/unless}}{{/internalApiAnnotation}}internal {{!!
2525
}}{{/if}}{{!!
2626
}}{{#unless external.kotlin.converter}}{{>kotlin/KotlinTypeVisibility}}{{/unless}}{{!!
27-
}}enum class {{resolveName}}(@JvmField {{resolveName "visibility"}}val value: Int) {
27+
}}enum class {{resolveName}}(@JvmField {{!!
28+
}}{{#resolveName "visibility"}}{{!!
29+
}}{{#unless this.isEmpty}}@JvmSynthetic {{/unless}}{{!!
30+
}}{{this}}{{!!
31+
}}{{/resolveName}}val value: Int) {
2832
{{joinPartial uniqueEnumerators "kotlin/KotlinEnumerator" ",
2933
"}}{{#if uniqueEnumerators}};{{/if}}{{#if aliasEnumerators}}
3034

gluecodium/src/main/resources/templates/kotlin/KotlinEnumerator.mustache

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
{{#if comment}}
2222
{{prefixPartial "kotlin/KotlinDocComment" " "}}{{/if}}{{!!
2323
}}{{prefixPartial "kotlin/KotlinAttributes" " "}}{{!!
24-
}}{{#if isAlias}} @JvmField {{resolveName "visibility"}}val {{resolveName}}{{!!
24+
}}{{#if isAlias}} @JvmField {{!!
25+
}}{{#resolveName "visibility"}}{{!!
26+
}}{{#unless this.isEmpty}}@JvmSynthetic {{/unless}}{{!!
27+
}}{{this}}{{!!
28+
}}{{/resolveName}}val {{resolveName}}{{!!
2529
}} = {{resolveName value}}{{/if}}{{!!
2630
}}{{#unless isAlias}} {{resolveName}}({{resolveName value}}){{/unless}}

gluecodium/src/test/resources/smoke/annotations/output/android-kotlin/com/example/smoke/OuterInternalEnum.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ package com.example.smoke
1111
import com.example.MySmokeTestsInternalApi
1212

1313
@MySmokeTestsInternalApi
14-
internal enum class OuterInternalEnum(@JvmField internal val value: Int) {
14+
internal enum class OuterInternalEnum(@JvmField @JvmSynthetic internal val value: Int) {
1515
FIRST(1),
1616
SECOND(2);
1717
}

gluecodium/src/test/resources/smoke/errors/output/android-kotlin/com/example/smoke/SomeInternalEnum.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@
55

66
@file:JvmName("SomeInternalEnumExtensions")
77

8+
89
package com.example.smoke
910

1011

11-
internal enum class SomeInternalEnum(@JvmField internal val value: Int) {
12+
internal enum class SomeInternalEnum(@JvmField @JvmSynthetic internal val value: Int) {
1213
ONE(1),
1314
TWO(2),
1415
THREE(3);
1516

1617
companion object {
17-
@JvmField internal val SINGLE = SomeInternalEnum.ONE
18+
@JvmField @JvmSynthetic internal val SINGLE = SomeInternalEnum.ONE
1819
}
1920

2021
}

gluecodium/src/test/resources/smoke/visibility_attribute/output/android-kotlin/com/example/smoke/PublicClass.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55

66
@file:JvmName("PublicClassExtensions")
77

8+
89
package com.example.smoke
910

1011
import com.example.NativeBase
1112

1213
class PublicClass : NativeBase {
1314

14-
internal enum class InternalEnum(@JvmField internal val value: Int) {
15+
internal enum class InternalEnum(@JvmField @JvmSynthetic internal val value: Int) {
1516
FOO(0),
1617
BAR(1);
1718
}

0 commit comments

Comments
 (0)