Commit graph

8943 commits

Author SHA1 Message Date
Vadim Petrochenkov
da50d59881 pretty-print: Do not lose the $crate printing flag in print_tt 2019-07-11 12:07:35 +03:00
Mazdak Farrokhzad
7697b2927f
Rollup merge of #62476 - petrochenkov:expref, r=matthewjasper
Continue refactoring macro expansion and resolution

This PR continues the work started in https://github.com/rust-lang/rust/pull/62042.
It contains a set of more or less related refactorings with the general goal of making things simpler and more orthogonal.
Along the way most of the issues uncovered in https://github.com/rust-lang/rust/pull/62086 are fixed.

The PR is better read in per-commit fashion with whitespace changes ignored.
I tried to leave some more detailed commit messages describing the motivation behind the individual changes.

Fixes https://github.com/rust-lang/rust/issues/44692
Fixes https://github.com/rust-lang/rust/issues/52363
Unblocks https://github.com/rust-lang/rust/pull/62086
r? @matthewjasper
2019-07-11 04:33:17 +02:00
Vadim Petrochenkov
baddce5155 expand: Move "derive containers" into a separate InvocationKind variant
`InvocationKind::Attr { attr: None, .. }` meaning something entirely different from a regular attribute was confusing as hell.
2019-07-11 00:12:57 +03:00
Vadim Petrochenkov
b003dd6d9b expand: Merge expand_{bang,attr,derive}_invoc into a single function
It's more convenient to have all this highly related stuff together on one screen (for future refactorings).
The `expand_invoc` function is compact enough now, after all the previous refactorings.
2019-07-11 00:12:57 +03:00
Vadim Petrochenkov
374a80a86d expand: It's always possible to create a dummy AST fragment
Remove a bunch of `Option`s that assumed that dummy fragment creation could fail.

The test output changed due to not performing the expansion in `fn expand_invoc` in case of the recursion limit hit.
2019-07-11 00:12:57 +03:00
Vadim Petrochenkov
eac900ac87 hygiene: Make sure each Mark has an associated expansion info
The root expansion was missing one.
Expansions created for "derive containers" (see one of the next commits for the description) also didn't get expansion info.
2019-07-11 00:12:57 +03:00
Vadim Petrochenkov
99c7432896 hygiene: Introduce a helper method for creating new expansions
Creating a fresh expansion and immediately generating a span from it is the most common scenario.

Also avoid allocating `allow_internal_unstable` lists for derive markers repeatedly.
And rename `ExpnInfo::with_unstable` to `ExpnInfo::allow_unstable`, seems to be a better fitting name.
2019-07-11 00:12:57 +03:00
Vadim Petrochenkov
d1949b1ab0 expand: Do not overwrite existing ExpnInfo when injecting derive markers
Create a fresh expansion for them instead - this is the usual way to allow unstable features for generated/desugared code.
Fixes https://github.com/rust-lang/rust/issues/52363
2019-07-11 00:12:08 +03:00
Vadim Petrochenkov
3041ec6118 resolve/expand: Catch macro kind mismatches early in resolve
This way we are processing all of them in a single point, rather than separately for each syntax extension kind.
Also, the standard expected/found wording is used.
2019-07-11 00:12:08 +03:00
Vadim Petrochenkov
f16993d4ac resolve/expand: resolve_macro_invocation no longer returns determinate errors
It either returns the indeterminacy error, or valid (but perhaps dummy) `SyntaxExtension`.

With this change enum `Determinacy` is no longer used in libsyntax and can be moved to resolve.

The regressions in diagnosics are fixed in the next commits.
2019-07-11 00:12:08 +03:00
Vadim Petrochenkov
cd0fd630e8 resolve: Make proc macro stubs less stubby
Create real working and registered (even if dummy) `SyntaxExtension`s for them.
This improves error recovery and allows to avoid all special cases for proc macro stubs (except for the error on use, of course).

The introduced dummy `SyntaxExtension`s can be used for any other inappropriately resolved macros as well.
2019-07-11 00:12:08 +03:00
Vadim Petrochenkov
aff9738462 hygiene: Reuse MacroKind in ExpnKind
Orthogonality and reuse are good.
2019-07-11 00:12:08 +03:00
Vadim Petrochenkov
3eafaae510 syntax: Make def-site span mandatory in ExpnInfo/MacroBacktrace/DiagnosticSpanMacroExpansion
We have to deal with dummy spans anyway

