@@ -738,9 +738,9 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
738738 /** Maps definition symbols to the path representing that definition. */
739739 protected val passedDefnsMap : Map [DefinitionSymbol [? ], DefnRef ]
740740
741- protected lazy val capturesOrdered : List [ScopedInfo ]
741+ protected lazy val capturesOrdered : List [ScopedInfo ] = reqCaptures.toList.sorted
742742 protected final lazy val passedSymsOrdered : List [Local ] = reqPassedSymbols.toList.sortBy(_.uid)
743- protected final lazy val passedDefnsOrdered : List [DefinitionSymbol [? ]] = reqDefns.toList.sortBy(_.uid)
743+ protected final lazy val reqDefnsOrdered : List [DefinitionSymbol [? ]] = reqDefns.toList.sortBy(_.uid)
744744
745745 override lazy val capturePaths : Map [ScopedInfo , Path ] =
746746 if thisCapturedLocals.isEmpty then capSymsMap
@@ -776,7 +776,7 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
776776 defnPathsFromThisObj ++ fromParents
777777
778778 final def formatArgs : List [Arg ] =
779- val defnsArgs = passedDefnsOrdered .map(d => ctx.defnsMap(d).asArg)
779+ val defnsArgs = reqDefnsOrdered .map(d => ctx.defnsMap(d).asArg)
780780 val captureArgs = capturesOrdered.map(c => ctx.capturesMap(c).asArg)
781781 val localArgs = passedSymsOrdered.map(l => ctx.symbolsMap(l).asArg)
782782 defnsArgs ::: captureArgs ::: localArgs
@@ -789,7 +789,8 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
789789 sealed trait GenericRewrittenScope [T ] extends RewrittenScope [T ]:
790790 lazy val captureSym = VarSymbol (Tree .Ident (obj.nme + " $cap" ))
791791 override lazy val capturePath = captureSym.asPath
792- protected val liftedObjsSyms : Map [InnerSymbol , VarSymbol ] = node.liftedObjSyms.map: s =>
792+ protected val liftedObjsOrdered : List [InnerSymbol ] = node.liftedObjSyms.toList.sortBy(_.uid)
793+ protected val liftedObjsSyms : Map [InnerSymbol , VarSymbol ] = liftedObjsOrdered.map: s =>
793794 s -> VarSymbol (Tree .Ident (s.nme + " $" ))
794795 .toMap
795796 override lazy val liftedObjsMap : Map [InnerSymbol , LocalPath ] = liftedObjsSyms.map:
@@ -803,11 +804,14 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
803804 sealed trait ClsLikeRewrittenScope [T ](sym : InnerSymbol ) extends RewrittenScope [T ]:
804805 lazy val captureSym = TermSymbol (syntax.ImmutVal , S (sym), Tree .Ident (obj.nme + " $cap" ))
805806 override lazy val capturePath = captureSym.asPath
806- protected val liftedObjsSyms : Map [InnerSymbol , TermSymbol ] = node.liftedObjSyms.map: s =>
807+ protected val liftedObjsOrdered : List [InnerSymbol ] = node.liftedObjSyms.toList.sortBy(_.uid)
808+ protected val liftedObjsSyms : Map [InnerSymbol , TermSymbol ] = liftedObjsOrdered.map: s =>
807809 s -> TermSymbol (syntax.ImmutVal , S (sym), Tree .Ident (s.nme + " $" ))
808810 .toMap
809811 override lazy val liftedObjsMap : Map [InnerSymbol , LocalPath ] = liftedObjsSyms.map:
810812 case k -> v => k -> v.asLocalPath
813+ protected def appendCaptureField (privFields : List [TermSymbol ]) =
814+ if hasCapture then captureSym :: privFields else privFields
811815 protected def rewriteMethods (node : ScopeNode , methods : List [FunDefn ])(using ctx : LifterCtxNew ) =
812816 val mtds = node.children
813817 .map: c =>
@@ -867,19 +871,19 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
867871
868872 private val captureSym = TermSymbol (syntax.ImmutVal , S (obj.cls.isym), Tree .Ident (obj.nme + " $cap" ))
869873 override lazy val capturePath : Path = captureSym.asPath
870-
874+
871875 override def rewriteImpl : LifterResult [ClsLikeDefn ] =
872876 val rewriterCtor = new BlockRewriter
873877 val rewriterPreCtor = new BlockRewriter
874878 val rewrittenCtor = rewriterCtor.rewrite(obj.cls.ctor)
875879 val rewrittenPrector = rewriterPreCtor.rewrite(obj.cls.preCtor)
876880 val ctorWithCap = addExtraSyms(rewrittenCtor, captureSym, Nil , false )
877-
881+
878882 val LifterResult (newMtds, extras) = rewriteMethods(node, obj.cls.methods)
879883 val newCls = obj.cls.copy(
880884 ctor = ctorWithCap,
881885 preCtor = rewrittenPrector,
882- privateFields = captureSym :: liftedObjsSyms.values.toList ::: obj.cls.privateFields,
886+ privateFields = appendCaptureField(liftedObjsOrdered.map(liftedObjsSyms) ::: obj.cls.privateFields) ,
883887 methods = newMtds,
884888 )(obj.cls.configOverride)
885889 LifterResult (newCls, rewriterCtor.extraDefns.toList ::: rewriterPreCtor.extraDefns.toList ::: extras)
@@ -898,32 +902,30 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
898902 val LifterResult (newMtds, extras) = rewriteMethods(node, obj.clsBody.methods)
899903 val newComp = obj.clsBody.copy(
900904 ctor = ctorWithCap,
901- privateFields = captureSym :: liftedObjsSyms.values.toList ::: obj.clsBody.privateFields,
905+ privateFields = appendCaptureField(liftedObjsOrdered.map(liftedObjsSyms) ::: obj.clsBody.privateFields) ,
902906 methods = newMtds
903907 )
904908 LifterResult (newComp, rewriterCtor.extraDefns.toList ::: extras)
905909
906910 class LiftedFunc (override val obj : ScopedObject .Func )(using ctx : LifterCtxNew ) extends LiftedScope [FunDefn ](obj) with GenericRewrittenScope [FunDefn ]:
907- private val passedSymsMap_ : Map [Local , VarSymbol ] = passedSyms .map: s =>
911+ private val passedSymsMap_ : Map [Local , VarSymbol ] = passedSymsOrdered .map: s =>
908912 s -> VarSymbol (Tree .Ident (s.nme))
909913 .toMap
910- private val capSymsMap_ : Map [ScopedInfo , VarSymbol ] = reqCaptures .map: i =>
914+ private val capSymsMap_ : Map [ScopedInfo , VarSymbol ] = capturesOrdered .map: i =>
911915 val nme = data.getNode(i).obj.nme
912916 i -> VarSymbol (Tree .Ident (nme + " $cap" ))
913917 .toMap
914- private val defnSymsMap_ : Map [DefinitionSymbol [? ], VarSymbol ] = reqDefns .map: i =>
918+ private val defnSymsMap_ : Map [DefinitionSymbol [? ], VarSymbol ] = reqDefnsOrdered.sortBy(_.uid) .map: i =>
915919 val nme = data.getNode(i).obj.nme
916920 i -> VarSymbol (Tree .Ident (nme + " $" ))
917921 .toMap
918922
919- override lazy val capturesOrdered : List [ScopedInfo ] = reqCaptures.toList.sortBy(c => capSymsMap_(c).uid)
920-
921923 override protected val passedSymsMap = passedSymsMap_.view.mapValues(_.asLocalPath).toMap
922924 override protected val capSymsMap = capSymsMap_.view.mapValues(_.asPath).toMap
923925 override protected val passedDefnsMap = defnSymsMap_.view.mapValues(_.asDefnRef).toMap
924926
925927 val auxParams : List [Param ] =
926- (passedDefnsOrdered .map(defnSymsMap_) ::: capturesOrdered.map(capSymsMap_) ::: passedSymsOrdered.map(passedSymsMap_))
928+ (reqDefnsOrdered .map(defnSymsMap_) ::: capturesOrdered.map(capSymsMap_) ::: passedSymsOrdered.map(passedSymsMap_))
927929 .map: s =>
928930 val decl = Param (FldFlags .empty.copy(isVal = false ), s, N , Modulefulness .none)
929931 s.decl = S (decl)
@@ -1017,41 +1019,41 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
10171019 private val captureSym = TermSymbol (syntax.ImmutVal , S (obj.cls.isym), Tree .Ident (obj.nme + " $cap" ))
10181020 override lazy val capturePath : Path = captureSym.asPath
10191021
1020- private val passedSymsMap_ : Map [Local , (vs : VarSymbol , ts : TermSymbol )] = passedSyms .map: s =>
1022+ private val passedSymsMap_ : Map [Local , (vs : VarSymbol , ts : TermSymbol )] = passedSymsOrdered .map: s =>
10211023 s ->
10221024 (
10231025 VarSymbol (Tree .Ident (s.nme)),
10241026 TermSymbol (syntax.LetBind , S (obj.cls.isym), Tree .Ident (s.nme))
10251027 )
10261028 .toMap
1027- private val capSymsMap_ : Map [ScopedInfo , (vs : VarSymbol , ts : TermSymbol )] = reqCaptures .map: i =>
1029+ private val capSymsMap_ : Map [ScopedInfo , (vs : VarSymbol , ts : TermSymbol )] = capturesOrdered .map: i =>
10281030 val nme = data.getNode(i).obj.nme + " $cap"
10291031 i ->
10301032 (
10311033 VarSymbol (Tree .Ident (nme)),
10321034 TermSymbol (syntax.LetBind , S (obj.cls.isym), Tree .Ident (nme))
10331035 )
10341036 .toMap
1035- private val defnSymsMap_ : Map [DefinitionSymbol [? ], (vs : VarSymbol , ts : TermSymbol )] = reqDefns .map: i =>
1037+ private val defnSymsMap_ : Map [DefinitionSymbol [? ], (vs : VarSymbol , ts : TermSymbol )] = reqDefnsOrdered .map: i =>
10361038 i ->
10371039 (
10381040 VarSymbol (Tree .Ident (i.nme + " $" )),
10391041 TermSymbol (syntax.LetBind , S (obj.cls.isym), Tree .Ident (i.nme + " $" ))
10401042 )
10411043 .toMap
10421044
1043- private val extraPrivSyms =
1044- liftedObjsSyms.values ++ passedSymsMap_.values. map(_.ts )
1045- ++ capSymsMap_.values. map(_.ts) ++ defnSymsMap_.values.map(_ .ts)
1046-
1047- override lazy val capturesOrdered : List [ ScopedInfo ] = reqCaptures.toList.sortBy(c => capSymsMap_(c).vs.uid )
1045+ private lazy val extraPrivSyms : List [ TermSymbol ] =
1046+ liftedObjsOrdered. map(liftedObjsSyms )
1047+ ::: reqDefnsOrdered. map(defnSymsMap_(_) .ts)
1048+ ::: capturesOrdered.map(capSymsMap_(_).ts)
1049+ ::: passedSymsOrdered.map(passedSymsMap_(_).ts )
10481050
10491051 override protected val passedSymsMap = passedSymsMap_.view.mapValues(_.ts.asLocalPath).toMap
10501052 override protected val capSymsMap = capSymsMap_.view.mapValues(_.ts.asPath).toMap
10511053 override protected val passedDefnsMap = defnSymsMap_.view.mapValues(_.ts.asDefnRef).toMap
10521054
10531055 val auxParams : List [Param ] =
1054- (passedDefnsOrdered .map(x => defnSymsMap_(x).vs)
1056+ (reqDefnsOrdered .map(x => defnSymsMap_(x).vs)
10551057 ::: capturesOrdered.map(x => capSymsMap_(x).vs)
10561058 ::: passedSymsOrdered.map(x => passedSymsMap_(x).vs))
10571059 .map(Param .simple(_))
@@ -1158,7 +1160,7 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
11581160 case (sym, acc) =>
11591161 val (vs, ts) = capSymsMap_(sym)
11601162 Assign (ts, vs.asPath, acc)
1161- val ctorWithDefns = passedDefnsOrdered .foldRight(ctorWithCaps):
1163+ val ctorWithDefns = reqDefnsOrdered .foldRight(ctorWithCaps):
11621164 case (sym, acc) =>
11631165 val (vs, ts) = defnSymsMap_(sym)
11641166 Assign (ts, vs.asPath, acc)
@@ -1168,12 +1170,13 @@ class Lifter(topLevelBlk: Block)(using State, Raise, Config):
11681170 else PlainParamList (auxParams) :: cls.auxParams
11691171
11701172 val LifterResult (newMtds, extras) = rewriteMethods(node, obj.cls.methods)
1173+
11711174 val newCls = obj.cls.copy(
11721175 owner = N ,
11731176 k = syntax.Cls , // turn objects into classes
11741177 ctor = ctorWithDefns,
11751178 preCtor = rewrittenPrector,
1176- privateFields = captureSym :: extraPrivSyms.toList ::: obj.cls.privateFields,
1179+ privateFields = appendCaptureField( extraPrivSyms ::: obj.cls.privateFields) ,
11771180 methods = newMtds,
11781181 auxParams = newAuxList
11791182 )(obj.cls.configOverride)
0 commit comments