Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Sep 4, 2025

Implement support for disable directives (like // oxlint-disable-next-line) for custom plugin rules.

The full name of the rule (including plugin name) is required in the disable comment e.g.:

// oxlint-disable-next-line my-plugin/my-rule

@graphite-app
Copy link
Contributor

graphite-app bot commented Sep 4, 2025

How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

Copilot AI changed the title [WIP] write a test, testing disable directives inside oxlint2 to verify that // oxlint-disable-next-line works for custom JS plugins Fix disable directives for custom plugin rules in oxlint2 Sep 4, 2025
Copilot AI requested a review from camc314 September 4, 2025 06:28
Copilot finished work on behalf of camc314 September 4, 2025 06:28
@camc314 camc314 changed the title Fix disable directives for custom plugin rules in oxlint2 fix(linter/custom-plugins): make disable directives work Sep 8, 2025
@github-actions github-actions bot added A-linter Area - Linter C-bug Category - Bug labels Sep 8, 2025
Copy link
Contributor

@camc314 camc314 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot rebase on main, and action the review comments

Copy link
Contributor Author

Copilot AI commented Sep 8, 2025

@copilot rebase on main, and action the review comments

Completed both tasks. Rebased on main and addressed all review comments in commit 9fa3b80.

@overlookmotel
Copy link
Member

Should we require plugin name in the disable comment as well as rule name? i.e.:

// oxlint-disable-next-line my-plugin/no-var

not

// oxlint-disable-next-line no-var

Multiple plugins can have rules with same name. They could also have rules with same name as a built-in rule.

Copilot AI requested a review from camc314 September 8, 2025 04:42
Copilot finished work on behalf of camc314 September 8, 2025 04:42
Copilot AI and others added 3 commits September 8, 2025 12:43
Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
@camc314 camc314 force-pushed the copilot/fix-dc33cecc-aec7-48f9-8b4a-bda7e1653278 branch from 9fa3b80 to 223faac Compare September 8, 2025 04:43
@camc314
Copy link
Contributor

camc314 commented Sep 8, 2025

Should we require plugin name in the disable comment as well as rule name? i.e.:

yes, will fix

@codspeed-hq
Copy link

codspeed-hq bot commented Sep 8, 2025

CodSpeed Instrumentation Performance Report

Merging #13538 will not alter performance

Comparing copilot/fix-dc33cecc-aec7-48f9-8b4a-bda7e1653278 (88dd33c) with main (f6a9687)

Summary

✅ 37 untouched benchmarks

@camc314 camc314 marked this pull request as ready for review September 8, 2025 04:59
Copilot AI review requested due to automatic review settings September 8, 2025 04:59
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes disable directives to work properly with custom plugin rules by adding logic to check for disable directives before reporting diagnostics from external plugins.

  • Added disable directive checking for custom plugin rules in the linter core
  • Created comprehensive test fixtures with a custom plugin and various disable directive scenarios
  • Added end-to-end test to verify disable directives work correctly for custom plugins

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.

Show a summary per file
File Description
crates/oxc_linter/src/lib.rs Added disable directive checking logic for external plugin rules
napi/oxlint2/test/fixtures/custom_plugin_disable_directives/test_plugin/index.js Custom plugin implementing no-var rule for testing
napi/oxlint2/test/fixtures/custom_plugin_disable_directives/index.js Test file with various disable directive scenarios
napi/oxlint2/test/fixtures/custom_plugin_disable_directives/.oxlintrc.json Configuration file enabling custom plugin and rules
napi/oxlint2/test/e2e.test.ts End-to-end test for disable directive functionality
napi/oxlint2/test/snapshots/e2e.test.ts.snap Expected test output snapshot

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@camc314
Copy link
Contributor

camc314 commented Sep 8, 2025

@overlookmotel mind reviewing + merging? Thanks!

@overlookmotel
Copy link
Member

@copilot Please re-write the PR description to be a description of the PR as a whole, not just the last set of changes.

Copy link
Contributor Author

Copilot AI commented Sep 8, 2025

Should we require plugin name in the disable comment as well as rule name? i.e.:

...

Done! Changed the implementation to use exact matching instead of substring matching to enforce the requirement for plugin rules to include the full plugin/rule format in disable directives. Commit 64cd060.

@copilot Please re-write the PR description to be a description of the PR as a whole, not just the last set of changes.

Updated the PR description to provide a comprehensive overview of the entire PR, including the disable directive implementation, exact matching enforcement, and test coverage. Commit 64cd060.

Copilot AI changed the title fix(linter/custom-plugins): make disable directives work fix(linter/custom-plugins): enforce exact matching for disable directives Sep 8, 2025
Copilot finished work on behalf of overlookmotel September 8, 2025 05:22
@overlookmotel overlookmotel force-pushed the copilot/fix-dc33cecc-aec7-48f9-8b4a-bda7e1653278 branch from 64cd060 to 88dd33c Compare September 8, 2025 05:24
@overlookmotel overlookmotel merged commit 89084d7 into main Sep 8, 2025
52 checks passed
@overlookmotel overlookmotel deleted the copilot/fix-dc33cecc-aec7-48f9-8b4a-bda7e1653278 branch September 8, 2025 05:30
camc314 added a commit that referenced this pull request Sep 11, 2025
## [1.15.0] - 2025-09-11

### 💥 BREAKING CHANGES

- edc70ea allocator/pool: [**BREAKING**] Remove `disable_fixed_size`
Cargo feature (#13625) (overlookmotel)

### 🚀 Features

- b20b56d linter: Add `vue/no-multiple-slot-args` rule (#13579) (Sysix)
- aafe08c linter: Add `vue/define-emits-declaration` rule (#13567)
(Sysix)
- 2ed5059 linter: Add `vue/define-props-declaration` rule (#13566)
(Sysix)
- a718c23 linter: Add `vue/valid-define-props` rule (#13565) (Sysix)
- 75a673e editor: Support relative path for `oxc.path.server` (#13542)
(Sysix)
- 4af886b linter: Add `unicorn/no-array-reverse` rule (#13530) (yefan)
- 2db32eb data_structures: Add `boxed_slice!` and `boxed_array!` macros
(#13596) (overlookmotel)

### 🐛 Bug Fixes

- fb9d0f4 language_server: Don't resend diagnostic on save, when
`typeAware` is disabled and run is onType (#13604) (YongSeok Jang (장용석))
- 2f36350 editor: Add notice for a possible restart when fixing
`filename-case` (#13557) (Sysix)
- e17fccc linter: Update `RuleRunner` impl after merge (#13642)
(camc314)
- 3d27c5b linter/no-unused-private-class-members: False positive with
spread expr (#13634) (yefan)
- 8314ed5 linter/tsgolint: Correct comment (#13589) (camc314)
- 198243b semantic: Dont parse `@` as jsdoc tags inside quotes (#13571)
(Gwenn Le Bihan)
- 89084d7 linter/custom-plugins: Enforce exact matching for disable
directives (#13538) (Copilot)
- 277c5e1 linter: Output `eslint-plugin-vue` for vue diagnostics
(#13564) (Sysix)
- 34d3cde rust: Fix clippy issues (#13540) (Boshen)
- 5fccafc linter: `unicorn/prefer-array-flat-map` ignore
`React.Children` (#13534) (Sysix)
- 7e78e39 linter: Don't panic when parsing regex with multiple
parentheses (#13524) (Sysix)
- 0d867b1 linter: Skip running tsgolint when no files need type aware
linting (#13502) (Copilot)
- b677376 language_server: Include the diagnostic of the other linter
(#13490) (Sysix)
- e87d7bd linter: Parse regex inside `new RegExp()` with parentheses
(#13448) (Sysix)
- 5990f17 linter: Change `typescript/no-confusing-void-expression` to
pedantic (#13473) (Boshen)

### 🚜 Refactor

- 7775c21 linter/plugins: Remove `oxlint2` Cargo feature (#13648)
(overlookmotel)
- 8f37e88 linter: Update tsgolint payload (#13547) (camchenry)
- 2d53203 linter/plugins: Move `tokio` usage from `oxc_linter` to
`napi/oxlint2` (#13647) (overlookmotel)
- 6cd6be2 linter: Add `--experimental-js-plugins` CLI arg (#13658)
(overlookmotel)
- 476729b linter: Simplify `RuleRunner` trait definition (#13637)
(camchenry)
- 2f02ac6 linter/plugins: Remove `disable_oxlint2` Cargo feature
(#13626) (overlookmotel)
- ff9e4fb linter/plugins: Use fixed-size allocators when
`ExternalLinter` exists (#13623) (overlookmotel)
- f9bff64 linter_codegen: Improve code style for collecting nodes
(#13636) (camchenry)
- babbaca all: Remove `pub` from modules with no exports (#13618)
(overlookmotel)
- 91759c6 linter/plugins: Only use `RawTransferFileSystem` if JS plugins
registered (#13599) (overlookmotel)
- 118020c linter/plugins: Discard `ExternalLinter` if no JS plugins
registered (#13598) (overlookmotel)
- 8d30bce linter/tsgolint: Report an error if the tsgolint exe could not
be found (#13590) (camc314)
- bccc276 eslint/for-direction: Clean up implementation and improve
documentation (#13532) (Antoine Zanardi)
- 1425da2 eslint/default-case-last: Simplify default case last check in
switch statement (#13529) (Antoine Zanardi)
- d245376 oxlint: Remove unused `runner` module (#13561) (camc314)
- 53f2fc1 eslint/default-case: Simplify implementation and enhance
readability (#13430) (Antoine Zanardi)
- 6f15060 eslint/block-scoped-var: Clean up implementation and improve
documentation (#13417) (Antoine Zanardi)
- 671e0fd language_server: Only store one instance of a diagnostic
(#13514) (Sysix)
- 1b425d6 eslint/default-case-last: Simplify implementation and enhance
readability (#13515) (Antoine Zanardi)
- e4bbbce eslint/default-param-last: Simplify implementation and enhance
readability (#13516) (Antoine Zanardi)
- e0396fd linter: Remove `static` lifetime from disable directives
function argument (#13492) (camc314)

### 📚 Documentation

- eb1f167 linter: Note which rules require type info to run on rule page
(#13675) (camc314)
- e66f93b linter: Fix backtick formatting in no-return-wrap (#13633)
(camc314)

### ⚡ Performance

- e6a25e7 linter: Remove unnecessary `should_run` check (#13639)
(camchenry)
- f6a9687 linter: Store rules by AST type in a boxed array (#13578)
(overlookmotel)
- b81f081 linter: Reduce indirection (#13574) (overlookmotel)
- a744aff linter: Skip rules that do not have any relevant node types
(#13138) (camchenry)

### 🎨 Styling

- e110476 linter: Reformat code (#13573) (overlookmotel)

### 🧪 Testing

- 58e6c94 oxlint: Add test for ignorePatterns whitelist (#13372) (Sysix)

Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-linter Area - Linter C-bug Category - Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants