Commit graph

7445 commits

Author SHA1 Message Date
Boshen
618b6aa085 feat(codege): minify whitespace in object getter / setter (#8080) 2024-12-23 16:36:03 +00:00
Boshen
1d5ae817d7 feat(codegen): minify const [foo] = bar -> const[foo]=bar (#8079) 2024-12-23 16:20:37 +00:00
Boshen
e3f78fba0b feat(codegen): new Foo() -> new Foo when minify (#8077) 2024-12-23 15:34:31 +00:00
Boshen
5397fe978a feat(minifier): constant fold undefined?.bar -> undefined (#8075) 2024-12-23 15:20:37 +00:00
Boshen
d84d60a3a9 feat(codegen): minify numbers with large exponents (#8074) 2024-12-23 13:35:52 +00:00
Boshen
373279b7f4 feat(codegen): balance string quotes when minify whitespace (#8072) 2024-12-23 13:24:22 +00:00
Boshen
0b04288139
feat(linter): move import/named to nursery (#8068)
There are race conditions in the runtime which may cause the module to
not find any exports from `exported_bindings_from_star_export`.
2024-12-23 20:29:43 +08:00
Boshen
e632a7b158 feat(transformer): remove typescript symbols after transform (#8069)
part of #7460
2024-12-23 08:24:54 +00:00
Boshen
8b54d898b5 refactor(minifier): remove parens must happen on enter (#8060) 2024-12-23 06:56:36 +00:00
Alexander S.
10a1fd57e5
fix(linter): rule: no-restricted-imports support option patterns with group key (#8050)
one/two wierd tests are not covered

> This is also an object option whose value is an array. This option
allows you to specify multiple modules to restrict using gitignore-style
patterns or regular expressions.

_https://eslint.org/docs/latest/rules/no-restricted-imports#patterns_

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-12-23 14:52:38 +08:00
Cameron
78d2e837f0
perf(sourcemap): improve perf of search_original_line_and_column (#7926)
this seems to show a decent speed up on perf.
the thinking behind this change is:
1. subsequent calls to `search_original_line_and_column` will **never**
look at back at lines it has already searched
2. binary search is faster in this case as typically `idx` is only
increased by a small amount

Given this, we can skip checking a bunch of lines (that will never
return true) improving performance.

This is a very hot path. 


```
$ hyperfine --warmup=3 ./target/release-with-debug/examples/sourcemap-main ./target/release-with-debug/examples/sourcemap
Benchmark 1: ./target/release-with-debug/examples/sourcemap-main
  Time (mean ± σ):      79.5 ms ±   5.5 ms    [User: 65.1 ms, System: 12.2 ms]
  Range (min … max):    76.8 ms … 111.7 ms    37 runs
 
  Warning: Statistical outliers were detected. Consider re-running this benchmark on a quiet system without any interferences from other programs. It might help to use the '--warmup' or '--prepare' options.
 
Benchmark 2: ./target/release-with-debug/examples/sourcemap
  Time (mean ± σ):      72.9 ms ±   0.9 ms    [User: 59.2 ms, System: 12.2 ms]
  Range (min … max):    70.6 ms …  75.0 ms    40 runs
 
Summary
  ./target/release-with-debug/examples/sourcemap ran
    1.09 ± 0.08 times faster than ./target/release-with-debug/examples/sourcemap-main
```

---------

Co-authored-by: overlookmotel <theoverlookmotel@gmail.com>
2024-12-23 14:51:50 +08:00
underfin
f79e9ad91e
feat(napi/parser): add crate-type: "lib" (#8067)
The rolldown need export it to instead of `rollup/parseAst`, ref
https://rollupjs.org/javascript-api/#accessing-the-parser
2024-12-23 14:47:19 +08:00
Yuji Sugiura
922670e4b7
feat(prettier): Print directive (#8066)
Part of #5068 

- [x] Directive
2024-12-23 14:46:47 +08:00
overlookmotel
3057686543 fix(transformer/class-properties): unwrap parenthesised expressions (#8049)
Unwrap parenthesised expressions everywhere where we call `duplicate_object`.

This fixes panics in conformance tests.
2024-12-23 03:44:13 +00:00
overlookmotel
c2daa20751 feat(ast): add Expression::into_inner_expression (#8048)
Add `Expression::into_inner_expression`. Does the same as `get_inner_expression` and `get_inner_expression_mut`, but operates on an owned `Expression`.
2024-12-23 03:44:12 +00:00
overlookmotel
cbd51694cd refactor(transformer/class-properties): do not recreate private field if not transforming it (#8044)
Previously we were taking private fields from AST and then generating an identical node if not transforming it. Instead, just leave it as is.
2024-12-23 03:44:11 +00:00
overlookmotel
e67cd056a8 fix(transformer/class-properties): correctly resolve private fields pointing to private accessors (#8047)
We don't transform private accessors yet, but include them in private property resolution.

This fixes some panics in TS conformance tests which use private accessors.
2024-12-23 03:44:10 +00:00
overlookmotel
6b08c6e6c4 fix(transformer/class-properties): correctly resolve private fields pointing to private methods (#8042)
We don't transform private methods yet, but in class properties transform, still need to record private methods that classes have, so can correctly resolve private fields.

```js
class Outer {
  #foo = 123;
  method() {
    class Inner {
      #foo() {}
      // Refers to `Inner`'s `#foo` method, not `Outer`'s `#foo` property
      prop = this.#foo;
    }
  }
}
```
2024-12-23 03:44:08 +00:00
翠 / green
1932f1e0a0
feat(minifier): fold foo === undefined || foo === null (#8063)
This PR implements folding `foo === undefined || foo === null` into `foo
== null`.

I checked the minified output diff this time, so hoping that there isn't
a bug.
2024-12-23 00:10:44 +08:00
Boshen
774babb7f2 refactor(linter): read exported_bindings_from_star_export lazily (#8062) 2024-12-22 08:41:42 +00:00
Boshen
547c102b6b refactor(linter): use RwLock<FxHashMap> instead of FxDashMap for module record data (#8061) 2024-12-22 07:10:42 +00:00
Boshen
7cb84f34d1 refactor(minifier): only minify on ast node exit (#8059) 2024-12-21 11:08:38 +00:00
Boshen
23b563730f
feat(tasks/minsize): save minified file 2024-12-21 18:57:36 +08:00
Boshen
77d845a6b8 refactor(minifier): fuse DCE AST passes (#8058) 2024-12-21 10:30:38 +00:00
Boshen
be2c60dd10 fix(parser): parse import source from from 'mod' (#8056) 2024-12-21 10:20:14 +00:00
Boshen
8b025e36db chore(coverage): bump test262 (#8055) 2024-12-21 10:20:14 +00:00
overlookmotel
be4feb4ad7 feat(syntax): add SymbolId::new method (#8041)
Add `SymbolId::new` method, same as `ScopeId::new`. The advantage over `SymbolId::from_usize` is that `new` can be a `const` method.
2024-12-21 10:10:56 +00:00
Boshen
6123f5e6ff refactor(minifier): fold statements on exit (#8057) 2024-12-21 10:06:04 +00:00
overlookmotel
98e8a72bad refactor(transformer/class-properties): do not take mut ref when immut ref will do (#8040)
Tiny refactor. Not need to take a `&mut` when a `&` will do.
2024-12-21 07:21:30 +00:00
camc314
274f117d4e fix(transformer/nullish-coalescing): use correct scope id for binding (#8053) 2024-12-21 07:08:29 +00:00
overlookmotel
3d83396f0b test(transformer/nullish-coalescing): failing test (#8051)
Add failing test for nullish coalescing operator. The output is correct, but temp var is created in wrong scope.

My guess is that it needs to use `current_hoist_scope_id`, not `current_scope_id`.

This test from class properties also shows the same problem: ac097e9160/tasks/transform_conformance/snapshots/oxc.snap.md (L20-L35)
2024-12-21 07:08:29 +00:00
oxc-bot
d69de3629d
release(crates): v0.43.0 (#8054)
## [0.43.0] - 2024-12-21

- de4c772 traverse: [**BREAKING**] Rename `Ancestor::is_via_*` methods
to `is_parent_of_*` (#8031) (overlookmotel)

- ed75e42 semantic: [**BREAKING**] Make SymbolTable fields `pub(crate)`
instead of `pub` (#7999) (Boshen)

### Features

- 75b775c allocator: `Vec<u8>::into_string` (#8017) (overlookmotel)
- 8547e02 ast: Implement `allocator_api2` for `Allocator` (#8043)
(Boshen)
- 63a95e4 ast: Add `AstBulder::move_property_key` (#7998)
(overlookmotel)
- 897a1a8 transformer/class-properties: Exit faster from super
replacement visitor (#8028) (overlookmotel)
- 3ea4109 transformer/class-properties: Transform super update
expressions within static prop initializer (#7997) (Dunqing)
- cc57db3 transformer/class-properties: Transform super assignment
expressions within static prop initializer (#7991) (Dunqing)
- 6b6444b traverse: Record current block scope (#8007) (overlookmotel)

### Bug Fixes

- 043252d transformer/class-properties: Replace `this` and class name in
static blocks (#8035) (overlookmotel)
- 273795d transformer/class-properties: Run other transforms on static
properties, static blocks, and computed keys (#7982) (overlookmotel)

### Performance

- c0dd3f8 ast: `move_expression` and `move_statement` produce dummy with
no span (#7995) (overlookmotel)
- 862838f codegen: Remove useless to_owned (#8014) (Dunqing)
- 2736657 semantic: Allocate `UnresolvedReferences` in allocator (#8046)
(Boshen)
- 2e8872c semantic: Allocate child scope in allocator (#8045) (Boshen)
- 414e828 semantic: Allocate symbol data in Allocator (#8012) (Boshen)
- 7aebed0 semantic: Allocate `Bindings` in allocator (#8021) (Boshen)
- 0f9308f transformer/react-refresh: Reduce allocations (#8018)
(overlookmotel)
- 0deb9e6 transformer/react-refresh: Reserve capacity in hook key string
(#8016) (overlookmotel)
- 7b70347 transformer/react-refresh: Avoid allocating string in each
hook call (#8013) (Dunqing)

### Documentation

- df5c341 ast: Improve docs for `AstBuilder::move_*` methods (#7994)
(overlookmotel)

### Refactor

- f1adf9f semantic: `ScopeTree::rename_binding` remove old binding first
(#8020) (overlookmotel)
- 02f968d semantic: Change `Bindings` to a plain `FxHashMap` (#8019)
(Boshen)
- e7476a1 semantic: Remove `serialize` (#8015) (Boshen)
- 1cf7b83 semantic: Simplify handling namespace stack (#7987) (Dunqing)
- 48cb52b semantic: Remove resetting `current_reference_flags` in visit
functions (#7986) (Dunqing)
- 3250a47 semantic: Remove unused current_symbol_flags (#7985) (Dunqing)
- efe96ec semantic: Use `Stack` for function stack node ids (#7984)
(Dunqing)
- ac097e9 transformer/class-properties: Rename file (#8036)
(overlookmotel)
- 059a5dd transformer/class-properties: Do not pass `ScopeId` into
`insert_instance_inits` (#8001) (overlookmotel)
- 0a38eea transformer/class-properties: Use `temp_var_name_base` to
generate temp var names for `super` transform (#8004) (overlookmotel)
- d1b7181 transformer/class-properties: Rename var (#8006)
(overlookmotel)
- 5a23d72 transformer/class-properties: Remove outdated comment (#8000)
(overlookmotel)
- b3a5f3e transformer/class-properties: Mark
`transform_assignment_expression_if_super_member_assignment_target` as
inline (#7993) (Dunqing)

### Testing

- bcb33c0 semantic: Add a test for catch parameters reference (#7988)
(Dunqing)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
2024-12-21 15:07:21 +08:00
camc314
952d7e46bf refactor(linter): rename flat.rs to config.rs (#8033)
simply renames `flat.rs` to `config.rs` to more accurately reflect the file's purpose
2024-12-21 02:01:40 +00:00
camc314
50848ede52 refactor(linter): simplify ConfigStore to prep for nested configs (#8032) 2024-12-21 02:01:40 +00:00
Boshen
2736657dcd perf(semantic): allocate UnresolvedReferences in allocator (#8046) 2024-12-20 15:18:16 +00:00
Boshen
2e8872cc3f perf(semantic): allocate child scope in allocator (#8045) 2024-12-20 15:18:16 +00:00
Boshen
414e8285cd perf(semantic): allocate symbol data in Allocator (#8012) 2024-12-20 14:13:41 +00:00
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