Merge pull request #4312 from Dretch/issue-2914
Work towards fixing issue #2914
This commit is contained in:
commit
08d9c5be2f
1 changed files with 35 additions and 48 deletions
|
|
@ -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.
|
||||
|
|
@ -2103,20 +2106,29 @@ 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)
|
||||
-> ~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
|
||||
|
|
@ -4501,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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4705,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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5103,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`. \
|
||||
|
|
@ -5170,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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5491,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_;
|
||||
|
|
@ -5514,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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue