]> git.lizzy.rs Git - rust.git/commitdiff
Clean up `resolve_trait_reference`.
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>
Sun, 31 Jul 2016 20:40:03 +0000 (20:40 +0000)
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>
Sun, 31 Jul 2016 20:40:03 +0000 (20:40 +0000)
src/librustc_resolve/lib.rs

index 23281d25c8d527ea3967864fbacc772053c746b5..33e5282188c2826f34e6381f32b2815a122b087a 100644 (file)
@@ -1807,41 +1807,40 @@ fn resolve_trait_reference(&mut self,
                                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 }