message: Add Source::from_file and line/column number display impls
diff: //! Various source mapping utilities
  -use std::cmp;
  +use std::{cmp, fmt, io};
  use std::path::{Path, PathBuf};
  use std::ops::{Add, Sub};
  @@ -44,6 +44,12 @@ impl LineNumber {
  }
  }
  +impl fmt::Display for LineNumber {
  + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  + self.0.fmt(f)
  + }
  +}
  +
  /// A zero-indexed column offest into a source file
  #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
  pub struct ColumnIndex(pub usize);
  @@ -84,6 +90,12 @@ impl ColumnNumber {
  }
  }
  +impl fmt::Display for ColumnNumber {
  + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  + self.0.fmt(f)
  + }
  +}
  +
  /// A byte offset in a source file
  #[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
  pub struct BytePos(pub usize);
  @@ -402,6 +414,18 @@ impl Source {
  }
  }
  + /// Read some source code from a file
  + pub fn from_file(name: PathBuf) -> io::Result<Source> {
  + use std::fs::File;
  + use std::io::Read;
  +
  + let mut file = File::open(&name)?;
  + let mut src = String::new();
  + file.read_to_string(&mut src)?;
  +
  + Ok(Source::new(Some(name), src))
  + }
  +
  /// The name of the file that the source came from
  pub fn name(&self) -> Option<&Path> {
  self.name.as_ref().map(PathBuf::as_ref)
  