about summary refs log tree commit diff
path: root/compiler/rustc_ast_pretty/src
AgeCommit message (Collapse)AuthorLines
2022-01-19Combine advance_left matchesDavid Tolnay-8/+8
2022-01-19Inline print into advance_leftDavid Tolnay-11/+8
2022-01-19Simplify advance_leftDavid Tolnay-8/+4
2022-01-19Simplify left_total trackingDavid Tolnay-16/+6
2022-01-19Eliminate a token clone from advance_leftDavid Tolnay-7/+7
2022-01-19Grow scan_stack in the conventional directionDavid Tolnay-9/+9
The pretty printer algorithm involves 2 VecDeques: a ring-buffer of tokens and a deque of ring-buffer indices. Confusingly, those two deques were being grown in opposite directions for no good reason. Ring-buffer pushes would go on the "back" of the ring-buffer (i.e. higher indices) while scan_stack pushes would go on the "front" (i.e. lower indices). This commit flips the scan_stack accesses to grow the scan_stack and ring-buffer in the same direction, where push does the same operation as a Vec push i.e. inserting on the high-index end.
2022-01-19Delete unused Display for pretty printer TokenDavid Tolnay-12/+0
2022-01-19Rollup merge of #93065 - dtolnay:ringbuffer, r=lcnrMatthias Krüger-112/+103
Pretty printer algorithm revamp step 2 This PR follows #92923 as a second chunk of modernizations backported from https://github.com/dtolnay/prettyplease into rustc_ast_pretty. I've broken this up into atomic commits that hopefully are sensible in isolation. At every commit, the pretty printer is compilable and has runtime behavior that is identical to before and after the PR. None of the refactoring so far changes behavior. The general theme of this chunk of commits is: the logic in the old pretty printer is doing some very basic things (pushing and popping tokens on a ring buffer) but expressed in a too-low-level way that I found makes it quite complicated/subtle to reason about. There are a number of obvious invariants that are "almost true" -- things like `self.left == self.buf.offset` and `self.right == self.buf.offset + self.buf.data.len()` and `self.right_total == self.left_total + self.buf.data.sum()`. The reason these things are "almost true" is the implementation tends to put updating one side of the invariant unreasonably far apart from updating the other side, leaving the invariant broken while unrelated stuff happens in between. The following code from master is an example of this: https://github.com/rust-lang/rust/blob/e5e2b0be26ea177527b60d355bd8f56cd473bd00/compiler/rustc_ast_pretty/src/pp.rs#L314-L317 In this code the `advance_right` is reserving an entry into which to write a next token on the right side of the ring buffer, the `check_stack` is doing something totally unrelated to the right boundary of the ring buffer, and the `scan_push` is actually writing the token we previously reserved space for. Much of what this PR is doing is rearranging code to shrink the amount of stuff in between when an invariant is broken to when it is restored, until the whole thing can be factored out into one indivisible method call on the RingBuffer type. The end state of the PR is that we can entirely eliminate `self.left` (because it's now just equal to `self.buf.offset` always) and `self.right` (because it's equal to `self.buf.offset + self.buf.data.len()` always) and the whole `Token::Eof` state which used to be the value of tokens that have been reserved space for but not yet written. I found without these changes the pretty printer implementation to be hard to reason about and I wasn't able to confidently introduce improvements like trailing commas in `prettyplease` until after this refactor. The logic here is 43 years old at this point (Graydon translated it as directly as possible from the 1979 pretty printing paper) and while there are advantages to following the paper as closely as possible, in `prettyplease` I decided if we're going to adapt the algorithm to work better for Rust syntax, it was worthwhile making it easier to follow than the original.
2022-01-19Rollup merge of #92920 - dtolnay:printtidy, r=cjgillotMatthias Krüger-1200/+1220
Move expr- and item-related pretty printing functions to modules Currently *compiler/rustc_ast_pretty/src/pprust/state.rs* is 2976 lines on master. The `tidy` limit is 3000, which is blocking #92243. This PR adds a `mod expr;` and `mod item;` to move logic related to those AST nodes out of the single huge file.
2022-01-18Eliminate left and right cursors in favor of ring bufferDavid Tolnay-30/+33
2022-01-18Eliminate eof token stateDavid Tolnay-42/+44
2022-01-18Simplify the buffer push done by scan_breakDavid Tolnay-8/+3
2022-01-18Eliminate a check_stack call on an empty scan stackDavid Tolnay-1/+1
2022-01-18Index a single time in check_stackDavid Tolnay-4/+5
2022-01-18Implement check_stack nonrecursivelyDavid Tolnay-9/+10
2022-01-18Implement check_stream nonrecursivelyDavid Tolnay-3/+3
2022-01-18Replace `if` + `unwrap` with `if let` in check_stackDavid Tolnay-2/+1
2022-01-18Ensure Printer buf is always indexed using self.left or self.rightDavid Tolnay-3/+3
2022-01-18Inline Printer's scan_pop_bottom methodDavid Tolnay-5/+1
2022-01-18Inline Printer's scan_top methodDavid Tolnay-5/+1
2022-01-18Inline Printer's scan_pop methodDavid Tolnay-7/+3
2022-01-18Simplify ring buffer pushesDavid Tolnay-7/+12
2022-01-18Inline Printer's scan_push methodDavid Tolnay-8/+6
2022-01-18Inline Printer's advance_right methodDavid Tolnay-9/+8
2022-01-18Move item-related pretty printing functions to moduleDavid Tolnay-636/+646
2022-01-18Move expr-related pretty printing functions to moduleDavid Tolnay-564/+574
2022-01-18Delete pretty printer tracingDavid Tolnay-52/+0
2022-01-18Render more readable macro matchers in rustdocDavid Tolnay-1/+1
2022-01-18Auto merge of #87648 - JulianKnodt:const_eq_constrain, r=oli-obkbors-7/+8
allow eq constraints on associated constants Updates #70256 (cc `@varkor,` `@Centril)`
2022-01-17Abstract the pretty printer's ringbuffer to be infinitely sizedDavid Tolnay-22/+67
2022-01-17Use Term in ProjectionPredicatekadmin-3/+1
ProjectionPredicate should be able to handle both associated types and consts so this adds the first step of that. It mainly just pipes types all the way down, not entirely sure how to handle consts, but hopefully that'll come with time.
2022-01-17Add termkadmin-7/+6
Instead of having a separate enum variant for types and consts have one but have either a const or type.
2022-01-17add eq constraints on associated constantskadmin-3/+7
2022-01-17Auto merge of #92816 - tmiasko:rm-llvm-asm, r=Amanieubors-56/+0
Remove deprecated LLVM-style inline assembly The `llvm_asm!` was deprecated back in #87590 1.56.0, with intention to remove it once `asm!` was stabilized, which already happened in #91728 1.59.0. Now it is time to remove `llvm_asm!` to avoid continued maintenance cost. Closes #70173. Closes #92794. Closes #87612. Closes #82065. cc `@rust-lang/wg-inline-asm` r? `@Amanieu`
2022-01-17Rollup merge of #92921 - dtolnay:printernew, r=wesleywiserMatthias Krüger-25/+25
Rename Printer constructor from mk_printer() to Printer::new() The original naming is left over from 2011 which was before impl blocks and associated functions existed. https://github.com/rust-lang/rust/blob/21313d623a505086b2973f30c19db4f1d6ec8f61/src/comp/pretty/pp.rs
2022-01-16Rollup merge of #92487 - dtolnay:traitalias, r=matthewjasperMatthias Krüger-3/+3
Fix unclosed boxes in pretty printing of TraitAlias This was causing trait aliases to not even render at all in stringified / pretty printed output. ```rust macro_rules! repro { ($item:item) => { stringify!($item) }; } fn main() { println!("{:?}", repro!(pub trait Trait<T> = Sized where T: 'a;)); } ``` Before:&ensp;`""` After:&ensp;`"pub trait Trait<T> = Sized where T: 'a;"` The fix is copied from how `head`/`end` for `ItemKind::Use`, `ItemKind::ExternCrate`, and `ItemKind::Mod` are all done in the pretty printer: https://github.com/rust-lang/rust/blob/dd3ac41495e85a9b7b5cb3186379d02ce17e51fe/compiler/rustc_ast_pretty/src/pprust/state.rs#L1178-L1184
2022-01-14Rename Printer constructor from mk_printer() to Printer::new()David Tolnay-25/+25
2022-01-12Remove deprecated LLVM-style inline assemblyTomasz Miąsko-56/+0
2022-01-07Rollup merge of #92336 - dtolnay:printstateself, r=michaelwoeristerEric Huss-24/+24
Remove &self from PrintState::to_string The point of `PrintState::to_string` is to create a `State` and evaluate the caller's closure on it: https://github.com/rust-lang/rust/blob/e9fbe79292783972a222afd270db3f77c0b4f3c8/compiler/rustc_ast_pretty/src/pprust/state.rs#L868-L872 Making the caller *also* construct and pass in a `State`, which is then ignored, was confusing.
2022-01-06Rollup merge of #92417 - dtolnay:printimpl, r=jackh726Matthias Krüger-3/+6
Fix spacing and ordering of words in pretty printed Impl Follow-up to #92238 fixing one of the FIXMEs. ```rust macro_rules! repro { ($item:item) => { stringify!($item) }; } fn main() { println!("{}", repro!(impl<T> Struct<T> {})); println!("{}", repro!(impl<T> const Trait for T {})); } ``` Before:&ensp;`impl <T> Struct<T> {}` After:&ensp;`impl<T> Struct<T> {}` Before:&ensp;`impl const <T> Trait for T {}` :crying_cat_face: After:&ensp;`impl<T> const Trait for T {}`
2022-01-03Rollup merge of #92418 - dtolnay:emptystructpat, r=michaelwoeristerMatthias Krüger-2/+8
Fix spacing in pretty printed PatKind::Struct with no fields Follow-up to #92238 fixing one of the FIXMEs. ```rust macro_rules! repro { ($pat:pat) => { stringify!($pat) }; } fn main() { println!("{}", repro!(Struct {})); } ``` Before:&ensp;<code>Struct&nbsp;{&nbsp;&nbsp;}</code> After:&ensp;<code>Struct&nbsp;{}</code>
2022-01-01Fix unclosed boxes in pretty printing of TraitAliasDavid Tolnay-3/+3
2022-01-01Rollup merge of #92420 - dtolnay:patrange, r=Mark-SimulacrumMatthias Krüger-1/+0
Fix whitespace in pretty printed PatKind::Range Follow-up to #92238 fixing one of the FIXMEs. ```rust macro_rules! repro { ($pat:pat) => { stringify!($pat) }; } fn main() { println!("{}", repro!(0..=1)); } ``` Before:&ensp;`0 ..=1` After:&ensp;`0..=1` The canonical spacing applied by rustfmt has no space after the lower expr. Rustc's parser diagnostics also do not put a space there: https://github.com/rust-lang/rust/blob/df96fb166f59431e3de443835e50d5b8a7a4adb0/compiler/rustc_parse/src/parser/pat.rs#L754
2022-01-01Rollup merge of #92412 - dtolnay:tryspace, r=Mark-SimulacrumMatthias Krüger-1/+0
Fix double space in pretty printed TryBlock Follow-up to #92238 fixing one of the FIXMEs. ```rust macro_rules! repro { ($expr:expr) => { stringify!($expr) }; } fn main() { println!("{}", repro!(try {})); } ``` Before:&ensp;<code>try&nbsp;&nbsp;{}</code> After:&ensp;<code>try&nbsp;{}</code> The `head` helper already appends a space: https://github.com/rust-lang/rust/blob/2b67c30bfece00357d5fc09d99b49f21066f04ba/compiler/rustc_ast_pretty/src/pprust/state.rs#L654-L664 so doing `head` followed by `space` resulted in a double space: https://github.com/rust-lang/rust/blob/2b67c30bfece00357d5fc09d99b49f21066f04ba/compiler/rustc_ast_pretty/src/pprust/state.rs#L2241-L2242
2021-12-29Fix whitespace in pretty printed PatKind::RangeDavid Tolnay-1/+0
2021-12-29Fix spacing in pretty printed PatKind::Struct with no fieldsDavid Tolnay-2/+8
2021-12-29Move equal sign back into head iboxDavid Tolnay-1/+3
2021-12-29Fix spacing of pretty printed const item without bodyDavid Tolnay-1/+1
2021-12-29Fix spacing and ordering of words in pretty printed ImplDavid Tolnay-3/+6
2021-12-29Fix double space in pretty printed TryBlockDavid Tolnay-1/+0