From faa20ff9f46b0846ec628acf008c429bca693790 Mon Sep 17 00:00:00 2001 From: Julia McClellan Date: Tue, 25 Jul 2023 13:10:20 -0400 Subject: [PATCH 1/2] Fix handling of Java variance --- .../base/src/test/kotlin/model/JavaTest.kt | 39 +++++++++++++++++++ .../analysis/java/parsers/DokkaPsiParser.kt | 4 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/plugins/base/src/test/kotlin/model/JavaTest.kt b/plugins/base/src/test/kotlin/model/JavaTest.kt index b3ee2726c9..99445929f9 100644 --- a/plugins/base/src/test/kotlin/model/JavaTest.kt +++ b/plugins/base/src/test/kotlin/model/JavaTest.kt @@ -439,4 +439,43 @@ class JavaTest : AbstractModelTest("/src/main/kotlin/java/Test.java", "java") { } } + @Test + fun variances() { + inlineModelTest( + """ + |public class Foo { + | public void superBound(java.util.List param) {} + | public void extendsBound(java.util.List param) {} + | public void unbounded(java.util.List param) {} + |} + """, configuration = configuration + ) { + with((this / "java" / "Foo").cast()) { + for (function in functions) { + val param = function.parameters.single() + val type = param.type as GenericTypeConstructor + val variance = type.projections.single() + + when (function.name) { + "superBound" -> { + assertTrue(variance is Contravariance<*>) + val bound = (variance as Contravariance<*>).inner + assertEquals((bound as GenericTypeConstructor).dri.classNames, "String") + } + "extendsBound" -> { + assertTrue(variance is Covariance<*>) + val bound = (variance as Covariance<*>).inner + assertEquals((bound as GenericTypeConstructor).dri.classNames, "String") + } + "unbounded" -> { + assertTrue(variance is Covariance<*>) + val bound = (variance as Covariance<*>).inner + assertTrue(bound is JavaObject) + } + } + } + } + } + } + } diff --git a/subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/parsers/DokkaPsiParser.kt b/subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/parsers/DokkaPsiParser.kt index 45f44338d9..a1f9cef0f4 100644 --- a/subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/parsers/DokkaPsiParser.kt +++ b/subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/parsers/DokkaPsiParser.kt @@ -567,8 +567,10 @@ internal class DokkaPsiParser( private fun getVariance(type: PsiWildcardType): Projection = when { + type.isExtends -> Covariance(getBound(type.extendsBound)) + type.isSuper -> Contravariance(getBound(type.superBound)) + // If the type isn't explicitly bounded, it still has an implicit `extends Object` bound type.extendsBound != PsiType.NULL -> Covariance(getBound(type.extendsBound)) - type.superBound != PsiType.NULL -> Contravariance(getBound(type.superBound)) else -> throw IllegalStateException("${type.presentableText} has incorrect bounds") } From 625e22a41b40e3065b6b2008d17df65543675ab4 Mon Sep 17 00:00:00 2001 From: Julia McClellan Date: Wed, 2 Aug 2023 16:44:54 -0400 Subject: [PATCH 2/2] Make test verify functions are present --- plugins/base/src/test/kotlin/model/JavaTest.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/base/src/test/kotlin/model/JavaTest.kt b/plugins/base/src/test/kotlin/model/JavaTest.kt index 99445929f9..f57c3c8c77 100644 --- a/plugins/base/src/test/kotlin/model/JavaTest.kt +++ b/plugins/base/src/test/kotlin/model/JavaTest.kt @@ -10,6 +10,7 @@ import org.jetbrains.dokka.model.doc.Text import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import utils.AbstractModelTest +import utils.assertContains import utils.assertNotNull import utils.name import kotlin.test.assertEquals @@ -451,6 +452,11 @@ class JavaTest : AbstractModelTest("/src/main/kotlin/java/Test.java", "java") { """, configuration = configuration ) { with((this / "java" / "Foo").cast()) { + val functionNames = functions.map { it.name } + assertContains(functionNames, "superBound") + assertContains(functionNames, "extendsBound") + assertContains(functionNames, "unbounded") + for (function in functions) { val param = function.parameters.single() val type = param.type as GenericTypeConstructor