Skip to content

Commit 9766c0f

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 f2aadec commit 9766c0f

File tree

1 file changed

+40
-22
lines changed

1 file changed

+40
-22
lines changed

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

+40-22
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
@@ -141,11 +144,12 @@ trait ClassLikeSupport:
141144
dd.symbol.extendedSymbol.map { extSym =>
142145
val memberInfo = unwrapMemberInfo(c, dd.symbol)
143146
val typeParams = dd.symbol.extendedTypeParams.map(mkTypeArgument(_, memberInfo.genericTypes))
144-
val termParams = dd.symbol.extendedTermParamLists.zipWithIndex.flatMap { case (paramList, index) =>
145-
memberInfo.paramLists(index) match
146-
case EvidenceOnlyParameterList => Nil
147-
case info: RegularParameterList =>
148-
Seq(TermParameterList(paramList.params.map(mkParameter(_, memberInfo = info)), paramListModifier(paramList.params)))
147+
val termParams = dd.symbol.extendedTermParamLists.zipWithIndex.flatMap { case (termParamList, index) =>
148+
memberInfo.termParamLists(index) match
149+
case MemberInfo.EvidenceOnlyParameterList => None
150+
case MemberInfo.RegularParameterList(info) =>
151+
Some(api.TermParameterList(termParamList.params.map(mkParameter(_, memberInfo = info)), paramListModifier(termParamList.params)))
152+
case _ => assert(false, "memberInfo.termParamLists contains a type parameter list !")
149153
}
150154
val target = ExtensionTarget(
151155
extSym.symbol.normalizedName,
@@ -347,11 +351,12 @@ trait ClassLikeSupport:
347351
Right(genericTypes.map(mkTypeArgument(_, memberInfo.genericTypes, memberInfo.contextBounds))) +:
348352
paramLists.zipWithIndex.flatMap { (pList, index) =>
349353
memberInfo.paramLists(index) match
350-
case EvidenceOnlyParameterList => None
351-
case info: RegularParameterList =>
354+
case MemberInfo.EvidenceOnlyParameterList => None
355+
case MemberInfo.RegularParameterList(info) =>
352356
Some(Left(TermParameterList(pList.params.map(
353357
mkParameter(_, paramPrefix, memberInfo = info)), paramListModifier(pList.params)
354358
)))
359+
case _ => assert(false, "memberInfo.termParamLists contains a type parameter list !")
355360
}
356361
)
357362

@@ -393,7 +398,7 @@ trait ClassLikeSupport:
393398
val inlinePrefix = if argument.symbol.flags.is(Flags.Inline) then "inline " else ""
394399
val nameIfNotSynthetic = Option.when(!argument.symbol.flags.is(Flags.Synthetic))(argument.symbol.normalizedName)
395400
val name = argument.symbol.normalizedName
396-
TermParameter(
401+
api.TermParameter(
397402
argument.symbol.getAnnotations(),
398403
inlinePrefix + prefix(argument.symbol),
399404
nameIfNotSynthetic,
@@ -493,16 +498,26 @@ trait ClassLikeSupport:
493498
deprecated = deprecated
494499
)
495500

496-
object EvidenceOnlyParameterList
497-
type RegularParameterList = Map[String, TypeRepr]
498-
type ParameterList = RegularParameterList | EvidenceOnlyParameterList.type
499501

500502
case class MemberInfo(
501-
genericTypes: Map[String, TypeBounds],
502-
paramLists: List[ParameterList],
503+
paramLists: List[MemberInfo.ParameterList],
503504
res: TypeRepr,
504505
contextBounds: Map[String, DSignature] = Map.empty,
505-
)
506+
){
507+
val genericTypes: Map[String, TypeBounds] = paramLists.collect{ case MemberInfo.TypeParameterList(types) => types }.headOption.getOrElse(Map())
508+
509+
val termParamLists: List[MemberInfo.ParameterList] = paramLists.filter(_.isTerm)
510+
}
511+
512+
object MemberInfo:
513+
enum ParameterList(val isTerm: Boolean, val isUsing: Boolean):
514+
inline def isType = !isTerm
515+
case EvidenceOnlyParameterList extends ParameterList(isTerm = true, isUsing = false)
516+
case RegularParameterList(m: Map[String, TypeRepr])(isUsing: Boolean) extends ParameterList(isTerm = true, isUsing)
517+
case TypeParameterList(m: Map[String, TypeBounds]) extends ParameterList(isTerm = false, isUsing = false)
518+
519+
export ParameterList.{RegularParameterList, EvidenceOnlyParameterList, TypeParameterList}
520+
506521

507522

508523
def unwrapMemberInfo(c: ClassDef, symbol: Symbol): MemberInfo =
@@ -520,10 +535,12 @@ trait ClassLikeSupport:
520535
symbol.paramSymss.flatten.find(_.name == name).exists(_.flags.is(Flags.Implicit))
521536

522537
def handlePolyType(memberInfo: MemberInfo, polyType: PolyType): MemberInfo =
523-
MemberInfo(polyType.paramNames.zip(polyType.paramBounds).toMap, memberInfo.paramLists, polyType.resType)
538+
val typeParamList = MemberInfo.TypeParameterList(polyType.paramNames.zip(polyType.paramBounds).toMap)
539+
MemberInfo(memberInfo.paramLists :+ typeParamList, polyType.resType)
524540

525541
def handleMethodType(memberInfo: MemberInfo, methodType: MethodType): MemberInfo =
526542
val rawParams = methodType.paramNames.zip(methodType.paramTypes).toMap
543+
val isUsing = methodType.isImplicit
527544
val (evidences, notEvidences) = rawParams.partition(e => isSyntheticEvidence(e._1))
528545

529546
def findParamRefs(t: TypeRepr): Seq[ParamRef] = t match
@@ -552,22 +569,23 @@ trait ClassLikeSupport:
552569

553570
val newParams = notEvidences ++ paramsThatLookLikeContextBounds
554571

555-
val newLists: List[ParameterList] = if newParams.isEmpty && contextBounds.nonEmpty
556-
then memberInfo.paramLists ++ Seq(EvidenceOnlyParameterList)
557-
else memberInfo.paramLists ++ Seq(newParams)
572+
val termParamList = if newParams.isEmpty && contextBounds.nonEmpty
573+
then MemberInfo.EvidenceOnlyParameterList
574+
else MemberInfo.RegularParameterList(newParams)(isUsing)
575+
558576

559-
MemberInfo(memberInfo.genericTypes, newLists , methodType.resType, contextBounds.toMap)
577+
MemberInfo(memberInfo.paramLists :+ termParamList, methodType.resType, contextBounds.toMap)
560578

561579
def handleByNameType(memberInfo: MemberInfo, byNameType: ByNameType): MemberInfo =
562-
MemberInfo(memberInfo.genericTypes, memberInfo.paramLists, byNameType.underlying)
580+
MemberInfo(memberInfo.paramLists, byNameType.underlying)
563581

564582
def recursivelyCalculateMemberInfo(memberInfo: MemberInfo): MemberInfo = memberInfo.res match
565583
case p: PolyType => recursivelyCalculateMemberInfo(handlePolyType(memberInfo, p))
566584
case m: MethodType => recursivelyCalculateMemberInfo(handleMethodType(memberInfo, m))
567585
case b: ByNameType => handleByNameType(memberInfo, b)
568586
case _ => memberInfo
569587

570-
recursivelyCalculateMemberInfo(MemberInfo(Map.empty, List.empty, baseTypeRepr))
588+
recursivelyCalculateMemberInfo(MemberInfo(List.empty, baseTypeRepr))
571589

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

0 commit comments

Comments
 (0)