Improve diagnostics for duplicated names
This commit is contained in:
parent
a50da4bb8c
commit
525ffe6f5a
@ -177,7 +177,17 @@ pub(crate) fn check_rename_collisions(fns: &Vec<ExportedFn>) -> Result<(), syn::
|
||||
}
|
||||
} else {
|
||||
let ident = itemfn.name();
|
||||
names.insert(ident.to_string(), ident.span());
|
||||
if let Some(other_span) = names.insert(ident.to_string(), ident.span()) {
|
||||
let mut err = syn::Error::new(
|
||||
ident.span(),
|
||||
format!("duplicate function '{}'", ident.to_string()),
|
||||
);
|
||||
err.combine(syn::Error::new(
|
||||
other_span,
|
||||
format!("duplicated function '{}'", ident.to_string()),
|
||||
));
|
||||
return Err(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (new_name, attr_span) in renames.drain() {
|
||||
|
31
codegen/ui_tests/rhai_mod_name_collisions.rs
Normal file
31
codegen/ui_tests/rhai_mod_name_collisions.rs
Normal file
@ -0,0 +1,31 @@
|
||||
use rhai::plugin::*;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Point {
|
||||
x: f32,
|
||||
y: f32,
|
||||
}
|
||||
|
||||
#[export_module]
|
||||
pub mod test_module {
|
||||
pub use super::Point;
|
||||
pub fn test_fn(input: Point) -> bool {
|
||||
input.x > input.y
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
17
codegen/ui_tests/rhai_mod_name_collisions.stderr
Normal file
17
codegen/ui_tests/rhai_mod_name_collisions.stderr
Normal file
@ -0,0 +1,17 @@
|
||||
error: duplicate function 'test_fn'
|
||||
--> $DIR/rhai_mod_name_collisions.rs:16:12
|
||||
|
|
||||
16 | pub fn test_fn(input: Point) -> bool {
|
||||
| ^^^^^^^
|
||||
|
||||
error: duplicated function 'test_fn'
|
||||
--> $DIR/rhai_mod_name_collisions.rs:12:12
|
||||
|
|
||||
12 | pub fn test_fn(input: Point) -> bool {
|
||||
| ^^^^^^^
|
||||
|
||||
error[E0433]: failed to resolve: use of undeclared type or module `test_module`
|
||||
--> $DIR/rhai_mod_name_collisions.rs:26:8
|
||||
|
|
||||
26 | if test_module::test_fn(n) {
|
||||
| ^^^^^^^^^^^ use of undeclared type or module `test_module`
|
27
codegen/ui_tests/rhai_mod_unknown_type.rs
Normal file
27
codegen/ui_tests/rhai_mod_unknown_type.rs
Normal file
@ -0,0 +1,27 @@
|
||||
use rhai::plugin::*;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Point {
|
||||
x: f32,
|
||||
y: f32,
|
||||
}
|
||||
|
||||
#[export_module]
|
||||
pub mod test_module {
|
||||
pub use super::Point;
|
||||
pub fn test_fn(input: Pointer) -> 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");
|
||||
}
|
||||
}
|
23
codegen/ui_tests/rhai_mod_unknown_type.stderr
Normal file
23
codegen/ui_tests/rhai_mod_unknown_type.stderr
Normal file
@ -0,0 +1,23 @@
|
||||
error[E0412]: cannot find type `Pointer` in this scope
|
||||
--> $DIR/rhai_mod_unknown_type.rs:12:27
|
||||
|
|
||||
4 | pub struct Point {
|
||||
| ---------------- similarly named struct `Point` defined here
|
||||
...
|
||||
12 | pub fn test_fn(input: Pointer) -> bool {
|
||||
| ^^^^^^^
|
||||
|
|
||||
help: a struct with a similar name exists
|
||||
|
|
||||
12 | pub fn test_fn(input: Point) -> bool {
|
||||
| ^^^^^
|
||||
help: consider importing one of these items
|
||||
|
|
||||
11 | use core::fmt::Pointer;
|
||||
|
|
||||
11 | use crate::mem::fmt::Pointer;
|
||||
|
|
||||
11 | use std::fmt::Pointer;
|
||||
|
|
||||
11 | use syn::export::fmt::Pointer;
|
||||
|
|
27
codegen/ui_tests/rhai_mod_unknown_type_return.rs
Normal file
27
codegen/ui_tests/rhai_mod_unknown_type_return.rs
Normal file
@ -0,0 +1,27 @@
|
||||
use rhai::plugin::*;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Point {
|
||||
x: f32,
|
||||
y: f32,
|
||||
}
|
||||
|
||||
#[export_module]
|
||||
pub mod test_module {
|
||||
pub use super::Point;
|
||||
pub fn test_fn(input: Point) -> boool {
|
||||
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");
|
||||
}
|
||||
}
|
5
codegen/ui_tests/rhai_mod_unknown_type_return.stderr
Normal file
5
codegen/ui_tests/rhai_mod_unknown_type_return.stderr
Normal file
@ -0,0 +1,5 @@
|
||||
error[E0412]: cannot find type `boool` in this scope
|
||||
--> $DIR/rhai_mod_unknown_type_return.rs:12:37
|
||||
|
|
||||
12 | pub fn test_fn(input: Point) -> boool {
|
||||
| ^^^^^ help: a builtin type with a similar name exists: `bool`
|
13
diag_test/Cargo.toml
Normal file
13
diag_test/Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
||||
[package]
|
||||
name = "diag_test"
|
||||
version = "0.1.0"
|
||||
authors = ["J Henry Waugh <jhwgh1968@protonmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
[[bin]]
|
||||
name = "test_template"
|
||||
path = "test_template.rs"
|
||||
|
||||
[dependencies]
|
||||
rhai = { version = "*", path = ".." }
|
35
diag_test/test_template.rs
Normal file
35
diag_test/test_template.rs
Normal file
@ -0,0 +1,35 @@
|
||||
use rhai::plugin::*;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Point {
|
||||
x: f32,
|
||||
y: f32,
|
||||
}
|
||||
|
||||
#[export_module]
|
||||
pub mod test_module {
|
||||
#[rhai_mod(name = "bar")]
|
||||
pub mod test_mod {
|
||||
#[rhai_fn(name = "foo")]
|
||||
pub fn test_fn(input: Point) -> bool {
|
||||
input.x > input.y
|
||||
}
|
||||
|
||||
#[rhai_fn(return_raw)]
|
||||
pub fn test_fn_raw(input: Point) -> Result<rhai::Dynamic, Box<rhai::EvalAltResult>> {
|
||||
Ok(Dynamic::from(input.x > input.y))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let n = Point {
|
||||
x: 0.0,
|
||||
y: 10.0,
|
||||
};
|
||||
if test_module::test_mod::test_fn(n) {
|
||||
println!("yes");
|
||||
} else {
|
||||
println!("no");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user