[ty] Allow overriding rules for specific files (#18648)
Some checks are pending
CI / Determine changes (push) Waiting to run
CI / cargo fmt (push) Waiting to run
CI / cargo clippy (push) Blocked by required conditions
CI / cargo test (linux) (push) Blocked by required conditions
CI / cargo test (linux, release) (push) Blocked by required conditions
CI / cargo test (windows) (push) Blocked by required conditions
CI / cargo test (wasm) (push) Blocked by required conditions
CI / cargo build (release) (push) Waiting to run
CI / cargo build (msrv) (push) Blocked by required conditions
CI / cargo fuzz build (push) Blocked by required conditions
CI / fuzz parser (push) Blocked by required conditions
CI / test scripts (push) Blocked by required conditions
CI / ecosystem (push) Blocked by required conditions
CI / Fuzz for new ty panics (push) Blocked by required conditions
CI / cargo shear (push) Blocked by required conditions
CI / python package (push) Waiting to run
CI / pre-commit (push) Waiting to run
CI / mkdocs (push) Waiting to run
CI / formatter instabilities and black similarity (push) Blocked by required conditions
CI / test ruff-lsp (push) Blocked by required conditions
CI / check playground (push) Blocked by required conditions
CI / benchmarks (push) Blocked by required conditions
[ty Playground] Release / publish (push) Waiting to run

This commit is contained in:
Micha Reiser 2025-06-15 15:27:39 +02:00 committed by GitHub
parent 782363b736
commit 3a430fa6da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
31 changed files with 1945 additions and 312 deletions

View file

@ -7,7 +7,8 @@ use ruff_db::{Db as SourceDb, Upcast};
pub trait Db: SourceDb + Upcast<dyn SourceDb> {
fn is_file_open(&self, file: File) -> bool;
fn rule_selection(&self) -> &RuleSelection;
/// Resolves the rule selection for a given file.
fn rule_selection(&self, file: File) -> &RuleSelection;
fn lint_registry(&self) -> &LintRegistry;
}
@ -126,7 +127,7 @@ pub(crate) mod tests {
!file.path(self).is_vendored_path()
}
fn rule_selection(&self) -> &RuleSelection {
fn rule_selection(&self, _file: File) -> &RuleSelection {
&self.rule_selection
}

View file

@ -32,7 +32,7 @@ pub struct LintMetadata {
pub line: u32,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),

View file

@ -1,10 +1,12 @@
use std::fmt::{Display, Formatter};
use ruff_macros::RustDoc;
/// The target platform to assume when resolving types.
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
derive(serde::Serialize, serde::Deserialize, RustDoc),
serde(rename_all = "kebab-case")
)]
pub enum PythonPlatform {
@ -57,6 +59,7 @@ impl Default for PythonPlatform {
#[cfg(feature = "schemars")]
mod schema {
use crate::PythonPlatform;
use ruff_db::RustDoc;
use schemars::_serde_json::Value;
use schemars::JsonSchema;
use schemars::r#gen::SchemaGenerator;
@ -121,6 +124,10 @@ mod schema {
..SubschemaValidation::default()
})),
metadata: Some(Box::new(Metadata {
description: Some(<PythonPlatform as RustDoc>::rust_doc().to_string()),
..Metadata::default()
})),
..SchemaObject::default()
})

View file

@ -290,7 +290,10 @@ impl<'a> CheckSuppressionsContext<'a> {
}
fn is_lint_disabled(&self, lint: &'static LintMetadata) -> bool {
!self.db.rule_selection().is_enabled(LintId::of(lint))
!self
.db
.rule_selection(self.file)
.is_enabled(LintId::of(lint))
}
fn report_lint(
@ -315,7 +318,7 @@ impl<'a> CheckSuppressionsContext<'a> {
range: TextRange,
message: fmt::Arguments,
) {
let Some(severity) = self.db.rule_selection().severity(LintId::of(lint)) else {
let Some(severity) = self.db.rule_selection(self.file).severity(LintId::of(lint)) else {
return;
};

View file

@ -401,7 +401,7 @@ impl<'db, 'ctx> LintDiagnosticGuardBuilder<'db, 'ctx> {
let lint_id = LintId::of(lint);
// Skip over diagnostics if the rule
// is disabled.
let (severity, source) = ctx.db.rule_selection().get(lint_id)?;
let (severity, source) = ctx.db.rule_selection(ctx.file).get(lint_id)?;
// If we're not in type checking mode,
// we can bail now.
if ctx.is_in_no_type_check() {