Skip to content

Commit

Permalink
给世处语句添加 lint (BE-25520)
Browse files Browse the repository at this point in the history
  • Loading branch information
A4-Tacks committed Jan 29, 2025
1 parent 41527cf commit 1846407
Show file tree
Hide file tree
Showing 7 changed files with 217 additions and 21 deletions.
6 changes: 3 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "mindustry_logic_bang_lang"
version = "0.17.22"
version = "0.17.23"
edition = "2021"

authors = ["A4-Tacks <[email protected]>"]
Expand Down
2 changes: 1 addition & 1 deletion tools/logic_lint/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "logic_lint"
version = "0.1.10"
version = "0.1.11"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand Down
63 changes: 61 additions & 2 deletions tools/logic_lint/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,10 @@ impl<'a> Source<'a> {
let env_assignables = &[
"@counter",
][..];
let lines = s.lines().enumerate()
let lines = s.lines()
.map(str::trim_start)
.filter(|line| !(line.starts_with('#') || line.is_empty()))
.enumerate()
.map(|(lineno, line)| Line::from_line(lineno, line))
.filter(|line| {
line.args().len() != 1 || !line.args()[0].ends_with(':')
Expand Down Expand Up @@ -196,7 +199,7 @@ impl<'a> Var<'a> {

#[cfg(test)]
mod tests {
use lints::WarningLint;
use lints::{ErrorLint, WarningLint};

use super::*;

Expand Down Expand Up @@ -231,4 +234,60 @@ mod tests {
),
]);
}

#[test]
fn world_processor_test() {
let s = r#"
getblock block result 0 0
setblock block @air 0 0 @derelict 0
spawn @dagger 10 10 90 @sharded result1
status false wet unit 10
weathersense result2 @rain
weatherset @rain true
spawnwave 10 10 false
setrule waveSpacing 10 0 0 100 100
message announce 3 @wait
cutscene pan 100 100 0.06 0
effect warn 0 0 2 %ffaaff
explosion @crux 0 0 5 50 true true false true
setrate 10
fetch unit result3 @sharded 0 @conveyor
sync var
getflag result4 "flag"
setflag "flag" true
setprop @copper block1 0
playsound false @sfx-pew 1 1 0 @thisx @thisy true
setmarker pos 0 0 0 0
makemarker shape 0 0 0 true
localeprint "name"
status fales wet unit 10
"#;
let src = Source::from_str(s);
assert_eq!(src.lint(), vec![
Lint::new(
&Var::new(0, 2, "result"),
WarningLint::NeverUsed,
),
Lint::new(
&Var::new(2, 6, "result1"),
WarningLint::NeverUsed,
),
Lint::new(
&Var::new(4, 1, "result2"),
WarningLint::NeverUsed,
),
Lint::new(
&Var::new(13, 2, "result3"),
WarningLint::NeverUsed,
),
Lint::new(
&Var::new(15, 1, "result4"),
WarningLint::NeverUsed,
),
Lint::new(
&Var::new(22, 1, "fales"),
ErrorLint::InvalidOper { expected: &["true", "false"] },
),
]);
}
}
159 changes: 147 additions & 12 deletions tools/logic_lint/src/lints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ macro_rules! make_lints {
$lint_vis:vis fn $lint_name:ident<$lifetime:lifetime>($src:ident, $line:ident) -> $res_ty:ty;
let $lints:ident;
$(
$(|)? $($prefix:literal)|+ ($argc:literal) $body:block
$(|)? $($prefix:literal)|+ ($($argc:literal),+) $body:block
)*
} => {
$lint_vis fn $lint_name<$lifetime>(
Expand All @@ -34,7 +34,7 @@ macro_rules! make_lints {
match $line.args() {
$(
[$crate::Var { value: $($prefix)|+, .. }, ..] => {
$lints.extend(check_argc($src, $line, $argc));
$lints.extend(check_argc($src, $line, &[$($argc),+]));
$body
},
)*
Expand Down Expand Up @@ -186,14 +186,38 @@ thread_local! {
["jump" _ _ v v]
["ubind" v]
["ucontrol" "within" v v v a]
["ucontrol" _ v v v v v]
["ucontrol" _ v v v v v]
["uradar" _ _ _ _ _ v a]
["ulocate" "ore" _ _ v a a a]
["ulocate" "building" _ v _ a a a a]
["ulocate" "spawn" _ _ _ a a a a]
["ulocate" "damaged" _ _ _ a a a a]
["ulocate" "ore" _ _ v a a a]
["ulocate" "building" _ v _ a a a a]
["ulocate" "spawn" _ _ _ a a a a]
["ulocate" "damaged" _ _ _ a a a a]
// world
["getblock" _ a v v]
["setblock" _ v v v v v]
["spawn" v v v v v a]
["status" "true" _ v]
["status" _ _ v v]
["weathersense" a v]
["weatherset" v v]
["spawnwave" v v v]
["setrule" _ v v v v v]
["message" _ v v]
["cutscene" _ v v v v]
["effect" _ v v v v v]
["explosion" v v v v v v v v v]
["setrate" v]
["fetch" _ a v v v]
["sync" v]
["getflag" a v]
["setflag" v v]
["setprop" v v v]
["playsound" "true" v v v _ v v v]
["playsound" "false" v v v v _ _ v]
["playsound" _ v v v v v v v]
["setmarker" _ v v v v]
["makemarker" _ v v v v]
["localeprint" v]
// 兜底, 对未录入的语句参数统一为使用
[_ v v v v v v v v v v v v v v v v v v]
}
Expand Down Expand Up @@ -287,19 +311,21 @@ fn check_cmd<'a>(
.chain(check_vars(src, line, args))
}
#[must_use]
#[track_caller]
fn check_argc<'a>(
_src: &'a crate::Source<'a>,
line: &'a crate::Line<'a>,
expected: usize,
expected: &[usize],
) -> Option<Lint<'a>> {
assert_ne!(expected.len(), 0);
let len = line.args().len() - 1;
if len == expected {
if expected.contains(&len) {
return None;
}
Lint::new(
line.args().first().unwrap(),
WarningLint::ArgsCountNotMatch {
expected,
expected: expected[0],
found: len,
}
).into()
Expand Down Expand Up @@ -461,6 +487,7 @@ make_lints! {
lints.extend(check_vars(src, line, [a, b]));
}
}
// world
"getblock" (4) {
if let [_, method, result, x, y]
= line.args() {
Expand All @@ -470,14 +497,122 @@ make_lints! {
lints.extend(check_vars(src, line, [x, y]));
}
}
"setblock" (6) {
if let [_, method, args @ ..] = line.args() {
lints.extend(check_oper(method, &["floor", "ore", "block"]));
lints.extend(check_vars(src, line, args));
}
}
"spawn" (6) {
if let [_, args @ .., result] = line.args() {
lints.extend(check_assign_var(src, line, result));
lints.extend(check_vars(src, line, args));
}
}
"status" (4) {
if let [_, method, _status, args @ ..] = line.args() {
lints.extend(check_oper(method, &["true", "false"]));
lints.extend(check_vars(src, line, args));
}
}
"weathersense" (2) {
if let [_, result, args @ ..] = line.args() {
lints.extend(check_assign_var(src, line, result));
lints.extend(check_vars(src, line, args));
}
}
"weatherset" (2) {
if let [_, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"spawnwave" (3) {
if let [_, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"setrule" (6) {
if let [_, _method, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"message" (3) {
if let [_, method, args @ ..] = line.args() {
lints.extend(check_oper(method, &[
"notify", "announce", "toast", "mission"]));
lints.extend(check_vars(src, line, args));
}
}
"cutscene" (5) {
if let [_, method, args @ ..] = line.args() {
lints.extend(check_oper(method, &["pan", "zoom", "stop"]));
lints.extend(check_vars(src, line, args));
}
}
"effect" (5, 6) {
if let [_, _method, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"explosion" (9) {
if let [_, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"setrate" (1) {
if let [_, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"fetch" (5) {
if let [_, method, result, a, b, c]
= line.args() {
if let [_, method, result, a, b, c] = line.args() {
lints.extend(check_oper(method, FETCH_METHODS));
lints.extend(check_assign_var(src, line, result));
lints.extend(check_vars(src, line, [a, b, c]));
}
}
"sync" (1) {
if let [_, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"getflag" (2) {
if let [_, result, args @ ..] = line.args() {
lints.extend(check_assign_var(src, line, result));
lints.extend(check_vars(src, line, args));
}
}
"setflag" (2) {
if let [_, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"setprop" (3) {
if let [_, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"playsound" (8) {
if let [_, method, args @ ..] = line.args() {
lints.extend(check_oper(method, &["true", "false"]));
lints.extend(check_vars(src, line, args));
}
}
"setmarker" (5) {
if let [_, _method, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"makemarker" (5) {
if let [_, _method, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
"localeprint" (1) {
if let [_, args @ ..] = line.args() {
lints.extend(check_vars(src, line, args));
}
}
}

pub trait ShowLint {
Expand Down
2 changes: 1 addition & 1 deletion tools/tag_code/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "tag_code"
version = "0.2.4"
version = "0.2.5"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand Down
4 changes: 3 additions & 1 deletion tools/tag_code/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -947,6 +947,8 @@ pub fn mdt_logic_split(s: &str) -> Result<Vec<&str>, usize> {
.unwrap();
return Err(char_idx + 1)
}
} else if s1.starts_with('#') {
s1 = "";
} else {
let end = s1
.find(|ch: char| ch.is_whitespace() || ch == '"')
Expand Down Expand Up @@ -1537,7 +1539,7 @@ mod tests {
(r#"甲乙""#, 3),
];
for &(src, char_num) in faileds {
assert_eq!(mdt_logic_split(src).unwrap_err(), char_num);
assert_eq!(mdt_logic_split(src).unwrap_err(), char_num, "{src:?}");
}
}
}

0 comments on commit 1846407

Please sign in to comment.