| Index: packages/source_span/test/highlight_test.dart | 
| diff --git a/packages/source_span/test/file_message_test.dart b/packages/source_span/test/highlight_test.dart | 
| similarity index 51% | 
| rename from packages/source_span/test/file_message_test.dart | 
| rename to packages/source_span/test/highlight_test.dart | 
| index 5935c58820e76a8ba7ea42d2c2ca2bdb51b19c4f..74faed52a820a9a8f48b21d53afef44658557d2c 100644 | 
| --- a/packages/source_span/test/file_message_test.dart | 
| +++ b/packages/source_span/test/highlight_test.dart | 
| @@ -13,86 +13,104 @@ main() { | 
| foo bar baz | 
| whiz bang boom | 
| zip zap zop | 
| -""", url: "foo.dart"); | 
| +"""); | 
| }); | 
|  | 
| test("points to the span in the source", () { | 
| -    expect(file.span(4, 7).message("oh no"), equals(""" | 
| -line 1, column 5 of foo.dart: oh no | 
| +    expect(file.span(4, 7).highlight(), equals(""" | 
| foo bar baz | 
| ^^^""")); | 
| }); | 
|  | 
| test("gracefully handles a missing source URL", () { | 
| var span = new SourceFile("foo bar baz").span(4, 7); | 
| -    expect(span.message("oh no"), equals(""" | 
| -line 1, column 5: oh no | 
| +    expect(span.highlight(), equals(""" | 
| foo bar baz | 
| ^^^""")); | 
| }); | 
|  | 
| test("highlights the first line of a multiline span", () { | 
| -    expect(file.span(4, 20).message("oh no"), equals(""" | 
| -line 1, column 5 of foo.dart: oh no | 
| +    expect(file.span(4, 20).highlight(), equals(""" | 
| foo bar baz | 
| ^^^^^^^^""")); | 
| }); | 
|  | 
| test("works for a point span", () { | 
| -    expect(file.location(4).pointSpan().message("oh no"), equals(""" | 
| -line 1, column 5 of foo.dart: oh no | 
| +    expect(file.location(4).pointSpan().highlight(), equals(""" | 
| foo bar baz | 
| ^""")); | 
| }); | 
|  | 
| test("works for a point span at the end of a line", () { | 
| -    expect(file.location(11).pointSpan().message("oh no"), equals(""" | 
| -line 1, column 12 of foo.dart: oh no | 
| +    expect(file.location(11).pointSpan().highlight(), equals(""" | 
| foo bar baz | 
| ^""")); | 
| }); | 
|  | 
| test("works for a point span at the end of the file", () { | 
| -    expect(file.location(38).pointSpan().message("oh no"), equals(""" | 
| -line 3, column 12 of foo.dart: oh no | 
| +    expect(file.location(38).pointSpan().highlight(), equals(""" | 
| +zip zap zop | 
| +           ^""")); | 
| +  }); | 
| + | 
| +  test("works for a point span at the end of the file with no trailing newline", | 
| +      () { | 
| +    file = new SourceFile("zip zap zop"); | 
| +    expect(file.location(11).pointSpan().highlight(), equals(""" | 
| zip zap zop | 
| ^""")); | 
| }); | 
|  | 
| test("works for a point span in an empty file", () { | 
| -    expect(new SourceFile("").location(0).pointSpan().message("oh no"), | 
| +    expect(new SourceFile("").location(0).pointSpan().highlight(), | 
| equals(""" | 
| -line 1, column 1: oh no | 
|  | 
| ^""")); | 
| }); | 
|  | 
| test("works for a single-line file without a newline", () { | 
| -    expect(new SourceFile("foo bar").span(0, 7).message("oh no"), | 
| +    expect(new SourceFile("foo bar").span(0, 7).highlight(), | 
| equals(""" | 
| -line 1, column 1: oh no | 
| foo bar | 
| ^^^^^^^""")); | 
| }); | 
|  | 
| +  test("emits tabs for tabs", () { | 
| +    expect(new SourceFile(" \t \t\tfoo bar").span(5, 8).highlight(), | 
| +        equals(""" | 
| + \t \t\tfoo bar | 
| + \t \t\t^^^""")); | 
| +  }); | 
| + | 
| +  test("supports lines of preceding context", () { | 
| +    var span = new SourceSpanWithContext( | 
| +        new SourceLocation(5, line: 3, column: 5, sourceUrl: "foo.dart"), | 
| +        new SourceLocation(12, line: 3, column: 12, sourceUrl: "foo.dart"), | 
| +        "foo bar", | 
| +        "previous\nlines\n-----foo bar-----\nfollowing line\n"); | 
| + | 
| +    expect(span.highlight(color: colors.YELLOW), equals(""" | 
| +previous | 
| +lines | 
| +-----${colors.YELLOW}foo bar${colors.NONE}----- | 
| +     ${colors.YELLOW}^^^^^^^${colors.NONE}""")); | 
| +  }); | 
| + | 
| group("colors", () { | 
| test("doesn't colorize if color is false", () { | 
| -      expect(file.span(4, 7).message("oh no", color: false), equals(""" | 
| -line 1, column 5 of foo.dart: oh no | 
| +      expect(file.span(4, 7).highlight(color: false), equals(""" | 
| foo bar baz | 
| ^^^""")); | 
| }); | 
|  | 
| test("colorizes if color is true", () { | 
| -      expect(file.span(4, 7).message("oh no", color: true), equals(""" | 
| -line 1, column 5 of foo.dart: oh no | 
| +      expect(file.span(4, 7).highlight(color: true), equals(""" | 
| foo ${colors.RED}bar${colors.NONE} baz | 
| ${colors.RED}^^^${colors.NONE}""")); | 
| }); | 
|  | 
| test("uses the given color if it's passed", () { | 
| -      expect(file.span(4, 7).message("oh no", color: colors.YELLOW), equals(""" | 
| -line 1, column 5 of foo.dart: oh no | 
| +      expect(file.span(4, 7).highlight(color: colors.YELLOW), equals(""" | 
| foo ${colors.YELLOW}bar${colors.NONE} baz | 
| ${colors.YELLOW}^^^${colors.NONE}""")); | 
| }); | 
|  |