Skip to content

Commit acc399a

Browse files
committed
Refactor ClassLikeSupports' parseMethod
1 parent df61568 commit acc399a

File tree

3 files changed

+43
-75
lines changed

3 files changed

+43
-75
lines changed

scala3doc-js/src/ux/ux.scala

Lines changed: 0 additions & 52 deletions
This file was deleted.

scala3doc-testcases/src/tests/typeAppliance.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ package tests
22
package typeAppliance
33

44
trait AClass[A, B]:
5-
def fun[C]: AClass[A, C]
5+
def funASD[C, D](f: B => C): AClass[A, C]
66

77
trait BClass[A, B] extends AClass[A, B]:
8-
override def fun[C]: BClass[A, C]
8+
override def funASD[X, D](f: B => X): BClass[A, X]
99

10-
abstract class CClass[B] extends BClass[Int, B]
10+
abstract class CClass[U] extends BClass[Int, U]:
11+
def xdxdkk(n: Int)(b: Int): Int = 1

scala3doc/src/dotty/dokka/tasty/ClassLikeSupport.scala

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ trait ClassLikeSupport:
2727
else Kind.Class(Nil, Nil)
2828

2929
private def kindForClasslike(classDef: ClassDef): Kind =
30-
def typeArgs = classDef.getTypeParams.map(mkTypeArgument)
30+
def typeArgs = classDef.getTypeParams.map(mkTypeArgument(_))
3131

3232
def parameterModifier(parameter: Symbol): String =
3333
val fieldSymbol = classDef.symbol.declaredField(parameter.normalizedName)
@@ -334,9 +334,33 @@ trait ClassLikeSupport:
334334
else method.paramss
335335
val genericTypes = if (methodSymbol.isClassConstructor) Nil else method.typeParams
336336

337+
case class MemberInfo(genericTypes: Map[String, TypeBounds], paramLists: List[Map[String, TypeRepr]], res: TypeRepr)
338+
339+
def unwrapMemberInfo(c: ClassDef, methodSymbol: Symbol): MemberInfo =
340+
val baseTypeRepr = typeForClass(c).asInstanceOf[dotty.tools.dotc.core.Types.Type]
341+
.memberInfo(methodSymbol.asInstanceOf[dotty.tools.dotc.core.Symbols.Symbol])(using qctx.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx)
342+
.asInstanceOf[TypeRepr]
343+
344+
def handlePolyType(polyType: PolyType): MemberInfo =
345+
MemberInfo(polyType.paramNames.zip(polyType.paramBounds).toMap, List.empty, polyType.resType)
346+
347+
def handleMethodType(memberInfo: MemberInfo, methodType: MethodType): MemberInfo =
348+
MemberInfo(memberInfo.genericTypes, memberInfo.paramLists ++ List(methodType.paramNames.zip(methodType.paramTypes).toMap), methodType.resType)
349+
350+
def recursivelyCalculateMemberInfo(memberInfo: MemberInfo): MemberInfo = memberInfo.res match
351+
case p: PolyType => recursivelyCalculateMemberInfo(handlePolyType(p))
352+
case m: MethodType => recursivelyCalculateMemberInfo(handleMethodType(memberInfo, m))
353+
case _ => memberInfo
354+
355+
recursivelyCalculateMemberInfo(MemberInfo(Map.empty, List.empty, baseTypeRepr))
356+
357+
val memberInfo = unwrapMemberInfo(c, methodSymbol)
358+
337359
val basicKind: Kind.Def = Kind.Def(
338-
genericTypes.map(mkTypeArgument),
339-
paramLists.map(pList => ParametersList(pList.map(mkParameter(_, paramPrefix)), if isUsingModifier(pList) then "using " else ""))
360+
genericTypes.map(mkTypeArgument(_, Some(memberInfo.genericTypes))),
361+
paramLists.zipWithIndex.map { (pList, index) =>
362+
ParametersList(pList.map(mkParameter(_, paramPrefix, memberInfo = Some(memberInfo.paramLists(index)))), if isUsingModifier(pList) then "using " else "")
363+
}
340364
)
341365

