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
4 changes: 2 additions & 2 deletions apps/oxlint/src/output_formatter/checkstyle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
});
Expand Down
10 changes: 7 additions & 3 deletions apps/oxlint/src/output_formatter/github.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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
)
}

Expand Down Expand Up @@ -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");
}
}
2 changes: 1 addition & 1 deletion apps/oxlint/src/output_formatter/stylish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions apps/oxlint/src/output_formatter/unix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down
32 changes: 25 additions & 7 deletions crates/oxc_diagnostics/src/reporter.rs
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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();
};
Expand All @@ -92,6 +109,7 @@ impl Info {
}
}
}
Self { line, column, filename, message, severity, rule_id }

Self { start, end, filename, message, severity, rule_id }
}
}
Loading