>>> (indent 2)
  LiteralMap mapLiteral(List<LiteralMapEntry> entries, {bool isConst: false}) {
    return new LiteralMap(null, // Type arguments.
        new NodeList(symbolToken(OPEN_CURLY_BRACKET_INFO),
            linkedList(entries), symbolToken(CLOSE_CURLY_BRACKET_INFO), ','),
        isConst ? keywordToken('const') : null);
  }
<<<
  LiteralMap mapLiteral(List<LiteralMapEntry> entries, {bool isConst: false}) {
    return new LiteralMap(
        null, // Type arguments.
        new NodeList(symbolToken(OPEN_CURLY_BRACKET_INFO), linkedList(entries),
            symbolToken(CLOSE_CURLY_BRACKET_INFO), ','),
        isConst ? keywordToken('const') : null);
  }
>>>
void defineProperty(var obj, String property, var value) {
  JS('void', 'Object.defineProperty(#, #, '
      '{value: #, enumerable: false, writable: true, configurable: true})',
      obj, property, value);
}
<<<
void defineProperty(var obj, String property, var value) {
  JS(
      'void',
      'Object.defineProperty(#, #, '
      '{value: #, enumerable: false, writable: true, configurable: true})',
      obj,
      property,
      value);
}
>>> (indent 4)
    main() {
      return searchEngine.searchTopLevelDeclarations('').then(
          (List<SearchMatch> matches) {
        _addNonImportedElementSuggestions(matches, excludedLibs);
        return true;
      });
    }
<<<
    main() {
      return searchEngine
          .searchTopLevelDeclarations('')
          .then((List<SearchMatch> matches) {
        _addNonImportedElementSuggestions(matches, excludedLibs);
        return true;
      });
    }
>>> (indent 2)
  test_getRelationships_empty() {
    return store.getRelationships(elementA, relationship).then(
        (List<Location> locations) {
      expect(locations, isEmpty);
    });
  }
<<<
  test_getRelationships_empty() {
    return store
        .getRelationships(elementA, relationship)
        .then((List<Location> locations) {
      expect(locations, isEmpty);
    });
  }
>>> (indent 2)
  _asRuntimeType() {
    return [
      _class._jsConstructor
    ].addAll(typeArguments.map((t) => t._asRuntimeType()));
  }
<<<
  _asRuntimeType() {
    return [_class._jsConstructor]
        .addAll(typeArguments.map((t) => t._asRuntimeType()));
  }