[ObjCExport] Implement initial processing queue (stable order, dependencies, forward declarations)

This commit will introduce the first processing queue
which will take care of properly ordering the 'to translate' symbols
as well as taking care of 'dependency' symbols (aka symbols
mentioned in signatures or as supertypes).

- There are several changes like properly translating
types as ObjCProtocolType instead of ObjCClassType (if origin was an interface)
- Type translation of generics defined on interfaces will also emit id type.
- Add initial nested classes collection to the queue
- Add extension function test, add tickets references

^KT-65237 Verification Pending
^KT-65329 Verification Pending
This commit is contained in:
eugene.levenetc
2024-01-26 12:46:39 +01:00
committed by Space Team
parent 32da1b70f5
commit 797284dada
40 changed files with 1213 additions and 117 deletions
@@ -10,4 +10,5 @@ import java.io.File
val testDataDir = File("native/objcexport-header-generator/testData")
val headersTestDataDir = testDataDir.resolve("headers")
val baseDeclarationsDir = testDataDir.resolve("baseDeclarations")
val forwardDeclarationsDir = testDataDir.resolve("forwardDeclarations")
val forwardDeclarationsDir = testDataDir.resolve("forwardDeclarations")
val dependenciesDir = testDataDir.resolve("dependencies")
@@ -0,0 +1,59 @@
/*
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.backend.konan.tests
import org.jetbrains.kotlin.backend.konan.testUtils.HeaderGenerator
import org.jetbrains.kotlin.backend.konan.testUtils.TodoAnalysisApi
import org.jetbrains.kotlin.backend.konan.testUtils.dependenciesDir
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.junit.jupiter.api.Test
import java.io.File
import kotlin.test.fail
/**
* Currently analysis api doesn't fails until full support of stable order and other parts
*
* Test intended to verify how dependencies are translated, which included
* - stable orders
* - stubs orders
* - depth of traversing (some types must be skipped
*/
class ObjCDependenciesTypesTest(
private val generator: HeaderGenerator,
) {
/**
* - Wrong translation of constructors KT-65365
* - Bad parsing of versions (SinceKotlin Annotation)
* - Missing implementation of mangling
*/
@Test
@TodoAnalysisApi
fun `test - stringBuilder`() {
doTest(dependenciesDir.resolve("stringBuilder"))
}
@Test
fun `test - iterator`() {
doTest(dependenciesDir.resolve("iterator"))
}
/**
* - Wrong translation of constructors KT-65365
* - Exposing unwanted 'clone' method KT-65629
*/
@Test
@TodoAnalysisApi
fun `test - array`() {
doTest(dependenciesDir.resolve("array"))
}
private fun doTest(root: File) {
if (!root.isDirectory) fail("Expected ${root.absolutePath} to be directory")
val generatedHeaders = generator.generateHeaders(root, HeaderGenerator.Configuration()).toString()
KotlinTestUtils.assertEqualsToFile(root.resolve("!${root.nameWithoutExtension}.h"), generatedHeaders)
}
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.backend.konan.tests
import org.jetbrains.kotlin.backend.konan.testUtils.HeaderGenerator
import org.jetbrains.kotlin.backend.konan.testUtils.TodoAnalysisApi
import org.jetbrains.kotlin.backend.konan.testUtils.forwardDeclarationsDir
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.junit.jupiter.api.Test
@@ -18,25 +17,21 @@ class ObjCExportForwardDeclarationsTest(
) {
@Test
@TodoAnalysisApi
fun `test - function returning interface`() {
doTest(forwardDeclarationsDir.resolve("functionReturningInterface"))
}
@Test
@TodoAnalysisApi
fun `test - function returning class`() {
doTest(forwardDeclarationsDir.resolve("functionReturningClass"))
}
@Test
@TodoAnalysisApi
fun `test - property returning interface`() {
doTest(forwardDeclarationsDir.resolve("propertyReturningInterface"))
}
@Test
@TodoAnalysisApi
fun `test - property returning class`() {
doTest(forwardDeclarationsDir.resolve("propertyReturningClass"))
}
@@ -70,6 +70,9 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) {
doTest(headersTestDataDir.resolve("sameClassNameInDifferentPackage"))
}
/**
* Naming of nested classes: KT-65633
*/
@Test
@TodoAnalysisApi
fun `test - nestedClass`() {
@@ -83,7 +86,6 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) {
}
@Test
@TodoAnalysisApi // Early translate of forward declarations
fun `test - classImplementingInterface`() {
doTest(headersTestDataDir.resolve("classImplementingInterface"))
}
@@ -178,7 +180,6 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) {
}
@Test
@TodoAnalysisApi // Early translate of forward declarations
fun `test - classWithUnresolvedSuperTypeGenerics`() {
doTest(headersTestDataDir.resolve("classWithUnresolvedSuperTypeGenerics"))
}
@@ -198,6 +199,40 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) {
doTest(headersTestDataDir.resolve("manyClassesAndInterfaces"))
}
@Test
fun `test - classReferencingOtherClassAsReturnType`() {
doTest(headersTestDataDir.resolve("classReferencingOtherClassAsReturnType"))
}
/**
* - IntIterator has unwanted 'hasNext' exposed
* - IntIterator's next method returns int32_t instead of expected Int *
*/
@Test
@TodoAnalysisApi
fun `test - classReferencingDependencyClassAsReturnType`() {
doTest(headersTestDataDir.resolve("classReferencingDependencyClassAsReturnType"))
}
@Test
fun `test - interfaceReferencingOtherInterfaceAsReturnType`() {
doTest(headersTestDataDir.resolve("interfaceReferencingOtherInterfaceAsReturnType"))
}
@Test
fun `test - interfaceImplementingInterfaceOrder`() {
doTest(headersTestDataDir.resolve("interfaceImplementingInterfaceOrder"))
}
/**
* Extension functions aren't supported KT-65630
*/
@Test
@TodoAnalysisApi
fun `test - extensionFunctions`() {
doTest(headersTestDataDir.resolve("extensionFunctions"))
}
private fun doTest(root: File, configuration: Configuration = Configuration()) {
if (!root.isDirectory) fail("Expected ${root.absolutePath} to be directory")
val generatedHeaders = generator.generateHeaders(root, configuration).toString()