Remove def-site span from expander interfaces.
It's not used by the expansion infra, only by specific expanders, which can keep it themselves if they want it.
2019-07-11 00:12:07 +03:00
Vadim Petrochenkov
a138e9d625 expand: Get rid of resolve_macro_path
It was used to choose whether to apply derive markers like `#[rustc_copy_clone_marker]` or not,
but it was called before all the data required for resolution is available, so it could work incorrectly in some corner cases (like user-defined derives name `Copy` or `Eq`).
Delay the decision about markers until the proper resolution results are available instead.
2019-07-11 00:12:07 +03:00
Vadim Petrochenkov
16918a8e28 Rename some things in syntax_pos/hygiene
More consistent with other naming:
ExpnFormat -> ExpnKind
ExpnKind::name -> ExpnKind::descr
DesugaringKind::name -> DesugaringKind::descr

Shorter, no tautology:
CompilerDesugaring -> Desugaring
CompilerDesugaringKind -> DesugaringKind
2019-07-11 00:12:07 +03:00
Vadim Petrochenkov
ec376c783e Move MacroKind into libsyntax_pos
So it can be eventually used in `ExpnInfo`
2019-07-11 00:12:07 +03:00
Vadim Petrochenkov
48635226d8 Remove MacroKind::ProcMacroStub
It's internal to resolve and always results in `Res::Err` outside of resolve.
Instead put `DefKind::Fn`s themselves into the macro namespace, it's ok.

Proc macro stubs are items placed into macro namespase for functions that define proc macros.
https://github.com/rust-lang/rust/pull/52383

The rustdoc test is changed because the old test didn't actually reproduce the ICE it was supposed to reproduce.
2019-07-11 00:12:07 +03:00
Mark Rousskov
56a9237b59 File is now short enough for tidy 2019-07-10 07:13:59 -04:00
Mark Rousskov
096cb4137d Remove writer function from PrintState 2019-07-10 07:13:57 -04:00
Mark Rousskov
73c1752b8e Use constant instead of magic number 2019-07-10 07:13:22 -04:00
Mark Rousskov
63fdf1a527 Remove needless indent arguments
We're always indenting by INDENT_UNIT anyway
2019-07-10 07:13:22 -04:00
Mark Rousskov
cab453250a Move pp::Printer helpers to direct impl 2019-07-10 07:13:20 -04:00
Mark Rousskov
e91dbc5916 Rename is_bol -> is_beginning_of_line
Also moves it to pp::Printer from PrintState.
2019-07-10 07:12:29 -04:00
Mark Rousskov
39aa9bf730 Remove needless indirection in bclose 2019-07-10 07:12:29 -04:00
Mark Rousskov
04b80a5f5d Drop length from Token::String
It was always set to the string's length
2019-07-10 07:12:29 -04:00
Mark Rousskov
5879146392 Rename pretty_print_* to scan_* to follow naming in the paper
This is also easier to understand because the scan and print "tasks" are
separate, but previously were both called "print" or "pretty print."
2019-07-10 07:12:29 -04:00
Mark Rousskov
4783d9eaa5 Remove is_begin/is_end functions from PrintState
These are somewhat ambiguous (beginning/end of what?) so it's better to
inline their one use into the code.
2019-07-10 07:12:29 -04:00
Mark Rousskov
57cf7a2e57 Simplify print_end
Presumably the code was from an older age of Rust and can now be written
much simpler.
2019-07-10 07:12:29 -04:00
Mark Rousskov
55a6a761b9 Simplify check_stack implementation 2019-07-10 07:12:29 -04:00
Mark Rousskov
cd2d8326a5 Move BufEntry assignment into scan_push 2019-07-10 07:12:28 -04:00
Mark Rousskov
ccf279d9c3 Remove useless call to indent 2019-07-10 07:12:28 -04:00
Mark Rousskov
4c58fc32ae Fully privatize (vs. crate visibility) functions 2019-07-10 07:12:28 -04:00
Mark Rousskov
00ca508608 Move pp::Printer out field to owned String
This enforces that eof() must be called to get the String out, and
generally is better from an API perspective. No users of pretty printing
pre-allocate the buffer.
2019-07-10 07:12:28 -04:00
Mark Rousskov
e0ffa7c3d2 Inline State::new_from_input in pprust
This function took too many arguments and are simple on the inside;
inlining them makes complexity go down.

