diff --git a/codespan-reporting/src/emitter.rs b/codespan-reporting/src/emitter.rs index accc8e41c..bd5fb1072 100644 --- a/codespan-reporting/src/emitter.rs +++ b/codespan-reporting/src/emitter.rs @@ -1,5 +1,6 @@ -use codespan::{CodeMap, LineIndex, LineNumber}; +use codespan::{ByteIndex, CodeMap, FileMap, LineIndex, LineNumber}; use std::{fmt, io}; +use std::ops::Deref; use termcolor::{Color, ColorSpec, WriteColor}; use {Diagnostic, LabelStyle}; @@ -15,10 +16,43 @@ impl fmt::Display for Pad { } } -pub fn emit(mut writer: W, codemap: &CodeMap, diagnostic: &Diagnostic) -> io::Result<()> +pub fn emit(writer: W, codemap: &CodeMap, diagnostic: &Diagnostic) -> io::Result<()> where W: WriteColor, S: AsRef, +{ + emit_internal(writer, codemap, diagnostic) +} + +pub fn emit_single(writer: W, filemap: &FileMap, diagnostic: &Diagnostic) -> io::Result<()> + where + W: WriteColor, + S: AsRef, +{ + emit_internal(writer, filemap, diagnostic) +} + +trait FindFile { + fn find_file(&self, index: ByteIndex) -> Option<&FileMap>; +} + +impl> FindFile for CodeMap { + fn find_file(&self, index: ByteIndex) -> Option<&FileMap> { + self.find_file(index).map(Deref::deref) + } +} + +impl> FindFile for FileMap { + fn find_file(&self, _index: ByteIndex) -> Option<&FileMap> { + Some(self) + } +} + +fn emit_internal(mut writer: W, codemap: &M, diagnostic: &Diagnostic) -> io::Result<()> + where + W: WriteColor, + S: AsRef, + M: FindFile, { let supports_color = writer.supports_color(); let line_location_color = ColorSpec::new() diff --git a/codespan-reporting/src/lib.rs b/codespan-reporting/src/lib.rs index 635009a95..d684152c6 100644 --- a/codespan-reporting/src/lib.rs +++ b/codespan-reporting/src/lib.rs @@ -22,7 +22,7 @@ mod diagnostic; mod emitter; pub use self::diagnostic::{Diagnostic, Label, LabelStyle}; -pub use self::emitter::emit; +pub use self::emitter::{emit, emit_single}; /// A severity level for diagnostic messages ///