rust/compiler
bors 22e6b9c689 Auto merge of #77250 - Aaron1011:feature/flat-token-collection, r=petrochenkov
Rewrite `collect_tokens` implementations to use a flattened buffer

Instead of trying to collect tokens at each depth, we 'flatten' the
stream as we go allong, pushing open/close delimiters to our buffer
just like regular tokens. One capturing is complete, we reconstruct a
nested `TokenTree::Delimited` structure, producing a normal
`TokenStream`.

The reconstructed `TokenStream` is not created immediately - instead, it is
produced on-demand by a closure (wrapped in a new `LazyTokenStream` type). This
closure stores a clone of the original `TokenCursor`, plus a record of the
number of calls to `next()/next_desugared()`. This is sufficient to reconstruct
the tokenstream seen by the callback without storing any additional state. If
the tokenstream is never used (e.g. when a captured `macro_rules!` argument is
never passed to a proc macro), we never actually create a `TokenStream`.

This implementation has a number of advantages over the previous one:

* It is significantly simpler, with no edge cases around capturing the
  start/end of a delimited group.

* It can be easily extended to allow replacing tokens an an arbitrary
  'depth' by just using `Vec::splice` at the proper position. This is
  important for PR #76130, which requires us to track information about
  attributes along with tokens.

* The lazy approach to `TokenStream` construction allows us to easily
  parse an AST struct, and then decide after the fact whether we need a
  `TokenStream`. This will be useful when we start collecting tokens for
  `Attribute` - we can discard the `LazyTokenStream` if the parsed
  attribute doesn't need tokens (e.g. is a builtin attribute).

The performance impact seems to be neglibile (see
https://github.com/rust-lang/rust/pull/77250#issuecomment-703960604). There is a
small slowdown on a few benchmarks, but it only rises above 1% for incremental
builds, where it represents a larger fraction of the much smaller instruction
count. There a ~1% speedup on a few other incremental benchmarks - my guess is
that the speedups and slowdowns will usually cancel out in practice.
2020-10-21 15:03:14 +00:00
..
rustc
rustc_apfloat
rustc_arena Track element count only for types that need drop 2020-10-20 17:01:51 +02:00
rustc_ast Auto merge of #77250 - Aaron1011:feature/flat-token-collection, r=petrochenkov 2020-10-21 15:03:14 +00:00
rustc_ast_lowering Auto merge of #78066 - bugadani:wat, r=jonas-schievink 2020-10-18 13:50:31 +00:00
rustc_ast_passes Lower inline const's AST to HIR 2020-10-16 15:21:16 -03:00
rustc_ast_pretty Drop unneeded mut 2020-10-20 16:42:51 +02:00
rustc_attr
rustc_builtin_macros
rustc_codegen_llvm Auto merge of #78047 - khyperia:set_span_mut, r=bjorn3 2020-10-18 05:36:23 +00:00
rustc_codegen_ssa Make set_span take mut self 2020-10-17 13:28:58 +02:00
rustc_data_structures Auto merge of #77908 - bugadani:obl-forest, r=nnethercote 2020-10-19 15:14:15 +00:00
rustc_driver Rollup merge of #77493 - hosseind88:ICEs_should_always_print_the_top_of_the_query_stack, r=oli-obk 2020-10-16 02:10:09 +02:00
rustc_error_codes Rollup merge of #77971 - jyn514:broken-intra-doc-links, r=mark-simulacrum 2020-10-17 05:36:49 +09:00
rustc_errors
rustc_expand Avoid cloning the contents of a TokenStream in a few places 2020-10-19 12:30:41 -04:00
rustc_feature Remove redundant 'static in the compiler 2020-10-18 17:30:15 +02:00
rustc_fs_util
rustc_graphviz
rustc_hir Lower inline const down to MIR 2020-10-16 15:21:18 -03:00
rustc_hir_pretty Do not print braces again print_anon_const already does it 2020-10-19 16:26:13 -03:00
rustc_incremental
rustc_index
rustc_infer review comments 2020-10-20 09:26:15 -07:00
rustc_interface
rustc_lexer
rustc_lint Rollup merge of #77931 - aticu:fix_60336, r=petrochenkov 2020-10-20 12:11:06 +09:00
rustc_llvm
rustc_macros
rustc_metadata
rustc_middle Rollup merge of #78101 - RalfJung:foreign-static, r=oli-obk 2020-10-21 13:59:43 +09:00
rustc_mir Rollup merge of #78101 - RalfJung:foreign-static, r=oli-obk 2020-10-21 13:59:43 +09:00
rustc_mir_build Auto merge of #77124 - spastorino:const-exprs-rfc-2920, r=oli-obk 2020-10-17 14:44:51 +00:00
rustc_parse Auto merge of #77250 - Aaron1011:feature/flat-token-collection, r=petrochenkov 2020-10-21 15:03:14 +00:00
rustc_parse_format
rustc_passes Auto merge of #78066 - bugadani:wat, r=jonas-schievink 2020-10-18 13:50:31 +00:00
rustc_plugin_impl
rustc_privacy
rustc_query_system
rustc_resolve Rollup merge of #78048 - blyxxyz:e0424-improve-self-placement, r=lcnr 2020-10-18 04:11:11 +09:00
rustc_save_analysis
rustc_serialize
rustc_session
rustc_span Add inline_const feature flag 2020-10-16 15:13:28 -03:00
rustc_symbol_mangling Rollup merge of #75675 - davidtwco:symbol-mangling-impl-params, r=eddyb 2020-10-16 02:10:02 +02:00
rustc_target
rustc_trait_selection Rollup merge of #78002 - estebank:issue-77598, r=oli-obk 2020-10-21 13:59:35 +09:00
rustc_traits Review comments 2020-10-16 12:58:50 -04:00
rustc_ty
rustc_typeck Rollup merge of #78063 - camelid:improve-cannot-multiply-error, r=estebank 2020-10-21 13:59:39 +09:00