342366
val methodKind =
@@ -358,12 +382,6 @@ trait ClassLikeSupport:
358382
val origin = if !methodSymbol.isOverriden then Origin.RegularlyDefined else
359383
val overridenSyms = methodSymbol.allOverriddenSymbols.map(_.owner)
360384
Origin.Overrides(overridenSyms.map(s => Overriden(s.name, s.dri)).toSeq)
361-
if(methodSymbol.normalizedName == "fun" && c.symbol.normalizedName == "CClass")
362-
println(method.returnTpt)
363-
println(typeForClass(c).asInstanceOf[dotty.tools.dotc.core.Types.Type]
364-
.memberInfo(methodSymbol.asInstanceOf[dotty.tools.dotc.core.Symbols.Symbol])(using qctx.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx)
365-
)
366-
367385

368386
mkMember(
369387
method.symbol,
@@ -372,7 +390,7 @@ trait ClassLikeSupport:
372390
methodSymbol.getExtraModifiers(),
373391
methodKind,
374392
methodSymbol.getAnnotations(),
375-
method.returnTpt.dokkaType.asSignature,
393+
memberInfo.res.dokkaType.asSignature,
376394
methodSymbol.source(using qctx),
377395
origin
378396
)
@@ -381,32 +399,33 @@ trait ClassLikeSupport:
381399
def mkParameter(argument: ValDef,
382400
prefix: Symbol => String = _ => "",
383401
isExtendedSymbol: Boolean = false,
384-
isGrouped: Boolean = false) =
402+
isGrouped: Boolean = false,
403+
memberInfo: Option[Map[String, TypeRepr]] = None) =
385404
val inlinePrefix = if argument.symbol.flags.is(Flags.Inline) then "inline " else ""
386-
val name = Option.when(!argument.symbol.flags.is(Flags.Synthetic))(argument.symbol.normalizedName)
387-
405+
val nameIfNotSynthetic = Option.when(!argument.symbol.flags.is(Flags.Synthetic))(argument.symbol.normalizedName)
406+
val name = argument.symbol.normalizedName
388407
Parameter(
389408
argument.symbol.getAnnotations(),
390409
inlinePrefix + prefix(argument.symbol),
391-
name,
410+
nameIfNotSynthetic,
392411
argument.symbol.dri,
393-
argument.tpt.dokkaType.asSignature,
412+
memberInfo.flatMap(_.get(name).map(_.dokkaType.asSignature)).getOrElse(argument.tpt.dokkaType.asSignature),
394413
isExtendedSymbol,
395414
isGrouped
396415
)
397416

398-
def mkTypeArgument(argument: TypeDef): TypeParameter =
417+
def mkTypeArgument(argument: TypeDef, memberInfo: Option[Map[String, TypeBounds]] = None): TypeParameter =
399418
val variancePrefix: "+" | "-" | "" =
400419
if argument.symbol.flags.is(Flags.Covariant) then "+"
401420
else if argument.symbol.flags.is(Flags.Contravariant) then "-"
402421
else ""
403-
422+
val name = argument.symbol.normalizedName
404423
TypeParameter(
405424
argument.symbol.getAnnotations(),
406425
variancePrefix,
407-
argument.symbol.normalizedName,
426+
name,
408427
argument.symbol.dri,
409-
argument.rhs.dokkaType.asSignature
428+
memberInfo.flatMap(_.get(name).map(_.dokkaType.asSignature)).getOrElse(argument.rhs.dokkaType.asSignature)
410429
)
411430

412431
def parseTypeDef(typeDef: TypeDef): Member =
@@ -417,7 +436,7 @@ trait ClassLikeSupport:
417436
}
418437

419438
val (generics, tpeTree) = typeDef.rhs match
420-
case LambdaTypeTree(params, body) => (params.map(mkTypeArgument), body)
439+
case LambdaTypeTree(params, body) => (params.map(mkTypeArgument(_)), body)
421440
case tpe => (Nil, tpe)
422441

423442
mkMember(

0 commit comments

Comments
 (0)