-
-
Notifications
You must be signed in to change notification settings - Fork 474
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(ast_tools): add dedicated Derive
trait.
#5278
feat(ast_tools): add dedicated Derive
trait.
#5278
Conversation
CodSpeed Performance ReportMerging #5278 will not alter performanceComparing Summary
|
Your org has enabled the Graphite merge queue for merging into mainAdd the label “merge” to the PR and Graphite will automatically add it to the merge queue when it’s ready to merge. Or use the label “hotfix” to add to the merge queue as a hot fix. You must have a Graphite account and log in to Graphite in order to use the merge queue. Sign up using this link. |
c1aaa07
to
941c2f5
Compare
530fbc2
to
2da2ff8
Compare
2da2ff8
to
19d8106
Compare
facde65
to
daa5001
Compare
19d8106
to
c70e979
Compare
daa5001
to
9c5363f
Compare
7919ebb
to
b590a23
Compare
1e1e0e6
to
7367de6
Compare
041aa22
to
dc5e509
Compare
Just to say sorry I've not got to reviewing this yet. Have been going hell-for-leather on the transformer and semantic. Hope I can get to it this evening. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is really good. It simplifies writing a new #[generate_derive]
a lot. I can imagine us writing a bunch more in future - it's a really fast way to build something out which would take days and days to do by hand. The comments I've made are largely nits.
One broader thing... The one thing that could confuse people is visibility. We're used to code generated by I don't think much we can do about that, but we should document that you have to make structs/enums/fields Or (and very possibly this is a stupid idea), could we make it work like
Then you use // src/foo.rs
#[derive_generator]
use oxc_allocator::CloneIn;
#[generated_derive(CloneIn)]
struct Foo { // Not pub
blah: u64 // Not pub
}
include!("generated/derive_clonein_foo.rs"); Then the generated code has access to everything in the source file without having to make anything This approach has pluses and minuses... maybe it solves one problem but creates another! |
One other thing. At some point, maybe we should consider breaking And... maybe this is completely bananas, but with this // oxc_allocator/src/clone_in.rs
#[cfg(feature = "generate")]
use oxc_ast_tools::{Derive, TypeDef, LateCtx, TokenStream};
pub trait CloneIn {
type Cloned;
fn clone_in(&self, allocator: &'new_alloc Allocator) -> Self::Cloned;
}
#[cfg(feature = "generate")]
impl Derive for CloneIn {
fn derive(&mut self, def: &TypeDef, _: &LateCtx) -> TokenStream {
match &def {
TypeDef::Enum(it) => derive_enum(it),
TypeDef::Struct(it) => derive_struct(it),
}
}
}
// etc... It's always been impossible to define your |
2c3dbe4
to
bcde7b1
Compare
Since #5304 is blocked at present, would you like to split this and #5280 into a separate stack, so we can get them merged now? Concerning my idea of using |
bcde7b1
to
241b549
Compare
Let's not do that, I don't want to mess up the Graphite stack. The down stack should be ready to merge. I'll request a review after running actions. What I like about It is worth having an issue tracking this idea in the backlog. We have to do a quick test to make sure it's practical. There might be some quirks with how crates work. Regarding the latter idea, My personal take is having derives in a separate project is "cleaner" than having them with a conditional feature flag and bloating our core projects with bootstrapping flags. We could use a third person pitching in, Technically speaking it is possible to implement I'm not sure if it would result in a better DX. |
b92d023
to
7c5d4b2
Compare
241b549
to
641d9e6
Compare
641d9e6
to
4ea0d1f
Compare
1d0bc62
to
3aaf2bf
Compare
f9a67d8
to
0be2ab4
Compare
3aaf2bf
to
a5ba8b5
Compare
0be2ab4
to
d7b3aaf
Compare
In an effort toward the implementation of #5256, this PR allows us to have a separately generated "derive" file for each crate. This also eliminates a bunch of boilerplate when writing new "derive" generators and generally makes it more approachable.
d7b3aaf
to
aba6e88
Compare
In an effort toward the implementation of #5256, this PR allows us to have a separately generated "derive" file for each crate. This also eliminates a bunch of boilerplate when writing new "derive" generators and generally makes it more approachable.
aba6e88
to
68a1c01
Compare
I suppose the reason I thought of this is I recently added another generated file to This generator is pretty simple and lightweight, and it felt like little generators like this would sit quite naturally in the crate in which the generated code sits, so you have the generator and generated code next to each other. I can imagine writing many more of these (but in Rust, not JS!), and the codebase ending up peppered with them. At that point I'm not 100% pushing that we should do this, just explaining where I'm coming from. |
## [0.27.0] - 2024-09-06 - bd820f9 semantic: [**BREAKING**] Remove `SymbolTable::get_symbol_id_from_name` and `SymbolTable::get_scope_id_from_name` (#5480) (overlookmotel) - cba93f5 ast: [**BREAKING**] Add `ThisExpression` variants to `JSXElementName` and `JSXMemberExpressionObject` (#5466) (overlookmotel) - 87c5df2 ast: [**BREAKING**] Rename `Expression::without_parentheses` (#5448) (overlookmotel) ### Features - e8bdd12 allocator: Add `AsMut` impl for `Box` (#5515) (overlookmotel) - 90facd3 ast: Add `ContentHash` trait; remove noop `Hash` implementation from `Span` (#5451) (rzvxa) - 23285f4 ast: Add `ContentEq` trait. (#5427) (rzvxa) - 59abf27 ast, parser: Add `oxc_regular_expression` types to the parser and AST. (#5256) (rzvxa) - 68a1c01 ast_tools: Add dedicated `Derive` trait. (#5278) (rzvxa) - c782916 codegen: Print `type_parameters` in `TaggedTemplateExpression` (#5438) (Dunqing) - 4cb63fe index: Impl rayon related to trait for IndexVec (#5421) (IWANABETHATGUY) - ba4b68c minifier: Remove parenthesized expression for dce (#5439) (Boshen) - ed8ab6d oxc: Conditional expose `oxc_cfg` in `oxc` crate (#5524) (IWANABETHATGUY) - 91b39c4 oxc_diagnostic: Impl DerefMut for OxcDiagnostic (#5474) (IWANABETHATGUY) - 10279f5 parser: Add syntax error for hyphen in `JSXMemberExpression` `<Foo.bar-baz />` (#5440) (Boshen) - 0f50b1e semantic: Check for initializers in ambient `VariableDeclaration`s (#5463) (DonIsaac) - 62f7fff semantic: Check for non-declared, non-abstract object accessors without bodies (#5461) (DonIsaac) - 5407143 semantic: Check for non-declared, non-abstract class accessors without bodies (#5460) (DonIsaac) - 052e94c semantic: Check for parameter properties in constructor overloads (#5459) (DonIsaac) - 32d4bbb transformer: Add `TransformOptions::enable_all` method (#5495) (Boshen) - c59d8b3 transformer: Support all /regex/ to `new RegExp` transforms (#5387) (Dunqing) - cedf7a4 xtask: Impl `as_ast_kind` method for each variant (#5491) (IWANABETHATGUY) ### Bug Fixes - 0df1d9d ast, codegen, linter: Panics in fixers. (#5431) (rzvxa) - fce549e diagnostics: Ignore `Interrupted` and `BrokenPipe` errors while printing (#5526) (Boshen) - ea7a52f napi/transform: Fix test (Boshen) - 9b984b3 regex: Panic on displaying surrogated `UnicodeEscape` characters. (#5469) (rzvxa) - 88b7ddb regular_expression: Handle unterminated character class (#5523) (leaysgur) - 7a797ac semantic: Incorrect reference when `MemberExpression` used in `TSPropertySignature` (#5525) (Dunqing) - d8b9909 semantic: `IdentifierReference` within `TSPropertySignature` cannot reference type-only import binding (#5441) (Dunqing) - 8f9627d transformer: RegExp transform do not transform invalid regexps (#5494) (overlookmotel) - 2060efc transformer: RegExp transform don't transform all RegExps (#5486) (overlookmotel) - cfe5497 transformer: Do not create double reference in JSX transform (#5414) (overlookmotel) - 0617249 transformer/nullish-coalescing-operator: Incorrect reference flags (#5408) (Dunqing) - 0eb32a6 traverse: Invalid variable name generated by `generate_uid_based_on_node` (#5407) (Dunqing)- b96bea4 Add back lifetime (#5507) (IWANABETHATGUY) ### Performance - bfabd8f syntax: Further optimize `is_identifier_name` (#5426) (overlookmotel) - aeda84f syntax: Optimize `is_identifier_name` (#5425) (overlookmotel) - ed8937e transformer: Memoize rope instance (#5518) (Dunqing) - bfab091 transformer: Store needed options only on `RegExp` (#5484) (overlookmotel) - b4765af transformer: Pre-calculate if unsupported patterns in RegExp transform (#5483) (overlookmotel) - 182ab91 transformer: Pre-calculate unsupported flags in RegExp transform (#5482) (overlookmotel) ### Documentation - 64db1b4 ast: Clarify docs for `RegExpPattern` (#5497) (overlookmotel) - 3f204a9 span: Update docs about `ContentEq` `Vec` comparison speed (#5478) (overlookmotel)- 00511fd Use `oxc_index` instead of `index_vec` in doc comments (#5423) (IWANABETHATGUY) ### Refactor - 9f6e0ed ast: Simplify `ContentEq` trait definition. (#5468) (rzvxa) - a43e951 ast: Use loop instead of recursion (#5447) (overlookmotel) - 2224cc4 ast: Renumber `JSXMemberExpressionObject` discriminants (#5464) (overlookmotel) - a952c47 ast: Use loop not recursion (#5449) (overlookmotel) - d9d7e7c ast: Remove `IdentifierName` from `TSThisParameter` (#5327) (overlookmotel) - ccc8a27 ast, ast_tools: Use full method path for generated derives trait calls. (#5462) (rzvxa) - fdb8857 linter: Use "parsed pattern" in `no_div_regex` rule. (#5417) (rzvxa) - e7bd49d regular_expression: Correct typo (#5429) (overlookmotel) - e4ed41d semantic: Change the reference flag to `ReferenceFlags::Type` if it is used within a `TSTypeQuery` (#5444) (Dunqing) - 94a6ac6 span: Use `Hasher` from `std` (#5476) (overlookmotel) - b47aca0 syntax: Use `generate_derive` for `CloneIn` in types outside of `oxc_ast` crate. (#5280) (rzvxa) - a96866d transformer: Re-order imports (#5499) (overlookmotel) - 6abde0a transformer: Clarify match in RegExp transform (#5498) (overlookmotel) - 09c522a transformer: RegExp transform report pattern parsing errors (#5496) (overlookmotel) - dd19823 transformer: RegExp transform do not take ownership of `Pattern` then reallocate it (#5492) (overlookmotel) - 2514cc9 transformer/react: Move all entry points to implementation of Traverse trait (#5473) (Dunqing) - c984219 transformer/typescript: Move all entry points to implementation of Traverse trait (#5422) (Dunqing) ### Styling - 2a43fa4 linter: Introduce the writing style from PR #5491 and reduce the if nesting (#5512) (dalaoshu) ### Testing - 340b535 linter/no-unused-vars: Arrow functions in tagged templates (#5510) (Don Isaac) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
In an effort toward the implementation of #5256, this PR allows us to have a separately generated "derive" file for each crate.
This also eliminates a bunch of boilerplate when writing new "derive" generators and generally makes it more approachable.