anchor.diff:    static int NO_MATCH = 0;
     static int PREFIX_MATCH = 1;
     static int COMPLETE_MATCH = 2;
  -
  -  final String pattern;
  -
  -  Glob(this.pattern);
  +  static final RegExp _escapePattern = new RegExp("[!@#\$%^&()-.,<>+=\\/~`|]");
  +
  +  List<String> _globRegExpParts;
  +
  +  Glob(String pattern) {
  +    Iterable<Match> globMatchers = new GlobPattern().allMatches(pattern);
  +    _globRegExpParts = globMatchers.map((GlobMatcher m) =>
  +        _escape(pattern.substring(m.start, m.tokenStart)) + m.toRegExp()).toList();
  +  }
   
     String _escape(String toEscape) {
  -    // TODO(ericarnold): Implement regexp escaping
  -    return toEscape;
  +    int start = 0;
  +    return _escapePattern.allMatches(toEscape).fold("", (String s, Match m) =>
  +        s + toEscape.substring(start, (start = m.end) - 1) + "\\" + m[0]) +
  +        toEscape.substring(start);
     }
   
   
  
positive.code:           return new SingleCharMatcher(string, this, start, n);
          case "{":
            return new IdentifierListMatcher(string, this, start, n);
          default:
            return null;
        }
      } while(start < string.length);
  
      throw "Unexpected end of line";
    }
  
negative.code: 
    glob = new Glob("a*/b*");
    expect(glob.matchPath("abc/"), Glob.PREFIX_MATCH);
  
    glob = new Glob("a**/foo\\ bar");
    expect(glob.matchPath("aaa/bbb"), Glob.PREFIX_MATCH);
    expect(glob.matchPath("aaa/bbb/foo ba"), Glob.PREFIX_MATCH);
    expect(glob.matchPath("aaa/bbb/foo bar"), Glob.COMPLETE_MATCH);
    expect(glob.matchPath("aaa/bbb/foo barb"), Glob.PREFIX_MATCH);
  
    glob = new Glob("foo.dart");
    expect(glob.matchPath("foo.dart"), Glob.COMPLETE_MATCH);
    expect(glob.matchPath("foo!dart"), Glob.NO_MATCH);
  }
  
  expect(dynamic v1, dynamic v2) {
    print("${v1==v2} -- $v1");
  }
  
  