about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Belliard <vincent@famillebelliard.fr>2012-08-22 20:40:42 +0200
committerVincent Belliard <vincent@famillebelliard.fr>2012-08-25 17:01:52 +0200
commitbdbedb9d35903be0e3f587c603db49c014ef7d9f (patch)
tree39c7e052e0a2cf909c9247b11af25d9bf303fdcb
parent6277046fa0a5c119885ba33bcb6ac2f4fba0228f (diff)
implements issue #2356
-rw-r--r--src/rustc/middle/resolve3.rs62
1 files changed, 56 insertions, 6 deletions
diff --git a/src/rustc/middle/resolve3.rs b/src/rustc/middle/resolve3.rs
index 53515179f80..b1023a52d20 100644
--- a/src/rustc/middle/resolve3.rs
+++ b/src/rustc/middle/resolve3.rs
@@ -4069,6 +4069,47 @@ struct Resolver {
         }
     }
 
+    fn name_exists_in_scope_class(name: &str) -> bool {
+        let mut i = self.type_ribs.len();
+        while i != 0 {
+          i -= 1;
+          let rib = self.type_ribs.get_elt(i);
+          match rib.kind {
+            MethodRibKind(node_id, _) =>
+              for vec::each(self.crate.node.module.items) |item| {
+                if item.id == node_id {
+                  match item.node {
+                    item_class(class_def, _) => {
+                      for vec::each(class_def.fields) |field| {
+                        match field.node.kind {
+                          syntax::ast::unnamed_field
+                            => {},
+                          syntax::ast::named_field(ident, _, _)
+                            => {
+                              if str::eq_slice(self.session.str_of(ident),
+                                               name) {
+                                return true
+                              }
+                            }
+                        }
+                      }
+                      for vec::each(class_def.methods) |method| {
+                        if str::eq_slice(self.session.str_of(method.ident),
+                                         name) {
+                          return true
+                        }
+                      }
+                    }
+                    _ => {}
+                  }
+                }
+            },
+          _ => {}
+        }
+      }
+      return false;
+    }
+
     fn resolve_expr(expr: @expr, visitor: ResolveVisitor) {
         // First, record candidate traits for this expression if it could
         // result in the invocation of a method call.
@@ -4093,12 +4134,21 @@ struct Resolver {
                         self.record_def(expr.id, def);
                     }
                     none => {
-                        self.session.span_err(
-                            expr.span,
-                            fmt!("unresolved name: %s",
-                                 connect(path.idents.map(
-                                     |x| self.session.str_of(x)),
-                                         ~"::")));
+                        let wrong_name =
+                            connect(path.idents.map(
+                                |x| self.session.str_of(x)), ~"::") ;
+                        if self.name_exists_in_scope_class(wrong_name) {
+                            self.session.span_err(expr.span,
+                                        fmt!("unresolved name: %s. \
+                                            Did you mean: self.%s",
+                                        wrong_name,
+                                        wrong_name));
+                        }
+                        else {
+                            self.session.span_err(expr.span,
+                                                fmt!("unresolved name: %s",
+                                                wrong_name));
+                        }
                     }
                 }