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