158 Commits

Author SHA1 Message Date
Shoyu Vanilla (Flint)
ca83ff37d7 Merge pull request #20972 from A4-Tacks/impl-never-type
Fix not parse never type in inherent impl
2025-11-15 09:17:33 +02:00
Shoyu Vanilla
3d636a6ca6 fix: Do not make false positive syntax errors on frontmatter 2025-10-31 00:45:26 +09:00
Lukas Wirth
47c5af2f16 fix: Improve error recovery when parsing malformed function return types 2025-10-29 12:33:35 +01:00
A4-Tacks
891391a6e5
Improve parsing of missing name in MethodCallExpr
Usually, this occurs when preparing to input a method name

However, once an identifier is entered, it is not reasonable for the parsing result to change from `CallExpr(FieldExpr())` to `MethodCallExpr()`

Example
---
```rust
fn foo() {
    x.
    ()
}
```

**Before this PR**:

```text
SOURCE_FILE
  FN
    FN_KW "fn"
    WHITESPACE " "
    NAME
      IDENT "foo"
    PARAM_LIST
      L_PAREN "("
      R_PAREN ")"
    WHITESPACE " "
    BLOCK_EXPR
      STMT_LIST
        L_CURLY "{"
        WHITESPACE "\n    "
        CALL_EXPR
          FIELD_EXPR
            PATH_EXPR
              PATH
                PATH_SEGMENT
                  NAME_REF
                    IDENT "x"
            DOT "."
          WHITESPACE "\n    "
          ARG_LIST
            L_PAREN "("
            R_PAREN ")"
        WHITESPACE "\n"
        R_CURLY "}"
  WHITESPACE "\n"
error 17: expected field name or number
```

**After this PR**:

```text
SOURCE_FILE
  FN
    FN_KW "fn"
    WHITESPACE " "
    NAME
      IDENT "foo"
    PARAM_LIST
      L_PAREN "("
      R_PAREN ")"
    WHITESPACE " "
    BLOCK_EXPR
      STMT_LIST
        L_CURLY "{"
        WHITESPACE "\n    "
        METHOD_CALL_EXPR
          PATH_EXPR
            PATH
              PATH_SEGMENT
                NAME_REF
                  IDENT "x"
          DOT "."
          WHITESPACE "\n    "
          ARG_LIST
            L_PAREN "("
            R_PAREN ")"
        WHITESPACE "\n"
        R_CURLY "}"
  WHITESPACE "\n"
error 17: expected method name, field name or number
```
2025-10-22 14:37:12 +08:00
Ed Page
8231a2b01c feat(parser): Don't error on frontmatter 2025-10-16 11:07:05 -05:00
Ed Page
fff06bc181 test(parser): Show current frontmatter behavior 2025-10-16 11:06:41 -05:00
A4-Tacks
2707cf7ce6
Allow generic_param_list for static items 2025-10-09 09:45:42 +08:00
A4-Tacks
216db6d5b4
Improve parsing error for static and const
Example
---
```rust
static C<i32>: u32 = 0;
```
->
```diff
-error 8: missing type for `const` or `static`
+error 8: `static` may not have generic parameters
```

---

```rust
const C = 0;
```
->
```diff
-error 7: missing type for `const` or `static`
+error 7: missing type for `const`
```

---

```rust
static C = 0;
```
->
```diff
-error 8: missing type for `const` or `static`
+error 8: missing type for `static`
```
2025-10-06 12:48:38 +08:00
Ralf Anton Beier
e7c3fe1978
feat: hint at unterminated strings in unknown prefix errors
When encountering 'unknown literal prefix' errors, check for unbalanced
quotes in recent code and suggest checking for unterminated string literals.
2025-08-14 19:30:29 +02:00
Deadbeef
82f174fbd9 Merge Trait and TraitAlias handling 2025-08-13 15:28:08 +08:00
Nathaniel McCallum
943b42f743 parser: fix parsing of trait bound polarity and for-binders
The rustc AST allows both `for<>` binders and `?` polarity
modifiers in trait bounds, but they are parsed in a specific
order and validated for correctness:

  1. `for<>` binder is parsed first.
  2. Polarity modifiers (`?`, `!`) are parsed second.
  3. The parser validates that binders and polarity modifiers
     do not conflict:

```rust
if let Some(binder_span) = binder_span {
    match modifiers.polarity {
        BoundPolarity::Maybe(polarity_span) => {
            // Error: "for<...> binder not allowed with ? polarity"
        }
    }
}
```

This implies:

- `for<> ?Sized` → Valid syntax. Invalid semantics.
- `?for<> Sized` → Invalid syntax.

However, rust-analyzer incorrectly had special-case logic that
allowed `?for<>` as valid syntax. This fix removes that incorrect
special case, making rust-analyzer reject `?for<> Sized` as a
syntax error, matching rustc behavior.

This has caused confusion in other crates (such as syn) which
rely on these files to implement correct syntax evaluation.
2025-08-10 02:21:11 -04:00
Chayim Refael Friedman
c7ceb39f67 Parse for<'a> [const]
And also refactor parsing of HRTB.
2025-07-22 16:24:42 +03:00
Chayim Refael Friedman
95c04c4503 Make global_asm!() work
Because apparently, we were not accepting inline asm in item position, completely breaking it.
2025-07-09 18:55:27 +03:00
Chayim Refael Friedman
bd8087e86e Differentiate between asm!(), global_asm!() and naked_asm!(), and make only asm!() unsafe 2025-07-09 17:37:27 +03:00
Lukas Wirth
5924b38e3d Parse new const trait syntax 2025-06-26 11:08:30 +02:00
Lukas Wirth
5d3001795a Better parser recovery for macro calls in type bound position 2025-06-05 16:11:30 +02:00
Lukas Wirth
7c3de05e3a Give path segment type anchors their own grammar rule 2025-06-04 11:40:05 +02:00
Arthur Baars
55328ba9b4 Update expected test output 2025-05-30 21:16:38 +00:00
Arthur Baars
a91b67e682 Run 'cargo codegen' to update tests 2025-05-30 21:05:12 +00:00
Chayim Refael Friedman
5ed11234cc Improve asm support
Including:

 - Infer `label {}` and `const` operands.
 - Correctly handle unsafe check inside `label {}`.
 - Fix an embarrassing parser typo that cause labels to never be part of the AST
