fix: change logic of calculation fqName for export model.

This commit is contained in:
Artem Kobzar
2022-04-28 15:54:50 +00:00
committed by Space
parent 58885a1b07
commit 025a21761b
6 changed files with 77 additions and 18 deletions
@@ -504,8 +504,10 @@ class ExportModelGenerator(
classifier is IrClassSymbol -> {
val klass = classifier.owner
val isImplicitlyExported = !klass.isExported(context) && !klass.isExternal
val name = klass.getExportableName()
val isExported = klass.isExported(context)
val isImplicitlyExported = !isExported && !klass.isExternal
val isNonExportedExternal = klass.isExternal && !isExported
val name = klass.getFqNameWithJsNameWhenAvailable(!isNonExportedExternal && generateNamespacesForPackages).asString()
when (klass.kind) {
ClassKind.ANNOTATION_CLASS,
@@ -531,19 +533,6 @@ class ExportModelGenerator(
return exportedType.withNullability(isMarkedNullable)
}
private fun IrClass.getExportableName(): String {
val qualifier = (parent as? IrFile)?.getJsQualifier()
val supQualifier = (parent as? IrClass)?.getExportableName()
val name = getJsNameOrKotlinName()
return when {
qualifier != null -> "$qualifier.$name"
isExternal && !isExported(context) -> "${supQualifier?.plus(".") ?: ""}$name"
generateNamespacesForPackages -> fqNameWhenAvailable!!.asString()
else -> name.asString()
}
}
private fun IrDeclarationWithName.getExportedIdentifier(): String =
with(getJsNameOrKotlinName()) {
if (isSpecial)
@@ -9,12 +9,11 @@ import org.jetbrains.kotlin.descriptors.isClass
import org.jetbrains.kotlin.descriptors.isInterface
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.export.isExported
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithVisibility
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrReturn
import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
import org.jetbrains.kotlin.ir.util.parentClassOrNull
import org.jetbrains.kotlin.name.FqName
fun IrDeclaration.isExportedMember(context: JsIrBackendContext) =
(this is IrDeclarationWithVisibility && visibility.isPublicAPI) &&
@@ -29,3 +28,16 @@ fun IrDeclaration?.isExportedInterface(context: JsIrBackendContext) =
fun IrReturn.isTheLastReturnStatementIn(target: IrReturnableBlockSymbol): Boolean {
return target.owner.statements.lastOrNull() === this
}
fun IrDeclarationWithName.getFqNameWithJsNameWhenAvailable(shouldIncludePackage: Boolean): FqName {
val name = getJsNameOrKotlinName()
return when (val parent = parent) {
is IrDeclarationWithName -> parent.getFqNameWithJsNameWhenAvailable(shouldIncludePackage).child(name)
is IrPackageFragment -> getKotlinOrJsQualifier(parent, shouldIncludePackage)?.child(name) ?: FqName(name.identifier)
else -> FqName(name.identifier)
}
}
private fun getKotlinOrJsQualifier(parent: IrPackageFragment, shouldIncludePackage: Boolean): FqName? {
return (parent as? IrFile)?.getJsQualifier()?.let { FqName(it) } ?: parent.fqName.takeIf { shouldIncludePackage }
}