fix(linter): fix github endColumn output (#8647)

added `start` and `end` for `Info`, so every reporter can use both if
they want.
Then end calculation is a bit hacky, but i looks like it works.
This commit is contained in:
Alexander S. 2025-01-22 02:10:40 +01:00 committed by GitHub
parent dc912fa58e
commit 40316afa7e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 37 additions and 15 deletions

View file

@ -51,14 +51,14 @@ fn format_checkstyle(diagnostics: &[Error]) -> String {
let messages = infos
.iter()
.fold(String::new(), |mut acc, info| {
let Info { line, column, message, severity, rule_id, .. } = info;
let Info { start, message, severity, rule_id, .. } = info;
let severity = match severity {
Severity::Error => "error",
_ => "warning",
};
let message = rule_id.as_ref().map_or_else(|| xml_escape(message), |rule_id| Cow::Owned(format!("{} ({rule_id})", xml_escape(message))));
let source = rule_id.as_ref().map_or_else(|| Cow::Borrowed(""), |rule_id| Cow::Owned(format!("eslint.rules.{rule_id}")));
let line = format!(r#"<error line="{line}" column="{column}" severity="{severity}" message="{message}" source="{source}" />"#);
let line = format!(r#"<error line="{}" column="{}" severity="{severity}" message="{message}" source="{source}" />"#, start.line, start.column);
acc.push_str(&line);
acc
});

View file

@ -35,7 +35,7 @@ impl DiagnosticReporter for GithubReporter {
}
fn format_github(diagnostic: &Error) -> String {
let Info { line, column, filename, message, severity, rule_id } = Info::new(diagnostic);
let Info { start, end, filename, message, severity, rule_id } = Info::new(diagnostic);
let severity = match severity {
Severity::Error => "error",
Severity::Warning | miette::Severity::Advice => "warning",
@ -44,7 +44,11 @@ fn format_github(diagnostic: &Error) -> String {
let filename = escape_property(&filename);
let message = escape_data(&message);
format!(
"::{severity} file={filename},line={line},endLine={line},col={column},endColumn={column},title={title}::{message}\n"
"::{severity} file={filename},line={},endLine={},col={},endColumn={},title={title}::{message}\n",
start.line,
end.line,
start.column,
end.column
)
}
@ -108,6 +112,6 @@ mod test {
let result = reporter.render_error(error);
assert!(result.is_some());
assert_eq!(result.unwrap(), "::warning file=file%3A//test.ts,line=1,endLine=1,col=1,endColumn=1,title=oxlint::error message\n");
assert_eq!(result.unwrap(), "::warning file=file%3A//test.ts,line=1,endLine=1,col=1,endColumn=9,title=oxlint::error message\n");
}
}

View file

@ -49,7 +49,7 @@ fn format_stylish(diagnostics: &[Error]) -> String {
let mut grouped: FxHashMap<String, Vec<&Error>> = FxHashMap::default();
let mut sorted = diagnostics.iter().collect::<Vec<_>>();
sorted.sort_by_key(|diagnostic| Info::new(diagnostic).line);
sorted.sort_by_key(|diagnostic| Info::new(diagnostic).start.line);
for diagnostic in sorted {
let info = Info::new(diagnostic);

View file

@ -45,14 +45,14 @@ impl DiagnosticReporter for UnixReporter {
/// <https://github.com/fregante/eslint-formatters/tree/ae1fd9748596447d1fd09625c33d9e7ba9a3d06d/packages/eslint-formatter-unix>
fn format_unix(diagnostic: &Error) -> String {
let Info { line, column, filename, message, severity, rule_id } = Info::new(diagnostic);
let Info { start, end: _, filename, message, severity, rule_id } = Info::new(diagnostic);
let severity = match severity {
Severity::Error => "Error",
_ => "Warning",
};
let rule_id =
rule_id.map_or_else(|| Cow::Borrowed(""), |rule_id| Cow::Owned(format!("/{rule_id}")));
format!("{filename}:{line}:{column}: {message} [{severity}{rule_id}]\n")
format!("{filename}:{}:{}: {message} [{severity}{rule_id}]\n", start.line, start.column)
}
#[cfg(test)]

View file

@ -1,5 +1,7 @@
//! [Reporters](DiagnosticReporter) for rendering and writing diagnostics.
use miette::SourceSpan;
use crate::{Error, Severity};
/// Reporters are responsible for rendering diagnostics to some format and writing them to some
@ -54,18 +56,23 @@ pub trait DiagnosticReporter {
}
pub struct Info {
pub line: usize,
pub column: usize,
pub start: InfoPosition,
pub end: InfoPosition,
pub filename: String,
pub message: String,
pub severity: Severity,
pub rule_id: Option<String>,
}
pub struct InfoPosition {
pub line: usize,
pub column: usize,
}
impl Info {
pub fn new(diagnostic: &Error) -> Self {
let mut line = 0;
let mut column = 0;
let mut start = InfoPosition { line: 0, column: 0 };
let mut end = InfoPosition { line: 0, column: 0 };
let mut filename = String::new();
let mut message = String::new();
let mut severity = Severity::Warning;
@ -74,8 +81,18 @@ impl Info {
if let Some(source) = diagnostic.source_code() {
if let Some(label) = labels.next() {
if let Ok(span_content) = source.read_span(label.inner(), 0, 0) {
line = span_content.line() + 1;
column = span_content.column() + 1;
start.line = span_content.line() + 1;
start.column = span_content.column() + 1;
let end_offset = label.inner().offset() + label.inner().len();
if let Ok(span_content) =
source.read_span(&SourceSpan::from((end_offset, 0)), 0, 0)
{
end.line = span_content.line() + 1;
end.column = span_content.column() + 1;
}
if let Some(name) = span_content.name() {
filename = name.to_string();
};
@ -92,6 +109,7 @@ impl Info {
}
}
}
Self { line, column, filename, message, severity, rule_id }
Self { start, end, filename, message, severity, rule_id }
}
}