Skip to content

Commit

Permalink
Hide derived members that are not public
Browse files Browse the repository at this point in the history
  • Loading branch information
BarkingBad committed Sep 11, 2020
1 parent c94b74b commit 400e585
Show file tree
Hide file tree
Showing 3 changed files with 258 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -316,8 +316,11 @@ private class DokkaDescriptorVisitor(
)
}

override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, parent: DRIWithPlatformInfo): DProperty {
val dri = parent.dri.copy(callable = Callable.from(descriptor))
override fun visitPropertyDescriptor(originalDescriptor: PropertyDescriptor, parent: DRIWithPlatformInfo): DProperty {
val dri = parent.dri.copy(callable = Callable.from(originalDescriptor))

val descriptor = originalDescriptor.getConcreteDescriptor()

val isExpect = descriptor.isExpect
val isActual = descriptor.isActual

Expand Down Expand Up @@ -351,14 +354,15 @@ private class DokkaDescriptorVisitor(
)
}

fun CallableMemberDescriptor.createDRI(wasOverridenBy: DRI? = null): Pair<DRI, DRI?> =
if (kind == CallableMemberDescriptor.Kind.DECLARATION || overriddenDescriptors.isEmpty())
Pair(DRI.from(this), wasOverridenBy)
else
overriddenDescriptors.first().createDRI(DRI.from(this))
fun CallableMemberDescriptor.createDRI(): Pair<DRI, DRI?> = DRI.from(this).let { dri ->
Pair(dri, DRI.from(getConcreteDescriptor()).takeIf { it != dri })
}

override fun visitFunctionDescriptor(originalDescriptor: FunctionDescriptor, parent: DRIWithPlatformInfo): DFunction {
val (dri, inheritedFrom) = originalDescriptor.createDRI()

val descriptor = originalDescriptor.getConcreteDescriptor()

override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, parent: DRIWithPlatformInfo): DFunction {
val (dri, inheritedFrom) = descriptor.createDRI()
val isExpect = descriptor.isExpect
val isActual = descriptor.isActual

Expand Down Expand Up @@ -770,6 +774,9 @@ private class DokkaDescriptorVisitor(
}
}

private fun <T : CallableMemberDescriptor> T.getConcreteDescriptor(): T =
if (kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) this
else overriddenDescriptors.first().getConcreteDescriptor() as T

private fun ValueParameterDescriptor.getDefaultValue(): String? =
(source as? KotlinSourceElement)?.psi?.children?.find { it is KtExpression }?.text
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,8 @@ class ReportUndocumentedTransformerTest : AbstractCoreTest() {
configuration
) {
pagesTransformationStage = {
assertNoUndocumentedReport(Regex("B"))
assertSingleUndocumentedReport(Regex("A.*a"))
assertSingleUndocumentedReport(Regex("B/a"))
assertSingleUndocumentedReport(Regex("A/a"))
}
}
}
Expand Down Expand Up @@ -270,8 +270,8 @@ class ReportUndocumentedTransformerTest : AbstractCoreTest() {
configuration
) {
pagesTransformationStage = {
assertNoUndocumentedReport(Regex("B"))
assertSingleUndocumentedReport(Regex("A.*a"))
assertSingleUndocumentedReport(Regex("A/a"))
assertSingleUndocumentedReport(Regex("B/a"))
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package translators

import org.jetbrains.dokka.model.*
import org.junit.jupiter.api.Assertions.*
import org.jetbrains.dokka.model.doc.CodeBlock
import org.jetbrains.dokka.model.doc.P
import org.jetbrains.dokka.model.doc.Text
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
import org.junit.Assert
import org.junit.jupiter.api.Test

class DefaultDescriptorToDocumentableTranslatorTest : AbstractCoreTest() {
Expand Down Expand Up @@ -147,4 +149,239 @@ class DefaultDescriptorToDocumentableTranslatorTest : AbstractCoreTest() {
}
}
}
}

private sealed class TestSuite {
abstract val propertyName: String

data class PropertyDoesntExist(
override val propertyName: String
) : TestSuite()


data class PropertyExists(
override val propertyName: String,
val modifier: KotlinModifier,
val visibility: KotlinVisibility,
val additionalModifiers: Set<ExtraModifiers.KotlinOnlyModifiers>
) : TestSuite()

data class FunctionDoesntExist(
override val propertyName: String,
) : TestSuite()

data class FunctionExists(
override val propertyName: String,
val modifier: KotlinModifier,
val visibility: KotlinVisibility,
val additionalModifiers: Set<ExtraModifiers.KotlinOnlyModifiers>
) : TestSuite()
}

