Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion apps/oxlint/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")))]
Expand Down
15 changes: 9 additions & 6 deletions crates/oxc_linter/src/external_linter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ pub type ExternalLinterLoadPluginCb = Arc<
+ 'static,
>;

pub type ExternalLinterCb = Arc<
pub type ExternalLinterLintFileCb = Arc<
dyn Fn(
String,
Vec<u32>,
&Allocator,
) -> Result<Vec<LintResult>, Box<dyn std::error::Error + Send + Sync>>
) -> Result<Vec<LintFileResult>, Box<dyn std::error::Error + Send + Sync>>
+ Sync
+ Send,
>;
Expand All @@ -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,
Expand All @@ -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 }
}
}

Expand Down
5 changes: 3 additions & 2 deletions crates/oxc_linter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
8 changes: 4 additions & 4 deletions napi/oxlint2/src-js/bindings.d.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/* auto-generated by NAPI-RS */
/* eslint-disable */
export type JsLintFileCb =
((arg0: string, arg1: number, arg2: Uint8Array | undefined | null, arg3: Array<number>) => string)

export type JsLoadPluginCb =
((arg: string) => Promise<string>)

export type JsRunCb =
((arg0: string, arg1: number, arg2: Uint8Array | undefined | null, arg3: Array<number>) => string)

export declare function lint(loadPlugin: JsLoadPluginCb, run: JsRunCb): Promise<boolean>
export declare function lint(loadPlugin: JsLoadPluginCb, lintFile: JsLintFileCb): Promise<boolean>
19 changes: 10 additions & 9 deletions napi/oxlint2/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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<Uint8Array>, Vec<u32>),
String, /* Vec<LintResult> */
String, /* Vec<LintFileResult> */
(String, u32, Option<Uint8Array>, Vec<u32>),
Status,
false,
Expand All @@ -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<u32>, allocator: &Allocator| {
let cb = Arc::clone(&cb);
Expand Down Expand Up @@ -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::<Vec<LintResult>>(r) {
Ok(r) => match serde_json::from_str::<Vec<LintFileResult>>(r) {
Ok(v) => tx.send(Ok(v)),
Err(_e) => tx.send(Err("Failed to deserialize lint result".to_string())),
},
Expand Down Expand Up @@ -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
}
Loading