diff options
author | Ignat Beresnev <ignat.beresnev@jetbrains.com> | 2022-08-30 13:27:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-30 13:27:59 +0200 |
commit | a4bccbf8920a2f6f5fcf5bdf1f201d1129a05b62 (patch) | |
tree | 9856dd2958398f8a675b4e7205c2f239550cea8e /plugins/base | |
parent | e68eea63f2affbacf69af041252bad4444fc812f (diff) | |
download | dokka-a4bccbf8920a2f6f5fcf5bdf1f201d1129a05b62.tar.gz dokka-a4bccbf8920a2f6f5fcf5bdf1f201d1129a05b62.tar.bz2 dokka-a4bccbf8920a2f6f5fcf5bdf1f201d1129a05b62.zip |
Handle `PsiImmediateClassType` as `PsiClassType` to resolve bounds (#2647)
Fixes #2646
Diffstat (limited to 'plugins/base')
-rw-r--r-- | plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt | 4 | ||||
-rw-r--r-- | plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt | 53 |
2 files changed, 54 insertions, 3 deletions
diff --git a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt index 1fbe06f7..58524479 100644 --- a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt @@ -513,7 +513,7 @@ class DefaultPsiToDocumentableTranslator( } return when (type) { - is PsiClassReferenceType -> + is PsiClassType -> type.resolve()?.let { resolved -> when { resolved.qualifiedName == "java.lang.Object" -> type.cacheBoundIfHasNoAnnotation { annotations -> JavaObject(annotations.annotations()) } @@ -564,8 +564,6 @@ class DefaultPsiToDocumentableTranslator( is PsiPrimitiveType -> if (type.name == "void") Void else type.cacheBoundIfHasNoAnnotation { annotations -> PrimitiveJavaType(type.name, annotations.annotations()) } - is PsiImmediateClassType -> - type.cacheBoundIfHasNoAnnotation { annotations -> JavaObject(annotations.annotations()) } else -> throw IllegalStateException("${type.presentableText} is not supported by PSI parser") } } diff --git a/plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt b/plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt index f5c96f4a..5f42bd9a 100644 --- a/plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt +++ b/plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt @@ -4,6 +4,7 @@ import org.jetbrains.dokka.DokkaConfiguration import org.jetbrains.dokka.base.DokkaBase import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.links.PointingToDeclaration import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.doc.Text import org.jetbrains.dokka.plugability.DokkaPlugin @@ -538,4 +539,56 @@ class DefaultPsiToDocumentableTranslatorTest : BaseAbstractTest() { } } } + + @Test // see https://github.com/Kotlin/dokka/issues/2646 + fun `should resolve PsiImmediateClassType as class reference`() { + testInline( + """ + |/src/main/java/test/JavaEnum.java + |package test; + |public enum JavaEnum { + | FOO, BAR + |} + | + |/src/main/java/test/ContainingEnumType.java + |package test; + |public class ContainingEnumType { + | + | public JavaEnum returningEnumType() { + | return null; + | } + | + | public JavaEnum[] returningEnumTypeArray() { + | return null; + | } + | + | public void acceptingEnumType(JavaEnum javaEnum) {} + |} + """.trimIndent(), + configuration + ) { + documentablesMergingStage = { module -> + val expectedType = GenericTypeConstructor( + dri = DRI(packageName = "test", classNames = "JavaEnum", target = PointingToDeclaration), + projections = emptyList() + ) + val expectedArrayType = GenericTypeConstructor( + dri = DRI("kotlin", "Array", target = PointingToDeclaration), + projections = listOf(expectedType) + ) + + val classWithEnumUsage = module.packages.single().classlikes.single { it.name == "ContainingEnumType" } + + val returningEnum = classWithEnumUsage.functions.single { it.name == "returningEnumType" } + assertEquals(expectedType, returningEnum.type) + + val acceptingEnum = classWithEnumUsage.functions.single { it.name == "acceptingEnumType" } + assertEquals(1, acceptingEnum.parameters.size) + assertEquals(expectedType, acceptingEnum.parameters[0].type) + + val returningArray = classWithEnumUsage.functions.single { it.name == "returningEnumTypeArray" } + assertEquals(expectedArrayType, returningArray.type) + } + } + } } |