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)
- };
+ match path_res.base_def {
+ Def::Trait(_) => {
+ debug!("(resolving trait) found trait def: {:?}", path_res);
+ return Ok(path_res);
+ }
+ Def::Err => return Err(true),
+ _ => {}
+ }
- if definition_site != syntax_pos::DUMMY_SP {
- err.span_label(definition_site,
- &format!("type aliases cannot be used for traits"));
- }
+ 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)
}
+ err.emit();
+ Err(true)
}).map_err(|error_reported| {
if error_reported { return }