>>>
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"));