Skip to content

Commit a748193

Browse files
committed
Handle local classes: params are abstracted by types
To avoid complicating domains with an environment in Instance, we just abstract parameters by their types inside local classes.
1 parent fea2d1d commit a748193

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

compiler/src/dotty/tools/dotc/transform/init/Objects.scala

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,9 @@ class Objects {
9494
params.zip(args).toMap
9595

9696
extension (env: Env)
97-
def lookup(sym: Symbol)(using Context): Value =
98-
if sym.info <:< defn.StringType
99-
|| sym.info.classSymbol.isPrimitiveValueClass
100-
then
101-
Bottom
102-
else
103-
env(sym)
97+
def lookup(sym: Symbol)(using Context): Value = env(sym)
98+
99+
def getOrElse(sym: Symbol, default: Value)(using Context): Value = env.getOrElse(sym, default)
104100

105101
def union(other: Env): Env = env ++ other
106102
}
@@ -311,14 +307,14 @@ class Objects {
311307
}
312308

313309
def call(meth: Symbol, args: List[Value], superType: Type, source: Tree, needResolve: Boolean = true): Contextual[Result] =
314-
val isLocal = meth.owner.isClass
315310
value match {
316311
case Bottom =>
317312
Result(Bottom, Errors.empty)
318313

319314
case TypeAbs(tp) =>
320315
if meth.isEffectivelyFinal then
321316
if meth.hasSource then
317+
val isLocal = meth.owner.isClass
322318
val ddef = meth.defTree.asInstanceOf[DefDef]
323319
val env2 = Env(ddef, args)
324320
use(if isLocal then env.union(env2) else env2) {
@@ -333,6 +329,7 @@ class Objects {
333329
Result(Bottom, error :: Nil)
334330

335331
case ClassAbs(klass) =>
332+
val isLocal = meth.owner.isClass
336333
val target =
337334
if !needResolve then
338335
meth
@@ -359,6 +356,7 @@ class Objects {
359356
value.select(target, source, needResolve = false)
360357

361358
case addr: Addr =>
359+
val isLocal = meth.owner.isClass
362360
val target =
363361
if !needResolve then
364362
meth
@@ -717,8 +715,7 @@ class Objects {
717715
// - look up parameters from environment
718716
// - evaluate the rhs of the local definition for val definitions: they are already cached
719717
val sym = tmref.symbol
720-
if sym.is(Flags.Param) then Result(env.lookup(sym), Nil)
721-
else if sym.info <:< defn.StringType || sym.info.classSymbol.isPrimitiveValueClass then Result(Bottom, Nil)
718+
if sym.is(Flags.Param) then Result(env.getOrElse(sym, TypeAbs(sym.info)), Nil)
722719
else if sym.is(Flags.Mutable) then Result(TypeAbs(sym.info), Nil)
723720
else if sym.is(Flags.Package) then Result(Bottom, Nil)
724721
else if sym.hasSource then

0 commit comments

Comments
 (0)