Skip to content

Commit 779a040

Browse files
committed
fix: error on statement after return
While it would have been better to specify the expected keyword to ends that particular block like actual Lua does, I do not see that being possible in the given structure. fix #1163
1 parent d3c43c6 commit 779a040

3 files changed

Lines changed: 33 additions & 0 deletions

File tree

crates/emmylua_parser/locales/app.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,8 @@ expected 'end' to close while statement:
255255
en: expected 'end' to close while statement
256256
zh_CN: 期望 'end' 来关闭while语句
257257
zh_HK: 期望 'end' 來關閉while語句
258+
expected end of block after return:
259+
en: expected end of block after return
258260
expected 'function', variable name, or attribute after 'local':
259261
en: expected 'function', variable name, or attribute after 'local'
260262
zh_CN: 期望在 'local' 后有 'function'、变量名或属性

crates/emmylua_parser/src/grammar/doc/test.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3724,4 +3724,26 @@ Syntax(Chunk)@0..47
37243724
assert!(errors[0].range.is_empty());
37253725
assert_eq!(u32::from(errors[0].range.start()) as usize, code.len());
37263726
}
3727+
3728+
#[test]
3729+
fn test_statement_after_return() {
3730+
let code = "return 1, 2 x = 1";
3731+
let tree = LuaParser::parse(code, ParserConfig::default());
3732+
let errors = tree.get_errors();
3733+
3734+
assert_eq!(errors.len(), 1);
3735+
assert_eq!(errors[0].kind, LuaParseErrorKind::SyntaxError);
3736+
assert_eq!(errors[0].message, "expected end of block after return")
3737+
}
3738+
3739+
#[test]
3740+
fn test_statement_after_blank_return() {
3741+
let code = "return; x = 1";
3742+
let tree = LuaParser::parse(code, ParserConfig::default());
3743+
let errors = tree.get_errors();
3744+
3745+
assert_eq!(errors.len(), 1);
3746+
assert_eq!(errors[0].kind, LuaParseErrorKind::SyntaxError);
3747+
assert_eq!(errors[0].message, "expected end of block after return")
3748+
}
37273749
}

crates/emmylua_parser/src/grammar/lua/stat.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,7 @@ fn parse_attrib(p: &mut LuaParser) -> ParseResult {
752752

753753
fn parse_return(p: &mut LuaParser) -> ParseResult {
754754
let m = p.mark(LuaSyntaxKind::ReturnStat);
755+
let return_start_range = p.current_token_range();
755756
p.bump();
756757
if !block_follow(p)
757758
&& p.current_token() != LuaTokenKind::TkSemicolon
@@ -761,6 +762,14 @@ fn parse_return(p: &mut LuaParser) -> ParseResult {
761762
}
762763

763764
if_token_bump(p, LuaTokenKind::TkSemicolon);
765+
766+
if !block_follow(p) {
767+
p.push_error(LuaParseError::syntax_error_from(
768+
&t!("expected end of block after return"),
769+
return_start_range,
770+
));
771+
};
772+
764773
Ok(m.complete(p))
765774
}
766775

0 commit comments

Comments
 (0)