feat(linter/plugins): implement SourceCode#getTokensBefore()#15955
Conversation
There was a problem hiding this comment.
Pull request overview
This PR implements the getTokensBefore() method for the SourceCode API, which retrieves tokens that precede a given node or token. The implementation follows ESLint's token store API and is part of the ongoing effort to provide full ESLint plugin compatibility.
Key changes:
- Implements
getTokensBefore()with support for count, filter, and includeComments options - Uses binary search to efficiently locate tokens before the target node
- Adds comprehensive test coverage matching ESLint's reference test suite
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| apps/oxlint/test/tokens.test.ts | Adds comprehensive test suite for getTokensBefore() with 9 test cases covering various option combinations; reorganizes module-level constants to be shared across test suites |
| apps/oxlint/src-js/plugins/tokens.ts | Implements getTokensBefore() using binary search to find tokens preceding a node, with support for filtering, count limits, and comment inclusion |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
c509f9d to
f28c2ba
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
119fea5 to
a0fdc95
Compare
overlookmotel
left a comment
There was a problem hiding this comment.
I need to go out now, so don't have time to review in full. But don't want to block you, so merging now and I'll take another look another time.
|
Oh damn it, actually I can't merge this because I've screwed it up with #15968. Sorry, I should have merged this before I did my PRs. I'll be back at keyboard tomorrow morning and will try to get both PRs merged then (I'll handle any merge conflicts between them). |
8ce80a8 to
5902f74
Compare
I plan to implement a few more methods by tomorrow, so I did some git fu to prevent conflicts. You could merge them in any sequence. |
b8943f8 to
a9adaa0
Compare
5270ea5 to
86daea6
Compare
# Oxlint ### 💥 BREAKING CHANGES - cbb27fd ast: [**BREAKING**] Add `TSGlobalDeclaration` type (#15712) (overlookmotel) ### 🚀 Features - 72660f7 linter: Support auto generate config document for tuple lint option (#15904) (Duc Nghiem Xuan) - 0c1f82b linter/plugins: Add `tokens` property to `Program` (#16020) (overlookmotel) - 9e61beb linter/plugins: Implement `SourceCode#getFirstToken()` (#16002) (Arsh) - 9a548dd linter/plugins: Implement `SourceCode#getLastTokens()` (#16000) (Arsh) - 0b6cb11 linter/plugins: Implement `SourceCode#getFirstTokens()` (#15976) (Arsh) - 166781e linter/plugins: Implement `SourceCode#getTokenAfter()` (#15973) (Arsh) - 6ae232b linter: Expose type errors via tsgolint (#15917) (camc314) - 2bfdd26 linter/plugins: Implement `SourceCode#getTokensAfter()` (#15971) (Arsh) - 45fffc1 linter/plugins: Implement `SourceCode#getTokenBefore()` (#15956) (Arsh) - 776e473 linter/plugins: Implement `SourceCode#getTokensBefore()` (#15955) (Arsh) - 595867a oxlint: Generate markdownDescription fields for oxlint JSON schema. (#15959) (connorshea) - 5569317 vscode: Add quick actions to status bar tooltip (#15962) (Sysix) - 986cac1 linter/plugins: Token-related `SourceCode` APIs (TS ESLint implementation) (#15861) (Arsh) - a21f9e4 linter: Implement unicorn/prefer-bigint-literals rule (#15923) (Michiel Vrins) - 4b9d8d2 linter/type-aware: Include range with tsconfig diagnostics (#15916) (camc314) - 220d01e editor: Improve the status bar item for the VS Code extension by adding a tooltip. (#15819) (connorshea) ### 🐛 Bug Fixes - 2bd3cb6 apps, editors, napi: Fix `oxlint-disable` comments (#16014) (overlookmotel) - 81f5360 linter/prefer-number-properties: Get fixer to replace entire call expr (#15979) (camc314) - e4ba07f language_server: Always write to memory file system (#15975) (Sysix) - a8a2032 linter: Support missing `range` for internal diagnostics (#15964) (camc314) - 619a226 oxlint/lsp: Don't register `textDocument/formatting` capability (#15882) (Sysix) - 6ab1a20 linter: Fix no_useless_spread producing invalid syntax when removing empty object spreads (#15905) (camc314) - be4b6df linter: Unicorn/prefer-string-replace-all incorrectly escapes backslashes (#15901) (camc314) - 9fa9ef2 linter: Gracefully fail when using import plugin, large file counf and JS plugins (#15864) (camc314) - c027398 linter/plugins: Correct bindings package names glob in TSDown config (#15871) (overlookmotel) - b622ef8 linter: Fix `oxc/bad_array_method_on_arguments` rule behavior. (#15854) (connorshea) - aa06c3f linter: Recognize NewExpression as value context in no-unused-private-class-members (#15843) (camc314) - e89c5ba typescript/prefer-namespace-keyword: Skip nested `TSModuleDeclaration`s (#15806) (overlookmotel) - 646d020 linter/exhaustive-dependencies: Prevent is_callee_of_call_expr flag from leaking into nested expressions (#15832) (camc314) - 46bd6bd linter/plugins: Pin `@typescript-eslint/scope-manager` dependency (#15807) (overlookmotel) - fba31fa linter: Patch `@typescript-eslint/scope manager` (#15214) (Arsh) - 50307c1 linter/jest: Ignore `expect` identifier in argument position (#15785) (camc314) ### ⚡ Performance - 024b48a linter/plugins: Lazy-load tokens parsing code (#16011) (overlookmotel) - 15365c9 linter/plugins: Reduce var assignments (#15953) (overlookmotel) - 84d1f4f linter/plugins: Downgrade some checks to debug-only (#15922) (overlookmotel) - a49f704 linter/typescript: Avoid searching source text unless required (#15805) (overlookmotel) ### 📚 Documentation - ceffa5a linter: Add config option docs for various rules. (#16024) (connorshea) - 9a0ed13 linter: Fix config option docs for eslint/operator-assignment rule. (#16030) (connorshea) - 0b18005 linter: Add config docs generation for rules with Regex arguments (#15978) (connorshea) - 48d18e0 linter: Improve diagnostic message for promise/catch-or-return rule (#15980) (connorshea) - 6c72e84 linter: Use backticks for code elements across more rule diagnostics (#15958) (connorshea) - a63dad7 linter/plugins: Add comment (#15952) (overlookmotel) - 81ea642 vscode: Use markdownDescription for better formatting in VSCode Settings (#15889) (connorshea) - db6a110 linter/plugins: Fix JSDoc comment (#15884) (overlookmotel) - 1487271 linter: Add config option docs for `jsdoc/require-param` and `jsdoc/require-returns` rules (#15857) (connorshea) - fbf0fd4 linter/plugins: Add JSDoc comments to `Plugin` and `Rule` types (#15815) (overlookmotel) - ac5e4b5 linter/plugins: Add JSDoc comments and improve comments (#15814) (overlookmotel) - 9b7b083 linter: Fix error in `curly` `"all"` example (#15801) (camc314) - 65a3520 linter: Improve diagnostic for consistent-type-definitions rule. (#15752) (connorshea) ### 🛡️ Security - f9b9276 deps: Update dependency rolldown to v1.0.0-beta.51 (#15856) (renovate[bot]) # Oxfmt ### 💥 BREAKING CHANGES - a937890 formatter: [**BREAKING**] Default to `lineWidth: 100` (#15933) (leaysgur) - 03d5f5a formatter/sort-imports: [**BREAKING**] Change default order to `natural` with `natord` crate (#15828) (leaysgur) - cbb27fd ast: [**BREAKING**] Add `TSGlobalDeclaration` type (#15712) (overlookmotel) ### 🚀 Features - 7818e22 formatter/sort-imports: Support `options.groups` (#15831) (leaysgur) - f9a502c oxfmt: `oxfmt --lsp` support (#15765) (leaysgur) ### 🐛 Bug Fixes - 4817486 formatter: Revert `FormatElement::BestFitting` printing logic (#16028) (Dunqing) - 5562dd6 formatter: Incorrect formatting method chain with trailing comments (#16027) (Dunqing) - 6d14c8b formatter: Comments in export class decorators are printing incorrectly (#15897) (Dunqing) - 683c764 formatter: Correct a few minor mismatched typescript tests (#15894) (Dunqing) - c11cc07 formatter: Improve formatting for default type on type parameters (#15893) (Dunqing) - 0bff596 formatter: Handle JSX expresssion dangling comment (#15890) (leaysgur) - 16a9dc8 formatter: Inconsistent printing of class extends and interface extends (#15892) (Dunqing) - 300b496 formatter: Inconsistent CallExpression and NewExpression around member chain and logical expression (#15858) (Dunqing) ### ⚡ Performance - 65174cc formatter: Reduce the size of `TextWidth` to 4 byte (#15827) (Dunqing) - 4fe3aac formatter: Use `ArenaVec` and `ArenaBox` (#15420) (Dunqing) Co-authored-by: overlookmotel <[email protected]>
…roject#15955) - Part of oxc-project#14829 (comment). - Follow up to oxc-project#15861.
# Oxlint ### 💥 BREAKING CHANGES - cbb27fd ast: [**BREAKING**] Add `TSGlobalDeclaration` type (oxc-project#15712) (overlookmotel) ### 🚀 Features - 72660f7 linter: Support auto generate config document for tuple lint option (oxc-project#15904) (Duc Nghiem Xuan) - 0c1f82b linter/plugins: Add `tokens` property to `Program` (oxc-project#16020) (overlookmotel) - 9e61beb linter/plugins: Implement `SourceCode#getFirstToken()` (oxc-project#16002) (Arsh) - 9a548dd linter/plugins: Implement `SourceCode#getLastTokens()` (oxc-project#16000) (Arsh) - 0b6cb11 linter/plugins: Implement `SourceCode#getFirstTokens()` (oxc-project#15976) (Arsh) - 166781e linter/plugins: Implement `SourceCode#getTokenAfter()` (oxc-project#15973) (Arsh) - 6ae232b linter: Expose type errors via tsgolint (oxc-project#15917) (camc314) - 2bfdd26 linter/plugins: Implement `SourceCode#getTokensAfter()` (oxc-project#15971) (Arsh) - 45fffc1 linter/plugins: Implement `SourceCode#getTokenBefore()` (oxc-project#15956) (Arsh) - 776e473 linter/plugins: Implement `SourceCode#getTokensBefore()` (oxc-project#15955) (Arsh) - 595867a oxlint: Generate markdownDescription fields for oxlint JSON schema. (oxc-project#15959) (connorshea) - 5569317 vscode: Add quick actions to status bar tooltip (oxc-project#15962) (Sysix) - 986cac1 linter/plugins: Token-related `SourceCode` APIs (TS ESLint implementation) (oxc-project#15861) (Arsh) - a21f9e4 linter: Implement unicorn/prefer-bigint-literals rule (oxc-project#15923) (Michiel Vrins) - 4b9d8d2 linter/type-aware: Include range with tsconfig diagnostics (oxc-project#15916) (camc314) - 220d01e editor: Improve the status bar item for the VS Code extension by adding a tooltip. (oxc-project#15819) (connorshea) ### 🐛 Bug Fixes - 2bd3cb6 apps, editors, napi: Fix `oxlint-disable` comments (oxc-project#16014) (overlookmotel) - 81f5360 linter/prefer-number-properties: Get fixer to replace entire call expr (oxc-project#15979) (camc314) - e4ba07f language_server: Always write to memory file system (oxc-project#15975) (Sysix) - a8a2032 linter: Support missing `range` for internal diagnostics (oxc-project#15964) (camc314) - 619a226 oxlint/lsp: Don't register `textDocument/formatting` capability (oxc-project#15882) (Sysix) - 6ab1a20 linter: Fix no_useless_spread producing invalid syntax when removing empty object spreads (oxc-project#15905) (camc314) - be4b6df linter: Unicorn/prefer-string-replace-all incorrectly escapes backslashes (oxc-project#15901) (camc314) - 9fa9ef2 linter: Gracefully fail when using import plugin, large file counf and JS plugins (oxc-project#15864) (camc314) - c027398 linter/plugins: Correct bindings package names glob in TSDown config (oxc-project#15871) (overlookmotel) - b622ef8 linter: Fix `oxc/bad_array_method_on_arguments` rule behavior. (oxc-project#15854) (connorshea) - aa06c3f linter: Recognize NewExpression as value context in no-unused-private-class-members (oxc-project#15843) (camc314) - e89c5ba typescript/prefer-namespace-keyword: Skip nested `TSModuleDeclaration`s (oxc-project#15806) (overlookmotel) - 646d020 linter/exhaustive-dependencies: Prevent is_callee_of_call_expr flag from leaking into nested expressions (oxc-project#15832) (camc314) - 46bd6bd linter/plugins: Pin `@typescript-eslint/scope-manager` dependency (oxc-project#15807) (overlookmotel) - fba31fa linter: Patch `@typescript-eslint/scope manager` (oxc-project#15214) (Arsh) - 50307c1 linter/jest: Ignore `expect` identifier in argument position (oxc-project#15785) (camc314) ### ⚡ Performance - 024b48a linter/plugins: Lazy-load tokens parsing code (oxc-project#16011) (overlookmotel) - 15365c9 linter/plugins: Reduce var assignments (oxc-project#15953) (overlookmotel) - 84d1f4f linter/plugins: Downgrade some checks to debug-only (oxc-project#15922) (overlookmotel) - a49f704 linter/typescript: Avoid searching source text unless required (oxc-project#15805) (overlookmotel) ### 📚 Documentation - ceffa5a linter: Add config option docs for various rules. (oxc-project#16024) (connorshea) - 9a0ed13 linter: Fix config option docs for eslint/operator-assignment rule. (oxc-project#16030) (connorshea) - 0b18005 linter: Add config docs generation for rules with Regex arguments (oxc-project#15978) (connorshea) - 48d18e0 linter: Improve diagnostic message for promise/catch-or-return rule (oxc-project#15980) (connorshea) - 6c72e84 linter: Use backticks for code elements across more rule diagnostics (oxc-project#15958) (connorshea) - a63dad7 linter/plugins: Add comment (oxc-project#15952) (overlookmotel) - 81ea642 vscode: Use markdownDescription for better formatting in VSCode Settings (oxc-project#15889) (connorshea) - db6a110 linter/plugins: Fix JSDoc comment (oxc-project#15884) (overlookmotel) - 1487271 linter: Add config option docs for `jsdoc/require-param` and `jsdoc/require-returns` rules (oxc-project#15857) (connorshea) - fbf0fd4 linter/plugins: Add JSDoc comments to `Plugin` and `Rule` types (oxc-project#15815) (overlookmotel) - ac5e4b5 linter/plugins: Add JSDoc comments and improve comments (oxc-project#15814) (overlookmotel) - 9b7b083 linter: Fix error in `curly` `"all"` example (oxc-project#15801) (camc314) - 65a3520 linter: Improve diagnostic for consistent-type-definitions rule. (oxc-project#15752) (connorshea) ### 🛡️ Security - f9b9276 deps: Update dependency rolldown to v1.0.0-beta.51 (oxc-project#15856) (renovate[bot]) # Oxfmt ### 💥 BREAKING CHANGES - a937890 formatter: [**BREAKING**] Default to `lineWidth: 100` (oxc-project#15933) (leaysgur) - 03d5f5a formatter/sort-imports: [**BREAKING**] Change default order to `natural` with `natord` crate (oxc-project#15828) (leaysgur) - cbb27fd ast: [**BREAKING**] Add `TSGlobalDeclaration` type (oxc-project#15712) (overlookmotel) ### 🚀 Features - 7818e22 formatter/sort-imports: Support `options.groups` (oxc-project#15831) (leaysgur) - f9a502c oxfmt: `oxfmt --lsp` support (oxc-project#15765) (leaysgur) ### 🐛 Bug Fixes - 4817486 formatter: Revert `FormatElement::BestFitting` printing logic (oxc-project#16028) (Dunqing) - 5562dd6 formatter: Incorrect formatting method chain with trailing comments (oxc-project#16027) (Dunqing) - 6d14c8b formatter: Comments in export class decorators are printing incorrectly (oxc-project#15897) (Dunqing) - 683c764 formatter: Correct a few minor mismatched typescript tests (oxc-project#15894) (Dunqing) - c11cc07 formatter: Improve formatting for default type on type parameters (oxc-project#15893) (Dunqing) - 0bff596 formatter: Handle JSX expresssion dangling comment (oxc-project#15890) (leaysgur) - 16a9dc8 formatter: Inconsistent printing of class extends and interface extends (oxc-project#15892) (Dunqing) - 300b496 formatter: Inconsistent CallExpression and NewExpression around member chain and logical expression (oxc-project#15858) (Dunqing) ### ⚡ Performance - 65174cc formatter: Reduce the size of `TextWidth` to 4 byte (oxc-project#15827) (Dunqing) - 4fe3aac formatter: Use `ArenaVec` and `ArenaBox` (oxc-project#15420) (Dunqing) Co-authored-by: overlookmotel <[email protected]>
SourceCodeAPIs #14829 (comment).SourceCodeAPIs (TS ESLint implementation) #15861.