Skip to content

Commit 16eac59

Browse files
AbdullinAMwhyoleg
authored andcommitted
Support for nested typealiases (#4261)
* Add `WithTypealiases` interface to documentables * Copy typealiases everywhere * Merge typealiases in multiplatform projects * Fix DocumentableReplacerTransformer: consider typealiases when computing if the classlike was changed * Add test for nested typealiases in SuppressTagFilterTest.kt * Change the rendering of typealias names * Ensure ABI compatibility of documentables that implement `WithTypealiases` * Add test that checks nested typealiases with type parameters * Remove the use of `signatureForProjection` in `regularSignature` for typealiases, replace it with custom implementation (cherry picked from commit b49856b)
1 parent 454c687 commit 16eac59

File tree

24 files changed

+1434
-78
lines changed

24 files changed

+1434
-78
lines changed

dokka-subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/parsers/DokkaPsiParser.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ internal class DokkaPsiParser(
317317
properties = fields.filter { it !is PsiEnumConstant }
318318
.map { parseField(it, accessors[it].orEmpty()) },
319319
classlikes = classlikes.await(),
320+
typealiases = emptyList(),
320321
visibility = visibility,
321322
companion = null,
322323
constructors = parseConstructors(dri),
@@ -340,6 +341,7 @@ internal class DokkaPsiParser(
340341
functions = allFunctions.await(),
341342
properties = allFields.await(),
342343
classlikes = classlikes.await(),
344+
typealiases = emptyList(),
343345
visibility = visibility,
344346
companion = null,
345347
generics = mapTypeParameters(dri),
@@ -361,6 +363,7 @@ internal class DokkaPsiParser(
361363
functions = allFunctions.await(),
362364
properties = allFields.await(),
363365
classlikes = classlikes.await(),
366+
typealiases = emptyList(),
364367
sources = source,
365368
visibility = visibility,
366369
companion = null,

dokka-subprojects/analysis-kotlin-descriptors-compiler/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/descriptors/compiler/configuration/DRIFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ internal fun DRI.Companion.from(descriptor: DeclarationDescriptor) = descriptor.
2323

2424
DRI(
2525
packageName = firstIsInstanceOrNull<PackageFragmentDescriptor>()?.fqName?.asString() ?: "",
26-
classNames = (filterIsInstance<ClassDescriptor>() + filterIsInstance<TypeAliasDescriptor>()).toList()
26+
classNames = filter { it is ClassDescriptor || it is TypeAliasDescriptor }.toList()
2727
.takeIf { it.isNotEmpty() }
2828
?.asReversed()
2929
?.joinToString(separator = ".") { it.name.asString() },

dokka-subprojects/analysis-kotlin-descriptors-compiler/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/descriptors/compiler/translator/DefaultDescriptorToDocumentableTranslator.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ private class DokkaDescriptorVisitor(
227227
val functions = async { descriptorsWithKind.functions.visitFunctions(driWithPlatform) }
228228
val properties = async { descriptorsWithKind.properties.visitProperties(driWithPlatform) }
229229
val classlikes = async { descriptorsWithKind.classlikes.visitClasslikes(driWithPlatform) }
230+
val typealiases = async { descriptorsWithKind.typealiases.visitTypealiases() }
230231
val generics = async { descriptor.declaredTypeParameters.parallelMap { it.toVariantTypeParameter() } }
231232

232233
DInterface(
@@ -235,6 +236,7 @@ private class DokkaDescriptorVisitor(
235236
functions = functions.await(),
236237
properties = properties.await(),
237238
classlikes = classlikes.await(),
239+
typealiases = typealiases.await(),
238240
sources = descriptor.createSources(),
239241
expectPresentInSet = sourceSet.takeIf { isExpect },
240242
visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(),
@@ -269,13 +271,15 @@ private class DokkaDescriptorVisitor(
269271
val functions = async { descriptorsWithKind.functions.visitFunctions(driWithPlatform) }
270272
val properties = async { descriptorsWithKind.properties.visitProperties(driWithPlatform) }
271273
val classlikes = async { descriptorsWithKind.classlikes.visitClasslikes(driWithPlatform) }
274+
val typealiases = async { descriptorsWithKind.typealiases.visitTypealiases() }
272275

273276
DObject(
274277
dri = driWithPlatform.dri,
275278
name = descriptor.name.asString(),
276279
functions = functions.await(),
277280
properties = properties.await(),
278281
classlikes = classlikes.await(),
282+
typealiases = typealiases.await(),
279283
sources = descriptor.createSources(),
280284
expectPresentInSet = sourceSet.takeIf { isExpect },
281285
visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(),
@@ -307,6 +311,7 @@ private class DokkaDescriptorVisitor(
307311
val functions = async { descriptorsWithKind.functions.visitFunctions(driWithPlatform) }
308312
val properties = async { descriptorsWithKind.properties.visitProperties(driWithPlatform) }
309313
val classlikes = async { descriptorsWithKind.classlikes.visitClasslikes(driWithPlatform) }
314+
val typealiases = async { descriptorsWithKind.typealiases.visitTypealiases() }
310315
val constructors =
311316
async { descriptor.constructors.parallelMap { visitConstructorDescriptor(it, driWithPlatform) } }
312317
val entries = async { descriptorsWithKind.enumEntries.visitEnumEntries(driWithPlatform) }
@@ -319,6 +324,7 @@ private class DokkaDescriptorVisitor(
319324
functions = functions.await(),
320325
properties = properties.await(),
321326
classlikes = classlikes.await(),
327+
typealiases = typealiases.await(),
322328
sources = descriptor.createSources(),
323329
expectPresentInSet = sourceSet.takeIf { isExpect },
324330
visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(),
@@ -438,6 +444,7 @@ private class DokkaDescriptorVisitor(
438444
val functions = async { regularFunctions.visitFunctions(driWithPlatform) }
439445
val properties = async { descriptorsWithKind.properties.visitProperties(driWithPlatform, accessors) }
440446
val classlikes = async { descriptorsWithKind.classlikes.visitClasslikes(driWithPlatform) }
447+
val typealiases = async { descriptorsWithKind.typealiases.visitTypealiases() }
441448
val generics = async { descriptor.declaredTypeParameters.parallelMap { it.toVariantTypeParameter() } }
442449
val constructors = async {
443450
descriptor.constructors.parallelMap {
@@ -456,6 +463,7 @@ private class DokkaDescriptorVisitor(
456463
functions = functions.await(),
457464
properties = properties.await(),
458465
classlikes = classlikes.await(),
466+
typealiases = typealiases.await(),
459467
sources = actual,
460468
expectPresentInSet = sourceSet.takeIf { isExpect },
461469
visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(),

dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/translators/DefaultSymbolToDocumentableTranslator.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import org.jetbrains.dokka.analysis.kotlin.symbols.kdoc.hasGeneratedKDocDocument
2020
import org.jetbrains.dokka.analysis.kotlin.symbols.translators.AnnotationTranslator.Companion.getPresentableName
2121
import org.jetbrains.dokka.analysis.kotlin.symbols.utils.typeConstructorsBeingExceptions
2222
import org.jetbrains.dokka.links.*
23-
import org.jetbrains.dokka.links.Callable
2423
import org.jetbrains.dokka.model.*
2524
import org.jetbrains.dokka.model.Visibility
2625
import org.jetbrains.dokka.model.doc.*
@@ -189,7 +188,7 @@ internal class DokkaSymbolVisitor(
189188
val isActual = namedClassSymbol.isActual
190189
val documentation = getDocumentation(namedClassSymbol)?.toSourceSetDependent() ?: emptyMap()
191190

192-
val (constructors, functions, properties, classlikesWithoutCompanion) = getDokkaScopeFrom(namedClassSymbol, dri)
191+
val (constructors, functions, properties, classlikesWithoutCompanion, typeAliases) = getDokkaScopeFrom(namedClassSymbol, dri)
193192

194193
val companionObject = namedClassSymbol.companionObject?.let {
195194
visitClassSymbol(
@@ -222,6 +221,7 @@ internal class DokkaSymbolVisitor(
222221
functions = functions,
223222
properties = properties,
224223
classlikes = classlikes,
224+
typealiases = typeAliases,
225225
sources = namedClassSymbol.getSource(),
226226
expectPresentInSet = sourceSet.takeIf { isExpect },
227227
visibility = namedClassSymbol.getDokkaVisibility().toSourceSetDependent(),
@@ -245,6 +245,7 @@ internal class DokkaSymbolVisitor(
245245
functions = functions,
246246
properties = properties,
247247
classlikes = classlikes,
248+
typealiases = typeAliases,
248249
sources = namedClassSymbol.getSource(),
249250
expectPresentInSet = sourceSet.takeIf { isExpect },
250251
visibility = namedClassSymbol.getDokkaVisibility().toSourceSetDependent(),
@@ -269,6 +270,7 @@ internal class DokkaSymbolVisitor(
269270
functions = functions,
270271
properties = properties,
271272
classlikes = classlikes,
273+
typealiases = typeAliases,
272274
sources = namedClassSymbol.getSource(), //
273275
expectPresentInSet = sourceSet.takeIf { isExpect },
274276
visibility = namedClassSymbol.getDokkaVisibility().toSourceSetDependent(),
@@ -343,6 +345,7 @@ internal class DokkaSymbolVisitor(
343345
functions = functions,
344346
properties = properties,
345347
classlikes = classlikes,
348+
typealiases = typeAliases,
346349
sources = namedClassSymbol.getSource(),
347350
expectPresentInSet = sourceSet.takeIf { isExpect },
348351
visibility = namedClassSymbol.getDokkaVisibility().toSourceSetDependent(),
@@ -371,7 +374,8 @@ internal class DokkaSymbolVisitor(
371374
val constructors: List<DFunction>,
372375
val functions: List<DFunction>,
373376
val properties: List<DProperty>,
374-
val classlikesWithoutCompanion: List<DClasslike>
377+
val classlikesWithoutCompanion: List<DClasslike>,
378+
val typeAliases: List<DTypeAlias>,
375379
)
376380

377381
/**
@@ -400,7 +404,10 @@ internal class DokkaSymbolVisitor(
400404

401405
// Dokka K1 does not show inherited nested and inner classes,
402406
// so it should show only classifiers (classes and objects) explicitly declared
403-
val classifiers = if(includeStaticScope) namedClassOrObjectSymbol.staticMemberScope.classifiers else emptySequence()
407+
val classifiers = when {
408+
includeStaticScope -> namedClassOrObjectSymbol.staticMemberScope.classifiers.toList()
409+
else -> emptyList()
410+
}
404411

405412
val syntheticJavaProperties =
406413
namedClassOrObjectSymbol.defaultType.syntheticJavaPropertiesScope?.getCallableSignatures()
@@ -429,21 +436,24 @@ internal class DokkaSymbolVisitor(
429436
syntheticJavaProperties.map { visitPropertySymbol(it, dri) } +
430437
javaFields.map { visitJavaFieldSymbol(it, dri) }
431438

439+
val typealiases = classifiers.filterIsInstance<KaTypeAliasSymbol>()
440+
.map { visitTypeAliasSymbol(it, dri) }
432441

433-
fun Sequence<KaNamedClassSymbol>.filterOutCompanion() =
442+
fun List<KaNamedClassSymbol>.filterOutCompanion() =
434443
filterNot {
435444
it.classKind == KaClassKind.COMPANION_OBJECT
436445
}
437446

438447
val classlikes = classifiers.filterIsInstance<KaNamedClassSymbol>()
439-
.filterOutCompanion() // also, this is a hack to filter out companion for enum
448+
.filterOutCompanion()
440449
.map { visitClassSymbol(it, dri) }
441450

442451
return DokkaScope(
443452
constructors = constructors,
444453
functions = functions,
445454
properties = properties,
446-
classlikesWithoutCompanion = classlikes.toList()
455+
classlikesWithoutCompanion = classlikes,
456+
typeAliases = typealiases,
447457
)
448458
}
449459

0 commit comments

Comments
 (0)