Skip to content

Commit 6adb66c

Browse files
committed
first step adding UFCS on blocks
1 parent 6e8b2b5 commit 6adb66c

File tree

3 files changed

+46
-31
lines changed

3 files changed

+46
-31
lines changed

effekt/jvm/src/test/scala/effekt/RecursiveDescentTests.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,14 @@ class RecursiveDescentTests extends munit.FunSuite {
311311
intercept[Throwable] { parseExpr("[,1]") }
312312
}
313313

314+
test("ufcs") {
315+
parseExpr("{ l }.foo { x => x + 1}.bar { x => x * 2}")
316+
parseExpr("{ 42 }.bar")
317+
parseExpr("{ 42 }.bar()")
318+
parseExpr("{ x => x }.foo(42)")
319+
parseExpr("l.bar { fn }")
320+
}
321+
314322
test("Boxing") {
315323
parseExpr("box f")
316324
parseExpr("unbox f")

effekt/shared/src/main/scala/effekt/RecursiveDescent.scala

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -959,40 +959,43 @@ class RecursiveDescent(positions: Positions, tokens: Seq[Token], source: Source)
959959
* This way expressions like `foo.bar.baz()(x).bam.boo()` are
960960
* parsed with the correct left-associativity.
961961
*/
962-
def callExpr(): Term = nonterminal {
963-
var e = primExpr()
962+
def callExpr(): Term =
963+
nonterminal:
964+
var e = peek.kind match {
965+
case `{` => blockArg()
966+
case _ => primExpr()
967+
}
964968

965-
while (peek(`.`) || isArguments)
966-
peek.kind match {
967-
// member selection (or method call)
968-
// <EXPR>.<NAME>
969-
// | <EXPR>.<NAME>( ... )
970-
case `.` =>
971-
consume(`.`)
972-
val member = idRef()
973-
// method call
974-
if (isArguments) {
975-
val (targs, vargs, bargs) = arguments()
976-
e = Term.MethodCall(e, member, targs, vargs, bargs)
977-
} else {
978-
e = Term.MethodCall(e, member, Nil, Nil, Nil)
979-
}
969+
while (peek(`.`) || isArguments)
970+
peek.kind match {
971+
// member selection (or method call)
972+
// <EXPR>.<NAME>
973+
// | <EXPR>.<NAME>( ... )
974+
case `.` =>
975+
consume(`.`)
976+
val member = idRef()
977+
// method call
978+
if (isArguments) {
979+
val (targs, vargs, bargs) = arguments()
980+
e = Term.MethodCall(e, member, targs, vargs, bargs)
981+
} else {
982+
e = Term.MethodCall(e, member, Nil, Nil, Nil)
983+
}
980984

981-
// function call
982-
case _ if isArguments =>
983-
val callee = e match {
984-
case Term.Var(id) => IdTarget(id)
985-
case other => ExprTarget(other)
986-
}
987-
val (targs, vargs, bargs) = arguments()
988-
e = Term.Call(callee, targs, vargs, bargs)
985+
// function call
986+
case _ if isArguments =>
987+
val callee = e match {
988+
case Term.Var(id) => IdTarget(id)
989+
case other => ExprTarget(other)
990+
}
991+
val (targs, vargs, bargs) = arguments()
992+
e = Term.Call(callee, targs, vargs, bargs)
989993

990-
// nothing to do
991-
case _ => ()
992-
}
994+
// nothing to do
995+
case _ => ()
996+
}
997+
e
993998

994-
e
995-
}
996999

9971000
// argument lists cannot follow a linebreak:
9981001
// foo == foo;

effekt/shared/src/main/scala/effekt/typer/BoxUnboxInference.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,11 @@ object BoxUnboxInference extends Phase[NameResolved, NameResolved] {
9797
if (hasMethods) {
9898
MethodCall(rewriteAsBlock(receiver), id, targs, vargsTransformed, bargsTransformed)
9999
} else {
100-
Call(IdTarget(id).inheritPosition(id), targs, rewriteAsExpr(receiver) :: vargsTransformed, bargsTransformed)
100+
receiver match
101+
case _: BlockLiteral =>
102+
Call(IdTarget(id).inheritPosition(id), targs, vargsTransformed, rewriteAsBlock(receiver) :: bargsTransformed)
103+
case _ =>
104+
Call(IdTarget(id).inheritPosition(id), targs, rewriteAsExpr(receiver) :: vargsTransformed, bargsTransformed)
101105
}
102106

103107
case TryHandle(prog, handlers) =>

0 commit comments

Comments
 (0)