diff options
Diffstat (limited to 'plugins/kotlin-as-java/src')
27 files changed, 0 insertions, 3224 deletions
diff --git a/plugins/kotlin-as-java/src/main/kotlin/CollectionExtensions.kt b/plugins/kotlin-as-java/src/main/kotlin/CollectionExtensions.kt deleted file mode 100644 index 3eab0aeb..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/CollectionExtensions.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava - -// TODO [beresnev] remove this copy-paste and use the same method from stdlib instead after updating to 1.5 -internal inline fun <T, R : Any> Iterable<T>.firstNotNullOfOrNull(transform: (T) -> R?): R? { - for (element in this) { - val result = transform(element) - if (result != null) { - return result - } - } - return null -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt b/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt deleted file mode 100644 index 36da34dc..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava - -import org.jetbrains.dokka.CoreExtensions -import org.jetbrains.dokka.base.DokkaBase -import org.jetbrains.dokka.base.signatures.SignatureProvider -import org.jetbrains.dokka.kotlinAsJava.signatures.JavaSignatureProvider -import org.jetbrains.dokka.kotlinAsJava.transformers.JvmNameDocumentableTransformer -import org.jetbrains.dokka.kotlinAsJava.transformers.KotlinAsJavaDocumentableTransformer -import org.jetbrains.dokka.kotlinAsJava.translators.KotlinAsJavaDocumentableToPageTranslator -import org.jetbrains.dokka.plugability.DokkaPlugin -import org.jetbrains.dokka.plugability.DokkaPluginApiPreview -import org.jetbrains.dokka.plugability.Extension -import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement -import org.jetbrains.dokka.renderers.PostAction -import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator -import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer - -public class KotlinAsJavaPlugin : DokkaPlugin() { - public val kotlinAsJavaDocumentableTransformer: Extension<DocumentableTransformer, *, *> by extending { - CoreExtensions.documentableTransformer with KotlinAsJavaDocumentableTransformer() - } - - public val jvmNameTransformer: Extension<DocumentableTransformer, *, *> by extending { - CoreExtensions.documentableTransformer with JvmNameDocumentableTransformer() order { - after(kotlinAsJavaDocumentableTransformer) - } - } - - public val javaSignatureProvider: Extension<SignatureProvider, *, *> by extending { - with(plugin<DokkaBase>()) { - signatureProvider providing ::JavaSignatureProvider override kotlinSignatureProvider - } - } - - public val kotlinAsJavaDocumentableToPageTranslator: Extension<DocumentableToPageTranslator, *, *> by extending { - CoreExtensions.documentableToPageTranslator providing ::KotlinAsJavaDocumentableToPageTranslator override - plugin<DokkaBase>().documentableToPageTranslator - } - - internal val alphaVersionNotifier by extending { - CoreExtensions.postActions providing { ctx -> - PostAction { - ctx.logger.info("KotlinAsJava plugin is in Alpha version, use at your own risk, expect bugs and migration issues") - } - } - } - - @OptIn(DokkaPluginApiPreview::class) - override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement = - PluginApiPreviewAcknowledgement -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt deleted file mode 100644 index 260fc25d..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.converters - -import org.jetbrains.dokka.links.Callable -import org.jetbrains.dokka.model.* -import org.jetbrains.dokka.model.properties.PropertyContainer - -private const val DEFAULT_COMPANION_NAME = "Companion" - -internal fun DObject?.staticFunctionsForJava(): List<DFunction> { - if (this == null) return emptyList() - return functions.filter { it.isJvmStatic } -} - -/** - * @return properties that will be visible as static for java. - * See [Static fields](https://kotlinlang.org/docs/java-to-kotlin-interop.html#static-fields) - */ -internal fun DObject?.staticPropertiesForJava(): List<DProperty> { - if (this == null) return emptyList() - return properties.filter { it.isJvmField || it.isConst || it.isLateInit } -} - -internal fun DObject.companionInstancePropertyForJava(): DProperty? { - if (hasNothingToRender()) return null // do not show if companion not rendered - - return DProperty( - name = name ?: DEFAULT_COMPANION_NAME, - modifier = sourceSets.associateWith { JavaModifier.Final }, - dri = dri.copy(callable = Callable(name ?: DEFAULT_COMPANION_NAME, null, emptyList())), - documentation = emptyMap(), - sources = emptyMap(), - visibility = sourceSets.associateWith { - JavaVisibility.Public - }, - type = GenericTypeConstructor(dri, emptyList()), - setter = null, - getter = null, - sourceSets = sourceSets, - receiver = null, - generics = emptyList(), - expectPresentInSet = expectPresentInSet, - isExpectActual = false, - extra = PropertyContainer.withAll(sourceSets.map { - mapOf(it to setOf(ExtraModifiers.JavaOnlyModifiers.Static)).toAdditionalModifiers() - }) - ) -} - -/** - * Hide companion object if there isn't members of parents. - * Properties and functions that are moved to outer class are not counted as members. - */ -internal fun DObject.hasNothingToRender(): Boolean { - val nonStaticPropsCount = properties.size - staticPropertiesForJava().size - val nonStaticFunctionsCount = functions.size - staticFunctionsForJava().size - val classLikesCount = classlikes.size - val superTypesCount = supertypes.values.firstOrNull()?.size ?: 0 - - return nonStaticFunctionsCount + nonStaticPropsCount + - classLikesCount + superTypesCount == 0 -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt deleted file mode 100644 index a8b3a86c..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.converters - -import org.jetbrains.dokka.kotlinAsJava.* -import org.jetbrains.dokka.kotlinAsJava.transformers.JvmNameProvider -import org.jetbrains.dokka.kotlinAsJava.transformers.withCallableName -import org.jetbrains.dokka.links.Callable -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.links.withClass -import org.jetbrains.dokka.model.* -import org.jetbrains.dokka.model.properties.PropertyContainer -import org.jetbrains.dokka.plugability.DokkaContext -import org.jetbrains.dokka.plugability.plugin -import org.jetbrains.dokka.plugability.querySingle -import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin - -public val jvmNameProvider: JvmNameProvider = JvmNameProvider() -internal const val OBJECT_INSTANCE_NAME = "INSTANCE" - -internal val DProperty.isConst: Boolean - get() = hasModifier(ExtraModifiers.KotlinOnlyModifiers.Const) - -internal val DProperty.isLateInit: Boolean - get() = hasModifier(ExtraModifiers.KotlinOnlyModifiers.LateInit) - -internal val DProperty.isJvmField: Boolean - get() = jvmField() != null - -internal val DFunction.isJvmStatic: Boolean - get() = jvmStatic() != null - -private fun DProperty.hasModifier(modifier: ExtraModifiers.KotlinOnlyModifiers): Boolean = - extra[AdditionalModifiers] - ?.content - ?.any { (_, modifiers) -> modifier in modifiers } == true - -public class KotlinToJavaConverter( - private val context: DokkaContext -) { - private val kotlinToJavaMapper by lazy { - context.plugin<InternalKotlinAnalysisPlugin>().querySingle { kotlinToJavaService } - } - - internal fun DPackage.asJava(): DPackage { - val syntheticClasses = - (properties.map { jvmNameProvider.nameForSyntheticClass(it) to it } - + functions.map { jvmNameProvider.nameForSyntheticClass(it) to it }) - .groupBy({ it.first }) { it.second } - .map { (syntheticClassName, nodes) -> - DClass( - dri = dri.withClass(syntheticClassName.name), - name = syntheticClassName.name, - properties = nodes - .filterIsInstance<DProperty>() - .filterNot { it.hasJvmSynthetic() } - .map { it.asJava(true) }, - constructors = emptyList(), - functions = ( - nodes - .filterIsInstance<DProperty>() - .filterNot { it.isConst || it.isJvmField || it.hasJvmSynthetic() } - .flatMap { it.javaAccessors(relocateToClass = syntheticClassName.name) } + - nodes - .filterIsInstance<DFunction>() - .flatMap { it.asJava(syntheticClassName.name, true) }) - .filterNot { it.hasJvmSynthetic() }, - classlikes = emptyList(), - sources = emptyMap(), - expectPresentInSet = null, - visibility = sourceSets.associateWith { - JavaVisibility.Public - }, - companion = null, - generics = emptyList(), - supertypes = emptyMap(), - documentation = emptyMap(), - modifier = sourceSets.associateWith { JavaModifier.Final }, - sourceSets = sourceSets, - isExpectActual = false, - extra = PropertyContainer.empty() - ) - } - - return copy( - functions = emptyList(), - properties = emptyList(), - classlikes = classlikes.map { it.asJava() } + syntheticClasses, - typealiases = emptyList() - ) - } - - internal fun DProperty.asJava( - isTopLevel: Boolean = false, - relocateToClass: String? = null, - isFromObjectOrCompanion: Boolean = false - ) = - copy( - dri = if (relocateToClass.isNullOrBlank()) { - dri - } else { - dri.withClass(relocateToClass) - }, - modifier = javaModifierFromSetter(), - visibility = visibility.mapValues { - if (isConst || isJvmField || (getter == null && setter == null) || (isFromObjectOrCompanion && isLateInit)) { - it.value.asJava() - } else { - it.value.propertyVisibilityAsJava() - } - }, - type = type.asJava(), // TODO: check - setter = null, - getter = null, // Removing getters and setters as they will be available as functions - extra = if (isTopLevel || isConst || (isFromObjectOrCompanion && isJvmField) || (isFromObjectOrCompanion && isLateInit)) - extra + extra.mergeAdditionalModifiers( - sourceSets.associateWith { - setOf(ExtraModifiers.JavaOnlyModifiers.Static) - } - ) - else extra - ) - - internal fun Visibility.asJava() = - when (this) { - is JavaVisibility -> this - is KotlinVisibility.Public, KotlinVisibility.Internal -> JavaVisibility.Public - is KotlinVisibility.Private -> JavaVisibility.Private - is KotlinVisibility.Protected -> JavaVisibility.Protected - } - - internal fun DProperty.javaModifierFromSetter() = - modifier.mapValues { - when { - it.value is JavaModifier -> it.value - setter == null -> JavaModifier.Final - else -> JavaModifier.Empty - } - } - - internal fun DProperty.javaAccessors( - isTopLevel: Boolean = false, - relocateToClass: String? = null - ): List<DFunction> = - listOfNotNull( - getter?.let { getter -> - val name = "get" + name.capitalize() - getter.copy( - dri = if (relocateToClass.isNullOrBlank()) { - getter.dri - } else { - getter.dri.withClass(relocateToClass) - }.withCallableName(name), - name = name, - modifier = javaModifierFromSetter(), - visibility = visibility.mapValues { JavaVisibility.Public }, - type = getter.type.asJava(), - extra = if (isTopLevel) getter.extra + - getter.extra.mergeAdditionalModifiers( - sourceSets.associateWith { - setOf(ExtraModifiers.JavaOnlyModifiers.Static) - } - ) - else getter.extra - ) - }, - setter?.let { setter -> - val name = "set" + name.capitalize() - val baseDRI = (if (relocateToClass.isNullOrBlank()) { - setter.dri - } else { - setter.dri.withClass(relocateToClass) - }).withCallableName(name) - setter.copy( - dri = baseDRI, - name = name, - parameters = setter.parameters.map { - it.copy( - dri = baseDRI.copy( - target = it.dri.target, - extra = it.dri.extra - ), type = it.type.asJava() - ) - }, - modifier = javaModifierFromSetter(), - visibility = visibility.mapValues { JavaVisibility.Public }, - type = Void, - extra = if (isTopLevel) setter.extra + setter.extra.mergeAdditionalModifiers( - sourceSets.associateWith { - setOf(ExtraModifiers.JavaOnlyModifiers.Static) - } - ) - else setter.extra - ) - } - ) - - private fun DFunction.asJava( - containingClassName: String, - newName: String, - parameters: List<DParameter>, - isTopLevel: Boolean = false - ): DFunction { - 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) - sourceSets.associateWith { JavaModifier.Empty } - 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, - extra = if (isTopLevel || isJvmStatic) { - extra + extra.mergeAdditionalModifiers( - sourceSets.associateWith { - setOf(ExtraModifiers.JavaOnlyModifiers.Static) - } - ) - } else { - extra - } - ) - } - - private fun DFunction.withJvmOverloads( - containingClassName: String, - newName: String, - isTopLevel: Boolean = false - ): List<DFunction>? { - val (paramsWithDefaults, paramsWithoutDefaults) = parameters - .withIndex() - .partition { (_, p) -> p.extra[DefaultValue] != null } - return paramsWithDefaults - .runningFold(paramsWithoutDefaults) { acc, param -> (acc + param) } - .map { params -> - asJava( - containingClassName, - newName, - params - .sortedBy(IndexedValue<DParameter>::index) - .map { it.value }, - isTopLevel - ) - } - .reversed() - .takeIf { it.isNotEmpty() } - } - - internal fun DFunction.asJava(containingClassName: String, isTopLevel: Boolean = false): List<DFunction> { - val newName = when { - isConstructor -> containingClassName - else -> name - } - val baseFunction = asJava(containingClassName, newName, parameters, isTopLevel) - return if (hasJvmOverloads()) { - withJvmOverloads(containingClassName, newName, isTopLevel) ?: listOf(baseFunction) - } else { - listOf(baseFunction) - } - } - - internal fun DClasslike.asJava(): DClasslike = when (this) { - is DClass -> asJava() - is DEnum -> asJava() - is DAnnotation -> asJava() - is DObject -> asJava() - is DInterface -> asJava() - else -> throw IllegalArgumentException("$this shouldn't be here") - } - - internal fun DClass.asJava(): DClass = copy( - constructors = constructors - .filterNot { it.hasJvmSynthetic() } - .flatMap { - it.asJava( - dri.classNames ?: name - ) - }, // name may not always be valid here, however classNames should always be not null - functions = functionsInJava(), - properties = propertiesInJava(), - classlikes = classlikesInJava(), - generics = generics.map { it.asJava() }, - companion = companion?.companionAsJava(), - supertypes = supertypes.mapValues { it.value.map { it.asJava() } }, - modifier = if (modifier.all { (_, v) -> v is KotlinModifier.Empty }) sourceSets.associateWith { JavaModifier.Final } - else sourceSets.associateWith { modifier.values.first() } - ) - - /** - * Companion objects requires some custom logic for rendering as Java. - * They are excluded from usual classlikes rendering and added after. - */ - internal fun DClass.classlikesInJava(): List<DClasslike> { - val classlikes = classlikes - .filter { it.name != companion?.name } - .map { it.asJava() } - - val companionAsJava = companion?.companionAsJava() - return if (companionAsJava != null) classlikes.plus(companionAsJava) else classlikes - } - - - internal fun DClass.functionsInJava(): List<DFunction> = - properties - .filter { !it.isJvmField && !it.hasJvmSynthetic() } - .flatMap { property -> listOfNotNull(property.getter, property.setter) } - .plus(functions) - .plus(companion.staticFunctionsForJava()) - .filterNot { it.hasJvmSynthetic() } - .flatMap { it.asJava(it.dri.classNames ?: it.name) } - - internal fun DClass.propertiesInJava(): List<DProperty> { - val propertiesFromCompanion = companion - .staticPropertiesForJava() - .filterNot { it.hasJvmSynthetic() } - .map { it.asJava(isFromObjectOrCompanion = true) } - val companionInstanceProperty = companion?.companionInstancePropertyForJava() - val ownProperties = properties - .filterNot { it.hasJvmSynthetic() } - .map { it.asJava() } - - return propertiesFromCompanion + ownProperties + listOfNotNull(companionInstanceProperty) - } - - private fun DTypeParameter.asJava(): DTypeParameter = copy( - variantTypeParameter = variantTypeParameter.withDri(dri.possiblyAsJava()), - bounds = bounds.map { it.asJava() } - ) - - private fun Projection.asJava(): Projection = when (this) { - is Star -> Star - is Covariance<*> -> copy(inner.asJava()) - is Contravariance<*> -> copy(inner.asJava()) - is Invariance<*> -> copy(inner.asJava()) - is Bound -> asJava() - } - - private fun Bound.asJava(): Bound = when (this) { - is TypeParameter -> copy(dri.possiblyAsJava()) - is GenericTypeConstructor -> copy( - dri = dri.possiblyAsJava(), - projections = projections.map { it.asJava() } - ) - - is FunctionalTypeConstructor -> copy( - dri = dri.possiblyAsJava(), - projections = projections.map { it.asJava() } - ) - - is TypeAliased -> copy( - typeAlias = typeAlias.asJava(), - inner = inner.asJava() - ) - - is Nullable -> copy(inner.asJava()) - is DefinitelyNonNullable -> copy(inner.asJava()) - is PrimitiveJavaType -> this - is Void -> this - is JavaObject -> this - is Dynamic -> this - is UnresolvedBound -> this - } - - internal fun DEnum.asJava(): DEnum = copy( - constructors = constructors.flatMap { it.asJava(dri.classNames ?: name) }, - functions = functions - .plus( - properties - .filter { !it.isJvmField && !it.hasJvmSynthetic() } - .flatMap { listOf(it.getter, it.setter) } - ) - .filterNotNull() - .filterNot { it.hasJvmSynthetic() } - .flatMap { it.asJava(dri.classNames ?: name) }, - properties = properties - .filterNot { it.hasJvmSynthetic() } - .map { it.asJava() }, - classlikes = classlikes.map { it.asJava() }, - supertypes = supertypes.mapValues { it.value.map { it.asJava() } } -// , entries = entries.map { it.asJava() } - ) - - /** - * Parameters [excludedProps] and [excludedFunctions] used for rendering companion objects - * where some members (that lifted to outer class) are not rendered - */ - internal fun DObject.asJava( - excludedProps: List<DProperty> = emptyList(), - excludedFunctions: List<DFunction> = emptyList() - ): DObject = copy( - functions = functions - .plus( - properties - .filterNot { it in excludedProps } - .filter { !it.isJvmField && !it.isConst && !it.isLateInit && !it.hasJvmSynthetic() } - .flatMap { listOf(it.getter, it.setter) } - ) - .filterNotNull() - .filterNot { it in excludedFunctions } - .filterNot { it.hasJvmSynthetic() } - .flatMap { it.asJava(dri.classNames ?: name.orEmpty()) }, - properties = properties - .filterNot { it.hasJvmSynthetic() } - .filterNot { it in excludedProps } - .map { it.asJava(isFromObjectOrCompanion = true) } + - DProperty( - name = OBJECT_INSTANCE_NAME, - modifier = sourceSets.associateWith { JavaModifier.Final }, - dri = dri.copy(callable = Callable(OBJECT_INSTANCE_NAME, null, emptyList())), - documentation = emptyMap(), - sources = emptyMap(), - visibility = sourceSets.associateWith { - JavaVisibility.Public - }, - type = GenericTypeConstructor(dri, emptyList()), - setter = null, - getter = null, - sourceSets = sourceSets, - receiver = null, - generics = emptyList(), - expectPresentInSet = expectPresentInSet, - isExpectActual = false, - extra = PropertyContainer.withAll(sourceSets.map { - mapOf(it to setOf(ExtraModifiers.JavaOnlyModifiers.Static)).toAdditionalModifiers() - }) - ), - classlikes = classlikes.map { it.asJava() }, - supertypes = supertypes.mapValues { it.value.map { it.asJava() } } - ) - - internal fun DInterface.asJava(): DInterface = copy( - functions = functions - .plus( - properties - .filter { it.jvmField() == null && !it.hasJvmSynthetic() } - .flatMap { listOf(it.getter, it.setter) } - ) - .filterNotNull() - .filterNot { it.hasJvmSynthetic() } - .flatMap { it.asJava(dri.classNames ?: name) }, - properties = emptyList(), - classlikes = classlikes.map { it.asJava() }, // TODO: public static final class DefaultImpls with impls for methods - generics = generics.map { it.asJava() }, - supertypes = supertypes.mapValues { it.value.map { it.asJava() } } - ) - - internal fun DAnnotation.asJava(): DAnnotation = copy( - properties = properties.map { it.asJava() }, - constructors = emptyList(), - classlikes = classlikes.map { it.asJava() } - ) // TODO investigate if annotation class can have methods and properties not from constructor - - internal fun DParameter.asJava(): DParameter = copy( - type = type.asJava(), - name = if (name.isNullOrBlank()) "\$self" else name - ) - - internal fun Visibility.propertyVisibilityAsJava(): Visibility = - if (this is JavaVisibility) this - else JavaVisibility.Private - - private fun TypeConstructor.possiblyAsJava(): TypeConstructor = when (this) { - is GenericTypeConstructor -> copy(dri = this.dri.possiblyAsJava()) - is FunctionalTypeConstructor -> copy(dri = this.dri.possiblyAsJava()) - } - - - internal fun TypeConstructorWithKind.asJava(): TypeConstructorWithKind = - TypeConstructorWithKind( - typeConstructor = typeConstructor.possiblyAsJava(), - kind = kind.asJava() - ) - - internal fun ClassKind.asJava(): ClassKind { - return when (this) { - is JavaClassKindTypes -> this - KotlinClassKindTypes.CLASS -> JavaClassKindTypes.CLASS - KotlinClassKindTypes.INTERFACE -> JavaClassKindTypes.INTERFACE - KotlinClassKindTypes.ENUM_CLASS -> JavaClassKindTypes.ENUM_CLASS - KotlinClassKindTypes.ENUM_ENTRY -> JavaClassKindTypes.ENUM_ENTRY - KotlinClassKindTypes.ANNOTATION_CLASS -> JavaClassKindTypes.ANNOTATION_CLASS - KotlinClassKindTypes.OBJECT -> JavaClassKindTypes.CLASS - else -> throw IllegalStateException("Non exchaustive match while trying to convert $this to Java") - } - } - - private fun <T : Documentable> PropertyContainer<T>.mergeAdditionalModifiers(second: SourceSetDependent<Set<ExtraModifiers>>) = - this[AdditionalModifiers]?.squash(AdditionalModifiers(second)) ?: AdditionalModifiers(second) - - private fun AdditionalModifiers.squash(second: AdditionalModifiers) = - AdditionalModifiers(content + second.content) - - internal fun DObject.companionAsJava(): DObject? { - if (hasNothingToRender()) return null - - return asJava( - excludedProps = staticPropertiesForJava(), - excludedFunctions = staticFunctionsForJava() - ) - } - - private fun DRI.possiblyAsJava(): DRI { - return kotlinToJavaMapper.findAsJava(this) ?: this - } -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmField.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmField.kt deleted file mode 100644 index 3cf9b8fa..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/jvmField.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava - -import org.jetbrains.dokka.model.Annotations -import org.jetbrains.dokka.model.Documentable -import org.jetbrains.dokka.model.properties.WithExtraProperties - -internal fun <T : Documentable> WithExtraProperties<T>.jvmField(): Annotations.Annotation? = - extra[Annotations]?.directAnnotations?.entries?.firstNotNullOfOrNull { (_, annotations) -> annotations.jvmFieldAnnotation() } - -internal fun List<Annotations.Annotation>.jvmFieldAnnotation(): Annotations.Annotation? = - firstOrNull { it.dri.packageName == "kotlin.jvm" && it.dri.classNames == "JvmField" } - diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmName.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmName.kt deleted file mode 100644 index 6561f079..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/jvmName.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava - -import org.jetbrains.dokka.model.Annotations -import org.jetbrains.dokka.model.Documentable -import org.jetbrains.dokka.model.StringValue -import org.jetbrains.dokka.model.isJvmName -import org.jetbrains.dokka.model.properties.WithExtraProperties - -internal fun <T : Documentable> WithExtraProperties<T>.directlyAnnotatedJvmName(): Annotations.Annotation? = - extra[Annotations]?.directAnnotations?.entries?.firstNotNullOfOrNull { (_, annotations)-> annotations.jvmNameAnnotation() } - -internal fun <T : Documentable> WithExtraProperties<T>.fileLevelJvmName(): Annotations.Annotation? = - extra[Annotations]?.fileLevelAnnotations?.entries?.firstNotNullOfOrNull { (_, annotations) -> annotations.jvmNameAnnotation() } - -internal fun List<Annotations.Annotation>.jvmNameAnnotation(): Annotations.Annotation? = - firstOrNull { it.isJvmName() } - -internal fun Annotations.Annotation.jvmNameAsString(): String? = (params["name"] as? StringValue)?.value - diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmOverloads.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmOverloads.kt deleted file mode 100644 index 08fbca07..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/jvmOverloads.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava - -import org.jetbrains.dokka.model.Annotations -import org.jetbrains.dokka.model.Documentable -import org.jetbrains.dokka.model.properties.WithExtraProperties - -internal fun <T : Documentable> WithExtraProperties<T>.hasJvmOverloads(): Boolean { - return extra[Annotations] - ?.directAnnotations - ?.entries - ?.any { (_, annotations) -> - annotations.any { it.dri.packageName == "kotlin.jvm" && it.dri.classNames == "JvmOverloads" } - } == true -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmStatic.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmStatic.kt deleted file mode 100644 index a253dc83..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/jvmStatic.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava - -import org.jetbrains.dokka.model.Annotations -import org.jetbrains.dokka.model.Documentable -import org.jetbrains.dokka.model.properties.WithExtraProperties - -internal fun <T : Documentable> WithExtraProperties<T>.jvmStatic(): Annotations.Annotation? = - extra[Annotations]?.directAnnotations?.entries?.firstNotNullOfOrNull { (_, annotations) -> annotations.jvmStaticAnnotation() } - -internal fun List<Annotations.Annotation>.jvmStaticAnnotation(): Annotations.Annotation? = - firstOrNull { it.dri.packageName == "kotlin.jvm" && it.dri.classNames == "JvmStatic" } - diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmSynthetic.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmSynthetic.kt deleted file mode 100644 index bf2a9ad1..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/jvmSynthetic.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava - -import org.jetbrains.dokka.model.Annotations -import org.jetbrains.dokka.model.properties.WithExtraProperties - -internal fun <T : org.jetbrains.dokka.model.AnnotationTarget> WithExtraProperties<T>.hasJvmSynthetic(): Boolean { - return extra[Annotations] - ?.directAnnotations - ?.entries - ?.any { (_, annotations) -> - annotations.any { it.dri.packageName == "kotlin.jvm" && it.dri.classNames == "JvmSynthetic" } - } == true -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureProvider.kt b/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureProvider.kt deleted file mode 100644 index e4c9d5dd..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureProvider.kt +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.signatures - -import org.jetbrains.dokka.base.DokkaBase -import org.jetbrains.dokka.base.signatures.JvmSignatureUtils -import org.jetbrains.dokka.base.signatures.SignatureProvider -import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter -import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.model.* -import org.jetbrains.dokka.model.properties.WithExtraProperties -import org.jetbrains.dokka.pages.ContentKind -import org.jetbrains.dokka.pages.ContentNode -import org.jetbrains.dokka.pages.TextStyle -import org.jetbrains.dokka.pages.TokenStyle -import org.jetbrains.dokka.plugability.DokkaContext -import org.jetbrains.dokka.plugability.plugin -import org.jetbrains.dokka.plugability.querySingle -import org.jetbrains.dokka.utilities.DokkaLogger -import kotlin.text.Typography.nbsp - -public class JavaSignatureProvider internal constructor( - ctcc: CommentsToContentConverter, - logger: DokkaLogger -) : SignatureProvider, JvmSignatureUtils by JavaSignatureUtils { - - public constructor(context: DokkaContext) : this( - context.plugin<DokkaBase>().querySingle { commentsToContentConverter }, - context.logger - ) - - private val contentBuilder = PageContentBuilder(ctcc, this, logger) - - private val ignoredVisibilities = setOf(JavaVisibility.Default) - - private val ignoredModifiers = - setOf(KotlinModifier.Open, JavaModifier.Empty, KotlinModifier.Empty, KotlinModifier.Sealed) - - override fun signature(documentable: Documentable): List<ContentNode> = when (documentable) { - is DFunction -> signature(documentable) - is DProperty -> signature(documentable) - is DClasslike -> signature(documentable) - is DEnumEntry -> signature(documentable) - is DTypeParameter -> signature(documentable) - else -> throw NotImplementedError( - "Cannot generate signature for ${documentable::class.qualifiedName} ${documentable.name}" - ) - } - - private fun signature(e: DEnumEntry) = - e.sourceSets.map { - contentBuilder.contentFor( - e, - ContentKind.Symbol, - setOf(TextStyle.Monospace), - sourceSets = setOf(it) - ) { - link(e.name, e.dri, styles = mainStyles + e.stylesIfDeprecated(it)) - } - } - - private fun signature(c: DClasslike) = - c.sourceSets.map { sourceSet -> - @Suppress("UNCHECKED_CAST") - val deprecationStyles = (c as? WithExtraProperties<out Documentable>) - ?.stylesIfDeprecated(sourceSet) - ?: emptySet() - - contentBuilder.contentFor( - c, - ContentKind.Symbol, - setOf(TextStyle.Monospace), - sourceSets = setOf(sourceSet) - ) { - annotationsBlock(c) - c.visibility[sourceSet]?.takeIf { it !in ignoredVisibilities }?.name?.plus(" ")?.let { keyword(it) } - - if (c is DClass) { - c.modifier[sourceSet]?.takeIf { it !in ignoredModifiers }?.name?.plus(" ")?.let { keyword(it) } - c.modifiers()[sourceSet]?.toSignatureString()?.let { keyword(it) } - } - - when (c) { - is DClass -> keyword("class ") - is DInterface -> keyword("interface ") - is DEnum -> keyword("enum ") - is DObject -> keyword("class ") - is DAnnotation -> keyword("@interface ") - } - link(c.name!!, c.dri, styles = mainStyles + deprecationStyles) - if (c is WithGenerics) { - list(c.generics, prefix = "<", suffix = ">", - separatorStyles = mainStyles + TokenStyle.Punctuation, - surroundingCharactersStyle = mainStyles + TokenStyle.Operator) { - +buildSignature(it) - } - } - if (c is WithSupertypes) { - c.supertypes.map { (p, dris) -> - val (classes, interfaces) = dris.partition { it.kind == JavaClassKindTypes.CLASS } - list(classes, prefix = " extends ", sourceSets = setOf(p), - separatorStyles = mainStyles + TokenStyle.Punctuation, - surroundingCharactersStyle = mainStyles + TokenStyle.Keyword) { - signatureForProjection(it.typeConstructor) - } - list(interfaces, prefix = " implements ", sourceSets = setOf(p), - separatorStyles = mainStyles + TokenStyle.Punctuation, - surroundingCharactersStyle = mainStyles + TokenStyle.Keyword) { - signatureForProjection(it.typeConstructor) - } - } - } - } - } - - private fun signature(p: DProperty) = - p.sourceSets.map { - contentBuilder.contentFor( - p, - ContentKind.Symbol, - setOf(TextStyle.Monospace, TextStyle.Block), - sourceSets = setOf(it) - ) { - annotationsBlock(p) - p.visibility[it]?.takeIf { it !in ignoredVisibilities }?.name?.let { keyword("$it ") } - p.modifier[it]?.takeIf { it !in ignoredModifiers }?.name?.let { keyword("$it ") } - p.modifiers()[it]?.toSignatureString()?.let { keyword(it) } - signatureForProjection(p.type) - text(nbsp.toString()) - link(p.name, p.dri, styles = mainStyles + p.stylesIfDeprecated(it)) - } - } - - private fun signature(f: DFunction) = - f.sourceSets.map { sourceSet -> - contentBuilder.contentFor( - f, - ContentKind.Symbol, - setOf(TextStyle.Monospace, TextStyle.Block), - sourceSets = setOf(sourceSet) - ) { - annotationsBlock(f) - f.visibility[sourceSet]?.takeIf { it !in ignoredVisibilities }?.name?.let { keyword("$it ") } - f.modifier[sourceSet]?.takeIf { it !in ignoredModifiers }?.name?.plus(" ")?.let { keyword(it) } - f.modifiers()[sourceSet]?.toSignatureString()?.let { keyword(it) } - val returnType = f.type - signatureForProjection(returnType) - text(nbsp.toString()) - link(f.name, f.dri, styles = mainStyles + TokenStyle.Function + f.stylesIfDeprecated(sourceSet)) - val usedGenerics = if (f.isConstructor) f.generics.filter { f uses it } else f.generics - list(usedGenerics, prefix = "<", suffix = ">", - separatorStyles = mainStyles + TokenStyle.Punctuation, - surroundingCharactersStyle = mainStyles + TokenStyle.Operator) { - +buildSignature(it) - } - punctuation("(") - if (f.parameters.isNotEmpty()) { - parametersBlock(f) { - annotationsInline(it) - text(it.modifiers()[sourceSet]?.toSignatureString() ?: "", styles = mainStyles + TokenStyle.Keyword) - signatureForProjection(it.type) - text(nbsp.toString()) - text(it.name!!) - } - } - punctuation(")") - } - } - - private fun signature(t: DTypeParameter) = - t.sourceSets.map { - contentBuilder.contentFor(t, sourceSets = setOf(it)) { - annotationsInline(t) - text(t.name.substringAfterLast("."), styles = mainStyles + t.stylesIfDeprecated(it)) - list( - elements = t.bounds, - prefix = " extends ", - separatorStyles = mainStyles + TokenStyle.Punctuation, - surroundingCharactersStyle = mainStyles + TokenStyle.Keyword - ) { - signatureForProjection(it) - } - } - - } - - private fun PageContentBuilder.DocumentableContentBuilder.signatureForProjection(p: Projection): Unit = when (p) { - is TypeParameter -> { - annotationsInline(p) - link(p.name, p.dri) - } - - is TypeConstructor -> group(styles = emptySet()) { - annotationsInline(p) - link(p.dri.classNames.orEmpty(), p.dri) - list(p.projections, prefix = "<", suffix = ">", - separatorStyles = mainStyles + TokenStyle.Punctuation, - surroundingCharactersStyle = mainStyles + TokenStyle.Operator) { - signatureForProjection(it) - } - } - - is Variance<*> -> group(styles = emptySet()) { - val variance = when(p) { - is Covariance<*> -> "? extends " - is Contravariance<*> -> "? super " - is Invariance<*> -> "" - } - keyword(variance) - signatureForProjection(p.inner) - } - - is Star -> operator("?") - - is Nullable -> signatureForProjection(p.inner) - is DefinitelyNonNullable -> signatureForProjection(p.inner) - - is JavaObject, is Dynamic -> link("Object", DRI("java.lang", "Object")) - is Void -> text("void") - is PrimitiveJavaType -> text(p.name) - is UnresolvedBound -> text(p.name) - is TypeAliased -> signatureForProjection(p.inner) - } -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureUtils.kt b/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureUtils.kt deleted file mode 100644 index 1738d40d..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureUtils.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.signatures - -import org.jetbrains.dokka.DokkaConfiguration -import org.jetbrains.dokka.base.signatures.All -import org.jetbrains.dokka.base.signatures.JvmSignatureUtils -import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.model.* -import org.jetbrains.dokka.model.AnnotationTarget -import org.jetbrains.dokka.model.properties.WithExtraProperties - -public object JavaSignatureUtils : JvmSignatureUtils { - - private val ignoredAnnotations = setOf( - Annotations.Annotation(DRI("kotlin.jvm", "Transient"), emptyMap()), - Annotations.Annotation(DRI("kotlin.jvm", "Volatile"), emptyMap()), - Annotations.Annotation(DRI("kotlin.jvm", "Transitive"), emptyMap()), - Annotations.Annotation(DRI("kotlin.jvm", "Strictfp"), emptyMap()), - Annotations.Annotation(DRI("kotlin.jvm", "JvmStatic"), emptyMap()) - ) - - private val strategy = All - private val listBrackets = Pair('{', '}') - private val classExtension = ".class" - - override fun PageContentBuilder.DocumentableContentBuilder.annotationsBlock(d: AnnotationTarget) { - annotationsBlockWithIgnored(d, ignoredAnnotations, strategy, listBrackets, classExtension) - } - - override fun PageContentBuilder.DocumentableContentBuilder.annotationsInline(d: AnnotationTarget) { - annotationsInlineWithIgnored(d, ignoredAnnotations, strategy, listBrackets, classExtension) - } - - override fun <T : Documentable> WithExtraProperties<T>.modifiers(): Map<DokkaConfiguration.DokkaSourceSet, Set<ExtraModifiers.JavaOnlyModifiers>> { - return extra[AdditionalModifiers]?.content?.entries?.associate { - it.key to it.value.filterIsInstance<ExtraModifiers.JavaOnlyModifiers>().toSet() - } ?: emptyMap() - } - -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformToJava.kt b/plugins/kotlin-as-java/src/main/kotlin/transformToJava.kt deleted file mode 100644 index 32344dd9..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/transformToJava.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava - -import org.jetbrains.dokka.kotlinAsJava.converters.KotlinToJavaConverter -import org.jetbrains.dokka.kotlinAsJava.transformers.JvmNameDocumentableTransformer -import org.jetbrains.dokka.model.DClasslike -import org.jetbrains.dokka.model.DFunction -import org.jetbrains.dokka.model.DPackage -import org.jetbrains.dokka.model.DProperty -import org.jetbrains.dokka.plugability.DokkaContext - -private val JVM_NAME_DOCUMENTABLE_TRANSFORMER by lazy { - JvmNameDocumentableTransformer() -} - -public fun DPackage.transformToJava(context: DokkaContext): DPackage { - with(KotlinToJavaConverter(context)) { - return JVM_NAME_DOCUMENTABLE_TRANSFORMER.transform(this@transformToJava.asJava(), context) - } -} - -public fun DClasslike.transformToJava(context: DokkaContext): DClasslike { - with(KotlinToJavaConverter(context)) { - return JVM_NAME_DOCUMENTABLE_TRANSFORMER.transform(this@transformToJava.asJava(), context) - } -} - -public fun DFunction.transformToJava(context: DokkaContext, containingClassName: String, isTopLevel: Boolean = false): List<DFunction> { - with(KotlinToJavaConverter(context)) { - return this@transformToJava.asJava(containingClassName, isTopLevel) - .map { JVM_NAME_DOCUMENTABLE_TRANSFORMER.transform(it, context) } - } -} - -public fun DProperty.transformToJava(context: DokkaContext, isTopLevel: Boolean = false, relocateToClass: String? = null): DProperty { - with(KotlinToJavaConverter(context)) { - return JVM_NAME_DOCUMENTABLE_TRANSFORMER.transform(this@transformToJava.asJava(isTopLevel, relocateToClass), context) - } -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameDocumentableTransformer.kt b/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameDocumentableTransformer.kt deleted file mode 100644 index fe625e1c..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameDocumentableTransformer.kt +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.transformers - -import org.jetbrains.dokka.model.* -import org.jetbrains.dokka.model.properties.PropertyContainer -import org.jetbrains.dokka.plugability.DokkaContext -import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer - -public class JvmNameDocumentableTransformer : DocumentableTransformer { - private val jvmNameProvider = JvmNameProvider() - - override fun invoke(original: DModule, context: DokkaContext): DModule { - return original.copy(packages = original.packages.map { transform(it, context) }) - } - - internal fun <T : Documentable> transform(documentable: T, context: DokkaContext): T { - val transformResult = with(documentable) { - when (this) { - is DPackage -> copy( - functions = functions.map { transform(it, context) }, - properties = properties.map { transform(it, context) }, - classlikes = classlikes.map { transform(it, context) }, - ) - is DFunction -> { - val name = jvmNameProvider.nameFor(this) - copy( - dri = documentable.dri.withCallableName(name), - name = name, - extra = extra.withoutJvmName() - ) - } - is DProperty -> transformGetterAndSetter(this) - is DClasslike -> transformClassLike(this, context) - is DEnumEntry -> copy( - functions = functions.map { transform(it, context) }, - properties = properties.map { transform(it, context) }, - classlikes = classlikes.map { transform(it, context) }, - ) - else -> { - context.logger.warn("Failed to translate a JvmName for ${this.javaClass.canonicalName}") - this - } - } - } - @Suppress("UNCHECKED_CAST") - return transformResult as T - } - - private fun PropertyContainer<DFunction>.withoutJvmName(): PropertyContainer<DFunction> { - val annotationsWithoutJvmName = get(Annotations)?.let { annotations -> - annotations.copy((annotations.directAnnotations).map { (sourceset, annotations) -> - sourceset to annotations.filterNot { it.isJvmName() } - }.toMap() + annotations.fileLevelAnnotations) - } - val extraWithoutAnnotations: PropertyContainer<DFunction> = minus(Annotations) - - return extraWithoutAnnotations.addAll(listOfNotNull(annotationsWithoutJvmName)) - } - - private fun transformClassLike(documentable: DClasslike, context: DokkaContext): DClasslike = - with(documentable) { - when (this) { - is DClass -> copy( - functions = functions.map { transform(it, context) }, - properties = properties.map { transform(it, context) }, - classlikes = classlikes.map { transform(it, context) }, - ) - is DAnnotation -> copy( - functions = functions.map { transform(it, context) }, - properties = properties.map { transform(it, context) }, - classlikes = classlikes.map { transform(it, context) }, - ) - is DObject -> copy( - functions = functions.map { transform(it, context) }, - properties = properties.map { transform(it, context) }, - classlikes = classlikes.map { transform(it, context) }, - ) - is DEnum -> copy( - functions = functions.map { transform(it, context) }, - properties = properties.map { transform(it, context) }, - classlikes = classlikes.map { transform(it, context) }, - ) - is DInterface -> copy( - functions = functions.map { transform(it, context) }, - properties = properties.map { transform(it, context) }, - classlikes = classlikes.map { transform(it, context) }, - ) - } - } - - private fun transformGetterAndSetter(entry: DProperty): DProperty = - with(entry) { - copy( - setter = jvmNameProvider.nameForSetter(this)?.let { setterName -> - setter?.let { setter -> - setter.copy( - dri = setter.dri.withCallableName(setterName), - name = setterName, - extra = setter.extra.withoutJvmName() - ) - } - }, - getter = jvmNameProvider.nameForGetter(this)?.let { getterName -> - getter?.let { getter -> - getter.copy( - dri = getter.dri.withCallableName(getterName), - name = getterName, - extra = getter.extra.withoutJvmName() - ) - } - }) - } -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameProvider.kt b/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameProvider.kt deleted file mode 100644 index caf76b68..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameProvider.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.transformers - -import org.jetbrains.dokka.kotlinAsJava.directlyAnnotatedJvmName -import org.jetbrains.dokka.kotlinAsJava.fileLevelJvmName -import org.jetbrains.dokka.kotlinAsJava.jvmNameAsString -import org.jetbrains.dokka.model.* -import org.jetbrains.dokka.model.properties.WithExtraProperties - -public data class Name(val fqName: String) { - val name: String = fqName.substringAfterLast(".") -} - -public class JvmNameProvider { - public fun <T> nameFor(entry: T): String where T : Documentable, T : WithExtraProperties<T> = - entry.directlyAnnotatedJvmName()?.jvmNameAsString() - ?: entry.name - ?: throw IllegalStateException("Failed to provide a name for ${entry.javaClass.canonicalName}") - - public fun <T> nameForSyntheticClass(entry: T): Name where T : WithSources, T : WithExtraProperties<T>, T : Documentable { - val name: String = (entry.fileLevelJvmName()?.params?.get("name") as? StringValue)?.value - ?: (entry.sources.entries.first().value.path.split("/").last().split(".").first().capitalize() + "Kt") - return Name("${entry.dri.packageName}.$name") - } - - public fun nameForGetter(entry: DProperty): String? = - entry.getter?.directlyAnnotatedJvmName()?.jvmNameAsString() - - public fun nameForSetter(entry: DProperty): String? = - entry.setter?.directlyAnnotatedJvmName()?.jvmNameAsString() - - private fun List<Annotations.Annotation>.jvmNameAnnotation(): Annotations.Annotation? = - firstOrNull { it.isJvmName() } -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformers/KotlinAsJavaDocumentableTransformer.kt b/plugins/kotlin-as-java/src/main/kotlin/transformers/KotlinAsJavaDocumentableTransformer.kt deleted file mode 100644 index 45682ea4..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/transformers/KotlinAsJavaDocumentableTransformer.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.transformers - -import org.jetbrains.dokka.kotlinAsJava.converters.KotlinToJavaConverter -import org.jetbrains.dokka.model.DModule -import org.jetbrains.dokka.plugability.DokkaContext -import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer - -public class KotlinAsJavaDocumentableTransformer : DocumentableTransformer { - override fun invoke(original: DModule, context: DokkaContext): DModule = - original.copy(packages = original.packages.map { - with(KotlinToJavaConverter(context)) { - it.asJava() - } - }) -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformers/withCallableName.kt b/plugins/kotlin-as-java/src/main/kotlin/transformers/withCallableName.kt deleted file mode 100644 index d2f5a9cf..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/transformers/withCallableName.kt +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.transformers - -import org.jetbrains.dokka.links.DRI - -internal fun DRI.withCallableName(newName: String): DRI = copy(callable = callable?.copy(name = newName)) diff --git a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt deleted file mode 100644 index a0ed24d4..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.translators - -import org.jetbrains.dokka.base.DokkaBase -import org.jetbrains.dokka.base.DokkaBaseConfiguration -import org.jetbrains.dokka.model.DModule -import org.jetbrains.dokka.pages.ModulePageNode -import org.jetbrains.dokka.plugability.* -import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator -import org.jetbrains.dokka.utilities.DokkaLogger -import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin - -public class KotlinAsJavaDocumentableToPageTranslator( - context: DokkaContext -) : DocumentableToPageTranslator { - private val configuration = configuration<DokkaBase, DokkaBaseConfiguration>(context) - private val commentsToContentConverter = context.plugin<DokkaBase>().querySingle { commentsToContentConverter } - private val signatureProvider = context.plugin<DokkaBase>().querySingle { signatureProvider } - private val customTagContentProviders = context.plugin<DokkaBase>().query { customTagContentProvider } - private val documentableSourceLanguageParser = context.plugin<InternalKotlinAnalysisPlugin>().querySingle { documentableSourceLanguageParser } - private val logger: DokkaLogger = context.logger - - override fun invoke(module: DModule): ModulePageNode = - KotlinAsJavaPageCreator( - configuration, - commentsToContentConverter, - signatureProvider, - logger, - customTagContentProviders, - documentableSourceLanguageParser - ).pageForModule(module) -} diff --git a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt deleted file mode 100644 index fcdc1d83..00000000 --- a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.jetbrains.dokka.kotlinAsJava.translators - -import org.jetbrains.dokka.base.DokkaBaseConfiguration -import org.jetbrains.dokka.base.signatures.SignatureProvider -import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter -import org.jetbrains.dokka.base.transformers.pages.tags.CustomTagContentProvider -import org.jetbrains.dokka.base.translators.documentables.DefaultPageCreator -import org.jetbrains.dokka.model.DProperty -import org.jetbrains.dokka.pages.MemberPageNode -import org.jetbrains.dokka.utilities.DokkaLogger -import org.jetbrains.dokka.analysis.kotlin.internal.DocumentableSourceLanguageParser - -public class KotlinAsJavaPageCreator( - configuration: DokkaBaseConfiguration?, - commentsToContentConverter: CommentsToContentConverter, - signatureProvider: SignatureProvider, - logger: DokkaLogger, - customTagContentProviders: List<CustomTagContentProvider>, - documentableAnalyzer: DocumentableSourceLanguageParser -) : DefaultPageCreator( - configuration, - commentsToContentConverter, - signatureProvider, - logger, - customTagContentProviders = customTagContentProviders, - documentableAnalyzer = documentableAnalyzer -) { - override fun pageForProperty(p: DProperty): MemberPageNode? = null -} diff --git a/plugins/kotlin-as-java/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/kotlin-as-java/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin deleted file mode 100644 index 4b6619b1..00000000 --- a/plugins/kotlin-as-java/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin +++ /dev/null @@ -1,5 +0,0 @@ -# -# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. -# - -org.jetbrains.dokka.kotlinAsJava.KotlinAsJavaPlugin diff --git a/plugins/kotlin-as-java/src/test/kotlin/CompanionAsJavaTest.kt b/plugins/kotlin-as-java/src/test/kotlin/CompanionAsJavaTest.kt deleted file mode 100644 index cba5e9ef..00000000 --- a/plugins/kotlin-as-java/src/test/kotlin/CompanionAsJavaTest.kt +++ /dev/null @@ -1,548 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinAsJavaPlugin - -import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest -import org.jetbrains.dokka.model.* -import kotlin.test.* - -private const val COMPANION_NAME = "C" - -class CompanionAsJavaTest : BaseAbstractTest() { - private val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - classpath += jvmStdlibPath!! - } - } - } - - @Test - fun `empty companion object should not be rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME {} - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionNotRendered(parentClass) - } - } - } - - @Test - fun `companion object with only jvmField should not be rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | @JvmField val jvmFieldProp: String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionNotRendered(parentClass) - } - } - } - - @Test - fun `companion property with jvmField should be static`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | @JvmField val jvmFieldProp: String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - val parentClassProperty = parentClass.properties.firstOrNull { it.name == "jvmFieldProp" } - assertNotNull(parentClassProperty, "Parent class should contain the companion jvmField property") - assertIsStatic(parentClassProperty) - } - } - } - - @Test - fun `companion object with only const should not be rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | const val constProp: Int = 0 - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionNotRendered(parentClass) - } - } - } - - @Test - fun `companion property with const should be static`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | const val constProp: Int = 0 - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - val parentClassProperty = parentClass.properties.firstOrNull { it.name == "constProp" } - assertNotNull(parentClassProperty, "Parent class should contain the companion const property") - assertIsStatic(parentClassProperty) - } - } - } - - @Test - fun `companion object with only lateinit not rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | lateinit var lateInitProp: String - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionNotRendered(parentClass) - } - } - } - - @Test - fun `companion property with lateinit should be static`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | lateinit var lateInitProp: String - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - val parentClassProperty = parentClass.properties.firstOrNull { it.name == "lateInitProp" } - assertNotNull(parentClassProperty, "Parent class should contain the companion lateinit property") - assertIsStatic(parentClassProperty) - } - } - } - - @Test - fun `companion object with only jvmStatic fun not rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | @JvmStatic fun staticFun(): String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionNotRendered(parentClass) - } - } - } - - @Test - fun `companion function with JvmStatic should be static`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | @JvmStatic fun staticFun(): String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - val parentClassFunction = parentClass.functions.firstOrNull { it.name == "staticFun" } - assertNotNull(parentClassFunction, "Parent class should contains the companion jvmStatic function") - assertIsStatic(parentClassFunction) - } - } - } - - @Test - fun `companion object with nested classes is rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | @JvmStatic - | fun staticFun1(): String = "" - | - | const val CONST_VAL: Int = 100 - | - | class NestedClass - | object NestedObject - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionRendered(parentClass) - - val classLikes = parentClass.companion?.classlikes - assertNotNull(classLikes) - assertEquals(2, classLikes.size, - "Classlike list should contains nested class and object") - assertTrue(classLikes.any { it.name == "NestedClass" }) - assertTrue(classLikes.any { it.name == "NestedObject" }) - - } - } - } - - @Test - fun `companion object with supertype is rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - | - |class Parent - |interface IParent - |class MyClass { - | companion object $COMPANION_NAME : Parent(), IParent { - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionRendered(parentClass) - } - } - } - - @Test - fun `companion object rendered for own properties`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | @JvmField - | val jvmField: String = "" - | const val contVal: Int = 0 - | lateinit var lateInit: String - | - | val rendered: Int = TODO() - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionRendered(parentClass) - - val properties = parentClass.companion?.properties - - assertNotNull(properties) - assertEquals(2, properties.size) // including INSTANCE - assertTrue(properties.any { it.name == "rendered" }) - assertTrue(properties.none { it.name == "jvmField1" }) - assertTrue(properties.none { it.name == "contVal" }) - assertTrue(properties.none { it.name == "lateInit" }) - } - } - } - - @Test - fun `companion object rendered for own functions`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | @JvmStatic - | fun staticFun(): String = "" - | - | fun renderedFun(): String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertCompanionRendered(parentClass) - - val functions = parentClass.companion?.functions - - assertNotNull(functions) - assertEquals(1, functions.size) - assertTrue(functions.any { it.name == "renderedFun" }) - assertTrue(functions.none { it.name == "staticFun" }) - } - } - } - - @Test - fun `companion const value should be rendered as public by default`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | const val constProp: String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertEquals( - JavaVisibility.Public, - parentClass.properties.firstOrNull()?.visibility?.values?.first() - ) - assertNull(parentClass.findFunction("constProp"), "There is no getter for the cont field") - } - } - } - - @Test - fun `companion const value should preserve Java modifier`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | protected const val constProp: String = "" - | } - |} - """.trimMargin(), - dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - classpath += jvmStdlibPath!! - documentedVisibilities = setOf( - org.jetbrains.dokka.DokkaConfiguration.Visibility.PUBLIC, - org.jetbrains.dokka.DokkaConfiguration.Visibility.PROTECTED - ) - } - } - }, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertEquals( - JavaVisibility.Protected, - parentClass.properties.firstOrNull()?.visibility?.values?.first() - ) - assertNull(parentClass.findFunction("constProp"), "There is no getter for the cont field") - } - } - } - - @Test - fun `companion lateinit value should be rendered as public by default`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | lateinit var lateInitProp: String - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertEquals( - JavaVisibility.Public, - parentClass.properties.firstOrNull()?.visibility?.values?.first() - ) - assertNull(parentClass.findFunction("lateInitProp"), "There is no getter for the cont field") - } - } - } - - @Test - fun `named companion instance property should be rendered if companion rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | var property: String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertNotNull(parentClass.properties.any { it.name == COMPANION_NAME }) - } - } - } - - @Test - fun `default named companion instance property should be rendered if companion rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object { - | var property: String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertTrue(parentClass.properties.any { it.name == "Companion" }) - } - } - } - - @Test - fun `companion instance property should be hidden if companion not rendered`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class MyClass { - | companion object $COMPANION_NAME { - | const val property: String = "" - | } - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val parentClass = module.findClass("MyClass") - - assertTrue(parentClass.properties.none { it.name == COMPANION_NAME }) - } - } - } -} - -private fun DModule.findClass(name: String) = packages.flatMap { it.classlikes } - .firstOrNull { it.name == name } as DClass - -private fun DClass.findFunction(name: String) = functions.firstOrNull { it.name.contains(name, ignoreCase = true) } - -private fun assertCompanionRendered(parentClass: DClass) { - assertNotNull(parentClass.companion, "Companion should not be null") - assertTrue( - parentClass.classlikes.any { it.name == COMPANION_NAME }, - "Companion should be in classlikes list" - ) -} - -private fun assertCompanionNotRendered(parentClass: DClass) { - assertNull(parentClass.companion, "Companion should be null") - assertTrue( - parentClass.classlikes.none { it.name == COMPANION_NAME }, - "Companion should not be in classlikes list" - ) -} - -private fun assertIsStatic(property: DProperty) { - val extra = property.extra[AdditionalModifiers] - assertNotNull(extra, "extra for property is present") - assertTrue( - extra.content.values.contains(setOf(ExtraModifiers.JavaOnlyModifiers.Static)), - "Property contains extra modifier static" - ) -} - -private fun assertIsStatic(function: DFunction) { - val extra = function.extra[AdditionalModifiers] - assertNotNull(extra, "extra for property is present") - assertTrue( - extra.content.values.contains(setOf(ExtraModifiers.JavaOnlyModifiers.Static)), - "Function contains extra modifier static" - ) -} diff --git a/plugins/kotlin-as-java/src/test/kotlin/DRITranslationTest.kt b/plugins/kotlin-as-java/src/test/kotlin/DRITranslationTest.kt deleted file mode 100644 index bdea1cb4..00000000 --- a/plugins/kotlin-as-java/src/test/kotlin/DRITranslationTest.kt +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinAsJavaPlugin - - -import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest -import org.jetbrains.dokka.model.DClass -import org.jetbrains.dokka.model.DEnum -import kotlin.test.Test -import kotlin.test.assertTrue - -class DRITranslationTest : BaseAbstractTest() { - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - classpath += jvmStdlibPath!! - } - } - } - - @Test - fun `should correctly handle nested classes`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class A { - | class B(val x: String) - |} - |class C { - | class B(val x: String) - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val nestedClasslikesDRIs = module.packages.flatMap { it.classlikes }.flatMap { it.classlikes }.map { it.dri } - val driRegex = "[AC]\\.B".toRegex() - - nestedClasslikesDRIs.forEach { dri -> - assertTrue(driRegex.matches(dri.classNames.toString())) - } - } - } - } - - @Test - fun `should correctly handle interface methods`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |interface A { - | fun b() - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val nestedFunctionDRI = module.packages.flatMap { it.classlikes }.flatMap { it.functions }.filter { it.name == "b" }.map { it.dri }.single() - - assertTrue(nestedFunctionDRI.classNames == "A") - } - } - } - - @Test - fun `should correctly handle object methods`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |object A { - | fun b() {} - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val nestedFunctionDRI = module.packages.flatMap { it.classlikes }.flatMap { it.functions }.filter { it.name == "b" }.map { it.dri }.single() - - assertTrue(nestedFunctionDRI.classNames == "A") - } - } - } - - @Test - fun `should correctly handle enum functions`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |enum class A(private val x: Int) { - | X(0); - | fun b() = x - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val nestedFunctionDRI = (module.packages.single().classlikes.single() as DEnum).functions.filter { it.name == "b" }.map { it.dri }.single() - - assertTrue(nestedFunctionDRI.classNames == "A") - } - } - } - - @Test - fun `should correctly handle nested classes' constructors`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class A { - | class B(val x: String) - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val constructorDRI = (module.packages.flatMap { it.classlikes }.flatMap { it.classlikes }.single() as DClass).constructors.single().dri - assertTrue(constructorDRI.classNames == "A.B") - } - } - } -} diff --git a/plugins/kotlin-as-java/src/test/kotlin/JvmFieldTest.kt b/plugins/kotlin-as-java/src/test/kotlin/JvmFieldTest.kt deleted file mode 100644 index 6167e13a..00000000 --- a/plugins/kotlin-as-java/src/test/kotlin/JvmFieldTest.kt +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinAsJavaPlugin - -import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest -import org.jetbrains.dokka.model.AdditionalModifiers -import org.jetbrains.dokka.model.ExtraModifiers -import org.jetbrains.dokka.model.JavaVisibility -import kotlin.test.* - -class JvmFieldTest : BaseAbstractTest() { - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - classpath += jvmStdlibPath!! - } - } - } - - @Test - fun `should keep properties annotated with JvmField as properties`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class SampleClass(@JvmField val property: String, val otherProperty: String) - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val classLike = module.packages.flatMap { it.classlikes }.first() - assertNotNull(classLike.properties.firstOrNull { it.name == "property" }) - assertEquals( - listOf("getOtherProperty"), - classLike.functions.map { it.name }) - } - } - } - - @Test - fun `should work for top-level property`(){ - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |@JvmField - |val property: String = TODO() - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val classLike = module.packages.flatMap { it.classlikes }.first() - assertNotNull(classLike.properties.firstOrNull { it.name == "property" }) - assertEquals( - emptyList(), - classLike.functions.map { it.name }) - } - } - } - - @Test - fun `properties without JvmName should be kept private`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |class SampleClass(val property: String) - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val classLike = module.packages.flatMap { it.classlikes }.first() - assertEquals(JavaVisibility.Private, classLike.properties.firstOrNull()?.visibility?.values?.first()) - assertNotNull(classLike.functions.firstOrNull { it.name.startsWith("get") }) - assertEquals( - JavaVisibility.Public, - classLike.functions.first { it.name.startsWith("get") }.visibility.values.first() - ) - } - } - } - - @Test - fun `object jvmfield property should have no getters`(){ - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |object MyObject { - | @JvmField - | val property: String = TODO() - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val classLike = module.packages.flatMap { it.classlikes }.first() - val property = classLike.properties.singleOrNull { it.name == "property" } - assertNotNull(property) - assertEquals( - emptyList(), - classLike.functions.map { it.name } - ) - assertNull(property.getter) - assertNull(property.setter) - } - } - } - - @Test - fun `enum jvmfield property should have no getters`(){ - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |enum class MyEnum { - | ITEM; - | - | @JvmField - | val property: String = TODO() - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val classLike = module.packages.flatMap { it.classlikes }.first() - val property = classLike.properties.singleOrNull { it.name == "property" } - assertNotNull(property) - assertEquals( - emptyList(), - classLike.functions - .filter{ it.name.contains("property", ignoreCase = true) } - .map { it.name } - ) - assertNull(property.getter) - assertNull(property.setter) - } - } - } - - - @Test - fun `object jvmfield property should be static`(){ - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |object MyObject { - | @JvmField - | val property: String = TODO() - |} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val classLike = module.packages.flatMap { it.classlikes }.first() - val property = classLike.properties.singleOrNull { it.name == "property" } - assertNotNull(property) - - val extra = property.extra[AdditionalModifiers] - assertNotNull(extra, "Additional modifiers for property are exist") - assertTrue(extra.content.values.contains(setOf(ExtraModifiers.JavaOnlyModifiers.Static)), - "Extra modifiers contains static") - } - } - } -} diff --git a/plugins/kotlin-as-java/src/test/kotlin/JvmNameTest.kt b/plugins/kotlin-as-java/src/test/kotlin/JvmNameTest.kt deleted file mode 100644 index 7a087fb7..00000000 --- a/plugins/kotlin-as-java/src/test/kotlin/JvmNameTest.kt +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinAsJavaPlugin - -import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest -import org.jetbrains.dokka.links.Callable -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.links.TypeConstructor -import org.jetbrains.dokka.model.Annotations -import org.jetbrains.dokka.model.DClass -import org.jetbrains.dokka.model.isJvmName -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNull - -class JvmNameTest : BaseAbstractTest() { - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - classpath += jvmStdlibPath!! - } - } - } - - @Test - fun `should change name for class containing top level function`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |@file:JvmName("CustomJvmName") - |package kotlinAsJavaPlugin - |fun sample(): String = "" - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val expectedClassLikeDri = DRI( - packageName = "kotlinAsJavaPlugin", - classNames = "CustomJvmName", - ) - val classLike = module.packages.flatMap { it.classlikes }.first() - assertEquals(expectedClassLikeDri, classLike.dri) - assertEquals("CustomJvmName", classLike.name) - } - } - } - - @Test - fun `should change name for top level function`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |@file:JvmName("CustomJvmName") - |package kotlinAsJavaPlugin - |@JvmName("jvmSample") - |fun sample(): String = "" - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val expectedFunctionDri = DRI( - packageName = "kotlinAsJavaPlugin", - classNames = "CustomJvmName", - callable = Callable( - "jvmSample", - receiver = null, - params = emptyList() - ) - ) - val function = module.packages.flatMap { it.classlikes }.flatMap { it.functions }.first() - assertEquals(expectedFunctionDri, function.dri) - assertEquals("jvmSample", function.name) - } - } - } - - @Test - fun `should change name of a setter for top level property`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |@file:JvmName("CustomJvmName") - |package kotlinAsJavaPlugin - |@get:JvmName("xd") - |@set:JvmName("asd") - |var property: String - | get() = "" - | set(value) {} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val expectedSetterDri = DRI( - packageName = "kotlinAsJavaPlugin", - classNames = "CustomJvmName", - callable = Callable( - "asd", - receiver = null, - //Todo this is bad, this should be a type in java, look at the bytecode - params = listOf(TypeConstructor("kotlin.String", emptyList())) - ) - ) - val function = - module.packages.flatMap { it.classlikes }.flatMap { it.functions }.first { it.name == "asd" } - assertEquals(expectedSetterDri, function.dri) - assertEquals("asd", function.name) - } - } - } - - @Test - fun `should change name of a getter for top level property`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |@file:JvmName("CustomJvmName") - |package kotlinAsJavaPlugin - |@get:JvmName("xd") - |@set:JvmName("asd") - |var property: String - | get() = "" - | set(value) {} - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val expectedGetterDri = DRI( - packageName = "kotlinAsJavaPlugin", - classNames = "CustomJvmName", - callable = Callable( - "xd", - receiver = null, - params = emptyList() - ) - ) - val function = - module.packages.flatMap { it.classlikes }.flatMap { it.functions }.first { it.name == "xd" } - assertEquals(expectedGetterDri, function.dri) - assertEquals("xd", function.name) - } - } - } - - @Test - fun `should leave the name as default if annotation is not provided`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |fun sample(): String = "" - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val expectedClassLikeDri = DRI( - packageName = "kotlinAsJavaPlugin", - classNames = "SampleKt", - ) - val classLike = module.packages.flatMap { it.classlikes }.first() - assertEquals(expectedClassLikeDri, classLike.dri) - assertEquals("SampleKt", classLike.name) - } - } - } - - @Test - fun `jvmName extra should be removed after the name swap`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |@JvmName("CustomJvmName") - |fun sample(): String = "" - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val classLike = module.packages.flatMap { it.classlikes }.first() as DClass - assertNull( - classLike.extra[Annotations]?.directAnnotations?.flatMap { it.value } - ?.map { it.dri } - ?.firstOrNull { it.isJvmName() } - ) - } - } - } -} diff --git a/plugins/kotlin-as-java/src/test/kotlin/JvmOverloadsTest.kt b/plugins/kotlin-as-java/src/test/kotlin/JvmOverloadsTest.kt deleted file mode 100644 index 1d6f4698..00000000 --- a/plugins/kotlin-as-java/src/test/kotlin/JvmOverloadsTest.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinAsJavaPlugin - -import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest -import kotlin.test.Test -import kotlin.test.assertEquals - -class JvmOverloadsTest : BaseAbstractTest() { - private val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - classpath += jvmStdlibPath!! - } - } - } - - @Test - fun `should generate multiple functions`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |@JvmOverloads - |fun sample(a: Int = 0, b: String, c: Int = 0): String = "" - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val functions = module.packages.flatMap { it.classlikes }.flatMap { it.functions } - assertEquals(3, functions.size) - assertEquals(3, functions[0].parameters.size) - assertEquals(2, functions[1].parameters.size) - assertEquals(1, functions[2].parameters.size) - } - } - } - - @Test - fun `should do nothing if there is no default values`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |@JvmOverloads - |fun sample(a: Int, b: String, c: Int): String = "" - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val functions = module.packages.flatMap { it.classlikes }.flatMap { it.functions } - assertEquals(1, functions.size) - assertEquals(3, functions[0].parameters.size) - } - } - } -} diff --git a/plugins/kotlin-as-java/src/test/kotlin/JvmSyntheticTest.kt b/plugins/kotlin-as-java/src/test/kotlin/JvmSyntheticTest.kt deleted file mode 100644 index 3de48da7..00000000 --- a/plugins/kotlin-as-java/src/test/kotlin/JvmSyntheticTest.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinAsJavaPlugin - -import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest -import kotlin.test.Test -import kotlin.test.assertEquals - -class JvmSyntheticTest : BaseAbstractTest() { - - private val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - classpath += jvmStdlibPath!! - } - } - } - - @Test - fun `should not include synthetic functions`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |@JvmSynthetic - |fun synthetic(): String = "" - |fun sample(): String = "" - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val functions = module.packages.flatMap { it.classlikes }.flatMap { it.functions } - assertEquals(1, functions.size) - assertEquals("sample", functions[0].name) - } - } - } - - @Test - fun `should check synthetic on method fields, getters and setters`() { - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt - |package kotlinAsJavaPlugin - |@get:JvmSynthetic - |var synthetic: String = "" - | - |@set:JvmSynthetic - |var synthetic2: String = "" - | - |@JvmSynthetic - |var synthetic3: String = "" - | - |var sample: String = "" - """.trimMargin(), - configuration, - ) { - documentablesTransformationStage = { module -> - val functions = module.packages.flatMap { it.classlikes }.flatMap { it.functions } - assertEquals(4, functions.size) - assertEquals("setSynthetic", functions[0].name) - assertEquals("getSynthetic2", functions[1].name) - assertEquals("getSample", functions[2].name) - assertEquals("setSample", functions[3].name) - } - } - } -} diff --git a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt b/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt deleted file mode 100644 index 93d5c1b5..00000000 --- a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt +++ /dev/null @@ -1,618 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinAsJavaPlugin - -import matchers.content.* -import org.jetbrains.dokka.DokkaConfiguration -import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest -import org.jetbrains.dokka.jdk -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.model.Annotations -import org.jetbrains.dokka.model.GenericTypeConstructor -import org.jetbrains.dokka.model.dfs -import org.jetbrains.dokka.pages.* -import signatures.Parameter -import signatures.Parameters -import signatures.firstSignature -import signatures.renderedContent -import utils.A -import utils.TestOutputWriterPlugin -import utils.match -import kotlin.test.* - -class KotlinAsJavaPluginTest : BaseAbstractTest() { - - @Test - fun `top-level functions should be generated`() { - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |object TestObj {} - | - |fun testFL(l: List<String>) = l - |fun testF() {} - |fun testF2(i: Int) = i - |fun testF3(to: TestObj) = to - |fun <T : Char> testF4(t: T) = listOf(t) - |val testV = 1 - """.trimMargin(), - configuration, - cleanupOutput = true - ) { - pagesGenerationStage = { root -> - val content = (root.children.single().children.first { it.name == "TestKt" } as ContentPage).content - - val functionRows = content.findTableWithKind(kind = ContentKind.Functions).children - functionRows.assertCount(6) - - val propRows = content.findTableWithKind(kind = ContentKind.Properties).children - propRows.assertCount(1) - } - } - } - - private fun ContentNode.findTableWithKind(kind: ContentKind): ContentNode = dfs { node -> - node is ContentTable && node.dci.kind === kind - }.let { assertNotNull(it, "the table with kind $kind") } - - @Test - fun topLevelWithClassTest() { - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |class Test { - | fun testFC() {} - | val testVC = 1 - |} - | - |fun testF(i: Int) = i - |val testV = 1 - """.trimMargin(), - configuration, - cleanupOutput = true - ) { - pagesGenerationStage = { root -> - val contentList = root.children - .flatMap { it.children<ContentPage>() } - - contentList.find {it.name == "Test"}.apply { - assertNotNull(this) - content.findTableWithKind(ContentKind.Functions).children.assertCount(2) - content.findTableWithKind(ContentKind.Properties).children.assertCount(1) - } - contentList.find {it.name == "TestKt"}.apply { - assertNotNull(this) - content.findTableWithKind(ContentKind.Functions).children.assertCount(2) - content.findTableWithKind(ContentKind.Properties).children.assertCount(1) - } - } - } - } - - @Test - fun kotlinAndJavaTest() { - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |fun testF(i: Int) = i - |/src/main/kotlin/kotlinAsJavaPlugin/TestJ.java - |package kotlinAsJavaPlugin; - | - |public class TestJ { - | public int testF(int i) { return i; } - |} - """.trimMargin(), - configuration, - cleanupOutput = true - ) { - pagesGenerationStage = { root -> - val classes = root.children.first().children.associateBy { it.name } - classes.values.assertCount(2, "Class count: ") - - classes["TestKt"].let { - it?.children.orEmpty().assertCount(1, "(Kotlin) TestKt members: ") - it!!.children.first() - .let { assertEquals("testF", it.name, "(Kotlin) Expected method name: testF, got: ${it.name}") } - } - - classes["TestJ"].let { - it?.children.orEmpty().assertCount(2, "(Java) TestJ members: ") // constructor + method - it!!.children.map { it.name } - .let { - assertTrue( - it.containsAll( - setOf( - "testF", - "TestJ" - ) - ), - "(Java) Expected method name: testF, got: $it" - ) - } - } - } - } - } - - @Test - fun `public kotlin properties should have a getter with same visibilities`(){ - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |class Test { - | public val publicProperty: String = "" - |} - """.trimMargin(), - configuration, - cleanupOutput = true - ) { - pagesTransformationStage = { rootPageNode -> - val propertyGetter = rootPageNode.dfs { it is MemberPageNode && it.name == "getPublicProperty" } as? MemberPageNode - assertNotNull(propertyGetter) - propertyGetter.content.assertNode { - group { - header(1) { - +"getPublicProperty" - } - } - divergentGroup { - divergentInstance { - divergent { - group { - +"public final " - group { - link { - +"String" - } - } - link { - +"getPublicProperty" - } - +"()" - } - } - } - } - } - } - } - } - - @Test - fun `java properties should keep its modifiers`(){ - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/TestJ.java - |package kotlinAsJavaPlugin; - | - |public class TestJ { - | public Int publicProperty = 1; - |} - """.trimMargin(), - configuration, - cleanupOutput = true - ) { - pagesGenerationStage = { root -> - val testClass = root.dfs { it.name == "TestJ" } as? ClasslikePageNode - assertNotNull(testClass) - (testClass.content as ContentGroup).children.last().children.last().assertNode { - group { - header(2){ - +"Properties" - } - table { - group { - link { - +"publicProperty" - } - divergentGroup { - divergentInstance { - divergent { - group { - group { - +"public Int" - link { - +"publicProperty" - } - } - } - } - } - } - } - } - } - } - } - } - } - - @Test - fun `koltin interfaces and classes should be split to extends and implements`(){ - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |open class A { } - |interface B - |class C : A(), B - """.trimMargin(), - configuration, - cleanupOutput = true - ) { - pagesGenerationStage = { root -> - val testClass = root.dfs { it.name == "C" } as? ClasslikePageNode - assertNotNull(testClass) - testClass.content.assertNode { - group { - header(expectedLevel = 1) { - +"C" - } - platformHinted { - group { - +"public final class " - link { - +"C" - } - +" extends " - group { - link { - +"A" - } - } - +" implements " - group { - link { - +"B" - } - } - } - } - } - skipAllNotMatching() - } - } - } - } - - private fun <T> Collection<T>.assertCount(n: Int, prefix: String = "") = - assertEquals(n, count(), "${prefix}Expected $n, got ${count()}") - - @Test - fun `typealias`() { - val writerPlugin = TestOutputWriterPlugin() - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - externalDocumentationLinks = listOf(DokkaConfiguration.ExternalDocumentationLink.jdk(8)) - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |typealias XD = Int - |class ABC { - | fun someFun(xd: XD): Int = 1 - |} - """.trimMargin(), - configuration, - pluginOverrides = listOf(writerPlugin), - cleanupOutput = true - ) { - renderingStage = { _, _ -> - writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-a-b-c/some-fun.html").firstSignature().match( - "public final ", A("Integer"), A("someFun"), "(", Parameters( - Parameter(A("Integer"), "xd") - ), ")", ignoreSpanWithTokenStyle = true - ) - } - } - } - - @Test - fun `typealias with generic`() { - val writerPlugin = TestOutputWriterPlugin() - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - externalDocumentationLinks = listOf( - DokkaConfiguration.ExternalDocumentationLink.jdk(8), - stdlibExternalDocumentationLink - ) - classpath = listOfNotNull(jvmStdlibPath) - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |typealias XD<B, A> = Map<A, B> - | - |class ABC { - | fun someFun(xd: XD<Int, String>) = 1 - |} - """.trimMargin(), - configuration, - pluginOverrides = listOf(writerPlugin), - cleanupOutput = true - ) { - renderingStage = { _, _ -> - writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-a-b-c/some-fun.html").firstSignature().match( - "public final ", A("Integer"), A("someFun"), "(", Parameters( - Parameter(A("Map"), "<", A("String"), ", ", A("Integer"), "> xd"), - ), ")", ignoreSpanWithTokenStyle = true - ) - } - } - } - - @Test - fun `const in top level`() { - val writerPlugin = TestOutputWriterPlugin() - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - externalDocumentationLinks = listOf( - DokkaConfiguration.ExternalDocumentationLink.jdk(8), - stdlibExternalDocumentationLink - ) - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |const val FIRST = "String" - """.trimMargin(), - configuration, - pluginOverrides = listOf(writerPlugin), - cleanupOutput = true - ) { - renderingStage = { _, _ -> - assertNull(writerPlugin.writer.contents["root/kotlinAsJavaPlugin/-test-kt/get-f-i-r-s-t.html"]) - } - } - } - - @Test - fun `function in top level`() { - val writerPlugin = TestOutputWriterPlugin() - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - externalDocumentationLinks = listOf( - DokkaConfiguration.ExternalDocumentationLink.jdk(8), - stdlibExternalDocumentationLink - ) - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |fun sample(a: Int) = "" - """.trimMargin(), - configuration, - pluginOverrides = listOf(writerPlugin), - cleanupOutput = true - ) { - renderingStage = { _, _ -> - writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-test-kt/sample.html").firstSignature().match( - "public final static ", A("String"), A("sample"), "(", Parameters( - Parameter(A("Integer"), "a"), - ), ")", ignoreSpanWithTokenStyle = true - ) - } - } - } - - @Test - fun `should render primary kotlin constructor as a java constructor`() { - val writerPlugin = TestOutputWriterPlugin() - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - externalDocumentationLinks = listOf( - DokkaConfiguration.ExternalDocumentationLink.jdk(8), - stdlibExternalDocumentationLink - ) - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |class Test(val xd: Int) - """.trimMargin(), - configuration, - pluginOverrides = listOf(writerPlugin), - cleanupOutput = true - ) { - pagesGenerationStage = { root -> - val content = root.children - .flatMap { it.children<ContentPage>() } - .map { it.content }.single().mainContents - - val text = content.single { it is ContentHeader }.children - .single() as ContentText - - assertEquals("Constructors", text.text) - } - renderingStage = { _, _ -> - writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-test/-test.html").firstSignature().match( - A("Test"), A("Test"), "(", Parameters( - Parameter(A("Integer"), "xd") - ), ")", ignoreSpanWithTokenStyle = true - ) - } - } - } - - /** - * Kotlin Int becomes java int. Java int cannot be annotated in source, but Kotlin Int can be. - * This is paired with DefaultDescriptorToDocumentableTranslatorTest.`Java primitive annotations work`() - * - * This test currently does not do anything because Kotlin.Int currently becomes java.lang.Integer not primitive int - */ - @Test - fun `Java primitive annotations work`() { - val writerPlugin = TestOutputWriterPlugin() - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - externalDocumentationLinks = listOf( - DokkaConfiguration.ExternalDocumentationLink.jdk(8), - stdlibExternalDocumentationLink - ) - } - } - } - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - |@MustBeDocumented - |@Target(AnnotationTarget.TYPE) - |annotation class Hello() - |fun bar(): @Hello() Int - """.trimMargin(), - configuration, - pluginOverrides = listOf(writerPlugin), - cleanupOutput = true - ) { - documentablesTransformationStage = { module -> - val type = module.packages.single() - .classlikes.first { it.name == "TestKt" } - .functions.single() - .type as GenericTypeConstructor - assertEquals( - Annotations.Annotation(DRI("kotlinAsJavaPlugin", "Hello"), emptyMap()), - type.extra[Annotations]?.directAnnotations?.values?.single()?.single() - ) - // A bug; the GenericTypeConstructor cast should fail and this should be a PrimitiveJavaType - assertEquals("java.lang/Integer///PointingToDeclaration/", type.dri.toString()) - } - } - } - - @Test - fun `Java function should keep its access modifier`(){ - val className = "Test" - val accessModifier = "public" - val methodName = "method" - - val testClassQuery = """ - |/src/main/kotlin/kotlinAsJavaPlugin/${className}.java - |package kotlinAsJavaPlugin; - | - |public class $className { - | $accessModifier void ${methodName}() { - | - | } - |} - """.trimMargin() - - val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - } - } - } - - val writerPlugin = TestOutputWriterPlugin() - - testInline( - testClassQuery, - configuration, - pluginOverrides = listOf(writerPlugin), - cleanupOutput = true - ) { - renderingStage = { _, _ -> - val methodDocumentation = "root/kotlinAsJavaPlugin/-${className.toLowerCase()}/${methodName}.html" - - writerPlugin.writer.renderedContent(methodDocumentation) - .firstSignature() - .match( - "$accessModifier void ", A(methodName), "()", - ignoreSpanWithTokenStyle = true - ) - } - } - } -} - -private val ContentNode.mainContents: List<ContentNode> - get() = (this as ContentGroup).children - .filterIsInstance<ContentGroup>() - .single { it.dci.kind == ContentKind.Main }.children[0].let { it.children[0] }.children diff --git a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaSignatureTest.kt b/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaSignatureTest.kt deleted file mode 100644 index 25312810..00000000 --- a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaSignatureTest.kt +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinAsJavaPlugin - -import org.jetbrains.dokka.DokkaConfiguration -import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest -import org.jetbrains.dokka.jdk -import signatures.firstSignature -import signatures.renderedContent -import signatures.signature -import utils.* -import kotlin.test.Test - -class KotlinAsJavaSignatureTest : BaseAbstractTest() { - - private val configuration = dokkaConfiguration { - sourceSets { - sourceSet { - sourceRoots = listOf("src/") - externalDocumentationLinks = listOf( - DokkaConfiguration.ExternalDocumentationLink.jdk(8), - stdlibExternalDocumentationLink - ) - classpath = listOfNotNull(jvmStdlibPath) - } - } - } - - @Suppress("SameParameterValue") - private fun source(signature: String) = - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - | $signature - """.trimIndent() - - @Test - fun `fun with definitely non-nullable types as java`() { - val source = source("fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y") - val writerPlugin = TestOutputWriterPlugin() - - testInline( - source, - configuration, - pluginOverrides = listOf(writerPlugin) - ) { - renderingStage = { _, _ -> - val signature = writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-test-kt/elvis-like.html").firstSignature() - signature.match( - "public final static ", Span("T"), A("elvisLike"), - "<T extends ", A("Any"), ">(", - Span( - Span(Span(), " x, "), - Span(Span(), " y") - ), - ")", - ignoreSpanWithTokenStyle = true - ) - } - } - } - - @Test - fun `should display annotations`() { - val writerPlugin = TestOutputWriterPlugin() - - testInline( - """ - |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt - |package kotlinAsJavaPlugin - | - |@MustBeDocumented - |annotation class OnClass - | - |@MustBeDocumented - |annotation class OnMethod - | - |@MustBeDocumented - |annotation class OnParameter - | - |@Target(AnnotationTarget.TYPE) - |@MustBeDocumented - |annotation class OnType - | - |@Target(AnnotationTarget.TYPE_PARAMETER) - |@MustBeDocumented - |annotation class OnTypeParameter - | - |@OnClass - |class Clazz<@OnTypeParameter T : @OnType Any> { - | @OnMethod - | fun <@OnTypeParameter T : @OnType Any> withParams(@OnParameter str1: String, str2: String): Boolean { - | return str1 == str2 - | } - |} - """.trimIndent(), - configuration, - pluginOverrides = listOf(writerPlugin) - ) { - renderingStage = { _, _ -> - val signatures = writerPlugin.writer - .renderedContent("root/kotlinAsJavaPlugin/-clazz/index.html") - .signature() - - val classSignature = signatures[0] - classSignature.match( - Div(Div("@", A("OnClass"), "()")), - "public final class ", A("Clazz"), - // <@OnTypeParameter() T extends @OnType() Object> - "<", Span("@", A("OnTypeParameter"), "() "), "T extends ", Span("@", A("OnType"), "() "), A("Object"), ">", - ignoreSpanWithTokenStyle = true - ) - - val functionSignature = signatures[2] - functionSignature.match( - Div(Div("@", A("OnMethod"), "()")), - "public final ", A("Boolean"), A("withParams"), - // <@OnTypeParameter() T extends @OnType() Object> - "<", Span("@", A("OnTypeParameter"), "() "), "T extends ", Span("@", A("OnType"), "() "), A("Any"), ">(", - Span( - Span( - Span("@", A("OnParameter"), "() "), - A("String"), "str1, " - ), - Span( - A("String"), "str2" - ) - ), ")", - ignoreSpanWithTokenStyle = true - ) - } - } - } -} |