From 03f75b629a5d1d8e0a5916abdef4499f0c7c61d6 Mon Sep 17 00:00:00 2001 From: Corey Richardson Date: Mon, 13 May 2013 23:18:27 -0400 Subject: [PATCH 1/6] Better error reporting with renaming imports --- src/librustc/middle/resolve.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index a962ea07c5422..95b8281d4b2aa 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2593,7 +2593,12 @@ pub impl Resolver { let start_index; match module_prefix_result { Failed => { - self.session.span_err(span, ~"unresolved name"); + let mpath = self.idents_to_str(module_path); + let idx = str::rfind(self.idents_to_str(module_path), |c| { c == ':' }).unwrap(); + self.session.span_err(span, fmt!("unresolved import: could not find `%s` in `%s`", + str::substr(mpath, idx, mpath.len() - idx), + // idx - 1 to account for the extra semicolon + str::substr(mpath, 0, idx - 1))); return Failed; } Indeterminate => { From 52f8b22d4f304abd6227f1476396b0a3a94e241f Mon Sep 17 00:00:00 2001 From: Corey Richardson Date: Tue, 14 May 2013 00:42:10 -0400 Subject: [PATCH 2/6] Add test for resolution errors --- src/test/compile-fail/unresolved-import.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/compile-fail/unresolved-import.rs b/src/test/compile-fail/unresolved-import.rs index 1bd3efeadcbba..9c5ff311b0d03 100644 --- a/src/test/compile-fail/unresolved-import.rs +++ b/src/test/compile-fail/unresolved-import.rs @@ -8,5 +8,11 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use foo::bar; //~ ERROR unresolved import. maybe a missing +use foo::bar; //~ ERROR unresolved import. maybe a missing `extern mod foo`? //~^ ERROR failed to resolve import +use x = bar::baz; //~ ERROR unresolved import: could not find `baz` in `bar` + //~^ ERROR failed to resolve import + +mod bar { + struct bar; +} From 62cbea1ca1441a7d9c97d3c2aa36f9fa546ad9a4 Mon Sep 17 00:00:00 2001 From: Corey Richardson Date: Tue, 14 May 2013 14:19:59 -0400 Subject: [PATCH 3/6] Add span to some import resolution errors --- src/librustc/middle/resolve.rs | 18 ++++++++++-------- src/test/compile-fail/unresolved-import.rs | 6 +++--- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 95b8281d4b2aa..90a153996dc84 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2058,7 +2058,8 @@ pub impl Resolver { self.resolve_single_import(module_, containing_module, target, - source); + source, + span); } GlobImport => { let span = import_directive.span; @@ -2121,7 +2122,8 @@ pub impl Resolver { module_: @mut Module, containing_module: @mut Module, target: ident, - source: ident) + source: ident, + span: span) -> ResolveResult<()> { debug!("(resolving single import) resolving `%s` = `%s::%s` from \ `%s`", @@ -2325,14 +2327,14 @@ pub impl Resolver { } if resolve_fail { - self.session.err(fmt!("unresolved import: there is no `%s` in `%s`", - *self.session.str_of(source), - self.module_to_str(containing_module))); + self.session.span_err(span, fmt!("unresolved import: there is no `%s` in `%s`", + *self.session.str_of(source), + self.module_to_str(containing_module))); return Failed; } else if priv_fail { - self.session.err(fmt!("unresolved import: found `%s` in `%s` but it is private", - *self.session.str_of(source), - self.module_to_str(containing_module))); + self.session.span_err(span, fmt!("unresolved import: found `%s` in `%s` but it is \ + private", *self.session.str_of(source), + self.module_to_str(containing_module))); return Failed; } diff --git a/src/test/compile-fail/unresolved-import.rs b/src/test/compile-fail/unresolved-import.rs index 9c5ff311b0d03..fc69c34c1183b 100644 --- a/src/test/compile-fail/unresolved-import.rs +++ b/src/test/compile-fail/unresolved-import.rs @@ -9,9 +9,9 @@ // except according to those terms. use foo::bar; //~ ERROR unresolved import. maybe a missing `extern mod foo`? - //~^ ERROR failed to resolve import -use x = bar::baz; //~ ERROR unresolved import: could not find `baz` in `bar` - //~^ ERROR failed to resolve import + //~^ ERROR failed to resolve import `foo::bar` +use x = bar::baz; //~ ERROR unresolved import: there is no `baz` in `bar` + //~^ ERROR failed to resolve import `bar::baz` mod bar { struct bar; From 3bfc1ca91d6f46bcfad71f0096b3f5a49718d421 Mon Sep 17 00:00:00 2001 From: Corey Richardson Date: Tue, 14 May 2013 19:28:28 -0400 Subject: [PATCH 4/6] Get span from import_directive --- src/librustc/middle/resolve.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 90a153996dc84..a50f78511cc56 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2059,7 +2059,7 @@ pub impl Resolver { containing_module, target, source, - span); + import_directive.span); } GlobImport => { let span = import_directive.span; From 8a69dba84a1be53949d0c24452b9910c7119ed68 Mon Sep 17 00:00:00 2001 From: Corey Richardson Date: Tue, 14 May 2013 19:49:04 -0400 Subject: [PATCH 5/6] Fix ICE --- src/librustc/middle/resolve.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index a50f78511cc56..3f1bd2b9a3c7f 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2596,11 +2596,17 @@ pub impl Resolver { match module_prefix_result { Failed => { let mpath = self.idents_to_str(module_path); - let idx = str::rfind(self.idents_to_str(module_path), |c| { c == ':' }).unwrap(); - self.session.span_err(span, fmt!("unresolved import: could not find `%s` in `%s`", - str::substr(mpath, idx, mpath.len() - idx), - // idx - 1 to account for the extra semicolon - str::substr(mpath, 0, idx - 1))); + match str::rfind(self.idents_to_str(module_path), |c| { c == ':' }) { + Some(idx) => { + self.session.span_err(span, fmt!("unresolved import: could not find `%s` \ + in `%s`", str::substr(mpath, idx, + mpath.len() - idx), + // idx - 1 to account for the extra + // colon + str::substr(mpath, 0, idx - 1))); + }, + None => (), + }; return Failed; } Indeterminate => { From 68863153bba3ab994978b49216cb58641e7a9fbb Mon Sep 17 00:00:00 2001 From: Corey Richardson Date: Tue, 14 May 2013 20:33:41 -0400 Subject: [PATCH 6/6] Fix resolution tests --- src/test/compile-fail/issue-2123.rs | 1 + src/test/compile-fail/issue-2937.rs | 1 + src/test/compile-fail/issue-3993-2.rs | 1 + src/test/compile-fail/issue-3993-3.rs | 1 + src/test/compile-fail/issue-3993.rs | 1 + src/test/compile-fail/super-at-top-level.rs | 3 +-- 6 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/compile-fail/issue-2123.rs b/src/test/compile-fail/issue-2123.rs index 56f0c5e3dd066..6d617d338ed94 100644 --- a/src/test/compile-fail/issue-2123.rs +++ b/src/test/compile-fail/issue-2123.rs @@ -9,6 +9,7 @@ // except according to those terms. use x = m::f; //~ ERROR failed to resolve import + //~^ unresolved import: there is no `f` in `m` mod m { } diff --git a/src/test/compile-fail/issue-2937.rs b/src/test/compile-fail/issue-2937.rs index 56f0c5e3dd066..b225c5496e249 100644 --- a/src/test/compile-fail/issue-2937.rs +++ b/src/test/compile-fail/issue-2937.rs @@ -9,6 +9,7 @@ // except according to those terms. use x = m::f; //~ ERROR failed to resolve import + //~^ ERROR unresolved import: there is no `f` in `m` mod m { } diff --git a/src/test/compile-fail/issue-3993-2.rs b/src/test/compile-fail/issue-3993-2.rs index 1293dc8a875df..2ca871cd11ca0 100644 --- a/src/test/compile-fail/issue-3993-2.rs +++ b/src/test/compile-fail/issue-3993-2.rs @@ -9,6 +9,7 @@ // except according to those terms. use zoo::{duck, goose}; //~ ERROR failed to resolve import + //~^ ERROR unresolved import: found `goose` in `zoo` but it is private mod zoo { pub enum bird { diff --git a/src/test/compile-fail/issue-3993-3.rs b/src/test/compile-fail/issue-3993-3.rs index 1ccf019a7c1bc..ccda6f158eda2 100644 --- a/src/test/compile-fail/issue-3993-3.rs +++ b/src/test/compile-fail/issue-3993-3.rs @@ -9,6 +9,7 @@ // except according to those terms. use zoo::fly; //~ ERROR failed to resolve import + //~^ ERROR unresolved import: found `fly` in `zoo` but it is private mod zoo { priv type fly = (); diff --git a/src/test/compile-fail/issue-3993.rs b/src/test/compile-fail/issue-3993.rs index 5b47c3e24060b..450ea023bcbe6 100644 --- a/src/test/compile-fail/issue-3993.rs +++ b/src/test/compile-fail/issue-3993.rs @@ -9,6 +9,7 @@ // except according to those terms. use zoo::fly; //~ ERROR failed to resolve import + //~^ ERROR unresolved import: found `fly` in `zoo` but it is private mod zoo { priv fn fly() {} diff --git a/src/test/compile-fail/super-at-top-level.rs b/src/test/compile-fail/super-at-top-level.rs index f1064a6290561..9ec92e6dbfabc 100644 --- a/src/test/compile-fail/super-at-top-level.rs +++ b/src/test/compile-fail/super-at-top-level.rs @@ -1,5 +1,4 @@ -use super::f; //~ ERROR unresolved name -//~^ ERROR failed to resolve import +use super::f; //~ ERROR failed to resolve import fn main() { }