Commit graph

7408 commits

Author SHA1 Message Date
Boshen
8547e02456 feat(ast): implement allocator_api2 for Allocator (#8043) 2024-12-20 13:26:48 +00:00
Alexander S.
b3f38aeab9
fix(linter): rule no-restricted-imports: support option allowImportNames (#8002)
waiting for #7943
2024-12-20 20:56:05 +08:00
overlookmotel
ac097e9160 refactor(transformer/class-properties): rename file (#8036)
Pure refactor. Rename file to make filename more descriptive of what it does.
2024-12-20 10:07:24 +00:00
overlookmotel
043252dcd1 fix(transformer/class-properties): replace this and class name in static blocks (#8035)
Transform `this`, class name, and `super` in static blocks.
2024-12-20 10:07:23 +00:00
overlookmotel
273795d471 fix(transformer/class-properties): run other transforms on static properties, static blocks, and computed keys (#7982)
Large re-architecting of class properties transform. Split transform into 3 phases:

1. Transform instance properties when entering class.
2. Transform private fields during traversal of class body.
3. Transform static properties and static blocks when exiting class.

This ensures that code which has to be moved outside of the class (static property initializers, static blocks, computed keys) can get transformed by other transforms before they're moved out.

Also fixes a problem where we previously registered private properties too early - on entering the class, rather than the class *body*, so private fields in `extends` clause of a nested class were misinterpretted.
2024-12-20 10:07:23 +00:00
overlookmotel
6b6444b523 feat(traverse): record current block scope (#8007)
Record "block" scope ID along with "hoist" scope ID in `Traverse`.

"Block" scope is the scope where a `let` statement would be inserted above current position in AST.

Block scope and current scope differ from each other inside classes. For example, if want to create a `let` temp var for `foo()` or `bar()` in example below, should use block scope not current scope. Current scope is the class itself, but the `let` statement will be inserted *outside* the class.

```js
class C {
  [foo()]: bar();
}
```

All transforms which create `let` bindings should use block scope not current scope. We should add `VarDeclarationsStore::insert_let` method which uses block scope, to accompany `insert_var` (which uses hoist scope).

This is implemented in a rather hacky way, and we should improve it later. Notably, we're not considering `for` statements as block scopes because we currently have no way to insert `let` statements into them if they don't have a body block.
2024-12-20 03:50:44 +00:00
overlookmotel
059a5dd56a refactor(transformer/class-properties): do not pass ScopeId into insert_instance_inits (#8001)
No need to pass this var through various functions, as they already have access to `self` to get it itself.
2024-12-20 03:10:24 +00:00
overlookmotel
c0dd3f8e32 perf(ast): move_expression and move_statement produce dummy with no span (#7995)
The purpose of `AstBuilder::move_*` methods is to create dummy nodes which will later be replaced again. Give the dummy nodes empty spans as it's faster, and no point in them having a real span.
2024-12-20 03:10:23 +00:00
overlookmotel
897a1a8946 feat(transformer/class-properties): exit faster from super replacement visitor (#8028)
When inserting instance property initializers into class constructor, need to search for and transform `super()`. Exit that visit earlier in some cases, for better performance and smaller output.
2024-12-20 03:10:22 +00:00
overlookmotel
de4c7726f9 refactor(traverse)!: rename Ancestor::is_via_* methods to is_parent_of_* (#8031)
Rename these methods. `is_via_*` is confusing as hell. `is_parent_of_*` is more descriptive.

`Ancestor::is_parent_of_statement` tells you if *previous* `Ancestor` is a `Statement`.
2024-12-20 03:10:22 +00:00
overlookmotel
f1adf9fa18 refactor(semantic): ScopeTree::rename_binding remove old binding first (#8020)
#8019 changed scope bindings from an ordered `IndexMap` to an unordered `FxHashMap`.

`ScopeTree::rename_binding` no longer needs to preserve order, so can remove the old binding before adding the new one. This makes it less likely that the hash map will need to reallocate.

Also remove comments about preserving ordering of bindings, which are now outdated.
2024-12-20 02:38:30 +00:00
Alexander S.
340cc90f12
fix(linter): rule no-restricted-imports: fix option "importNames" (#7943)
all test cases with `importNames` are now passing.

Now working on the other options
2024-12-20 10:37:23 +08:00
Alexander S.
5722346ee0
refactor(language_server)!: use .oxlintrc.json when no config path provided (#8027)
Will break for other IDEs when they do not self provide an default value
2024-12-20 10:30:03 +08:00
Alexander S.
de8246b96f
refactor(language_server): move structs into own file (#8026)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-12-20 10:29:44 +08:00
camc314
b2a4a786ae refactor(linter): remove unused with_rules and set_rule methods (#8029)
this method is unused, hence it makes sense to remove.
furthermore, keeping it makes it tricky to work the nested config stuff
2024-12-19 21:43:28 +00:00
camc314
6344b934ae fix(lsp): improve err handling when loading source text (#8025)
note i didn't test this, but it's panicing because `fs::read_to_string` is returning an error as the path no longer exists.

fixes https://github.com/oxc-project/oxc/issues/8023
2024-12-19 19:07:49 +00:00
overlookmotel
0f9308f152 perf(transformer/react-refresh): reduce allocations (#8018)
Small optimization. When generating hash of hooks key, build the hash string directly in arena, avoiding an intermediate heap-allocated `String`, by using `base64` crate's `encode_slice` method which writes directly into a slice.

`base64` crate is rather inefficient - there are various optimizations that could be made. But not worth getting into that, as this is only place we use `base64` crate in a performance-sensitive context.
2024-12-19 17:46:31 +00:00
overlookmotel
75b775c055 feat(allocator): Vec<u8>::into_string (#8017)
Bumpalo has a method `String::from_utf8_unchecked` to covert a `Vec<u8>` to a `String`. But we can't use it because we use Bumpalo's `String` as our arena string type, but allocator_api2's `Vec` as our arena vec.

Provide the same functionality, that works around this incompatibility. Also use the faster `simdutf8` for checking that `Vec` contains a valid UTF-8 string.
2024-12-19 17:46:30 +00:00
overlookmotel
0deb9e6c2e perf(transformer/react-refresh): reserve capacity in hook key string (#8016)
Follow-on after #8013. Reserve sufficient capacity in `String` used to store hook key, before pushing to it.

Also refactor so code for constructing key is only included once.
2024-12-19 17:46:29 +00:00
overlookmotel
69b1ef3c16
style(tools): remove line break from deny.toml (#8022)
Extra line break is triggering autofix.
2024-12-19 15:46:43 +00:00
Boshen
c24f102255
chore: add Zlib license to deny.toml 2024-12-19 23:36:12 +08:00
Boshen
7aebed012d perf(semantic): allocate Bindings in allocator (#8021) 2024-12-19 15:16:03 +00:00
Boshen
02f968d02d refactor(semantic): change Bindings to a plain FxHashMap (#8019)
`IndexMap` was needed for the insertion order requirement in mangler.

Bindings (symbol ids) are monotonically increasing by binding
positions, which means we can get insertion order by sorting the symbol ids in
mangler.

Previous attempt: https://github.com/oxc-project/oxc/pull/4228
2024-12-19 14:16:28 +00:00
Dunqing
862838fd28 perf(codegen): remove useless to_owned (#8014) 2024-12-19 12:06:55 +00:00
Dunqing
7b703471b1 perf(transformer/react-refresh): avoid allocating string in each hook call (#8013)
related: https://github.com/oxc-project/oxc/pull/7970#issuecomment-2551294930;

Just realized this can be simplified to that
2024-12-19 12:06:54 +00:00
Boshen
e7476a1a28 refactor(semantic): remove serialize (#8015) 2024-12-19 09:51:12 +00:00
overlookmotel
0a38eea95c refactor(transformer/class-properties): use temp_var_name_base to generate temp var names for super transform (#8004)
Follow-on after #7997.

Generate "base name" for temp var using `temp_var_name_base` and then create the 2 temp bindings from it.

This is a bit more efficient than creating 2nd temp binding from name of the first temp binding, because the first binding's name has `_` added to start, and may have digits on the end, which have to be trimmed off again. Whereas the "base name" is ready to go.

Incidentally, changing the timing of when temp bindings are created also aligns output with Babel.
2024-12-19 02:24:58 +00:00
overlookmotel
63a95e4aa2 feat(ast): add AstBulder::move_property_key (#7998)
Add `AstBuilder::move_property_key` method, same as the rest of `move_*` methods.
2024-12-18 23:17:54 +00:00
overlookmotel
d1b7181452 refactor(transformer/class-properties): rename var (#8006)
Give var more descriptive name.
2024-12-18 21:59:47 +00:00
overlookmotel
87ea928e17 test(transformer/class-properties): failing test for super.prop as assignment target (#8005)
Add failing test for syntax we can't support yet.
2024-12-18 19:07:24 +00:00
Dunqing
3ea4109d14 feat(transformer/class-properties): transform super update expressions within static prop initializer (#7997) 2024-12-18 18:29:05 +00:00
overlookmotel
5a23d72b37 refactor(transformer/class-properties): remove outdated comment (#8000) 2024-12-18 16:51:35 +00:00
Boshen
ed75e42ed6 refactor(semantic)!: make SymbolTable fields pub(crate) instead of pub (#7999)
SymbolTable needs some internal changes.
2024-12-18 16:38:58 +00:00
overlookmotel
df5c341c38 docs(ast): improve docs for AstBuilder::move_* methods (#7994) 2024-12-18 15:07:25 +00:00
Dunqing
b3a5f3eb59 refactor(transformer/class-properties): mark transform_assignment_expression_if_super_member_assignment_target as inline (#7993)
I forgot to mark it as inline like other methods do.
2024-12-18 13:59:40 +00:00
overlookmotel
5cf253c216 test(transformer/class-properties): more testing for assignment to super[prop] (#7992)
Amend test added in #7991 to test transform of `super[prop] = value` where `prop` is not bound.

We should ideally have the `_unbound` temp vars *inside* the arrow function rather than outside, as Babel does, but that's not possible with our double-visitor scheme at present, and I think current output will operate correctly anyway.

Probably these temp vars could be hoisted even higher up - to very top level of the file, even if the class and `super[prop]` were deeply nested in many functions - and it'd still be correct. That'd be good for transformer performance as less `var` statements to insert, and also slightly smaller output size - less `var`s in code. But I don't know if that would be worse for runtime performance, as it makes the arrow function more impure. 🤔
2024-12-18 12:49:42 +00:00
Dunqing
cc57db38e1 feat(transformer/class-properties): transform super assignment expressions within static prop initializer (#7991)
Alternative of #7956 and #7959. Unlike the previous method, adapting duplicating the same logic rather than making the same logic transform function to be generic
2024-12-18 11:28:39 +00:00
Dunqing
e3d0889009 test(transformer/class-properties): add static super tagged template test (#7964)
I just found that we don't need to transform `TaggedTemplateExpression` because its `tag` can be transformed by `transform_static_member_expression` and `transform_computed_member_expression`
2024-12-18 10:25:21 +00:00
Dunqing
bcb33c00fa test(semantic): add a test for catch parameters reference (#7988)
I am trying to clean up Semantic, just found that we can remove this code without any test failing, but it should fail in that test case I added.
 1082868855/crates/oxc_semantic/src/builder.rs (L2085-L2087)
2024-12-18 08:47:27 +00:00
Boshen
6da0b219dd refactor(oxlint): remove unused git.rs (#7990) 2024-12-18 08:41:50 +00:00
Boshen
58e7777814 refactor(oxlint): remove extra if check in Walkdir (#7989) 2024-12-18 08:37:20 +00:00
Dunqing
1cf7b83431 refactor(semantic): simplify handling namespace stack (#7987)
We had a BindingIdentifier to `TSModuleDeclarationName` so that we don't need to get binding from name.
2024-12-18 07:56:13 +00:00
Dunqing
48cb52b335 refactor(semantic): remove resetting current_reference_flags in visit functions (#7986)
We have reset current_reference_flags after resolving reference flags in https://github.com/oxc-project/oxc/pull/7923, so that we don't need to set it to empty in another place.
2024-12-18 07:56:12 +00:00
Dunqing
3250a47a97 refactor(semantic): remove unused current_symbol_flags (#7985) 2024-12-18 06:44:03 +00:00
Dunqing
efe96ecc12 refactor(semantic): use Stack for function stack node ids (#7984) 2024-12-18 06:38:59 +00:00
oxc-bot
3631eed975
release(crates): v0.42.0 (#7983)
## [0.42.0] - 2024-12-18

- 84b75a0 semantic: [**BREAKING**] Remove `ScopeFlags::Modifiers`
(#7935) (overlookmotel)

- c071494 semantic: [**BREAKING**] Remove `SymbolTable::rename` method
(#7868) (overlookmotel)

### Features

- 8b7c5ae ast: Add `AstBuilder::atom_from_cow` (#7974) (overlookmotel)
- 46e2e27 data_structures: Implement `Default` for `NonEmptyStack`
(#7946) (overlookmotel)
- db9e93b mangler: Mangle top level variables (#7907) (翠 / green)
- 075bd16 minifier: Fold bitwise operation (#7908) (翠 / green)
- c16a851 napi/transform: Add `jsx: 'preserve'` option (#7965) (Boshen)
- 81eedb1 parser: 'readonly' type modifier is only permitted on array
and tuple literal types. (#7880) (Boshen)
- b9322c6 semantic: Re-export all flags and ID types (#7886)
(overlookmotel)
- c30a982 span: Add `impl From<ArenaString> for Atom` (#7973)
(overlookmotel)
- 02b653c transformer/class-properties: Do not create temp var for
template literal computed key (#7919) (overlookmotel)
- feac02e transformer/class-properties: Only rename symbols if necessary
(#7896) (overlookmotel)
- 6bc530d transformer/class-properties: Transform super call expression
that is inside static prop initializer (#7831) (Dunqing)
- 53e2bc0 traverse: Add `TraverseScoping::rename_symbol` method (#7871)
(overlookmotel)

### Bug Fixes

- 3659e6d cfg: Include export default code in CFG instructions (#7862)
(Jan Olaf Martin)
- 850dd43 codegen: Missing `,` when generating type parameters with jsx
(#7929) (Dunqing)
- 4799471 minfier: Bigint bitwise operation only works with bigint
(#7937) (Boshen)
- de8a86e minifier: Incorrect minification in `try_fold_left_child_op`
(#7949) (翠 / green)
- 9a30910 oxc_transformer: Inject_global_variables should considering
string imported name (#7768) (IWANABETHATGUY)
- 111dc52 parser: Include export token in spans of
TSNamespaceExportDeclaration (#7963) (branchseer)
- 14c51ff semantic: Remove inherting `ScopeFlags::Modifier` from parent
scope (#7932) (Dunqing)
- 596aead semantic: Reset references flags when resolved (#7923)
(Dunqing)
- 4924073 semantic: `ScopeTree::rename_binding` preserve order of
bindings (#7870) (overlookmotel)
- bb38065 transformer/class-properties: Do not transform `super.prop` in
nested method within static prop initializer (#7978) (overlookmotel)
- e76fbb0 transformer/class-properties: Fix symbol clashes in instance
prop initializers (#7872) (overlookmotel)
- c0576fa transformer/class-properties: Use UID for `args` in created
class constructor (#7866) (overlookmotel)
- d660d8d transformer/optional-chaining: Do not create unused reference
when `noDocumentAll` assumption (#7847) (overlookmotel)
- 4920c6a transformer/optional-chaining: Avoid creating a useless
reference when `noDocumentAll` is true (#7832) (Dunqing)

### Performance

- a5f04a7 ast: Faster `Comment::is_jsdoc` (#7905) (overlookmotel)
- 4b24335 codegen: Improve printing of statement comments (#7857)
(Boshen)
- 71a40a2 codegen: Guard comment printing comments when there are no
comments (#7856) (Boshen)
- b31f123 transformer/class-properties: Do not re-generate same method
key (#7915) (overlookmotel)
- 8ca8fce transformer/class-properties: Reduce work updating scopes when
transforming static prop initializers (#7904) (overlookmotel)
- 80d0b3e transformer/class-properties: Fast path for instance prop
initializer scope re-parenting (#7901) (overlookmotel)
- 38aafa2 transformer/class-properties: Reduce size of
`transform_call_expression_for_super_member_expr` (#7859)
(overlookmotel)

### Documentation

- e49de81 ast: Document `Expression::is_*` methods (#7853)
(overlookmotel)
- 10a86b9 transformer: Fix comments (#7925) (overlookmotel)
- f4cb5d3 transformer: Clarify comment (#7918) (overlookmotel)
- 41a1456 transformer/class-properties: Correct doc comments (#7966)
(overlookmotel)
- 18441af transformer/class-properties: Remove oudated todo for
assignment expression (#7955) (Dunqing)
- 1317c00 transformer/class-properties: Clarify doc comments (#7914)
(overlookmotel)
- 9989b58 transformer/class-properties: Re-order file list in doc
comment (#7911) (overlookmotel)
- 7390048 transformer/class-properties: Reformat doc comment (#7909)
(overlookmotel)

### Refactor

- beb982a ast: Use exhaustive match for `Argument` to
`ArrayExpressionElement` conversion (#7848) (overlookmotel)
- 3858221 global: Sort imports (#7883) (overlookmotel)
- 1314c97 minifier: Expose dce as an API instead of an option (#7957)
(Boshen)
- 6551dfe semantic: Pass `&str` instead of `Cow` (#7972) (overlookmotel)
- b8d2bd2 semantic: Move determining references flags for export
specifier to `visit_export_named_declaration` (#7924) (Dunqing)
- 98d7946 semantic: Import flags and ID types from `oxc_syntax` (#7887)
(overlookmotel)
- 1cf8f8f semantic: `SymbolTable::set_name` return old name (#7869)
(overlookmotel)
- 5d42df8 semantic: Use `Expression::is_super` (#7851) (overlookmotel)
- 8cf9766 semantic, syntax, wasm: Remove `#![allow(non_snake_case)]`
(#7863) (overlookmotel)
- d59bbae transformer: Remove unneeded lint `#[allow]` (#7971)
(overlookmotel)
- 2c94236 transformer: Improve encapsulation of transforms (#7888)
(overlookmotel)
- 34091b2 transformer: Use `Expression::is_super` (#7852)
(overlookmotel)
- d4d7bc0 transformer/async-to-generator: Avoid allocating unnecessary
`Atom`s (#7975) (overlookmotel)
- 2e5ffd3 transformer/class-properties: Store `temp_var_is_created` on
`ClassBindings` (#7981) (overlookmotel)
- 27cc6da transformer/class-properties: Store `is_declaration` only on
`ClassDetails` (#7980) (overlookmotel)
- ee282f8 transformer/class-properties: Remove `move_expression`s
(#7979) (overlookmotel)
- 94b376a transformer/class-properties: Simplify logic for when to
create temp binding (#7977) (overlookmotel)
- ff9d1b3 transformer/class-properties: Comments about shorter output
(#7976) (overlookmotel)
- 6fc40f0 transformer/class-properties: Pass `BoundIdentifier`s by
reference (#7968) (overlookmotel)
- 69eeeea transformer/class-properties: Methods take `&self` where
possible (#7967) (overlookmotel)
- 98340bb transformer/class-properties: Use stack of `ClassDetails`
(#7947) (overlookmotel)
- 088dd48 transformer/class-properties: Shorten code (#7913)
(overlookmotel)
- 544ffbf transformer/class-properties: Split up code into multiple
files (#7912) (overlookmotel)
- dcaf674 transformer/class-properties: Rename file (#7910)
(overlookmotel)
- 6243980 transformer/class-properties: Instance prop inits visitor use
`Visit` (#7867) (overlookmotel)
- eb47d43 transformer/class-properties: Re-use existing `Vec` (#7854)
(overlookmotel)
- 1380b7b transformer/class-properties: Reduce visibility of method
(#7858) (overlookmotel)
- 0f5e078 transformer/class-properties: Rename `*_owner` to `owned_*`
(#7855) (Dunqing)
- 4ea90d4 transformer/react-refresh: Calculate signature key once
(#7970) (Dunqing)
- 15b9bff transformer/typescript: Reuse `Atom` (#7969) (overlookmotel)

### Styling

- fb897f6 data_structures: Add line break (#7882) (overlookmotel)
- 7fb9d47 rust: `cargo +nightly fmt` (#7877) (Boshen)

### Testing

- 523d48c transformer: Move named test to exports folder (#7922)
(Dunqing)
- e766051 transformer: Skip test which uses filesystem under miri
(#7874) (overlookmotel)
- f39e65e transformer: Prevent lint error when running miri (#7873)
(overlookmotel)

Co-authored-by: Dunqing <29533304+Dunqing@users.noreply.github.com>
2024-12-18 11:48:12 +08:00
overlookmotel
2e5ffd30a1 refactor(transformer/class-properties): store temp_var_is_created on ClassBindings (#7981)
Move `temp_var_is_created` from main `ClassProperties` object to `ClassBindings`. It makes more sense there.
2024-12-18 03:16:31 +00:00
overlookmotel
27cc6da328 refactor(transformer/class-properties): store is_declaration only on ClassDetails (#7980)
`is_declaration` was stored in 2 places. Only store it in `ClassDetails` struct.
2024-12-18 03:16:28 +00:00
overlookmotel
ee282f8897 refactor(transformer/class-properties): remove move_expressions (#7979)
Remove 2 x `move_expression` calls by taking value from `Option` instead. This avoids allocating dummy `Expression`s into arena.
2024-12-18 03:06:04 +00:00
overlookmotel
94b376a713 refactor(transformer/class-properties): simplify logic for when to create temp binding (#7977)
Remove the hack of overwriting temp binding with name binding before traversing class body. Instead decide which binding to use in `ClassBindings::get_or_init_static_binding` based on a flag.

This less performant than what we had before. But it simplifies some confusing logic, and prepares the ground for changes to come where we'll need to duck in and out of static context repeatedly while traversing the class body.
2024-12-18 03:06:04 +00:00