diff --git a/scala3doc-testcases/src/tests/deprecated.scala b/scala3doc-testcases/src/tests/deprecated.scala index fc9e785bf9cf..721d30f2b141 100644 --- a/scala3doc-testcases/src/tests/deprecated.scala +++ b/scala3doc-testcases/src/tests/deprecated.scala @@ -1,5 +1,5 @@ package tests -package deprecated +package deprecated class A: def defInt: Int = 1 @@ -17,3 +17,7 @@ class B extends A: @deprecated(since = "1", message = "some reason") def x: Int = 1 val y: Int = 1 + + +@java.lang.Deprecated(since = "1.1") +class JavaDeprecated diff --git a/scala3doc/src/dotty/dokka/model/api/api.scala b/scala3doc/src/dotty/dokka/model/api/api.scala index 2dd31846dbcd..19bc9980c06f 100644 --- a/scala3doc/src/dotty/dokka/model/api/api.scala +++ b/scala3doc/src/dotty/dokka/model/api/api.scala @@ -158,6 +158,7 @@ case class Member( parents: Seq[LinkToType] = Nil, knownChildren: Seq[LinkToType] = Nil, companion: Option[DRI] = None, + deprecated: Option[Annotation] = None, ) object Member: @@ -166,9 +167,6 @@ object Member: extension[T] (member: Member) def asLink: LinkToType = LinkToType(member.signature, member.dri, member.kind) - def deprecated: Option[Annotation] = - member.annotations.find(_.dri.location == "scala.deprecated") - def membersBy(op: Member => Boolean): Seq[Member] = member.members.filter(op) extension (members: Seq[Member]) def byInheritance = diff --git a/scala3doc/src/dotty/dokka/tasty/BasicSupport.scala b/scala3doc/src/dotty/dokka/tasty/BasicSupport.scala index dced432a9da8..28142f256be4 100644 --- a/scala3doc/src/dotty/dokka/tasty/BasicSupport.scala +++ b/scala3doc/src/dotty/dokka/tasty/BasicSupport.scala @@ -44,6 +44,12 @@ trait BasicSupport: def getAnnotations(): List[Annotation] = sym.annotations.filterNot(_.symbol.packageName.startsWith("scala.annotation.internal")).map(parseAnnotation).reverse + def isDeprecated(): Option[Annotation] = + sym.annotations.find { a => + a.symbol.packageName == "scala" && a.symbol.className.contains("deprecated") || + a.symbol.packageName == "java.lang" && a.symbol.className.contains("Deprecated") + }.map(parseAnnotation) + def isLeftAssoc: Boolean = !sym.name.endsWith(":") diff --git a/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala b/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala index 056f50d182fa..9f0acd2d6118 100644 --- a/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala +++ b/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala @@ -82,7 +82,8 @@ trait ClassLikeSupport: val baseMember = mkMember(classDef.symbol, kindForClasslike(classDef), selfSiangture)( modifiers = modifiers, - graph = graph + graph = graph, + deprecated = classDef.symbol.isDeprecated() ) if signatureOnly then baseMember else baseMember.copy( @@ -355,7 +356,7 @@ trait ClassLikeSupport: val overridenSyms = methodSymbol.allOverriddenSymbols.map(_.owner) Origin.Overrides(overridenSyms.map(s => Overriden(s.name, s.dri)).toSeq) - mkMember(method.symbol, methodKind, memberInfo.res.asSignature)(origin = origin) + mkMember(methodSymbol, methodKind, memberInfo.res.asSignature)(origin = origin, deprecated = methodSymbol.isDeprecated()) def mkParameter( argument: ValDef, @@ -402,7 +403,7 @@ trait ClassLikeSupport: case tpe => (Nil, tpe) val kind = Kind.Type(!isTreeAbstract(typeDef.rhs), typeDef.symbol.isOpaque, generics) - mkMember(typeDef.symbol, kind, tpeTree.asSignature)() + mkMember(typeDef.symbol, kind, tpeTree.asSignature)(deprecated = typeDef.symbol.isDeprecated()) def parseValDef(c: ClassDef, valDef: ValDef): Member = def defaultKind = if valDef.symbol.flags.is(Flags.Mutable) then Kind.Var else Kind.Val @@ -411,13 +412,14 @@ trait ClassLikeSupport: Kind.Implicit(Kind.Val, extractImplicitConversion(valDef.tpt.tpe)) else defaultKind - mkMember(valDef.symbol, kind, memberInfo.res.asSignature)() + mkMember(valDef.symbol, kind, memberInfo.res.asSignature)(deprecated = valDef.symbol.isDeprecated()) def mkMember(symbol: Symbol, kind: Kind, signature: DSignature)( modifiers: Seq[dotty.dokka.model.api.Modifier] = symbol.getExtraModifiers(), origin: Origin = Origin.RegularlyDefined, inheritedFrom: Option[InheritedFrom] = None, graph: HierarchyGraph = HierarchyGraph.empty, + deprecated: Option[Annotation] = None, ) = Member( name = symbol.normalizedName, dri = symbol.dri, @@ -430,7 +432,8 @@ trait ClassLikeSupport: origin = origin, inheritedFrom = inheritedFrom, graph = graph, - docs = symbol.documentation + docs = symbol.documentation, + deprecated = deprecated ) case class MemberInfo(genericTypes: Map[String, TypeBounds], paramLists: List[Map[String, TypeRepr]], res: TypeRepr) diff --git a/scala3doc/src/dotty/dokka/translators/ScalaSignatureUtils.scala b/scala3doc/src/dotty/dokka/translators/ScalaSignatureUtils.scala index d1363b2da48a..4f30115f4d67 100644 --- a/scala3doc/src/dotty/dokka/translators/ScalaSignatureUtils.scala +++ b/scala3doc/src/dotty/dokka/translators/ScalaSignatureUtils.scala @@ -52,7 +52,11 @@ trait SignatureBuilder extends ScalaSignatureUtils { private def buildAnnotationParams(a: Annotation): SignatureBuilder = if !a.params.isEmpty then - list(a.params, "(", ")", ", "){ (bdr, param) => bdr.buildAnnotationParameter(param)} + val params = a.params.filterNot { + case Annotation.LinkParameter(_, _, text) => text == "_" + case _ => false + } + list(params, "(", ")", ", "){ (bdr, param) => bdr.buildAnnotationParameter(param)} else this private def addParameterName(txt: Option[String]): SignatureBuilder = txt match { diff --git a/scala3doc/src/dotty/renderers/MemberRenderer.scala b/scala3doc/src/dotty/renderers/MemberRenderer.scala index e33eab4a6742..88ae65d73efc 100644 --- a/scala3doc/src/dotty/renderers/MemberRenderer.scala +++ b/scala3doc/src/dotty/renderers/MemberRenderer.scala @@ -79,15 +79,14 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext case Annotation.UnresolvedParameter(_, value) => stripQuotes(value) val (named, unnamed) = a.params.partition(_.name.nonEmpty) - val message = named.find(_.name.get == "message").orElse(unnamed.headOption) - val since = named.find(_.name.get == "since").orElse(unnamed.drop(1).headOption) - - val content = - since.fold(Nil)(since => - Seq(code("[Since version ", parameter(since), "] ")) ++ - message.fold(Nil)(m => Seq(parameter(m))) ++ - m.docs.fold(Nil)(_.deprecated.toSeq.map(renderDocPart)) - ) + val message = named.find(_.name.get == "message") + val since = named.find(_.name.get == "since") + + val content = Seq( + since.map(s => code("[Since version ", parameter(s), "] ")), + message.map(m => parameter(m)), + m.docs.map(_.deprecated.toSeq.map(renderDocPart)):_* + ).flatten Seq(dt("Deprecated"), dd(content:_*)) } diff --git a/scala3doc/test/dotty/dokka/SignatureTestCases.scala b/scala3doc/test/dotty/dokka/SignatureTestCases.scala index 2538332c1989..c0dfeff88014 100644 --- a/scala3doc/test/dotty/dokka/SignatureTestCases.scala +++ b/scala3doc/test/dotty/dokka/SignatureTestCases.scala @@ -8,7 +8,6 @@ class ObjectSignatures extends SignatureTest("objectSignatures", Seq("object")) class TraitSignatures extends SignatureTest("traitSignatures", Seq("trait")) - // We do not support companion objects properly in tests class ClassSignatureTestSourceTest extends SignatureTest("classSignatureTestSource", SignatureTest.all diff Seq("val", "var", "object"))