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.
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.
Make `ImportKind` private implementation detail of `ModuleImports` common transform. Provide `add_default_import` and `add_named_import` methods instead.
Follow-on after #6434.
Store `BoundIdentifier` in `ImportKind`, rather than storing `name` and `symbol_id` separately. Pure refactor - just allows shortening some code.
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.
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`);
```
### 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
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.
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
```
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.
- closes#6459
Currently, the `unicorn/filename-case` doesn't match the behavior of the original rule. There are several issues which this PR fixes:
- The defaults cases were incorrect: only kebab case should be enabled by default, according to the original rule docs.
- Setting a single case or multiple cases did not remove the default cases as it should.
- Leading/trailing underscores were not ignored by default.
- We did not provide a clear diagnostic message indicating which cases are allowed.
- We did not try to parse out multiple file parts (separated by `.`).
- TODO: We should also support multiple file part checking (which the original rule supports via a config option), for file names such as `someTest.fileName.js`
I have also added many of the original test cases to ensure we are more closely compatible.
This also improves the performance of just running the `unicorn/filename-case` alone by 4% (20ms total) on the `vscode` codebase:
```
Benchmark 1: ./oxlint-main -A all -W unicorn/filename-case --silent vscode
Time (mean ± σ): 489.4 ms ± 24.0 ms [User: 2623.8 ms, System: 447.2 ms]
Range (min … max): 474.7 ms … 622.9 ms 100 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: ./oxlint-new-filename-case -A all -W unicorn/filename-case --silent vscode
Time (mean ± σ): 470.8 ms ± 22.9 ms [User: 2478.8 ms, System: 463.5 ms]
Range (min … max): 455.6 ms … 599.3 ms 100 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.
Summary
./oxlint-new-filename-case -A all -W unicorn/filename-case --silent vscode ran
1.04 ± 0.07 times faster than ./oxlint-main -A all -W unicorn/filename-case --silent vscode
```
Perplexingly, it seems like it might actually be even faster on the `vscode` repository, saving ~5% (70ms) with the default ruleset enabled as well. Maybe my laptop was just running a bit faster.
```
Benchmark 1: ./oxlint-main -W unicorn/filename-case --silent vscode
Time (mean ± σ): 1.402 s ± 0.096 s [User: 8.863 s, System: 0.505 s]
Range (min … max): 1.318 s … 1.920 s 100 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: ./oxlint-new-filename-case -W unicorn/filename-case --silent vscode
Time (mean ± σ): 1.339 s ± 0.042 s [User: 8.582 s, System: 0.511 s]
Range (min … max): 1.266 s … 1.506 s 100 runs
Summary
./oxlint-new-filename-case -W unicorn/filename-case --silent vscode ran
1.05 ± 0.08 times faster than ./oxlint-main -W unicorn/filename-case --silent vscode
```
Profiling showed that this rule was one of the slower ones, partially due to the fact that it was constantly calling `ctx.nodes()` and `ctx.nodes().parent_node()`. I've tried to fix this by reordering the logic so that we only fetch the parent nodes right before we need it. If we can early return, such as the identifier name not being `innerText`, or the node kind not being right, then we can skip fetching the parent.
Before:
<img width="1147" alt="Screenshot 2024-10-12 at 3 05 05 AM" src="https://github.com/user-attachments/assets/4a551b04-370f-4ed9-b0d5-99d58b03235b">
After (-0.4% reduction in number of samples spent in this rule):
<img width="1146" alt="image" src="https://github.com/user-attachments/assets/340edc36-55cc-4bf4-aa8e-9a600848b798">