Skip to content

Commit 9d0b61b

Browse files
author
Tim Blasi
committed
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.
1 parent f21e782 commit 9d0b61b

7 files changed

Lines changed: 47 additions & 57 deletions

File tree

modules_dart/transform/lib/src/transform/common/code/ng_deps_code.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ abstract class NgDepsWriterMixin
157157
// deferred. Instead `DeferredRewriter` will rewrite the code as to load
158158
// `ng_deps` in a deferred way.
159159
model.imports.where((i) => !i.isDeferred).forEach(writeImportModel);
160+
model.depImports.where((i) => !i.isDeferred).forEach(writeImportModel);
160161

161162
writeExportModel(new ExportModel()..uri = model.sourceFile);
162163
model.exports.forEach(writeExportModel);
@@ -202,11 +203,9 @@ abstract class NgDepsWriterMixin
202203
buffer.writeln(';');
203204
}
204205

205-
// Call the setup method for our imports that are `.ng_deps` imports.
206-
for (var importModel in model.imports) {
207-
if (importModel.isNgDeps) {
208-
buffer.writeln('${importModel.prefix}.${SETUP_METHOD_NAME}();');
209-
}
206+
// Call the setup method for our dependencies.
207+
for (var importModel in model.depImports) {
208+
buffer.writeln('${importModel.prefix}.${SETUP_METHOD_NAME}();');
210209
}
211210

212211
buffer.writeln('}');

modules_dart/transform/lib/src/transform/common/model/import_export_model.pb.dart

Lines changed: 2 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

modules_dart/transform/lib/src/transform/common/model/import_export_model.proto

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ message ImportModel {
1616
optional string prefix = 4;
1717

1818
optional bool is_deferred = 5;
19-
20-
optional bool is_ng_deps = 6;
2119
}
2220

2321
// See message above about wire-compatiblity with `ImportModel`.

modules_dart/transform/lib/src/transform/common/model/ng_deps_model.pb.dart

Lines changed: 13 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

modules_dart/transform/lib/src/transform/common/model/ng_deps_model.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,8 @@ message NgDepsModel {
3232
// The names of methods that should be registered in the Angular 2 reflection
3333
// framework.
3434
repeated string methods = 9;
35+
36+
// Imports for the .ng_deps.dart files associated with the declared `imports`
37+
// and `exports` for this file.
38+
repeated ImportModel dep_imports = 10;
3539
}

modules_dart/transform/lib/src/transform/directive_metadata_linker/ng_deps_linker.dart

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import 'package:barback/barback.dart';
1515
/// dependencies' associated `.ng_deps.dart` files.
1616
///
1717
/// For example, if entry_point.ng_deps.dart imports dependency.dart, this
18-
/// will check if dependency.ng_meta.json exists. If it does, we add an import
19-
/// to dependency.ng_deps.dart to the entry_point [NgDepsModel] and set
20-
/// `isNgDeps` to `true` to signify that it is a dependency on which we need to
21-
/// call `initReflector`.
18+
/// will check if dependency.ng_meta.json exists. If it does, we add an entry
19+
/// to the `depImports` of [NgDepsModel] for dependency.ng_deps.dart. We can
20+
/// use this information later to ensure that each file's dependencies are
21+
/// initialized when that file is initialized.
2222
Future<NgDepsModel> linkNgDeps(NgDepsModel ngDepsModel, AssetReader reader,
2323
AssetId assetId, UrlResolver resolver) async {
2424
if (ngDepsModel == null) return null;
@@ -34,28 +34,16 @@ Future<NgDepsModel> linkNgDeps(NgDepsModel ngDepsModel, AssetReader reader,
3434
}
3535

3636
final seen = new Set<String>();
37-
for (var i = ngDepsModel.imports.length - 1; i >= 0; --i) {
38-
var import = ngDepsModel.imports[i];
39-
if (linkedDepsMap.containsKey(import.uri) && !seen.contains(import.uri)) {
40-
seen.add(import.uri);
37+
var idx = 0;
38+
final allDeps = [ngDepsModel.imports, ngDepsModel.exports].expand((e) => e);
39+
for (var dep in allDeps) {
40+
if (linkedDepsMap.containsKey(dep.uri) && !seen.contains(dep.uri)) {
41+
seen.add(dep.uri);
4142
var linkedModel = new ImportModel()
42-
..isNgDeps = true
43-
..uri = toDepsExtension(import.uri)
44-
..prefix = 'i$i';
43+
..uri = toDepsExtension(dep.uri)
44+
..prefix = 'i${idx++}';
4545
// TODO(kegluneq): Preserve combinators?
46-
ngDepsModel.imports.insert(i + 1, linkedModel);
47-
}
48-
}
49-
for (var i = 0, iLen = ngDepsModel.exports.length; i < iLen; ++i) {
50-
var export = ngDepsModel.exports[i];
51-
if (linkedDepsMap.containsKey(export.uri) && !seen.contains(export.uri)) {
52-
seen.add(export.uri);
53-
var linkedModel = new ImportModel()
54-
..isNgDeps = true
55-
..uri = toDepsExtension(export.uri)
56-
..prefix = 'i${ngDepsModel.imports.length}';
57-
// TODO(kegluneq): Preserve combinators?
58-
ngDepsModel.imports.add(linkedModel);
46+
ngDepsModel.depImports.add(linkedModel);
5947
}
6048
}
6149
return ngDepsModel;

modules_dart/transform/lib/src/transform/template_compiler/compile_data_creator.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import 'package:barback/barback.dart';
2222
Future<CompileDataResults> createCompileData(
2323
AssetReader reader, AssetId assetId, List<String> ambientDirectives) async {
2424
return logElapsedAsync(() async {
25-
final creator = await _CompileDataCreator.create(reader, assetId, ambientDirectives);
25+
final creator =
26+
await _CompileDataCreator.create(reader, assetId, ambientDirectives);
2627
return creator != null ? creator.createCompileData() : null;
2728
}, operationName: 'createCompileData', assetId: assetId);
2829
}
@@ -43,10 +44,11 @@ class _CompileDataCreator {
4344
final NgMeta ngMeta;
4445
final List<String> ambientDirectives;
4546

46-
_CompileDataCreator(this.reader, this.entryPoint, this.ngMeta, this.ambientDirectives);
47+
_CompileDataCreator(
48+
this.reader, this.entryPoint, this.ngMeta, this.ambientDirectives);
4749

48-
static Future<_CompileDataCreator> create(
49-
AssetReader reader, AssetId assetId, List<String> ambientDirectives) async {
50+
static Future<_CompileDataCreator> create(AssetReader reader, AssetId assetId,
51+
List<String> ambientDirectives) async {
5052
if (!(await reader.hasInput(assetId))) return null;
5153
final json = await reader.readAsString(assetId);
5254
if (json == null || json.isEmpty) return null;
@@ -119,7 +121,8 @@ class _CompileDataCreator {
119121
return res;
120122
}
121123

122-
Future<List<CompileDirectiveMetadata>> _readAmbientDirectivesFromUri(String uri, String token) async {
124+
Future<List<CompileDirectiveMetadata>> _readAmbientDirectivesFromUri(
125+
String uri, String token) async {
123126
final metaAssetId = fromUri(toMetaExtension(uri));
124127
if (await reader.hasInput(metaAssetId)) {
125128
try {
@@ -129,19 +132,16 @@ class _CompileDataCreator {
129132

130133
if (newMetadata.types.containsKey(token)) {
131134
return [newMetadata.types[token]];
132-
133135
} else if (newMetadata.aliases.containsKey(token)) {
134136
return newMetadata.flatten(token);
135-
136137
} else {
137-
log.warning('Could not resolve ambient directive ${token} in ${uri}',
138+
log.warning(
139+
'Could not resolve ambient directive ${token} in ${uri}',
138140
asset: metaAssetId);
139141
}
140-
141142
}
142143
} catch (ex, stackTrace) {
143-
log.warning('Failed to decode: $ex, $stackTrace',
144-
asset: metaAssetId);
144+
log.warning('Failed to decode: $ex, $stackTrace', asset: metaAssetId);
145145
}
146146
}
147147
return [];
@@ -160,7 +160,7 @@ class _CompileDataCreator {
160160
final resolver = const TransformerUrlResolver();
161161

162162
ngMeta.ngDeps.imports
163-
.where((model) => !model.isNgDeps && !isDartCoreUri(model.uri))
163+
.where((model) => !isDartCoreUri(model.uri))
164164
.forEach((model) {
165165
var prefix = model.prefix == null ? '' : model.prefix;
166166
map

0 commit comments

Comments
 (0)