Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions dokka-subprojects/core/api/dokka-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -1590,6 +1590,10 @@ public final class org/jetbrains/dokka/model/ExtraModifiers$JavaOnlyModifiers$Vo
public static final field INSTANCE Lorg/jetbrains/dokka/model/ExtraModifiers$JavaOnlyModifiers$Volatile;
}

public final class org/jetbrains/dokka/model/ExtraModifiers$JavaOnlyModifiers$Default : org/jetbrains/dokka/model/ExtraModifiers$JavaOnlyModifiers {
public static final field INSTANCE Lorg/jetbrains/dokka/model/ExtraModifiers$JavaOnlyModifiers$Default;
}

public abstract class org/jetbrains/dokka/model/ExtraModifiers$KotlinOnlyModifiers : org/jetbrains/dokka/model/ExtraModifiers {
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public sealed class ExtraModifiers(public val name: String) {
public object Transient : JavaOnlyModifiers("transient")
public object Volatile : JavaOnlyModifiers("volatile")
public object Transitive : JavaOnlyModifiers("transitive")
public object Default : JavaOnlyModifiers("default")
}

public companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public class KotlinToJavaConverter(
.flatMap { it.javaAccessors(relocateToClass = syntheticClassName.name) } +
nodes
.filterIsInstance<DFunction>()
.flatMap { it.asJava(syntheticClassName.name, true) })
.flatMap { it.asJava(syntheticClassName.name, isTopLevel = true) })
.filterNot { it.hasJvmSynthetic() },
classlikes = emptyList(),
sources = emptyMap(),
Expand Down Expand Up @@ -201,15 +201,21 @@ public class KotlinToJavaConverter(
containingClassName: String,
newName: String,
parameters: List<DParameter>,
isTopLevel: Boolean = false
isTopLevel: Boolean = false,
isInterface: Boolean = false,
): DFunction {
val isAbstract = modifier.values.all { it is KotlinModifier.Abstract }
return copy(
dri = dri.copy(classNames = containingClassName, callable = dri.callable?.copy(name = newName)),
name = newName,
type = type.asJava(),
modifier = if (modifier.all { (_, v) -> v is KotlinModifier.Final } && isConstructor)
modifier = if (modifier.all { (_, v) -> v is KotlinModifier.Final } && isConstructor) {
sourceSets.associateWith { JavaModifier.Empty }
} else if (isAbstract && isInterface) {
sourceSets.associateWith { JavaModifier.Empty }
else sourceSets.associateWith { modifier.values.first() },
} else {
sourceSets.associateWith { modifier.values.first() }
},
parameters = listOfNotNull(receiver?.asJava()) + parameters.map { it.asJava() },
visibility = visibility.map { (sourceSet, visibility) -> Pair(sourceSet, visibility.asJava()) }.toMap(),
receiver = null,
Expand All @@ -219,6 +225,12 @@ public class KotlinToJavaConverter(
setOf(ExtraModifiers.JavaOnlyModifiers.Static)
}
)
} else if (isInterface && !isAbstract) {
extra + extra.mergeAdditionalModifiers(
sourceSets.associateWith {
setOf(ExtraModifiers.JavaOnlyModifiers.Default)
}
)
} else {
extra
}
Expand All @@ -228,7 +240,8 @@ public class KotlinToJavaConverter(
private fun DFunction.withJvmOverloads(
containingClassName: String,
newName: String,
isTopLevel: Boolean = false
isTopLevel: Boolean = false,
isInterface: Boolean = false
): List<DFunction>? {
val (paramsWithDefaults, paramsWithoutDefaults) = parameters
.withIndex()
Expand All @@ -242,21 +255,22 @@ public class KotlinToJavaConverter(
params
.sortedBy(IndexedValue<DParameter>::index)
.map { it.value },
isTopLevel
isTopLevel,
isInterface
)
}
.reversed()
.takeIf { it.isNotEmpty() }
}

internal fun DFunction.asJava(containingClassName: String, isTopLevel: Boolean = false): List<DFunction> {
internal fun DFunction.asJava(containingClassName: String, isTopLevel: Boolean = false, isInterface: Boolean = false): List<DFunction> {
val newName = when {
isConstructor -> containingClassName
else -> name
}
val baseFunction = asJava(containingClassName, newName, parameters, isTopLevel)
val baseFunction = asJava(containingClassName, newName, parameters, isTopLevel, isInterface)
return if (hasJvmOverloads()) {
withJvmOverloads(containingClassName, newName, isTopLevel) ?: listOf(baseFunction)
withJvmOverloads(containingClassName, newName, isTopLevel, isInterface) ?: listOf(baseFunction)
} else {
listOf(baseFunction)
}
Expand Down Expand Up @@ -440,7 +454,7 @@ public class KotlinToJavaConverter(
)
.filterNotNull()
.filterNot { it.hasJvmSynthetic() }
.flatMap { it.asJava(dri.classNames ?: name) },
.flatMap { it.asJava(dri.classNames ?: name, isInterface = true) },
properties = emptyList(),
classlikes = classlikes.map { it.asJava() }, // TODO: public static final class DefaultImpls with impls for methods
generics = generics.map { it.asJava() },
Expand Down