Skip to content

Commit 2126c46

Browse files
committed
Refactor MemberInfo (breaks tests)
This commit is only here for the sake of legibility, it breaks tests If you want to come back in the history, go to either the previous commit or the next
1 parent a617c48 commit 2126c46

File tree

1 file changed

+40
-22
lines changed

1 file changed

+40
-22
lines changed

scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import NameNormalizer._
1212
import SyntheticsSupport._
1313
import dotty.tools.dotc.core.NameKinds
1414

15+
// Please use this only for things defined in the api.scala file
16+
import dotty.tools.{scaladoc => api}
17+
1518
trait ClassLikeSupport:
1619
self: TastyParser =>
1720
import qctx.reflect._
@@ -45,7 +48,7 @@ trait ClassLikeSupport:
4548
.filter(s => s.exists && !s.isHiddenByVisibility)
4649
.map( _.tree.asInstanceOf[DefDef])
4750
constr.fold(Nil)(
48-
_.termParamss.map(pList => TermParameterList(pList.params.map(p => mkParameter(p, parameterModifier)), paramListModifier(pList.params)))
51+
_.termParamss.map(pList => api.TermParameterList(pList.params.map(p => mkParameter(p, parameterModifier)), paramListModifier(pList.params)))
4952
)
5053

5154
if classDef.symbol.flags.is(Flags.Module) then Kind.Object
@@ -142,11 +145,12 @@ trait ClassLikeSupport:
142145
dd.symbol.extendedSymbol.map { extSym =>
143146
val memberInfo = unwrapMemberInfo(c, dd.symbol)
144147
val typeParams = dd.symbol.extendedTypeParams.map(mkTypeArgument(_, memberInfo.genericTypes))
145-
val termParams = dd.symbol.extendedTermParamLists.zipWithIndex.flatMap { case (paramList, index) =>
146-
memberInfo.paramLists(index) match
147-
case EvidenceOnlyParameterList => Nil
148-
case info: RegularParameterList =>
149-
Seq(TermParameterList(paramList.params.map(mkParameter(_, memberInfo = info)), paramListModifier(paramList.params)))
148+
val termParams = dd.symbol.extendedTermParamLists.zipWithIndex.flatMap { case (termParamList, index) =>
149+
memberInfo.termParamLists(index) match
150+
case MemberInfo.EvidenceOnlyParameterList => None
151+
case MemberInfo.RegularParameterList(info) =>
152+
Some(api.TermParameterList(termParamList.params.map(mkParameter(_, memberInfo = info)), paramListModifier(termParamList.params)))
153+
case _ => assert(false, "memberInfo.termParamLists contains a type parameter list !")
150154
}
151155
val target = ExtensionTarget(
152156
extSym.symbol.normalizedName,
@@ -349,11 +353,12 @@ trait ClassLikeSupport:
349353
Right(genericTypes.map(mkTypeArgument(_, memberInfo.genericTypes, memberInfo.contextBounds))) +:
350354
paramLists.zipWithIndex.flatMap { (pList, index) =>
351355
memberInfo.paramLists(index) match
352-
case EvidenceOnlyParameterList => None
353-
case info: RegularParameterList =>
356+
case MemberInfo.EvidenceOnlyParameterList => None
357+
case MemberInfo.RegularParameterList(info) =>
354358
Some(Left(TermParameterList(pList.params.map(
355359
mkParameter(_, paramPrefix, memberInfo = info)), paramListModifier(pList.params)
356360
)))
361+
case _ => assert(false, "memberInfo.termParamLists contains a type parameter list !")
357362
}
358363
)
359364

@@ -404,7 +409,7 @@ trait ClassLikeSupport:
404409
val inlinePrefix = if argument.symbol.flags.is(Flags.Inline) then "inline " else ""
405410
val nameIfNotSynthetic = Option.when(!argument.symbol.flags.is(Flags.Synthetic))(argument.symbol.normalizedName)
406411
val name = argument.symbol.normalizedName
407-
TermParameter(
412+
api.TermParameter(
408413
argument.symbol.getAnnotations(),
409414
inlinePrefix + prefix(argument.symbol),
410415
nameIfNotSynthetic,
@@ -514,16 +519,26 @@ trait ClassLikeSupport:
514519
experimental = experimental
515520
)
516521

517-
object EvidenceOnlyParameterList
518-
type RegularParameterList = Map[String, TypeRepr]
519-
type ParameterList = RegularParameterList | EvidenceOnlyParameterList.type
520522

521523
case class MemberInfo(
522-
genericTypes: Map[String, TypeBounds],
523-
paramLists: List[ParameterList],
524+
paramLists: List[MemberInfo.ParameterList],
524525
res: TypeRepr,
525526
contextBounds: Map[String, DSignature] = Map.empty,
526-
)
527+
){
528+
val genericTypes: Map[String, TypeBounds] = paramLists.collect{ case MemberInfo.TypeParameterList(types) => types }.headOption.getOrElse(Map())
529+
530+
val termParamLists: List[MemberInfo.ParameterList] = paramLists.filter(_.isTerm)
531+
}
532+
533+
object MemberInfo:
534+
enum ParameterList(val isTerm: Boolean, val isUsing: Boolean):
535+
inline def isType = !isTerm
536+
case EvidenceOnlyParameterList extends ParameterList(isTerm = true, isUsing = false)
537+
case RegularParameterList(m: Map[String, TypeRepr])(isUsing: Boolean) extends ParameterList(isTerm = true, isUsing)
538+
case TypeParameterList(m: Map[String, TypeBounds]) extends ParameterList(isTerm = false, isUsing = false)
539+
540+
export ParameterList.{RegularParameterList, EvidenceOnlyParameterList, TypeParameterList}
541+
527542

528543

529544
def unwrapMemberInfo(c: ClassDef, symbol: Symbol): MemberInfo =
@@ -541,10 +556,12 @@ trait ClassLikeSupport:
541556
symbol.paramSymss.flatten.find(_.name == name).exists(_.flags.is(Flags.Implicit))
542557

543558
def handlePolyType(memberInfo: MemberInfo, polyType: PolyType): MemberInfo =
544-
MemberInfo(polyType.paramNames.zip(polyType.paramBounds).toMap, memberInfo.paramLists, polyType.resType)
559+
val typeParamList = MemberInfo.TypeParameterList(polyType.paramNames.zip(polyType.paramBounds).toMap)
560+
MemberInfo(memberInfo.paramLists :+ typeParamList, polyType.resType)
545561

546562
def handleMethodType(memberInfo: MemberInfo, methodType: MethodType): MemberInfo =
547563
val rawParams = methodType.paramNames.zip(methodType.paramTypes).toMap
564+
val isUsing = methodType.isImplicit
548565
val (evidences, notEvidences) = rawParams.partition(e => isSyntheticEvidence(e._1))
549566

550567
def findParamRefs(t: TypeRepr): Seq[ParamRef] = t match
@@ -573,22 +590,23 @@ trait ClassLikeSupport:
573590

574591
val newParams = notEvidences ++ paramsThatLookLikeContextBounds
575592

576-
val newLists: List[ParameterList] = if newParams.isEmpty && contextBounds.nonEmpty
577-
then memberInfo.paramLists ++ Seq(EvidenceOnlyParameterList)
578-
else memberInfo.paramLists ++ Seq(newParams)
593+
val termParamList = if newParams.isEmpty && contextBounds.nonEmpty
594+
then MemberInfo.EvidenceOnlyParameterList
595+
else MemberInfo.RegularParameterList(newParams)(isUsing)
596+
579597

580-
MemberInfo(memberInfo.genericTypes, newLists , methodType.resType, contextBounds.toMap)
598+
MemberInfo(memberInfo.paramLists :+ termParamList, methodType.resType, contextBounds.toMap)
581599

582600
def handleByNameType(memberInfo: MemberInfo, byNameType: ByNameType): MemberInfo =
583-
MemberInfo(memberInfo.genericTypes, memberInfo.paramLists, byNameType.underlying)
601+
MemberInfo(memberInfo.paramLists, byNameType.underlying)
584602

585603
def recursivelyCalculateMemberInfo(memberInfo: MemberInfo): MemberInfo = memberInfo.res match
586604
case p: PolyType => recursivelyCalculateMemberInfo(handlePolyType(memberInfo, p))
587605
case m: MethodType => recursivelyCalculateMemberInfo(handleMethodType(memberInfo, m))
588606
case b: ByNameType => handleByNameType(memberInfo, b)
589607
case _ => memberInfo
590608

591-
recursivelyCalculateMemberInfo(MemberInfo(Map.empty, List.empty, baseTypeRepr))
609+
recursivelyCalculateMemberInfo(MemberInfo(List.empty, baseTypeRepr))
592610

593611
private def paramListModifier(parameters: Seq[ValDef]): String =
594612
if parameters.size > 0 then

0 commit comments

Comments
 (0)