@@ -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)
@@ -170,10 +170,10 @@ trait ClassLikeSupport:
170
170
&& (! vd.symbol.flags.is(Flags .Case ) || ! vd.symbol.flags.is(Flags .Enum ))
171
171
&& vd.symbol.isGiven =>
172
172
val classDef = Some (vd.tpt.tpe).flatMap(_.classSymbol.map(_.tree.asInstanceOf [ClassDef ]))
173
- Some (classDef.filter(_.symbol.flags.is(Flags .Module )).fold[Member ](parseValDef(vd))(parseGivenClasslike(_)))
173
+ Some (classDef.filter(_.symbol.flags.is(Flags .Module )).fold[Member ](parseValDef(c, vd))(parseGivenClasslike(_)))
174
174
175
175
case vd : ValDef if ! isSyntheticField(vd.symbol) && (! vd.symbol.flags.is(Flags .Case ) || ! vd.symbol.flags.is(Flags .Enum )) =>
176
- Some (parseValDef(vd))
176
+ Some (parseValDef(c, vd))
177
177
178
178
case c : ClassDef if c.symbol.owner.memberMethod(c.name).exists(_.flags.is(Flags .Given )) =>
179
179
Some (parseGivenClasslike(c))
@@ -299,7 +299,7 @@ trait ClassLikeSupport:
299
299
300
300
val enumVals = companion.membersToDocument.collect {
301
301
case vd : ValDef if ! isSyntheticField(vd.symbol) && vd.symbol.flags.is(Flags .Enum ) && vd.symbol.flags.is(Flags .Case ) => vd
302
- }.toList.map(parseValDef(_))
302
+ }.toList.map(parseValDef(classDef, _))
303
303
304
304
val enumTypes = companion.membersToDocument.collect {
305
305
case td : TypeDef if ! td.symbol.flags.is(Flags .Synthetic ) && td.symbol.flags.is(Flags .Enum ) && td.symbol.flags.is(Flags .Case ) => td
@@ -334,9 +334,13 @@ trait ClassLikeSupport:
334
334
else method.paramss
335
335
val genericTypes = if (methodSymbol.isClassConstructor) Nil else method.typeParams
336
336
337
+ val memberInfo = unwrapMemberInfo(c, methodSymbol)
338
+
337
339
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 " " ))
340
+ genericTypes.map(mkTypeArgument(_, Some (memberInfo.genericTypes))),
341
+ paramLists.zipWithIndex.map { (pList, index) =>
342
+ ParametersList (pList.map(mkParameter(_, paramPrefix, memberInfo = Some (memberInfo.paramLists(index)))), if isUsingModifier(pList) then " using " else " " )
343
+ }
340
344
)
341
345
342
346
val methodKind =
@@ -358,12 +362,6 @@ trait ClassLikeSupport:
358
362
val origin = if ! methodSymbol.isOverriden then Origin .RegularlyDefined else
359
363
val overridenSyms = methodSymbol.allOverriddenSymbols.map(_.owner)
360
364
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
365
368
366
mkMember(
369
367
method.symbol,
@@ -372,7 +370,7 @@ trait ClassLikeSupport:
372
370
methodSymbol.getExtraModifiers(),
373
371
methodKind,
374
372
methodSymbol.getAnnotations(),
375
- method.returnTpt .dokkaType.asSignature,
373
+ memberInfo.res .dokkaType.asSignature,
376
374
methodSymbol.source(using qctx),
377
375
origin
378
376
)
@@ -381,32 +379,33 @@ trait ClassLikeSupport:
381
379
def mkParameter (argument : ValDef ,
382
380
prefix : Symbol => String = _ => " " ,
383
381
isExtendedSymbol : Boolean = false ,
384
- isGrouped : Boolean = false ) =
382
+ isGrouped : Boolean = false ,
383
+ memberInfo : Option [Map [String , TypeRepr ]] = None ) =
385
384
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
-
385
+ val nameIfNotSynthetic = Option .when(! argument.symbol.flags.is(Flags .Synthetic ))(argument.symbol.normalizedName)
386
+ val name = argument.symbol.normalizedName
388
387
Parameter (
389
388
argument.symbol.getAnnotations(),
390
389
inlinePrefix + prefix(argument.symbol),
391
- name ,
390
+ nameIfNotSynthetic ,
392
391
argument.symbol.dri,
393
- argument.tpt.dokkaType.asSignature,
392
+ memberInfo.flatMap(_.get(name).map(_.dokkaType.asSignature)).getOrElse( argument.tpt.dokkaType.asSignature) ,
394
393
isExtendedSymbol,
395
394
isGrouped
396
395
)
397
396
398
- def mkTypeArgument (argument : TypeDef ): TypeParameter =
397
+ def mkTypeArgument (argument : TypeDef , memberInfo : Option [ Map [ String , TypeBounds ]] = None ): TypeParameter =
399
398
val variancePrefix : " +" | " -" | " " =
400
399
if argument.symbol.flags.is(Flags .Covariant ) then " +"
401
400
else if argument.symbol.flags.is(Flags .Contravariant ) then " -"
402
401
else " "
403
-
402
+ val name = argument.symbol.normalizedName
404
403
TypeParameter (
405
404
argument.symbol.getAnnotations(),
406
405
variancePrefix,
407
- argument.symbol.normalizedName ,
406
+ name ,
408
407
argument.symbol.dri,
409
- argument.rhs.dokkaType.asSignature
408
+ memberInfo.flatMap(_.get(name).map(_.dokkaType.asSignature)).getOrElse( argument.rhs.dokkaType.asSignature)
410
409
)
411
410
412
411
def parseTypeDef (typeDef : TypeDef ): Member =
@@ -417,7 +416,7 @@ trait ClassLikeSupport:
417
416
}
418
417
419
418
val (generics, tpeTree) = typeDef.rhs match
420
- case LambdaTypeTree (params, body) => (params.map(mkTypeArgument), body)
419
+ case LambdaTypeTree (params, body) => (params.map(mkTypeArgument(_) ), body)
421
420
case tpe => (Nil , tpe)
422
421
423
422
mkMember(
@@ -432,8 +431,9 @@ trait ClassLikeSupport:
432
431
)
433
432
)
434
433
435
- def parseValDef (valDef : ValDef ): Member =
434
+ def parseValDef (c : ClassDef , valDef : ValDef ): Member =
436
435
def defaultKind = if valDef.symbol.flags.is(Flags .Mutable ) then Kind .Var else Kind .Val
436
+ val memberInfo = unwrapMemberInfo(c, valDef.symbol)
437
437
val kind = if valDef.symbol.flags.is(Flags .Implicit ) then
438
438
Kind .Implicit (Kind .Val , extractImplicitConversion(valDef.tpt.tpe))
439
439
else defaultKind
@@ -445,7 +445,7 @@ trait ClassLikeSupport:
445
445
valDef.symbol.getExtraModifiers(),
446
446
kind,
447
447
valDef.symbol.getAnnotations(),
448
- valDef.tpt.tpe .dokkaType.asSignature,
448
+ memberInfo.res .dokkaType.asSignature,
449
449
valDef.symbol.source(using qctx)
450
450
)
451
451
)
@@ -476,5 +476,29 @@ trait ClassLikeSupport:
476
476
PropertyContainer .Companion .empty().plus(member.copy(rawDoc = symbol.documentation)).plus(compositeExt)
477
477
)
478
478
479
+ case class MemberInfo (genericTypes : Map [String , TypeBounds ], paramLists : List [Map [String , TypeRepr ]], res : TypeRepr )
480
+
481
+ def unwrapMemberInfo (c : ClassDef , symbol : Symbol ): MemberInfo =
482
+ val baseTypeRepr = typeForClass(c).asInstanceOf [dotty.tools.dotc.core.Types .Type ]
483
+ .memberInfo(symbol.asInstanceOf [dotty.tools.dotc.core.Symbols .Symbol ])(using qctx.asInstanceOf [scala.quoted.runtime.impl.QuotesImpl ].ctx)
484
+ .asInstanceOf [TypeRepr ]
485
+
486
+ def handlePolyType (polyType : PolyType ): MemberInfo =
487
+ MemberInfo (polyType.paramNames.zip(polyType.paramBounds).toMap, List .empty, polyType.resType)
488
+
489
+ def handleMethodType (memberInfo : MemberInfo , methodType : MethodType ): MemberInfo =
490
+ MemberInfo (memberInfo.genericTypes, memberInfo.paramLists ++ List (methodType.paramNames.zip(methodType.paramTypes).toMap), methodType.resType)
491
+
492
+ def handleByNameType (memberInfo : MemberInfo , byNameType : ByNameType ): MemberInfo =
493
+ MemberInfo (memberInfo.genericTypes, memberInfo.paramLists, byNameType.underlying)
494
+
495
+ def recursivelyCalculateMemberInfo (memberInfo : MemberInfo ): MemberInfo = memberInfo.res match
496
+ case p : PolyType => recursivelyCalculateMemberInfo(handlePolyType(p))
497
+ case m : MethodType => recursivelyCalculateMemberInfo(handleMethodType(memberInfo, m))
498
+ case b : ByNameType => handleByNameType(memberInfo, b)
499
+ case _ => memberInfo
500
+
501
+ recursivelyCalculateMemberInfo(MemberInfo (Map .empty, List .empty, baseTypeRepr))
502
+
479
503
private def isUsingModifier (parameters : Seq [ValDef ]): Boolean =
480
504
parameters.size > 0 && parameters(0 ).symbol.flags.is(Flags .Given )
0 commit comments