Skip to content

Commit 20e884e

Browse files
committed
refactor(linter): store LintService in LintRunner (#14471)
The language server is storing `LintService`, `LintRunner` can store it too, and can avoid one cloning of the store.
1 parent 31766fd commit 20e884e

File tree

2 files changed

+28
-47
lines changed

2 files changed

+28
-47
lines changed

apps/oxlint/src/lint.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ impl CliRunner {
311311
.collect::<Vec<Arc<OsStr>>>();
312312

313313
let has_external_linter = external_linter.is_some();
314-
let linter = Linter::new(LintOptions::default(), config_store.clone(), external_linter)
314+
let linter = Linter::new(LintOptions::default(), config_store, external_linter)
315315
.with_fix(fix_options.fix_kind())
316316
.with_report_unused_directives(report_unused_directives);
317317

@@ -340,8 +340,7 @@ impl CliRunner {
340340

341341
// Create the LintRunner
342342
// TODO: Add a warning message if `tsgolint` cannot be found, but type-aware rules are enabled
343-
let lint_runner = match LintRunner::builder(options, config_store)
344-
.with_linter(linter)
343+
let lint_runner = match LintRunner::builder(options, linter)
345344
.with_type_aware(self.options.type_aware)
346345
.with_silent(misc_options.silent)
347346
.build()

crates/oxc_linter/src/lint_runner.rs

Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,20 @@ use oxc_diagnostics::{DiagnosticSender, DiagnosticService};
1010
use oxc_span::Span;
1111

1212
use crate::{
13-
AllowWarnDeny, ConfigStore, DisableDirectives, LintService, LintServiceOptions, Linter,
14-
TsGoLintState,
13+
AllowWarnDeny, DisableDirectives, LintService, LintServiceOptions, Linter, TsGoLintState,
1514
};
1615

1716
/// Unified runner that orchestrates both regular (oxc) and type-aware (tsgolint) linting
1817
/// with centralized disable directives handling.
1918
pub struct LintRunner {
2019
/// Regular oxc linter
21-
regular_linter: Option<Linter>,
20+
lint_service: LintService,
2221
/// Type-aware tsgolint
2322
type_aware_linter: Option<TsGoLintState>,
2423
/// Shared disable directives coordinator
2524
directives_store: DirectivesStore,
26-
/// Lint service options
27-
lint_service_options: LintServiceOptions,
25+
/// Current working directory
26+
cwd: PathBuf,
2827
}
2928

3029
/// Manages disable directives across all linting engines.
@@ -126,30 +125,22 @@ impl Default for DirectivesStore {
126125

127126
/// Builder for LintRunner
128127
pub struct LintRunnerBuilder {
129-
regular_linter: Option<Linter>,
128+
regular_linter: Linter,
130129
type_aware_enabled: bool,
131-
config_store: ConfigStore,
132130
lint_service_options: LintServiceOptions,
133131
silent: bool,
134132
}
135133

136134
impl LintRunnerBuilder {
137-
pub fn new(lint_service_options: LintServiceOptions, config_store: ConfigStore) -> Self {
135+
pub fn new(lint_service_options: LintServiceOptions, linter: Linter) -> Self {
138136
Self {
139-
regular_linter: None,
137+
regular_linter: linter,
140138
type_aware_enabled: false,
141-
config_store,
142139
lint_service_options,
143140
silent: false,
144141
}
145142
}
146143

147-
#[must_use]
148-
pub fn with_linter(mut self, linter: Linter) -> Self {
149-
self.regular_linter = Some(linter);
150-
self
151-
}
152-
153144
#[must_use]
154145
pub fn with_type_aware(mut self, enabled: bool) -> Self {
155146
self.type_aware_enabled = enabled;
@@ -168,31 +159,34 @@ impl LintRunnerBuilder {
168159
let directives_coordinator = DirectivesStore::new();
169160

170161
let type_aware_linter = if self.type_aware_enabled {
171-
match TsGoLintState::try_new(self.lint_service_options.cwd(), self.config_store.clone())
172-
{
162+
match TsGoLintState::try_new(
163+
self.lint_service_options.cwd(),
164+
self.regular_linter.config.clone(),
165+
) {
173166
Ok(state) => Some(state.with_silent(self.silent)),
174167
Err(e) => return Err(e),
175168
}
176169
} else {
177170
None
178171
};
179172

173+
let cwd = self.lint_service_options.cwd().to_path_buf();
174+
let mut lint_service = LintService::new(self.regular_linter, self.lint_service_options);
175+
lint_service.set_disable_directives_map(directives_coordinator.map());
176+
180177
Ok(LintRunner {
181-
regular_linter: self.regular_linter,
178+
lint_service,
182179
type_aware_linter,
183180
directives_store: directives_coordinator,
184-
lint_service_options: self.lint_service_options,
181+
cwd,
185182
})
186183
}
187184
}
188185

189186
impl LintRunner {
190187
/// Create a new builder for LintRunner
191-
pub fn builder(
192-
lint_service_options: LintServiceOptions,
193-
config_store: ConfigStore,
194-
) -> LintRunnerBuilder {
195-
LintRunnerBuilder::new(lint_service_options, config_store)
188+
pub fn builder(lint_service_options: LintServiceOptions, linter: Linter) -> LintRunnerBuilder {
189+
LintRunnerBuilder::new(lint_service_options, linter)
196190
}
197191

198192
/// Run both regular and type-aware linting on files
@@ -205,23 +199,15 @@ impl LintRunner {
205199
file_system: Option<Box<dyn crate::RuntimeFileSystem + Sync + Send>>,
206200
) -> Result<Self, String> {
207201
// Phase 1: Regular linting (collects disable directives)
208-
if let Some(linter) = self.regular_linter.take() {
209-
let files = files.to_owned();
210-
let directives_map = self.directives_store.map();
211-
let lint_service_options = self.lint_service_options.clone();
212-
213-
let mut lint_service = LintService::new(linter, lint_service_options);
214-
lint_service.with_paths(files);
215-
lint_service.set_disable_directives_map(directives_map);
216-
217-
// Set custom file system if provided
218-
if let Some(fs) = file_system {
219-
lint_service.with_file_system(fs);
220-
}
202+
self.lint_service.with_paths(files.to_owned());
221203

222-
lint_service.run(&tx_error);
204+
// Set custom file system if provided
205+
if let Some(fs) = file_system {
206+
self.lint_service.with_file_system(fs);
223207
}
224208

209+
self.lint_service.run(&tx_error);
210+
225211
if let Some(type_aware_linter) = self.type_aware_linter.take() {
226212
type_aware_linter.lint(files, self.directives_store.map(), tx_error)?;
227213
} else {
@@ -238,11 +224,7 @@ impl LintRunner {
238224
tx_error: &DiagnosticSender,
239225
) {
240226
if let Some(severity) = severity {
241-
self.directives_store.report_unused(
242-
severity,
243-
self.lint_service_options.cwd(),
244-
tx_error,
245-
);
227+
self.directives_store.report_unused(severity, &self.cwd, tx_error);
246228
}
247229
}
248230

0 commit comments

Comments
 (0)