>>>
class ResolutionCopier {
  @override
  bool visitClassDeclaration(ClassDeclaration node) {
    ClassDeclaration toNode = this._toNode as ClassDeclaration;
    return javaBooleanAnd(
        javaBooleanAnd(
            javaBooleanAnd(
                javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(
                        javaBooleanAnd(javaBooleanAnd(
                            javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(
                                    _isEqualNodes(node.documentationComment,
                                        toNode.documentationComment),
                                    _isEqualNodeLists(
                                        node.metadata, toNode.metadata)),
                                _isEqualTokens(node.abstractKeyword,
                                    toNode.abstractKeyword)), _isEqualTokens(
                                node.classKeyword, toNode.classKeyword)),
                            _isEqualNodes(
                                node.name, toNode.name)), _isEqualNodes(
                            node.typeParameters, toNode.typeParameters)),
                        _isEqualNodes(
                            node.extendsClause, toNode.extendsClause)),
                    _isEqualNodes(
                        node.withClause, toNode.withClause)), _isEqualNodes(
                    node.implementsClause, toNode.implementsClause)),
                _isEqualTokens(node.leftBracket, toNode.leftBracket)),
            _isEqualNodeLists(
                node.members,
                toNode.members)),
        _isEqualTokens(
            node.rightBracket,
            toNode.rightBracket));
  }
}
<<<
class ResolutionCopier {
  @override
  bool visitClassDeclaration(ClassDeclaration node) {
    ClassDeclaration toNode = this._toNode as ClassDeclaration;
    return javaBooleanAnd(
        javaBooleanAnd(
            javaBooleanAnd(
                javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(
                        javaBooleanAnd(javaBooleanAnd(
                            javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(
                                    _isEqualNodes(node.documentationComment,
                                        toNode.documentationComment),
                                    _isEqualNodeLists(
                                        node.metadata, toNode.metadata)),
                                _isEqualTokens(node.abstractKeyword,
                                    toNode.abstractKeyword)), _isEqualTokens(
                                node.classKeyword, toNode.classKeyword)),
                            _isEqualNodes(
                                node.name, toNode.name)), _isEqualNodes(
                            node.typeParameters, toNode.typeParameters)),
                        _isEqualNodes(
                            node.extendsClause, toNode.extendsClause)),
                    _isEqualNodes(
                        node.withClause, toNode.withClause)), _isEqualNodes(
                    node.implementsClause, toNode.implementsClause)),
                _isEqualTokens(node.leftBracket, toNode.leftBracket)),
            _isEqualNodeLists(
                node.members,
                toNode.members)),
        _isEqualTokens(
            node.rightBracket,
            toNode.rightBracket));
  }
}
>>> pathologically deep
class ResolutionCopier {
  @override
  bool visitClassDeclaration(ClassDeclaration node) {
    ClassDeclaration toNode = this._toNode as ClassDeclaration;
    return javaBooleanAnd(
        javaBooleanAnd(
            javaBooleanAnd(
                javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(
                        javaBooleanAnd(javaBooleanAnd(
                            javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(
                                    _isEqualNodes(node.documentationComment,
                                        toNode.documentationComment),
                                    _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, _isEqualNodeLists(
                                        node.metadata, toNode.metadata))))))))))))))))))))))),
                                _isEqualTokens(node.abstractKeyword,
                                    toNode.abstractKeyword)), _isEqualTokens(
                                node.classKeyword, toNode.classKeyword)),
                            _isEqualNodes(
                                node.name, toNode.name)), _isEqualNodes(
                            node.typeParameters, toNode.typeParameters)),
                        _isEqualNodes(
                            node.extendsClause, toNode.extendsClause)),
                    _isEqualNodes(
                        node.withClause, toNode.withClause)), _isEqualNodes(
                    node.implementsClause, toNode.implementsClause)),
                _isEqualTokens(node.leftBracket, toNode.leftBracket)),
            _isEqualNodeLists(
                node.members,
                toNode.members)),
        _isEqualTokens(
            node.rightBracket,
            toNode.rightBracket));
  }
}
<<<
class ResolutionCopier {
  @override
  bool visitClassDeclaration(ClassDeclaration node) {
    ClassDeclaration toNode = this._toNode as ClassDeclaration;
    return javaBooleanAnd(
        javaBooleanAnd(
            javaBooleanAnd(
                javaBooleanAnd(
                    javaBooleanAnd(
                        javaBooleanAnd(
                            javaBooleanAnd(
                                javaBooleanAnd(
                                    javaBooleanAnd(
                                        javaBooleanAnd(
                                            javaBooleanAnd(
                                                _isEqualNodes(
                                                    node.documentationComment,
                                                    toNode.documentationComment),
                                                _isEqualNodeLists(
                                                    node.metadata,
                                                    _isEqualNodeLists(
                                                        node.metadata,
                                                        _isEqualNodeLists(
                                                            node.metadata,
                                                            _isEqualNodeLists(
                                                                node.metadata,
                                                                _isEqualNodeLists(
                                                                    node.metadata,
                                                                    _isEqualNodeLists(
                                                                        node.metadata,
                                                                        _isEqualNodeLists(
                                                                            node.metadata,
                                                                            _isEqualNodeLists(
                                                                                node.metadata,
                                                                                _isEqualNodeLists(
                                                                                    node.metadata,
                                                                                    _isEqualNodeLists(
                                                                                        node.metadata,
                                                                                        _isEqualNodeLists(
                                                                                            node.metadata,
                                                                                            _isEqualNodeLists(
                                                                                                node.metadata,
                                                                                                _isEqualNodeLists(
                                                                                                    node.metadata,
                                                                                                    _isEqualNodeLists(node.metadata, _isEqualNodeLists(node.metadata, _isEqualNodeLists(node.metadata, _isEqualNodeLists(node.metadata, _isEqualNodeLists(node.metadata, _isEqualNodeLists(node.metadata, _isEqualNodeLists(node.metadata, _isEqualNodeLists(node.metadata, _isEqualNodeLists(node.metadata, toNode.metadata))))))))))))))))))))))),
                                            _isEqualTokens(
                                                node.abstractKeyword,
                                                toNode.abstractKeyword)),
                                        _isEqualTokens(
                                            node.classKeyword,
                                            toNode.classKeyword)),
                                    _isEqualNodes(
                                        node.name,
                                        toNode.name)),
                                _isEqualNodes(
                                    node.typeParameters,
                                    toNode.typeParameters)),
                            _isEqualNodes(
                                node.extendsClause,
                                toNode.extendsClause)),
                        _isEqualNodes(
                            node.withClause,
                            toNode.withClause)),
                    _isEqualNodes(
                        node.implementsClause,
                        toNode.implementsClause)),
                _isEqualTokens(
                    node.leftBracket,
                    toNode.leftBracket)),
            _isEqualNodeLists(
                node.members,
                toNode.members)),
        _isEqualTokens(
            node.rightBracket,
            toNode.rightBracket));
  }
}
>>>
class ElementBinder {
  DirectiveInjector bind(
      View view, Scope scope, DirectiveInjector parentInjector, dom.Node node) {
    if (bindAssignableProps.isNotEmpty) {
      _bindAssignablePropsOn.forEach((String eventName) => node
          .addEventListener(eventName, (_) => zone.run(() => bindAssignableProps
              .forEach((propAndExp) => propAndExp[1].assign(
                  scope.context, jsNode[propAndExp[0]])))));
    }
  }
}
<<<
class ElementBinder {
  DirectiveInjector bind(
      View view, Scope scope, DirectiveInjector parentInjector, dom.Node node) {
    if (bindAssignableProps.isNotEmpty) {
      _bindAssignablePropsOn
          .forEach(
              (String eventName) =>
                  node
                      .addEventListener(
                          eventName,
                          (_) =>
                              zone.run(() => bindAssignableProps.forEach(
                                  (propAndExp) => propAndExp[1].assign(
                                      scope.context, jsNode[propAndExp[0]])))));
    }
  }
}
>>>
async.Future<List<dom.StyleElement>> call(String tag, List<String> cssUrls, {Type type}) =>
(DDC$RT.cast(async.Future.wait((DDC$RT.cast(cssUrls.map((url) => _styleElement(tag,
(DDC$RT.cast(url, String, key: "Cast failed: package:angular/core_dom/component_css_loader.dart:17:65")), type)),
DDC$RT.type((Iterable<Future<dynamic>> _) {}), key: "Cast failed: package:angular/core_dom/component_css_loader.dart:17:25"))),
DDC$RT.type((Future<List<StyleElement>> _) {}), key: "Cast failed: package:angular/core_dom/component_css_loader.dart:17:7"));
<<<
async.Future<List<dom.StyleElement>> call(
        String tag,
        List<String> cssUrls,
        {Type type}) =>
    (DDC$RT
        .cast(
            async.Future
                .wait((DDC$RT.cast(cssUrls.map((url) => _styleElement(tag,
                    (DDC$RT.cast(url, String,
                        key: "Cast failed: package:angular/core_dom/component_css_loader.dart:17:65")),
                    type)), DDC$RT.type((Iterable<Future<dynamic>> _) {
}), key: "Cast failed: package:angular/core_dom/component_css_loader.dart:17:25"))),
    DDC$RT
        .type((Future<List<StyleElement>> _) {
}),
    key: "Cast failed: package:angular/core_dom/component_css_loader.dart:17:7"));