Skip to content

Commit fa55cc6

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 af70e72 commit fa55cc6

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,
@@ -348,11 +352,12 @@ trait ClassLikeSupport:
348352
Right(genericTypes.map(mkTypeArgument(_, memberInfo.genericTypes, memberInfo.contextBounds))) +:
349353
paramLists.zipWithIndex.flatMap { (pList, index) =>
350354
memberInfo.paramLists(index) match
351-
case EvidenceOnlyParameterList => None
352-
case info: RegularParameterList =>
355+
case MemberInfo.EvidenceOnlyParameterList => None
356+
case MemberInfo.RegularParameterList(info) =>
353357
Some(Left(TermParameterList(pList.params.map(
354358
mkParameter(_, paramPrefix, memberInfo = info)), paramListModifier(pList.params)
355359
)))
360+
case _ => assert(false, "memberInfo.termParamLists contains a type parameter list !")
356361
}
357362
)
358363

@@ -403,7 +408,7 @@ trait ClassLikeSupport:
403408
val inlinePrefix = if argument.symbol.flags.is(Flags.Inline) then "inline " else ""
404409
val nameIfNotSynthetic = Option.when(!argument.symbol.flags.is(Flags.Synthetic))(argument.symbol.normalizedName)
405410
val name = argument.symbol.normalizedName
406-
TermParameter(
411+
api.TermParameter(
407412
argument.symbol.getAnnotations(),
408413
inlinePrefix + prefix(argument.symbol),
409414
nameIfNotSynthetic,
@@ -513,16 +518,26 @@ trait ClassLikeSupport:
513518
experimental = experimental
514519
)
515520

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

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

527542

528543
def unwrapMemberInfo(c: ClassDef, symbol: Symbol): MemberInfo =
@@ -540,10 +555,12 @@ trait ClassLikeSupport:
540555
symbol.paramSymss.flatten.find(_.name == name).exists(_.flags.is(Flags.Implicit))
541556

542557
def handlePolyType(memberInfo: MemberInfo, polyType: PolyType): MemberInfo =
543-
MemberInfo(polyType.paramNames.zip(polyType.paramBounds).toMap, memberInfo.paramLists, polyType.resType)
558+
val typeParamList = MemberInfo.TypeParameterList(polyType.paramNames.zip(polyType.paramBounds).toMap)
559+
MemberInfo(memberInfo.paramLists :+ typeParamList, polyType.resType)
544560

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

549566
def findParamRefs(t: TypeRepr): Seq[ParamRef] = t match
@@ -572,22 +589,23 @@ trait ClassLikeSupport:
572589

573590
val newParams = notEvidences ++ paramsThatLookLikeContextBounds
574591

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

579-
MemberInfo(memberInfo.genericTypes, newLists , methodType.resType, contextBounds.toMap)
597+
MemberInfo(memberInfo.paramLists :+ termParamList, methodType.resType, contextBounds.toMap)
580598

581599
def handleByNameType(memberInfo: MemberInfo, byNameType: ByNameType): MemberInfo =
582-
MemberInfo(memberInfo.genericTypes, memberInfo.paramLists, byNameType.underlying)
600+
MemberInfo(memberInfo.paramLists, byNameType.underlying)
583601

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

590-
recursivelyCalculateMemberInfo(MemberInfo(Map.empty, List.empty, baseTypeRepr))
608+
recursivelyCalculateMemberInfo(MemberInfo(List.empty, baseTypeRepr))
591609

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

0 commit comments

Comments
 (0)