private fun runTestSuitesAgainstGivenClasses(classlikes: List<DClasslike>, testSuites: List<List<TestSuite>>) {
classlikes.zip(testSuites).forEach { (classlike, testSuites) ->
testSuites.forEach { testSuite ->
when (testSuite) {
is TestSuite.PropertyDoesntExist -> Assert.assertEquals("Test for class ${classlike.name} failed", null, classlike.properties.firstOrNull { it.name == testSuite.propertyName })
is TestSuite.PropertyExists -> classlike.properties.single { it.name == testSuite.propertyName }.run {
Assert.assertEquals("Test for class ${classlike.name} with property $name failed", testSuite.modifier, modifier.values.single())
Assert.assertEquals("Test for class ${classlike.name} with property $name failed", testSuite.visibility, visibility.values.single())
Assert.assertEquals("Test for class ${classlike.name} with property $name failed", testSuite.additionalModifiers, extra[AdditionalModifiers]?.content?.values?.single())
}
is TestSuite.FunctionDoesntExist -> Assert.assertEquals("Test for class ${classlike.name} failed", null, classlike.functions.firstOrNull { it.name == testSuite.propertyName })
is TestSuite.FunctionExists -> classlike.functions.single { it.name == testSuite.propertyName }.run {
Assert.assertEquals("Test for class ${classlike.name} with function $name failed", testSuite.modifier, modifier.values.single())
Assert.assertEquals("Test for class ${classlike.name} with function $name failed", testSuite.visibility, visibility.values.single())
Assert.assertEquals("Test for class ${classlike.name} with function $name failed", testSuite.additionalModifiers, extra[AdditionalModifiers]?.content?.values?.single())
}
}
}
}
}

