Skip to content

Commit 5d1deea

Browse files
FlandiaYingmanCAG2MarkLPTK
authored
Term.Resolved (#343)
Co-authored-by: CAG2Mark <git@markng.com> Co-authored-by: Lionel Parreaux <lionel.parreaux@gmail.com>
1 parent 2fd0f16 commit 5d1deea

Some content is hidden

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

58 files changed

+1389
-761
lines changed

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

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ case class TryBlock(sub: Block, finallyDo: Block, rest: Block) extends Block wit
280280
case class Assign(lhs: Local, rhs: Result, rest: Block) extends Block with ProductWithTail
281281
// case class Assign(lhs: Path, rhs: Result, rest: Block) extends Block with ProductWithTail
282282

283-
case class AssignField(lhs: Path, nme: Tree.Ident, rhs: Result, rest: Block)(val symbol: Opt[FieldSymbol]) extends Block with ProductWithTail
283+
case class AssignField(lhs: Path, nme: Tree.Ident, rhs: Result, rest: Block)(val symbol: Opt[MemberSymbol]) extends Block with ProductWithTail
284284

285285
case class AssignDynField(lhs: Path, fld: Path, arrayIdx: Bool, rhs: Result, rest: Block) extends Block with ProductWithTail
286286

@@ -300,7 +300,7 @@ case class HandleBlock(
300300

301301

302302
sealed abstract class Defn:
303-
val innerSym: Opt[MemberSymbol[?]]
303+
val innerSym: Opt[MemberSymbol]
304304
val sym: BlockMemberSymbol
305305
def isOwned: Bool = owner.isDefined
306306
def owner: Opt[InnerSymbol]
@@ -399,7 +399,7 @@ object ValDefn:
399399
// * a lone module is represented as an empty class with a `companion` module.
400400
final case class ClsLikeDefn(
401401
owner: Opt[InnerSymbol],
402-
isym: MemberSymbol[? <: ClassLikeDef] & InnerSymbol,
402+
isym: DefinitionSymbol[? <: ClassLikeDef] & InnerSymbol,
403403
sym: BlockMemberSymbol,
404404
k: syntax.ClsLikeKind,
405405
paramsOpt: Opt[ParamList],
@@ -414,12 +414,12 @@ final case class ClsLikeDefn(
414414
bufferable: Option[Bool],
415415
) extends Defn:
416416
require(k isnt syntax.Mod)
417-
val innerSym = S(isym)
417+
val innerSym = S(isym.asMemSym)
418418

419419

420420
// * This is only supposed to be for companion module definitions (notably, not for `object`)
421421
final case class ClsLikeBody(
422-
isym: MemberSymbol[? <: ModuleOrObjectDef] & InnerSymbol,
422+
isym: DefinitionSymbol[? <: ModuleOrObjectDef] & InnerSymbol,
423423
methods: Ls[FunDefn],
424424
privateFields: Ls[TermSymbol],
425425
publicFields: Ls[BlockMemberSymbol -> TermSymbol],
@@ -497,7 +497,7 @@ sealed abstract class Result extends AutoLocated:
497497
case Lambda(params, body) => params :: Nil
498498
case Tuple(mut, elems) => elems.map(_.value)
499499
case Record(mut, elems) => elems.map(_.value)
500-
case Value.Ref(l) => Nil
500+
case Value.Ref(l, disamb) => Nil
501501
case Value.This(sym) => Nil
502502
case Value.Lit(lit) => lit :: Nil
503503

@@ -518,7 +518,7 @@ sealed abstract class Result extends AutoLocated:
518518
case Tuple(mut, elems) => elems.flatMap(_.value.freeVars).toSet
519519
case Record(mut, args) =>
520520
args.flatMap(arg => arg.idx.fold(Set.empty)(_.freeVars) ++ arg.value.freeVars).toSet
521-
case Value.Ref(l) => Set(l)
521+
case Value.Ref(l, disamb) => Set(l)
522522
case Value.This(sym) => Set.empty
523523
case Value.Lit(lit) => Set.empty
524524
case DynSelect(qual, fld, arrayIdx) => qual.freeVars ++ fld.freeVars
@@ -531,11 +531,16 @@ sealed abstract class Result extends AutoLocated:
531531
case Tuple(mut, elems) => elems.flatMap(_.value.freeVarsLLIR).toSet
532532
case Record(mut, args) =>
533533
args.flatMap(arg => arg.idx.fold(Set.empty)(_.freeVarsLLIR) ++ arg.value.freeVarsLLIR).toSet
534-
case Value.Ref(l: (BuiltinSymbol | TopLevelSymbol | ClassSymbol | TermSymbol)) => Set.empty
535-
case Value.Ref(l: MemberSymbol[?]) => l.defn match
534+
case Value.Ref(l: (BuiltinSymbol | TopLevelSymbol | ClassSymbol | TermSymbol), disamb) => Set.empty
535+
case Value.Ref(l: BlockMemberSymbol, S(disamb)) => disamb.defn match
536536
case Some(d: ClassLikeDef) => Set.empty
537+
case Some(d: TermDefinition) if d.companionClass.isDefined => Set.empty
537538
case _ => Set(l)
538-
case Value.Ref(l) => Set(l)
539+
case Value.Ref(l: DefinitionSymbol[?], N) => l.defn match
540+
case Some(d: ClassLikeDef) => Set.empty
541+
case Some(d: TermDefinition) if d.companionClass.isDefined => Set.empty
542+
case _ => Set(l)
543+
case Value.Ref(l, disamb) => Set(l)
539544
case Value.This(sym) => Set.empty
540545
case Value.Lit(lit) => Set.empty
541546
case DynSelect(qual, fld, arrayIdx) => qual.freeVarsLLIR ++ fld.freeVarsLLIR
@@ -560,19 +565,38 @@ case class Record(mut: Bool, elems: Ls[RcdArg]) extends Result
560565

561566
sealed abstract class Path extends TrivialResult:
562567
def selN(id: Tree.Ident): Path = Select(this, id)(N)
563-
def sel(id: Tree.Ident, sym: FieldSymbol): Path = Select(this, id)(S(sym))
568+
def sel(id: Tree.Ident, sym: DefinitionSymbol[?]): Path = Select(this, id)(S(sym))
564569
def selSN(id: Str): Path = selN(new Tree.Ident(id))
565570
def asArg = Arg(spread = N, this)
566571

567-
case class Select(qual: Path, name: Tree.Ident)(val symbol: Opt[FieldSymbol]) extends Path with ProductWithExtraInfo:
568-
def extraInfo: Str = symbol.mkString
572+
/**
573+
* @param symbol The symbol representing the definition that the selection refers to, if known.
574+
*/
575+
case class Select(qual: Path, name: Tree.Ident)(val symbol: Opt[DefinitionSymbol[?]]) extends Path with ProductWithExtraInfo:
576+
def extraInfo: Str = symbol.map(s => s"sym=${s}").mkString
569577

570578
case class DynSelect(qual: Path, fld: Path, arrayIdx: Bool) extends Path
571579

572-
enum Value extends Path:
573-
case Ref(l: Local)
580+
enum Value extends Path with ProductWithExtraInfo:
581+
/**
582+
* @param disamb The symbol disambiguating the definition that the reference refers to. This
583+
* exists if and only if l is a BlockMemberSymbol.
584+
*/
585+
case Ref(l: Local, disamb: Opt[DefinitionSymbol[?]])
574586
case This(sym: InnerSymbol) // TODO rm – just use Ref
575587
case Lit(lit: Literal)
588+
589+
override def extraInfo: Str = this match
590+
case Ref(l, disamb) => disamb.map(s => s"disamb=${s}").mkString
591+
case _ => ""
592+
593+
object Value:
594+
object Ref:
595+
// * Some helper constructors that allow omitting the disambiguation symbol.
596+
// * If the ref itself is a DefinitionSymbol, then disambiguating it results in itself.
597+
def apply(l: DefinitionSymbol[?]): Ref = Ref(l, S(l))
598+
// * If the ref is a symbol that does not refer to a definition, then there is no disambiguation.
599+
def apply(l: TempSymbol | VarSymbol | BuiltinSymbol): Ref = Ref(l, N)
576600

577601
case class Arg(spread: Opt[Bool], value: Path)
578602

@@ -603,6 +627,6 @@ extension (k: Block => Block)
603627
def blockBuilder: Block => Block = identity
604628

605629
extension (l: Local)
606-
def asPath: Path = Value.Ref(l)
630+
def asPath: Path = Value.Ref(l, N)
607631

608632

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ class BlockTransformer(subst: SymbolSubst):
144144
case v: Value => applyValue(v)(k)
145145

146146
def applyValue(v: Value)(k: Value => Block) = v match
147-
case Value.Ref(l) =>
147+
case Value.Ref(l, disamb) =>
148148
val l2 = l.subst
149-
k(if (l2 is l) then v else Value.Ref(l2))
149+
k(if (l2 is l) then v else Value.Ref(l2, disamb))
150150
case Value.This(sym) =>
151151
val sym2 = sym.subst
152152
k(if (sym2 is sym) then v else Value.This(sym2))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class BlockTraverser:
6969
case v: Value => applyValue(v)
7070

7171
def applyValue(v: Value): Unit = v match
72-
case Value.Ref(l) => l.traverse
72+
case Value.Ref(l, disamb) => l.traverse
7373
case Value.This(sym) => sym.traverse
7474
case Value.Lit(lit) => ()
7575

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class BufferableTransform()(using Ctx, State, Raise):
5757
fieldMap.get(sym).orElse(pubFieldMap.get(sym).flatMap(fieldMap.get(_))).fold(super.applyPath(p)(k)): off =>
5858
getOffset(off): res =>
5959
k(res)
60-
case Value.Ref(l) =>
60+
case Value.Ref(l, _) =>
6161
fieldMap.get(l).fold(super.applyPath(p)(k)): off =>
6262
getOffset(off): res =>
6363
k(res)

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

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ object HandlerLowering:
3333

3434
private case class LinkState(res: Local, cls: Path, uid: Path)
3535

36-
type FnOrCls = Either[BlockMemberSymbol, MemberSymbol[? <: ClassLikeDef] & InnerSymbol]
36+
type FnOrCls = Either[BlockMemberSymbol, DefinitionSymbol[? <: ClassLikeDef] & InnerSymbol]
3737

3838
// isTopLevel:
3939
// whether the current block is the top level block, as we do not emit code for continuation class on the top level
@@ -132,7 +132,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
132132
def apply(res: Local, uid: StateId, rest: Block) =
133133
Assign(res, PureCall(Value.Ref(resumptionSymbol), List(Value.Lit(Tree.IntLit(uid)))), rest)
134134
def unapply(blk: Block) = blk match
135-
case Assign(res, PureCall(Value.Ref(`resumptionSymbol`), List(Value.Lit(Tree.IntLit(uid)))), rest) =>
135+
case Assign(res, PureCall(Value.Ref(`resumptionSymbol`, _), List(Value.Lit(Tree.IntLit(uid)))), rest) =>
136136
Some(res, uid, rest)
137137
case _ => None
138138

@@ -141,7 +141,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
141141
def apply(res: Local, uid: StateId) =
142142
Assign(res, PureCall(Value.Ref(returnContSymbol), List(Value.Lit(Tree.IntLit(uid)))), End(""))
143143
def unapply(blk: Block) = blk match
144-
case Assign(res, PureCall(Value.Ref(`returnContSymbol`), List(Value.Lit(Tree.IntLit(uid)))), _) =>
144+
case Assign(res, PureCall(Value.Ref(`returnContSymbol`, _), List(Value.Lit(Tree.IntLit(uid)))), _) =>
145145
Some(res, uid)
146146
case _ => None
147147

@@ -157,7 +157,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
157157
def unapply(blk: Block) = blk match
158158
case Assign(
159159
res,
160-
PureCall(Value.Ref(`callSymbol`), List(Value.Lit(Tree.IntLit(uid)))),
160+
PureCall(Value.Ref(`callSymbol`, _), List(Value.Lit(Tree.IntLit(uid)))),
161161
Assign(_, c, rest)) =>
162162
Some(res, uid, c, rest)
163163
case _ => None
@@ -167,15 +167,15 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
167167
def apply(uid: StateId) =
168168
Return(PureCall(Value.Ref(transitionSymbol), List(Value.Lit(Tree.IntLit(uid)))), false)
169169
def unapply(blk: Block) = blk match
170-
case Return(PureCall(Value.Ref(`transitionSymbol`), List(Value.Lit(Tree.IntLit(uid)))), false) =>
170+
case Return(PureCall(Value.Ref(`transitionSymbol`, _), List(Value.Lit(Tree.IntLit(uid)))), false) =>
171171
S(uid)
172172
case _ => N
173173

174174
object FnEnd:
175175
private val fnEndSymbol = freshTmp("fnEnd")
176176
def apply() = Return(PureCall(Value.Ref(fnEndSymbol), Nil), false)
177177
def unapply(blk: Block) = blk match
178-
case Return(PureCall(Value.Ref(`fnEndSymbol`), Nil), false) => true
178+
case Return(PureCall(Value.Ref(`fnEndSymbol`, _), Nil), false) => true
179179
case _ => false
180180

181181
private class FreshId:
@@ -522,7 +522,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
522522
ResultPlaceholder(res, freshId(), c2, k(Value.Ref(res)))
523523
case r => super.applyResult(r)(k)
524524
override def applyPath(p: Path)(k: Path => Block): Block = p match
525-
case Value.Ref(`getLocalsSym`) => k(handlerCtx.debugInfo.prevLocalsFn.get)
525+
case Value.Ref(`getLocalsSym`, _) => k(handlerCtx.debugInfo.prevLocalsFn.get)
526526
case _ => super.applyPath(p)(k)
527527
override def applyLam(lam: Lambda): Lambda =
528528
// This should normally be unreachable due to prior desugaring of lambda
@@ -591,7 +591,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
591591
f.owner match
592592
case None => S(Call(f.sym.asPath, params)(true, true))
593593
case Some(owner) =>
594-
S(Call(Select(owner.asPath, Tree.Ident(f.sym.nme))(S(f.sym)), params)(true, true))
594+
S(Call(Select(owner.asPath, Tree.Ident(f.sym.nme))(N), params)(true, true))
595595
case _ => None // TODO: more than one plist
596596

597597
FunDefn(f.owner, f.sym, f.params, translateBlock(f.body,
@@ -657,7 +657,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
657657
handler.sym, handler.params,
658658
Define(
659659
fDef,
660-
Return(PureCall(paths.mkEffectPath, h.cls.asPath :: Value.Ref(sym) :: Nil), false)))
660+
Return(PureCall(paths.mkEffectPath, h.cls.asPath :: Value.Ref(sym, N) :: Nil), false)))
661661

662662
// Some limited handling of effects extending classes and having access to their fields.
663663
// Currently does not support super() raising effects.
@@ -687,7 +687,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
687687

688688
val body = blockBuilder
689689
.define(clsDefn)
690-
.assign(h.lhs, Instantiate(mut = true, Value.Ref(clsDefn.sym), Nil))
690+
.assign(h.lhs, Instantiate(mut = true, Value.Ref(clsDefn.sym, S(h.cls)), Nil))
691691
.rest(handlerBody)
692692

693693
val defn = FunDefn(
@@ -735,7 +735,7 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
735735
val transform = new BlockTransformerShallow(SymbolSubst()):
736736
override def applyResult(r: Result)(k: Result => Block): Block =
737737
r match
738-
case c @ Call(Value.Ref(s: BuiltinSymbol), _) => ()
738+
case c @ Call(Value.Ref(s: BuiltinSymbol, _), _) => ()
739739
case c: Call if !c.mayRaiseEffects => ()
740740
case _: Call | _: Instantiate => containsCall = true
741741
case _ => ()
@@ -792,7 +792,8 @@ class HandlerLowering(paths: HandlerPaths, opt: EffectHandlers)(using TL, Raise,
792792
override def applyBlock(b: Block): Block = b match
793793
case ReturnCont(res, uid) => Return(Call(
794794
Select(clsSym.asPath, Tree.Ident("doUnwind"))(
795-
N /* this refers to the method defined in Runtime.FunctionContFrame */ ),
795+
N /* this refers to the method defined in Runtime.FunctionContFrame */
796+
),
796797
res.asPath.asArg :: Value.Lit(Tree.IntLit(uid)).asArg :: Nil)(true, false),
797798
false
798799
)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Instrumentation(using Raise) extends BlockTransformer(new SymbolSubst()):
99

1010
override def applyDefn(d: Defn)(k: Defn => Block): Block = d match
1111
case defn: ClsLikeDefn =>
12-
if defn.sym.defn.exists(_.hasStagedModifier.isDefined) && defn.companion.isDefined
12+
if defn.isym.defn.exists(_.hasStagedModifier.isDefined) && defn.companion.isDefined
1313
then raise(WarningReport(msg"`staged` keyword doesn't do anything currently." -> defn.sym.toLoc :: Nil))
1414
super.applyDefn(defn)(k)
1515
case b => super.applyDefn(b)(k)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ object LambdaRewriter:
2828
case lam: Lambda =>
2929
val sym = BlockMemberSymbol("lambda", Nil, nameIsMeaningful = false)
3030
lambdasList ::= (sym -> super.applyLam(lam))
31-
k(Value.Ref(sym))
31+
k(Value.Ref(sym, N))
3232
case _ => super.applyResult(r)(k)
3333
val blk = lambdaRewriter.applyBlock(b)
3434
(blk, lambdasList)

0 commit comments

Comments
 (0)