From b6aafe928dbae9e610486105c2a3ec1d2fe2070e Mon Sep 17 00:00:00 2001 From: gareth Date: Thu, 27 Dec 2012 19:54:34 +0000 Subject: [PATCH 1/3] When an import fails to resolve, make the error message say which import it actually was. This makes debugging imports like: use aa::{x, y, z} easier (for issue #2914). --- src/librustc/middle/resolve.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index acaf668969c63..cdc41bc9da6ea 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2086,8 +2086,11 @@ impl Resolver { match self.resolve_import_for_module(module_, import_directive) { Failed => { // We presumably emitted an error. Continue. - self.session.span_err(import_directive.span, - ~"failed to resolve import"); + let idents = import_directive.module_path.get(); + let msg = fmt!("failed to resolve import: %s", + self.import_path_to_str(idents, + *import_directive.subclass)); + self.session.span_err(import_directive.span, msg); } Indeterminate => { // Bail out. We'll come around next time. @@ -2117,6 +2120,26 @@ impl Resolver { // XXX: Shouldn't copy here. We need string builder functionality. return result; } + + fn import_directive_subclass_to_str(subclass: ImportDirectiveSubclass) + -> ~str { + match subclass { + SingleImport(_target, source, _ns) => self.session.str_of(source), + GlobImport => ~"*" + } + } + + fn import_path_to_str(idents: ~[ident], subclass: ImportDirectiveSubclass) + -> ~str { + if idents.is_empty() { + self.import_directive_subclass_to_str(subclass) + } else { + fmt!("%s::%s", + self.idents_to_str(idents), + self.import_directive_subclass_to_str(subclass)) + } + } + /** * Attempts to resolve the given import. The return value indicates * failure if we're certain the name does not exist, indeterminate if we From d68954efa09c4cbd16a07d4bd93de688d64074c3 Mon Sep 17 00:00:00 2001 From: gareth Date: Sat, 29 Dec 2012 11:44:02 +0000 Subject: [PATCH 2/3] Fix the build by removing trailing whitespace. --- src/librustc/middle/resolve.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index cdc41bc9da6ea..1771edad809c0 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2120,7 +2120,7 @@ impl Resolver { // XXX: Shouldn't copy here. We need string builder functionality. return result; } - + fn import_directive_subclass_to_str(subclass: ImportDirectiveSubclass) -> ~str { match subclass { @@ -2128,7 +2128,7 @@ impl Resolver { GlobImport => ~"*" } } - + fn import_path_to_str(idents: ~[ident], subclass: ImportDirectiveSubclass) -> ~str { if idents.is_empty() { @@ -2139,7 +2139,7 @@ impl Resolver { self.import_directive_subclass_to_str(subclass)) } } - + /** * Attempts to resolve the given import. The return value indicates * failure if we're certain the name does not exist, indeterminate if we From 624421aa3d5d09fd59834c524f1909120685232d Mon Sep 17 00:00:00 2001 From: gareth Date: Sat, 29 Dec 2012 18:25:09 +0000 Subject: [PATCH 3/3] Simplify idents_to_str and use it in more places. --- src/librustc/middle/resolve.rs | 56 ++++++---------------------------- 1 file changed, 10 insertions(+), 46 deletions(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 1771edad809c0..ffb696ec4f946 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -2106,19 +2106,8 @@ impl Resolver { } fn idents_to_str(idents: ~[ident]) -> ~str { - // XXX: str::connect should do this. - let mut result = ~""; - let mut first = true; - for idents.each() |ident| { - if first { - first = false; - } else { - result += ~"::"; - } - result += self.session.str_of(*ident); - } - // XXX: Shouldn't copy here. We need string builder functionality. - return result; + let ident_strs = idents.map(|&ident| self.session.str_of(ident)); + return str::connect(ident_strs, "::"); } fn import_directive_subclass_to_str(subclass: ImportDirectiveSubclass) @@ -4524,17 +4513,14 @@ impl Resolver { // Write the result into the def map. debug!("(resolving type) writing resolution for `%s` \ (id %d)", - connect(path.idents.map( - |x| self.session.str_of(*x)), ~"::"), + self.idents_to_str(path.idents), path_id); self.record_def(path_id, def); } None => { self.session.span_err (ty.span, fmt!("use of undeclared type name `%s`", - connect(path.idents.map( - |x| self.session.str_of(*x)), - ~"::"))); + self.idents_to_str(path.idents))); } } } @@ -4728,9 +4714,7 @@ impl Resolver { self.session.span_err( path.span, fmt!("`%s` does not name a structure", - connect(path.idents.map( - |x| self.session.str_of(*x)), - ~"::"))); + self.idents_to_str(path.idents))); } } } @@ -5126,14 +5110,11 @@ impl Resolver { Some(def) => { // Write the result into the def map. debug!("(resolving expr) resolved `%s`", - connect(path.idents.map( - |x| self.session.str_of(*x)), ~"::")); + self.idents_to_str(path.idents)); self.record_def(expr.id, def); } None => { - let wrong_name = - connect(path.idents.map( - |x| self.session.str_of(*x)), ~"::") ; + let wrong_name = self.idents_to_str(path.idents); if self.name_exists_in_scope_struct(wrong_name) { self.session.span_err(expr.span, fmt!("unresolved name: `%s`. \ @@ -5193,9 +5174,7 @@ impl Resolver { self.session.span_err( path.span, fmt!("`%s` does not name a structure", - connect(path.idents.map( - |x| self.session.str_of(*x)), - ~"::"))); + self.idents_to_str(path.idents))); } } @@ -5514,7 +5493,7 @@ impl Resolver { // hit. // - /// A somewhat inefficient routine to print out the name of a module. + /// A somewhat inefficient routine to obtain the name of a module. fn module_to_str(module_: @Module) -> ~str { let idents = DVec(); let mut current_module = module_; @@ -5537,22 +5516,7 @@ impl Resolver { if idents.len() == 0 { return ~"???"; } - - let mut string = ~""; - let mut i = idents.len() - 1; - loop { - if i < idents.len() - 1 { - string += ~"::"; - } - string += self.session.str_of(idents.get_elt(i)); - - if i == 0 { - break; - } - i -= 1; - } - - return string; + return self.idents_to_str(vec::reversed(idents.get())); } fn dump_module(module_: @Module) {