@Test
fun `derived properties with includeNonPublic`() {

val configuration = dokkaConfiguration {
sourceSets {
sourceSet {
sourceRoots = listOf("src/main/kotlin")
includeNonPublic = true
}
}
}

testInline(
"""
|/src/main/kotlin/sample/XD.kt
|package sample
|
|open class A {
| private val privateProperty: Int = 1
| protected val protectedProperty: Int = 2
| internal val internalProperty: Int = 3
| val publicProperty: Int = 4
| open val propertyToOverride: Int = 5
|
| private fun privateFun(): Int = 6
| protected fun protectedFun(): Int = 7
| internal fun internalFun(): Int = 8
| fun publicFun(): Int = 9
| open fun funToOverride(): Int = 10
|}
|
|open class B : A() {
| override val propertyToOverride: Int = 11
|
| override fun funToOverride(): Int = 12
|}
|class C : B()
""".trimIndent(),
configuration
) {

documentablesMergingStage = { module ->
val classes = module.packages.single().classlikes.sortedBy { it.name }

val testSuites: List<List<TestSuite>> = listOf(
listOf(
TestSuite.PropertyExists("privateProperty", KotlinModifier.Final, KotlinVisibility.Private, emptySet()),
TestSuite.PropertyExists("protectedProperty", KotlinModifier.Final, KotlinVisibility.Protected, emptySet()),
TestSuite.PropertyExists("internalProperty", KotlinModifier.Final, KotlinVisibility.Internal, emptySet()),
TestSuite.PropertyExists("publicProperty", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.PropertyExists("propertyToOverride", KotlinModifier.Open, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionExists("privateFun", KotlinModifier.Final, KotlinVisibility.Private, emptySet()),
TestSuite.FunctionExists("protectedFun", KotlinModifier.Final, KotlinVisibility.Protected, emptySet()),
TestSuite.FunctionExists("internalFun", KotlinModifier.Final, KotlinVisibility.Internal, emptySet()),
TestSuite.FunctionExists("publicFun", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionExists("funToOverride", KotlinModifier.Open, KotlinVisibility.Public, emptySet())
),
listOf(
TestSuite.PropertyExists("privateProperty", KotlinModifier.Final, KotlinVisibility.Private, emptySet()),
TestSuite.PropertyExists("protectedProperty", KotlinModifier.Final, KotlinVisibility.Protected, emptySet()),
TestSuite.PropertyExists("internalProperty", KotlinModifier.Final, KotlinVisibility.Internal, emptySet()),
TestSuite.PropertyExists("publicProperty", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.PropertyExists("propertyToOverride", KotlinModifier.Open, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override)),
TestSuite.FunctionExists("privateFun", KotlinModifier.Final, KotlinVisibility.Private, emptySet()),
TestSuite.FunctionExists("protectedFun", KotlinModifier.Final, KotlinVisibility.Protected, emptySet()),
TestSuite.FunctionExists("internalFun", KotlinModifier.Final, KotlinVisibility.Internal, emptySet()),
TestSuite.FunctionExists("publicFun", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionExists("funToOverride", KotlinModifier.Open, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override))
),
listOf(
TestSuite.PropertyExists("privateProperty", KotlinModifier.Final, KotlinVisibility.Private, emptySet()),
TestSuite.PropertyExists("protectedProperty", KotlinModifier.Final, KotlinVisibility.Protected, emptySet()),
TestSuite.PropertyExists("internalProperty", KotlinModifier.Final, KotlinVisibility.Internal, emptySet()),
TestSuite.PropertyExists("publicProperty", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.PropertyExists("propertyToOverride", KotlinModifier.Open, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override)),
TestSuite.FunctionExists("privateFun", KotlinModifier.Final, KotlinVisibility.Private, emptySet()),
TestSuite.FunctionExists("protectedFun", KotlinModifier.Final, KotlinVisibility.Protected, emptySet()),
TestSuite.FunctionExists("internalFun", KotlinModifier.Final, KotlinVisibility.Internal, emptySet()),
TestSuite.FunctionExists("publicFun", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionExists("funToOverride", KotlinModifier.Open, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override))
)
)

runTestSuitesAgainstGivenClasses(classes, testSuites)
}
}
}


@Test
fun `derived properties with no includeNonPublic`() {

val configuration = dokkaConfiguration {
sourceSets {
sourceSet {
sourceRoots = listOf("src/main/kotlin")
includeNonPublic = false
}
}
}

testInline(
"""
|/src/main/kotlin/sample/XD.kt
|package sample
|
|open class A {
| private val privateProperty: Int = 1
| protected val protectedProperty: Int = 2
| internal val internalProperty: Int = 3
| val publicProperty: Int = 4
| open val propertyToOverride: Int = 5
| open val propertyToOverrideButCloseMeanwhile: Int = 6
|
| private fun privateFun(): Int = 7
| protected fun protectedFun(): Int = 8
| internal fun internalFun(): Int = 9
| fun publicFun(): Int = 10
| open fun funToOverride(): Int = 11
| open fun funToOverrideButCloseMeanwhile(): Int = 12
|}
|
|open class B : A() {
| override val propertyToOverride: Int = 13
| final override val propertyToOverrideButCloseMeanwhile: Int = 14
|
| override fun funToOverride(): Int = 15
| final override fun funToOverrideButCloseMeanwhile(): Int = 16
|}
|class C : B()
""".trimIndent(),
configuration
) {

documentablesMergingStage = { module ->
val classes = module.packages.single().classlikes.sortedBy { it.name }

val testSuites: List<List<TestSuite>> = listOf(
listOf(
TestSuite.PropertyDoesntExist("privateProperty"),
TestSuite.PropertyDoesntExist("protectedProperty"),
TestSuite.PropertyDoesntExist("internalProperty"),
TestSuite.PropertyExists("publicProperty", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.PropertyExists("propertyToOverride", KotlinModifier.Open, KotlinVisibility.Public, emptySet()),
TestSuite.PropertyExists("propertyToOverrideButCloseMeanwhile", KotlinModifier.Open, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionDoesntExist("privateFun"),
TestSuite.FunctionDoesntExist("protectedFun"),
TestSuite.FunctionDoesntExist("internalFun"),
TestSuite.FunctionExists("publicFun", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionExists("funToOverride", KotlinModifier.Open, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionExists("funToOverrideButCloseMeanwhile", KotlinModifier.Open, KotlinVisibility.Public, emptySet())
),
listOf(
TestSuite.PropertyDoesntExist("privateProperty"),
TestSuite.PropertyDoesntExist("protectedProperty"),
TestSuite.PropertyDoesntExist("internalProperty"),
TestSuite.PropertyExists("publicProperty", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.PropertyExists("propertyToOverride", KotlinModifier.Open, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override)),
TestSuite.PropertyExists("propertyToOverrideButCloseMeanwhile", KotlinModifier.Final, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override)),
TestSuite.FunctionDoesntExist("privateFun"),
TestSuite.FunctionDoesntExist("protectedFun"),
TestSuite.FunctionDoesntExist("internalFun"),
TestSuite.FunctionExists("publicFun", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionExists("funToOverride", KotlinModifier.Open, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override)),
TestSuite.FunctionExists("funToOverrideButCloseMeanwhile", KotlinModifier.Final, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override))
),
listOf(
TestSuite.PropertyDoesntExist("privateProperty"),
TestSuite.PropertyDoesntExist("protectedProperty"),
TestSuite.PropertyDoesntExist("internalProperty"),
TestSuite.PropertyExists("publicProperty", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.PropertyExists("propertyToOverride", KotlinModifier.Open, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override)),
TestSuite.PropertyExists("propertyToOverrideButCloseMeanwhile", KotlinModifier.Final, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override)),
TestSuite.FunctionDoesntExist("privateFun"),
TestSuite.FunctionDoesntExist("protectedFun"),
TestSuite.FunctionDoesntExist("internalFun"),
TestSuite.FunctionExists("publicFun", KotlinModifier.Final, KotlinVisibility.Public, emptySet()),
TestSuite.FunctionExists("funToOverride", KotlinModifier.Open, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override)),
TestSuite.FunctionExists("funToOverrideButCloseMeanwhile", KotlinModifier.Final, KotlinVisibility.Public, setOf(ExtraModifiers.KotlinOnlyModifiers.Override))
)
)

runTestSuitesAgainstGivenClasses(classes, testSuites)
}
}
}
}

0 comments on commit 400e585

Please sign in to comment.