@@ -57,7 +57,7 @@ trait ClassLikeSupport:
57
57
58
58
val graph = HierarchyGraph .withEdges(getSupertypesGraph(classDef, LinkToType (selfSiangture, classDef.symbol.dri, kindForClasslike(classDef.symbol))))
59
59
val baseExtra = PropertyContainer .Companion .empty()
60
- .plus(ClasslikeExtension (classDef.getConstructorMethod, classDef.getCompanion))
60
+ .plus(ClasslikeExtension (classDef.getConstructorMethod() , classDef.getCompanion))
61
61
.plus(MemberExtension (
62
62
classDef.symbol.getVisibility(),
63
63
modifiers,
@@ -112,25 +112,55 @@ trait ClassLikeSupport:
112
112
val target = ExtensionTarget (extSym.symbol.name, extSym.tpt.dokkaType.asSignature, extSym.tpt.symbol.dri)
113
113
parseMethod(dd.symbol, kind = Kind .Extension (target))
114
114
}
115
-
115
+ // TODO check given methods?
116
116
case dd : DefDef if ! dd.symbol.isHiddenByVisibility && dd.symbol.isGiven =>
117
- Some (parseMethod(dd.symbol, kind = Kind .Given (getGivenInstance(dd).map(_.asSignature), None ))) // TODO check given methods?
117
+ Some (dd.symbol.owner.typeMember(dd.name))
118
+ .filterNot(_.exists)
119
+ .map { _ =>
120
+ parseMethod(dd.symbol, kind = Kind .Given (getGivenInstance(dd).map(_.asSignature), None ))
121
+ }
118
122
119
123
case dd : DefDef if ! dd.symbol.isHiddenByVisibility && ! dd.symbol.isGiven && ! dd.symbol.isSyntheticFunc && ! dd.symbol.isExtensionMethod =>
120
124
Some (parseMethod(dd.symbol))
121
125
122
126
case td : TypeDef if ! td.symbol.flags.is(Flags .Synthetic ) && (! td.symbol.flags.is(Flags .Case ) || ! td.symbol.flags.is(Flags .Enum )) =>
123
127
Some (parseTypeDef(td))
124
128
129
+ case vd : ValDef if ! isSyntheticField(vd.symbol)
130
+ && (! vd.symbol.flags.is(Flags .Case ) || ! vd.symbol.flags.is(Flags .Enum ))
131
+ && vd.symbol.isGiven =>
132
+ val classDef = Some (vd.tpt.tpe).flatMap(_.classSymbol.map(_.tree.asInstanceOf [ClassDef ]))
133
+ Some (classDef.filter(_.symbol.flags.is(Flags .ModuleClass )).fold[Member ](parseValDef(vd))(parseGivenClasslike(_)))
134
+
125
135
case vd : ValDef if ! isSyntheticField(vd.symbol) && (! vd.symbol.flags.is(Flags .Case ) || ! vd.symbol.flags.is(Flags .Enum )) =>
126
136
Some (parseValDef(vd))
127
137
138
+ case c : ClassDef if c.symbol.owner.method(c.name).exists(_.flags.is(Flags .Given )) =>
139
+ Some (parseGivenClasslike(c))
140
+
128
141
case c : ClassDef if c.symbol.shouldDocumentClasslike && ! c.symbol.isGiven =>
129
142
Some (parseClasslike(c))
130
143
131
144
case _ => None
132
145
)
133
146
147
+ private def parseGivenClasslike (c : ClassDef ): Member = {
148
+ val parsedClasslike = parseClasslike(c)
149
+ val parentTpe = c.parents(0 ) match {
150
+ case t : TypeTree => Some (t.tpe)
151
+ case _ => None
152
+ }
153
+ val modifiedClasslikeExtension = ClasslikeExtension .getFrom(parsedClasslike).map(_.copy(
154
+ constructor = c.getConstructorMethod(Some (_ => " using " ))
155
+ )
156
+ ).get
157
+ parsedClasslike.withNewExtras(
158
+ parsedClasslike.getExtra.plus(modifiedClasslikeExtension)
159
+ ).withKind(
160
+ Kind .Given (parsedClasslike.directParents.headOption, parentTpe.flatMap(extractImplicitConversion))
161
+ )
162
+ }
163
+
134
164
private def parseInheritedMember (s : Tree ): Option [Member ] = processTreeOpt(s)(s match
135
165
case c : ClassDef if c.symbol.shouldDocumentClasslike && ! c.symbol.isGiven => Some (parseClasslike(c, signatureOnly = true ))
136
166
case other => parseMember(other)
@@ -179,9 +209,9 @@ trait ClassLikeSupport:
179
209
.filterNot(_.isHiddenByVisibility)
180
210
.map(_.dri)
181
211
182
- def getConstructorMethod : Option [DFunction ] =
212
+ def getConstructorMethod ( paramModifierFunc : Option [ Symbol => String ] = None ) : Option [DFunction ] =
183
213
Some (c.constructor.symbol).filter(_.exists).filterNot(_.isHiddenByVisibility).map( d =>
184
- parseMethod(d, constructorWithoutParamLists(c), s => c.getParameterModifier(s))
214
+ parseMethod(d, constructorWithoutParamLists(c), paramModifierFunc.getOrElse( s => c.getParameterModifier(s) ))
185
215
)
186
216
187
217
def parseClasslike (classDef : ClassDef , signatureOnly : Boolean = false )(using ctx : Context ): DClass = classDef match
@@ -239,6 +269,7 @@ trait ClassLikeSupport:
239
269
val name = methodKind match
240
270
case Kind .Constructor => " this"
241
271
case Kind .Given (_, _) => methodSymbol.name.stripPrefix(" given_" )
272
+ case Kind .Extension (_) => methodSymbol.name.stripPrefix(" extension_" )
242
273
case _ => methodSymbol.name
243
274
244
275
new DFunction (
@@ -336,18 +367,10 @@ trait ClassLikeSupport:
336
367
)
337
368
338
369
def parseValDef (valDef : ValDef ): DProperty =
339
- def givenInstance = Some (valDef.symbol.moduleClass)
340
- .filter(_.exists)
341
- .map(_.tree.asInstanceOf [ClassDef ])
342
- .flatMap(_.getParents.headOption)
343
- .map(_.dokkaType.asSignature)
344
-
345
370
def defaultKind = if valDef.symbol.flags.is(Flags .Mutable ) then Kind .Var else Kind .Val
346
- val kind =
347
- if valDef.symbol.isGiven then Kind .Given (givenInstance, extractImplicitConversion(valDef.tpt.tpe))
348
- else if valDef.symbol.flags.is(Flags .Implicit ) then
371
+ val kind = if valDef.symbol.flags.is(Flags .Implicit ) then
349
372
Kind .Implicit (Kind .Val , extractImplicitConversion(valDef.tpt.tpe))
350
- else defaultKind
373
+ else defaultKind
351
374
352
375
new DProperty (
353
376
valDef.symbol.dri,
0 commit comments