diff --git a/scaladoc-testcases/src/tests/selftypes.scala b/scaladoc-testcases/src/tests/selftypes.scala new file mode 100644 index 000000000000..d28c17a3ea21 --- /dev/null +++ b/scaladoc-testcases/src/tests/selftypes.scala @@ -0,0 +1,14 @@ +package tests.selftypes + +class A: + def a: Unit = ??? + +class C + +class HasAnAndSelfType: + self: A & C => + def b: Unit = ??? + +class HasASelfType: + self: A => + def b: Unit = ??? diff --git a/scaladoc/src/dotty/tools/scaladoc/api.scala b/scaladoc/src/dotty/tools/scaladoc/api.scala index 91f0eb3cc5b4..109d6cfb4e0f 100644 --- a/scaladoc/src/dotty/tools/scaladoc/api.scala +++ b/scaladoc/src/dotty/tools/scaladoc/api.scala @@ -155,6 +155,7 @@ case class Member( members : Seq[Member] = Nil, directParents: Seq[LinkToType] = Nil, parents: Seq[LinkToType] = Nil, + selfType: Option[LinkToType] = None, knownChildren: Seq[LinkToType] = Nil, companion: Option[DRI] = None, deprecated: Option[Annotation] = None, diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala index fc7f4ae0601b..92bdf24f6d36 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala @@ -349,14 +349,22 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext div(link.kind.name," ", link.signature.map(renderElement)) ))) + def selfTypeList(list: List[LinkToType]): Seq[AppliedTag] = + if list.isEmpty then Nil + else Seq(div(cls := "symbol monospace") { list.map { link => + div(link.signature.map(renderElement)) + }}) + val supertypes = signatureList(m.parents) val subtypes = signatureList(m.knownChildren) + val selfType = selfTypeList(m.selfType.toList) renderTabs( singleSelection = true, Tab("Graph", "graph", graphHtml, "showGraph"), Tab("Supertypes", "supertypes", supertypes), Tab("Known subtypes", "subtypes", subtypes), + Tab("Self type", "selftype", selfType) ) private def buildDocumentableFilter = div(cls := "documentableFilter")( diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala index bcc0d1a47039..e97cf6b32983 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala @@ -82,13 +82,18 @@ trait ClassLikeSupport: case (symbol, tpe) => LinkToType(tpe.asSignature, symbol.dri, bareClasslikeKind(symbol)) } - val selfSiangture: DSignature = typeForClass(classDef).asSignature + val selfType = classDef.self.map { (valdef: ValDef) => + val symbol = valdef.symbol + val tpe = valdef.tpt.tpe + LinkToType(tpe.asSignature, symbol.dri, Kind.Type(false, false, Seq.empty)) + } + val selfSignature: DSignature = typeForClass(classDef).asSignature val graph = HierarchyGraph.withEdges( - getSupertypesGraph(classDef, LinkToType(selfSiangture, classDef.symbol.dri, bareClasslikeKind(classDef.symbol))) + getSupertypesGraph(classDef, LinkToType(selfSignature, classDef.symbol.dri, bareClasslikeKind(classDef.symbol))) ) - val baseMember = mkMember(classDef.symbol, kindForClasslike(classDef), selfSiangture)( + val baseMember = mkMember(classDef.symbol, kindForClasslike(classDef), selfSignature)( modifiers = modifiers, graph = graph, deprecated = classDef.symbol.isDeprecated() @@ -226,6 +231,7 @@ trait ClassLikeSupport: members = classDef.extractPatchedMembers.sortBy(m => (m.name, m.kind.name)), directParents = classDef.getParentsAsLinkToTypes, parents = supertypes, + selfType = selfType, companion = classDef.getCompanion ) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/SyntheticSupport.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/SyntheticSupport.scala index d1fc5ed72a32..689c66a200ee 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/SyntheticSupport.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/SyntheticSupport.scala @@ -74,13 +74,7 @@ object SyntheticsSupport: import dotty.tools.dotc given ctx: dotc.core.Contexts.Context = quotes.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx val sym = rsym.asInstanceOf[dotc.core.Symbols.Symbol] - // `lookupPrefix` is private in `QuotesImpl#SymbolMethods` - val lookupPrefix = - if sym.isClass then - sym.thisType - else - sym.namedType - lookupPrefix.allMembers.iterator.map(_.symbol) + sym.namedType.allMembers.iterator.map(_.symbol) .collect { case sym if (!sym.is(dotc.core.Flags.ModuleVal) || sym.is(dotc.core.Flags.Given)) &&