diff --git a/apps/oxlint/src/lib.rs b/apps/oxlint/src/lib.rs index b19f8e9f5b897..c021b856c6772 100644 --- a/apps/oxlint/src/lib.rs +++ b/apps/oxlint/src/lib.rs @@ -10,7 +10,8 @@ pub mod cli { } pub use oxc_linter::{ - ExternalLinter, ExternalLinterCb, ExternalLinterLoadPluginCb, LintResult, PluginLoadResult, + ExternalLinter, ExternalLinterLintFileCb, ExternalLinterLoadPluginCb, LintFileResult, + PluginLoadResult, }; #[cfg(all(feature = "oxlint2", not(feature = "disable_oxlint2")))] diff --git a/crates/oxc_linter/src/external_linter.rs b/crates/oxc_linter/src/external_linter.rs index 9c12848385016..d5c419f8ba1ef 100644 --- a/crates/oxc_linter/src/external_linter.rs +++ b/crates/oxc_linter/src/external_linter.rs @@ -18,12 +18,12 @@ pub type ExternalLinterLoadPluginCb = Arc< + 'static, >; -pub type ExternalLinterCb = Arc< +pub type ExternalLinterLintFileCb = Arc< dyn Fn( String, Vec, &Allocator, - ) -> Result, Box> + ) -> Result, Box> + Sync + Send, >; @@ -41,7 +41,7 @@ pub enum PluginLoadResult { #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] -pub struct LintResult { +pub struct LintFileResult { pub rule_index: u32, pub message: String, pub loc: Loc, @@ -57,12 +57,15 @@ pub struct Loc { #[cfg_attr(not(all(feature = "oxlint2", not(feature = "disable_oxlint2"))), expect(dead_code))] pub struct ExternalLinter { pub(crate) load_plugin: ExternalLinterLoadPluginCb, - pub(crate) run: ExternalLinterCb, + pub(crate) lint_file: ExternalLinterLintFileCb, } impl ExternalLinter { - pub fn new(load_plugin: ExternalLinterLoadPluginCb, run: ExternalLinterCb) -> Self { - Self { load_plugin, run } + pub fn new( + load_plugin: ExternalLinterLoadPluginCb, + lint_file: ExternalLinterLintFileCb, + ) -> Self { + Self { load_plugin, lint_file } } } diff --git a/crates/oxc_linter/src/lib.rs b/crates/oxc_linter/src/lib.rs index 2f9344d1ac07e..427abf5c7286d 100644 --- a/crates/oxc_linter/src/lib.rs +++ b/crates/oxc_linter/src/lib.rs @@ -45,7 +45,8 @@ pub use crate::{ }, context::LintContext, external_linter::{ - ExternalLinter, ExternalLinterCb, ExternalLinterLoadPluginCb, LintResult, PluginLoadResult, + ExternalLinter, ExternalLinterLintFileCb, ExternalLinterLoadPluginCb, LintFileResult, + PluginLoadResult, }, external_plugin_store::{ExternalPluginStore, ExternalRuleId}, fixer::FixKind, @@ -258,7 +259,7 @@ impl Linter { unsafe { metadata_ptr.write(metadata) }; // Pass AST and rule IDs to JS - let result = (external_linter.run)( + let result = (external_linter.lint_file)( path.to_str().unwrap().to_string(), external_rules.iter().map(|(rule_id, _)| rule_id.raw()).collect(), allocator, diff --git a/napi/oxlint2/src-js/bindings.d.ts b/napi/oxlint2/src-js/bindings.d.ts index 4f28ad077e43b..e4326c134a2a2 100644 --- a/napi/oxlint2/src-js/bindings.d.ts +++ b/napi/oxlint2/src-js/bindings.d.ts @@ -1,9 +1,9 @@ /* auto-generated by NAPI-RS */ /* eslint-disable */ +export type JsLintFileCb = + ((arg0: string, arg1: number, arg2: Uint8Array | undefined | null, arg3: Array) => string) + export type JsLoadPluginCb = ((arg: string) => Promise) -export type JsRunCb = - ((arg0: string, arg1: number, arg2: Uint8Array | undefined | null, arg3: Array) => string) - -export declare function lint(loadPlugin: JsLoadPluginCb, run: JsRunCb): Promise +export declare function lint(loadPlugin: JsLoadPluginCb, lintFile: JsLintFileCb): Promise diff --git a/napi/oxlint2/src/lib.rs b/napi/oxlint2/src/lib.rs index 77a7b9cbb09b6..d24d9ff127602 100644 --- a/napi/oxlint2/src/lib.rs +++ b/napi/oxlint2/src/lib.rs @@ -12,8 +12,8 @@ use napi_derive::napi; use oxc_allocator::{Allocator, free_fixed_size_allocator}; use oxlint::{ - ExternalLinter, ExternalLinterCb, ExternalLinterLoadPluginCb, LintResult, PluginLoadResult, - lint as oxlint_lint, + ExternalLinter, ExternalLinterLintFileCb, ExternalLinterLoadPluginCb, LintFileResult, + PluginLoadResult, lint as oxlint_lint, }; mod generated { @@ -22,9 +22,9 @@ mod generated { use generated::raw_transfer_constants::{BLOCK_ALIGN, BUFFER_SIZE}; #[napi] -pub type JsRunCb = ThreadsafeFunction< +pub type JsLintFileCb = ThreadsafeFunction< (String, u32, Option, Vec), - String, /* Vec */ + String, /* Vec */ (String, u32, Option, Vec), Status, false, @@ -39,7 +39,7 @@ pub type JsLoadPluginCb = ThreadsafeFunction< false, >; -fn wrap_run(cb: JsRunCb) -> ExternalLinterCb { +fn wrap_lint_file(cb: JsLintFileCb) -> ExternalLinterLintFileCb { let cb = Arc::new(cb); Arc::new(move |file_path: String, rule_ids: Vec, allocator: &Allocator| { let cb = Arc::clone(&cb); @@ -117,7 +117,7 @@ fn wrap_run(cb: JsRunCb) -> ExternalLinterCb { ThreadsafeFunctionCallMode::NonBlocking, move |result, _env| { let _ = match &result { - Ok(r) => match serde_json::from_str::>(r) { + Ok(r) => match serde_json::from_str::>(r) { Ok(v) => tx.send(Ok(v)), Err(_e) => tx.send(Err("Failed to deserialize lint result".to_string())), }, @@ -157,9 +157,10 @@ fn wrap_load_plugin(cb: JsLoadPluginCb) -> ExternalLinterLoadPluginCb { #[expect(clippy::allow_attributes)] #[allow(clippy::trailing_empty_array, clippy::unused_async)] // https://github.com/napi-rs/napi-rs/issues/2758 #[napi] -pub async fn lint(load_plugin: JsLoadPluginCb, run: JsRunCb) -> bool { +pub async fn lint(load_plugin: JsLoadPluginCb, lint_file: JsLintFileCb) -> bool { let rust_load_plugin = wrap_load_plugin(load_plugin); - let rust_run = wrap_run(run); + let rust_lint_file = wrap_lint_file(lint_file); - oxlint_lint(Some(ExternalLinter::new(rust_load_plugin, rust_run))).report() == ExitCode::SUCCESS + oxlint_lint(Some(ExternalLinter::new(rust_load_plugin, rust_lint_file))).report() + == ExitCode::SUCCESS }