Catch getter, setter, indexer errors
This commit is contained in:
parent
b311688fee
commit
6e701bfe83
@ -22,6 +22,7 @@ pub trait ExportedParams: Sized {
|
|||||||
pub struct AttrItem {
|
pub struct AttrItem {
|
||||||
pub key: proc_macro2::Ident,
|
pub key: proc_macro2::Ident,
|
||||||
pub value: Option<syn::LitStr>,
|
pub value: Option<syn::LitStr>,
|
||||||
|
pub span: proc_macro2::Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ExportInfo {
|
pub struct ExportInfo {
|
||||||
@ -46,6 +47,7 @@ pub fn parse_punctuated_items(
|
|||||||
|
|
||||||
let mut attrs: Vec<AttrItem> = Vec::new();
|
let mut attrs: Vec<AttrItem> = Vec::new();
|
||||||
for arg in arg_list {
|
for arg in arg_list {
|
||||||
|
let arg_span = arg.span();
|
||||||
let (key, value) = match arg {
|
let (key, value) = match arg {
|
||||||
syn::Expr::Assign(syn::ExprAssign {
|
syn::Expr::Assign(syn::ExprAssign {
|
||||||
ref left,
|
ref left,
|
||||||
@ -78,7 +80,7 @@ pub fn parse_punctuated_items(
|
|||||||
.ok_or_else(|| syn::Error::new(attr_path.span(), "expecting attribute name"))?,
|
.ok_or_else(|| syn::Error::new(attr_path.span(), "expecting attribute name"))?,
|
||||||
x => return Err(syn::Error::new(x.span(), "expecting identifier")),
|
x => return Err(syn::Error::new(x.span(), "expecting identifier")),
|
||||||
};
|
};
|
||||||
attrs.push(AttrItem { key, value });
|
attrs.push(AttrItem { key, value, span: arg_span });
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(ExportInfo { item_span: list_span, items: attrs })
|
Ok(ExportInfo { item_span: list_span, items: attrs })
|
||||||
|
@ -64,23 +64,38 @@ impl ExportedParams for ExportedFnParams {
|
|||||||
let mut return_raw = false;
|
let mut return_raw = false;
|
||||||
let mut skip = false;
|
let mut skip = false;
|
||||||
for attr in attrs {
|
for attr in attrs {
|
||||||
let crate::attrs::AttrItem { key, value } = attr;
|
let crate::attrs::AttrItem { key, value, span: item_span } = attr;
|
||||||
match (key.to_string().as_ref(), value) {
|
match (key.to_string().as_ref(), value) {
|
||||||
("name", Some(s)) => {
|
|
||||||
// check validity of name
|
|
||||||
if s.value().contains('.') {
|
|
||||||
return Err(syn::Error::new(
|
|
||||||
s.span(),
|
|
||||||
"Rhai function names may not contain dot",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
name.push(s.value())
|
|
||||||
}
|
|
||||||
("get", Some(s)) => name.push(make_getter(&s.value())),
|
|
||||||
("set", Some(s)) => name.push(make_setter(&s.value())),
|
|
||||||
("get", None) | ("set", None) | ("name", None) => {
|
("get", None) | ("set", None) | ("name", None) => {
|
||||||
return Err(syn::Error::new(key.span(), "requires value"))
|
return Err(syn::Error::new(key.span(), "requires value"))
|
||||||
}
|
},
|
||||||
|
("name", Some(s)) if &s.value() == FN_IDX_GET => {
|
||||||
|
return Err(syn::Error::new(item_span,
|
||||||
|
"use attribute 'index_get' instead"))
|
||||||
|
},
|
||||||
|
("name", Some(s)) if &s.value() == FN_IDX_SET => {
|
||||||
|
return Err(syn::Error::new(item_span,
|
||||||
|
"use attribute 'index_set' instead"))
|
||||||
|
},
|
||||||
|
("name", Some(s)) if s.value().starts_with("get$") => {
|
||||||
|
return Err(syn::Error::new(item_span,
|
||||||
|
format!("use attribute 'getter = \"{}\"' instead",
|
||||||
|
&s.value()["get$".len()..])))
|
||||||
|
},
|
||||||
|
("name", Some(s)) if s.value().starts_with("set$") => {
|
||||||
|
return Err(syn::Error::new(item_span,
|
||||||
|
format!("use attribute 'setter = \"{}\"' instead",
|
||||||
|
&s.value()["set$".len()..])))
|
||||||
|
},
|
||||||
|
("name", Some(s)) if s.value().contains('.') => {
|
||||||
|
return Err(syn::Error::new(s.span(),
|
||||||
|
"Rhai function names may not contain dot"))
|
||||||
|
},
|
||||||
|
("name", Some(s)) => {
|
||||||
|
name.push(s.value())
|
||||||
|
},
|
||||||
|
("get", Some(s)) => name.push(make_getter(&s.value())),
|
||||||
|
("set", Some(s)) => name.push(make_setter(&s.value())),
|
||||||
("index_get", None) => name.push(FN_IDX_GET.to_string()),
|
("index_get", None) => name.push(FN_IDX_GET.to_string()),
|
||||||
("index_set", None) => name.push(FN_IDX_SET.to_string()),
|
("index_set", None) => name.push(FN_IDX_SET.to_string()),
|
||||||
("return_raw", None) => return_raw = true,
|
("return_raw", None) => return_raw = true,
|
||||||
|
@ -53,7 +53,7 @@ impl ExportedParams for ExportedModParams {
|
|||||||
let mut skip = false;
|
let mut skip = false;
|
||||||
let mut scope = ExportScope::default();
|
let mut scope = ExportScope::default();
|
||||||
for attr in attrs {
|
for attr in attrs {
|
||||||
let AttrItem { key, value } = attr;
|
let AttrItem { key, value, .. } = attr;
|
||||||
match (key.to_string().as_ref(), value) {
|
match (key.to_string().as_ref(), value) {
|
||||||
("name", Some(s)) => name = Some(s.value()),
|
("name", Some(s)) => name = Some(s.value()),
|
||||||
("name", None) => return Err(syn::Error::new(key.span(), "requires value")),
|
("name", None) => return Err(syn::Error::new(key.span(), "requires value")),
|
||||||
|
28
codegen/ui_tests/rhai_fn_rename_to_index_getter.rs
Normal file
28
codegen/ui_tests/rhai_fn_rename_to_index_getter.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use rhai::plugin::*;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Point {
|
||||||
|
x: f32,
|
||||||
|
y: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[export_module]
|
||||||
|
pub mod test_module {
|
||||||
|
pub use super::Point;
|
||||||
|
#[rhai_fn(name = "index$get$")]
|
||||||
|
pub fn test_fn(input: Point) -> bool {
|
||||||
|
input.x > input.y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let n = Point {
|
||||||
|
x: 0.0,
|
||||||
|
y: 10.0,
|
||||||
|
};
|
||||||
|
if test_module::test_fn(n) {
|
||||||
|
println!("yes");
|
||||||
|
} else {
|
||||||
|
println!("no");
|
||||||
|
}
|
||||||
|
}
|
11
codegen/ui_tests/rhai_fn_rename_to_index_getter.stderr
Normal file
11
codegen/ui_tests/rhai_fn_rename_to_index_getter.stderr
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
error: use attribute 'index_get' instead
|
||||||
|
--> $DIR/rhai_fn_rename_to_index_getter.rs:12:15
|
||||||
|
|
|
||||||
|
12 | #[rhai_fn(name = "index$get$")]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `test_module`
|
||||||
|
--> $DIR/rhai_fn_rename_to_index_getter.rs:23:8
|
||||||
|
|
|
||||||
|
23 | if test_module::test_fn(n) {
|
||||||
|
| ^^^^^^^^^^^ use of undeclared type or module `test_module`
|
28
codegen/ui_tests/rhai_fn_rename_to_index_setter.rs
Normal file
28
codegen/ui_tests/rhai_fn_rename_to_index_setter.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use rhai::plugin::*;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Point {
|
||||||
|
x: f32,
|
||||||
|
y: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[export_module]
|
||||||
|
pub mod test_module {
|
||||||
|
pub use super::Point;
|
||||||
|
#[rhai_fn(name = "index$set$")]
|
||||||
|
pub fn test_fn(input: Point) -> bool {
|
||||||
|
input.x > input.y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let n = Point {
|
||||||
|
x: 0.0,
|
||||||
|
y: 10.0,
|
||||||
|
};
|
||||||
|
if test_module::test_fn(n) {
|
||||||
|
println!("yes");
|
||||||
|
} else {
|
||||||
|
println!("no");
|
||||||
|
}
|
||||||
|
}
|
11
codegen/ui_tests/rhai_fn_rename_to_index_setter.stderr
Normal file
11
codegen/ui_tests/rhai_fn_rename_to_index_setter.stderr
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
error: use attribute 'index_set' instead
|
||||||
|
--> $DIR/rhai_fn_rename_to_index_setter.rs:12:15
|
||||||
|
|
|
||||||
|
12 | #[rhai_fn(name = "index$set$")]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `test_module`
|
||||||
|
--> $DIR/rhai_fn_rename_to_index_setter.rs:23:8
|
||||||
|
|
|
||||||
|
23 | if test_module::test_fn(n) {
|
||||||
|
| ^^^^^^^^^^^ use of undeclared type or module `test_module`
|
28
codegen/ui_tests/rhai_fn_rename_to_prop_getter.rs
Normal file
28
codegen/ui_tests/rhai_fn_rename_to_prop_getter.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use rhai::plugin::*;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Point {
|
||||||
|
x: f32,
|
||||||
|
y: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[export_module]
|
||||||
|
pub mod test_module {
|
||||||
|
pub use super::Point;
|
||||||
|
#[rhai_fn(name = "get$foo")]
|
||||||
|
pub fn test_fn(input: Point) -> bool {
|
||||||
|
input.x > input.y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let n = Point {
|
||||||
|
x: 0.0,
|
||||||
|
y: 10.0,
|
||||||
|
};
|
||||||
|
if test_module::test_fn(n) {
|
||||||
|
println!("yes");
|
||||||
|
} else {
|
||||||
|
println!("no");
|
||||||
|
}
|
||||||
|
}
|
11
codegen/ui_tests/rhai_fn_rename_to_prop_getter.stderr
Normal file
11
codegen/ui_tests/rhai_fn_rename_to_prop_getter.stderr
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
error: use attribute 'getter = "foo"' instead
|
||||||
|
--> $DIR/rhai_fn_rename_to_prop_getter.rs:12:15
|
||||||
|
|
|
||||||
|
12 | #[rhai_fn(name = "get$foo")]
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `test_module`
|
||||||
|
--> $DIR/rhai_fn_rename_to_prop_getter.rs:23:8
|
||||||
|
|
|
||||||
|
23 | if test_module::test_fn(n) {
|
||||||
|
| ^^^^^^^^^^^ use of undeclared type or module `test_module`
|
28
codegen/ui_tests/rhai_fn_rename_to_prop_setter.rs
Normal file
28
codegen/ui_tests/rhai_fn_rename_to_prop_setter.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use rhai::plugin::*;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Point {
|
||||||
|
x: f32,
|
||||||
|
y: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[export_module]
|
||||||
|
pub mod test_module {
|
||||||
|
pub use super::Point;
|
||||||
|
#[rhai_fn(name = "get$foo")]
|
||||||
|
pub fn test_fn(input: Point) -> bool {
|
||||||
|
input.x > input.y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let n = Point {
|
||||||
|
x: 0.0,
|
||||||
|
y: 10.0,
|
||||||
|
};
|
||||||
|
if test_module::test_fn(n) {
|
||||||
|
println!("yes");
|
||||||
|
} else {
|
||||||
|
println!("no");
|
||||||
|
}
|
||||||
|
}
|
11
codegen/ui_tests/rhai_fn_rename_to_prop_setter.stderr
Normal file
11
codegen/ui_tests/rhai_fn_rename_to_prop_setter.stderr
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
error: use attribute 'getter = "foo"' instead
|
||||||
|
--> $DIR/rhai_fn_rename_to_prop_setter.rs:12:15
|
||||||
|
|
|
||||||
|
12 | #[rhai_fn(name = "get$foo")]
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0433]: failed to resolve: use of undeclared type or module `test_module`
|
||||||
|
--> $DIR/rhai_fn_rename_to_prop_setter.rs:23:8
|
||||||
|
|
|
||||||
|
23 | if test_module::test_fn(n) {
|
||||||
|
| ^^^^^^^^^^^ use of undeclared type or module `test_module`
|
Loading…
Reference in New Issue
Block a user