Commit graph

9401 commits

Author SHA1 Message Date
Mazdak Farrokhzad
7dc3c934e8
Rollup merge of #63693 - Centril:polish-parse-or-pats, r=estebank
Fully implement or-pattern parsing

Builds upon the initial parsing in https://github.com/rust-lang/rust/pull/61708 to fully implement or-pattern (`p | q`) parsing as specified in [the grammar section of RFC 2535](https://github.com/rust-lang/rfcs/blob/master/text/2535-or-patterns.md#grammar).

Noteworthy:

- We allow or-patterns in `[p | q, ...]`.
- We allow or-patterns in `let` statements and `for` expressions including with leading `|`.
- We improve recovery for `p || q` (+ tests for that in `multiple-pattern-typo.rs`).
- We improve recovery for `| p | q` in inner patterns (tests in `or-patterns-syntactic-fail.rs`).
- We rigorously test or-pattern parsing (in `or-patterns-syntactic-{pass,fail}.rs`).
- We harden the feature gating tests.
- We do **_not_** change `ast.rs`. That is, `ExprKind::Let.0` and `Arm.pats` still accept `Vec<P<Pat>>`.
   I was starting work on that but it would be cleaner to do this in a separate PR so this one has a narrower scope.

cc @dlrobertson
cc the tracking issue https://github.com/rust-lang/rust/issues/54883.

r? @estebank
2019-08-26 23:55:44 +02:00
Vadim Petrochenkov
ec45b87957 resolve: Block expansion of a derive container until all its derives are resolved
Also mark derive helpers as known as a part of the derive container's expansion instead of expansion of the derives themselves which may happen too late.
2019-08-27 00:31:55 +03:00
Mazdak Farrokhzad
2bd27fbdfe parser: fix span for leading vert. 2019-08-26 22:14:31 +02:00
Pascal Hertleif
94e8ff4f0b Refactor feature gate checking code
Tries to clarify the filtering of active features and make the code more
expressive.
2019-08-25 20:53:37 +02:00
Vadim Petrochenkov
5b7df0922e pprust: Do not print spaces before some tokens 2019-08-25 21:23:17 +03:00
Pascal Hertleif
c9d9616e82 Introduce and use Feature type for feature gates
This replaces the ad-hoc tuples used in the different feature gate files
and unifies their content into a common type, leading to more readable
matches and other good stuff that comes from having named fields. It
also contains the description of each feature as extracted from the doc
comment.
2019-08-25 11:07:16 +02:00
Mazdak Farrokhzad
acb11305e8 parser: TopLevel -> RecoverComma. 2019-08-25 06:15:11 +02:00
Mazdak Farrokhzad
1caaa40768 parser: gracefully handle fn foo(A | B: type). 2019-08-25 05:45:19 +02:00
Mazdak Farrokhzad
b0d374a0b1
Rollup merge of #63854 - c410-f3r:attrs-visit, r=petrochenkov
Modifies how Arg, Arm, Field, FieldPattern and Variant are visited

Part of the necessary work to accomplish #63468.
2019-08-25 02:45:04 +02:00
Mazdak Farrokhzad
083963e58c parser: 'while parsing this or-pattern...' 2019-08-25 01:50:21 +02:00
Mazdak Farrokhzad
1202cb0e2b parser: simplify parse_pat_with_or_{inner} 2019-08-25 01:00:19 +02:00
Mazdak Farrokhzad
0ab8430332 parser: reword || recovery. 2019-08-24 23:44:28 +02:00
Mazdak Farrokhzad
e3747722fb parser: extract recover_inner_leading_vert. 2019-08-24 23:10:46 +02:00
Mazdak Farrokhzad
3a405421e7 parse_top_pat: silence leading vert gating sometimes. 2019-08-24 23:05:04 +02:00
Mazdak Farrokhzad
a9ef8592e4 parser: bool -> TopLevel. 2019-08-24 22:48:23 +02:00
Mazdak Farrokhzad
b2966e651d parser: bool -> GateOr. 2019-08-24 22:29:57 +02:00
Mazdak Farrokhzad
b205055c7b parser: better recovery for || in inner pats. 2019-08-24 21:53:55 +02:00
Mazdak Farrokhzad
5f6bec8ecf parser: drive-by: simplify parse_arg_general. 2019-08-24 21:53:55 +02:00
Mazdak Farrokhzad
95792b4d5a parser: let stmts & for exprs: allow or-patterns. 2019-08-24 21:53:55 +02:00
Mazdak Farrokhzad
92d66a1317 parser: document parse_pat. 2019-08-24 21:53:55 +02:00
Mazdak Farrokhzad
b7178ef983 parser: parse_pats -> parse_top_pat{_unpack}. 2019-08-24 21:53:55 +02:00
Mazdak Farrokhzad
8f6a0cdb0f parser: document ban_unexpected_or_or. 2019-08-24 21:32:49 +02:00
Mazdak Farrokhzad
39f5e5bec4 parser: move maybe_recover_unexpected_comma to a more appropriate place. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
6498959377 parser: use eat_or_separator for leading vert. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
dc5bbaf7b2 parser: improve parse_pat_with_or docs. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
7b59b4f14d parser: extract eat_or_separator. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
a4a34ab62d parser: integrate maybe_recover_unexpected_comma in parse_pat_with_or. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
21d9b85c0d parser: extract maybe_recover_unexpected_comma. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
f852c7ce1c parser: simplify parse_pat_with_or. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
30b841dce0 parser: improve or-patterns recovery. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
0bbea47794 parser: refactor parse_pat_with_or + use it in [p0, p1, ..] pats. 2019-08-24 21:32:48 +02:00
Mazdak Farrokhzad
1ba7550a89 parser: type alias type Expected = Option<&'static str>;. 2019-08-24 21:31:54 +02:00
Mazdak Farrokhzad
5299d8a191 parser: extract ban_unexpected_or_or. 2019-08-24 21:31:54 +02:00
Caio
6a3d517314 Modifies how Arg, Arm, Field, FieldPattern and Variant are visited
Part of the necessary work to accomplish #63468.
2019-08-24 13:54:40 -03:00
Pascal Hertleif
c9619a4202 Use doc comments for feature gate descriptions
This is just in preparation for future usage of these texts.
2019-08-24 17:47:26 +02:00
bors
5ade61a4f1 Auto merge of #63823 - petrochenkov:noapply2, r=matthewjasper
Audit uses of `apply_mark` in built-in macros + Remove default macro transparencies

