@@ -46,10 +46,20 @@ trait InkuireSupport:
46
46
if typ.isInstanceOf [Inkuire .Type ] then {
47
47
val t = typ.asInstanceOf [Inkuire .Type ]
48
48
val rhsTypeLike = typeDef.rhs.asInkuire(variableNames)
49
- Inkuire .db = Inkuire .db.copy(
50
- typeAliases = Inkuire .db.typeAliases.updated(t.itid.get, rhsTypeLike),
49
+ val withType = Inkuire .db.copy(
51
50
types = Inkuire .db.types.updated(t.itid.get, (t, Seq .empty))
52
51
)
52
+ typeDef.rhs match {
53
+ case TypeBoundsTree (_, r) if r.asInkuire(variableNames).isInstanceOf [Inkuire .Type ] =>
54
+ Inkuire .db = Inkuire .db.copy(
55
+ types = Inkuire .db.types.updated(t.itid.get, (t, Seq (r.asInkuire(variableNames).asInstanceOf [Inkuire .Type ])))
56
+ )
57
+ case _ =>
58
+ Inkuire .db = withType.copy(
59
+ types = Inkuire .db.types.updated(t.itid.get, (t, Seq .empty)),
60
+ typeAliases = Inkuire .db.typeAliases.updated(t.itid.get, rhsTypeLike)
61
+ )
62
+ }
53
63
}
54
64
if typeDef.rhs.symbol.flags.is(Flags .JavaDefined ) then
55
65
val typJava = typeDef.rhs.asInkuire(variableNames)
@@ -70,7 +80,7 @@ trait InkuireSupport:
70
80
classDef.symbol.declaredMethods
71
81
.filter(viableSymbol)
72
82
.tap { _.foreach { // Loop for implicit conversions
73
- case implicitConversion : Symbol if implicitConversion.flags.is(Flags .Implicit ) =>
83
+ case implicitConversion : Symbol if implicitConversion.flags.is(Flags .Implicit ) || implicitConversion.flags.is( Flags . Given ) =>
74
84
handleImplicitConversion(implicitConversion, variableNames)
75
85
case _ =>
76
86
}}
@@ -81,15 +91,15 @@ trait InkuireSupport:
81
91
case TypeDef (name, _) => name
82
92
}
83
93
val vars = variableNames ++ methodVars
84
- val receiver : Option [Inkuire .TypeLike ] =
85
- Some (classType )
86
- .filter(_ => ! isModule )
87
- .orElse(methodSymbol.extendedSymbol.flatMap(s => partialAsInkuire(vars).lift(s.tpt)))
94
+ val ( receiver, preArgs) : ( Option [Inkuire .TypeLike ], Seq [ Inkuire . TypeLike ]) = Some (classType).filter(_ => ! isModule) match {
95
+ case None => (methodSymbol.extendedSymbol.flatMap(s => partialAsInkuire(vars).lift(s.tpt)), Seq .empty )
96
+ case rcvr => (rcvr, methodSymbol.extendedSymbol.flatMap(s => partialAsInkuire(vars).lift(s.tpt)).toSeq )
97
+ }
88
98
val (name, ownerName) = nameAndOwnerName(classDef, methodSymbol)
89
99
val sgn = Inkuire .ExternalSignature (
90
100
signature = Inkuire .Signature (
91
101
receiver = receiver,
92
- arguments = methodSymbol.nonExtensionTermParamLists.collect {
102
+ arguments = preArgs ++ methodSymbol.nonExtensionTermParamLists.collect {
93
103
case tpc@ TermParamClause (params) if ! tpc.isImplicit && ! tpc.isGiven => params // TODO [Inkuire] Implicit parameters
94
104
}.flatten.map(_.tpt.asInkuire(vars)),
95
105
result = defdef.returnTpt.asInkuire(vars),
@@ -147,21 +157,17 @@ trait InkuireSupport:
147
157
case v : ValDef => v.tpt.asInkuire(vars)
148
158
}
149
159
(from, to) match
150
- case (Some ( from) , to : Inkuire .Type ) => Inkuire .db = Inkuire .db.copy( implicitConversions = Inkuire .db. implicitConversions :+ (from -> to) )
160
+ case (from, to : Inkuire .Type ) => Inkuire .implicitConversions = Inkuire .implicitConversions :+ (from -> to)
151
161
case _ =>
152
162
}
153
163
154
164
private def nameAndOwnerName (classDef : ClassDef , symbol : Symbol ): (String , String ) =
155
165
if classDef.symbol.flags.is(Flags .Module ) || Seq (" apply" , " unapply" ).contains(symbol.name) then
156
- (
157
- symbol.maybeOwner.normalizedName + " ." + symbol.name,
166
+ symbol.maybeOwner.normalizedName + " ." + symbol.name ->
158
167
ownerNameChain(classDef.symbol.maybeOwner).mkString(" ." )
159
- )
160
168
else
161
- (
162
- symbol.name,
169
+ symbol.name ->
163
170
ownerNameChain(classDef.symbol).mkString(" ." )
164
- )
165
171
166
172
private def ownerNameChain (sym : Symbol ): List [String ] =
167
173
if sym.isNoSymbol then List .empty
@@ -192,7 +198,7 @@ trait InkuireSupport:
192
198
partialAsInkuire(vars)(tpeTree)
193
199
194
200
private def partialAsInkuire (vars : Set [String ]): PartialFunction [Tree , Inkuire .TypeLike ] = {
195
- case TypeBoundsTree (low, high) => inner(low .tpe, vars) // TODO [Inkuire] Type bounds
201
+ case tpeTree : TypeBoundsTree => inner(tpeTree .tpe, vars)
196
202
case tpeTree : Applied =>
197
203
inner(tpeTree.tpe, vars)
198
204
case tpeTree : TypeTree =>
@@ -285,72 +291,76 @@ trait InkuireSupport:
285
291
case _ => false
286
292
case _ => false
287
293
288
- private def inner (tp : TypeRepr , vars : Set [String ]): Inkuire .TypeLike = tp match
289
- case OrType (left, right) => Inkuire .OrType (inner(left, vars), inner(right, vars))
290
- case AndType (left, right) => Inkuire .AndType (inner(left, vars), inner(right, vars))
291
- case ByNameType (tpe) => inner(tpe, vars)
292
- case ConstantType (constant) =>
293
- Inkuire .Type (
294
- name = Inkuire .TypeName (constant.toString),
295
- params = Seq .empty,
296
- itid = Some (Inkuire .ITID (constant.toString, isParsed = false ))
297
- )
298
- case ThisType (tpe) => inner(tpe, vars)
299
- case AnnotatedType (AppliedType (_, Seq (tpe)), annotation) if isRepeatedAnnotation(annotation) =>
300
- inner(tpe, vars) // TODO [Inkuire] Repeated types
301
- case AppliedType (repeatedClass, Seq (tpe)) if isRepeated(repeatedClass) =>
302
- inner(tpe, vars) // TODO [Inkuire] Repeated types
303
- case AnnotatedType (tpe, _) =>
304
- inner(tpe, vars)
305
- case tl @ TypeLambda (paramNames, _, resType) =>
306
- Inkuire .TypeLambda (paramNames.map(Inkuire .TypeLambda .argument), inner(resType, vars)) // TODO [Inkuire] Type bounds
307
- case r : Refinement =>
308
- inner(r.info, vars) // TODO [Inkuire] Refinements
309
- case t @ AppliedType (tpe, typeList) =>
310
- import dotty .tools .dotc .util .Chars ._
311
- if t.isFunctionType then
312
- val name = s " Function ${typeList.size- 1 }"
294
+ private def inner (tp : TypeRepr , vars : Set [String ]): Inkuire .TypeLike =
295
+ tp match
296
+ case OrType (left, right) => Inkuire .OrType (inner(left, vars), inner(right, vars))
297
+ case AndType (left, right) => Inkuire .AndType (inner(left, vars), inner(right, vars))
298
+ case ByNameType (tpe) => inner(tpe, vars)
299
+ case ConstantType (constant) =>
313
300
Inkuire .Type (
314
- name = Inkuire .TypeName (name ),
315
- params = typeList.init.map(p => Inkuire . Contravariance (inner(p, vars))) :+ Inkuire . Covariance (inner(typeList.last, vars)) ,
316
- itid = Some (Inkuire .ITID (s " ${name} scala. ${name} //[] " , isParsed = false ))
301
+ name = Inkuire .TypeName (constant.toString ),
302
+ params = Seq .empty ,
303
+ itid = Some (Inkuire .ITID (constant.toString , isParsed = false ))
317
304
)
318
- else if t.isTupleN then
319
- val name = s " Tuple ${typeList.size}"
305
+ case ThisType (tpe) => inner(tpe, vars)
306
+ case AnnotatedType (AppliedType (_, Seq (tpe)), annotation) if isRepeatedAnnotation(annotation) =>
307
+ inner(tpe, vars) // TODO [Inkuire] Repeated types
308
+ case AppliedType (repeatedClass, Seq (tpe)) if isRepeated(repeatedClass) =>
309
+ inner(tpe, vars) // TODO [Inkuire] Repeated types
310
+ case AnnotatedType (tpe, _) =>
311
+ inner(tpe, vars)
312
+ case tl @ TypeLambda (paramNames, _, resType) =>
313
+ Inkuire .TypeLambda (paramNames.map(Inkuire .TypeLambda .argument), inner(resType, vars)) // TODO [Inkuire] Type bounds
314
+ case r : Refinement =>
315
+ inner(r.info, vars) // TODO [Inkuire] Refinements
316
+ case t @ AppliedType (tpe, typeList) =>
317
+ import dotty .tools .dotc .util .Chars ._
318
+ if t.isFunctionType then
319
+ val name = s " Function ${typeList.size- 1 }"
320
+ Inkuire .Type (
321
+ name = Inkuire .TypeName (name),
322
+ params = typeList.init.map(p => Inkuire .Contravariance (inner(p, vars))) :+ Inkuire .Covariance (inner(typeList.last, vars)),
323
+ itid = Some (Inkuire .ITID (s " ${name}scala. ${name}//[] " , isParsed = false ))
324
+ )
325
+ else if t.isTupleN then
326
+ val name = s " Tuple ${typeList.size}"
327
+ Inkuire .Type (
328
+ name = Inkuire .TypeName (name),
329
+ params = typeList.map(p => Inkuire .Covariance (inner(p, vars))),
330
+ itid = Some (Inkuire .ITID (s " ${name}scala. ${name}//[] " , isParsed = false ))
331
+ )
332
+ else
333
+ inner(tpe, vars).asInstanceOf [Inkuire .Type ].copy(
334
+ params = typeList.map(p => Inkuire .Invariance (inner(p, vars)))
335
+ )
336
+ case tp : TypeRef =>
337
+ Inkuire .Type (
338
+ name = Inkuire .TypeName (tp.name),
339
+ itid = tp.typeSymbol.itid,
340
+ params = Seq .empty,
341
+ isVariable = vars.contains(tp.name)
342
+ )
343
+ case tr @ TermRef (qual, typeName) =>
344
+ inner(qual, vars)
345
+ case tb@ TypeBounds (low, hi) =>
346
+ if low.typeSymbol != defn.NothingClass || hi.typeSymbol == defn.AnyClass then
347
+ inner(low, vars) // TODO [Inkuire] Type bounds
348
+ else
349
+ inner(hi, vars)
350
+ case NoPrefix () =>
351
+ Inkuire .Type .unresolved // TODO [Inkuire] <- should be handled by Singleton case, but didn't work
352
+ case MatchType (bond, sc, cases) =>
353
+ inner(sc, vars)
354
+ case ParamRef (TypeLambda (names, _, _), i) =>
355
+ Inkuire .TypeLambda .argument(names(i))
356
+ case ParamRef (m : MethodType , i) =>
357
+ inner(m.paramTypes(i), vars)
358
+ case RecursiveType (tp) =>
359
+ inner(tp, vars)
360
+ case m@ MethodType (_, typeList, resType) =>
361
+ val name = s " Function ${typeList.size- 1 }"
320
362
Inkuire .Type (
321
363
name = Inkuire .TypeName (name),
322
- params = typeList.map(p => Inkuire .Covariance (inner(p, vars))),
364
+ params = typeList.map(p => Inkuire .Contravariance (inner(p, vars))) :+ Inkuire . Covariance (inner(resType, vars )),
323
365
itid = Some (Inkuire .ITID (s " ${name}scala. ${name}//[] " , isParsed = false ))
324
366
)
325
- else
326
- inner(tpe, vars).asInstanceOf [Inkuire .Type ].copy(
327
- params = typeList.map(p => Inkuire .Invariance (inner(p, vars)))
328
- )
329
- case tp : TypeRef =>
330
- Inkuire .Type (
331
- name = Inkuire .TypeName (tp.name),
332
- itid = tp.typeSymbol.itid,
333
- params = Seq .empty,
334
- isVariable = vars.contains(tp.name)
335
- )
336
- case tr @ TermRef (qual, typeName) =>
337
- inner(qual, vars)
338
- case TypeBounds (low, hi) =>
339
- inner(low, vars) // TODO [Inkuire] Type bounds
340
- case NoPrefix () =>
341
- Inkuire .Type .unresolved // TODO [Inkuire] <- should be handled by Singleton case, but didn't work
342
- case MatchType (bond, sc, cases) =>
343
- inner(sc, vars)
344
- case ParamRef (TypeLambda (names, _, _), i) =>
345
- Inkuire .TypeLambda .argument(names(i))
346
- case ParamRef (m : MethodType , i) =>
347
- inner(m.paramTypes(i), vars)
348
- case RecursiveType (tp) =>
349
- inner(tp, vars)
350
- case m@ MethodType (_, typeList, resType) =>
351
- val name = s " Function ${typeList.size- 1 }"
352
- Inkuire .Type (
353
- name = Inkuire .TypeName (name),
354
- params = typeList.map(p => Inkuire .Contravariance (inner(p, vars))) :+ Inkuire .Covariance (inner(resType, vars)),
355
- itid = Some (Inkuire .ITID (s " ${name}scala. ${name}//[] " , isParsed = false ))
356
- )
0 commit comments