Skip to content

Commit 3e574d5

Browse files
LPTKCAG2Mark
andauthored
Make immutability the default and add opt-in mut modifier (#323)
Co-authored-by: CAG2Mark <[email protected]>
1 parent 6e3ff82 commit 3e574d5

File tree

130 files changed

+2543
-1408
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

130 files changed

+2543
-1408
lines changed

hkmc2/shared/src/main/scala/hkmc2/codegen/Block.scala

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ sealed abstract class Block extends Product with AutoLocated:
3737
case AssignField(lhs: Path, nme: Tree.Ident, rhs: Result, rest: Block) => lhs :: nme :: rhs :: rest :: Nil
3838
case AssignDynField(lhs, fld, arrayIdx, rhs, rest) => lhs :: fld :: rhs :: rest :: Nil
3939
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
4141
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
4444
case HandleBlock(lhs, res, par, args, cls, handlers, body, rest) =>
4545
lhs :: res :: par :: args ++ handlers.flatMap: handler =>
4646
handler.sym :: handler.resumeSym :: (handler.params :+ handler.body)
@@ -328,7 +328,7 @@ sealed abstract class Defn:
328328
// * in the type system.
329329
lazy val freeVars: Set[Local] = this match
330330
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
332332
case ClsLikeDefn(own, isym, sym, k, paramsOpt, auxParams, parentSym,
333333
methods, privateFields, publicFields, preCtor, ctor) =>
334334
preCtor.freeVars
@@ -337,7 +337,7 @@ sealed abstract class Defn:
337337

338338
lazy val freeVarsLLIR: Set[Local] = this match
339339
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
341341
case ClsLikeDefn(own, isym, sym, k, paramsOpt, auxParams, parentSym,
342342
methods, privateFields, publicFields, preCtor, ctor) =>
343343
preCtor.freeVarsLLIR
@@ -353,12 +353,23 @@ final case class FunDefn(
353353
val innerSym = N
354354

355355
final case class ValDefn(
356-
owner: Opt[InnerSymbol],
357-
k: syntax.Val,
356+
tsym: TermSymbol,
358357
sym: BlockMemberSymbol,
359358
rhs: Path,
360359
) 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)
362373

363374
/*
364375
This explains the difference between paramsOpt, auxParams, privateFields and publicFields.
@@ -402,7 +413,7 @@ final case class ClsLikeDefn(
402413
parentPath: Opt[Path],
403414
methods: Ls[FunDefn],
404415
privateFields: Ls[TermSymbol],
405-
publicFields: Ls[BlockMemberSymbol],
416+
publicFields: Ls[BlockMemberSymbol -> TermSymbol],
406417
preCtor: Block,
407418
ctor: Block,
408419
) extends Defn:
@@ -448,41 +459,41 @@ sealed abstract class Result extends AutoLocated:
448459

449460
protected def children: List[Located] = this match
450461
case Call(fun, args) => fun :: args.map(_.value)
451-
case Instantiate(cls, args) => cls :: args
462+
case Instantiate(mut, cls, args) => cls :: args
452463
case Select(qual, name) => qual :: name :: Nil
453464
case DynSelect(qual, fld, arrayIdx) => qual :: fld :: Nil
454465
case Value.Ref(l) => Nil
455466
case Value.This(sym) => Nil
456467
case Value.Lit(lit) => lit :: Nil
457468
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)
460471

461472
// TODO rm Lam from values and thus the need for this method
462473
def subBlocks: Ls[Block] = this match
463474
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)
465476
case Select(qual, name) => qual.subBlocks
466477
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)
468479
case _ => Nil
469480

470481
lazy val freeVars: Set[Local] = this match
471482
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
473484
case Select(qual, name) => qual.freeVars
474485
case Value.Ref(l) => Set(l)
475486
case Value.This(sym) => Set.empty
476487
case Value.Lit(lit) => Set.empty
477488
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
480492
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+
483494
lazy val freeVarsLLIR: Set[Local] = this match
484495
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
486497
case Select(qual, name) => qual.freeVarsLLIR
487498
case Value.Ref(l: (BuiltinSymbol | TopLevelSymbol | ClassSymbol | TermSymbol)) => Set.empty
488499
case Value.Ref(l: MemberSymbol[?]) => l.defn match
@@ -492,10 +503,10 @@ sealed abstract class Result extends AutoLocated:
492503
case Value.This(sym) => Set.empty
493504
case Value.Lit(lit) => Set.empty
494505
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
497509
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
499510

500511
// type Local = LocalSymbol
501512
type Local = Symbol
@@ -506,7 +517,7 @@ type Local = Symbol
506517
* after handler is lowered does not have any effect on the code generation. */
507518
case class Call(fun: Path, args: Ls[Arg])(val isMlsFun: Bool, val mayRaiseEffects: Bool) extends Result
508519

509-
case class Instantiate(cls: Path, args: Ls[Path]) extends Result
520+
case class Instantiate(mut: Bool, cls: Path, args: Ls[Path]) extends Result
510521

511522
sealed abstract class Path extends TrivialResult:
512523
def selN(id: Tree.Ident): Path = Select(this, id)(N)
@@ -524,8 +535,8 @@ enum Value extends Path:
524535
case This(sym: InnerSymbol) // TODO rm – just use Ref
525536
case Lit(lit: Literal)
526537
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])
529540

