refactor(view_compiler): codegen DI and Queries

BREAKING CHANGE:
- Renderer:
  * renderComponent method is removed form `Renderer`, only present on `RootRenderer`
  * Renderer.setDebugInfo is removed. Renderer.createElement / createText / createTemplateAnchor
    now take the DebugInfo directly.
- Query semantics:
  * Queries don't work with dynamically loaded components.
  * e.g. for router-outlet: loaded components can't be queries via @ViewQuery,
    but router-outlet emits an event `activate` now that emits the activated component
- Exception classes and the context inside changed (renamed fields)
- DebugElement.attributes is an Object and not a Map in JS any more
- ChangeDetectorGenConfig was renamed into CompilerConfig
- AppViewManager.createEmbeddedViewInContainer / AppViewManager.createHostViewInContainer
  are removed, use the methods in ViewContainerRef instead
- Change detection order changed:
  * 1. dirty check component inputs
  * 2. dirty check content children
  * 3. update render nodes

Closes #6301
Closes #6567
This commit is contained in:
Tobias Bosch
2016-01-06 14:13:44 -08:00
parent 45f09ba686
commit 2b34c88b69
312 changed files with 14271 additions and 16566 deletions

View File

@ -1,12 +1,11 @@
import 'package:build/build.dart';
import 'package:analyzer/src/generated/element.dart';
import 'src/transform/common/url_resolver.dart';
import 'dart:async';
import 'package:angular2/i18n.dart';
import 'package:angular2/src/core/change_detection/parser/parser.dart';
import 'package:angular2/src/core/change_detection/parser/lexer.dart';
import 'package:angular2/src/core/reflection/reflector.dart';
import 'package:angular2/src/core/reflection/reflection_capabilities.dart';
import 'package:angular2/src/compiler/expression_parser/parser.dart';
import 'package:angular2/src/compiler/expression_parser/lexer.dart';
import 'package:angular2/src/compiler/html_parser.dart';
/**
@ -51,11 +50,11 @@ class I18nMessageExtractorBuilder implements Builder {
}
class I18nMessageExtractor {
final TransformerUrlResolver urlResovler = new TransformerUrlResolver();
final urlResovler = createOfflineCompileUrlResolver();
final List<Message> messages = [];
final List errors = [];
final HtmlParser htmlParser = new HtmlParser();
final Parser parser = new Parser(new Lexer(), new Reflector(new ReflectionCapabilities()));
final Parser parser = new Parser(new Lexer());
final Function readInput;

View File

@ -88,7 +88,7 @@ ImportDirective _getMatchingImport(
return false;
} else {
final candidateAssetId =
fromUri(const TransformerUrlResolver().resolve(assetUri, uriString));
fromUri(createOfflineCompileUrlResolver().resolve(assetUri, uriString));
importMatch = descriptor.assetId == candidateAssetId;
}

View File

@ -2,7 +2,6 @@ library angular2.transform.common.code.annotation_code;
import 'package:analyzer/analyzer.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:angular2/src/transform/common/annotation_matcher.dart';
import 'package:angular2/src/transform/common/model/annotation_model.pb.dart';
import 'package:barback/barback.dart' show AssetId;
@ -13,11 +12,7 @@ class AnnotationVisitor extends SimpleAstVisitor<AnnotationModel> {
/// The file we are processing.
final AssetId assetId;
/// Responsible for testing whether [Annotation]s are those recognized by
/// Angular 2, for example `@Component`.
final AnnotationMatcher _annotationMatcher;
AnnotationVisitor(this.assetId, this._annotationMatcher);
AnnotationVisitor(this.assetId);
@override
AnnotationModel visitAnnotation(Annotation node) {
@ -25,18 +20,8 @@ class AnnotationVisitor extends SimpleAstVisitor<AnnotationModel> {
if (node.constructorName != null) {
name += '.${constify(node.constructorName)}';
}
var isComponent = _annotationMatcher.isComponent(node, assetId);
var isDirective =
isComponent || _annotationMatcher.isDirective(node, assetId);
var isInjectable =
isDirective || _annotationMatcher.isInjectable(node, assetId);
var isView = _annotationMatcher.isView(node, assetId);
var model = new AnnotationModel()
..name = name
..isComponent = isComponent
..isDirective = isDirective
..isInjectable = isInjectable
..isView = isView
..isConstObject = node.arguments == null;
// This annotation is a constant instance creation expression,

View File

@ -12,7 +12,6 @@ import 'annotation_code.dart';
import 'import_export_code.dart';
import 'reflection_info_code.dart';
import 'parameter_code.dart';
import 'queries_code.dart';
/// Visitor responsible for parsing Dart source into [NgDepsModel] objects.
class NgDepsVisitor extends RecursiveAstVisitor<Object> {
@ -20,14 +19,12 @@ class NgDepsVisitor extends RecursiveAstVisitor<Object> {
final _importVisitor = new ImportVisitor();
final _exportVisitor = new ExportVisitor();
final ReflectionInfoVisitor _reflectableVisitor;
final QueriesVisitor _queriesVisitor;
bool _isPart = false;
NgDepsModel _model = null;
NgDepsVisitor(AssetId processedFile, AnnotationMatcher annotationMatcher)
: this.processedFile = processedFile,
_queriesVisitor = new QueriesVisitor(processedFile, annotationMatcher),
_reflectableVisitor =
new ReflectionInfoVisitor(processedFile, annotationMatcher);
@ -50,14 +47,6 @@ class NgDepsVisitor extends RecursiveAstVisitor<Object> {
var reflectableModel = _reflectableVisitor.visitClassDeclaration(node);
if (reflectableModel != null) {
model.reflectables.add(reflectableModel);
var queryFields = _queriesVisitor.visitClassDeclaration(node);
if (queryFields != null) {
for (var queryField in queryFields) {
if (!model.setters.contains(queryField)) {
model.setters.add(queryField);
}
}
}
}
return null;
}
@ -136,7 +125,7 @@ abstract class NgDepsWriterMixin
ReflectionWriterMixin {
StringBuffer get buffer;
void writeNgDepsModel(NgDepsModel model) {
void writeNgDepsModel(NgDepsModel model, String templateCode) {
if (model.libraryUri.isNotEmpty) {
buffer.writeln('library ${model.libraryUri}${TEMPLATE_EXTENSION};\n');
}
@ -161,16 +150,15 @@ abstract class NgDepsWriterMixin
writeExportModel(new ExportModel()..uri = model.sourceFile);
model.exports.forEach(writeExportModel);
buffer.writeln(templateCode);
buffer
..writeln('var _visited = false;')
..writeln('void ${SETUP_METHOD_NAME}() {')
..writeln('if (_visited) return; _visited = true;');
final needsReceiver =
(model.reflectables != null && model.reflectables.isNotEmpty) ||
(model.getters != null && model.getters.isNotEmpty) ||
(model.setters != null && model.setters.isNotEmpty) ||
(model.methods != null && model.methods.isNotEmpty);
final needsReceiver = (model.reflectables != null &&
model.reflectables.isNotEmpty);
if (needsReceiver) {
buffer.writeln('$REFLECTOR_PREFIX.$REFLECTOR_VAR_NAME');
@ -180,24 +168,6 @@ abstract class NgDepsWriterMixin
model.reflectables.forEach(writeRegistration);
}
if (model.getters != null && model.getters.isNotEmpty) {
buffer.writeln('..registerGetters({'
'${model.getters.map((g) => "'$g': (o) => o.$g").join(', ')}'
'})');
}
if (model.setters != null && model.setters.isNotEmpty) {
buffer.writeln('..registerSetters({'
'${model.setters.map((g) => "'$g': (o, v) => o.$g = v").join(', ')}'
'})');
}
if (model.methods != null && model.methods.isNotEmpty) {
buffer.writeln('..registerMethods({'
'${model.methods.map((g) => "'$g': (o, args) => o.$g.apply(args)").join(', ')}'
'})');
}
if (needsReceiver) {
buffer.writeln(';');
}

View File

@ -1,136 +0,0 @@
library angular2.transform.common.code.queries_code;
import 'package:analyzer/analyzer.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:angular2/src/transform/common/annotation_matcher.dart';
import 'package:angular2/src/transform/common/naive_eval.dart';
import 'package:barback/barback.dart';
/// Visitor responsbile for processing a [ClassDeclaration] and extracting any
/// query fields it defines.
class QueriesVisitor extends RecursiveAstVisitor<Iterable<String>> {
final _QueriesAnnotationVisitor _annotationVisitor;
final _propertyVisitor = new _QueriesPropertyVisitor();
QueriesVisitor(AssetId assetId, AnnotationMatcher annotationMatcher)
: _annotationVisitor =
new _QueriesAnnotationVisitor(assetId, annotationMatcher);
@override
Iterable<String> visitClassDeclaration(ClassDeclaration node) {
final queryFields = new Set<String>();
if (node.metadata != null) {
for (var annotation in node.metadata) {
var annotationQueryFields =
_annotationVisitor.visitAnnotation(annotation);
if (annotationQueryFields != null) {
queryFields.addAll(annotationQueryFields);
}
}
}
// Record annotations attached to properties.
if (node.members != null) {
for (var member in node.members) {
var queryProp = member.accept(_propertyVisitor);
if (queryProp != null) {
queryFields.add(queryProp);
}
}
}
return queryFields.isNotEmpty ? queryFields : null;
}
}
/// Visitor responsbile for processing properties and getters on a
/// [ClassDeclaration] and extracting any query fields it contains.
class _QueriesPropertyVisitor extends SimpleAstVisitor<String> {
@override
String visitFieldDeclaration(FieldDeclaration node) {
for (var variable in node.fields.variables) {
for (var meta in node.metadata) {
if (_isQueryAnnotation(meta)) {
return '${variable.name}';
}
}
}
return null;
}
@override
String visitMethodDeclaration(MethodDeclaration node) {
if (node.isGetter || node.isSetter) {
for (var meta in node.metadata) {
if (_isQueryAnnotation(meta)) {
return '${node.name}';
}
}
}
return null;
}
bool _isQueryAnnotation(Annotation node) {
// TODO(kegluenq): Use ClassMatcherBase to ensure this is a match.
var id = node.name;
final name = id is PrefixedIdentifier ? '${id.identifier}' : '$id';
switch (name) {
case "ContentChild":
case "ViewChild":
case "ContentChildren":
case "ViewChildren":
return true;
default:
return false;
}
}
}
/// Visitor responsible for processing the [Annotation]s on a [ClassDeclaration]
/// and extracting any query fields it contains.
class _QueriesAnnotationVisitor extends SimpleAstVisitor<Iterable<String>> {
/// The file we are processing.
final AssetId assetId;
/// Responsible for testing whether [Annotation]s are those recognized by
/// Angular 2, for example `@Component`.
final AnnotationMatcher _annotationMatcher;
/// All currently found query fields.
Set<String> _queryFields = null;
_QueriesAnnotationVisitor(this.assetId, this._annotationMatcher);
@override
Iterable<String> visitAnnotation(Annotation node) {
var queryFields = null;
if (_annotationMatcher.isView(node, assetId) ||
_annotationMatcher.isComponent(node, assetId)) {
queryFields = _queryFields = new Set<String>();
if (node.arguments != null && node.arguments.arguments != null) {
node.arguments.arguments.accept(this);
}
_queryFields = null;
}
return queryFields;
}
@override
Iterable<String> visitNamedExpression(NamedExpression node) {
if ('${node.name.label}' == "queries") {
if (node.expression is! MapLiteral) {
throw new FormatException(
'Expected a map value for "queries", but got ${node.expression}',
node.toSource());
}
final queries = node.expression as MapLiteral;
for (var entry in queries.entries) {
var queryField = naiveEval(entry.key);
if (queryField != NOT_A_CONSTANT) {
_queryFields.add(queryField.toString());
}
}
}
return null;
}
}

View File

@ -5,7 +5,6 @@ import 'package:angular2/src/transform/common/annotation_matcher.dart';
import 'package:angular2/src/transform/common/logging.dart';
import 'package:angular2/src/transform/common/model/reflection_info_model.pb.dart';
import 'package:angular2/src/transform/common/names.dart';
import 'package:angular2/src/transform/common/property_utils.dart';
import 'package:barback/barback.dart' show AssetId;
import 'annotation_code.dart';
@ -23,16 +22,15 @@ class ReflectionInfoVisitor extends RecursiveAstVisitor<ReflectionInfoModel> {
final AnnotationVisitor _annotationVisitor;
final ParameterVisitor _parameterVisitor = new ParameterVisitor();
final _PropertyMetadataVisitor _propMetadataVisitor;
ReflectionInfoVisitor._(this.assetId, this._annotationMatcher,
this._annotationVisitor, this._propMetadataVisitor);
this._annotationVisitor);
factory ReflectionInfoVisitor(
AssetId assetId, AnnotationMatcher annotationMatcher) {
var annotationVisitor = new AnnotationVisitor(assetId, annotationMatcher);
var annotationVisitor = new AnnotationVisitor(assetId);
return new ReflectionInfoVisitor._(assetId, annotationMatcher,
annotationVisitor, new _PropertyMetadataVisitor(annotationVisitor));
annotationVisitor);
}
ConstructorDeclaration _getCtor(ClassDeclaration node) {
@ -83,14 +81,21 @@ class ReflectionInfoVisitor extends RecursiveAstVisitor<ReflectionInfoModel> {
var componentPipes = new Iterable.empty();
var viewDirectives, viewPipes;
node.metadata.forEach((node) {
var keepAnnotation = true;
if (_annotationMatcher.isComponent(node, assetId)) {
componentDirectives = _extractReferencedTypes(node, 'directives');
componentPipes = _extractReferencedTypes(node, 'pipes');
keepAnnotation = false;
} else if (_annotationMatcher.isView(node, assetId)) {
viewDirectives = _extractReferencedTypes(node, 'directives');
viewPipes = _extractReferencedTypes(node, 'pipes');
keepAnnotation = false;
} else if (_annotationMatcher.isDirective(node, assetId)) {
keepAnnotation = false;
}
if (keepAnnotation) {
model.annotations.add(_annotationVisitor.visitAnnotation(node));
}
model.annotations.add(_annotationVisitor.visitAnnotation(node));
});
if ((componentDirectives.isNotEmpty || componentPipes.isNotEmpty) &&
(viewDirectives != null || viewPipes != null)) {
@ -122,43 +127,9 @@ class ReflectionInfoVisitor extends RecursiveAstVisitor<ReflectionInfoModel> {
.map((interface) => '${interface.name}'));
}
// Record annotations attached to properties.
for (var member in node.members) {
var propMetaList = member.accept(_propMetadataVisitor);
if (propMetaList != null) {
model.propertyMetadata.addAll(propMetaList);
}
}
_coalesce(model.propertyMetadata);
return model;
}
// If a class has a getter & a setter with the same name and each has
// individual metadata, collapse to a single entry.
void _coalesce(List<PropertyMetadataModel> propertyMetadata) {
if (propertyMetadata.isEmpty) return;
var firstSeenIdxMap = <String, int>{};
firstSeenIdxMap[propertyMetadata[0].name] = 0;
var i = 1;
while (i < propertyMetadata.length) {
var propName = propertyMetadata[i].name;
if (firstSeenIdxMap.containsKey(propName)) {
var propNameIdx = firstSeenIdxMap[propName];
// We have seen this name before, combine the metadata lists.
propertyMetadata[propNameIdx]
.annotations
.addAll(propertyMetadata[i].annotations);
// Remove the higher index, okay since we directly check `length` above.
propertyMetadata.removeAt(i);
} else {
firstSeenIdxMap[propName] = i;
++i;
}
}
}
/// Returns [PrefixedType] values parsed from the value of the
/// `fieldName` parameter of the provided `node`.
/// This will always return a non-null value, so if there is no field
@ -230,59 +201,6 @@ class ReflectionInfoVisitor extends RecursiveAstVisitor<ReflectionInfoModel> {
}
}
/// Visitor responsible for parsing [ClassMember]s into
/// [PropertyMetadataModel]s.
class _PropertyMetadataVisitor
extends SimpleAstVisitor<List<PropertyMetadataModel>> {
final AnnotationVisitor _annotationVisitor;
_PropertyMetadataVisitor(this._annotationVisitor);
@override
List<PropertyMetadataModel> visitFieldDeclaration(FieldDeclaration node) {
var retVal = null;
for (var variable in node.fields.variables) {
var propModel = null;
for (var meta in node.metadata) {
var annotationModel = meta.accept(_annotationVisitor);
if (annotationModel != null) {
if (propModel == null) {
propModel = new PropertyMetadataModel()..name = '${variable.name}';
}
propModel.annotations.add(annotationModel);
}
}
if (propModel != null && propModel.annotations.isNotEmpty) {
if (retVal == null) {
retVal = <PropertyMetadataModel>[];
}
retVal.add(propModel);
}
}
return retVal;
}
@override
List<PropertyMetadataModel> visitMethodDeclaration(MethodDeclaration node) {
if (node.isGetter || node.isSetter) {
var propModel = null;
for (var meta in node.metadata) {
var annotationModel = meta.accept(_annotationVisitor);
if (annotationModel != null) {
if (propModel == null) {
propModel = new PropertyMetadataModel()..name = '${node.name}';
}
propModel.annotations.add(annotationModel);
}
}
if (propModel != null && propModel.annotations.isNotEmpty) {
return <PropertyMetadataModel>[propModel];
}
}
return null;
}
}
/// Defines the format in which an [ReflectionInfoModel] is expressed as Dart
/// code when registered with the reflector.
abstract class ReflectionWriterMixin
@ -328,25 +246,9 @@ abstract class ReflectionWriterMixin
_writeListWithSeparator(model.parameters, writeParameterModelForImpl,
prefix: '(', suffix: ')');
// Interfaces
var hasPropertyMetadata =
model.propertyMetadata != null && model.propertyMetadata.isNotEmpty;
if (model.interfaces != null && model.interfaces.isNotEmpty) {
_writeListWithSeparator(model.interfaces, buffer.write,
prefix: ',\nconst [', suffix: ']');
} else if (hasPropertyMetadata) {
buffer.write(',\nconst []');
}
// Property Metadata
if (hasPropertyMetadata) {
buffer.write(',\nconst {');
for (var propMeta in model.propertyMetadata) {
if (propMeta != model.propertyMetadata.first) {
buffer.write(', ');
}
_writeListWithSeparator(propMeta.annotations, writeAnnotationModel,
prefix: "\n'${sanitize(propMeta.name)}': const [", suffix: ']');
}
buffer.write('}');
}
}
buffer.writeln(')\n)');

View File

@ -1,9 +1,8 @@
library angular2.transform.common.code.source_module;
import 'package:angular2/src/compiler/source_module.dart';
import 'package:angular2/src/compiler/offline_compiler.dart';
import 'package:analyzer/src/generated/scanner.dart' show Keyword;
import 'package:angular2/src/transform/common/model/ng_deps_model.pb.dart';
import 'package:angular2/src/transform/common/model/source_module.dart';
import 'ng_deps_code.dart';
@ -11,16 +10,11 @@ import 'ng_deps_code.dart';
String writeSourceModule(SourceModule sourceModule, {String libraryName}) {
if (sourceModule == null) return null;
var buf = new StringBuffer();
final writer = new NgDepsWriter(buf);
var sourceWithImports = sourceModule.getSourceWithImports();
libraryName = _sanitizeLibName(
libraryName != null ? libraryName : sourceModule.moduleUrl);
buf..writeln('library $libraryName;')..writeln();
extractImports(sourceWithImports, sourceModule.moduleUrl).forEach((import) {
writer.writeImportModel(import);
});
buf..writeln()..writeln(sourceWithImports.source);
buf..writeln()..writeln(sourceModule.source);
return buf.toString();
}
@ -32,18 +26,9 @@ void writeTemplateFile(
if (model == null) return null;
var sourceModuleCode = '';
if (sourceModule != null) {
var sourceWithImports = sourceModule.getSourceWithImports();
sourceModuleCode = sourceWithImports.source;
// Since we modify `imports`, make a copy to avoid changing the provided
// value.
var sourceModuleImports =
extractImports(sourceWithImports, sourceModule.moduleUrl);
model = model.clone();
model.imports.addAll(sourceModuleImports);
sourceModuleCode = sourceModule.source;
}
writer.writeNgDepsModel(model);
writer.buffer..writeln()..writeln(sourceModuleCode);
writer.writeNgDepsModel(model, sourceModuleCode);
}
final _unsafeCharsPattern = new RegExp(r'[^a-zA-Z0-9_\.]');

View File

@ -12,44 +12,44 @@ export 'class_matcher_base.dart' show ClassDescriptor;
const _ON_CHANGE_INTERFACES = const [
const ClassDescriptor('OnChanges', 'package:angular2/angular2.dart'),
const ClassDescriptor('OnChanges', 'package:angular2/lifecycle_hooks.dart'),
const ClassDescriptor('OnChanges', 'package:angular2/src/core/linker.dart'),
const ClassDescriptor('OnChanges', 'package:angular2/src/core/metadata.dart'),
const ClassDescriptor('OnChanges', 'package:angular2/core.dart'),
const ClassDescriptor(
'OnChanges', 'package:angular2/src/core/linker/interfaces.dart'),
'OnChanges', 'package:angular2/src/core/src/core/meta/lifecycle_hooks.dart'),
];
const _ON_DESTROY_INTERFACES = const [
const ClassDescriptor('OnDestroy', 'package:angular2/angular2.dart'),
const ClassDescriptor('OnDestroy', 'package:angular2/lifecycle_hooks.dart'),
const ClassDescriptor('OnDestroy', 'package:angular2/src/core/linker.dart'),
const ClassDescriptor('OnDestroy', 'package:angular2/src/core/metadata.dart'),
const ClassDescriptor('OnDestroy', 'package:angular2/core.dart'),
const ClassDescriptor(
'OnDestroy', 'package:angular2/src/core/linker/interfaces.dart'),
'OnDestroy', 'package:angular2/src/core/src/core/meta/lifecycle_hooks.dart'),
];
const _DO_CHECK_INTERFACES = const [
const ClassDescriptor('DoCheck', 'package:angular2/angular2.dart'),
const ClassDescriptor('DoCheck', 'package:angular2/lifecycle_hooks.dart'),
const ClassDescriptor('DoCheck', 'package:angular2/src/core/linker.dart'),
const ClassDescriptor('DoCheck', 'package:angular2/src/core/metadata.dart'),
const ClassDescriptor('DoCheck', 'package:angular2/core.dart'),
const ClassDescriptor(
'DoCheck', 'package:angular2/src/core/linker/interfaces.dart'),
'DoCheck', 'package:angular2/src/core/src/core/meta/lifecycle_hooks.dart'),
];
const _ON_INIT_INTERFACES = const [
const ClassDescriptor('OnInit', 'package:angular2/angular2.dart'),
const ClassDescriptor('OnInit', 'package:angular2/lifecycle_hooks.dart'),
const ClassDescriptor('OnInit', 'package:angular2/src/core/linker.dart'),
const ClassDescriptor('OnInit', 'package:angular2/src/core/metadata.dart'),
const ClassDescriptor('OnInit', 'package:angular2/core.dart'),
const ClassDescriptor(
'OnInit', 'package:angular2/src/core/linker/interfaces.dart'),
'OnInit', 'package:angular2/src/core/src/core/meta/lifecycle_hooks.dart'),
];
const _ON_AFTER_CONTENT_INIT_INTERFACES = const [
const ClassDescriptor('AfterContentInit', 'package:angular2/angular2.dart'),
const ClassDescriptor(
'AfterContentInit', 'package:angular2/lifecycle_hooks.dart'),
const ClassDescriptor(
'AfterContentInit', 'package:angular2/src/core/linker.dart'),
'AfterContentInit', 'package:angular2/src/core/metadata.dart'),
const ClassDescriptor('AfterContentInit', 'package:angular2/core.dart'),
const ClassDescriptor(
'AfterContentInit', 'package:angular2/src/core/linker/interfaces.dart')
'AfterContentInit', 'package:angular2/src/core/src/core/meta/lifecycle_hooks.dart')
];
const _ON_AFTER_CONTENT_CHECKED_INTERFACES = const [
const ClassDescriptor(
@ -57,30 +57,30 @@ const _ON_AFTER_CONTENT_CHECKED_INTERFACES = const [
const ClassDescriptor(
'AfterContentChecked', 'package:angular2/lifecycle_hooks.dart'),
const ClassDescriptor(
'AfterContentChecked', 'package:angular2/src/core/linker.dart'),
'AfterContentChecked', 'package:angular2/src/core/metadata.dart'),
const ClassDescriptor('AfterContentChecked', 'package:angular2/core.dart'),
const ClassDescriptor(
'AfterContentChecked', 'package:angular2/src/core/linker/interfaces.dart')
'AfterContentChecked', 'package:angular2/src/core/src/core/meta/lifecycle_hooks.dart')
];
const _ON_AFTER_VIEW_INIT_INTERFACES = const [
const ClassDescriptor('AfterViewInit', 'package:angular2/angular2.dart'),
const ClassDescriptor(
'AfterViewInit', 'package:angular2/lifecycle_hooks.dart'),
const ClassDescriptor(
'AfterViewInit', 'package:angular2/src/core/linker.dart'),
'AfterViewInit', 'package:angular2/src/core/metadata.dart'),
const ClassDescriptor('AfterViewInit', 'package:angular2/core.dart'),
const ClassDescriptor(
'AfterViewInit', 'package:angular2/src/core/linker/interfaces.dart')
'AfterViewInit', 'package:angular2/src/core/src/core/meta/lifecycle_hooks.dart')
];
const _ON_AFTER_VIEW_CHECKED_INTERFACES = const [
const ClassDescriptor('AfterViewChecked', 'package:angular2/angular2.dart'),
const ClassDescriptor(
'AfterViewChecked', 'package:angular2/lifecycle_hooks.dart'),
const ClassDescriptor(
'AfterViewChecked', 'package:angular2/src/core/linker.dart'),
'AfterViewChecked', 'package:angular2/src/core/metadata.dart'),
const ClassDescriptor('AfterViewChecked', 'package:angular2/core.dart'),
const ClassDescriptor(
'AfterViewChecked', 'package:angular2/src/core/linker/interfaces.dart')
'AfterViewChecked', 'package:angular2/src/core/src/core/meta/lifecycle_hooks.dart')
];
/// Checks if a given [Annotation] matches any of the given

View File

@ -8,91 +8,64 @@ import 'package:protobuf/protobuf.dart';
class NamedParameter extends GeneratedMessage {
static final BuilderInfo _i = new BuilderInfo('NamedParameter')
..a(1, 'name', PbFieldType.QS)
..a(2, 'value', PbFieldType.QS);
..a(2, 'value', PbFieldType.QS)
;
NamedParameter() : super();
NamedParameter.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
NamedParameter.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
NamedParameter.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
NamedParameter.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
NamedParameter clone() => new NamedParameter()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static NamedParameter create() => new NamedParameter();
static PbList<NamedParameter> createRepeated() =>
new PbList<NamedParameter>();
static PbList<NamedParameter> createRepeated() => new PbList<NamedParameter>();
static NamedParameter getDefault() {
if (_defaultInstance == null)
_defaultInstance = new _ReadonlyNamedParameter();
if (_defaultInstance == null) _defaultInstance = new _ReadonlyNamedParameter();
return _defaultInstance;
}
static NamedParameter _defaultInstance;
static void $checkItem(NamedParameter v) {
if (v is! NamedParameter) checkItemFailed(v, 'NamedParameter');
if (v is !NamedParameter) checkItemFailed(v, 'NamedParameter');
}
String get name => $_get(0, 1, '');
void set name(String v) {
$_setString(0, 1, v);
}
void set name(String v) { $_setString(0, 1, v); }
bool hasName() => $_has(0, 1);
void clearName() => clearField(1);
String get value => $_get(1, 2, '');
void set value(String v) {
$_setString(1, 2, v);
}
void set value(String v) { $_setString(1, 2, v); }
bool hasValue() => $_has(1, 2);
void clearValue() => clearField(2);
}
class _ReadonlyNamedParameter extends NamedParameter with ReadonlyMessageMixin {
}
class _ReadonlyNamedParameter extends NamedParameter with ReadonlyMessageMixin {}
class AnnotationModel extends GeneratedMessage {
static final BuilderInfo _i = new BuilderInfo('AnnotationModel')
..a(1, 'name', PbFieldType.QS)
..p(2, 'parameters', PbFieldType.PS)
..pp(3, 'namedParameters', PbFieldType.PM, NamedParameter.$checkItem,
NamedParameter.create)
..a(4, 'isView', PbFieldType.OB)
..a(5, 'isDirective', PbFieldType.OB)
..a(6, 'isComponent', PbFieldType.OB)
..a(7, 'isInjectable', PbFieldType.OB)
..a(8, 'isConstObject', PbFieldType.OB);
..pp(3, 'namedParameters', PbFieldType.PM, NamedParameter.$checkItem, NamedParameter.create)
..a(4, 'isConstObject', PbFieldType.OB)
;
AnnotationModel() : super();
AnnotationModel.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
AnnotationModel.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
AnnotationModel.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
AnnotationModel.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
AnnotationModel clone() => new AnnotationModel()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static AnnotationModel create() => new AnnotationModel();
static PbList<AnnotationModel> createRepeated() =>
new PbList<AnnotationModel>();
static PbList<AnnotationModel> createRepeated() => new PbList<AnnotationModel>();
static AnnotationModel getDefault() {
if (_defaultInstance == null)
_defaultInstance = new _ReadonlyAnnotationModel();
if (_defaultInstance == null) _defaultInstance = new _ReadonlyAnnotationModel();
return _defaultInstance;
}
static AnnotationModel _defaultInstance;
static void $checkItem(AnnotationModel v) {
if (v is! AnnotationModel) checkItemFailed(v, 'AnnotationModel');
if (v is !AnnotationModel) checkItemFailed(v, 'AnnotationModel');
}
String get name => $_get(0, 1, '');
void set name(String v) {
$_setString(0, 1, v);
}
void set name(String v) { $_setString(0, 1, v); }
bool hasName() => $_has(0, 1);
void clearName() => clearField(1);
@ -100,49 +73,13 @@ class AnnotationModel extends GeneratedMessage {
List<NamedParameter> get namedParameters => $_get(2, 3, null);
bool get isView => $_get(3, 4, false);
void set isView(bool v) {
$_setBool(3, 4, v);
}
bool hasIsView() => $_has(3, 4);
void clearIsView() => clearField(4);
bool get isDirective => $_get(4, 5, false);
void set isDirective(bool v) {
$_setBool(4, 5, v);
}
bool hasIsDirective() => $_has(4, 5);
void clearIsDirective() => clearField(5);
bool get isComponent => $_get(5, 6, false);
void set isComponent(bool v) {
$_setBool(5, 6, v);
}
bool hasIsComponent() => $_has(5, 6);
void clearIsComponent() => clearField(6);
bool get isInjectable => $_get(6, 7, false);
void set isInjectable(bool v) {
$_setBool(6, 7, v);
}
bool hasIsInjectable() => $_has(6, 7);
void clearIsInjectable() => clearField(7);
bool get isConstObject => $_get(7, 8, false);
void set isConstObject(bool v) {
$_setBool(7, 8, v);
}
bool hasIsConstObject() => $_has(7, 8);
void clearIsConstObject() => clearField(8);
bool get isConstObject => $_get(3, 4, false);
void set isConstObject(bool v) { $_setBool(3, 4, v); }
bool hasIsConstObject() => $_has(3, 4);
void clearIsConstObject() => clearField(4);
}
class _ReadonlyAnnotationModel extends AnnotationModel
with ReadonlyMessageMixin {}
class _ReadonlyAnnotationModel extends AnnotationModel with ReadonlyMessageMixin {}
const NamedParameter$json = const {
'1': 'NamedParameter',
@ -157,24 +94,14 @@ const AnnotationModel$json = const {
'2': const [
const {'1': 'name', '3': 1, '4': 2, '5': 9},
const {'1': 'parameters', '3': 2, '4': 3, '5': 9},
const {
'1': 'named_parameters',
'3': 3,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.NamedParameter'
},
const {'1': 'is_view', '3': 4, '4': 1, '5': 8},
const {'1': 'is_directive', '3': 5, '4': 1, '5': 8},
const {'1': 'is_component', '3': 6, '4': 1, '5': 8},
const {'1': 'is_injectable', '3': 7, '4': 1, '5': 8},
const {'1': 'is_const_object', '3': 8, '4': 1, '5': 8},
const {'1': 'named_parameters', '3': 3, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.NamedParameter'},
const {'1': 'is_const_object', '3': 4, '4': 1, '5': 8},
],
};
/**
* Generated with:
* annotation_model.proto (93cb7c1fba2e56d937fec054b6e119a2a2b9afe7)
* libprotoc 2.6.1
* annotation_model.proto (a7c9ec37cbc4916ddc7b132710da0856fa76cb5a)
* libprotoc 3.0.0
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
*/

