From ac403a466e3fe87e8140aa4345018d9f3c314ab8 Mon Sep 17 00:00:00 2001 From: Artem Olkov Date: Thu, 29 Feb 2024 12:04:23 +0000 Subject: [PATCH] add support for classes with packages #KT-65909 fixed Merge-request: KT-MR-14623 Merged-by: Artem Olkov --- .../sir/passes/SirInflatePackagesPass.kt | 29 +++++++++++++------ .../sir/passes/builder/SirFromPsiBuilder.kt | 1 - .../classes/golden_result/result.swift | 13 +++++++++ .../input_root/class_with_deeper_package.kt | 7 +++++ .../classes/input_root/class_with_package.kt | 7 +++++ .../testData/classes/input_root/classes.kt | 2 +- .../input_root/should_be_ignored_packaged.kt | 3 -- 7 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 native/swift/swift-export-standalone/testData/classes/input_root/class_with_deeper_package.kt create mode 100644 native/swift/swift-export-standalone/testData/classes/input_root/class_with_package.kt delete mode 100644 native/swift/swift-export-standalone/testData/classes/input_root/should_be_ignored_packaged.kt diff --git a/native/swift/sir-passes/src/org/jetbrains/sir/passes/SirInflatePackagesPass.kt b/native/swift/sir-passes/src/org/jetbrains/sir/passes/SirInflatePackagesPass.kt index e7789429f5d..218780714e2 100644 --- a/native/swift/sir-passes/src/org/jetbrains/sir/passes/SirInflatePackagesPass.kt +++ b/native/swift/sir-passes/src/org/jetbrains/sir/passes/SirInflatePackagesPass.kt @@ -5,7 +5,9 @@ package org.jetbrains.sir.passes +import org.jetbrains.kotlin.analysis.api.calls.KtCall import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.sir.* import org.jetbrains.kotlin.sir.builder.buildEnum import org.jetbrains.kotlin.sir.builder.buildModule @@ -57,14 +59,7 @@ public class SirInflatePackagesPass : SirModulePass { for (declaration in module.declarations) { val origin = declaration.origin as? KotlinSource if (origin != null) { - // FIXME: for now we assume everything before the last dot is a package name. - // This should change as we add type declarations into the mix - val path = (origin.symbol as? KtCallableSymbol) - ?.callableIdIfNonLocal?.packageName - ?.pathSegments() - ?.map { it.toString() } - ?: emptyList() - data.root.getOrCreate(path).elements.add(declaration) + data.root.getOrCreate(origin.getPackagePath()).elements.add(declaration) continue } declarations += declaration @@ -89,4 +84,20 @@ public class SirInflatePackagesPass : SirModulePass { private fun SirDeclarationContainer.fixParents() = declarations .onEach { it.parent = this } .filterIsInstance() - .forEach(SirDeclarationContainer::fixParents) \ No newline at end of file + .forEach(SirDeclarationContainer::fixParents) + +private fun KotlinSource.getPackagePath(): List { + val fqName = when (symbol) { + is KtCallableSymbol -> { + symbol.callableIdIfNonLocal?.packageName + } + is KtClassOrObjectSymbol -> { + symbol.classIdIfNonLocal?.packageFqName + } + else -> + TODO("encountered unknown origin: $symbol. This exception should be reworked during KT-65980") + } + return fqName?.pathSegments() + ?.map { it.toString() } + ?: TODO("encountered empty FqName on source: ${this}. This exception should be reworked during KT-65980") +} diff --git a/native/swift/sir-passes/src/org/jetbrains/sir/passes/builder/SirFromPsiBuilder.kt b/native/swift/sir-passes/src/org/jetbrains/sir/passes/builder/SirFromPsiBuilder.kt index 26df7b4f70f..de430d1e664 100644 --- a/native/swift/sir-passes/src/org/jetbrains/sir/passes/builder/SirFromPsiBuilder.kt +++ b/native/swift/sir-passes/src/org/jetbrains/sir/passes/builder/SirFromPsiBuilder.kt @@ -204,7 +204,6 @@ context(KtAnalysisSession) private fun KtNamedClassOrObjectSymbol.isConsumableBySirBuilder(): Boolean = classKind == KtClassKind.CLASS && (superTypes.count() == 1 && superTypes.first().isAny) // Every class has Any as a superclass - && classIdIfNonLocal?.packageFqName?.isRoot != false && !isData && !isInline && modality == Modality.FINAL diff --git a/native/swift/swift-export-standalone/testData/classes/golden_result/result.swift b/native/swift/swift-export-standalone/testData/classes/golden_result/result.swift index 8e4b6d25f6e..76bfad78ec8 100644 --- a/native/swift/swift-export-standalone/testData/classes/golden_result/result.swift +++ b/native/swift/swift-export-standalone/testData/classes/golden_result/result.swift @@ -1,5 +1,18 @@ import KotlinBridges import KotlinRuntime +public enum namespace { + public enum deeper { + public class NAMESPACED_CLASS { + } + public class Foo { + } + } + public class NAMESPACED_CLASS { + } + public class Foo { + } +} + public class Foo { } diff --git a/native/swift/swift-export-standalone/testData/classes/input_root/class_with_deeper_package.kt b/native/swift/swift-export-standalone/testData/classes/input_root/class_with_deeper_package.kt new file mode 100644 index 00000000000..364e71ff508 --- /dev/null +++ b/native/swift/swift-export-standalone/testData/classes/input_root/class_with_deeper_package.kt @@ -0,0 +1,7 @@ +package namespace.deeper + +class NAMESPACED_CLASS + +class Foo { + class INSIDE_CLASS // this should be ignored currently +} diff --git a/native/swift/swift-export-standalone/testData/classes/input_root/class_with_package.kt b/native/swift/swift-export-standalone/testData/classes/input_root/class_with_package.kt new file mode 100644 index 00000000000..c771d463cce --- /dev/null +++ b/native/swift/swift-export-standalone/testData/classes/input_root/class_with_package.kt @@ -0,0 +1,7 @@ +package namespace + +class NAMESPACED_CLASS + +class Foo { + class INSIDE_CLASS // this should be ignored currently +} diff --git a/native/swift/swift-export-standalone/testData/classes/input_root/classes.kt b/native/swift/swift-export-standalone/testData/classes/input_root/classes.kt index ee51ea21219..5af7d1aae51 100644 --- a/native/swift/swift-export-standalone/testData/classes/input_root/classes.kt +++ b/native/swift/swift-export-standalone/testData/classes/input_root/classes.kt @@ -1,4 +1,4 @@ class Foo { class INSIDE_CLASS // this should be ignored currently -} \ No newline at end of file +} diff --git a/native/swift/swift-export-standalone/testData/classes/input_root/should_be_ignored_packaged.kt b/native/swift/swift-export-standalone/testData/classes/input_root/should_be_ignored_packaged.kt deleted file mode 100644 index f94b8a0ac08..00000000000 --- a/native/swift/swift-export-standalone/testData/classes/input_root/should_be_ignored_packaged.kt +++ /dev/null @@ -1,3 +0,0 @@ -package namespace - -class NAMESPACED_CLASS