Every use of `apply_mark` in a built-in or procedural macro is supposed to look like this
```rust
location.with_ctxt(SyntaxContext::root().apply_mark(ecx.current_expansion.id))
```
where `SyntaxContext::root()` means that the built-in/procedural macro is defined directly, rather than expanded from some other macro.

However, few people understood what `apply_mark` does, so we had a lot of copy-pasted uses of it looking e.g. like
```rust
span = span.apply_mark(ecx.current_expansion.id);
```
, which doesn't really make sense for procedural macros, but at the same time is not too harmful, if the macros use the traditional `macro_rules` hygiene.

So, to fight this, we stop using `apply_mark` directly in built-in macro implementations, and follow the example of regular proc macros instead and use analogues of `Span::def_site()` and `Span::call_site()`, which are much more intuitive and less error-prone.
- `ecx.with_def_site_ctxt(span)` takes the `span`'s location and combines it with a def-site context.
- `ecx.with_call_site_ctxt(span)` takes the `span`'s location and combines it with a call-site context.

Even if called multiple times (which sometimes happens due to some historical messiness of the built-in macro code) these functions will produce the same result, unlike `apply_mark` which will grow  the mark chain further in this case.

---

After `apply_mark`s in built-in macros are eliminated, the remaining `apply_mark`s are very few in number, so we can start passing the previously implicit `Transparency` argument to them explicitly, thus eliminating the need in `default_transparency` fields in hygiene structures and `#[rustc_macro_transparency]` annotations on built-in macros.

So, the task of making built-in macros opaque can now be formulated as "eliminate `with_legacy_ctxt` in favor of `with_def_site_ctxt`" rather than "replace `#[rustc_macro_transparency = "semitransparent"]` with `#[rustc_macro_transparency = "opaque"]`".

r? @matthewjasper
2019-08-24 14:07:06 +00:00
Mazdak Farrokhzad
6febb75ec8 syntax: move feature_gate.rs. 2019-08-23 01:41:54 +02:00
Mazdak Farrokhzad
87eafd6c1b syntax: extract check.rs. 2019-08-23 01:41:49 +02:00
Mazdak Farrokhzad
e5aa2dd1ff builtin_attrs.rs: retain FIXMEs. 2019-08-23 01:41:13 +02:00
Mazdak Farrokhzad
d286fe0b8d builtin_attrs.rs: organize! 2019-08-23 01:41:04 +02:00
Mazdak Farrokhzad
584388c4aa builtin_attrs.rs: cleanup with (un)gated!. 2019-08-23 01:40:52 +02:00
Mazdak Farrokhzad
0d19d1d775 builtin_attrs.rs: refactor rustc_attrs entries. 2019-08-23 01:40:37 +02:00
Mazdak Farrokhzad
1c979ad552 builtin_attrs.rs: simplify cfg_fn. 2019-08-23 01:39:59 +02:00
Mazdak Farrokhzad
332a77e621 syntax: extract builin_attrs.rs. 2019-08-23 01:39:54 +02:00
Mazdak Farrokhzad
7afb2a82ec syntax: extract active.rs feature gates. 2019-08-23 01:39:44 +02:00
Mazdak Farrokhzad
975455b37d syntax: extract removed.rs feature gates. 2019-08-23 01:39:38 +02:00
Mazdak Farrokhzad
b873743c02 syntax: extract accepted.rs feature gates. 2019-08-23 01:39:29 +02:00
Vadim Petrochenkov
6548a5fa5d Remove default macro transparencies
All transparancies are passed explicitly now.
Also remove `#[rustc_macro_transparency]` annotations from built-in macros, they are no longer used.
`#[rustc_macro_transparency]` only makes sense for declarative macros now.
2019-08-23 01:53:20 +03:00
Vadim Petrochenkov
cf9db76454 hygiene: Require passing transparency explicitly to apply_mark 2019-08-23 01:44:33 +03:00
Vadim Petrochenkov
0fb01d219c Audit uses of apply_mark in built-in macros
Replace them with equivalents of `Span::{def_site,call_site}` from proc macro API.
The new API is much less error prone and doesn't rely on macros having default transparency.
2019-08-23 01:44:33 +03:00