Defer computing the Self type of methods
diff --git a/syntax/check.rs b/syntax/check.rs
index 0d25e77..5e8cc09 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -148,16 +148,28 @@
fn check_api_fn(cx: &mut Check, efn: &ExternFn) {
if let Some(receiver) = &efn.receiver {
- if !cx.types.structs.contains_key(&receiver.ty)
+ let ref span = span_for_receiver_error(receiver);
+
+ if receiver.ty == "Self" {
+ let mutability = match receiver.mutability {
+ Some(_) => "mut ",
+ None => "",
+ };
+ let msg = format!(
+ "unnamed receiver type is only allowed if the surrounding \
+ extern block contains exactly one extern type; \
+ use `self: &{mutability}TheType`",
+ mutability = mutability,
+ );
+ cx.error(span, msg);
+ } else if !cx.types.structs.contains_key(&receiver.ty)
&& !cx.types.cxx.contains(&receiver.ty)
&& !cx.types.rust.contains(&receiver.ty)
{
- let span = span_for_receiver_error(receiver);
cx.error(span, "unrecognized receiver type");
}
if receiver.lifetime.is_some() {
- let span = span_for_receiver_error(receiver);
cx.error(span, "references with explicit lifetimes are not supported");
}
}