about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2024-07-06 15:44:12 +0200
committerLukas Wirth <lukastw97@gmail.com>2024-07-06 15:44:12 +0200
commite8be2a0ac5c4756fed82ea6c38532a12cd9d68d2 (patch)
treec727c3fa057272b3fb45295570d7682cc1e821b4
parentfc92ee8f24edd1b6c6116b93b8118dfb1bc400ff (diff)
downloadrust-e8be2a0ac5c4756fed82ea6c38532a12cd9d68d2.tar.gz
rust-e8be2a0ac5c4756fed82ea6c38532a12cd9d68d2.zip
Diagnose unresolved self value in path expression
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs3
-rw-r--r--src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/unresolved_ident.rs16
2 files changed, 18 insertions, 1 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs b/src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs
index 36472435370..7a0f7872a64 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs
@@ -440,7 +440,8 @@ impl InferenceContext<'_> {
                 let ty = match self.infer_path(p, tgt_expr.into()) {
                     Some(ty) => ty,
                     None => {
-                        if matches!(p, Path::Normal { mod_path, .. } if mod_path.is_ident()) {
+                        if matches!(p, Path::Normal { mod_path, .. } if mod_path.is_ident() || mod_path.is_self())
+                        {
                             self.push_diagnostic(InferenceDiagnostic::UnresolvedIdent {
                                 expr: tgt_expr,
                             });
diff --git a/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/unresolved_ident.rs b/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/unresolved_ident.rs
index 7aa3e16536c..9a81682aaeb 100644
--- a/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/unresolved_ident.rs
+++ b/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/unresolved_ident.rs
@@ -56,4 +56,20 @@ fn main() {
 "#,
         );
     }
+
+    #[test]
+    fn unresolved_self_val() {
+        check_diagnostics(
+            r#"
+fn main() {
+    self.a;
+  //^^^^ error: no such value in this scope
+    let self:
+         self =
+            self;
+          //^^^^ error: no such value in this scope
+}
+"#,
+        );
+    }
 }