View File

@ -18,23 +18,8 @@ message AnnotationModel {
// The named parameters provided to the annotation.
repeated NamedParameter named_parameters = 3;
// Whether this is a `View` annotation.
optional bool is_view = 4;
// Whether this is a `Directive` annotation. This takes inheritance into
// account, that is, this should be true if `is_component` is true.
optional bool is_directive = 5;
// Whether this is a `Component` annotation.
optional bool is_component = 6;
// Whether this is an `Injectable` annotation. This takes inheritance into
// account, that is, this should be true if `is_directive` and/or
// `is_component` is true.
optional bool is_injectable = 7;
// Whether this annotation is a constant object (for example, `@override`) as
// opposed to a const instance creation expression
// (for example, `@Injectable()`).
optional bool is_const_object = 8;
optional bool is_const_object = 4;
}

View File

@ -11,15 +11,12 @@ class ImportModel extends GeneratedMessage {
..p(2, 'showCombinators', PbFieldType.PS)
..p(3, 'hideCombinators', PbFieldType.PS)
..a(4, 'prefix', PbFieldType.OS)
..a(5, 'isDeferred', PbFieldType.OB);
..a(5, 'isDeferred', PbFieldType.OB)
;
ImportModel() : super();
ImportModel.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
ImportModel.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
ImportModel.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
ImportModel.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
ImportModel clone() => new ImportModel()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static ImportModel create() => new ImportModel();
@ -28,17 +25,13 @@ class ImportModel extends GeneratedMessage {
if (_defaultInstance == null) _defaultInstance = new _ReadonlyImportModel();
return _defaultInstance;
}
static ImportModel _defaultInstance;
static void $checkItem(ImportModel v) {
if (v is! ImportModel) checkItemFailed(v, 'ImportModel');
if (v is !ImportModel) checkItemFailed(v, 'ImportModel');
}
String get uri => $_get(0, 1, '');
void set uri(String v) {
$_setString(0, 1, v);
}
void set uri(String v) { $_setString(0, 1, v); }
bool hasUri() => $_has(0, 1);
void clearUri() => clearField(1);
@ -47,18 +40,12 @@ class ImportModel extends GeneratedMessage {
List<String> get hideCombinators => $_get(2, 3, null);
String get prefix => $_get(3, 4, '');
void set prefix(String v) {
$_setString(3, 4, v);
}
void set prefix(String v) { $_setString(3, 4, v); }
bool hasPrefix() => $_has(3, 4);
void clearPrefix() => clearField(4);
bool get isDeferred => $_get(4, 5, false);
void set isDeferred(bool v) {
$_setBool(4, 5, v);
}
void set isDeferred(bool v) { $_setBool(4, 5, v); }
bool hasIsDeferred() => $_has(4, 5);
void clearIsDeferred() => clearField(5);
}
@ -69,15 +56,12 @@ class ExportModel extends GeneratedMessage {
static final BuilderInfo _i = new BuilderInfo('ExportModel')
..a(1, 'uri', PbFieldType.QS)
..p(2, 'showCombinators', PbFieldType.PS)
..p(3, 'hideCombinators', PbFieldType.PS);
..p(3, 'hideCombinators', PbFieldType.PS)
;
ExportModel() : super();
ExportModel.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
ExportModel.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
ExportModel.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
ExportModel.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
ExportModel clone() => new ExportModel()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static ExportModel create() => new ExportModel();
@ -86,17 +70,13 @@ class ExportModel extends GeneratedMessage {
if (_defaultInstance == null) _defaultInstance = new _ReadonlyExportModel();
return _defaultInstance;
}
static ExportModel _defaultInstance;
static void $checkItem(ExportModel v) {
if (v is! ExportModel) checkItemFailed(v, 'ExportModel');
if (v is !ExportModel) checkItemFailed(v, 'ExportModel');
}
String get uri => $_get(0, 1, '');
void set uri(String v) {
$_setString(0, 1, v);
}
void set uri(String v) { $_setString(0, 1, v); }
bool hasUri() => $_has(0, 1);
void clearUri() => clearField(1);
@ -130,6 +110,6 @@ const ExportModel$json = const {
/**
* Generated with:
* import_export_model.proto (36a3a72d0884b84b451b7188ffa1fc93b44e7b62)
* libprotoc 2.6.1
* libprotoc 3.0.0
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
*/

View File

@ -11,26 +11,16 @@ class NgDepsModel extends GeneratedMessage {
static final BuilderInfo _i = new BuilderInfo('NgDepsModel')
..a(1, 'libraryUri', PbFieldType.OS)
..p(2, 'partUris', PbFieldType.PS)
..pp(3, 'imports', PbFieldType.PM, ImportModel.$checkItem,
ImportModel.create)
..pp(4, 'exports', PbFieldType.PM, ExportModel.$checkItem,
ExportModel.create)
..pp(5, 'reflectables', PbFieldType.PM, ReflectionInfoModel.$checkItem,
ReflectionInfoModel.create)
..pp(3, 'imports', PbFieldType.PM, ImportModel.$checkItem, ImportModel.create)
..pp(4, 'exports', PbFieldType.PM, ExportModel.$checkItem, ExportModel.create)
..pp(5, 'reflectables', PbFieldType.PM, ReflectionInfoModel.$checkItem, ReflectionInfoModel.create)
..a(6, 'sourceFile', PbFieldType.OS)
..p(7, 'getters', PbFieldType.PS)
..p(8, 'setters', PbFieldType.PS)
..p(9, 'methods', PbFieldType.PS)
..pp(10, 'depImports', PbFieldType.PM, ImportModel.$checkItem,
ImportModel.create);
..pp(7, 'depImports', PbFieldType.PM, ImportModel.$checkItem, ImportModel.create)
;
NgDepsModel() : super();
NgDepsModel.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
NgDepsModel.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
NgDepsModel.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
NgDepsModel.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
NgDepsModel clone() => new NgDepsModel()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static NgDepsModel create() => new NgDepsModel();
@ -39,17 +29,13 @@ class NgDepsModel extends GeneratedMessage {
if (_defaultInstance == null) _defaultInstance = new _ReadonlyNgDepsModel();
return _defaultInstance;
}
static NgDepsModel _defaultInstance;
static void $checkItem(NgDepsModel v) {
if (v is! NgDepsModel) checkItemFailed(v, 'NgDepsModel');
if (v is !NgDepsModel) checkItemFailed(v, 'NgDepsModel');
}
String get libraryUri => $_get(0, 1, '');
void set libraryUri(String v) {
$_setString(0, 1, v);
}
void set libraryUri(String v) { $_setString(0, 1, v); }
bool hasLibraryUri() => $_has(0, 1);
void clearLibraryUri() => clearField(1);
@ -62,20 +48,11 @@ class NgDepsModel extends GeneratedMessage {
List<ReflectionInfoModel> get reflectables => $_get(4, 5, null);
String get sourceFile => $_get(5, 6, '');
void set sourceFile(String v) {
$_setString(5, 6, v);
}
void set sourceFile(String v) { $_setString(5, 6, v); }
bool hasSourceFile() => $_has(5, 6);
void clearSourceFile() => clearField(6);
List<String> get getters => $_get(6, 7, null);
List<String> get setters => $_get(7, 8, null);
List<String> get methods => $_get(8, 9, null);
List<ImportModel> get depImports => $_get(9, 10, null);
List<ImportModel> get depImports => $_get(6, 7, null);
}
class _ReadonlyNgDepsModel extends NgDepsModel with ReadonlyMessageMixin {}
@ -85,44 +62,17 @@ const NgDepsModel$json = const {
'2': const [
const {'1': 'library_uri', '3': 1, '4': 1, '5': 9},
const {'1': 'part_uris', '3': 2, '4': 3, '5': 9},
const {
'1': 'imports',
'3': 3,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.ImportModel'
},
const {
'1': 'exports',
'3': 4,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.ExportModel'
},
const {
'1': 'reflectables',
'3': 5,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.ReflectionInfoModel'
},
const {'1': 'imports', '3': 3, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.ImportModel'},
const {'1': 'exports', '3': 4, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.ExportModel'},
const {'1': 'reflectables', '3': 5, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.ReflectionInfoModel'},
const {'1': 'source_file', '3': 6, '4': 1, '5': 9},
const {'1': 'getters', '3': 7, '4': 3, '5': 9},
const {'1': 'setters', '3': 8, '4': 3, '5': 9},
const {'1': 'methods', '3': 9, '4': 3, '5': 9},
const {
'1': 'dep_imports',
'3': 10,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.ImportModel'
},
const {'1': 'dep_imports', '3': 7, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.ImportModel'},
],
};
/**
* Generated with:
* ng_deps_model.proto (03511db92c8cfa3c1279d845be8fd7de36de3ee1)
* libprotoc 2.6.1
* ng_deps_model.proto (5c881da448125df1d4eefec6ec3e7b7b6c5c25c0)
* libprotoc 3.0.0
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
*/

View File

@ -21,19 +21,7 @@ message NgDepsModel {
// Example: component.dart
optional string source_file = 6;
// The names of getters that should be registered in the Angular 2 reflection
// framework.
repeated string getters = 7;
// The names of setters that should be registered in the Angular 2 reflection
// framework.
repeated string setters = 8;
// The names of methods that should be registered in the Angular 2 reflection
// framework.
repeated string methods = 9;
// Imports of the generated files associated with the declared `imports`
// and `exports` of the source file.
repeated ImportModel dep_imports = 10;
repeated ImportModel dep_imports = 7;
}

View File

@ -11,60 +11,44 @@ class ParameterModel extends GeneratedMessage {
..a(2, 'typeArgs', PbFieldType.OS)
..p(3, 'metadata', PbFieldType.PS)
..a(4, 'paramName', PbFieldType.OS)
..hasRequiredFields = false;
..hasRequiredFields = false
;
ParameterModel() : super();
ParameterModel.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
ParameterModel.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
ParameterModel.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
ParameterModel.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
ParameterModel clone() => new ParameterModel()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static ParameterModel create() => new ParameterModel();
static PbList<ParameterModel> createRepeated() =>
new PbList<ParameterModel>();
static PbList<ParameterModel> createRepeated() => new PbList<ParameterModel>();
static ParameterModel getDefault() {
if (_defaultInstance == null)
_defaultInstance = new _ReadonlyParameterModel();
if (_defaultInstance == null) _defaultInstance = new _ReadonlyParameterModel();
return _defaultInstance;
}
static ParameterModel _defaultInstance;
static void $checkItem(ParameterModel v) {
if (v is! ParameterModel) checkItemFailed(v, 'ParameterModel');
if (v is !ParameterModel) checkItemFailed(v, 'ParameterModel');
}
String get typeName => $_get(0, 1, '');
void set typeName(String v) {
$_setString(0, 1, v);
}
void set typeName(String v) { $_setString(0, 1, v); }
bool hasTypeName() => $_has(0, 1);
void clearTypeName() => clearField(1);
String get typeArgs => $_get(1, 2, '');
void set typeArgs(String v) {
$_setString(1, 2, v);
}
void set typeArgs(String v) { $_setString(1, 2, v); }
bool hasTypeArgs() => $_has(1, 2);
void clearTypeArgs() => clearField(2);
List<String> get metadata => $_get(2, 3, null);
String get paramName => $_get(3, 4, '');
void set paramName(String v) {
$_setString(3, 4, v);
}
void set paramName(String v) { $_setString(3, 4, v); }
bool hasParamName() => $_has(3, 4);
void clearParamName() => clearField(4);
}
class _ReadonlyParameterModel extends ParameterModel with ReadonlyMessageMixin {
}
class _ReadonlyParameterModel extends ParameterModel with ReadonlyMessageMixin {}
const ParameterModel$json = const {
'1': 'ParameterModel',
@ -79,6 +63,6 @@ const ParameterModel$json = const {
/**
* Generated with:
* parameter_model.proto (2a97dcb9a65b199f50fba67120a85590bceb083a)
* libprotoc 2.6.1
* libprotoc 3.0.0
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
*/

View File

@ -7,92 +7,36 @@ import 'package:protobuf/protobuf.dart';
import 'annotation_model.pb.dart';
import 'parameter_model.pb.dart';
class PropertyMetadataModel extends GeneratedMessage {
static final BuilderInfo _i = new BuilderInfo('PropertyMetadataModel')
..a(1, 'name', PbFieldType.QS)
..pp(2, 'annotations', PbFieldType.PM, AnnotationModel.$checkItem,
AnnotationModel.create);
PropertyMetadataModel() : super();
PropertyMetadataModel.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
PropertyMetadataModel.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
PropertyMetadataModel clone() =>
new PropertyMetadataModel()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static PropertyMetadataModel create() => new PropertyMetadataModel();
static PbList<PropertyMetadataModel> createRepeated() =>
new PbList<PropertyMetadataModel>();
static PropertyMetadataModel getDefault() {
if (_defaultInstance == null)
_defaultInstance = new _ReadonlyPropertyMetadataModel();
return _defaultInstance;
}
static PropertyMetadataModel _defaultInstance;
static void $checkItem(PropertyMetadataModel v) {
if (v is! PropertyMetadataModel)
checkItemFailed(v, 'PropertyMetadataModel');
}
String get name => $_get(0, 1, '');
void set name(String v) {
$_setString(0, 1, v);
}
bool hasName() => $_has(0, 1);
void clearName() => clearField(1);
List<AnnotationModel> get annotations => $_get(1, 2, null);
}
class _ReadonlyPropertyMetadataModel extends PropertyMetadataModel
with ReadonlyMessageMixin {}
class PrefixedType extends GeneratedMessage {
static final BuilderInfo _i = new BuilderInfo('PrefixedType')
..a(1, 'prefix', PbFieldType.OS)
..a(2, 'name', PbFieldType.OS)
..hasRequiredFields = false;
..hasRequiredFields = false
;
PrefixedType() : super();
PrefixedType.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
PrefixedType.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
PrefixedType.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
PrefixedType.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
PrefixedType clone() => new PrefixedType()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static PrefixedType create() => new PrefixedType();
static PbList<PrefixedType> createRepeated() => new PbList<PrefixedType>();
static PrefixedType getDefault() {
if (_defaultInstance == null)
_defaultInstance = new _ReadonlyPrefixedType();
if (_defaultInstance == null) _defaultInstance = new _ReadonlyPrefixedType();
return _defaultInstance;
}
static PrefixedType _defaultInstance;
static void $checkItem(PrefixedType v) {
if (v is! PrefixedType) checkItemFailed(v, 'PrefixedType');
if (v is !PrefixedType) checkItemFailed(v, 'PrefixedType');
}
String get prefix => $_get(0, 1, '');
void set prefix(String v) {
$_setString(0, 1, v);
}
void set prefix(String v) { $_setString(0, 1, v); }
bool hasPrefix() => $_has(0, 1);
void clearPrefix() => clearField(1);
String get name => $_get(1, 2, '');
void set name(String v) {
$_setString(1, 2, v);
}
void set name(String v) { $_setString(1, 2, v); }
bool hasName() => $_has(1, 2);
void clearName() => clearField(2);
}
@ -104,63 +48,41 @@ class ReflectionInfoModel extends GeneratedMessage {
..a(1, 'name', PbFieldType.QS)
..a(2, 'ctorName', PbFieldType.OS)
..a(3, 'isFunction', PbFieldType.OB)
..pp(4, 'annotations', PbFieldType.PM, AnnotationModel.$checkItem,
AnnotationModel.create)
..pp(5, 'parameters', PbFieldType.PM, ParameterModel.$checkItem,
ParameterModel.create)
..pp(4, 'annotations', PbFieldType.PM, AnnotationModel.$checkItem, AnnotationModel.create)
..pp(5, 'parameters', PbFieldType.PM, ParameterModel.$checkItem, ParameterModel.create)
..p(6, 'interfaces', PbFieldType.PS)
..pp(7, 'propertyMetadata', PbFieldType.PM,
PropertyMetadataModel.$checkItem, PropertyMetadataModel.create)
..pp(8, 'directives', PbFieldType.PM, PrefixedType.$checkItem,
PrefixedType.create)
..pp(9, 'pipes', PbFieldType.PM, PrefixedType.$checkItem,
PrefixedType.create);
..pp(7, 'directives', PbFieldType.PM, PrefixedType.$checkItem, PrefixedType.create)
..pp(8, 'pipes', PbFieldType.PM, PrefixedType.$checkItem, PrefixedType.create)
;
ReflectionInfoModel() : super();
ReflectionInfoModel.fromBuffer(List<int> i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromBuffer(i, r);
ReflectionInfoModel.fromJson(String i,
[ExtensionRegistry r = ExtensionRegistry.EMPTY])
: super.fromJson(i, r);
ReflectionInfoModel clone() =>
new ReflectionInfoModel()..mergeFromMessage(this);
ReflectionInfoModel.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
ReflectionInfoModel.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
ReflectionInfoModel clone() => new ReflectionInfoModel()..mergeFromMessage(this);
BuilderInfo get info_ => _i;
static ReflectionInfoModel create() => new ReflectionInfoModel();
static PbList<ReflectionInfoModel> createRepeated() =>
new PbList<ReflectionInfoModel>();
static PbList<ReflectionInfoModel> createRepeated() => new PbList<ReflectionInfoModel>();
static ReflectionInfoModel getDefault() {
if (_defaultInstance == null)
_defaultInstance = new _ReadonlyReflectionInfoModel();
if (_defaultInstance == null) _defaultInstance = new _ReadonlyReflectionInfoModel();
return _defaultInstance;
}
static ReflectionInfoModel _defaultInstance;
static void $checkItem(ReflectionInfoModel v) {
if (v is! ReflectionInfoModel) checkItemFailed(v, 'ReflectionInfoModel');
if (v is !ReflectionInfoModel) checkItemFailed(v, 'ReflectionInfoModel');
}
String get name => $_get(0, 1, '');
void set name(String v) {
$_setString(0, 1, v);
}
void set name(String v) { $_setString(0, 1, v); }
bool hasName() => $_has(0, 1);
void clearName() => clearField(1);
String get ctorName => $_get(1, 2, '');
void set ctorName(String v) {
$_setString(1, 2, v);
}
void set ctorName(String v) { $_setString(1, 2, v); }
bool hasCtorName() => $_has(1, 2);
void clearCtorName() => clearField(2);
bool get isFunction => $_get(2, 3, false);
void set isFunction(bool v) {
$_setBool(2, 3, v);
}
void set isFunction(bool v) { $_setBool(2, 3, v); }
bool hasIsFunction() => $_has(2, 3);
void clearIsFunction() => clearField(3);
@ -170,29 +92,12 @@ class ReflectionInfoModel extends GeneratedMessage {
List<String> get interfaces => $_get(5, 6, null);
List<PropertyMetadataModel> get propertyMetadata => $_get(6, 7, null);
List<PrefixedType> get directives => $_get(6, 7, null);
List<PrefixedType> get directives => $_get(7, 8, null);
List<PrefixedType> get pipes => $_get(8, 9, null);
List<PrefixedType> get pipes => $_get(7, 8, null);
}
class _ReadonlyReflectionInfoModel extends ReflectionInfoModel
with ReadonlyMessageMixin {}
const PropertyMetadataModel$json = const {
'1': 'PropertyMetadataModel',
'2': const [
const {'1': 'name', '3': 1, '4': 2, '5': 9},
const {
'1': 'annotations',
'3': 2,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.AnnotationModel'
},
],
};
class _ReadonlyReflectionInfoModel extends ReflectionInfoModel with ReadonlyMessageMixin {}
const PrefixedType$json = const {
'1': 'PrefixedType',
@ -208,48 +113,17 @@ const ReflectionInfoModel$json = const {
const {'1': 'name', '3': 1, '4': 2, '5': 9},
const {'1': 'ctor_name', '3': 2, '4': 1, '5': 9},
const {'1': 'is_function', '3': 3, '4': 1, '5': 8},
const {
'1': 'annotations',
'3': 4,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.AnnotationModel'
},
const {
'1': 'parameters',
'3': 5,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.ParameterModel'
},
const {'1': 'annotations', '3': 4, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.AnnotationModel'},
const {'1': 'parameters', '3': 5, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.ParameterModel'},
const {'1': 'interfaces', '3': 6, '4': 3, '5': 9},
const {
'1': 'propertyMetadata',
'3': 7,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.PropertyMetadataModel'
},
const {
'1': 'directives',
'3': 8,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.PrefixedType'
},
const {
'1': 'pipes',
'3': 9,
'4': 3,
'5': 11,
'6': '.angular2.src.transform.common.model.proto.PrefixedType'
},
const {'1': 'directives', '3': 7, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.PrefixedType'},
const {'1': 'pipes', '3': 8, '4': 3, '5': 11, '6': '.angular2.src.transform.common.model.proto.PrefixedType'},
],
};
/**
* Generated with:
* reflection_info_model.proto (7670e589733b1190f9b4f1c9b42f90a613975afd)
* libprotoc 2.6.1
* reflection_info_model.proto (c5cb9bba874abdca05cc0e4d69b66b7faa12fc1a)
* libprotoc 3.0.0
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
*/

View File

@ -5,14 +5,6 @@ import "parameter_model.proto";
package angular2.src.transform.common.model.proto;
message PropertyMetadataModel {
// The name of the property with metadata attached.
required string name = 1;
// The metadata attached to the property.
repeated AnnotationModel annotations = 2;
}
message PrefixedType {
// The prefix used to reference this Type, if any.
optional string prefix = 1;
@ -39,13 +31,10 @@ message ReflectionInfoModel {
repeated string interfaces = 6;
// Entries for all properties with associated metadata.
repeated PropertyMetadataModel propertyMetadata = 7;
// Directive dependencies parsed from the @View or @Component `directives`
// parameter.
repeated PrefixedType directives = 8;
repeated PrefixedType directives = 7;
// Pipe dependencies parsed from the @View or @Component `pipes` parameter.
repeated PrefixedType pipes = 9;
repeated PrefixedType pipes = 8;
}

View File

@ -2,37 +2,17 @@ library angular2.transform.common.model.source_module;
import 'package:path/path.dart' as path;
import 'package:angular2/src/compiler/source_module.dart';
import 'package:angular2/src/transform/common/url_resolver.dart';
import 'import_export_model.pb.dart';
/// Generates [ImportModel]s for all imports in `sourceWithImports`.
///
/// Imports in `sourceWithImports` are resolved relative to `moduleUrl`.
List<ImportModel> extractImports(
SourceWithImports sourceWithImports, String moduleUrl) {
if (sourceWithImports == null) return const <ImportModel>[];
return sourceWithImports.imports.map((import) {
// Format for importLine := [uri, prefix]
if (import.length != 2) {
throw new FormatException(
'Internal Angular 2 compiler error. '
'Angular 2 compiler returned imports in an unexpected format. '
'Expected [<import_uri>, <prefix>].',
import.join(', '));
}
return toImportModel(import[0], prefix: import[1], fromAbsolute: moduleUrl);
}).toList();
}
/// Generates an [ImportModel] for the file specified by `importPath`.
///
/// If `fromAbsolute` is specified, `importPath` may be a relative path,
/// otherwise it is expected to be absolute.
ImportModel toImportModel(String importPath,
{String prefix, String fromAbsolute}) {
var urlResolver = const TransformerUrlResolver();
var urlResolver = createOfflineCompileUrlResolver();
var codegenImportPath;
var importUri =

View File

@ -14,9 +14,6 @@ const REFLECTION_CAPABILITIES_NAME = 'ReflectionCapabilities';
const REFLECTOR_IMPORT = 'package:angular2/src/core/reflection/reflection.dart';
const REFLECTOR_PREFIX = '_ngRef';
const REGISTER_TYPE_METHOD_NAME = 'registerType';
const REGISTER_GETTERS_METHOD_NAME = 'registerGetters';
const REGISTER_SETTERS_METHOD_NAME = 'registerSetters';
const REGISTER_METHODS_METHOD_NAME = 'registerMethods';
const SUMMARY_META_EXTENSION = '.ng_summary.json';
const TEMPLATE_EXTENSION = '.template.dart';

View File

@ -1,28 +1,27 @@
library angular2.transform.template_compiler.ng_compiler;
import 'package:angular2/src/compiler/view_compiler.dart';
import 'package:angular2/src/compiler/config.dart';
import 'package:angular2/src/compiler/view_compiler/view_compiler.dart';
import 'package:angular2/src/compiler/html_parser.dart';
import 'package:angular2/src/compiler/style_compiler.dart';
import 'package:angular2/src/compiler/template_compiler.dart';
import 'package:angular2/src/compiler/template_normalizer.dart';
import 'package:angular2/src/compiler/offline_compiler.dart';
import 'package:angular2/src/compiler/directive_normalizer.dart';
import 'package:angular2/src/compiler/template_parser.dart';
import 'package:angular2/src/core/change_detection/parser/lexer.dart' as ng;
import 'package:angular2/src/core/change_detection/parser/parser.dart' as ng;
import 'package:angular2/src/compiler/expression_parser/lexer.dart' as ng;
import 'package:angular2/src/compiler/expression_parser/parser.dart' as ng;
import 'package:angular2/src/compiler/schema/dom_element_schema_registry.dart';
import 'package:angular2/src/compiler/output/dart_emitter.dart';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/core/change_detection/interfaces.dart';
import 'package:angular2/src/compiler/change_detector_compiler.dart';
import 'package:angular2/router/router_link_dsl.dart';
import 'package:angular2/src/compiler/proto_view_compiler.dart';
import 'package:angular2/i18n.dart';
import 'xhr_impl.dart';
import 'url_resolver.dart';
TemplateCompiler createTemplateCompiler(AssetReader reader,
{ChangeDetectorGenConfig changeDetectionConfig, XmbDeserializationResult translations}) {
OfflineCompiler createTemplateCompiler(AssetReader reader,
{CompilerConfig compilerConfig, XmbDeserializationResult translations}) {
var _xhr = new XhrImpl(reader);
var _urlResolver = const TransformerUrlResolver();
var _urlResolver = createOfflineCompileUrlResolver();
// TODO(yjbanov): add router AST transformer when ready
var parser = new ng.Parser(new ng.Lexer());
@ -34,20 +33,13 @@ TemplateCompiler createTemplateCompiler(AssetReader reader,
_htmlParser,
[new RouterLinkTransform(parser)]);
var cdCompiler = changeDetectionConfig != null
? new ChangeDetectionCompiler(changeDetectionConfig)
: null;
return new TemplateCompiler(
null /* RuntimeMetadataResolver */,
new TemplateNormalizer(_xhr, _urlResolver, _htmlParser),
templateParser,
new StyleCompiler(_xhr, _urlResolver),
cdCompiler,
new ProtoViewCompiler(),
new ViewCompiler(),
null /* ResolvedMetadataCache */,
changeDetectionConfig);
return new OfflineCompiler(
new DirectiveNormalizer(_xhr, _urlResolver, _htmlParser),
templateParser,
new StyleCompiler(_urlResolver),
new ViewCompiler(compilerConfig),
new DartEmitter()
);
}
HtmlParser _createHtmlParser(XmbDeserializationResult translations, ng.Parser parser) {

View File

@ -1,6 +1,6 @@
library angular2.transform.common.ng_meta;
import 'package:angular2/src/compiler/directive_metadata.dart';
import 'package:angular2/src/compiler/compile_metadata.dart';
import 'logging.dart';
import 'model/ng_deps_model.pb.dart';
import 'url_resolver.dart' show isDartCoreUri;
@ -32,7 +32,8 @@ class NgMeta {
static const _TYPE_VALUE = 'type';
/// Metadata for each identifier
/// Type: [CompileDirectiveMetadata]|[CompilePipeMetadata]|[CompileTypeMetadata]|[CompileIdentifierMetadata]
/// Type: [CompileDirectiveMetadata]|[CompilePipeMetadata]|[CompileTypeMetadata]|
/// [CompileIdentifierMetadata]|[CompileFactoryMetadata]
final Map<String, dynamic> identifiers;
/// List of other types and names associated with a given name.

View File

@ -17,9 +17,12 @@ const ERROR_ON_MISSING_IDENTIFIERS = 'error_on_missing_identifiers';
const INIT_REFLECTOR_PARAM = 'init_reflector';
const INLINE_VIEWS_PARAM = 'inline_views';
const MIRROR_MODE_PARAM = 'mirror_mode';
const CODEGEN_MODE_PARAM = 'codegen_mode';
const LAZY_TRANSFORMERS = 'lazy_transformers';
const TRANSLATIONS = 'translations';
const CODEGEN_DEBUG_MODE = 'debug';
/// Provides information necessary to transform an Angular2 app.
class TransformerOptions {
final List<Glob> entryPointGlobs;
@ -44,9 +47,9 @@ class TransformerOptions {
/// as attributes on DOM elements, which may aid in application debugging.
final bool reflectPropertiesAsAttributes;
/// Whether to generate debug information in change detectors.
/// This improves error messages when exception are triggered in templates.
final bool genChangeDetectionDebugInfo;
/// Whether to generate debug information in views.
/// Needed for testing and improves error messages when exception are triggered.
final String codegenMode;
/// A set of directives that will be automatically passed-in to the template compiler
/// Format of an item in the list:
@ -105,7 +108,7 @@ class TransformerOptions {
this.initReflector,
this.annotationMatcher,
{this.formatCode,
this.genChangeDetectionDebugInfo,
this.codegenMode,
this.genCompiledTemplates,
this.inlineViews,
this.lazyTransformers,
@ -122,7 +125,7 @@ class TransformerOptions {
bool initReflector: true,
List<ClassDescriptor> customAnnotationDescriptors: const [],
bool inlineViews: false,
bool genChangeDetectionDebugInfo: false,
String codegenMode: '',
bool genCompiledTemplates: true,
bool reflectPropertiesAsAttributes: false,
bool errorOnMissingIdentifiers: true,
@ -139,7 +142,7 @@ class TransformerOptions {
: null;
return new TransformerOptions._internal(entryPoints, entryPointGlobs,
modeName, mirrorMode, initReflector, annotationMatcher,
genChangeDetectionDebugInfo: genChangeDetectionDebugInfo,
codegenMode: codegenMode,
genCompiledTemplates: genCompiledTemplates,
reflectPropertiesAsAttributes: reflectPropertiesAsAttributes,
platformDirectives: platformDirectives,

View File

@ -24,6 +24,12 @@ TransformerOptions parseBarbackSettings(BarbackSettings settings) {
String mirrorModeVal =
config.containsKey(MIRROR_MODE_PARAM) ? config[MIRROR_MODE_PARAM] : '';
var mirrorMode = MirrorMode.none;
var codegenMode;
if (settings.mode == BarbackMode.DEBUG) {
codegenMode = CODEGEN_DEBUG_MODE;
} else {
codegenMode = config[CODEGEN_MODE_PARAM];
}
switch (mirrorModeVal) {
case 'debug':
mirrorMode = MirrorMode.debug;
@ -39,7 +45,7 @@ TransformerOptions parseBarbackSettings(BarbackSettings settings) {
modeName: settings.mode.name,
mirrorMode: mirrorMode,
initReflector: initReflector,
genChangeDetectionDebugInfo: settings.mode == BarbackMode.DEBUG,
codegenMode: codegenMode,
customAnnotationDescriptors: _readCustomAnnotations(config),
reflectPropertiesAsAttributes: reflectPropertiesAsAttributes,
platformDirectives: platformDirectives,

View File

@ -1,36 +0,0 @@
library angular2.transform.common.property_utils;
import 'package:analyzer/src/generated/scanner.dart' show Keyword;
/// Whether `name` is a valid property name.
bool isValid(String name) {
var keyword = Keyword.keywords[name];
return keyword == null || keyword.isPseudoKeyword;
}
/// Prepares `name` to be emitted inside a string.
String sanitize(String name) => name.replaceAll('\$', '\\\$');
/// Get a string usable as a lazy invalid setter, that is, one which will
/// `throw` immediately upon use.
String lazyInvalidSetter(String setterName) {
var sName = sanitize(setterName);
return ''' '$sName': (o, v) => '''
''' throw 'Invalid setter name "$sName" is a Dart keyword.' ''';
}
/// Get a string usable as a lazy invalid getter, that is, one which will
/// `throw` immediately upon use.
String lazyInvalidGetter(String getterName) {
var sName = sanitize(getterName);
return ''' '$sName': (o) => '''
''' throw 'Invalid getter name "$sName" is a Dart keyword.' ''';
}
/// Get a string usable as a lazy invalid method, that is, one which will
/// `throw` immediately upon use.
String lazyInvalidMethod(String methodName) {
var sName = sanitize(methodName);
return ''' '$sName': (o, args) => '''
''' throw 'Invalid method name "$sName" is a Dart keyword.' ''';
}

View File

@ -4,11 +4,11 @@ import 'dart:async';
import 'package:analyzer/analyzer.dart';
import 'package:angular2/src/compiler/directive_metadata.dart';
import 'package:angular2/src/compiler/template_compiler.dart';
import 'package:angular2/src/compiler/compile_metadata.dart';
import 'package:angular2/src/compiler/offline_compiler.dart';
import 'package:angular2/src/core/change_detection/change_detection.dart';
import 'package:angular2/src/core/linker/interfaces.dart' show LifecycleHooks;
import 'package:angular2/src/core/metadata/lifecycle_hooks.dart' show LifecycleHooks;
import 'package:angular2/src/core/metadata/view.dart' show ViewEncapsulation;
import 'package:angular2/src/transform/common/annotation_matcher.dart';
import 'package:angular2/src/transform/common/interface_matcher.dart';
@ -23,7 +23,7 @@ class TypeMetadataReader {
final _PipeMetadataVisitor _pipeVisitor;
final _CompileTypeMetadataVisitor _typeVisitor;
final _CompileFactoryMetadataVisitor _factoryVisitor;
final TemplateCompiler _templateCompiler;
final OfflineCompiler _templateCompiler;
TypeMetadataReader._(this._directiveVisitor, this._pipeVisitor,
this._templateCompiler, this._typeVisitor, this._factoryVisitor);
@ -31,13 +31,13 @@ class TypeMetadataReader {
/// Accepts an [AnnotationMatcher] which tests that an [Annotation]
/// is a [Directive], [Component], or [View].
factory TypeMetadataReader(AnnotationMatcher annotationMatcher,
InterfaceMatcher interfaceMatcher, TemplateCompiler templateCompiler) {
InterfaceMatcher interfaceMatcher, OfflineCompiler templateCompiler) {
var lifecycleVisitor = new _LifecycleHookVisitor(interfaceMatcher);
var typeVisitor = new _CompileTypeMetadataVisitor(annotationMatcher);
var factoryVisitor = new _CompileFactoryMetadataVisitor(annotationMatcher);
var directiveVisitor = new _DirectiveMetadataVisitor(
annotationMatcher, lifecycleVisitor, typeVisitor);
var pipeVisitor = new _PipeMetadataVisitor(annotationMatcher);
var factoryVisitor = new _CompileFactoryMetadataVisitor(annotationMatcher);
return new TypeMetadataReader._(
directiveVisitor, pipeVisitor, templateCompiler, typeVisitor, factoryVisitor);
@ -353,7 +353,6 @@ class _DirectiveMetadataVisitor extends Object
return CompileDirectiveMetadata.create(
type: _type,
isComponent: _isComponent,
dynamicLoadable: true,
// NOTE(kegluneq): For future optimization.
selector: _selector,
exportAs: _exportAs,
@ -929,7 +928,7 @@ List _readProviders(ListLiteral providerValues) {
CompileProviderMetadata _readProvider(InstanceCreationExpression el) {
final token = el.argumentList.arguments.first;
var useClass, useExisting, useValue, useFactory, deps;
var useClass, useExisting, useValue, useFactory, deps, multi;
el.argumentList.arguments.skip(1).forEach((arg) {
switch (arg.name.toString()) {
case "useClass:":
@ -941,16 +940,16 @@ CompileProviderMetadata _readProvider(InstanceCreationExpression el) {
useClass = new CompileTypeMetadata(prefix: id.prefix, name: id.name);
break;
case "useExisting:":
useExisting = _readIdentifier(arg.expression);
useExisting = _readToken(arg.expression);
break;
case "toAlias:":
useExisting = _readIdentifier(arg.expression);
useExisting = _readToken(arg.expression);
break;
case "useValue:":
useValue = _readIdentifier(arg.expression);
useValue = _readValue(arg.expression);
break;
case "toValue:":
useValue = _readIdentifier(arg.expression);
useValue = _readValue(arg.expression);
break;
case "useFactory:":
final id = _readIdentifier(arg.expression);
@ -965,14 +964,18 @@ CompileProviderMetadata _readProvider(InstanceCreationExpression el) {
case "deps:":
deps = _readDeps(arg.expression);
break;
case "multi:":
multi = _readValue(arg.expression);
break;
}
});
return new CompileProviderMetadata(
token: _readIdentifier(token),
token: _readToken(token),
useClass: useClass,
useExisting: useExisting,
useValue: useValue,
useFactory: useFactory,
multi: multi,
deps: deps);
}
@ -990,9 +993,9 @@ List<CompileDiDependencyMetadata> _readDeps(ListLiteral deps) {
if (first is InstanceCreationExpression &&
(first as InstanceCreationExpression).constructorName.toString() ==
"Inject") {
token = _readIdentifier(first.argumentList.arguments[0]);
token = _readToken(first.argumentList.arguments[0]);
} else {
token = _readIdentifier(first);
token = _readToken(first);
}
return new CompileDiDependencyMetadata(
@ -1005,14 +1008,16 @@ List<CompileDiDependencyMetadata> _readDeps(ListLiteral deps) {
}
_createQueryMetadata(Annotation a, bool defaultDescendantsValue, bool first, String propertyName) {
final selector = _readIdentifier(a.arguments.arguments.first);
final selector = _readToken(a.arguments.arguments.first);
var descendants = defaultDescendantsValue;
a.arguments.arguments.skip(0).forEach((arg) {
if (arg is NamedExpression && arg.name.toString() == "descendants:")
descendants = naiveEval(arg.expression);
});
final selectors = selector is String ? selector.split(",") : [selector];
final selectors = selector.value is String ?
selector.value.split(",").map( (value) => new CompileTokenMetadata(value: value) ).toList() :
[selector];
return new CompileQueryMetadata(
selectors: selectors, descendants: descendants, first: first, propertyName: propertyName);
}
@ -1027,7 +1032,7 @@ List<CompileDiDependencyMetadata> _getCompileDiDependencyMetadata(
var token;
final isAttribute = _hasAnnotation(p, "Attribute");
if (isAttribute) {
token = _readIdentifier(_getAnnotation(p, "Attribute").arguments.arguments.first);
token = _readToken(_getAnnotation(p, "Attribute").arguments.arguments.first);
} else {
var type = null;
if (p is SimpleFormalParameter) {
@ -1035,10 +1040,10 @@ List<CompileDiDependencyMetadata> _getCompileDiDependencyMetadata(
} else if (p is FieldFormalParameter) {
type = fieldTypes[p.identifier.toString()];
}
final typeToken = type != null ? _readIdentifier(type.name) : null;
final typeToken = type != null ? _readToken(type.name) : null;
final injectTokens = p.metadata
.where((m) => m.name.toString() == "Inject")
.map((m) => _readIdentifier(m.arguments.arguments[0]));
.map((m) => _readToken(m.arguments.arguments[0]));
token = injectTokens.isNotEmpty ? injectTokens.first : typeToken;
}
@ -1092,17 +1097,27 @@ dynamic _readIdentifier(dynamic el) {
}
} else if (el is SimpleIdentifier) {
return new CompileIdentifierMetadata(name: '$el');
} else if (el is DoubleLiteral ||
el is IntegerLiteral ||
el is SimpleStringLiteral ||
el is BooleanLiteral) {
return el.value;
} else if (el is NullLiteral) {
return null;
} else if (el is InstanceCreationExpression) {
return new CompileIdentifierMetadata(
name: '${el.constructorName}', constConstructor: true);
} else {
throw new ArgumentError('Incorrect identifier "${el}".');
}
}
dynamic _readValue(dynamic el) {
if (el is DoubleLiteral || el is IntegerLiteral || el is SimpleStringLiteral || el is BooleanLiteral){
return el.value;
} else if (el is NullLiteral){
return null;
} else {
return _readIdentifier(el);
}
}
dynamic _readToken(dynamic el) {
if (el is DoubleLiteral || el is IntegerLiteral || el is SimpleStringLiteral || el is BooleanLiteral) {
return new CompileTokenMetadata(value: el.value);
} else if (el is InstanceCreationExpression) {
return new CompileTokenMetadata(identifier: new CompileIdentifierMetadata(name: '${el.constructorName}'), identifierIsInstance: true);
} else {
return new CompileTokenMetadata(identifier: _readIdentifier(el));
}
}

View File

@ -1,26 +1,8 @@
library angular2.transform.template_compiler.url_resolver;
import 'package:angular2/compiler.dart';
import 'package:barback/barback.dart';
class TransformerUrlResolver implements UrlResolver {
const TransformerUrlResolver();
@override
String resolve(String baseUrl, String url) {
if (url == null) throw new ArgumentError.notNull('url');
Uri uri = Uri.parse(url);
if (!uri.isAbsolute) {
if (baseUrl == null) throw new ArgumentError.notNull('baseUrl');
if (baseUrl.isEmpty)
throw new ArgumentError.value('(empty string)', 'baseUrl');
uri = Uri.parse(baseUrl).resolveUri(uri);
}
return toAssetScheme(uri).toString();
}
}
export 'package:angular2/src/compiler/url_resolver.dart' show createOfflineCompileUrlResolver;
String toAssetUri(AssetId assetId) {
if (assetId == null) throw new ArgumentError.notNull('assetId');

View File

@ -6,7 +6,7 @@ import 'package:analyzer/analyzer.dart';
import 'package:barback/barback.dart';
import 'package:source_span/source_span.dart';
import 'package:angular2/src/compiler/template_compiler.dart';
import 'package:angular2/src/compiler/offline_compiler.dart';
typedef _SimpleCallback();
@ -16,7 +16,7 @@ final _templateCompilerKey = #templateCompilerKey;
/// Executes `fn` inside a new `Zone` with the provided zone-local values.
Future<dynamic> exec(_SimpleCallback fn,
{TransformLogger log, TemplateCompiler templateCompiler}) async {
{TransformLogger log, OfflineCompiler templateCompiler}) async {
return runZoned(() async {
try {
return await fn();
@ -52,12 +52,12 @@ Future<dynamic> exec(_SimpleCallback fn,
/// reasonable default value.
TransformLogger get log => Zone.current[_loggerKey] as TransformLogger;
/// The [TemplateCompiler] for the current zone.
/// The [OfflineCompiler] for the current zone.
///
/// This will return `null` if there is no [TemplateCompiler] registered on the
/// This will return `null` if there is no [OfflineCompiler] registered on the
/// current zone.
TemplateCompiler get templateCompiler =>
Zone.current[_templateCompilerKey] as TemplateCompiler;
OfflineCompiler get templateCompiler =>
Zone.current[_templateCompilerKey] as OfflineCompiler;
/// Generate a human-readable error message from `error`.
String _friendlyError(AnalysisError error) {

View File

@ -108,7 +108,7 @@ String _rewriteLibrary(String code, List<ImportDirective> imports,
/// initialization before use.
class _FindDeferredLibraries extends Object with SimpleAstVisitor<Object> {
final _deferredImports = <ImportDirective>[];
final _urlResolver = const TransformerUrlResolver();
final _urlResolver = createOfflineCompileUrlResolver();
final AssetReader _reader;
final AssetId _entryPoint;

View File

@ -3,7 +3,7 @@ library angular2.transform.directive_metadata_linker.linker;
import 'dart:async';
import 'dart:convert';
import 'package:angular2/src/compiler/directive_metadata.dart';
import 'package:angular2/src/compiler/compile_metadata.dart';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/logging.dart';
import 'package:angular2/src/transform/common/names.dart';
@ -42,7 +42,7 @@ Future<NgMeta> linkDirectiveMetadata(AssetReader reader, AssetId summaryAssetId,
return ngMeta;
}
final _urlResolver = const TransformerUrlResolver();
final _urlResolver = createOfflineCompileUrlResolver();
Future<NgMeta> _readNgMeta(AssetReader reader, AssetId ngMetaAssetId,
Map<AssetId, NgMeta> ngMetas) async {
@ -217,7 +217,7 @@ class _NgMetaIdentifierResolver {
if (resolved == null) return [];
if (resolved is CompileTypeMetadata) {
return [new CompileProviderMetadata(token: resolved, useClass: resolved)];
return [new CompileProviderMetadata(token: new CompileTokenMetadata(identifier: resolved), useClass: resolved)];
} else if (resolved is CompileIdentifierMetadata && resolved.value is List) {
return _resolveProviders(ngMetaMap, resolved.value, neededBy);
@ -259,20 +259,20 @@ class _NgMetaIdentifierResolver {
void _resolveQueries(Map<String, NgMeta> ngMetaMap, List queries, String neededBy) {
queries.forEach((q) {
q.selectors = q.selectors.map((s) => _resolveIdentifier(ngMetaMap, neededBy, s)).toList();
q.selectors.forEach((s) => s.identifier = _resolveIdentifier(ngMetaMap, neededBy, s.identifier));
});
}
void _resolveProvider(Map<String, NgMeta> ngMetaMap,
String neededBy, CompileProviderMetadata provider) {
provider.token = _resolveIdentifier(ngMetaMap, neededBy, provider.token);
provider.token.identifier = _resolveIdentifier(ngMetaMap, neededBy, provider.token.identifier);
if (provider.useClass != null) {
provider.useClass =
_resolveIdentifier(ngMetaMap, neededBy, provider.useClass);
}
if (provider.useExisting != null) {
provider.useExisting =
_resolveIdentifier(ngMetaMap, neededBy, provider.useExisting);
provider.useExisting.identifier =
_resolveIdentifier(ngMetaMap, neededBy, provider.useExisting.identifier);
}
if (provider.useValue != null) {
provider.useValue =
@ -290,14 +290,16 @@ class _NgMetaIdentifierResolver {
String neededBy, List<CompileDiDependencyMetadata> deps) {
if (deps == null) return;
for (var dep in deps) {
_setModuleUrl(ngMetaMap, neededBy, dep.token);
if (dep.token != null) {
_setModuleUrl(ngMetaMap, neededBy, dep.token.identifier);
}
if (dep.query != null) {
dep.query.selectors
.forEach((s) => _setModuleUrl(ngMetaMap, neededBy, s));
.forEach((s) => _setModuleUrl(ngMetaMap, neededBy, s.identifier));
}
if (dep.viewQuery != null) {
dep.viewQuery.selectors
.forEach((s) => _setModuleUrl(ngMetaMap, neededBy, s));
.forEach((s) => _setModuleUrl(ngMetaMap, neededBy, s.identifier));
}
}
}

View File

@ -57,7 +57,7 @@ Future<String> _getAllDeclarations(AssetReader reader, AssetId assetId,
visitor.parts.forEach((partDirective) {
var uri = stringLiteralToString(partDirective.uri);
var partAssetId =
fromUri(const TransformerUrlResolver().resolve(assetUri, uri));
fromUri(createOfflineCompileUrlResolver().resolve(assetUri, uri));
asyncWriter.asyncPrint(reader.readAsString(partAssetId).then((partCode) {
if (partCode == null || partCode.isEmpty) {
log.warning('Empty part at "${partDirective.uri}. Ignoring.',

View File

@ -5,9 +5,9 @@ import 'dart:async';
import 'package:analyzer/analyzer.dart';
import 'package:barback/barback.dart' show AssetId;
import 'package:angular2/src/compiler/directive_metadata.dart'
import 'package:angular2/src/compiler/compile_metadata.dart'
show CompileIdentifierMetadata, CompileProviderMetadata;
import 'package:angular2/src/compiler/template_compiler.dart';
import 'package:angular2/src/compiler/offline_compiler.dart';
import 'package:angular2/src/transform/common/annotation_matcher.dart';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/code/ng_deps_code.dart';
@ -71,7 +71,7 @@ class _NgMetaVisitor extends Object with SimpleAstVisitor<Object> {
final _normalizations = <Future>[];
_NgMetaVisitor(this.ngMeta, this.assetId, AnnotationMatcher annotationMatcher,
InterfaceMatcher interfaceMatcher, TemplateCompiler templateCompiler)
InterfaceMatcher interfaceMatcher, OfflineCompiler templateCompiler)
: _reader = new TypeMetadataReader(
annotationMatcher, interfaceMatcher, templateCompiler);

View File

@ -72,7 +72,7 @@ Future<String> inline(AssetReader reader, AssetId assetId,
return visitor.modifiedSource ? writer.asyncToString() : null;
}
final _urlResolver = const TransformerUrlResolver();
final _urlResolver = createOfflineCompileUrlResolver();
class _ViewPropInliner extends RecursiveAstVisitor<Object> {
/// The prefixes given to inlined names.

View File

@ -2,7 +2,7 @@ library angular2.transform.stylesheet_compiler.processor;
import 'dart:async';
import 'package:angular2/src/compiler/source_module.dart';
import 'package:angular2/src/compiler/offline_compiler.dart';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/code/source_module.dart';
import 'package:angular2/src/transform/common/logging.dart';
@ -28,7 +28,7 @@ Future<Iterable<Asset>> processStylesheet(
final cssText = await reader.readAsString(stylesheetId);
return logElapsedAsync(() async {
final sourceModules =
templateCompiler.compileStylesheetCodeGen(stylesheetUrl, cssText);
templateCompiler.compileStylesheet(stylesheetUrl, cssText);
return sourceModules.map((SourceModule module) => new Asset.fromString(
new AssetId.parse('${module.moduleUrl}'), writeSourceModule(module)));

View File

@ -1,594 +0,0 @@
library angular2.transform.template_compiler.change_detector_codegen;
import 'package:angular2/src/core/change_detection/change_detection.dart';
import 'package:angular2/src/core/change_detection/change_detection_util.dart';
import 'package:angular2/src/core/change_detection/codegen_facade.dart';
import 'package:angular2/src/core/change_detection/codegen_logic_util.dart';
import 'package:angular2/src/core/change_detection/codegen_name_util.dart';
import 'package:angular2/src/core/change_detection/directive_record.dart';
import 'package:angular2/src/core/change_detection/interfaces.dart';
import 'package:angular2/src/core/change_detection/proto_change_detector.dart';
import 'package:angular2/src/core/change_detection/proto_record.dart';
import 'package:angular2/src/core/change_detection/event_binding.dart';
import 'package:angular2/src/core/change_detection/binding_record.dart';
import 'package:angular2/src/core/change_detection/codegen_facade.dart'
show codify;
import 'package:angular2/src/facade/exceptions.dart' show BaseException;
import 'package:angular2/src/facade/collection.dart' show ListWrapper;
/// Responsible for generating change detector classes for Angular 2.
///
/// This code should be kept in sync with the `ChangeDetectorJITGenerator`
/// class. If you make updates here, please make equivalent changes there.
class Codegen {
/// Stores the generated class definitions.
final StringBuffer _buf = new StringBuffer();
/// Stores all generated initialization code.
final StringBuffer _initBuf = new StringBuffer();
/// The names of already generated classes.
final Set<String> _names = new Set<String>();
/// The module prefix for pregen_proto_change_detector
final String _genPrefix;
Codegen([this._genPrefix = _GEN_PREFIX_WITH_DOT]);
/// Generates a change detector class with name `changeDetectorTypeName`,
/// which must not conflict with other generated classes in the same
/// `.template.dart` file. The change detector is used to detect changes in
/// Objects of type `typeName`.
void generate(String typeName, String changeDetectorTypeName,
ChangeDetectorDefinition def) {
if (_names.contains(changeDetectorTypeName)) {
throw new BaseException(
'Change detector named "${changeDetectorTypeName}" for ${typeName} '
'conflicts with an earlier generated change detector class.');
}
_names.add(changeDetectorTypeName);
new _CodegenState(_genPrefix, typeName, changeDetectorTypeName, def)
.._writeToBuf(_buf)
.._writeInitToBuf(_initBuf);
}
/// Gets all imports necessary for the generated code.
String get imports {
return _buf.isEmpty
? ''
: '''import '$_PREGEN_PROTO_CHANGE_DETECTOR_IMPORT' as $_GEN_PREFIX;''';
}
bool get isEmpty => _buf.isEmpty;
/// Gets the initilization code that registers the generated classes with
/// the Angular 2 change detection system.
String get initialize => '$_initBuf';
@override
String toString() => '$_buf';
}
/// The state needed to generate a change detector for a single `Component`.
class _CodegenState {
/// The `id` of the `ChangeDetectorDefinition` we are generating this class
/// for.
final String _changeDetectorDefId;
/// The name of the `Type` this change detector is generated for. For example,
/// this is `MyComponent` if the generated class will detect changes in
/// `MyComponent` objects.
final String _contextTypeName;
/// The name of the generated change detector class. This is an implementation
/// detail and should not be visible to users.
final String _changeDetectorTypeName;
final ChangeDetectionStrategy _changeDetectionStrategy;
final List<DirectiveRecord> _directiveRecords;
final List<ProtoRecord> _records;
final List<EventBinding> _eventBindings;
final CodegenLogicUtil _logic;
final CodegenNameUtil _names;
final ChangeDetectorGenConfig _genConfig;
final List<BindingTarget> _propertyBindingTargets;
final List<int> _endOfBlockIdxs = [];
String get _changeDetectionStrategyAsCode => _changeDetectionStrategy == null
? 'null'
: '${_genPrefix}${_changeDetectionStrategy}';
/// The module prefix for pregen_proto_change_detector
final String _genPrefix;
_CodegenState._(
this._genPrefix,
this._changeDetectorDefId,
this._contextTypeName,
this._changeDetectorTypeName,
this._changeDetectionStrategy,
this._records,
this._propertyBindingTargets,
this._eventBindings,
this._directiveRecords,
this._logic,
this._names,
this._genConfig);
factory _CodegenState(String genPrefix, String typeName,
String changeDetectorTypeName, ChangeDetectorDefinition def) {
var protoRecords = createPropertyRecords(def);
var eventBindings = createEventRecords(def);
var propertyBindingTargets =
def.bindingRecords.map((b) => b.target).toList();
var names = new CodegenNameUtil(
protoRecords, eventBindings, def.directiveRecords, '$genPrefix$_UTIL');
var logic =
new CodegenLogicUtil(names, '$genPrefix$_UTIL', '$genPrefix$_STATE');
return new _CodegenState._(
genPrefix,
def.id,
typeName,
changeDetectorTypeName,
def.strategy,
protoRecords,
propertyBindingTargets,
eventBindings,
def.directiveRecords,
logic,
names,
def.genConfig);
}
void _writeToBuf(StringBuffer buf) {
buf.write('''\n
class $_changeDetectorTypeName extends ${_genPrefix}$_BASE_CLASS<$_contextTypeName> {
${_genDeclareFields()}
$_changeDetectorTypeName()
: super(${codify(_changeDetectorDefId)},
${_records.length},
${_changeDetectorTypeName}.${_GEN_PROPERTY_BINDING_TARGETS_NAME},
${_changeDetectorTypeName}.${_GEN_DIRECTIVE_INDICES_NAME},
${_changeDetectionStrategyAsCode}) {
dehydrateDirectives(false);
}
void detectChangesInRecordsInternal(throwOnChange) {
${_names.genInitLocals()}
var $_IS_CHANGED_LOCAL = false;
var $_CHANGES_LOCAL = null;
${_genAllRecords()}
}
${_maybeGenHandleEventInternal()}
${_maybeGenAfterContentLifecycleCallbacks()}
${_maybeGenAfterViewLifecycleCallbacks()}
${_maybeGenHydrateDirectives()}
${_maybeGenDehydrateDirectives()}
${_genPropertyBindingTargets()};
${_genDirectiveIndices()};
static ${_genPrefix}ChangeDetector
$CHANGE_DETECTOR_FACTORY_METHOD() {
return new $_changeDetectorTypeName();
}
}
''');
}
String _genAllRecords() {
_endOfBlockIdxs.clear();
List<String> res = [];
for (int i = 0; i < _records.length; i++) {
res.add(_genRecord(_records[i], i));
}
return res.join('');
}
String _genPropertyBindingTargets() {
var targets = _logic.genPropertyBindingTargets(
_propertyBindingTargets, this._genConfig.genDebugInfo);
return "static final ${_GEN_PROPERTY_BINDING_TARGETS_NAME} = ${targets}";
}
String _genDirectiveIndices() {
var indices = _logic.genDirectiveIndices(_directiveRecords);
return "static final ${_GEN_DIRECTIVE_INDICES_NAME} = ${indices}";
}
String _maybeGenHandleEventInternal() {
if (_eventBindings.length > 0) {
var handlers =
_eventBindings.map((eb) => _genEventBinding(eb)).join("\n");
return '''
handleEventInternal(eventName, elIndex, locals) {
var ${this._names.getPreventDefaultAccesor()} = false;
${this._names.genInitEventLocals()}
${handlers}
return ${this._names.getPreventDefaultAccesor()};
}
''';
} else {
return '';
}
}
String _genEventBinding(EventBinding eb) {
List<String> codes = [];
_endOfBlockIdxs.clear();
ListWrapper.forEachWithIndex(eb.records, (ProtoRecord _, int i) {
var code;
var r = eb.records[i];
if (r.isConditionalSkipRecord()) {
code = _genConditionalSkip(r, _names.getEventLocalName(eb, i));
} else if (r.isUnconditionalSkipRecord()) {
code = _genUnconditionalSkip(r);
} else {
code = _genEventBindingEval(eb, r);
}
code += this._genEndOfSkipBlock(i);
codes.add(code);
});
return '''
if (eventName == "${eb.eventName}" && elIndex == ${eb.elIndex}) {
${codes.join("\n")}
}''';
}
String _genEventBindingEval(EventBinding eb, ProtoRecord r) {
if (r.lastInBinding) {
var evalRecord = _logic.genEventBindingEvalValue(eb, r);
var markPath = _genMarkPathToRootAsCheckOnce(r);
var prevDefault = _genUpdatePreventDefault(eb, r);
return "${markPath}\n${evalRecord}\n${prevDefault}";
} else {
return _logic.genEventBindingEvalValue(eb, r);
}
}
String _genMarkPathToRootAsCheckOnce(ProtoRecord r) {
var br = r.bindingRecord;
if (!br.isDefaultChangeDetection()) {
return "${_names.getDetectorName(br.directiveRecord.directiveIndex)}.markPathToRootAsCheckOnce();";
} else {
return "";
}
}
String _genUpdatePreventDefault(EventBinding eb, ProtoRecord r) {
var local = this._names.getEventLocalName(eb, r.selfIndex);
return """if (${local} == false) { ${_names.getPreventDefaultAccesor()} = true; }""";
}
void _writeInitToBuf(StringBuffer buf) {
buf.write('''
${_genPrefix}preGeneratedProtoDetectors['$_changeDetectorDefId'] =
$_changeDetectorTypeName.newProtoChangeDetector;
''');
}
String _maybeGenDehydrateDirectives() {
var destroyPipesParamName = 'destroyPipes';
var destroyPipesCode = _names.genPipeOnDestroy();
var dehydrateFieldsCode = _names.genDehydrateFields();
var destroyDirectivesCode =
_logic.genDirectivesOnDestroy(this._directiveRecords);
if (destroyPipesCode.isEmpty &&
dehydrateFieldsCode.isEmpty &&
destroyDirectivesCode.isEmpty) return '';
return '''void dehydrateDirectives(${destroyPipesParamName}) {
if (${destroyPipesParamName}) {
${destroyPipesCode}
${destroyDirectivesCode}
}
${dehydrateFieldsCode}
}''';
}
String _maybeGenHydrateDirectives() {
var hydrateDirectivesCode = _logic.genHydrateDirectives(_directiveRecords);
var hydrateDetectorsCode = _logic.genHydrateDetectors(_directiveRecords);
if (hydrateDirectivesCode.isEmpty && hydrateDetectorsCode.isEmpty) {
return '';
}
return 'void hydrateDirectives(directives) '
'{ $hydrateDirectivesCode $hydrateDetectorsCode }';
}
String _maybeGenAfterContentLifecycleCallbacks() {
var directiveNotifications =
_logic.genContentLifecycleCallbacks(_directiveRecords);
if (directiveNotifications.isNotEmpty) {
return '''
void afterContentLifecycleCallbacksInternal() {
${directiveNotifications.join('')}
}
''';
} else {
return '';
}
}
String _maybeGenAfterViewLifecycleCallbacks() {
var directiveNotifications =
_logic.genViewLifecycleCallbacks(_directiveRecords);
if (directiveNotifications.isNotEmpty) {
return '''
void afterViewLifecycleCallbacksInternal() {
${directiveNotifications.join('')}
}
''';
} else {
return '';
}
}
String _genDeclareFields() {
var fields = _names.getAllFieldNames();
// If there's only one field, it's `context`, declared in the superclass.
if (fields.length == 1) return '';
fields.removeAt(CONTEXT_INDEX);
var toRemove = 'this.';
var declareNames = fields
.map((f) => f.startsWith(toRemove) ? f.substring(toRemove.length) : f);
return 'var ${declareNames.join(', ')};';
}
String _genRecord(ProtoRecord r, int index) {
var code = null;
if (r.isLifeCycleRecord()) {
code = _genDirectiveLifecycle(r);
} else if (r.isPipeRecord()) {
code = _genPipeCheck(r);
} else if (r.isConditionalSkipRecord()) {
code = _genConditionalSkip(r, _names.getLocalName(r.contextIndex));
} else if (r.isUnconditionalSkipRecord()) {
code = _genUnconditionalSkip(r);
} else {
code = _genReferenceCheck(r);
}
code = '''
${this._maybeFirstInBinding(r)}
${code}
${this._maybeGenLastInDirective(r)}
${this._genEndOfSkipBlock(index)}
''';
return code;
}
String _genConditionalSkip(ProtoRecord r, String condition) {
var maybeNegate = r.mode == RecordType.SkipRecordsIf ? '!' : '';
_endOfBlockIdxs.add(r.fixedArgs[0] - 1);
return 'if ($maybeNegate$condition) {';
}
String _genUnconditionalSkip(ProtoRecord r) {
_endOfBlockIdxs.removeLast();
_endOfBlockIdxs.add(r.fixedArgs[0] - 1);
return '} else {';
}
String _genEndOfSkipBlock(int protoIndex) {
if (!ListWrapper.isEmpty(this._endOfBlockIdxs)) {
var endOfBlock = ListWrapper.last(this._endOfBlockIdxs);
if (protoIndex == endOfBlock) {
this._endOfBlockIdxs.removeLast();
return '}';
}
}
return '';
}
String _genDirectiveLifecycle(ProtoRecord r) {
if (r.name == 'DoCheck') {
return _genDoCheck(r);
} else if (r.name == 'OnInit') {
return _genOnInit(r);
} else if (r.name == 'OnChanges') {
return _genOnChanges(r);
} else {
throw new BaseException("Unknown lifecycle event '${r.name}'");
}
}
String _genPipeCheck(ProtoRecord r) {
var context = _names.getLocalName(r.contextIndex);
var argString = r.args.map((arg) => _names.getLocalName(arg)).join(", ");
var oldValue = _names.getFieldName(r.selfIndex);
var newValue = _names.getLocalName(r.selfIndex);
var pipe = _names.getPipeName(r.selfIndex);
var pipeType = r.name;
var init = '''
if ($pipe == ${_genPrefix}$_UTIL.uninitialized) {
$pipe = ${_names.getPipesAccessorName()}.get('$pipeType');
}
''';
var read = '''
$newValue = $pipe.pipe.transform($context, [$argString]);
''';
var contexOrArgCheck = r.args.map((a) => _names.getChangeName(a)).toList();
contexOrArgCheck.add(_names.getChangeName(r.contextIndex));
var condition = '''!${pipe}.pure || (${contexOrArgCheck.join(" || ")})''';
var check = '''
${_genThrowOnChangeCheck(oldValue, newValue)}
if (${_genPrefix}$_UTIL.looseNotIdentical($oldValue, $newValue)) {
$newValue = ${_genPrefix}$_UTIL.unwrapValue($newValue);
${_genChangeMarker(r)}
${_genUpdateDirectiveOrElement(r)}
${_genAddToChanges(r)}
$oldValue = $newValue;
}
''';
var genCode = r.shouldBeChecked() ? '''${read}${check}''' : read;
if (r.isUsedByOtherRecord()) {
return '''${init} if (${condition}) { ${genCode} } else { ${newValue} = ${oldValue}; }''';
} else {
return '''${init} if (${condition}) { ${genCode} }''';
}
}
String _genReferenceCheck(ProtoRecord r) {
var oldValue = _names.getFieldName(r.selfIndex);
var newValue = _names.getLocalName(r.selfIndex);
var read = '''
${_logic.genPropertyBindingEvalValue(r)}
''';
var check = '''
${_genThrowOnChangeCheck(oldValue, newValue)}
if (${_genPrefix}$_UTIL.looseNotIdentical($newValue, $oldValue)) {
${_genChangeMarker(r)}
${_genUpdateDirectiveOrElement(r)}
${_genAddToChanges(r)}
$oldValue = $newValue;
}
''';
var genCode = r.shouldBeChecked() ? "${read}${check}" : read;
if (r.isPureFunction()) {
// Add an "if changed guard"
var condition = r.args.map((a) => _names.getChangeName(a)).join(' || ');
if (r.isUsedByOtherRecord()) {
return 'if ($condition) { $genCode } else { $newValue = $oldValue; }';
} else {
return 'if ($condition) { $genCode }';
}
} else {
return genCode;
}
}
String _genChangeMarker(ProtoRecord r) {
return r.argumentToPureFunction
? "${this._names.getChangeName(r.selfIndex)} = true;"
: "";
}
String _genUpdateDirectiveOrElement(ProtoRecord r) {
if (!r.lastInBinding) return '';
var newValue = _names.getLocalName(r.selfIndex);
var notifyDebug = _genConfig.logBindingUpdate
? "this.logBindingUpdate(${newValue});"
: "";
var br = r.bindingRecord;
if (br.target.isDirective()) {
var directiveProperty =
'${_names.getDirectiveName(br.directiveRecord.directiveIndex)}.${br.target.name}';
return '''
$directiveProperty = $newValue;
${notifyDebug}
$_IS_CHANGED_LOCAL = true;
''';
} else {
return '''
this.notifyDispatcher(${newValue});
${notifyDebug}
''';
}
}
String _genThrowOnChangeCheck(String oldValue, String newValue) {
return '''
if(${_genPrefix}assertionsEnabled() && throwOnChange && !${_genPrefix}${_UTIL}.devModeEqual(${oldValue}, ${newValue})) {
this.throwOnChangeError(${oldValue}, ${newValue});
}
''';
}
String _maybeFirstInBinding(ProtoRecord r) {
var prev = ChangeDetectionUtil.protoByIndex(_records, r.selfIndex - 1);
var firstInBindng = prev == null || prev.bindingRecord != r.bindingRecord;
return firstInBindng && !r.bindingRecord.isDirectiveLifecycle()
? "${_names.getPropertyBindingIndex()} = ${r.propertyBindingIndex};"
: '';
}
String _genAddToChanges(ProtoRecord r) {
var newValue = _names.getLocalName(r.selfIndex);
var oldValue = _names.getFieldName(r.selfIndex);
if (!r.bindingRecord.callOnChanges()) return '';
return "$_CHANGES_LOCAL = addChange($_CHANGES_LOCAL, $oldValue, $newValue);";
}
String _maybeGenLastInDirective(ProtoRecord r) {
if (!r.lastInDirective) return '';
return '''
$_CHANGES_LOCAL = null;
${_genNotifyOnPushDetectors(r)}
$_IS_CHANGED_LOCAL = false;
''';
}
String _genDoCheck(ProtoRecord r) {
var br = r.bindingRecord;
return 'if (!throwOnChange) '
'${_names.getDirectiveName(br.directiveRecord.directiveIndex)}.ngDoCheck();';
}
String _genOnInit(ProtoRecord r) {
var br = r.bindingRecord;
return 'if (!throwOnChange && ${_names.getStateName()} == ${_genPrefix}$_STATE.NeverChecked) '
'${_names.getDirectiveName(br.directiveRecord.directiveIndex)}.ngOnInit();';
}
String _genOnChanges(ProtoRecord r) {
var br = r.bindingRecord;
return 'if (!throwOnChange && $_CHANGES_LOCAL != null) '
'${_names.getDirectiveName(br.directiveRecord.directiveIndex)}'
'.ngOnChanges($_CHANGES_LOCAL);';
}
String _genNotifyOnPushDetectors(ProtoRecord r) {
var br = r.bindingRecord;
if (!r.lastInDirective || br.isDefaultChangeDetection()) return '';
return '''
if($_IS_CHANGED_LOCAL) {
${_names.getDetectorName(br.directiveRecord.directiveIndex)}.markAsCheckOnce();
}
''';
}
}
const CHANGE_DETECTOR_FACTORY_METHOD = 'newChangeDetector';
const _BASE_CLASS = 'AbstractChangeDetector';
const _CHANGES_LOCAL = 'changes';
const _GEN_PREFIX = '_gen';
const _GEN_PREFIX_WITH_DOT = _GEN_PREFIX + '.';
const _GEN_RECORDS_METHOD_NAME = '_createRecords';
const _IS_CHANGED_LOCAL = 'isChanged';
const _PREGEN_PROTO_CHANGE_DETECTOR_IMPORT =
'package:angular2/src/core/change_detection/pregen_proto_change_detector.dart';
const _GEN_PROPERTY_BINDING_TARGETS_NAME =
'${_GEN_PREFIX}_propertyBindingTargets';
const _GEN_DIRECTIVE_INDICES_NAME = '${_GEN_PREFIX}_directiveIndices';
const _UTIL = 'ChangeDetectionUtil';
const _STATE = 'ChangeDetectorState';

View File

@ -3,8 +3,8 @@ library angular2.transform.template_compiler.compile_data_creator;
import 'dart:async';
import 'dart:convert';
import 'package:angular2/src/compiler/directive_metadata.dart';
import 'package:angular2/src/compiler/template_compiler.dart';
import 'package:angular2/src/compiler/compile_metadata.dart';
import 'package:angular2/src/compiler/offline_compiler.dart';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/logging.dart';
import 'package:angular2/src/transform/common/model/ng_deps_model.pb.dart';
@ -76,8 +76,7 @@ class _CompileDataCreator {
ngDeps.reflectables.any((reflectable) {
if (ngMeta.identifiers.containsKey(reflectable.name)) {
final metadata = ngMeta.identifiers[reflectable.name];
return metadata is CompileDirectiveMetadata &&
metadata.template != null;
return metadata is CompileDirectiveMetadata;
}
return false;
});
@ -197,7 +196,7 @@ class _CompileDataCreator {
if (ngDeps == null || ngDeps.imports == null || ngDeps.imports.isEmpty) {
return map;
}
final resolver = const TransformerUrlResolver();
final resolver = createOfflineCompileUrlResolver();
ngMeta.ngDeps.imports
.where((model) => !isDartCoreUri(model.uri))
.forEach((model) {

View File

@ -4,10 +4,9 @@ import 'dart:async';
import 'package:barback/barback.dart';
import 'package:angular2/src/compiler/source_module.dart';
import 'package:angular2/src/core/change_detection/interfaces.dart';
import 'package:angular2/src/compiler/offline_compiler.dart';
import 'package:angular2/src/compiler/config.dart';
import 'package:angular2/src/facade/lang.dart';
import 'package:angular2/src/core/reflection/reflection.dart';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/logging.dart';
import 'package:angular2/src/transform/common/model/annotation_model.pb.dart';
@ -16,18 +15,14 @@ import 'package:angular2/src/transform/common/names.dart';
import 'package:angular2/src/transform/common/ng_compiler.dart';
import 'package:angular2/src/transform/common/zone.dart' as zone;
import 'package:angular2/i18n.dart';
import 'package:angular2/src/transform/common/options.dart' show CODEGEN_DEBUG_MODE;
import 'reflection/processor.dart' as reg;
import 'reflection/reflection_capabilities.dart';
import 'compile_data_creator.dart';
/// Generates `.template.dart` files to initialize the Angular2 system.
///
/// - Processes the `.ng_meta.json` file represented by `assetId` using
/// `createCompileData`.
/// - Uses the resulting `NgMeta` object to register `getter`s, `setter`s, and
/// `method`s that would otherwise need to be reflectively accessed with the
/// `NgDeps` object.
/// - Passes the resulting `NormalizedComponentWithViewDirectives` instance(s)
/// to the `TemplateCompiler` to generate compiled template(s) as a
/// `SourceModule`.
@ -36,7 +31,7 @@ import 'compile_data_creator.dart';
///
/// This method assumes a {@link DomAdapter} has been registered.
Future<Outputs> processTemplates(AssetReader reader, AssetId assetId,
{bool genChangeDetectionDebugInfo: false,
{String codegenMode: '',
bool reflectPropertiesAsAttributes: false,
List<String> platformDirectives,
List<String> platformPipes,
@ -46,26 +41,12 @@ Future<Outputs> processTemplates(AssetReader reader, AssetId assetId,
var viewDefResults = await createCompileData(
reader, assetId, platformDirectives, platformPipes);
if (viewDefResults == null) return null;
final compileTypeMetadatas = viewDefResults.ngMeta.identifiers.values;
if (compileTypeMetadatas.isNotEmpty) {
var processor = new reg.Processor();
compileTypeMetadatas.forEach(processor.process);
if (viewDefResults.ngMeta.ngDeps != null) {
viewDefResults.ngMeta.ngDeps.getters
.addAll(processor.getterNames.map((e) => e.sanitizedName));
viewDefResults.ngMeta.ngDeps.setters
.addAll(processor.setterNames.map((e) => e.sanitizedName));
viewDefResults.ngMeta.ngDeps.methods
.addAll(processor.methodNames.map((e) => e.sanitizedName));
}
}
var templateCompiler = zone.templateCompiler;
if (templateCompiler == null) {
templateCompiler = createTemplateCompiler(reader,
changeDetectionConfig: new ChangeDetectorGenConfig(
genChangeDetectionDebugInfo, reflectPropertiesAsAttributes, false),
translations: translations
);
compilerConfig: new CompilerConfig(
codegenMode == CODEGEN_DEBUG_MODE, reflectPropertiesAsAttributes, false),
translations: translations);
}
final compileData =
@ -74,14 +55,9 @@ Future<Outputs> processTemplates(AssetReader reader, AssetId assetId,
return new Outputs._(viewDefResults.ngMeta.ngDeps, null);
}
var savedReflectionCapabilities = reflector.reflectionCapabilities;
reflector.reflectionCapabilities = const NullReflectionCapabilities();
// Since we need global state to remain consistent here, make sure not to do
// any asynchronous operations here.
final compiledTemplates = logElapsedSync(() {
return templateCompiler.compileTemplatesCodeGen(compileData);
}, operationName: 'compileTemplatesCodegen', assetId: assetId);
reflector.reflectionCapabilities = savedReflectionCapabilities;
return templateCompiler.compileTemplates(compileData);
}, operationName: 'compileTemplates', assetId: assetId);
if (compiledTemplates != null) {
// We successfully compiled templates!

View File

@ -1,55 +0,0 @@
library angular2.transform.template_compiler.reflection.model;
import 'package:angular2/src/compiler/util.dart';
/// Defines the names of getters, setters, and methods which need to be
/// available to Angular 2 via the `reflector` at runtime.
/// See [angular2.src.reflection.reflector] for details.
abstract class CodegenModel {
Iterable<ReflectiveAccessor> get getterNames;
Iterable<ReflectiveAccessor> get methodNames;
Iterable<ReflectiveAccessor> get setterNames;
}
/// Wraps a getter, setter, or method that we may need to access reflectively in
/// an Angular2 app.
/// This is essentially a wrapper for `sanitizedName`, which is the name of the
/// actual getter, setter, or method that will be registered. Note that
/// `operator==` and `hashCode` basically forward to `sanitizedName`.
class ReflectiveAccessor {
/// The value in the Ast determining that we need this accessor. This is the
/// value that is actually present in the template, which may not directly
/// correspond to the model on the `Component`.
final String astValue;
/// The sanitized name of this accessor. This is the name of the getter,
/// setter, or method on the `Component`.
final String sanitizedName;
ReflectiveAccessor(String astValue)
: this.astValue = astValue,
this.sanitizedName = sanitizePropertyName(astValue);
@override
bool operator ==(other) {
if (other is! ReflectiveAccessor) return false;
return sanitizedName == other.sanitizedName;
}
@override
int get hashCode => sanitizedName.hashCode;
}
String sanitizePropertyName(String name) {
// Angular supports renaming class property names
// when used in a template.
// Long syntax: 'classPropertyName: templateName'
// Short syntax: 'classPropertyName'
// This method always returns the 'classPropertyName'.
var fieldName = name;
var separatorIdx = name.indexOf(':');
if (separatorIdx > -1) {
fieldName = name.substring(0, separatorIdx).trim();
}
return dashCaseToCamelCase(fieldName);
}

View File

@ -1,31 +0,0 @@
library angular2.transform.template_compiler.reflection.processor;
import 'package:angular2/src/compiler/directive_metadata.dart';
import 'model.dart';
class Processor implements CodegenModel {
/// The names of all requested `getter`s.
final Set<ReflectiveAccessor> getterNames = new Set<ReflectiveAccessor>();
/// The names of all requested `setter`s.
final Set<ReflectiveAccessor> setterNames = new Set<ReflectiveAccessor>();
/// The names of all requested `method`s.
final Set<ReflectiveAccessor> methodNames = new Set<ReflectiveAccessor>();
void process(Object meta) {
if (meta is CompileDirectiveMetadata) {
if (meta.outputs != null) {
meta.outputs.keys.forEach((eventName) {
getterNames.add(new ReflectiveAccessor(eventName));
});
}
if (meta.inputs != null) {
meta.inputs.keys.forEach((inputName) {
setterNames.add(new ReflectiveAccessor(inputName));
});
}
}
}
}

View File

@ -1,36 +0,0 @@
library angular2.transform.template_compiler.reflection.reflection_capabilities;
import 'package:angular2/src/core/reflection/reflection_capabilities.dart';
import 'package:angular2/src/core/reflection/types.dart';
/// ReflectionCapabilities object that responds to all requests for `getter`s,
/// `setter`s, and `method`s with `null`.
class NullReflectionCapabilities implements ReflectionCapabilities {
const NullReflectionCapabilities();
_notImplemented(String name) => throw 'Not implemented: $name';
bool isReflectionEnabled() => false;
Function factory(Type type) => _notImplemented("factory");
List<List> parameters(typeOrFunc) => _notImplemented('parameters');
List<List> interfaces(typeOrFunc) => _notImplemented('interfaces');
List annotations(typeOrFunc) => _notImplemented('annotations');
Map propMetadata(typeOrFunc) => _notImplemented('propMetadata');
GetterFn getter(String name) => _nullGetter;
SetterFn setter(String name) => _nullSetter;
MethodFn method(String name) => _nullMethod;
String importUri(Type type) => './';
}
_nullGetter(Object p) => null;
_nullSetter(Object p, v) => null;
_nullMethod(Object p, List a) => null;

View File

@ -51,7 +51,7 @@ class TemplateCompiler extends Transformer implements LazyTransformer {
}
var outputs = await processTemplates(reader, primaryId,
genChangeDetectionDebugInfo: options.genChangeDetectionDebugInfo,
codegenMode: options.codegenMode,
reflectPropertiesAsAttributes: options.reflectPropertiesAsAttributes,
platformDirectives: options.platformDirectives,
platformPipes: options.platformPipes,