@@ -14,6 +14,7 @@ import ast.tpd._
14
14
import collection .mutable
15
15
16
16
import dotty .tools .dotc .{semanticdb => s }
17
+ import Scala3 .{SemanticSymbol , WildcardTypeSymbol }
17
18
18
19
class TypeOps :
19
20
import SymbolScopeOps ._
@@ -38,9 +39,9 @@ class TypeOps:
38
39
// e.g. `class HKClass[F <: [T] =>> [U] =>> (U, T)]`
39
40
// and if the binder is HKTypeLambda, fallback to create fake symbol
40
41
case lam : HKTypeLambda =>
41
- lam.paramNames.zip(lam.paramInfos).toMap.get( name) match
42
+ lam.paramNames.zip(lam.paramInfos).find(t => t._1 == name) match
42
43
case Some (info) =>
43
- Some (newSymbol(parent, name, Flags .TypeParam , info))
44
+ Some (newSymbol(parent, name, Flags .TypeParam , info._2 ))
44
45
case None =>
45
46
symbolNotFound(binder, name, parent)
46
47
None
@@ -131,8 +132,9 @@ class TypeOps:
131
132
enterRefined(m.resType)
132
133
case _ => ()
133
134
}
134
- enterParamRef(sym.owner.info)
135
- enterRefined(sym.owner.info)
135
+ if sym.exists && sym.owner.exists then
136
+ enterParamRef(sym.owner.info)
137
+ enterRefined(sym.owner.info)
136
138
137
139
def loop (tpe : Type ): s.Signature = tpe match {
138
140
case mp : MethodOrPoly =>
@@ -173,13 +175,12 @@ class TypeOps:
173
175
174
176
case TypeBounds (lo, hi) =>
175
177
// for `type X[T] = T` is equivalent to `[T] =>> T`
176
- def tparams (tpe : Type ): (Type , List [Symbol ]) = tpe match {
178
+ def tparams (tpe : Type ): (Type , List [SemanticSymbol ]) = tpe match {
177
179
case lambda : HKTypeLambda =>
178
- val paramSyms = lambda.paramNames.zip(lambda.paramInfos).flatMap { (paramName, bounds) =>
180
+ val paramSyms : List [ SemanticSymbol ] = lambda.paramNames.zip(lambda.paramInfos).flatMap { (paramName, bounds) =>
179
181
// def x[T[_]] = ???
180
182
if paramName.isWildcard then
181
- val wildcardSym = newSymbol(NoSymbol , tpnme.WILDCARD , Flags .EmptyFlags , bounds)
182
- Some (wildcardSym)
183
+ Some (WildcardTypeSymbol (bounds))
183
184
else
184
185
paramRefSymtab.getOrErr(lambda, paramName, sym)
185
186
}
@@ -188,10 +189,9 @@ class TypeOps:
188
189
}
189
190
val (loRes, loParams) = tparams(lo)
190
191
val (hiRes, hiParams) = tparams(hi)
191
- val params = (loParams ++ hiParams).distinctBy(_.name)
192
+ val stparams = (loParams ++ hiParams).distinctBy(_.name).sscopeOpt
192
193
val slo = loRes.toSemanticType(sym)
193
194
val shi = hiRes.toSemanticType(sym)
194
- val stparams = params.sscopeOpt
195
195
s.TypeSignature (stparams, slo, shi)
196
196
197
197
case other =>
@@ -320,7 +320,7 @@ class TypeOps:
320
320
// display_name: "_" and,
321
321
// signature: type_signature(..., lo = <Nothing>, hi = <T>)
322
322
case bounds : TypeBounds =>
323
- val wildcardSym = newSymbol( NoSymbol , tpnme. WILDCARD , Flags . EmptyFlags , bounds)
323
+ val wildcardSym = WildcardTypeSymbol ( bounds)
324
324
val ssym = wildcardSym.symbolName
325
325
(Some (wildcardSym), s.TypeRef (s.Type .Empty , ssym, Seq .empty))
326
326
case other =>
@@ -379,8 +379,8 @@ class TypeOps:
379
379
380
380
381
381
object SymbolScopeOps :
382
- import Scala3 .given
383
- extension (syms : List [Symbol ])
382
+ import Scala3 .{ _ , given }
383
+ extension (syms : List [SemanticSymbol ])
384
384
def sscope (using linkMode : LinkMode )(using SemanticSymbolBuilder , TypeOps , Context ): s.Scope =
385
385
linkMode match {
386
386
case LinkMode .SymlinkChildren =>
0 commit comments