package sbt sealed trait SourcePosition sealed trait FilePosition extends SourcePosition { def path: String def startLine: Int } case object NoPosition extends SourcePosition final case class LinePosition(path: String, startLine: Int) extends FilePosition final case class LineRange(start: Int, end: Int) { def shift(n: Int) = new LineRange(start + n, end + n) } final case class RangePosition(path: String, range: LineRange) extends FilePosition { def startLine = range.start }