diff --git a/crates/emmylua_parser/locales/app.yml b/crates/emmylua_parser/locales/app.yml index 27a4bb8a3..3d0159490 100644 --- a/crates/emmylua_parser/locales/app.yml +++ b/crates/emmylua_parser/locales/app.yml @@ -255,6 +255,8 @@ expected 'end' to close while statement: en: expected 'end' to close while statement zh_CN: 期望 'end' 来关闭while语句 zh_HK: 期望 'end' 來關閉while語句 +expected end of block after return: + en: expected end of block after return expected 'function', variable name, or attribute after 'local': en: expected 'function', variable name, or attribute after 'local' zh_CN: 期望在 'local' 后有 'function'、变量名或属性 diff --git a/crates/emmylua_parser/src/grammar/doc/test.rs b/crates/emmylua_parser/src/grammar/doc/test.rs index b6e176eae..76a763071 100644 --- a/crates/emmylua_parser/src/grammar/doc/test.rs +++ b/crates/emmylua_parser/src/grammar/doc/test.rs @@ -3724,4 +3724,37 @@ Syntax(Chunk)@0..47 assert!(errors[0].range.is_empty()); assert_eq!(u32::from(errors[0].range.start()) as usize, code.len()); } + + #[test] + fn test_statement_after_return() { + let code = "return 1, 2 x = 1"; + let tree = LuaParser::parse(code, ParserConfig::default()); + let errors = tree.get_errors(); + + assert_eq!(errors.len(), 1); + assert_eq!(errors[0].kind, LuaParseErrorKind::SyntaxError); + assert_eq!(errors[0].message, "expected end of block after return"); + assert_eq!(u32::from(errors[0].range.start()) as usize, 12); + } + + #[test] + fn test_statement_after_blank_return() { + let code = "return; x = 1"; + let tree = LuaParser::parse(code, ParserConfig::default()); + let errors = tree.get_errors(); + + assert_eq!(errors.len(), 1); + assert_eq!(errors[0].kind, LuaParseErrorKind::SyntaxError); + assert_eq!(errors[0].message, "expected end of block after return"); + assert_eq!(u32::from(errors[0].range.start()) as usize, 8); + } + + #[test] + fn test_do_return_end() { + let code = "do return end"; + let tree = LuaParser::parse(code, ParserConfig::default()); + let errors = tree.get_errors(); + + assert!(errors.is_empty()); + } } diff --git a/crates/emmylua_parser/src/grammar/lua/stat.rs b/crates/emmylua_parser/src/grammar/lua/stat.rs index f066df848..eb9fb5b0e 100644 --- a/crates/emmylua_parser/src/grammar/lua/stat.rs +++ b/crates/emmylua_parser/src/grammar/lua/stat.rs @@ -761,6 +761,14 @@ fn parse_return(p: &mut LuaParser) -> ParseResult { } if_token_bump(p, LuaTokenKind::TkSemicolon); + + if !block_follow(p) { + p.push_error(LuaParseError::syntax_error_from( + &t!("expected end of block after return"), + p.current_token_range(), + )); + } + Ok(m.complete(p)) }