530541
case class Arg(spread: Opt[Bool], value: Path)
531542

hkmc2/shared/src/main/scala/hkmc2/codegen/BlockTransformer.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,10 @@ class BlockTransformer(subst: SymbolSubst):
100100
val fun2 = applyPath(fun)
101101
val args2 = args.mapConserve(applyArg)
102102
if (fun2 is fun) && (args2 is args) then r else Call(fun2, args2)(r.isMlsFun, r.mayRaiseEffects)
103-
case Instantiate(cls, args) =>
103+
case Instantiate(mut, cls, args) =>
104104
val cls2 = applyPath(cls)
105105
val args2 = args.mapConserve(applyPath)
106-
if (cls2 is cls) && (args2 is args) then r else Instantiate(cls2, args2)
106+
if (cls2 is cls) && (args2 is args) then r else Instantiate(mut, cls2, args2)
107107
case p: Path => applyPath(p)
108108

109109
def applyPath(p: Path): Path = p match
@@ -126,16 +126,16 @@ class BlockTransformer(subst: SymbolSubst):
126126
if (sym2 is sym) then v else Value.This(sym2)
127127
case Value.Lit(lit) => v
128128
case v @ Value.Lam(params, body) => applyLam(v)
129-
case Value.Arr(elems) =>
129+
case Value.Arr(mut, elems) =>
130130
val elems2 = elems.mapConserve(applyArg)
131-
if (elems2 is elems) then v else Value.Arr(elems2)
132-
case Value.Rcd(fields) =>
131+
if (elems2 is elems) then v else Value.Arr(mut, elems2)
132+
case Value.Rcd(mut, fields) =>
133133
val fields2 = fields.mapConserve:
134134
case arg @ RcdArg(idx, v) =>
135135
val idx2 = idx.mapConserve(applyPath)
136136
val v2 = applyPath(v)
137137
if (idx2 is idx) && (v2 is v) then arg else RcdArg(idx2, v2)
138-
if fields2 is fields then v else Value.Rcd(fields2)
138+
if fields2 is fields then v else Value.Rcd(mut, fields2)
139139

140140
def applyLocal(sym: Local): Local = sym.subst
141141

@@ -148,12 +148,12 @@ class BlockTransformer(subst: SymbolSubst):
148148
then fun else FunDefn(own2, sym2, params2, body2)
149149

150150
def applyValDefn(defn: ValDefn): ValDefn =
151-
val ValDefn(owner, k, sym, rhs) = defn
152-
val owner2 = owner.mapConserve(_.subst)
151+
val ValDefn(tsym, sym, rhs) = defn
152+
val tsym2 = tsym.subst
153153
val sym2 = sym.subst
154154
val rhs2 = applyPath(rhs)
155-
if (owner2 is owner) && (sym2 is sym) && (rhs2 is rhs)
156-
then defn else ValDefn(owner2, k, sym2, rhs2)
155+
if (tsym2 is tsym) && (sym2 is sym) && (rhs2 is rhs)
156+
then defn else ValDefn(tsym2, sym2, rhs2)
157157

158158
def applyDefn(defn: Defn): Defn = defn match
159159
case defn: FunDefn => applyFunDefn(defn)
@@ -168,7 +168,7 @@ class BlockTransformer(subst: SymbolSubst):
168168
val parentPath2 = parentPath.mapConserve(applyPath)
169169
val methods2 = methods.mapConserve(applyFunDefn)
170170
val privateFields2 = privateFields.mapConserve(_.subst)
171-
val publicFields2 = publicFields.mapConserve(_.subst)
171+
val publicFields2 = publicFields.mapConserve(f => f._1.subst -> f._2.subst)
172172
val preCtor2 = applySubBlock(preCtor)
173173
val ctor2 = applySubBlock(ctor)
174174
if (own2 is own) && (isym2 is isym) && (sym2 is sym) &&

hkmc2/shared/src/main/scala/hkmc2/codegen/BlockTraverser.scala

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class BlockTraverser:
5454

