diff --git a/src/wren_compiler.c b/src/wren_compiler.c index 6ce58e18..cfa58f44 100644 --- a/src/wren_compiler.c +++ b/src/wren_compiler.c @@ -846,7 +846,6 @@ static void nextToken(Parser* parser) // Discard newlines after tokens that cannot end an expression. case TOKEN_LEFT_PAREN: case TOKEN_LEFT_BRACKET: - case TOKEN_LEFT_BRACE: case TOKEN_DOT: case TOKEN_DOTDOT: case TOKEN_DOTDOTDOT: @@ -1349,6 +1348,9 @@ static void patchJump(Compiler* compiler, int offset) // Parses a block body, after the initial "{" has been consumed. static void finishBlock(Compiler* compiler) { + // TODO: If no newline, just parse expr. + match(compiler, TOKEN_LINE); + // Empty blocks do nothing. if (match(compiler, TOKEN_RIGHT_BRACE)) return; @@ -1465,6 +1467,12 @@ static void methodCall(Compiler* compiler, Code instruction, emit(&fnCompiler, CODE_NULL); emit(&fnCompiler, CODE_RETURN); } + else if (match(&fnCompiler, TOKEN_RIGHT_BRACE)) + { + // Empty body. + emit(&fnCompiler, CODE_NULL); + emit(&fnCompiler, CODE_RETURN); + } else { // TODO: Are we OK with a newline determining whether or not there's an @@ -1580,6 +1588,9 @@ static void function(Compiler* compiler, bool allowAssignment) if (match(&fnCompiler, TOKEN_LEFT_BRACE)) { + // TODO: If no newline, just parse expr. + match(compiler, TOKEN_LINE); + // Block body. finishBlock(&fnCompiler); @@ -2147,6 +2158,9 @@ void block(Compiler* compiler) // Curly block. if (match(compiler, TOKEN_LEFT_BRACE)) { + // TODO: If no newline, just parse expr. + match(compiler, TOKEN_LINE); + pushScope(compiler); finishBlock(compiler); popScope(compiler); @@ -2587,7 +2601,11 @@ static void classDefinition(Compiler* compiler) compiler->enclosingClass = &classCompiler; // Compile the method definitions. - consume(compiler, TOKEN_LEFT_BRACE, "Expect '{' after class body."); + consume(compiler, TOKEN_LEFT_BRACE, "Expect '{' after class declaration."); + + // TODO: Should newline be required here? + match(compiler, TOKEN_LINE); + while (!match(compiler, TOKEN_RIGHT_BRACE)) { Code instruction = CODE_METHOD_INSTANCE; diff --git a/test/fiber/is_done.wren b/test/fiber/is_done.wren index 49fd5a18..d1094352 100644 --- a/test/fiber/is_done.wren +++ b/test/fiber/is_done.wren @@ -1,8 +1,8 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("1") Fiber.yield IO.print("2") -}) +} IO.print(fiber.isDone) // expect: false fiber.run // expect: 1 diff --git a/test/fiber/resume_caller.wren b/test/fiber/resume_caller.wren index 502e9bca..768cf6eb 100644 --- a/test/fiber/resume_caller.wren +++ b/test/fiber/resume_caller.wren @@ -1,12 +1,12 @@ -var b = Fiber.create(fn { +var b = Fiber.create { IO.print("fiber b") -}) +} -var a = Fiber.create(fn { +var a = Fiber.create { IO.print("begin fiber a") b.run IO.print("end fiber a") -}) +} IO.print("begin main") a.run diff --git a/test/fiber/run.wren b/test/fiber/run.wren index cdf0b85a..bbae51a4 100644 --- a/test/fiber/run.wren +++ b/test/fiber/run.wren @@ -1,6 +1,6 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("fiber") -}) +} IO.print("before") // expect: before fiber.run // expect: fiber diff --git a/test/fiber/run_return_implicit_null.wren b/test/fiber/run_return_implicit_null.wren index 04616807..0483e525 100644 --- a/test/fiber/run_return_implicit_null.wren +++ b/test/fiber/run_return_implicit_null.wren @@ -1,6 +1,6 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("fiber") -}) +} var result = fiber.run // expect: fiber IO.print(result) // expect: null diff --git a/test/fiber/run_return_value.wren b/test/fiber/run_return_value.wren index 5414019e..b1fc3948 100644 --- a/test/fiber/run_return_value.wren +++ b/test/fiber/run_return_value.wren @@ -1,7 +1,7 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("fiber") return "result" -}) +} var result = fiber.run // expect: fiber IO.print(result) // expect: result diff --git a/test/fiber/run_when_done.wren b/test/fiber/run_when_done.wren index 7282f1e0..c28900e2 100644 --- a/test/fiber/run_when_done.wren +++ b/test/fiber/run_when_done.wren @@ -1,6 +1,6 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("run") -}) +} fiber.run // expect: run fiber.run // expect runtime error: Cannot run a finished fiber. diff --git a/test/fiber/run_with_value.wren b/test/fiber/run_with_value.wren index d41315be..68b63cab 100644 --- a/test/fiber/run_with_value.wren +++ b/test/fiber/run_with_value.wren @@ -1,6 +1,6 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("fiber") -}) +} // The first value passed to the fiber is ignored, since there's no yield call // to return it. diff --git a/test/fiber/run_with_value_when_done.wren b/test/fiber/run_with_value_when_done.wren index 09542b40..d6ba415a 100644 --- a/test/fiber/run_with_value_when_done.wren +++ b/test/fiber/run_with_value_when_done.wren @@ -1,6 +1,6 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("run") -}) +} fiber.run(1) // expect: run fiber.run(2) // expect runtime error: Cannot run a finished fiber. diff --git a/test/fiber/type.wren b/test/fiber/type.wren index 14ecb594..613f554d 100644 --- a/test/fiber/type.wren +++ b/test/fiber/type.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create(fn null) +var fiber = Fiber.create {} IO.print(fiber is Fiber) // expect: true IO.print(fiber is Object) // expect: true IO.print(fiber is Bool) // expect: false diff --git a/test/fiber/yield.wren b/test/fiber/yield.wren index ef8092db..50cb39ee 100644 --- a/test/fiber/yield.wren +++ b/test/fiber/yield.wren @@ -1,10 +1,10 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("fiber 1") Fiber.yield IO.print("fiber 2") Fiber.yield IO.print("fiber 3") -}) +} var result = fiber.run // expect: fiber 1 IO.print("main 1") // expect: main 1 diff --git a/test/fiber/yield_return_value.wren b/test/fiber/yield_return_value.wren index cb03725a..86dcf5c3 100644 --- a/test/fiber/yield_return_value.wren +++ b/test/fiber/yield_return_value.wren @@ -1,10 +1,10 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("fiber 1") var result = Fiber.yield IO.print(result) result = Fiber.yield IO.print(result) -}) +} fiber.run // expect: fiber 1 IO.print("main 1") // expect: main 1 diff --git a/test/fiber/yield_with_value.wren b/test/fiber/yield_with_value.wren index 14198476..f1ae7686 100644 --- a/test/fiber/yield_with_value.wren +++ b/test/fiber/yield_with_value.wren @@ -1,10 +1,10 @@ -var fiber = Fiber.create(fn { +var fiber = Fiber.create { IO.print("fiber 1") Fiber.yield("yield 1") IO.print("fiber 2") Fiber.yield("yield 2") IO.print("fiber 3") -}) +} var result = fiber.run // expect: fiber 1 IO.print(result) // expect: yield 1