summary refs log tree commit diff
path: root/src/libsyntax_ext/deriving/generic
AgeCommit message (Collapse)AuthorLines
2019-03-17Do not accidentally treat multi-segment meta-items as single-segmentVadim Petrochenkov-6/+3
2019-02-10rustc: doc commentsAlexander Regueiro-8/+8
2019-02-07Support const generics in derivevarkor-1/+15
Co-Authored-By: Gabriel Smith <yodaldevoid@users.noreply.github.com>
2019-02-07Rollup merge of #58133 - taiki-e:libsyntax_ext-2018, r=Centrilkennytm-69/+68
libsyntax_ext => 2018 Transitions `libsyntax_ext` to Rust 2018; cc #58099 r? @Centril
2019-02-06Overhaul `syntax::fold::Folder`.Nicholas Nethercote-6/+6
This commit changes `syntax::fold::Folder` from a functional style (where most methods take a `T` and produce a new `T`) to a more imperative style (where most methods take and modify a `&mut T`), and renames it `syntax::mut_visit::MutVisitor`. The first benefit is speed. The functional style does not require any reallocations, due to the use of `P::map` and `MoveMap::move_{,flat_}map`. However, every field in the AST must be overwritten; even those fields that are unchanged are overwritten with the same value. This causes a lot of unnecessary memory writes. The imperative style reduces instruction counts by 1--3% across a wide range of workloads, particularly incremental workloads. The second benefit is conciseness; the imperative style is usually more concise. E.g. compare the old functional style: ``` fn fold_abc(&mut self, abc: ABC) { ABC { a: fold_a(abc.a), b: fold_b(abc.b), c: abc.c, } } ``` with the imperative style: ``` fn visit_abc(&mut self, ABC { a, b, c: _ }: &mut ABC) { visit_a(a); visit_b(b); } ``` (The reductions get larger in more complex examples.) Overall, the patch removes over 200 lines of code -- even though the new code has more comments -- and a lot of the remaining lines have fewer characters. Some notes: - The old style used methods called `fold_*`. The new style mostly uses methods called `visit_*`, but there are a few methods that map a `T` to something other than a `T`, which are called `flat_map_*` (`T` maps to multiple `T`s) or `filter_map_*` (`T` maps to 0 or 1 `T`s). - `move_map.rs`/`MoveMap`/`move_map`/`move_flat_map` are renamed `map_in_place.rs`/`MapInPlace`/`map_in_place`/`flat_map_in_place` to reflect their slightly changed signatures. - Although this commit renames the `fold` module as `mut_visit`, it keeps it in the `fold.rs` file, so as not to confuse git. The next commit will rename the file.
2019-02-04libsyntax_ext => 2018Taiki Endo-69/+68
2018-12-25Remove licensesMark Rousskov-20/+0
2018-12-07Various minor/cosmetic improvements to codeAlexander Regueiro-10/+10
2018-12-04syntax: Rename some keywordsVadim Petrochenkov-1/+1
`CrateRoot` -> `PathRoot`, `::` doesn't necessarily mean crate root now `SelfValue` -> `SelfLower`, `SelfType` -> `SelfUpper`, both `self` and `Self` can be used in type and value namespaces now
2018-11-18Rollup merge of #55827 - ljedrz:various_stashed, r=alexcrichtonPietro Albini-10/+8
A few tweaks to iterations/collecting - simplify and speed up `dot::GraphWalk::nodes` for `cfg::CFG` - `reserve` the capacity for `edges` in `DepGraph::query` - collect directly to a `HirVec` in `LoweringContext::lower_attrs` - fix overallocation in `OnDiskCache::serialize` - preallocate the `new_partitioning` vector in `merge_codegen_units` - simplify `impl FromHex for str` - improve the creation of `self_arg_names` in `impl MethodDef`
2018-11-13fix various typos in doc commentsAndy Russell-1/+1
2018-11-13A few tweaks to iterations/collectingljedrz-10/+8
2018-10-31syntax: improve a few allocationsljedrz-1/+1
2018-10-20handle errors based on parse_sesscsmoe-5/+5
2018-08-19mv (mod) codemap source_mapDonato Sciarra-3/+3
2018-08-13Move SmallVec and ThinVec out of libsyntaxljedrz-1/+2
2018-08-09[nll] libsyntax_ext: remove unnecessary mut annotation on variablememoryruins-1/+1
Pointed out by nll. It is correct that the mut annotation is not needed.
2018-07-29Replace push loops with collect() and extend() where possibleljedrz-9/+8
2018-07-23libsyntax_ext: Prefer `Option::map` over `match` where applicableColin Wallace-8/+4
2018-07-14Remove most of `PartialEq` impls from AST and HIR structuresVadim Petrochenkov-11/+6
2018-07-12Deny bare trait objects in src/libsyntax_extljedrz-4/+4
2018-06-21Parse async fn header.Without Boats-5/+5
This is gated on edition 2018 & the `async_await` feature gate. The parser will accept `async fn` and `async unsafe fn` as fn items. Along the same lines as `const fn`, only `async unsafe fn` is permitted, not `unsafe async fn`.The parser will not accept `async` functions as trait methods. To do a little code clean up, four fields of the function type struct have been merged into the new `FnHeader` struct: constness, asyncness, unsafety, and ABI. Also, a small bug in HIR printing is fixed: it previously printed `const unsafe fn` as `unsafe const fn`, which is grammatically incorrect.
2018-06-20Fix additional commentsvarkor-1/+1
2018-06-20Rename ty_param_bound to trait_boundvarkor-5/+5
2018-06-20Rename ParamBound(s) to GenericBound(s)varkor-2/+2
2018-06-20Remove name from GenericParamKind::Lifetimevarkor-4/+4
2018-06-20Lift bounds into GenericParamvarkor-12/+10
2018-06-20Simply joint lifetime/type iterationvarkor-57/+21
2018-06-20Rename structures in astvarkor-18/+18
2018-06-20Remove all traces of lifetimes() and types() methodsvarkor-23/+21
2018-06-20Remove methods from ast::GenericParam and ast::Genericsvarkor-1/+4
2018-06-20Refactor ast::GenericParam as a structvarkor-28/+23
2018-06-20Refactor hir::GenericParam as a structvarkor-3/+7
2018-06-20Rename ast::GenericParam and ast::GenericArgvarkor-20/+20
It's so confusing to have everything having the same name, at least while refactoring.
2018-06-20Rename "parameter" to "arg"varkor-8/+8
2018-06-20Rename *Parameter to *Paramvarkor-8/+8
2018-06-20Consolidate PathParameters and AngleBracketedParameterDatavarkor-15/+28
2018-05-02Remove Option from the return type of Attribute::name()Seiichi Uchida-1/+1
2018-04-26rustc_target: move in syntax::abi and flip dependency.Irina Popa-1/+1
2018-04-25Auto merge of #49986 - zofrex:better-derived-argument-names, r=Manishearthbors-12/+12
Provide better names for builtin deriving-generated attributes First attempt at fixing #49967 Not in love with any choices here, don't be shy if you aren't happy with anything :) I've tested that this produces nicer names in documentation, and that it no longer has issues conflicting with constants with the same name. (I guess we _could_ make a test for that... unsure if that would be valuable) In all cases I took the names from the methods as declared in the relevant trait. In some cases I had to prepend the names with _ otherwise there were errors about un-used variables. I'm uneasy with the inconsistency... do they all need to be like that? Is there a way to generate an alternate impl or use a different name (`_`?) in the cases where the arguments are not used? Lastly the gensym addition to Ident I implemented largely as suggested, but I want to point out it's a little circuitous (at least, as far as I understand it). `cx.ident_of(name)` is just `Ident::from_str`, so we create an Ident then another Ident from it. `Ident::with_empty_ctxt(Symbol::gensym(string))` may or may not be equivalent, I don't know if it's important to intern it _then_ gensym it. It seems like either we could use that, or if we do want a new method to make this convenient, it could be on Ident instead (`from_str_gensymed`?)
2018-04-19Fix some of the __names in the commentsJames Sanderson-7/+7
2018-04-19Gensym remaining identifiersJames Sanderson-2/+2
2018-04-15Provide better names for builtin deriving-generated attributesJames Sanderson-3/+3
2018-04-15Auto merge of #49881 - varkor:partialord-opt, r=Manishearthbors-17/+99
Fix derive(PartialOrd) and optimise final field operation ```rust // Before (`lt` on 2-field struct) self.f1 < other.f1 || (!(other.f1 < self.f1) && (self.f2 < other.f2 || (!(other.f2 < self.f2) && (false) )) ) // After self.f1 < other.f1 || (!(other.f1 < self.f1) && self.f2 < other.f2 ) // Before (`le` on 2-field struct) self.f1 < other.f1 || (!(other.f1 < self.f1) && (self.f2 < other.f2 || (!(other.f2 < self.f2) && (true) )) ) // After self.f1 < other.f1 || (self.f1 == other.f1 && self.f2 <= other.f2 ) ``` (The big diff is mainly because of a past faulty rustfmt application that I corrected 😒) Fixes #49650 and fixes #49505.
2018-04-12Improve the comment for cs_fold1varkor-2/+9
2018-04-11Add cs_fold1 for better derivesvarkor-17/+92
2018-04-11Implementation of `#[repr(packed(n))]` RFC 1399.Cameron Hart-3/+7
2018-04-06Rename `ast::Variant_::name` into `ident` + Fix rebaseVadim Petrochenkov-4/+2
2018-04-06Get rid of `SpannedIdent`Vadim Petrochenkov-6/+4
2018-04-06Rename `PathSegment::identifier` to `ident`Vadim Petrochenkov-2/+2