2025-05-15 23:36:00 +03:00
Lukas Wirth
e0dca847ad fix: Improve parser recovery a bit 2025-04-30 16:40:01 +02:00
Lukas Wirth
1c68d83569
Merge pull request #19657 from ChayimFriedman2/better-offset-of
feat: Better support `offset_of!()`
2025-04-22 13:28:34 +00:00
Lukas Wirth
e3f7d18458
Merge pull request #19643 from ChayimFriedman2/generic-const-items
feat: Parse generic consts
2025-04-21 12:17:08 +00:00
Lukas Wirth
1b6948e88a feat: parse super let 2025-04-21 13:47:42 +02:00
Chayim Refael Friedman
db6db2aacc Allow wrapping builtin#offset_of fields argument in parentheses
This is necessary to correctly handle nested fields (`foo.bar`), see the comments in the code for explanation.
2025-04-21 03:43:15 +03:00
Chayim Refael Friedman
812a035689 Parse generic consts
A lang team experiment, https://github.com/rust-lang/rust/issues/113521.
2025-04-21 02:11:56 +03:00
Lukas Wirth
452e2ca031 feat: parse unsafe record fields 2025-03-25 08:55:31 +01:00
Lukas Wirth
a505420751 chore: Bump Edition::CURRENT to 2024 2025-03-17 12:29:19 +01:00
niller-g
18d6e281b3 Fix codegen of parser inline tests runner
When running `cargo codegen` the `crates/parser/test_data/generated/runner.rs` file is only updated when some file in `crates/parser/test_data/inline` changes. However this is not sufficient in all cases
2025-02-23 11:41:34 +01:00
Shoyu Vanilla
7de0b2e75a feat: Implement default-field-values 2025-01-27 19:38:35 +09:00
Lukas Wirth
cd199eacd0
Merge pull request #18908 from jnyfah/error-braces
Fix: Detect missing errors for } braces before else in let...else statements
2025-01-17 13:29:56 +00:00
jnyfah
31c07e4676 CRLF to LF 2025-01-16 16:46:06 +01:00
jnyfah
b96819ca44 added tests 2025-01-16 16:19:47 +01:00
lh123
9809143562 feat: complete raw, const keyword 2025-01-16 18:27:59 +08:00
Chayim Refael Friedman
02d47f3a81 Fix a case where completion was unable to expand a macro
Which caused the macros of the popular `tracing` crate to not offer completions.

The reason is rather complicated: it boils down to macro ignoring their input and completion always choosing the first expansion.
2024-12-20 13:14:59 +02:00
Lukas Wirth
cddaf7485f
Merge pull request #18625 from Veykril/push-npnxwpxuzlqz
fix: Fix parser getting stuck for bad asm expressions
2024-12-06 05:11:08 +00:00
Lukas Wirth
4a24e729b0 fix: Fix parser getting stuck for bad asm expressions 2024-12-06 05:57:00 +01:00
Lukas Wirth
a049941c1a fix: Fix parsing of dyn T in generic arg on 2015 edition 2024-12-05 20:26:49 +01:00
Lukas Wirth
f3d7415bd6 Parse lifetime bounds in lifetime param into TypeBoundList
This mainly aids in error recovery but also makes it a bit easier to handle lifetime resolution.
While doing so it also came apparent that we were not actually lowering lifetime outlives relationships within lifetime parameter declaration bounds, so this fixes that.
2024-12-05 17:52:02 +01:00
Lukas Wirth
df7ab62a06 fix: Fix parsing of integer/keyword name refs in various places 2024-12-05 15:27:50 +01:00
Lukas Wirth
65c0b29720 Fix parsing of parenthesized type args and RTN 2024-12-04 11:48:47 +01:00
Lukas Wirth
caba872f88 fix: Don't create empty path nodes 2024-12-04 07:01:45 +01:00
Lukas Wirth
b6fc9c14ac Better parser recovery for incomplete attributes 2024-12-04 06:45:59 +01:00
Chayim Refael Friedman
210ead8454 Parse patterns with leading pipe properly in all places 2024-10-31 15:32:37 +02:00
Chayim Refael Friedman
3a8dc27e72 Only parse safe as contextual kw in extern blocks
I don't like the party of `bool`s that is becoming, but two isn't worth a refactoring yet IMO.
2024-10-30 19:28:33 +02:00
Lukas Wirth
3b3a87fe9b
Merge pull request #18419 from ChayimFriedman2/leading-or
fix: Put leading `|` in patterns under `OrPat`
2024-10-27 11:25:16 +00:00
Chayim Refael Friedman
e12a001b55 Put leading | in patterns under OrPat
Previously it was one level above, and that caused problems with macros that expand to it, because macros expect to get only one top-level node.
2024-10-27 13:11:38 +02:00
Chayim Refael Friedman
3b3beaab31 Correctly handle #"" in edition <2024 2024-10-27 00:47:13 +03:00
Lukas Wirth
95298a2e61 fix: Fix incorrect parsing of use bounds
Also lower them a bit more
2024-10-22 13:34:26 +02:00
roife
9f1e450c4f feat: initial support for safe_kw in extern blocks 2024-10-20 17:12:52 +08:00