From 136c07898fce6e192ce064c3f6193d4c49c87f1c Mon Sep 17 00:00:00 2001 From: rochala Date: Tue, 29 Mar 2022 17:15:27 +0200 Subject: [PATCH 01/11] add new heuristic to better split extension methods with implicits --- .../src/tests/extensionParams.scala | 43 ++++++++++++++++--- .../resources/dotty_res/styles/scalastyle.css | 4 ++ scaladoc/src/dotty/tools/scaladoc/api.scala | 2 +- .../scaladoc/renderers/MemberRenderer.scala | 6 +-- .../scaladoc/tasty/ClassLikeSupport.scala | 10 ++--- .../dotty/tools/scaladoc/tasty/SymOps.scala | 39 ++++++++--------- .../ImplicitMembersExtensionTransformer.scala | 2 +- 7 files changed, 66 insertions(+), 40 deletions(-) diff --git a/scaladoc-testcases/src/tests/extensionParams.scala b/scaladoc-testcases/src/tests/extensionParams.scala index 231a8a1fefbf..8122183c2021 100644 --- a/scaladoc-testcases/src/tests/extensionParams.scala +++ b/scaladoc-testcases/src/tests/extensionParams.scala @@ -1,22 +1,51 @@ package tests.extensionParams +trait Animal + extension [A](thiz: A) def toTuple2[B](that: B): (A, B) = thiz -> that extension [A](a: A)(using Int) - def f[B](b: B): (A, B) = ??? + def f1[B](b: B): (A, B) + = ??? extension [A](a: A)(using Int) - def ff(b: A): (A, A) = ??? + def f2(b: A): (A, A) + = ??? extension [A](a: A)(using Int) - def fff(using String)(b: A): (A, A) = ??? + def f3(using String)(b: A): (A, A) + = ??? extension (a: Char)(using Int) - def ffff(using String)(b: Int): Unit = ??? + def f4(using String)(b: Int): Unit + = ??? extension (a: Char)(using Int) - def fffff[B](using String)(b: B): Unit = ??? + def f5[B](using String)(b: B): Unit + = ??? + +extension [A <: List[Char]](a: Int)(using Int) + def f6[B](b: B): (A, B) + = ??? + +extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number) + def f7[B, C](b: B)(c: C): (A, B) + = ??? + +extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number) + def f8(b: Any)(c: Any): Any + = ??? + +extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number) + def f9[B, C](using Int)(b: B)(c: C): (A, B) + = ??? + +extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number) + def f10(using Int)(b: Any)(c: Any): Any = ??? + + def f12(using Int)(b: A)(c: String): Number = ??? -extension [A <: List[Char]](a: A)(using Int) - def ffffff[B](b: B): (A, B) = ??? +extension (using String)(using Unit)(a: Animal)(using Int)(using Number) + def f11(b: Any)(c: Any): Any + = ??? diff --git a/scaladoc/resources/dotty_res/styles/scalastyle.css b/scaladoc/resources/dotty_res/styles/scalastyle.css index 62abf675779f..4b235b89f93a 100644 --- a/scaladoc/resources/dotty_res/styles/scalastyle.css +++ b/scaladoc/resources/dotty_res/styles/scalastyle.css @@ -969,6 +969,10 @@ footer .socials { color: var(--type); } +.groupHeader *[t="t"]:not([href]) { /* Types without links in group headers */ + color: var(--type); +} + .signature *[t="t"] { /* Types with links */ color: var(--type-link); } diff --git a/scaladoc/src/dotty/tools/scaladoc/api.scala b/scaladoc/src/dotty/tools/scaladoc/api.scala index d896c69f690e..7acbd464af98 100644 --- a/scaladoc/src/dotty/tools/scaladoc/api.scala +++ b/scaladoc/src/dotty/tools/scaladoc/api.scala @@ -44,7 +44,7 @@ enum Modifier(val name: String, val prefix: Boolean): case Transparent extends Modifier("transparent", true) case Infix extends Modifier("infix", true) -case class ExtensionTarget(name: String, typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList], signature: Signature, dri: DRI, position: Long) +case class ExtensionTarget(name: String, typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList], dri: DRI, position: Long) case class ImplicitConversion(from: DRI, to: DRI) trait ImplicitConversionProvider { def conversion: Option[ImplicitConversion] } trait Classlike diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala index 75d8ac4ee756..8a0234bd70c9 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala @@ -287,9 +287,9 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext val argsSig = InlineSignatureBuilder() .functionParameters(on.argsLists) .asInstanceOf[InlineSignatureBuilder].names.reverse - val sig = typeSig ++ Signature(Plain(s"(${on.name}: ")) ++ on.signature ++ Signature(Plain(")")) ++ argsSig - MGroup(span(cls := "groupHeader")(sig.map(renderElement)), members.sortBy(_.name).toSeq, on.name) - }.toSeq + val sig = typeSig ++ argsSig + MGroup(span(cls := "groupHeader")(sig.map(renderElement)), members.sortBy(_.name).toSeq, on.name) -> on.position + }.toSeq.sortBy(_._2).map(_._1) div(cls := "membersList")(renderTabs( singleSelection = false, diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala index 3432b2caeea1..edcd8bbb9af6 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala @@ -136,14 +136,13 @@ trait ClassLikeSupport: val termParams = dd.symbol.extendedTermParamLists.zipWithIndex.flatMap { case (paramList, index) => memberInfo.paramLists(index) match case EvidenceOnlyParameterList => Nil - case info: RegularParameterList => + case info: RegularParameterList => Seq(ParametersList(paramList.params.map(mkParameter(_, memberInfo = info)), paramListModifier(paramList.params))) } val target = ExtensionTarget( extSym.symbol.normalizedName, typeParams, termParams, - extSym.tpt.asSignature, extSym.tpt.symbol.dri, extSym.symbol.pos.get.start ) @@ -498,14 +497,13 @@ trait ClassLikeSupport: // Documenting method slightly different then its definition is withing the 'undefiend behaviour'. symbol.paramSymss.flatten.find(_.name == name).exists(_.flags.is(Flags.Implicit)) - def handlePolyType(polyType: PolyType): MemberInfo = - MemberInfo(polyType.paramNames.zip(polyType.paramBounds).toMap, List.empty, polyType.resType) + def handlePolyType(memberInfo: MemberInfo, polyType: PolyType): MemberInfo = + MemberInfo(polyType.paramNames.zip(polyType.paramBounds).toMap, memberInfo.paramLists, polyType.resType) def handleMethodType(memberInfo: MemberInfo, methodType: MethodType): MemberInfo = val rawParams = methodType.paramNames.zip(methodType.paramTypes).toMap val (evidences, notEvidences) = rawParams.partition(e => isSyntheticEvidence(e._1)) - def findParamRefs(t: TypeRepr): Seq[ParamRef] = t match case paramRef: ParamRef => Seq(paramRef) case AppliedType(_, args) => args.flatMap(findParamRefs) @@ -542,7 +540,7 @@ trait ClassLikeSupport: MemberInfo(memberInfo.genericTypes, memberInfo.paramLists, byNameType.underlying) def recursivelyCalculateMemberInfo(memberInfo: MemberInfo): MemberInfo = memberInfo.res match - case p: PolyType => recursivelyCalculateMemberInfo(handlePolyType(p)) + case p: PolyType => recursivelyCalculateMemberInfo(handlePolyType(memberInfo, p)) case m: MethodType => recursivelyCalculateMemberInfo(handleMethodType(memberInfo, m)) case b: ByNameType => handleByNameType(memberInfo, b) case _ => memberInfo diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala index e412475cbf2c..6ecc3da1a691 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala @@ -146,11 +146,19 @@ object SymOps: def extendedSymbol: Option[reflect.ValDef] = import reflect.* - Option.when(sym.isExtensionMethod){ - val termParamss = sym.tree.asInstanceOf[DefDef].termParamss - if sym.isLeftAssoc || termParamss.size == 1 then termParamss(0).params(0) - else termParamss(1).params(0) - } + if sym.isExtensionMethod then + sym.extendedTermParamLists.find(param => !param.isImplicit && !param.isGiven).flatMap(_.params.headOption) + else None + + def splitExtensionParamList: (List[reflect.ParamClause], List[reflect.ParamClause]) = + import reflect.* + val method = sym.tree.asInstanceOf[DefDef] + (for { + defPosition <- method.symbol.pos + defStart <- scala.util.Try(defPosition.start).toOption + } yield { + method.paramss.partition(_.params.headOption.map(_.symbol.pos.get.start < defStart).getOrElse(false)) + }).getOrElse(List.empty, List.empty) def extendedTypeParams: List[reflect.TypeDef] = import reflect.* @@ -159,15 +167,9 @@ object SymOps: def extendedTermParamLists: List[reflect.TermParamClause] = import reflect.* - if sym.nonExtensionLeadingTypeParams.nonEmpty then - sym.nonExtensionParamLists.takeWhile { - case _: TypeParamClause => false - case _ => true - }.collect { - case tpc: TermParamClause => tpc - } - else - List.empty + sym.splitExtensionParamList._1.collect { + case tpc: TermParamClause => tpc + } def nonExtensionTermParamLists: List[reflect.TermParamClause] = import reflect.* @@ -184,14 +186,7 @@ object SymOps: } def nonExtensionParamLists: List[reflect.ParamClause] = - import reflect.* - val method = sym.tree.asInstanceOf[DefDef] - if sym.isExtensionMethod then - val params = method.paramss - val toDrop = if method.leadingTypeParams.nonEmpty then 2 else 1 - if sym.isLeftAssoc || params.size == 1 then params.drop(toDrop) - else params.head :: params.tail.drop(toDrop) - else method.paramss + sym.splitExtensionParamList._2 def nonExtensionLeadingTypeParams: List[reflect.TypeDef] = import reflect.* diff --git a/scaladoc/src/dotty/tools/scaladoc/transformers/ImplicitMembersExtensionTransformer.scala b/scaladoc/src/dotty/tools/scaladoc/transformers/ImplicitMembersExtensionTransformer.scala index 22762cd77683..38822331da39 100644 --- a/scaladoc/src/dotty/tools/scaladoc/transformers/ImplicitMembersExtensionTransformer.scala +++ b/scaladoc/src/dotty/tools/scaladoc/transformers/ImplicitMembersExtensionTransformer.scala @@ -26,7 +26,7 @@ class ImplicitMembersExtensionTransformer(using DocContext) extends(Module => Mo val MyDri = c.dri def collectApplicableMembers(source: Member): Seq[Member] = source.members.flatMap { - case m @ Member(_, _, _, Kind.Extension(ExtensionTarget(_, _, _, _, MyDri, _), _), Origin.RegularlyDefined) => + case m @ Member(_, _, _, Kind.Extension(ExtensionTarget(_, _, _, MyDri, _), _), Origin.RegularlyDefined) => val kind = m.kind match case Kind.Extension(_, d) => d case _ => Kind.Def(Nil, Nil) From d1ca54498081f3721771469c4f486f8754b6c80a Mon Sep 17 00:00:00 2001 From: rochala Date: Tue, 29 Mar 2022 18:06:42 +0200 Subject: [PATCH 02/11] remove trailing whitespace --- scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala index edcd8bbb9af6..4e06ec80ddea 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala @@ -136,7 +136,7 @@ trait ClassLikeSupport: val termParams = dd.symbol.extendedTermParamLists.zipWithIndex.flatMap { case (paramList, index) => memberInfo.paramLists(index) match case EvidenceOnlyParameterList => Nil - case info: RegularParameterList => + case info: RegularParameterList => Seq(ParametersList(paramList.params.map(mkParameter(_, memberInfo = info)), paramListModifier(paramList.params))) } val target = ExtensionTarget( From 22edae864f3cca0f3f9632c1f90fcd8ce07a59e6 Mon Sep 17 00:00:00 2001 From: rochala Date: Tue, 29 Mar 2022 18:33:55 +0200 Subject: [PATCH 03/11] add null safety for Option extraction --- scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala index 6ecc3da1a691..908f4e4347ac 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala @@ -157,7 +157,7 @@ object SymOps: defPosition <- method.symbol.pos defStart <- scala.util.Try(defPosition.start).toOption } yield { - method.paramss.partition(_.params.headOption.map(_.symbol.pos.get.start < defStart).getOrElse(false)) + method.paramss.partition(_.params.headOption.flatMap(_.symbol.pos.map(_.start < defStart)).getOrElse(false)) }).getOrElse(List.empty, List.empty) def extendedTypeParams: List[reflect.TypeDef] = From 349739e07f9e234f9e5c23717b7424fe6d705319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Zyba=C5=82a?= Date: Wed, 30 Mar 2022 10:49:38 +0200 Subject: [PATCH 04/11] Add signature tests to test suite --- .../src/tests/extensionParams.scala | 29 ++++++++++--------- .../TranslatableSignaturesTestCases.scala | 2 ++ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/scaladoc-testcases/src/tests/extensionParams.scala b/scaladoc-testcases/src/tests/extensionParams.scala index 8122183c2021..7892676af2c4 100644 --- a/scaladoc-testcases/src/tests/extensionParams.scala +++ b/scaladoc-testcases/src/tests/extensionParams.scala @@ -3,49 +3,52 @@ package tests.extensionParams trait Animal extension [A](thiz: A) - def toTuple2[B](that: B): (A, B) = thiz -> that + def toTuple2[B](that: B): (A, B) + = thiz -> that extension [A](a: A)(using Int) - def f1[B](b: B): (A, B) + def f1[B](b: B): (A, B) = ??? extension [A](a: A)(using Int) - def f2(b: A): (A, A) + def f2(b: A): (A, A) = ??? extension [A](a: A)(using Int) - def f3(using String)(b: A): (A, A) + def f3(using String)(b: A): (A, A) = ??? extension (a: Char)(using Int) - def f4(using String)(b: Int): Unit + def f4(using String)(b: Int): Unit = ??? extension (a: Char)(using Int) - def f5[B](using String)(b: B): Unit + def f5[B](using String)(b: B): Unit = ??? extension [A <: List[Char]](a: Int)(using Int) - def f6[B](b: B): (A, B) + def f6[B](b: B): (A, B) = ??? extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number) - def f7[B, C](b: B)(c: C): (A, B) + def f7[B, C](b: B)(c: C): (A, B) = ??? extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number) - def f8(b: Any)(c: Any): Any + def f8(b: Any)(c: Any): Any = ??? extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number) - def f9[B, C](using Int)(b: B)(c: C): (A, B) + def f9[B, C](using Int)(b: B)(c: C): (A, B) = ??? extension [A <: List[Char]](using String)(using Unit)(a: A)(using Int)(using Number) - def f10(using Int)(b: Any)(c: Any): Any = ??? + def f10(using Int)(b: Any)(c: Any): Any + = ??? - def f12(using Int)(b: A)(c: String): Number = ??? + def f12(using Int)(b: A)(c: String): Number + = ??? extension (using String)(using Unit)(a: Animal)(using Int)(using Number) - def f11(b: Any)(c: Any): Any + def f11(b: Any)(c: Any): Any = ??? diff --git a/scaladoc/test/dotty/tools/scaladoc/signatures/TranslatableSignaturesTestCases.scala b/scaladoc/test/dotty/tools/scaladoc/signatures/TranslatableSignaturesTestCases.scala index 7da1bb9b7e03..ab7c2189e5d5 100644 --- a/scaladoc/test/dotty/tools/scaladoc/signatures/TranslatableSignaturesTestCases.scala +++ b/scaladoc/test/dotty/tools/scaladoc/signatures/TranslatableSignaturesTestCases.scala @@ -41,6 +41,8 @@ class MergedPackageSignatures extends SignatureTest("mergedPackage", SignatureTe class ExtensionMethodSignature extends SignatureTest("extensionMethodSignatures", SignatureTest.all) +class ExtensionMethodParamsSignature extends SignatureTest("extensionParams", SignatureTest.all) + class ClassModifiers extends SignatureTest("classModifiers", SignatureTest.classlikeKinds) class EnumSignatures extends SignatureTest("enumSignatures", SignatureTest.all) From 2f31cba4ef7cf8e77c6602dae8cba64b27c194f9 Mon Sep 17 00:00:00 2001 From: rochala Date: Wed, 6 Apr 2022 12:46:03 +0200 Subject: [PATCH 05/11] remove Try for assert failure, fix unchecked casts --- .../dotty/tools/scaladoc/tasty/SymOps.scala | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala index 908f4e4347ac..054d912e6eeb 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala @@ -152,23 +152,38 @@ object SymOps: def splitExtensionParamList: (List[reflect.ParamClause], List[reflect.ParamClause]) = import reflect.* - val method = sym.tree.asInstanceOf[DefDef] - (for { - defPosition <- method.symbol.pos - defStart <- scala.util.Try(defPosition.start).toOption - } yield { - method.paramss.partition(_.params.headOption.flatMap(_.symbol.pos.map(_.start < defStart)).getOrElse(false)) - }).getOrElse(List.empty, List.empty) + + def getPositionStartOption(pos: Option[Position]): Option[Int] = pos.flatMap { + case dotty.tools.dotc.util.NoSourcePosition => None + case pos: Position => Some(pos.start) + } + + def comparePositionStarts(posA: Option[Position], posB: Option[Position]): Option[Boolean] = + for { + startA <- getPositionStartOption(posA) + startB <- getPositionStartOption(posB) + } yield { + startA < startB + } + + sym.tree match + case tree: DefDef => + tree.paramss.partition(_.params.headOption.flatMap(param => + comparePositionStarts(param.symbol.pos, tree.symbol.pos)).getOrElse(false) + ) + case _ => Nil -> Nil def extendedTypeParams: List[reflect.TypeDef] = import reflect.* - val method = sym.tree.asInstanceOf[DefDef] - method.leadingTypeParams + sym.tree match + case tree: DefDef => + tree.leadingTypeParams + case _ => Nil def extendedTermParamLists: List[reflect.TermParamClause] = import reflect.* - sym.splitExtensionParamList._1.collect { - case tpc: TermParamClause => tpc + sym.splitExtensionParamList._1.collect { + case tpc: TermParamClause => tpc } def nonExtensionTermParamLists: List[reflect.TermParamClause] = From 567a0d66ee5e9dd0074e187bc2106c1f72889f14 Mon Sep 17 00:00:00 2001 From: rochala Date: Wed, 6 Apr 2022 12:57:51 +0200 Subject: [PATCH 06/11] remove trailing whitespaces --- scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala index 054d912e6eeb..5666d2adb4cb 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala @@ -167,7 +167,7 @@ object SymOps: } sym.tree match - case tree: DefDef => + case tree: DefDef => tree.paramss.partition(_.params.headOption.flatMap(param => comparePositionStarts(param.symbol.pos, tree.symbol.pos)).getOrElse(false) ) @@ -176,7 +176,7 @@ object SymOps: def extendedTypeParams: List[reflect.TypeDef] = import reflect.* sym.tree match - case tree: DefDef => + case tree: DefDef => tree.leadingTypeParams case _ => Nil From 4556c16d9bc658bca6af3fbd9a03937c610068eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Zyba=C5=82a?= Date: Mon, 25 Apr 2022 13:06:02 +0200 Subject: [PATCH 07/11] Filter positions with nonexistent spans --- .../src/scala/quoted/runtime/impl/QuotesImpl.scala | 2 +- .../src/dotty/tools/scaladoc/tasty/SymOps.scala | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala index 30f4dc29aeea..ad4353a90c1c 100644 --- a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala +++ b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala @@ -2514,7 +2514,7 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler def fullName: String = self.denot.fullName.toString def pos: Option[Position] = - if self.exists then Some(self.sourcePos) else None + if self.exists && self.span.exists then Some(self.sourcePos) else None def docstring: Option[String] = import dotc.core.Comments.CommentsContext diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala index 5666d2adb4cb..c0dcd3760854 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala @@ -153,18 +153,11 @@ object SymOps: def splitExtensionParamList: (List[reflect.ParamClause], List[reflect.ParamClause]) = import reflect.* - def getPositionStartOption(pos: Option[Position]): Option[Int] = pos.flatMap { - case dotty.tools.dotc.util.NoSourcePosition => None - case pos: Position => Some(pos.start) - } - def comparePositionStarts(posA: Option[Position], posB: Option[Position]): Option[Boolean] = for { - startA <- getPositionStartOption(posA) - startB <- getPositionStartOption(posB) - } yield { - startA < startB - } + a <- posA + b <- posB + } yield a.start < b.start sym.tree match case tree: DefDef => From d32e4a906de8fc4570f1d3fa2e4740ce726b7daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Zyba=C5=82a?= <48246851+pikinier20@users.noreply.github.com> Date: Thu, 9 Jun 2022 14:21:43 +0200 Subject: [PATCH 08/11] Proper fix of unexisting positions check Co-authored-by: Nicolas Stucki --- compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala index ad4353a90c1c..c27f0655d92e 100644 --- a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala +++ b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala @@ -2514,7 +2514,10 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler def fullName: String = self.denot.fullName.toString def pos: Option[Position] = - if self.exists && self.span.exists then Some(self.sourcePos) else None + if self.exists && !self.lexicallyEnclosingClass.isOneOf(dotc.core.Flags.JavaDefined | dotc.core.Flags.Permanent) then + Some(self.sourcePos) + else + None def docstring: Option[String] = import dotc.core.Comments.CommentsContext From 6cdc381cb5253545e195b86b4df6dda0bab648f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Zyba=C5=82a?= Date: Thu, 9 Jun 2022 15:25:30 +0200 Subject: [PATCH 09/11] Fix signature generation in searchbar data --- .../dotty/tools/scaladoc/renderers/MemberRenderer.scala | 2 +- .../src/dotty/tools/scaladoc/renderers/Resources.scala | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala index 8a0234bd70c9..8042097ce703 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala @@ -30,7 +30,7 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext def inheritedFrom(m: Member) = m.inheritedFrom match case Some(InheritedFrom(name, dri, isSourceSuperclassHidden)) => - val hiddenNameSuffix = if isSourceSuperclassHidden then " (hidden)" else "" + val hiddenNameSuffix = if isSourceSuperclassHidden then " (hidden)" else "" tableRow("Inherited from:", signatureRenderer.renderLink(name + hiddenNameSuffix, dri)) case _ => Nil diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala index e2965d5707ad..aac53537d253 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala @@ -144,7 +144,14 @@ trait Resources(using ctx: DocContext) extends Locations, Writer: def extensionTarget(member: Member): String = member.kind match - case Kind.Extension(on, _) => flattenToText(on.signature) + case Kind.Extension(on, _) => + val typeSig = InlineSignatureBuilder() + .generics(on.typeParams) + .asInstanceOf[InlineSignatureBuilder].names.reverse + val argsSig = InlineSignatureBuilder() + .functionParameters(on.argsLists) + .asInstanceOf[InlineSignatureBuilder].names.reverse + flattenToText(typeSig ++ argsSig) case _ => "" def processPage(page: Page, pageFQName: List[String]): Seq[(JSON, Seq[String])] = From c34bf3476fbabf02bc8d68e759667ed3f2ee794b Mon Sep 17 00:00:00 2001 From: rochala Date: Thu, 18 Aug 2022 18:48:10 +0200 Subject: [PATCH 10/11] revert changes and NoPosition fix --- .../src/scala/quoted/runtime/impl/QuotesImpl.scala | 5 +---- scaladoc/src/dotty/tools/scaladoc/api.scala | 2 +- .../dotty/tools/scaladoc/renderers/Resources.scala | 9 +++++---- .../dotty/tools/scaladoc/tasty/ClassLikeSupport.scala | 1 + scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala | 11 ++++++++--- .../ImplicitMembersExtensionTransformer.scala | 2 +- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala index c27f0655d92e..30f4dc29aeea 100644 --- a/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala +++ b/compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala @@ -2514,10 +2514,7 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler def fullName: String = self.denot.fullName.toString def pos: Option[Position] = - if self.exists && !self.lexicallyEnclosingClass.isOneOf(dotc.core.Flags.JavaDefined | dotc.core.Flags.Permanent) then - Some(self.sourcePos) - else - None + if self.exists then Some(self.sourcePos) else None def docstring: Option[String] = import dotc.core.Comments.CommentsContext diff --git a/scaladoc/src/dotty/tools/scaladoc/api.scala b/scaladoc/src/dotty/tools/scaladoc/api.scala index 64d4d7dd85ec..0beb48a8e8c4 100644 --- a/scaladoc/src/dotty/tools/scaladoc/api.scala +++ b/scaladoc/src/dotty/tools/scaladoc/api.scala @@ -44,7 +44,7 @@ enum Modifier(val name: String, val prefix: Boolean): case Transparent extends Modifier("transparent", true) case Infix extends Modifier("infix", true) -case class ExtensionTarget(name: String, typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList], dri: DRI, position: Long) +case class ExtensionTarget(name: String, typeParams: Seq[TypeParameter], argsLists: Seq[ParametersList], signature: Signature, dri: DRI, position: Long) case class ImplicitConversion(from: DRI, to: DRI) trait ImplicitConversionProvider { def conversion: Option[ImplicitConversion] } trait Classlike: diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala index b3825bd4f153..d42d1ae3c239 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala @@ -167,12 +167,13 @@ trait Resources(using ctx: DocContext) extends Locations, Writer: def extensionTarget(member: Member): String = member.kind match case Kind.Extension(on, _) => - val typeSig = InlineSignatureBuilder() + val typeSig = SignatureBuilder() + .keyword("extension ") .generics(on.typeParams) - .asInstanceOf[InlineSignatureBuilder].names.reverse - val argsSig = InlineSignatureBuilder() + .content + val argsSig = SignatureBuilder() .functionParameters(on.argsLists) - .asInstanceOf[InlineSignatureBuilder].names.reverse + .content flattenToText(typeSig ++ argsSig) case _ => "" diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala index 52497ca0ec41..b383fe8fca5d 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala @@ -151,6 +151,7 @@ trait ClassLikeSupport: extSym.symbol.normalizedName, typeParams, termParams, + extSym.tpt.asSignature, extSym.tpt.symbol.dri, extSym.symbol.pos.get.start ) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala index ad3a81a1c4c4..b4a1fc197d9a 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/SymOps.scala @@ -154,11 +154,16 @@ object SymOps: def splitExtensionParamList: (List[reflect.ParamClause], List[reflect.ParamClause]) = import reflect.* + def getPositionStartOption(pos: Option[Position]): Option[Int] = pos.flatMap { + case dotty.tools.dotc.util.NoSourcePosition => None + case pos: Position => Some(pos.start) + } + def comparePositionStarts(posA: Option[Position], posB: Option[Position]): Option[Boolean] = for { - a <- posA - b <- posB - } yield a.start < b.start + startA <- getPositionStartOption(posA) + startB <- getPositionStartOption(posB) + } yield startA < startB sym.tree match case tree: DefDef => diff --git a/scaladoc/src/dotty/tools/scaladoc/transformers/ImplicitMembersExtensionTransformer.scala b/scaladoc/src/dotty/tools/scaladoc/transformers/ImplicitMembersExtensionTransformer.scala index d5446a2e8db1..44eba3a39807 100644 --- a/scaladoc/src/dotty/tools/scaladoc/transformers/ImplicitMembersExtensionTransformer.scala +++ b/scaladoc/src/dotty/tools/scaladoc/transformers/ImplicitMembersExtensionTransformer.scala @@ -26,7 +26,7 @@ class ImplicitMembersExtensionTransformer(using DocContext) extends(Module => Mo val MyDri = c.dri def collectApplicableMembers(source: Member): Seq[Member] = source.members.flatMap { - case m @ Member(_, _, _, Kind.Extension(ExtensionTarget(_, _, _, MyDri, _), _), Origin.RegularlyDefined) => + case m @ Member(_, _, _, Kind.Extension(ExtensionTarget(_, _, _, _, MyDri, _), _), Origin.RegularlyDefined) => val kind = m.kind match case Kind.Extension(_, d) => d case _ => Kind.Def(Nil, Nil) From 6a122425d03e08f22cbbbdabe06b39677ccd4286 Mon Sep 17 00:00:00 2001 From: rochala Date: Fri, 19 Aug 2022 10:15:49 +0200 Subject: [PATCH 11/11] delete unnecesary css --- scaladoc/resources/dotty_res/styles/scalastyle.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scaladoc/resources/dotty_res/styles/scalastyle.css b/scaladoc/resources/dotty_res/styles/scalastyle.css index 42e5e84a7fd5..a10ee68e2d45 100644 --- a/scaladoc/resources/dotty_res/styles/scalastyle.css +++ b/scaladoc/resources/dotty_res/styles/scalastyle.css @@ -988,10 +988,6 @@ footer .socials { color: var(--type); } -.groupHeader *[t="t"]:not([href]) { /* Types without links in group headers */ - color: var(--type); -} - .signature *[t="t"] { /* Types with links */ color: var(--type-link); }