Commit graph

6191 commits

Author SHA1 Message Date
Brian Donovan
b9d7c5fdb5
fix(no-unused-vars): consider functions within conditional expressions usable (#6553) 2024-10-15 09:46:26 -04:00
Dunqing
448388ac9a docs(transformer/module_imports): update outdated comments (#6574)
Follow-up https://github.com/oxc-project/oxc/pull/6560
2024-10-15 13:21:56 +00:00
Boshen
d11770d552 feat(ecmascript): add StringToNumber (#6576) 2024-10-15 08:52:54 +00:00
magic-akari
a71e8a00bf
fix(minifier): Preserve init variable declarations when removing for statements during DCE (#6551)
- Closes: #6547

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-10-15 16:51:30 +08:00
Boshen
2e4c793a78
chore(Cargo.toml): relax napi version 2024-10-15 13:48:01 +08:00
Boshen
55a0e9e960
chore(Cargo.toml): relax quote 2024-10-15 13:45:24 +08:00
Boshen
85e3119905
chore(Cargo.toml): relax versions of syn and proc-macro2 2024-10-15 13:42:15 +08:00
Boshen
e56188037c feat(ecmascript): add constant_evaluation and side_effects code (#6550)
I intend to move most of the constant evaluation code into the crate.
2024-10-15 05:15:46 +00:00
camchenry
77ddab863f perf(linter/numeric-separators-style): replace regex with number parser (#6546)
Building the Regex here is slow. We can take advantage of the fact that we know what the inputs should look like and parse the number directly.

Cumulatively, this makes linting the RadixUIAdoptionSection.tsx ~7% faster:

```
hyperfine --warmup 100 --shell=none --runs 3000 './oxlint-main -W all --silent ./RadixUIAdoptionSection.jsx' './oxlint-num-separators -W all --silent ./RadixUIAdoptionSection.jsx'
Benchmark 1: ./oxlint-main -W all --silent ./RadixUIAdoptionSection.jsx
Benchmark 1: ./oxlint-main -W all --silent ./RadixUIAdoptionSection.jsx
  Time (mean ± σ):       4.1 ms ±   0.1 ms    [User: 1.8 ms, System: 1.4 ms]
  Range (min … max):     3.8 ms …   4.7 ms    3000 runs

Benchmark 2: ./oxlint-num-separators -W all --silent ./RadixUIAdoptionSection.jsx
  Time (mean ± σ):       3.8 ms ±   0.1 ms    [User: 1.5 ms, System: 1.4 ms]
  Range (min … max):     3.5 ms …   4.5 ms    3000 runs

Summary
  ./oxlint-num-separators -W all --silent ./RadixUIAdoptionSection.jsx ran
    1.08 ± 0.05 times faster than ./oxlint-main -W all --silent ./RadixUIAdoptionSection.jsx
```
2024-10-15 05:02:55 +00:00
camchenry
8f47cd00bd perf(linter/react): remove regex patterns in no-unknown-property (#6536)
Initializing these `Regex`s, even if lazily, is relatively slow on a per-file basis. We can implement these much faster as simple iterators over characters.
2024-10-15 05:02:54 +00:00
camchenry
62afaa99dd perf(linter/jsx-no-comment-textnodes): remove regex for checking comment patterns (#6534)
Improves performance of this rule by replacing `Regex` with simpler string methods. On the `RadixUIAdoptionSection.jsx` file alone, this improves performance by ~5%:

```
hyperfine --warmup 100 --shell=none --runs 3000 './oxlint-main -W jsx-no-comment-textnodes --silent ./RadixUIAdoptionSection.jsx' './oxlint-jsx-no-comment-textnodes-no-regex -W jsx-no-comment-textnodes --silent ./RadixUIAdoptionSection.jsx'
Benchmark 1: ./oxlint-main -W jsx-no-comment-textnodes --silent ./RadixUIAdoptionSection.jsx
  Time (mean ± σ):       4.4 ms ±   0.1 ms    [User: 1.7 ms, System: 1.9 ms]
  Range (min … max):     4.1 ms …   5.3 ms    3000 runs

Benchmark 2: ./oxlint-jsx-no-comment-textnodes-no-regex -W jsx-no-comment-textnodes --silent ./RadixUIAdoptionSection.jsx
  Time (mean ± σ):       4.2 ms ±   0.1 ms    [User: 1.5 ms, System: 1.8 ms]
  Range (min … max):     3.9 ms …   5.0 ms    3000 runs

Summary
  ./oxlint-jsx-no-comment-textnodes-no-regex -W jsx-no-comment-textnodes --silent ./RadixUIAdoptionSection.jsx ran
    1.06 ± 0.05 times faster than ./oxlint-main -W jsx-no-comment-textnodes --silent ./RadixUIAdoptionSection.jsx
```
2024-10-15 05:02:54 +00:00
Boshen
8d9a2da9f3 ci(benchmark): add small test file to linter benchmark (#6572)
closes #6540
2024-10-15 02:37:22 +00:00
Boshen
435a89c6e4 refactor(oxc): remove useless allocator.alloc(program) calls (#6571) 2024-10-15 02:21:20 +00:00
camc314
ef237cf8ff feat(minifier): complete implementation of statement fusion (#6566)
- enables all test in statement fusion
 - implements some more node in `may_have_side_effects`
2024-10-15 02:14:49 +00:00
Dunqing
c67acfaae7 chore(transformer): turns off async_to_generator plugin in enable_all (#6554)
The plugin is not ready to test
2024-10-15 02:08:28 +00:00
Don Isaac
04d09b3d1b
ci: auto-label PRs with category tags based on their title (#6533)
Automatically add category labels (e.g. `C-enhancement`) to PRs based on
the conventional commit type (e.g. `feat`) used in their title.
2024-10-15 10:07:21 +08:00
overlookmotel
f70a413536 perf(transformer): object spread transform: do not lookup Object binding if not needed (#6570)
If `set_spread_properties` option is not set, skip looking up binding for `Object`, as it's not used.
2024-10-15 01:20:38 +00:00
overlookmotel
c6f2b5f0a1 fix(transformer): HelperLoader common transform: do not assume babelHelpers is global (#6569)
Unfortunately, we cannot assume `babelHelpers` is a global var. Obviously, the transform won't work correctly if it's not, but at least `SymbolTable` will be consistent with the AST.
2024-10-15 01:20:36 +00:00
overlookmotel
779ff46166 refactor(transformer): HelperLoader common transform: Helper struct (#6568)
Pure refactor. Use a struct with named fields to store loaded helper details, for clarity.
2024-10-15 01:20:35 +00:00
overlookmotel
bc24a24541 refactor(transformer): HelperLoader common transform: use hashmap Entry API (#6567)
Perform lookup in `loaded_helpers` via more efficient hashmap `Entry` API, avoiding a double-lookup.
2024-10-15 01:20:34 +00:00
overlookmotel
9f02fc7701 refactor(transformer): HelperLoader common transform: re-order fields (#6565)
Style nit. Keep fields in same order throughout.
2024-10-15 01:20:33 +00:00
overlookmotel
50ecade892 refactor(transformer): HelperLoader common transform: remove Rcs (#6564)
State is uniquely owned by `HelperLoaderStore`, so no need for `Rc`.
2024-10-15 01:20:31 +00:00
overlookmotel
1c1e9fc2c4 refactor(transformer): HelperLoader common transform: reorder methods (#6563)
Refactor `HelperLoader` common transform to split up public and internal methods. Move `add_imports` function to be a method of `HelperLoaderStore`, so `impl Traverse for HelperLoader` is as minimal as possible.

This is for consistency with the other common transforms.
2024-10-15 01:20:30 +00:00
overlookmotel
c9054c8421 refactor(transformer): rename ImportKind to Import (#6561)
Pure refactor. Just change name of the type from `ImportKind` to `Import`. I don't think "Kind" adds anything.
2024-10-15 01:20:29 +00:00
overlookmotel
9542c4e300 refactor(transformer): add more specific methods to ModuleImportsStore (#6560)
Make `ImportKind` private implementation detail of `ModuleImports` common transform. Provide `add_default_import` and `add_named_import` methods instead.
2024-10-15 01:20:28 +00:00
overlookmotel
7e57a1d2fc refactor(transformer): ImportKind use BoundIdentifier (#6559)
Follow-on after #6434.

Store `BoundIdentifier` in `ImportKind`, rather than storing `name` and `symbol_id` separately. Pure refactor - just allows shortening some code.
2024-10-15 01:20:26 +00:00
overlookmotel
602df9df63 refactor(transformer): re-order fields of Common and TransformCtx (#6562)
Follow-on after #6162.

Tiny refactor. Put `HelperLoader` first, so order of fields is same order the common transforms run in.
2024-10-14 20:22:16 +00:00
DonIsaac
06b09b2022 test(linter/no-unused-vars): enable now-passing tests (#6556)
Un-comment tests that are now passing. This PR does not change rule behavior; these have been passing for a while now, but were not getting run.
2024-10-14 19:19:58 +00:00
DonIsaac
badd11ce0d test(linter/no-unused-vars): ignored catch parameters (#6555)
Add test cases covering unused/ignored catch parameters after [this discussion](https://discord.com/channels/1079625926024900739/1080712072012238858/1295014826388623414) on discord.
2024-10-14 19:19:56 +00:00
Ethan Goh
a9260cf6d1
feat(transformer): async-to-generator plugin. (#5590)
Tests are still not passed. A lot need to do yet.

---------

Co-authored-by: Dunqing <dengqing0821@gmail.com>
2024-10-14 17:16:58 +08:00
Boshen
3556062213 feat(ecmascript): add ConstantEvaluation (#6549) 2024-10-14 07:53:44 +00:00
Boshen
67ad08a056 refactor(minifier): unify ValueType (#6545) 2024-10-14 04:21:42 +00:00
Boshen
521d295830 chore(deps): update vscode npm packages (#6544) 2024-10-14 03:30:41 +00:00
Tapan Prakash
9f9057b99f
fix(regular_expression): Fixed control Y regular expression (#6524)
Fixes https://github.com/oxc-project/oxc/issues/6413

Fixed regular expression for control Y
2024-10-14 11:19:37 +08:00
Boshen
591f5dd960 chore(deps): update rust crates (#6542) 2024-10-14 03:14:15 +00:00
Boshen
3c7540e4ca
chore(deps): update dependency express to v4.21.1 (#6543)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 10:30:15 +08:00
Dunqing
41c8675f0d feat(transformer/object-rest-spread): using helper loader (#6449) 2024-10-14 01:34:53 +00:00
overlookmotel
c0e9d7eb77 refactor(codegen)!: Codegen::into_source_text consume Codegen (#6539)
Breaking change. `Codegen::into_source_text` consume `Codegen`, instead of taking the `CodeBuffer` and substituting an empty one.

Keeping the `Codegen` alive seems unintuitive, as its state is then out of sync. Consuming the `CodeBuffer` is also marginally cheaper.
2024-10-14 01:09:03 +00:00
overlookmotel
7e909a7e6c docs(codegen): fix example for CodeBuffer::print_ascii_bytes (#6535)
Fix example and add a test.
2024-10-14 01:09:02 +00:00
overlookmotel
77f3a1a9dd perf(codegen): check last char with byte methods (#6509)
When checking what last char in buffer is, avoid calculating a `char` when only comparing to an ASCII char (byte) anyway.
2024-10-14 01:09:02 +00:00
overlookmotel
18b68ff90e perf(codegen): optimize CodeBuffer::print_ascii_byte (#6516)
Optimize `CodeBuffer`'s `print_byte_unchecked` and `print_ascii_byte` methods by making a fast path for when the buffer has sufficient capacity to be pushed to without growing.

As discussed in https://github.com/oxc-project/oxc/pull/6148#issuecomment-2381635390
2024-10-14 01:09:01 +00:00
DonIsaac
2b86de9e74 fix(linter/no-control-regex): false negative for flags in template literals (#6531)
Updates regex flag extraction logic to handle no-substitution template literals, allowing cases like this to be correctly reported:
```js
let r = new RegExp('\\u{0}', `u`);
```
2024-10-14 00:59:28 +00:00
no-yan
ecce5c53f8
refactor(linter): improve recursive argument handling and diagnostics creation (#6513)
### Overview
This PR refactors `only-used-in-recursion` codebase to make the
implementation of #5530 easier.

The diff isn't displaying cleanly, so it might be better to review it
commit by commit when looking at the changes.

### Key changes
1. Extracted diagnostic logic into `craete_diagnostic` function:
3bf00152e9359d26dccc75bc7ae9fb03970fc409
2. Removed redundant check in `is_function_maybe_reassigned`:
a133ec63d12562bbcd4030fd5e4e7245380e5ced
3. Simplified `is_argument_only_used_in_recursion` by removing nesting:
6e6bd0495374528ec20458cb95247a8f88b1b260
2024-10-14 08:58:25 +08:00
Don Isaac
111e2d798a
ci: auto-label editor-related PRs (#6532) 2024-10-14 08:57:42 +08:00
Don Isaac
f12571f9a7
chore(repo): add note to bug report template (#6522)
I'm seeing lots of bug reports for oxlint & the VSCode extension that
are not using the "linter bug report" template. This PR adds a notice to
our default bug report template that redirects people to the correct
place.
2024-10-14 08:54:48 +08:00
DonIsaac
685a590030 fix(linter/no-control-regex): better diagnostic messages (#6530)
1. Handle plural/singular cases in message and help text
2. Shrink spans in `RegExp` constructors to only cover the regular expression itself.
2024-10-13 19:34:20 +00:00
DonIsaac
6d5a9f2ee0 fix(linter/no-control-regex): allow capture group references (#6529)
Closes #6525.

Allows `\1`, `\2`, etc. when referencing a capturing group.

Examples of now-allowed patterns:
```js
// both of these have a capture group with an index of 1
const r = /([a-z]+)\1/;
const r = /\1([a-z]+)/;
```

Examples of still-banned patterns:
```js
/([a-z])\0/; //out of range: capture groups are 1-indexed
/([a-z])\2/; // there's only one capture group here
```
2024-10-13 19:34:19 +00:00
DonIsaac
7c200560c7 perf(regex): reduce string allocations in Display impls (#6528)
There's still room for improvement here.
2024-10-13 19:34:18 +00:00
DonIsaac
2c32dac691 refactor(linter/no-control-regex): remove duplicate code (#6527) 2024-10-13 19:29:39 +00:00
overlookmotel
7cc05f1626 fix(data_structures): fix compilation failure on older Rust versions (#6526)
I thought I was being clever, but too clever = stupid.

The dummy code designed to flag when our MSRV is bumped and supports `NonNull::add` would fail to compile on Rust versions below 1.80.0. Precisely because of the condition this code is testing - it's not supported!

Fix this by skipping compilation unless running clippy.
2024-10-13 17:32:10 +00:00