1
Fork 0
rust/compiler
Matthias Krüger fe93f08051
Rollup merge of #93065 - dtolnay:ringbuffer, r=lcnr
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:

e5e2b0be26/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-19 19:19:51 +01:00
..
rustc Remove useless #[global_allocator] from rustc and rustdoc. 2021-12-23 17:23:21 +11:00
rustc_apfloat Stabilize iter::zip. 2021-12-14 18:50:31 -04:00
rustc_arena Add some comments. 2021-11-19 07:52:59 +11:00
rustc_ast Rollup merge of #93018 - pierwill:rm-unused-ord, r=davidtwco 2022-01-18 22:00:50 +01:00
rustc_ast_lowering Formally implement let chains 2022-01-18 19:38:17 -03:00
rustc_ast_passes Formally implement let chains 2022-01-18 19:38:17 -03:00
rustc_ast_pretty Rollup merge of #93065 - dtolnay:ringbuffer, r=lcnr 2022-01-19 19:19:51 +01:00
rustc_attr Remove unnecessary sigils around Symbol::as_str() calls. 2021-12-15 17:32:14 +11:00
rustc_borrowck Use Term in ProjectionPredicate 2022-01-17 17:44:56 +00:00
rustc_builtin_macros Auto merge of #92816 - tmiasko:rm-llvm-asm, r=Amanieu 2022-01-17 09:40:29 +00:00
rustc_codegen_cranelift Pass target_features set instead of has_feature closure 2022-01-17 18:06:30 +01:00
rustc_codegen_gcc Use Symbol for target features in asm handling 2022-01-17 18:06:27 +01:00
rustc_codegen_llvm Rollup merge of #92425 - calebzulawski:simd-cast, r=workingjubilee 2022-01-18 22:00:45 +01:00
rustc_codegen_ssa Rollup merge of #91278 - SparrowLii:place, r=spastorino 2022-01-19 10:42:14 +01:00
rustc_const_eval Auto merge of #92816 - tmiasko:rm-llvm-asm, r=Amanieu 2022-01-17 09:40:29 +00:00
rustc_data_structures Auto merge of #92740 - cuviper:update-rayons, r=Mark-Simulacrum 2022-01-16 08:12:23 +00:00
rustc_driver Rollup merge of #92504 - dtolnay:wall, r=jackh726 2022-01-06 23:15:17 +01:00
rustc_error_codes Rollup merge of #92752 - jamestiotio:error-codes-typos, r=nagisa 2022-01-17 20:07:04 +01:00
rustc_errors Auto merge of #92070 - rukai:replace_vec_into_iter_with_array_into_iter, r=Mark-Simulacrum 2022-01-11 14:23:24 +00:00
rustc_expand Auto merge of #92473 - petrochenkov:ltrattr2, r=Aaron1011 2022-01-17 02:06:54 +00:00
rustc_feature Formally implement let chains 2022-01-18 19:38:17 -03:00
rustc_fs_util
rustc_graphviz eplace usages of vec![].into_iter with [].into_iter 2022-01-09 14:09:25 +11:00
rustc_hir Auto merge of #87648 - JulianKnodt:const_eq_constrain, r=oli-obk 2022-01-18 09:58:39 +00:00
rustc_hir_pretty Use Term in ProjectionPredicate 2022-01-17 17:44:56 +00:00
rustc_incremental Rollup merge of #92825 - pierwill:rustc-version-force-rename, r=Mark-Simulacrum 2022-01-17 20:07:06 +01:00
rustc_index remove unused FIXME 2022-01-12 16:09:01 +01:00
rustc_infer Auto merge of #87648 - JulianKnodt:const_eq_constrain, r=oli-obk 2022-01-18 09:58:39 +00:00
rustc_interface Rollup merge of #90782 - ricobbe:binutils-dlltool, r=michaelwoerister 2022-01-18 22:00:42 +01:00
rustc_lexer Auto merge of #91393 - Julian-Wollersberger:lexer_optimization, r=petrochenkov 2021-12-03 13:20:14 +00:00
rustc_lint Replace NestedVisitorMap with NestedFilter 2022-01-16 16:02:36 -06:00
rustc_lint_defs Fix lints documents 2022-01-13 03:57:44 +00:00
rustc_llvm Remove LLVMRustMarkAllFunctionsNounwind 2022-01-14 00:36:12 +00:00
rustc_log Make rustc_log doc test runnable 2022-01-03 22:31:56 -08:00
rustc_macros Rollup merge of #92011 - Aaron1011:decode-span, r=michaelwoerister 2022-01-03 14:44:16 +01:00
rustc_metadata Rollup merge of #90782 - ricobbe:binutils-dlltool, r=michaelwoerister 2022-01-18 22:00:42 +01:00
rustc_middle Rollup merge of #93041 - pierwill:rm-unused-defid-ords, r=cjgillot 2022-01-19 10:42:19 +01:00
rustc_mir_build Formally implement let chains 2022-01-18 19:38:17 -03:00
rustc_mir_dataflow Remove deprecated LLVM-style inline assembly 2022-01-12 18:51:31 +01:00
rustc_mir_transform Auto merge of #90986 - camsteffen:nested-filter, r=cjgillot 2022-01-17 14:50:50 +00:00
rustc_monomorphize Auto merge of #92805 - BoxyUwU:revert-lazy-anon-const-substs, r=lcnr 2022-01-16 11:19:21 +00:00
rustc_parse Rollup merge of #91150 - dtolnay:qpath, r=davidtwco 2022-01-18 22:00:43 +01:00
rustc_parse_format
rustc_passes Rollup merge of #92783 - FabianWolff:issue-92726, r=nikomatsakis 2022-01-19 10:42:16 +01:00
rustc_plugin_impl replace dynamic library module with libloading 2021-12-06 12:03:47 -05:00
rustc_privacy Auto merge of #87648 - JulianKnodt:const_eq_constrain, r=oli-obk 2022-01-18 09:58:39 +00:00
rustc_query_impl attempt to re-add ty::Unevaluated visitor and friends 2022-01-15 01:16:55 +00:00
rustc_query_system Auto merge of #92740 - cuviper:update-rayons, r=Mark-Simulacrum 2022-01-16 08:12:23 +00:00
rustc_resolve Replace NestedVisitorMap with NestedFilter 2022-01-16 16:02:36 -06:00
rustc_save_analysis Replace NestedVisitorMap with NestedFilter 2022-01-16 16:02:36 -06:00
rustc_serialize Auto merge of #92604 - nnethercote:optimize-impl_read_unsigned_leb128, r=michaelwoerister 2022-01-15 07:27:30 +00:00
rustc_session Rollup merge of #90782 - ricobbe:binutils-dlltool, r=michaelwoerister 2022-01-18 22:00:42 +01:00
rustc_span Rollup merge of #92425 - calebzulawski:simd-cast, r=workingjubilee 2022-01-18 22:00:45 +01:00
rustc_symbol_mangling Rollup merge of #92316 - petrochenkov:extmangle, r=wesleywiser 2022-01-19 19:19:45 +01:00
rustc_target Pass target_features set instead of has_feature closure 2022-01-17 18:06:30 +01:00
rustc_trait_selection Rollup merge of #92780 - b-naber:postpone-const-eval-coherence, r=lcnr 2022-01-18 22:00:47 +01:00
rustc_traits Auto merge of #87648 - JulianKnodt:const_eq_constrain, r=oli-obk 2022-01-18 09:58:39 +00:00
rustc_ty_utils Auto merge of #92805 - BoxyUwU:revert-lazy-anon-const-substs, r=lcnr 2022-01-16 11:19:21 +00:00
rustc_type_ir initial revert 2022-01-15 01:16:55 +00:00
rustc_typeck Rollup merge of #92425 - calebzulawski:simd-cast, r=workingjubilee 2022-01-18 22:00:45 +01:00