hir::print's copy is unfortunately used from librustc_driver so inlining
it is not as straightforward.
2019-07-10 07:12:28 -04:00
Mark Rousskov
e0db2e606c print_crate returns String instead of taking an out pointer 2019-07-10 07:12:28 -04:00
Mark Rousskov
7e3791469f Replace src: &mut dyn Read with String 2019-07-10 07:12:28 -04:00
Mark Rousskov
0eb2e566c1 Combine comment-handling logic into struct
This also permits sharing the underlying code between pprust and
hir::print.
2019-07-10 07:12:28 -04:00
Mark Rousskov
9b5e39723d Inline State::new
There was only one callsite for each and this removes the
unwrap_or_default's on the comments argument
2019-07-10 07:12:28 -04:00
Mark Rousskov
59b161c7c8 Stop Option-wrapping comments
We always check against the length before indexing anyway.
2019-07-10 07:12:28 -04:00
Mark Rousskov
a573d143a2 Remove unused boxes vector 2019-07-10 07:12:28 -04:00
Mark Rousskov
4483980285 Privatize and remove unused functions 2019-07-10 07:12:26 -04:00
Mark Rousskov
11d521676f Move lifetime_to_string to Display impl 2019-07-10 07:11:29 -04:00
Mark Rousskov
a440337e2b Remove unused arm_to_string 2019-07-10 07:11:29 -04:00
Mark Rousskov
0f10d114e4 Remove duplicate attr_to_string
attribute_to_string exists.
2019-07-10 07:11:29 -04:00
Mark Rousskov
9b0ebfa4e9 Move literal_to_string to fmt::Display 2019-07-10 07:11:29 -04:00
Mazdak Farrokhzad
fe26fc9a1c
Rollup merge of #62393 - petrochenkov:notto-disu, r=Mark-Simulacrum
Fix pretty-printing of `$crate` (take 4)

Pretty-print `$crate` as `crate` or `crate_name` in unstructured tokens like `a $crate c` in `foo!(a $crate c)`, but only if those tokens are printed as a part of AST pretty-printing, rather than as a standalone token stream.

Fixes https://github.com/rust-lang/rust/issues/62325
Previous iterations - https://github.com/rust-lang/rust/pull/56647, https://github.com/rust-lang/rust/pull/57155, https://github.com/rust-lang/rust/pull/57915.
2019-07-10 05:14:09 +02:00
Vadim Petrochenkov
3997507786 Resolve $crate in all hygienic contexts for pretty-pringing
Stop visiting AST to discover those contexts, just iterate through hygiene data instead
2019-07-09 22:17:44 +03:00
Vadim Petrochenkov
4344a90308 Pretty-print $crate as crate/::my_crate in tokens
...but only if those tokens are printed from inside of AST pretty-printing.
2019-07-09 22:17:44 +03:00
Samy Kacimi
41e71b0c93
normalize use of backticks in compiler messages for libsyntax/feature_gate
https://github.com/rust-lang/rust/issues/60532
2019-07-09 14:13:28 +02:00
Mazdak Farrokhzad
fe807fcf3e
Rollup merge of #62213 - QuietMisdreavus:cfg-doctest, r=GuillaumeGomez
rustdoc: set cfg(doctest) when collecting doctests

Note: This PR builds on top of https://github.com/rust-lang/rust/pull/61199; only the last commit is specific to this PR.

As discussed in https://github.com/rust-lang/rust/pull/61199, we want the ability to isolate items to only when rustdoc is collecting doctests, but we can't use `cfg(test)` because of libcore's `#![cfg(not(test))]`. This PR proposes a new cfg flag, `cfg(doctest)`, specific to this situation, rather than reusing an existing flag. I've isolated it behind a feature gate so that we can contain the effects to nightly only. (A stable workaround that can be used in lieu of `#[cfg(doctest)]` is `#[cfg(rustdoc)] #[doc(hidden)]`, at least once https://github.com/rust-lang/rust/pull/61351 lands.)

Tracking issue: https://github.com/rust-lang/rust/issues/62210
2019-07-07 17:00:18 +02:00