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
2 changes: 1 addition & 1 deletion codespan-reporting/src/term/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ pub mod styles {
#[cfg(feature = "termcolor")]
impl<T> super::renderer::WriteStyle for T
where
T: termcolor::WriteColor,
T: termcolor::WriteColor + ?Sized,
{
fn set_header(
&mut self,
Expand Down
25 changes: 15 additions & 10 deletions codespan-reporting/src/term/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ pub fn emit_to_string<'files, F: Files<'files> + ?Sized>(
{
let mut buffer = Vec::new();
emit_with_style(
&mut renderer::PlainWriter::new(&mut buffer),
renderer::PlainWriter::new(&mut buffer),
config,
files,
diagnostic,
Expand All @@ -54,7 +54,7 @@ pub fn emit_to_string<'files, F: Files<'files> + ?Sized>(
#[cfg(not(feature = "std"))]
{
emit_with_style(
&mut renderer::PlainWriter::new(writer),
renderer::PlainWriter::new(writer),
config,
files,
diagnostic,
Expand All @@ -63,27 +63,32 @@ pub fn emit_to_string<'files, F: Files<'files> + ?Sized>(
}

#[cfg(feature = "std")]
pub fn emit_to_io_write<'files, F: Files<'files> + ?Sized, W: std::io::Write>(
pub fn emit_to_io_write<'files, F: Files<'files> + ?Sized, W: std::io::Write + ?Sized>(
writer: &mut W,
config: &Config,
files: &'files F,
diagnostic: &Diagnostic<F::FileId>,
) -> Result<(), super::files::Error> {
emit_with_style(
&mut renderer::PlainWriter::new(writer),
renderer::PlainWriter::new(writer),
config,
files,
diagnostic,
)
}

pub fn emit_to_write_style<'files, F: Files<'files> + ?Sized, W: WriteStyle>(
pub fn emit_to_write_style<'files, F: Files<'files> + ?Sized, W: WriteStyle + ?Sized>(
writer: &mut W,
config: &Config,
files: &'files F,
diagnostic: &Diagnostic<F::FileId>,
) -> Result<(), super::files::Error> {
emit_with_style(writer, config, files, diagnostic)
emit_with_style(
renderer::WriteStyleByRef::new(writer),
config,
files,
diagnostic,
)
}

#[deprecated(
Expand All @@ -96,27 +101,27 @@ pub fn emit_to_write_style<'files, F: Files<'files> + ?Sized, W: WriteStyle>(
/// * a file was removed from the file database.
/// * a file was changed so that it is too small to have an index
/// * IO fails
pub fn emit<'files, F: Files<'files> + ?Sized, W: renderer::GeneralWrite>(
pub fn emit<'files, F: Files<'files> + ?Sized, W: renderer::GeneralWrite + ?Sized>(
writer: &mut W,
config: &Config,
files: &'files F,
diagnostic: &Diagnostic<F::FileId>,
) -> Result<(), super::files::Error> {
emit_with_style(
&mut renderer::PlainWriter::new(writer),
renderer::PlainWriter::new(writer),
config,
files,
diagnostic,
)
}

fn emit_with_style<'files, F: Files<'files> + ?Sized, W: WriteStyle>(
writer: &mut W,
mut writer: W,
config: &Config,
files: &'files F,
diagnostic: &Diagnostic<F::FileId>,
) -> Result<(), super::files::Error> {
let mut renderer = Renderer::new(writer, config);
let mut renderer = Renderer::new(&mut writer, config);
match config.display_style {
DisplayStyle::Rich => RichDiagnostic::new(diagnostic, config).render(files, &mut renderer),
DisplayStyle::Medium => ShortDiagnostic::new(diagnostic, true).render(files, &mut renderer),
Expand Down
78 changes: 78 additions & 0 deletions codespan-reporting/src/term/renderer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,84 @@ impl<W: GeneralWrite> WriteStyle for PlainWriter<W> {
}
}

pub(crate) struct WriteStyleByRef<'a, W: ?Sized> {
w: &'a mut W,
}

impl<'a, W> WriteStyleByRef<'a, W>
where
W: ?Sized,
{
pub fn new(writer: &'a mut W) -> Self {
Self { w: writer }
}
}

#[cfg(feature = "std")]
impl<'a, W> std::io::Write for WriteStyleByRef<'a, W>
where
W: std::io::Write + ?Sized,
{
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.w.write(buf)
}

fn flush(&mut self) -> std::io::Result<()> {
self.w.flush()
}
}

#[cfg(not(feature = "std"))]
impl<'a, W> core::fmt::Write for WriteStyleByRef<'a, W>
where
W: core::fmt::Write + ?Sized,
{
fn write_str(&mut self, s: &str) -> core::fmt::Result {
self.w.write_str(s)
}

fn write_char(&mut self, c: char) -> core::fmt::Result {
self.w.write_char(c)
}

fn write_fmt(&mut self, args: core::fmt::Arguments<'_>) -> core::fmt::Result {
self.w.write_fmt(args)
}
}

impl<'a, W> WriteStyle for WriteStyleByRef<'a, W>
where
W: WriteStyle + ?Sized,
{
fn set_header(&mut self, severity: Severity) -> GeneralWriteResult {
self.w.set_header(severity)
}

fn set_header_message(&mut self) -> GeneralWriteResult {
self.w.set_header_message()
}

fn set_line_number(&mut self) -> GeneralWriteResult {
self.w.set_line_number()
}

fn set_note_bullet(&mut self) -> GeneralWriteResult {
self.w.set_note_bullet()
}

fn set_source_border(&mut self) -> GeneralWriteResult {
self.w.set_source_border()
}

fn set_label(&mut self, severity: Severity, label_style: LabelStyle) -> GeneralWriteResult {
self.w.set_label(severity, label_style)
}

fn reset(&mut self) -> GeneralWriteResult {
self.w.reset()
}
}

/// The 'location focus' of a source code snippet.
pub struct Locus {
/// The user-facing name of the file.
Expand Down