| Index: third_party/pkg/angular/lib/core_dom/element_binder_builder.dart
|
| diff --git a/third_party/pkg/angular/lib/core_dom/element_binder_builder.dart b/third_party/pkg/angular/lib/core_dom/element_binder_builder.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..050c53c180dbb92ada0fb9202e93794824aa7600
|
| --- /dev/null
|
| +++ b/third_party/pkg/angular/lib/core_dom/element_binder_builder.dart
|
| @@ -0,0 +1,91 @@
|
| +part of angular.core.dom_internal;
|
| +
|
| +@Injectable()
|
| +class ElementBinderFactory {
|
| + final Parser _parser;
|
| + final Profiler _perf;
|
| + final Expando _expando;
|
| + final ComponentFactory _componentFactory;
|
| + final TranscludingComponentFactory _transcludingComponentFactory;
|
| + final ShadowDomComponentFactory _shadowDomComponentFactory;
|
| +
|
| + ElementBinderFactory(this._parser, this._perf, this._expando, this._componentFactory,
|
| + this._transcludingComponentFactory, this._shadowDomComponentFactory);
|
| +
|
| + // TODO: Optimize this to re-use a builder.
|
| + ElementBinderBuilder builder() => new ElementBinderBuilder(this);
|
| +
|
| + ElementBinder binder(ElementBinderBuilder b) =>
|
| + new ElementBinder(_perf, _expando, _parser, _componentFactory,
|
| + _transcludingComponentFactory, _shadowDomComponentFactory,
|
| + b.component, b.decorators, b.onEvents, b.bindAttrs, b.childMode);
|
| + TemplateElementBinder templateBinder(ElementBinderBuilder b, ElementBinder transclude) =>
|
| + new TemplateElementBinder(_perf, _expando, _parser, _componentFactory,
|
| + _transcludingComponentFactory, _shadowDomComponentFactory,
|
| + b.template, transclude, b.onEvents, b.bindAttrs, b.childMode);
|
| +}
|
| +
|
| +/**
|
| + * ElementBinderBuilder is an internal class for the Selector which is responsible for
|
| + * building ElementBinders.
|
| + */
|
| +class ElementBinderBuilder {
|
| + static RegExp _MAPPING = new RegExp(r'^(\@|=\>\!|\=\>|\<\=\>|\&)\s*(.*)$');
|
| +
|
| + ElementBinderFactory _factory;
|
| +
|
| + final onEvents = <String, String>{};
|
| + final bindAttrs = <String, String>{};
|
| +
|
| + var decorators = <DirectiveRef>[];
|
| + DirectiveRef template;
|
| + ViewFactory templateViewFactory;
|
| +
|
| + DirectiveRef component;
|
| +
|
| + // Can be either COMPILE_CHILDREN or IGNORE_CHILDREN
|
| + String childMode = Directive.COMPILE_CHILDREN;
|
| +
|
| + ElementBinderBuilder(this._factory);
|
| +
|
| + addDirective(DirectiveRef ref) {
|
| + var annotation = ref.annotation;
|
| + var children = annotation.children;
|
| +
|
| + if (annotation.children == Directive.TRANSCLUDE_CHILDREN) {
|
| + template = ref;
|
| + } else if (annotation is Component) {
|
| + component = ref;
|
| + } else {
|
| + decorators.add(ref);
|
| + }
|
| +
|
| + if (annotation.children == Directive.IGNORE_CHILDREN) {
|
| + childMode = annotation.children;
|
| + }
|
| +
|
| + if (annotation.map != null) annotation.map.forEach((attrName, mapping) {
|
| + Match match = _MAPPING.firstMatch(mapping);
|
| + if (match == null) {
|
| + throw "Unknown mapping '$mapping' for attribute '$attrName'.";
|
| + }
|
| + var mode = match[1];
|
| + var dstPath = match[2];
|
| +
|
| + String dstExpression = dstPath.isEmpty ? attrName : dstPath;
|
| +
|
| + ref.mappings.add(new MappingParts(attrName, mode, dstExpression, mapping));
|
| + });
|
| + }
|
| +
|
| + ElementBinder get binder {
|
| + if (template != null) {
|
| + var transclude = _factory.binder(this);
|
| + return _factory.templateBinder(this, transclude);
|
| +
|
| + } else {
|
| + return _factory.binder(this);
|
| + }
|
| +
|
| + }
|
| +}
|
|
|