diff --git a/scala3doc-testcases/src/tests/fieldsSignatures.scala b/scala3doc-testcases/src/tests/fieldsSignatures.scala index b22ae42ae08a..a8effb63ab0c 100644 --- a/scala3doc-testcases/src/tests/fieldsSignatures.scala +++ b/scala3doc-testcases/src/tests/fieldsSignatures.scala @@ -38,4 +38,4 @@ object Documentation { val valInsideDocObject: Nothing = ??? -} \ No newline at end of file +} diff --git a/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala b/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala index b823d6f6d7d7..b733d8aa81a2 100644 --- a/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala +++ b/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala @@ -61,20 +61,23 @@ trait ClassLikeSupport: modifiers: Seq[Modifier] = classDef.symbol.getExtraModifiers(), ): Member = - // This Try is here because of problem that code compiles, but at runtime fails claiming - // java.lang.ClassCastException: class dotty.tools.dotc.ast.Trees$DefDef cannot be cast to class dotty.tools.dotc.ast.Trees$TypeDef (dotty.tools.dotc.ast.Trees$DefDef and dotty.tools.dotc.ast.Trees$TypeDef are in unnamed module of loader 'app') - // It is probably bug in Tasty - def hackGetParents(classDef: ClassDef): Option[List[Tree]] = scala.util.Try(classDef.parents).toOption - - def getSupertypesGraph(classDef: ClassDef, link: LinkToType): Seq[(LinkToType, LinkToType)] = + def unpackTreeToClassDef(tree: Tree): ClassDef = tree match + case tree: ClassDef => tree + case TypeDef(_, tbt: TypeBoundsTree) => unpackTreeToClassDef(tbt.tpe.typeSymbol.tree) + case TypeDef(_, tt: TypeTree) => unpackTreeToClassDef(tt.tpe.typeSymbol.tree) + case c: Apply => + c.symbol.owner.tree.symbol.tree match + case tree: ClassDef => tree + case tt: TypeTree => unpackTreeToClassDef(tt.tpe.typeSymbol.tree) + + def getSupertypesGraph(classDef: Tree, link: LinkToType): Seq[(LinkToType, LinkToType)] = val smbl = classDef.symbol - val parents = if smbl.exists then hackGetParents(smbl.tree.asInstanceOf[ClassDef]) else None - parents.fold(Seq())(_.flatMap { case tree => - val symbol = if tree.symbol.isClassConstructor then tree.symbol.owner else tree.symbol - val superLink = LinkToType(tree.dokkaType.asSignature, symbol.dri, bareClasslikeKind(symbol)) - Seq(link -> superLink) ++ getSupertypesGraph(tree.asInstanceOf[ClassDef], superLink) - } - ) + val parents = unpackTreeToClassDef(classDef).parents + parents.flatMap { case tree => + val symbol = if tree.symbol.isClassConstructor then tree.symbol.owner else tree.symbol + val superLink = LinkToType(tree.dokkaType.asSignature, symbol.dri, bareClasslikeKind(symbol)) + Seq(link -> superLink) ++ getSupertypesGraph(tree, superLink) + } val supertypes = getSupertypes(using qctx)(classDef).map { case (symbol, tpe) => diff --git a/scala3doc/test/dotty/dokka/diagram/HierarchyTest.scala b/scala3doc/test/dotty/dokka/diagram/HierarchyTest.scala index ae1ba4b80127..15c7723ae77a 100644 --- a/scala3doc/test/dotty/dokka/diagram/HierarchyTest.scala +++ b/scala3doc/test/dotty/dokka/diagram/HierarchyTest.scala @@ -52,21 +52,21 @@ class HierarchyTest extends ScaladocTest("hierarchy"): assertEquals( Set( "Object" -> "Any", - // "A1" -> "Object", // These are not applicable beacuase of bug and its workaround - // "A2[Int]" -> "Object", // More info at ClassLikeSupport.scala:37 - // "A3[Int, String]" -> "Object", - // "B1" -> "Object", - // "B1" -> "A1", - // "B2" -> "Object", - // "B2" -> "A1", - // "B2" -> "A2[Int]", - // "B3" -> "Object", - // "B3" -> "A2[Int]", - // "B3" -> "A3[Int, String]", - // "C1[Int, Boolean, Any]" -> "Object", - // "C1[Int, Boolean, Any]" -> "B1", - // "C1[Int, Boolean, Any]" -> "B2", - // "C1[Int, Boolean, Any]" -> "B3", + "A1" -> "Object", + "A2[Int]" -> "Object", + "A3[Int, String]" -> "Object", + "B1" -> "Object", + "B1" -> "A1", + "B2" -> "Object", + "B2" -> "A1", + "B2" -> "A2[Int]", + "B3" -> "Object", + "B3" -> "A2[Int]", + "B3" -> "A3[Int, String]", + "C1[Int, Boolean, Any]" -> "Object", + "C1[Int, Boolean, Any]" -> "B1", + "C1[Int, Boolean, Any]" -> "B2", + "C1[Int, Boolean, Any]" -> "B3", "Object" -> "Matchable", "Matchable" -> "Any", "E2" -> "D2[Int, Boolean]",