@@ -6,18 +6,19 @@ import arrow.optics.plugin.companionObject
66import com.google.devtools.ksp.getDeclaredProperties
77import com.google.devtools.ksp.getVisibility
88import com.google.devtools.ksp.symbol.KSClassDeclaration
9+ import com.google.devtools.ksp.symbol.KSDeclaration
910import com.google.devtools.ksp.symbol.KSType
1011import com.google.devtools.ksp.symbol.KSTypeParameter
1112import com.google.devtools.ksp.symbol.Variance
13+ import com.google.devtools.ksp.symbol.Visibility
1214import java.util.*
1315
1416data class ADT (val declaration : KSClassDeclaration , val targets : List <Target >) {
1517 val sourceClassName = declaration.qualifiedNameOrSimpleName
1618 val sourceName = declaration.simpleName.asString().replaceFirstChar { it.lowercase(Locale .getDefault()) }.sanitize()
1719 val simpleName = declaration.nameWithParentClass
1820 val packageName = declaration.packageName.asSanitizedString()
19- val visibilityModifierName =
20- (declaration.companionObject?.getVisibility() ? : declaration.getVisibility()).name.lowercase()
21+ val visibilityModifierName = declaration.effectiveCompanionVisibility.name.lowercase()
2122 val typeParameters: List <String > = declaration.typeParameters.map { tyParam ->
2223 if (tyParam.variance == Variance .STAR ) return @map " *"
2324 // val prefix = when (it.variance) {
@@ -52,6 +53,36 @@ val KSClassDeclaration.nameWithParentClass: String
5253 else -> simpleName.asString()
5354 }
5455
56+ val KSClassDeclaration .effectiveCompanionVisibility: Visibility
57+ get() {
58+ val visibilities =
59+ listOfNotNull(companionObject?.getVisibility(), getVisibility()) +
60+ allParentDeclarations().filterIsInstance<KSClassDeclaration >().map { it.getVisibility() }
61+ return visibilities.foldRight(Visibility .PUBLIC , Visibility ::plus)
62+ }
63+
64+ fun KSDeclaration.allParentDeclarations (): List <KSDeclaration > = when (val parent = parentDeclaration) {
65+ null -> emptyList()
66+ else -> listOfNotNull(parent) + parent.allParentDeclarations()
67+ }
68+
69+ operator fun Visibility.plus (other : Visibility ): Visibility = when {
70+ this == other -> this
71+
72+ this == Visibility .PUBLIC -> other
73+
74+ other == Visibility .PUBLIC -> this
75+
76+ this == Visibility .LOCAL || other == Visibility .LOCAL -> Visibility .LOCAL
77+
78+ this == Visibility .PRIVATE || other == Visibility .PRIVATE -> Visibility .PRIVATE
79+
80+ (this == Visibility .INTERNAL || this == Visibility .PROTECTED ) &&
81+ (other == Visibility .INTERNAL || other == Visibility .PROTECTED ) -> Visibility .PRIVATE
82+
83+ else -> Visibility .PRIVATE
84+ }
85+
5586enum class OpticsTarget {
5687 ISO ,
5788 LENS ,
0 commit comments