Skip to content

Commit 51729d0

Browse files
authored
Merge pull request #1191 from PennyJim/return_error
fix: error on statement after return
2 parents d3c43c6 + 1dd1925 commit 51729d0

3 files changed

Lines changed: 43 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: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3724,4 +3724,37 @@ 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+
assert_eq!(u32::from(errors[0].range.start()) as usize, 12);
3738+
}
3739+
3740+
#[test]
3741+
fn test_statement_after_blank_return() {
3742+
let code = "return; x = 1";
3743+
let tree = LuaParser::parse(code, ParserConfig::default());
3744+
let errors = tree.get_errors();
3745+
3746+
assert_eq!(errors.len(), 1);
3747+
assert_eq!(errors[0].kind, LuaParseErrorKind::SyntaxError);
3748+
assert_eq!(errors[0].message, "expected end of block after return");
3749+
assert_eq!(u32::from(errors[0].range.start()) as usize, 8);
3750+
}
3751+
3752+
#[test]
3753+
fn test_do_return_end() {
3754+
let code = "do return end";
3755+
let tree = LuaParser::parse(code, ParserConfig::default());
3756+
let errors = tree.get_errors();
3757+
3758+
assert!(errors.is_empty());
3759+
}
37273760
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,14 @@ fn parse_return(p: &mut LuaParser) -> ParseResult {
761761
}
762762

763763
if_token_bump(p, LuaTokenKind::TkSemicolon);
764+
765+
if !block_follow(p) {
766+
p.push_error(LuaParseError::syntax_error_from(
767+
&t!("expected end of block after return"),
768+
p.current_token_range(),
769+
));
770+
}
771+
764772
Ok(m.complete(p))
765773
}
766774

0 commit comments

Comments
 (0)