From c42e852aa65d25be043f0cf0fbd4dacbcad6649b Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Tue, 15 Dec 2020 10:15:41 +0100 Subject: [PATCH] Add using keyword to scala3doc and hide synthetic names --- scala3doc-testcases/src/tests/using.scala | 16 ++++++++++++++++ scala3doc/src/dotty/dokka/model/api/api.scala | 13 +++++++++---- .../src/dotty/dokka/tasty/ClassLikeSupport.scala | 11 +++++++---- .../dokka/translators/ScalaSignatureUtils.scala | 13 ++++++------- 4 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 scala3doc-testcases/src/tests/using.scala diff --git a/scala3doc-testcases/src/tests/using.scala b/scala3doc-testcases/src/tests/using.scala new file mode 100644 index 000000000000..ff2d6bc8b7e0 --- /dev/null +++ b/scala3doc-testcases/src/tests/using.scala @@ -0,0 +1,16 @@ +package tests +package usings + +class Named +class ClassTag[T] +given ClassTag[Int] = ClassTag[Int] +given ClassTag[String] = ClassTag[String] + +/** ... + * + * @param t: this is an explicit parameter + * @param named: this is an implicit paramter + * @param ClassTag[String]: this is next implicit parameter + */ +def f[T](t: T)(using ClassTag[Int])(using ClassTag[String])(using named: Named)(using ClassTag[T]): Unit = ??? +def f2[T](t: T)(using ClassTag[Int])(using ClassTag[Int], ClassTag[String]): Unit = ??? diff --git a/scala3doc/src/dotty/dokka/model/api/api.scala b/scala3doc/src/dotty/dokka/model/api/api.scala index c08b18cc4e4d..9eb41b8a6366 100644 --- a/scala3doc/src/dotty/dokka/model/api/api.scala +++ b/scala3doc/src/dotty/dokka/model/api/api.scala @@ -56,14 +56,14 @@ trait Classlike enum Kind(val name: String){ case RootPackage extends Kind("") case Package extends Kind("package") - case Class(typeParams: Seq[TypeParameter], argsLists: Seq[Seq[Parameter]]) + case Class(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList]) extends Kind("class") with Classlike case Object extends Kind("object") with Classlike - case Trait(typeParams: Seq[TypeParameter], argsLists: Seq[Seq[Parameter]]) + case Trait(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList]) extends Kind("trait") with Classlike case Enum extends Kind("enum") with Classlike case EnumCase(kind: Object.type | Type | Val.type) extends Kind("case") - case Def(typeParams: Seq[TypeParameter], argsLists: Seq[Seq[Parameter]]) + case Def(typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList]) extends Kind("def") case Extension(on: ExtensionTarget, m: Kind.Def) extends Kind("def") case Constructor(base: Kind.Def) extends Kind("def") @@ -100,10 +100,15 @@ object Annotation: case class LinkParameter(name: Option[String] = None, dri: DRI, value: String) extends AnnotationParameter case class UnresolvedParameter(name: Option[String] = None, unresolvedText: String) extends AnnotationParameter +case class ParametersList( + parameters: Seq[Parameter], + modifiers: String +) + case class Parameter( annotations: Seq[Annotation], modifiers: String, - name: String, + name: Option[String], dri: DRI, signature: Signature, isExtendedSymbol: Boolean = false, diff --git a/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala b/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala index d430b020c068..47f7c8a89faa 100644 --- a/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala +++ b/scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala @@ -45,7 +45,7 @@ trait ClassLikeSupport: .filter(s => s.exists && !s.isHiddenByVisibility) .map( _.tree.asInstanceOf[DefDef]) constr.fold(Nil)( - _.paramss.map(_.map(mkParameter(_, parameterModifier))) + _.paramss.map(pList => ParametersList(pList.map(mkParameter(_, parameterModifier)), if isUsingModifier(pList) then "using " else "")) ) if classDef.symbol.flags.is(Flags.Module) then Kind.Object @@ -335,7 +335,7 @@ trait ClassLikeSupport: val basicKind: Kind.Def = Kind.Def( genericTypes.map(mkTypeArgument), - paramLists.map(_.map(mkParameter(_, paramPrefix))) + paramLists.map(pList => ParametersList(pList.map(mkParameter(_, paramPrefix)), if isUsingModifier(pList) then "using " else "")) ) val methodKind = @@ -376,12 +376,12 @@ trait ClassLikeSupport: isExtendedSymbol: Boolean = false, isGrouped: Boolean = false) = val inlinePrefix = if argument.symbol.flags.is(Flags.Inline) then "inline " else "" - // TODO (https://github.com/lampepfl/dotty/issues/10525): Add using flag + val name = Option.when(!argument.symbol.flags.is(Flags.Synthetic))(argument.symbol.normalizedName) Parameter( argument.symbol.getAnnotations(), inlinePrefix + prefix(argument.symbol), - argument.symbol.normalizedName, + name, argument.symbol.dri, argument.tpt.dokkaType.asSignature, isExtendedSymbol, @@ -467,3 +467,6 @@ trait ClassLikeSupport: /*isExpectActual =*/ false, PropertyContainer.Companion.empty().plus(member.copy(rawDoc = symbol.documentation2)).plus(compositeExt) ) + + private def isUsingModifier(parameters: Seq[ValDef]): Boolean = + parameters.size > 0 && parameters(0).symbol.flags.is(Flags.Given) diff --git a/scala3doc/src/dotty/dokka/translators/ScalaSignatureUtils.scala b/scala3doc/src/dotty/dokka/translators/ScalaSignatureUtils.scala index b4969ab18b16..b280e7aa2e74 100644 --- a/scala3doc/src/dotty/dokka/translators/ScalaSignatureUtils.scala +++ b/scala3doc/src/dotty/dokka/translators/ScalaSignatureUtils.scala @@ -80,16 +80,15 @@ trait SignatureBuilder extends ScalaSignatureUtils { bdr.text(e.variance).memberName(e.name, e.dri).signature(e.signature) } - def functionParameters(params: Seq[Seq[Parameter]]) = + def functionParameters(params: Seq[ParametersList]) = if params.isEmpty then this.text("") - else if params == List(Nil) then this.text("()") + else if params.size == 1 && params(0).parameters == Nil then this.text("()") else this.list(params, separator = ""){ (bld, pList) => - bld.list(pList, "(", ")"){ (bld, p) => - bld.annotationsInline(p) + bld.list(pList.parameters, s"(${pList.modifiers}", ")"){ (bld, p) => + val annotationsAndModifiers = bld.annotationsInline(p) .text(p.modifiers) - .memberName(p.name, p.dri) - .text(": ") - .signature(p.signature) + val name = p.name.fold(annotationsAndModifiers)(annotationsAndModifiers.memberName(_, p.dri).text(": ")) + name.signature(p.signature) } } }