5555
def applyResult(r: Result): Unit = r match
5656
case r @ Call(fun, args) => applyPath(fun); args.foreach(applyArg)
57-
case Instantiate(cls, args) =>; applyPath(cls); args.foreach(applyPath)
57+
case Instantiate(mut, cls, args) =>; applyPath(cls); args.foreach(applyPath)
5858
case p: Path => applyPath(p)
5959

6060
def applyPath(p: Path): Unit = p match
@@ -69,8 +69,8 @@ class BlockTraverser:
6969
case Value.This(sym) => sym.traverse
7070
case Value.Lit(lit) => ()
7171
case v @ Value.Lam(params, body) => applyLam(v)
72-
case Value.Arr(elems) => elems.foreach(applyArg)
73-
case Value.Rcd(fields) => fields.foreach:
72+
case Value.Arr(mut, elems) => elems.foreach(applyArg)
73+
case Value.Rcd(mut, fields) => fields.foreach:
7474
case RcdArg(idx, value) => idx.foreach(applyPath); applyPath(value)
7575

7676
def applyLocal(sym: Local): Unit = sym.traverse
@@ -82,8 +82,8 @@ class BlockTraverser:
8282
applySubBlock(fun.body)
8383

8484
def applyValDefn(defn: ValDefn): Unit =
85-
val ValDefn(owner, k, sym, rhs) = defn
86-
owner.foreach(_.traverse); sym.traverse; applyPath(rhs)
85+
val ValDefn(tsym, sym, rhs) = defn
86+
tsym.owner.foreach(_.traverse); sym.traverse; applyPath(rhs)
8787

8888
def applyDefn(defn: Defn): Unit = defn match
8989
case defn: FunDefn => applyFunDefn(defn)
@@ -98,7 +98,8 @@ class BlockTraverser:
9898
parentPath.foreach(applyPath)
9999
methods.foreach(applyFunDefn)
100100
privateFields.foreach(_.traverse)
101-
publicFields.foreach(_.traverse)
101+
publicFields.foreach: f =>
102+
f._1.traverse; f._2.traverse
102103
applySubBlock(preCtor)
103104
applySubBlock(ctor)
104105

hkmc2/shared/src/main/scala/hkmc2/codegen/HandlerLowering.scala

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
8686
HandlerCtx(false, false, contNme, ctorThis, h.debugInfo.copy(debugNme), state =>
8787
blockBuilder
8888
.assignFieldN(state.res.asPath.contTrace.last, nextIdent, Instantiate(
89-
state.cls.selN(Tree.Ident("class")),
89+
mut = true,
90+
state.cls,
9091
Value.Lit(Tree.IntLit(state.uid)) :: Nil))
9192
.assignFieldN(state.res.asPath.contTrace, lastIdent, state.res.asPath.contTrace.last.next)
9293
.ret(state.res.asPath))
@@ -102,7 +103,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
102103
private def freshTmp(dbgNme: Str = "tmp") = new TempSymbol(N, dbgNme)
103104

