feat(dart/transform): Simplify dependency imports
Store dependency import information in a dedicated list in `NgDepsModel` rather than as a boolean field on `ImportModel`. An `ImportModel` should not "care" whether it is a .ng_deps.dart import or not -- this information belongs in `NgDepsModel`. This simplifies some of the logic around how `NgDepsModel` imports are processed and eventually output.
This commit is contained in:
parent
f21e78244f
commit
9d0b61bad5
|
@ -157,6 +157,7 @@ abstract class NgDepsWriterMixin
|
||||||
// deferred. Instead `DeferredRewriter` will rewrite the code as to load
|
// deferred. Instead `DeferredRewriter` will rewrite the code as to load
|
||||||
// `ng_deps` in a deferred way.
|
// `ng_deps` in a deferred way.
|
||||||
model.imports.where((i) => !i.isDeferred).forEach(writeImportModel);
|
model.imports.where((i) => !i.isDeferred).forEach(writeImportModel);
|
||||||
|
model.depImports.where((i) => !i.isDeferred).forEach(writeImportModel);
|
||||||
|
|
||||||
writeExportModel(new ExportModel()..uri = model.sourceFile);
|
writeExportModel(new ExportModel()..uri = model.sourceFile);
|
||||||
model.exports.forEach(writeExportModel);
|
model.exports.forEach(writeExportModel);
|
||||||
|
@ -202,11 +203,9 @@ abstract class NgDepsWriterMixin
|
||||||
buffer.writeln(';');
|
buffer.writeln(';');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the setup method for our imports that are `.ng_deps` imports.
|
// Call the setup method for our dependencies.
|
||||||
for (var importModel in model.imports) {
|
for (var importModel in model.depImports) {
|
||||||
if (importModel.isNgDeps) {
|
buffer.writeln('${importModel.prefix}.${SETUP_METHOD_NAME}();');
|
||||||
buffer.writeln('${importModel.prefix}.${SETUP_METHOD_NAME}();');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.writeln('}');
|
buffer.writeln('}');
|
||||||
|
|
|
@ -11,8 +11,7 @@ class ImportModel extends GeneratedMessage {
|
||||||
..p(2, 'showCombinators', PbFieldType.PS)
|
..p(2, 'showCombinators', PbFieldType.PS)
|
||||||
..p(3, 'hideCombinators', PbFieldType.PS)
|
..p(3, 'hideCombinators', PbFieldType.PS)
|
||||||
..a(4, 'prefix', PbFieldType.OS)
|
..a(4, 'prefix', PbFieldType.OS)
|
||||||
..a(5, 'isDeferred', PbFieldType.OB)
|
..a(5, 'isDeferred', PbFieldType.OB);
|
||||||
..a(6, 'isNgDeps', PbFieldType.OB);
|
|
||||||
|
|
||||||
ImportModel() : super();
|
ImportModel() : super();
|
||||||
ImportModel.fromBuffer(List<int> i,
|
ImportModel.fromBuffer(List<int> i,
|
||||||
|
@ -62,14 +61,6 @@ class ImportModel extends GeneratedMessage {
|
||||||
|
|
||||||
bool hasIsDeferred() => $_has(4, 5);
|
bool hasIsDeferred() => $_has(4, 5);
|
||||||
void clearIsDeferred() => clearField(5);
|
void clearIsDeferred() => clearField(5);
|
||||||
|
|
||||||
bool get isNgDeps => $_get(5, 6, false);
|
|
||||||
void set isNgDeps(bool v) {
|
|
||||||
$_setBool(5, 6, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasIsNgDeps() => $_has(5, 6);
|
|
||||||
void clearIsNgDeps() => clearField(6);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ReadonlyImportModel extends ImportModel with ReadonlyMessageMixin {}
|
class _ReadonlyImportModel extends ImportModel with ReadonlyMessageMixin {}
|
||||||
|
@ -124,7 +115,6 @@ const ImportModel$json = const {
|
||||||
const {'1': 'hide_combinators', '3': 3, '4': 3, '5': 9},
|
const {'1': 'hide_combinators', '3': 3, '4': 3, '5': 9},
|
||||||
const {'1': 'prefix', '3': 4, '4': 1, '5': 9},
|
const {'1': 'prefix', '3': 4, '4': 1, '5': 9},
|
||||||
const {'1': 'is_deferred', '3': 5, '4': 1, '5': 8},
|
const {'1': 'is_deferred', '3': 5, '4': 1, '5': 8},
|
||||||
const {'1': 'is_ng_deps', '3': 6, '4': 1, '5': 8},
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -139,7 +129,7 @@ const ExportModel$json = const {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generated with:
|
* Generated with:
|
||||||
* import_export_model.proto (c018d2ad92db2d341631d813ace70925d1ccbb9b)
|
* import_export_model.proto (36a3a72d0884b84b451b7188ffa1fc93b44e7b62)
|
||||||
* libprotoc 2.6.1
|
* libprotoc 2.6.1
|
||||||
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
|
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -16,8 +16,6 @@ message ImportModel {
|
||||||
optional string prefix = 4;
|
optional string prefix = 4;
|
||||||
|
|
||||||
optional bool is_deferred = 5;
|
optional bool is_deferred = 5;
|
||||||
|
|
||||||
optional bool is_ng_deps = 6;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// See message above about wire-compatiblity with `ImportModel`.
|
// See message above about wire-compatiblity with `ImportModel`.
|
||||||
|
|
|
@ -20,7 +20,9 @@ class NgDepsModel extends GeneratedMessage {
|
||||||
..a(6, 'sourceFile', PbFieldType.OS)
|
..a(6, 'sourceFile', PbFieldType.OS)
|
||||||
..p(7, 'getters', PbFieldType.PS)
|
..p(7, 'getters', PbFieldType.PS)
|
||||||
..p(8, 'setters', PbFieldType.PS)
|
..p(8, 'setters', PbFieldType.PS)
|
||||||
..p(9, 'methods', PbFieldType.PS);
|
..p(9, 'methods', PbFieldType.PS)
|
||||||
|
..pp(10, 'depImports', PbFieldType.PM, ImportModel.$checkItem,
|
||||||
|
ImportModel.create);
|
||||||
|
|
||||||
NgDepsModel() : super();
|
NgDepsModel() : super();
|
||||||
NgDepsModel.fromBuffer(List<int> i,
|
NgDepsModel.fromBuffer(List<int> i,
|
||||||
|
@ -72,6 +74,8 @@ class NgDepsModel extends GeneratedMessage {
|
||||||
List<String> get setters => $_get(7, 8, null);
|
List<String> get setters => $_get(7, 8, null);
|
||||||
|
|
||||||
List<String> get methods => $_get(8, 9, null);
|
List<String> get methods => $_get(8, 9, null);
|
||||||
|
|
||||||
|
List<ImportModel> get depImports => $_get(9, 10, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ReadonlyNgDepsModel extends NgDepsModel with ReadonlyMessageMixin {}
|
class _ReadonlyNgDepsModel extends NgDepsModel with ReadonlyMessageMixin {}
|
||||||
|
@ -106,12 +110,19 @@ const NgDepsModel$json = const {
|
||||||
const {'1': 'getters', '3': 7, '4': 3, '5': 9},
|
const {'1': 'getters', '3': 7, '4': 3, '5': 9},
|
||||||
const {'1': 'setters', '3': 8, '4': 3, '5': 9},
|
const {'1': 'setters', '3': 8, '4': 3, '5': 9},
|
||||||
const {'1': 'methods', '3': 9, '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'
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generated with:
|
* Generated with:
|
||||||
* ng_deps_model.proto (ab93a7f3c411be8a6dafe914f8aae56027e1bac6)
|
* ng_deps_model.proto (64702efcc1d7fb434f3652943ba051104960ffd5)
|
||||||
* libprotoc 2.6.1
|
* libprotoc 2.6.1
|
||||||
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
|
* dart-protoc-plugin (af5fc2bf1de367a434c3b1847ab260510878ffc0)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -32,4 +32,8 @@ message NgDepsModel {
|
||||||
// The names of methods that should be registered in the Angular 2 reflection
|
// The names of methods that should be registered in the Angular 2 reflection
|
||||||
// framework.
|
// framework.
|
||||||
repeated string methods = 9;
|
repeated string methods = 9;
|
||||||
|
|
||||||
|
// Imports for the .ng_deps.dart files associated with the declared `imports`
|
||||||
|
// and `exports` for this file.
|
||||||
|
repeated ImportModel dep_imports = 10;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,10 +15,10 @@ import 'package:barback/barback.dart';
|
||||||
/// dependencies' associated `.ng_deps.dart` files.
|
/// dependencies' associated `.ng_deps.dart` files.
|
||||||
///
|
///
|
||||||
/// For example, if entry_point.ng_deps.dart imports dependency.dart, this
|
/// For example, if entry_point.ng_deps.dart imports dependency.dart, this
|
||||||
/// will check if dependency.ng_meta.json exists. If it does, we add an import
|
/// will check if dependency.ng_meta.json exists. If it does, we add an entry
|
||||||
/// to dependency.ng_deps.dart to the entry_point [NgDepsModel] and set
|
/// to the `depImports` of [NgDepsModel] for dependency.ng_deps.dart. We can
|
||||||
/// `isNgDeps` to `true` to signify that it is a dependency on which we need to
|
/// use this information later to ensure that each file's dependencies are
|
||||||
/// call `initReflector`.
|
/// initialized when that file is initialized.
|
||||||
Future<NgDepsModel> linkNgDeps(NgDepsModel ngDepsModel, AssetReader reader,
|
Future<NgDepsModel> linkNgDeps(NgDepsModel ngDepsModel, AssetReader reader,
|
||||||
AssetId assetId, UrlResolver resolver) async {
|
AssetId assetId, UrlResolver resolver) async {
|
||||||
if (ngDepsModel == null) return null;
|
if (ngDepsModel == null) return null;
|
||||||
|
@ -34,28 +34,16 @@ Future<NgDepsModel> linkNgDeps(NgDepsModel ngDepsModel, AssetReader reader,
|
||||||
}
|
}
|
||||||
|
|
||||||
final seen = new Set<String>();
|
final seen = new Set<String>();
|
||||||
for (var i = ngDepsModel.imports.length - 1; i >= 0; --i) {
|
var idx = 0;
|
||||||
var import = ngDepsModel.imports[i];
|
final allDeps = [ngDepsModel.imports, ngDepsModel.exports].expand((e) => e);
|
||||||
if (linkedDepsMap.containsKey(import.uri) && !seen.contains(import.uri)) {
|
for (var dep in allDeps) {
|
||||||
seen.add(import.uri);
|
if (linkedDepsMap.containsKey(dep.uri) && !seen.contains(dep.uri)) {
|
||||||
|
seen.add(dep.uri);
|
||||||
var linkedModel = new ImportModel()
|
var linkedModel = new ImportModel()
|
||||||
..isNgDeps = true
|
..uri = toDepsExtension(dep.uri)
|
||||||
..uri = toDepsExtension(import.uri)
|
..prefix = 'i${idx++}';
|
||||||
..prefix = 'i$i';
|
|
||||||
// TODO(kegluneq): Preserve combinators?
|
// TODO(kegluneq): Preserve combinators?
|
||||||
ngDepsModel.imports.insert(i + 1, linkedModel);
|
ngDepsModel.depImports.add(linkedModel);
|
||||||
}
|
|
||||||
}
|
|
||||||
for (var i = 0, iLen = ngDepsModel.exports.length; i < iLen; ++i) {
|
|
||||||
var export = ngDepsModel.exports[i];
|
|
||||||
if (linkedDepsMap.containsKey(export.uri) && !seen.contains(export.uri)) {
|
|
||||||
seen.add(export.uri);
|
|
||||||
var linkedModel = new ImportModel()
|
|
||||||
..isNgDeps = true
|
|
||||||
..uri = toDepsExtension(export.uri)
|
|
||||||
..prefix = 'i${ngDepsModel.imports.length}';
|
|
||||||
// TODO(kegluneq): Preserve combinators?
|
|
||||||
ngDepsModel.imports.add(linkedModel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ngDepsModel;
|
return ngDepsModel;
|
||||||
|
|
|
@ -22,7 +22,8 @@ import 'package:barback/barback.dart';
|
||||||
Future<CompileDataResults> createCompileData(
|
Future<CompileDataResults> createCompileData(
|
||||||
AssetReader reader, AssetId assetId, List<String> ambientDirectives) async {
|
AssetReader reader, AssetId assetId, List<String> ambientDirectives) async {
|
||||||
return logElapsedAsync(() async {
|
return logElapsedAsync(() async {
|
||||||
final creator = await _CompileDataCreator.create(reader, assetId, ambientDirectives);
|
final creator =
|
||||||
|
await _CompileDataCreator.create(reader, assetId, ambientDirectives);
|
||||||
return creator != null ? creator.createCompileData() : null;
|
return creator != null ? creator.createCompileData() : null;
|
||||||
}, operationName: 'createCompileData', assetId: assetId);
|
}, operationName: 'createCompileData', assetId: assetId);
|
||||||
}
|
}
|
||||||
|
@ -43,10 +44,11 @@ class _CompileDataCreator {
|
||||||
final NgMeta ngMeta;
|
final NgMeta ngMeta;
|
||||||
final List<String> ambientDirectives;
|
final List<String> ambientDirectives;
|
||||||
|
|
||||||
_CompileDataCreator(this.reader, this.entryPoint, this.ngMeta, this.ambientDirectives);
|
_CompileDataCreator(
|
||||||
|
this.reader, this.entryPoint, this.ngMeta, this.ambientDirectives);
|
||||||
|
|
||||||
static Future<_CompileDataCreator> create(
|
static Future<_CompileDataCreator> create(AssetReader reader, AssetId assetId,
|
||||||
AssetReader reader, AssetId assetId, List<String> ambientDirectives) async {
|
List<String> ambientDirectives) async {
|
||||||
if (!(await reader.hasInput(assetId))) return null;
|
if (!(await reader.hasInput(assetId))) return null;
|
||||||
final json = await reader.readAsString(assetId);
|
final json = await reader.readAsString(assetId);
|
||||||
if (json == null || json.isEmpty) return null;
|
if (json == null || json.isEmpty) return null;
|
||||||
|
@ -119,7 +121,8 @@ class _CompileDataCreator {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<CompileDirectiveMetadata>> _readAmbientDirectivesFromUri(String uri, String token) async {
|
Future<List<CompileDirectiveMetadata>> _readAmbientDirectivesFromUri(
|
||||||
|
String uri, String token) async {
|
||||||
final metaAssetId = fromUri(toMetaExtension(uri));
|
final metaAssetId = fromUri(toMetaExtension(uri));
|
||||||
if (await reader.hasInput(metaAssetId)) {
|
if (await reader.hasInput(metaAssetId)) {
|
||||||
try {
|
try {
|
||||||
|
@ -129,19 +132,16 @@ class _CompileDataCreator {
|
||||||
|
|
||||||
if (newMetadata.types.containsKey(token)) {
|
if (newMetadata.types.containsKey(token)) {
|
||||||
return [newMetadata.types[token]];
|
return [newMetadata.types[token]];
|
||||||
|
|
||||||
} else if (newMetadata.aliases.containsKey(token)) {
|
} else if (newMetadata.aliases.containsKey(token)) {
|
||||||
return newMetadata.flatten(token);
|
return newMetadata.flatten(token);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
log.warning('Could not resolve ambient directive ${token} in ${uri}',
|
log.warning(
|
||||||
|
'Could not resolve ambient directive ${token} in ${uri}',
|
||||||
asset: metaAssetId);
|
asset: metaAssetId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (ex, stackTrace) {
|
} catch (ex, stackTrace) {
|
||||||
log.warning('Failed to decode: $ex, $stackTrace',
|
log.warning('Failed to decode: $ex, $stackTrace', asset: metaAssetId);
|
||||||
asset: metaAssetId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
|
@ -160,7 +160,7 @@ class _CompileDataCreator {
|
||||||
final resolver = const TransformerUrlResolver();
|
final resolver = const TransformerUrlResolver();
|
||||||
|
|
||||||
ngMeta.ngDeps.imports
|
ngMeta.ngDeps.imports
|
||||||
.where((model) => !model.isNgDeps && !isDartCoreUri(model.uri))
|
.where((model) => !isDartCoreUri(model.uri))
|
||||||
.forEach((model) {
|
.forEach((model) {
|
||||||
var prefix = model.prefix == null ? '' : model.prefix;
|
var prefix = model.prefix == null ? '' : model.prefix;
|
||||||
map
|
map
|
||||||
|
|
Loading…
Reference in New Issue