@@ -37,10 +37,10 @@ sealed abstract class Block extends Product with AutoLocated:
37
37
case AssignField (lhs : Path , nme : Tree .Ident , rhs : Result , rest : Block ) => lhs :: nme :: rhs :: rest :: Nil
38
38
case AssignDynField (lhs, fld, arrayIdx, rhs, rest) => lhs :: fld :: rhs :: rest :: Nil
39
39
case Define (FunDefn (owner, sym, params, body), rest) => sym :: (params :+ body :+ rest)
40
- case Define (ValDefn (owner, k, sym, rhs), rest) => sym :: rhs :: rest :: Nil
40
+ case Define (ValDefn (tsym, sym, rhs), rest) => tsym :: sym :: rhs :: rest :: Nil
41
41
case Define (ClsLikeDefn (owner, isym, sym, k, paramsOpt, aux, parentSym, methods, privFlds, pubFlds, preCtor, ctor), rest) =>
42
- isym :: sym :: paramsOpt.toList ++ aux ++ parentSym.toList ++ methods.flatMap(_.subBlocks) ++ privFlds ++ pubFlds
43
- ++ preCtor.subBlocks ++ ctor.subBlocks :+ rest
42
+ isym :: sym :: paramsOpt.toList ++ aux ++ parentSym.toList ++ methods.flatMap(_.subBlocks) ++
43
+ privFlds ++ pubFlds.flatMap(f => f._1 :: f._2 :: Nil ) ++ preCtor.subBlocks ++ ctor.subBlocks :+ rest
44
44
case HandleBlock (lhs, res, par, args, cls, handlers, body, rest) =>
45
45
lhs :: res :: par :: args ++ handlers.flatMap: handler =>
46
46
handler.sym :: handler.resumeSym :: (handler.params :+ handler.body)
@@ -328,7 +328,7 @@ sealed abstract class Defn:
328
328
// * in the type system.
329
329
lazy val freeVars : Set [Local ] = this match
330
330
case FunDefn (own, sym, params, body) => body.freeVars -- params.flatMap(_.paramSyms) - sym
331
- case ValDefn (owner, k , sym, rhs) => rhs.freeVars
331
+ case ValDefn (tsym , sym, rhs) => rhs.freeVars
332
332
case ClsLikeDefn (own, isym, sym, k, paramsOpt, auxParams, parentSym,
333
333
methods, privateFields, publicFields, preCtor, ctor) =>
334
334
preCtor.freeVars
@@ -337,7 +337,7 @@ sealed abstract class Defn:
337
337
338
338
lazy val freeVarsLLIR : Set [Local ] = this match
339
339
case FunDefn (own, sym, params, body) => body.freeVarsLLIR -- params.flatMap(_.paramSyms) - sym
340
- case ValDefn (owner, k , sym, rhs) => rhs.freeVarsLLIR
340
+ case ValDefn (tsym , sym, rhs) => rhs.freeVarsLLIR
341
341
case ClsLikeDefn (own, isym, sym, k, paramsOpt, auxParams, parentSym,
342
342
methods, privateFields, publicFields, preCtor, ctor) =>
343
343
preCtor.freeVarsLLIR
@@ -353,12 +353,23 @@ final case class FunDefn(
353
353
val innerSym = N
354
354
355
355
final case class ValDefn (
356
- owner : Opt [InnerSymbol ],
357
- k : syntax.Val ,
356
+ tsym : TermSymbol ,
358
357
sym : BlockMemberSymbol ,
359
358
rhs : Path ,
360
359
) extends Defn :
361
- val innerSym = N
360
+ val innerSym = S (tsym)
361
+ val k = tsym.k
362
+ val owner : Opt [InnerSymbol ] = tsym.owner
363
+
364
+ object ValDefn :
365
+ def mk (
366
+ owner : Opt [InnerSymbol ],
367
+ k : syntax.Val ,
368
+ sym : BlockMemberSymbol ,
369
+ rhs : Path ,
370
+ )(using State )
371
+ : ValDefn =
372
+ ValDefn (tsym = TermSymbol (k, owner, Tree .Ident (sym.nme)), sym = sym, rhs = rhs)
362
373
363
374
/*
364
375
This explains the difference between paramsOpt, auxParams, privateFields and publicFields.
@@ -402,7 +413,7 @@ final case class ClsLikeDefn(
402
413
parentPath : Opt [Path ],
403
414
methods : Ls [FunDefn ],
404
415
privateFields : Ls [TermSymbol ],
405
- publicFields : Ls [BlockMemberSymbol ],
416
+ publicFields : Ls [BlockMemberSymbol -> TermSymbol ],
406
417
preCtor : Block ,
407
418
ctor : Block ,
408
419
) extends Defn :
@@ -448,41 +459,41 @@ sealed abstract class Result extends AutoLocated:
448
459
449
460
protected def children : List [Located ] = this match
450
461
case Call (fun, args) => fun :: args.map(_.value)
451
- case Instantiate (cls, args) => cls :: args
462
+ case Instantiate (mut, cls, args) => cls :: args
452
463
case Select (qual, name) => qual :: name :: Nil
453
464
case DynSelect (qual, fld, arrayIdx) => qual :: fld :: Nil
454
465
case Value .Ref (l) => Nil
455
466
case Value .This (sym) => Nil
456
467
case Value .Lit (lit) => lit :: Nil
457
468
case Value .Lam (params, body) => params :: body :: Nil
458
- case Value .Arr (elems) => elems.map(_.value)
459
- case Value .Rcd (elems) => elems.map(_.value)
469
+ case Value .Arr (mut, elems) => elems.map(_.value)
470
+ case Value .Rcd (mut, elems) => elems.map(_.value)
460
471
461
472
// TODO rm Lam from values and thus the need for this method
462
473
def subBlocks : Ls [Block ] = this match
463
474
case Call (fun, args) => fun.subBlocks ::: args.flatMap(_.value.subBlocks)
464
- case Instantiate (cls, args) => args.flatMap(_.subBlocks)
475
+ case Instantiate (mut, cls, args) => args.flatMap(_.subBlocks)
465
476
case Select (qual, name) => qual.subBlocks
466
477
case Value .Lam (params, body) => body :: Nil
467
- case Value .Arr (elems) => elems.flatMap(_.value.subBlocks)
478
+ case Value .Arr (mut, elems) => elems.flatMap(_.value.subBlocks)
468
479
case _ => Nil
469
480
470
481
lazy val freeVars : Set [Local ] = this match
471
482
case Call (fun, args) => fun.freeVars ++ args.flatMap(_.value.freeVars).toSet
472
- case Instantiate (cls, args) => cls.freeVars ++ args.flatMap(_.freeVars).toSet
483
+ case Instantiate (mut, cls, args) => cls.freeVars ++ args.flatMap(_.freeVars).toSet
473
484
case Select (qual, name) => qual.freeVars
474
485
case Value .Ref (l) => Set (l)
475
486
case Value .This (sym) => Set .empty
476
487
case Value .Lit (lit) => Set .empty
477
488
case Value .Lam (params, body) => body.freeVars -- params.paramSyms
478
- case Value .Arr (elems) => elems.flatMap(_.value.freeVars).toSet
479
- case Value .Rcd (elems) => elems.flatMap(_.value.freeVars).toSet
489
+ case Value .Arr (mut, elems) => elems.flatMap(_.value.freeVars).toSet
490
+ case Value .Rcd (mut, args) =>
491
+ args.flatMap(arg => arg.idx.fold(Set .empty)(_.freeVars) ++ arg.value.freeVars).toSet
480
492
case DynSelect (qual, fld, arrayIdx) => qual.freeVars ++ fld.freeVars
481
- case Value .Rcd (args) => args.flatMap(arg => arg.idx.fold(Set .empty)(_.freeVars) ++ arg.value.freeVars).toSet
482
-
493
+
483
494
lazy val freeVarsLLIR : Set [Local ] = this match
484
495
case Call (fun, args) => fun.freeVarsLLIR ++ args.flatMap(_.value.freeVarsLLIR).toSet
485
- case Instantiate (cls, args) => cls.freeVarsLLIR ++ args.flatMap(_.freeVarsLLIR).toSet
496
+ case Instantiate (mut, cls, args) => cls.freeVarsLLIR ++ args.flatMap(_.freeVarsLLIR).toSet
486
497
case Select (qual, name) => qual.freeVarsLLIR
487
498
case Value .Ref (l : (BuiltinSymbol | TopLevelSymbol | ClassSymbol | TermSymbol )) => Set .empty
488
499
case Value .Ref (l : MemberSymbol [? ]) => l.defn match
@@ -492,10 +503,10 @@ sealed abstract class Result extends AutoLocated:
492
503
case Value .This (sym) => Set .empty
493
504
case Value .Lit (lit) => Set .empty
494
505
case Value .Lam (params, body) => body.freeVarsLLIR -- params.paramSyms
495
- case Value .Arr (elems) => elems.flatMap(_.value.freeVarsLLIR).toSet
496
- case Value .Rcd (elems) => elems.flatMap(_.value.freeVarsLLIR).toSet
506
+ case Value .Arr (mut, elems) => elems.flatMap(_.value.freeVarsLLIR).toSet
507
+ case Value .Rcd (mut, args) =>
508
+ args.flatMap(arg => arg.idx.fold(Set .empty)(_.freeVarsLLIR) ++ arg.value.freeVarsLLIR).toSet
497
509
case DynSelect (qual, fld, arrayIdx) => qual.freeVarsLLIR ++ fld.freeVarsLLIR
498
- case Value .Rcd (args) => args.flatMap(arg => arg.idx.fold(Set .empty)(_.freeVarsLLIR) ++ arg.value.freeVarsLLIR).toSet
499
510
500
511
// type Local = LocalSymbol
501
512
type Local = Symbol
@@ -506,7 +517,7 @@ type Local = Symbol
506
517
* after handler is lowered does not have any effect on the code generation. */
507
518
case class Call (fun : Path , args : Ls [Arg ])(val isMlsFun : Bool , val mayRaiseEffects : Bool ) extends Result
508
519
509
- case class Instantiate (cls : Path , args : Ls [Path ]) extends Result
520
+ case class Instantiate (mut : Bool , cls : Path , args : Ls [Path ]) extends Result
510
521
511
522
sealed abstract class Path extends TrivialResult :
512
523
def selN (id : Tree .Ident ): Path = Select (this , id)(N )
@@ -524,8 +535,8 @@ enum Value extends Path:
524
535
case This (sym : InnerSymbol ) // TODO rm – just use Ref
525
536
case Lit (lit : Literal )
526
537
case Lam (params : ParamList , body : Block )
527
- case Arr (elems : Ls [Arg ])
528
- case Rcd (elems : Ls [RcdArg ])
538
+ case Arr (mut : Bool , elems : Ls [Arg ])
539
+ case Rcd (mut : Bool , elems : Ls [RcdArg ])
529
540
530
541
case class Arg (spread : Opt [Bool ], value : Path )
531
542
0 commit comments