anchor.diff:          stdin,
           stdout;
   
  -import 'package:_fe_analyzer_shared/src/parser/parser.dart' show Parser;
  -import 'package:_fe_analyzer_shared/src/parser/forwarding_listener.dart'
  -    show NullListener;
   import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
   import 'package:_fe_analyzer_shared/src/scanner/token.dart'
       show CommentToken, Token;
  
positive.code: 
  Map<Uri, Token> cache = {};
  
  void check(InvocationExpression invocation, int parameterNumber,
      VariableDeclaration parameter, String expectedComment) {
    if (invocation.name.name == "==") return;
    if (invocation.name.name == "[]=") return;
    if (invocation.name.name == "[]") return;
    if (invocation.name.name == "<") return;
    if (invocation.name.name == "<=") return;
    if (invocation.name.name == ">") return;
    if (invocation.name.name == ">=") return;
    if (invocation.name.name == "+") return;
    if (invocation.name.name == "-") return;
    if (invocation.name.name == "*") return;
    if (invocation.name.name == "/") return;
    if (invocation.name.name == "<<") return;
    if (invocation.name.name == "<<<") return;
    if (invocation.name.name == ">>") return;
    if (invocation.name.name == "|=") return;
    if (invocation.name.name == "|") return;
    if (invocation.name.name == "&") return;
    if (invocation.name.name == "~/") return;
    Location location = invocation.location;
    Token token = cache[location.file];
    while (token.offset != invocation.fileOffset) {
      token = token.next;
      if (token.isEof) {
        print("Couldn't find token for $invocation...");
        return;
      }
    }
    if (token.lexeme != invocation.name.name) {
      bool ignore = false;
      // Check if the next tokens are ".<what we're looking for>".
      if (token.next.lexeme == "." &&
          token.next.next.lexeme == invocation.name.name) {
        ignore = true;
        token = token.next.next;
      } else if (invocation is StaticInvocation) {
        Procedure p = invocation.targetReference.node;
        ignore = p.isFactory;
      }
      if (invocation is ConstructorInvocation || ignore) {
        // ignore that... E.g. new Foo() will have name ''.
      } else {
        Location calculatedLocation =
            component.getLocation(location.file, token.offset);
        throw "Expected to find ${invocation.name.name} but "
            "found ${token.lexeme} at $calculatedLocation "
            "(would have checked for comment $expectedComment)";
      }
    }
    token = token.next;
    while (token.lexeme == ".") {
      token = token.next.next;
    }
    if (token.lexeme == "<") {
      if (token.endGroup != null) {
        token = token.endGroup.next;
      }
    }
    while (token.lexeme == ".") {
      token = token.next.next;
    }
    if (token.lexeme != "(") {
      Location calculatedLocation =
          component.getLocation(location.file, token.offset);
      throw "Expected to find ( but found ${token.lexeme} "
          "at $calculatedLocation"
          " (would have checked for comment $expectedComment)";
    }
    if (parameterNumber > 0) {
      Parser parser = new Parser(new NullListener());
      for (int i = 0; i < parameterNumber; i++) {
        token = parser.parseExpression(token);
        if (token.next.lexeme != ",") {
          throw "Expected to find , but found ${token.next.lexeme}";
        }
        token = token.next;
      }
    }
    token = token.next;
    bool foundComment = false;
    CommentToken commentToken = token.precedingComments;
    while (commentToken != null) {
  
negative.code: 
    for (Library library in component.libraries) {
      if (library.importUri.scheme == "dart") continue;
      // This isn't perfect because of parts, but (for now) it'll do.
      for (Uri uri in libUris) {
        if (library.fileUri.toString().startsWith(uri.toString())) {
          library.accept(new InvocationVisitor());
  