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:
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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(';');
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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)');
|
||||
|
@ -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_\.]');
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 =
|
||||
|
@ -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';
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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.
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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.' ''';
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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');
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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.',
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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)));
|
||||
|
@ -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';
|
@ -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) {
|
||||
|
@ -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!
|
||||
|
@ -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);
|
||||
}
|
@ -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));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
@ -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,
|
||||
|
Reference in New Issue
Block a user