Skip to content

Commit

Permalink
Change how arguments passed are counted (Kampfkarren#120)
Browse files Browse the repository at this point in the history
* add gitattribute to fix .stderr files

* fix arguments count

* fix single-quotes

* assume at least one return value

* update changelog

* add test cases
  • Loading branch information
jeparlefrancais authored Jun 24, 2020
1 parent 4be3470 commit f0d05f3
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 5 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.stderr text eol=lf
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
### Changed
- Removed types from `debug.traceback` arguments in the Lua 5.1 standard library
- Made 4th argument to `CFrame.fromMatrix` optional (#113)
- Made standard library aware that functions and `...` can return multiple values

## [0.6.0] - 2020-04-21
### Added
Expand Down
39 changes: 34 additions & 5 deletions selene-lib/src/rules/standard_library.rs
Original file line number Diff line number Diff line change
Expand Up @@ -527,12 +527,32 @@ impl Visitor<'_> for StandardLibraryVisitor<'_> {
}
}

let any_are_vararg = argument_types.iter().any(|(_, argument_type)| {
argument_type.as_ref() == Some(&PassedArgumentType::Primitive(ArgumentType::Vararg))
});
let mut maybe_more_arguments = false;

if let ast::FunctionArgs::Parentheses { arguments, .. } = function_args {
if let Some(ast::punctuated::Pair::End(last)) = arguments.last() {
if let ast::Expression::Value { value, .. } = last {
match &**value {
ast::Value::FunctionCall(_) => {
maybe_more_arguments = true;
}
ast::Value::Symbol(token_ref) => {
if let TokenType::Symbol { symbol } = token_ref.token().token_type() {
if symbol == &full_moon::tokenizer::Symbol::Ellipse {
maybe_more_arguments = true;
}
}
}
_ => {}
}
}
}
};

if (!any_are_vararg && argument_types.len() < expected_args)
|| (!vararg && argument_types.len() > max_args)
let arguments_length = argument_types.len();

if (arguments_length < expected_args && !maybe_more_arguments)
|| (!vararg && arguments_length > max_args)
{
self.diagnostics.push(Diagnostic::new(
"incorrect_standard_library_use",
Expand Down Expand Up @@ -668,6 +688,15 @@ mod tests {
);
}

#[test]
fn test_assert() {
test_lint(
StandardLibraryLint::new(()).unwrap(),
"standard_library",
"assert",
);
}

#[test]
fn test_bad_call_signatures() {
test_lint(
Expand Down
8 changes: 8 additions & 0 deletions selene-lib/tests/lints/standard_library/assert.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
assert(true, "message")
assert(call())
assert(call(), "this is ok")
assert(...)

assert(true)
assert(true, "message", call())
assert(true, "message", ...)
6 changes: 6 additions & 0 deletions selene-lib/tests/lints/standard_library/assert.std.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[[assert.args]]
type = "any"

[[assert.args]]
type = "string"
required = "A failed assertion without a message is unhelpful to users."
24 changes: 24 additions & 0 deletions selene-lib/tests/lints/standard_library/assert.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
error[incorrect_standard_library_use]: standard library function `assert` requires 2 parameters, 1 passed

┌── assert.lua:6:1 ───
6 │ assert(true)
│ ^^^^^^^^^^^^

error[incorrect_standard_library_use]: standard library function `assert` requires 2 parameters, 3 passed

┌── assert.lua:7:1 ───
7 │ assert(true, "message", call())
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[incorrect_standard_library_use]: standard library function `assert` requires 2 parameters, 3 passed

┌── assert.lua:8:1 ───
8 │ assert(true, "message", ...)
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0 comments on commit f0d05f3

Please sign in to comment.