@@ -27,7 +27,7 @@ trait ClassLikeSupport:
27
27
else Kind .Class (Nil , Nil )
28
28
29
29
private def kindForClasslike (classDef : ClassDef ): Kind =
30
- def typeArgs = classDef.getTypeParams.map(mkTypeArgument)
30
+ def typeArgs = classDef.getTypeParams.map(mkTypeArgument(_) )
31
31
32
32
def parameterModifier (parameter : Symbol ): String =
33
33
val fieldSymbol = classDef.symbol.declaredField(parameter.normalizedName)
@@ -334,9 +334,33 @@ trait ClassLikeSupport:
334
334
else method.paramss
335
335
val genericTypes = if (methodSymbol.isClassConstructor) Nil else method.typeParams
336
336
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
+
337
359
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
+ }
340
364
)
341
365
342
366
val methodKind =
@@ -358,12 +382,6 @@ trait ClassLikeSupport:
358
382
val origin = if ! methodSymbol.isOverriden then Origin .RegularlyDefined else
359
383
val overridenSyms = methodSymbol.allOverriddenSymbols.map(_.owner)
360
384
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
-
367
385
368
386
mkMember(
369
387
method.symbol,
@@ -372,7 +390,7 @@ trait ClassLikeSupport:
372
390
methodSymbol.getExtraModifiers(),
373
391
methodKind,
374
392
methodSymbol.getAnnotations(),
375
- method.returnTpt .dokkaType.asSignature,
393
+ memberInfo.res .dokkaType.asSignature,
376
394
methodSymbol.source(using qctx),
377
395
origin
378
396
)
@@ -381,32 +399,33 @@ trait ClassLikeSupport:
381
399
def mkParameter (argument : ValDef ,
382
400
prefix : Symbol => String = _ => " " ,
383
401
isExtendedSymbol : Boolean = false ,
384
- isGrouped : Boolean = false ) =
402
+ isGrouped : Boolean = false ,
403
+ memberInfo : Option [Map [String , TypeRepr ]] = None ) =
385
404
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
388
407
Parameter (
389
408
argument.symbol.getAnnotations(),
390
409
inlinePrefix + prefix(argument.symbol),
391
- name ,
410
+ nameIfNotSynthetic ,
392
411
argument.symbol.dri,
393
- argument.tpt.dokkaType.asSignature,
412
+ memberInfo.flatMap(_.get(name).map(_.dokkaType.asSignature)).getOrElse( argument.tpt.dokkaType.asSignature) ,
394
413
isExtendedSymbol,
395
414
isGrouped
396
415
)
397
416
398
- def mkTypeArgument (argument : TypeDef ): TypeParameter =
417
+ def mkTypeArgument (argument : TypeDef , memberInfo : Option [ Map [ String , TypeBounds ]] = None ): TypeParameter =
399
418
val variancePrefix : " +" | " -" | " " =
400
419
if argument.symbol.flags.is(Flags .Covariant ) then " +"
401
420
else if argument.symbol.flags.is(Flags .Contravariant ) then " -"
402
421
else " "
403
-
422
+ val name = argument.symbol.normalizedName
404
423
TypeParameter (
405
424
argument.symbol.getAnnotations(),
406
425
variancePrefix,
407
- argument.symbol.normalizedName ,
426
+ name ,
408
427
argument.symbol.dri,
409
- argument.rhs.dokkaType.asSignature
428
+ memberInfo.flatMap(_.get(name).map(_.dokkaType.asSignature)).getOrElse( argument.rhs.dokkaType.asSignature)
410
429
)
411
430
412
431
def parseTypeDef (typeDef : TypeDef ): Member =
@@ -417,7 +436,7 @@ trait ClassLikeSupport:
417
436
}
418
437
419
438
val (generics, tpeTree) = typeDef.rhs match
420
- case LambdaTypeTree (params, body) => (params.map(mkTypeArgument), body)
439
+ case LambdaTypeTree (params, body) => (params.map(mkTypeArgument(_) ), body)
421
440
case tpe => (Nil , tpe)
422
441
423
442
mkMember(
0 commit comments