@@ -14,7 +14,7 @@ import ast.tpd._
1414import collection .mutable
1515
1616import dotty .tools .dotc .{semanticdb => s }
17- import Scala3 .{SemanticSymbol , WildcardTypeSymbol , TypeParamRefSymbol }
17+ import Scala3 .{SemanticSymbol , WildcardTypeSymbol , TypeParamRefSymbol , TermParamRefSymbol , RefinementSymbol }
1818
1919class TypeOps :
2020 import SymbolScopeOps ._
@@ -24,31 +24,29 @@ class TypeOps:
2424 given typeOps : TypeOps = this
2525
2626 extension [T <: LambdaType | RefinedType ](symtab : mutable.Map [(T , Name ), Symbol ])
27- private def lookupOrErr (
27+ private def lookup (
2828 binder : T ,
2929 name : Name ,
30- parent : Symbol ,
3130 )(using Context ): Option [Symbol ] =
32- // In case refinement or type param cannot be accessed from traverser and
33- // no symbols are registered to the symbol table, fall back to Type.member
34- val sym = symtab.lookup(binder, name, parent)
35- if sym.exists then
36- Some (sym)
37- else
38- symbolNotFound(binder, name, parent)
39- None
31+ symtab.get((binder, name))
4032
41- private def lookup (
33+ extension [T <: LambdaType ](symtab : mutable.Map [(T , Name ), Symbol ])
34+ private def lookupOrErr (
4235 binder : T ,
4336 name : Name ,
4437 parent : Symbol ,
45- )(using Context ): Symbol =
38+ )(using Context ): Option [ Symbol ] =
4639 // In case refinement or type param cannot be accessed from traverser and
4740 // no symbols are registered to the symbol table, fall back to Type.member
48- symtab.getOrElse(
49- (binder, name),
50- binder.member(name).symbol
51- )
41+ symtab.lookup(binder, name) match
42+ case found @ Some (_) => found
43+ case None =>
44+ val member = binder.member(name).symbol
45+ if ! member.exists then
46+ symbolNotFound(binder, name, parent)
47+ None
48+ else
49+ Some (member)
5250
5351 private def symbolNotFound (binder : Type , name : Name , parent : Symbol )(using ctx : Context ): Unit =
5452 warn(s " Ignoring ${name} of symbol ${parent}, type ${binder}" )
@@ -143,17 +141,21 @@ class TypeOps:
143141 case mp : MethodOrPoly =>
144142 def flatten (
145143 t : Type ,
146- paramss : List [List [Symbol ]],
147- tparams : List [Symbol ]
148- ): (Type , List [List [Symbol ]], List [Symbol ]) = t match {
144+ paramss : List [List [SemanticSymbol ]],
145+ tparams : List [SemanticSymbol ]
146+ ): (Type , List [List [SemanticSymbol ]], List [SemanticSymbol ]) = t match {
149147 case mt : MethodType =>
150- val syms = mt.paramNames.flatMap { paramName =>
151- paramRefSymtab.lookupOrErr(mt, paramName, sym)
148+ val syms : List [SemanticSymbol ] = mt.paramNames.zip(mt.paramInfos).map { (name, info) =>
149+ paramRefSymtab.lookup(mt, name).getOrElse(
150+ TermParamRefSymbol (sym, name, info)
151+ )
152152 }
153153 flatten(mt.resType, paramss :+ syms, tparams)
154154 case pt : PolyType =>
155- val syms = pt.paramNames.flatMap { paramName =>
156- paramRefSymtab.lookupOrErr(pt, paramName, sym)
155+ val syms : List [SemanticSymbol ] = pt.paramNames.zip(pt.paramInfos).map { (name, info) =>
156+ paramRefSymtab.lookup(pt, name).getOrElse(
157+ TypeParamRefSymbol (sym, name, info)
158+ )
157159 }
158160 flatten(pt.resType, paramss, tparams ++ syms)
159161 case other =>
@@ -180,16 +182,14 @@ class TypeOps:
180182 // for `type X[T] = T` is equivalent to `[T] =>> T`
181183 def tparams (tpe : Type ): (Type , List [SemanticSymbol ]) = tpe match {
182184 case lambda : HKTypeLambda =>
183- val paramSyms : List [SemanticSymbol ] = lambda.paramNames.zip(lambda.paramInfos).flatMap { (paramName, bounds) =>
185+ val paramSyms : List [SemanticSymbol ] = lambda.paramNames.zip(lambda.paramInfos).map { (paramName, bounds) =>
184186 // def x[T[_]] = ???
185187 if paramName.isWildcard then
186- Some ( WildcardTypeSymbol (sym, bounds) )
188+ WildcardTypeSymbol (sym, bounds)
187189 else
188- val found = paramRefSymtab.lookup(lambda, paramName, sym)
189- if found.exists then
190- Some (found)
191- else
192- Some (TypeParamRefSymbol (sym, paramName, bounds))
190+ paramRefSymtab.lookup(lambda, paramName).getOrElse(
191+ TypeParamRefSymbol (sym, paramName, bounds)
192+ )
193193 }
194194 (lambda.resType, paramSyms)
195195 case _ => (tpe, Nil )
@@ -239,11 +239,9 @@ class TypeOps:
239239 s.Type .Empty
240240
241241 case tref : TypeParamRef =>
242- val found = paramRefSymtab.lookup(tref.binder, tref.paramName, sym)
243- val tsym =
244- if found.exists then
245- Some (found)
246- else
242+ val tsym = paramRefSymtab.lookup(tref.binder, tref.paramName) match
243+ case found @ Some (sym) => found
244+ case None =>
247245 tref.binder.typeParams.find(param => param.paramName == tref.paramName) match
248246 case Some (param) =>
249247 val info = param.paramInfo
@@ -301,8 +299,10 @@ class TypeOps:
301299 val (parent, refinedInfos) = flatten(rt, List .empty)
302300 val stpe = s.IntersectionType (flattenParent(parent))
303301
304- val decls = refinedInfos.flatMap { (name, info) =>
305- refinementSymtab.lookupOrErr(rt, name, sym)
302+ val decls : List [SemanticSymbol ] = refinedInfos.map { (name, info) =>
303+ refinementSymtab.lookup(rt, name).getOrElse(
304+ RefinementSymbol (name, info)
305+ )
306306 }
307307 val sdecls = decls.sscopeOpt(using LinkMode .HardlinkChildren )
308308 s.StructuralType (stpe, sdecls)
@@ -331,6 +331,10 @@ class TypeOps:
331331 )
332332 s.AnnotatedType (sannots, sparent)
333333
334+ case AppliedType (tycon, args) if tycon == defn.RepeatedParamType && args.length == 1 =>
335+ val stpe = loop(args(0 ))
336+ s.RepeatedType (stpe)
337+
334338 case app @ AppliedType (tycon, args) =>
335339 val targs = args.map { arg =>
336340 arg match
0 commit comments