Clean up resolve_trait_reference
.
This commit is contained in:
parent
46bd5d3fa0
commit
93fd214d61
1 changed files with 32 additions and 33 deletions
|
@ -1807,41 +1807,40 @@ impl<'a> Resolver<'a> {
|
|||
path_depth: usize)
|
||||
-> Result<PathResolution, ()> {
|
||||
self.resolve_path(id, trait_path, path_depth, TypeNS).and_then(|path_res| {
|
||||
if let Def::Trait(_) = path_res.base_def {
|
||||
debug!("(resolving trait) found trait def: {:?}", path_res);
|
||||
Ok(path_res)
|
||||
} else if path_res.base_def == Def::Err {
|
||||
Err(true)
|
||||
} else {
|
||||
let mut err =
|
||||
resolve_struct_error(self,
|
||||
trait_path.span,
|
||||
ResolutionError::IsNotATrait(&path_names_to_string(trait_path,
|
||||
path_depth)));
|
||||
|
||||
// If it's a typedef, give a note
|
||||
if let Def::TyAlias(..) = path_res.base_def {
|
||||
let trait_name = trait_path.segments.last().unwrap().identifier.name;
|
||||
err.span_label(trait_path.span,
|
||||
&format!("`{}` is not a trait", trait_name));
|
||||
|
||||
let definition_site = {
|
||||
let segments = &trait_path.segments;
|
||||
if trait_path.global {
|
||||
self.resolve_crate_relative_path(trait_path.span, segments, TypeNS)
|
||||
} else {
|
||||
self.resolve_module_relative_path(trait_path.span, segments, TypeNS)
|
||||
}.map(|binding| binding.span).unwrap_or(syntax_pos::DUMMY_SP)
|
||||
};
|
||||
|
||||
if definition_site != syntax_pos::DUMMY_SP {
|
||||
err.span_label(definition_site,
|
||||
&format!("type aliases cannot be used for traits"));
|
||||
}
|
||||
match path_res.base_def {
|
||||
Def::Trait(_) => {
|
||||
debug!("(resolving trait) found trait def: {:?}", path_res);
|
||||
return Ok(path_res);
|
||||
}
|
||||
err.emit();
|
||||
Err(true)
|
||||
Def::Err => return Err(true),
|
||||
_ => {}
|
||||
}
|
||||
|
||||
let mut err = resolve_struct_error(self, trait_path.span, {
|
||||
ResolutionError::IsNotATrait(&path_names_to_string(trait_path, path_depth))
|
||||
});
|
||||
|
||||
// If it's a typedef, give a note
|
||||
if let Def::TyAlias(..) = path_res.base_def {
|
||||
let trait_name = trait_path.segments.last().unwrap().identifier.name;
|
||||
err.span_label(trait_path.span, &format!("`{}` is not a trait", trait_name));
|
||||
|
||||
let definition_site = {
|
||||
let segments = &trait_path.segments;
|
||||
if trait_path.global {
|
||||
self.resolve_crate_relative_path(trait_path.span, segments, TypeNS)
|
||||
} else {
|
||||
self.resolve_module_relative_path(trait_path.span, segments, TypeNS)
|
||||
}.map(|binding| binding.span).unwrap_or(syntax_pos::DUMMY_SP)
|
||||
};
|
||||
|
||||
if definition_site != syntax_pos::DUMMY_SP {
|
||||
err.span_label(definition_site,
|
||||
&format!("type aliases cannot be used for traits"));
|
||||
}
|
||||
}
|
||||
err.emit();
|
||||
Err(true)
|
||||
}).map_err(|error_reported| {
|
||||
if error_reported { return }
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue