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 {
|
} else {
|
||||||
let ident = itemfn.name();
|
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() {
|
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