104105
private def rtThrowMsg(msg: Str) = Throw(
105-
Instantiate(State.globalThisSymbol.asPath.selN(Tree.Ident("Error")),
106+
Instantiate(mut = false, State.globalThisSymbol.asPath.selN(Tree.Ident("Error")),
106107
Value.Lit(Tree.StrLit(msg)) :: Nil)
107108
)
108109

@@ -312,22 +313,22 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
312313
private def createGetLocalsFn(b: Block, extraLocals: Set[Local])(using h: HandlerCtx) =
313314
val locals = (b.userDefinedVars ++ extraLocals) -- h.debugInfo.inScopeLocals
314315
val localsInfo = locals.toList.sortBy(_.uid).map: s =>
315-
FlowSymbol(s.nme) -> Instantiate(localVarInfoPath,
316+
FlowSymbol(s.nme) -> Instantiate(mut = true, localVarInfoPath,
316317
Value.Lit(Tree.StrLit(s.nme)) :: s.asPath :: Nil
317318
)
318319
val startSym = FlowSymbol("prev")
319320
val thisInfo = FlowSymbol("thisInfo")
320321

321322
val body = blockBuilder
322323
.assign(startSym, h.debugInfo.prevLocalsFn match
323-
case None => Value.Arr(Nil)
324+
case None => Value.Arr(mut = true, Nil)
324325
case Some(value) => PureCall(value, Nil)
325326
)
326327
.foldLeft(localsInfo):
327328
case (acc, (sym, res)) => acc.assign(sym, res)
328-
.assign(thisInfo, Instantiate(fnLocalsPath,
329+
.assign(thisInfo, Instantiate(mut = true, fnLocalsPath,
329330
Value.Lit(Tree.StrLit(h.debugInfo.debugNme))
330-
:: Value.Arr(localsInfo.map(v => v._1.asPath.asArg))
331+
:: Value.Arr(mut = false, localsInfo.map(v => v._1.asPath.asArg))
331332
:: Nil
332333
))
333334
.assign(TempSymbol(N, ""), Call(startSym.asPath.selSN("push"), thisInfo.asPath.asArg :: Nil)(false, false))
@@ -374,10 +375,10 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
374375
val args2 = args.mapConserve(applyArg)
375376
val c2 = if (fun2 is fun) && (args2 is args) then c else Call(fun2, args2)(c.isMlsFun, c.mayRaiseEffects)
376377
ResultPlaceholder(lhs, freshId(), c2, applyBlock(rest))
377-
case Assign(lhs, c @ Instantiate(cls, args), rest) =>
378+
case Assign(lhs, c @ Instantiate(mut, cls, args), rest) =>
378379
val cls2 = applyPath(cls)
379380
val args2 = args.mapConserve(applyPath)
380-
val c2 = if (cls2 is cls) && (args2 is args) then c else Instantiate(cls2, args2)
381+
val c2 = if (cls2 is cls) && (args2 is args) then c else Instantiate(mut, cls2, args2)
381382
ResultPlaceholder(lhs, freshId(), c2, applyBlock(rest))
382383
case _ => super.applyBlock(b)
383384
override def applyResult2(r: Result)(k: Result => Block): Block = r match
@@ -387,11 +388,11 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
387388
val args2 = args.mapConserve(applyArg)
388389
val c2 = if (fun2 is fun) && (args2 is args) then c else Call(fun2, args2)(c.isMlsFun, c.mayRaiseEffects)
389390
ResultPlaceholder(res, freshId(), c2, k(Value.Ref(res)))
390-
case c @ Instantiate(cls, args) =>
391+
case c @ Instantiate(mut, cls, args) =>
391392
val res = freshTmp("res")
392393
val cls2 = applyPath(cls)
393394
val args2 = args.mapConserve(applyPath)
394-
val c2 = if (cls2 is cls) && (args2 is args) then c else Instantiate(cls2, args2)
395+
val c2 = if (cls2 is cls) && (args2 is args) then c else Instantiate(mut, cls2, args2)
395396
ResultPlaceholder(res, freshId(), c2, k(Value.Ref(res)))
396397
case r => super.applyResult2(r)(k)
397398
override def applyPath(p: Path): Path = p match
@@ -454,7 +455,8 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
454455

455456
val handlerBody = translateBlock(h.body, Set.empty, HandlerCtx(false, true,
456457
s"Cont$$handleBlock$$${symToStr(h.lhs)}$$", N, handlerCtx.debugInfo.copy(debugNme = s"‹handler body of ${h.lhs.nme}"), state => blockBuilder
457-
.assignFieldN(state.res.asPath.contTrace.last, nextIdent, PureCall(state.cls, Value.Lit(Tree.IntLit(state.uid)) :: Nil))
458+
.assignFieldN(state.res.asPath.contTrace.last, nextIdent,
459+
Instantiate(mut = true, state.cls, Value.Lit(Tree.IntLit(state.uid)) :: Nil))
458460
.ret(PureCall(paths.handleBlockImplPath, state.res.asPath :: h.lhs.asPath :: Nil))))
459461

460462
val handlerMtds = h.handlers.map: handler =>
@@ -480,7 +482,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
480482

481483
val body = blockBuilder
482484
.define(clsDefn)
483-
.assign(h.lhs, Instantiate(Value.Ref(clsDefn.sym), Nil))
485+
.assign(h.lhs, Instantiate(mut = true, Value.Ref(clsDefn.sym), Nil))
484486
.rest(handlerBody)
485487

486488
val defn = FunDefn(
@@ -594,7 +596,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
594596

595597
val localsRes = h.debugInfo.prevLocalsFn match
596598
case Some(value) => PureCall(value, Nil)
597-
case None => Value.Arr(Nil)
599+
case None => Value.Arr(mut = true, Nil)
598600

599601
val getLocalsFnDef = FunDefn(
600602
S(clsSym),
@@ -623,12 +625,12 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
623625
clsSym,
624626
BlockMemberSymbol(clsSym.nme, Nil),
625627
syntax.Cls,
626-
S(PlainParamList({
627-
val p = Param(FldFlags.empty.copy(value = true), pcVar, N, Modulefulness.none)
628+
N,
629+
PlainParamList({
630+
val p = Param(FldFlags.empty.copy(isVal = true), pcVar, N, Modulefulness.none)
628631
pcVar.decl = S(p)
629632
p
630-
} :: Nil)),
631-
Nil,
633+
} :: Nil) :: Nil,
632634
S(paths.contClsPath),
633635
resumeFnDef :: debugMtds,
634636
Nil,

0 commit comments

Comments
 (0)