Improve diagnostics for duplicated names

This commit is contained in:
J Henry Waugh 2020-08-27 22:26:05 -05:00
parent a50da4bb8c
commit 525ffe6f5a
9 changed files with 189 additions and 1 deletions

View File

@ -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() {

View 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");
}
}

View 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`

View 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");
}
}

View 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;
|

View 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");
}
}

View 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
View 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 = ".." }

View 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");
}
}