@@ -4069,6 +4069,47 @@ struct Resolver {
4069
4069
}
4070
4070
}
4071
4071
4072
+ fn name_exists_in_scope_class(name: &str) -> bool {
4073
+ let mut i = self.type_ribs.len();
4074
+ while i != 0 {
4075
+ i -= 1;
4076
+ let rib = self.type_ribs.get_elt(i);
4077
+ match rib.kind {
4078
+ MethodRibKind(node_id, _) =>
4079
+ for vec::each(self.crate.node.module.items) |item| {
4080
+ if item.id == node_id {
4081
+ match item.node {
4082
+ item_class(class_def, _) => {
4083
+ for vec::each(class_def.fields) |field| {
4084
+ match field.node.kind {
4085
+ syntax::ast::unnamed_field
4086
+ => {},
4087
+ syntax::ast::named_field(ident, _, _)
4088
+ => {
4089
+ if str::eq_slice(self.session.str_of(ident),
4090
+ name) {
4091
+ return true
4092
+ }
4093
+ }
4094
+ }
4095
+ }
4096
+ for vec::each(class_def.methods) |method| {
4097
+ if str::eq_slice(self.session.str_of(method.ident),
4098
+ name) {
4099
+ return true
4100
+ }
4101
+ }
4102
+ }
4103
+ _ => {}
4104
+ }
4105
+ }
4106
+ },
4107
+ _ => {}
4108
+ }
4109
+ }
4110
+ return false;
4111
+ }
4112
+
4072
4113
fn resolve_expr(expr: @expr, visitor: ResolveVisitor) {
4073
4114
// First, record candidate traits for this expression if it could
4074
4115
// result in the invocation of a method call.
@@ -4093,12 +4134,21 @@ struct Resolver {
4093
4134
self.record_def(expr.id, def);
4094
4135
}
4095
4136
none => {
4096
- self.session.span_err(
4097
- expr.span,
4098
- fmt!(" unresolved name: %s",
4099
- connect(path.idents.map(
4100
- |x| self.session.str_of(x)),
4101
- ~" :: ")));
4137
+ let wrong_name =
4138
+ connect(path.idents.map(
4139
+ |x| self.session.str_of(x)), ~" :: ") ;
4140
+ if self.name_exists_in_scope_class(wrong_name) {
4141
+ self.session.span_err(expr.span,
4142
+ fmt!(" unresolved name: %s. \
4143
+ Did you mean: self . %s",
4144
+ wrong_name,
4145
+ wrong_name));
4146
+ }
4147
+ else {
4148
+ self.session.span_err(expr.span,
4149
+ fmt!(" unresolved name: %s",
4150
+ wrong_name));
4151
+ }
4102
4152
}
4103
4153
}
4104
4154
0 commit comments