about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbit-aloo <sshourya17@gmail.com>2025-03-03 15:58:33 +0530
committerbit-aloo <sshourya17@gmail.com>2025-03-03 15:58:33 +0530
commitc2a630eaa591907315fb8a1f55ec5b9e9b4b2d18 (patch)
tree382758293e82d318cd26876e110dc0a0821964c8
parent1840f57dde794e984e3adabba7763ce2bcb10741 (diff)
downloadrust-c2a630eaa591907315fb8a1f55ec5b9e9b4b2d18.tar.gz
rust-c2a630eaa591907315fb8a1f55ec5b9e9b4b2d18.zip
Add dangling impl
- Adds dangling impl diagnostics
- Rename validation test from dangling_impl to dangling_iml_ref
-rw-r--r--src/tools/rust-analyzer/crates/syntax/src/validation.rs27
-rw-r--r--src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rast30
-rw-r--r--src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rs2
-rw-r--r--src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl_reference.rast25
-rw-r--r--src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl_reference.rs1
5 files changed, 54 insertions, 31 deletions
diff --git a/src/tools/rust-analyzer/crates/syntax/src/validation.rs b/src/tools/rust-analyzer/crates/syntax/src/validation.rs
index 0377e7c0e63..85eefac734b 100644
--- a/src/tools/rust-analyzer/crates/syntax/src/validation.rs
+++ b/src/tools/rust-analyzer/crates/syntax/src/validation.rs
@@ -37,6 +37,7 @@ pub(crate) fn validate(root: &SyntaxNode, errors: &mut Vec<SyntaxError>) {
                 ast::FnPtrType(it) => validate_trait_object_fn_ptr_ret_ty(it, errors),
                 ast::MacroRules(it) => validate_macro_rules(it, errors),
                 ast::LetExpr(it) => validate_let_expr(it, errors),
+                ast::ImplTraitType(it) => validate_impl_object_ty(it, errors),
                 _ => (),
             }
         }
@@ -315,21 +316,10 @@ fn validate_path_keywords(segment: ast::PathSegment, errors: &mut Vec<SyntaxErro
 }
 
 fn validate_trait_object_ref_ty(ty: ast::RefType, errors: &mut Vec<SyntaxError>) {
-    match ty.ty() {
-        Some(ast::Type::DynTraitType(ty)) => {
-            if let Some(err) = validate_trait_object_ty(ty) {
-                errors.push(err);
-            }
-        }
-        Some(ast::Type::ImplTraitType(ty)) => {
-            if ty.type_bound_list().map_or(0, |tbl| tbl.bounds().count()) == 0 {
-                errors.push(SyntaxError::new(
-                    "At least one trait must be specified",
-                    ty.syntax().text_range(),
-                ));
-            }
+    if let Some(ast::Type::DynTraitType(ty)) = ty.ty() {
+        if let Some(err) = validate_trait_object_ty(ty) {
+            errors.push(err);
         }
-        _ => {}
     }
 }
 
@@ -372,6 +362,15 @@ fn validate_trait_object_ty(ty: ast::DynTraitType) -> Option<SyntaxError> {
     }
 }
 
+fn validate_impl_object_ty(ty: ast::ImplTraitType, errors: &mut Vec<SyntaxError>) {
+    if ty.type_bound_list().map_or(0, |tbl| tbl.bounds().count()) == 0 {
+        errors.push(SyntaxError::new(
+            "At least one trait must be specified",
+            ty.syntax().text_range(),
+        ));
+    }
+}
+
 fn validate_macro_rules(mac: ast::MacroRules, errors: &mut Vec<SyntaxError>) {
     if let Some(vis) = mac.visibility() {
         errors.push(SyntaxError::new(
diff --git a/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rast b/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rast
index dbe6535ac66..2db07ae12a9 100644
--- a/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rast
+++ b/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rast
@@ -1,25 +1,23 @@
-SOURCE_FILE@0..17
-  FN@0..17
+SOURCE_FILE@0..16
+  FN@0..16
     FN_KW@0..2 "fn"
     WHITESPACE@2..3 " "
     NAME@3..4
       IDENT@3..4 "f"
-    PARAM_LIST@4..14
+    PARAM_LIST@4..13
       L_PAREN@4..5 "("
-      PARAM@5..13
+      PARAM@5..12
         WILDCARD_PAT@5..6
           UNDERSCORE@5..6 "_"
         COLON@6..7 ":"
         WHITESPACE@7..8 " "
-        REF_TYPE@8..13
-          AMP@8..9 "&"
-          IMPL_TRAIT_TYPE@9..13
-            IMPL_KW@9..13 "impl"
-            TYPE_BOUND_LIST@13..13
-      R_PAREN@13..14 ")"
-    WHITESPACE@14..15 " "
-    BLOCK_EXPR@15..17
-      STMT_LIST@15..17
-        L_CURLY@15..16 "{"
-        R_CURLY@16..17 "}"
-error 9..13: At least one trait must be specified
+        IMPL_TRAIT_TYPE@8..12
+          IMPL_KW@8..12 "impl"
+          TYPE_BOUND_LIST@12..12
+      R_PAREN@12..13 ")"
+    WHITESPACE@13..14 " "
+    BLOCK_EXPR@14..16
+      STMT_LIST@14..16
+        L_CURLY@14..15 "{"
+        R_CURLY@15..16 "}"
+error 8..12: At least one trait must be specified
diff --git a/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rs b/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rs
index 0b440b4c5af..61706d9e412 100644
--- a/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rs
+++ b/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl.rs
@@ -1 +1 @@
-fn f(_: &impl) {}
\ No newline at end of file
+fn f(_: impl) {}
\ No newline at end of file
diff --git a/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl_reference.rast b/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl_reference.rast
new file mode 100644
index 00000000000..dbe6535ac66
--- /dev/null
+++ b/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl_reference.rast
@@ -0,0 +1,25 @@
+SOURCE_FILE@0..17
+  FN@0..17
+    FN_KW@0..2 "fn"
+    WHITESPACE@2..3 " "
+    NAME@3..4
+      IDENT@3..4 "f"
+    PARAM_LIST@4..14
+      L_PAREN@4..5 "("
+      PARAM@5..13
+        WILDCARD_PAT@5..6
+          UNDERSCORE@5..6 "_"
+        COLON@6..7 ":"
+        WHITESPACE@7..8 " "
+        REF_TYPE@8..13
+          AMP@8..9 "&"
+          IMPL_TRAIT_TYPE@9..13
+            IMPL_KW@9..13 "impl"
+            TYPE_BOUND_LIST@13..13
+      R_PAREN@13..14 ")"
+    WHITESPACE@14..15 " "
+    BLOCK_EXPR@15..17
+      STMT_LIST@15..17
+        L_CURLY@15..16 "{"
+        R_CURLY@16..17 "}"
+error 9..13: At least one trait must be specified
diff --git a/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl_reference.rs b/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl_reference.rs
new file mode 100644
index 00000000000..0b440b4c5af
--- /dev/null
+++ b/src/tools/rust-analyzer/crates/syntax/test_data/parser/validation/dangling_impl_reference.rs
@@ -0,0 +1 @@
+fn f(_: &impl) {}
\ No newline at end of file