Skip to content

Commit 6b40293

Browse files
author
Tim Blasi
committed
refactor(dart/transform): Run ReflectionRemover after codegen phases
Move the `ReflectionRemover` phase to execute after the codegen phases.
1 parent eba7073 commit 6b40293

File tree

6 files changed

+66
-63
lines changed

6 files changed

+66
-63
lines changed

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
library angular2.transform.common.code.import_export_code;
22

33
import 'package:analyzer/analyzer.dart';
4+
import 'package:angular2/src/transform/common/mirror_matcher.dart';
45
import 'package:angular2/src/transform/common/model/import_export_model.pb.dart';
56

7+
const _mirrorMatcher = const MirrorMatcher();
8+
69
/// Visitor responsible for parsing [ImportDirective]s into [ImportModel]s.
710
class ImportVisitor extends SimpleAstVisitor<ImportModel> {
811
@override
912
ImportModel visitImportDirective(ImportDirective node) {
1013
if (node.isSynthetic) return null;
1114

15+
/// We skip this, as it transitively imports 'dart:mirrors'
16+
if (_mirrorMatcher.hasReflectionCapabilitiesUri(node)) return null;
17+
String uri = stringLiteralToString(node.uri);
18+
// The bootstrap code also transitively imports 'dart:mirrors'
19+
if (_mirrorMatcher.hasBootstrapUri(node)) {
20+
uri = BOOTSTRAP_STATIC_URI;
21+
}
22+
1223
var model = new ImportModel()
13-
..uri = stringLiteralToString(node.uri)
24+
..uri = uri
1425
..isDeferred = node.deferredKeyword != null;
1526
if (node.prefix != null) {
1627
model.prefix = node.prefix.name;
@@ -26,7 +37,15 @@ class ExportVisitor extends SimpleAstVisitor<ExportModel> {
2637
ExportModel visitExportDirective(ExportDirective node) {
2738
if (node.isSynthetic) return null;
2839

29-
var model = new ExportModel()..uri = stringLiteralToString(node.uri);
40+
/// We skip this, as it transitively imports 'dart:mirrors'
41+
if (_mirrorMatcher.hasReflectionCapabilitiesUri(node)) return null;
42+
String uri = stringLiteralToString(node.uri);
43+
// The bootstrap code also transitively imports 'dart:mirrors'
44+
if (_mirrorMatcher.hasBootstrapUri(node)) {
45+
uri = BOOTSTRAP_STATIC_URI;
46+
}
47+
48+
var model = new ExportModel()..uri = uri;
3049
_populateCombinators(node, model);
3150
return model;
3251
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
library angular2.transform.common.mirror_matcher;
2+
3+
import 'package:analyzer/src/generated/ast.dart';
4+
import 'package:angular2/src/transform/common/names.dart';
5+
6+
const BOOTSTRAP_STATIC_URI = 'package:angular2/bootstrap_static.dart';
7+
const BOOTSTRAP_URI = 'package:angular2/bootstrap.dart';
8+
const REFLECTION_CAPABILITIES_URI =
9+
'package:angular2/src/core/reflection/reflection_capabilities.dart';
10+
11+
/// Syntactially checks for code related to the use of `dart:mirrors`.
12+
///
13+
/// Checks various [AstNode]s to determine if they are
14+
/// - Libraries that transitively import `dart:mirrors`
15+
/// - Instantiations of [ReflectionCapabilities]
16+
class MirrorMatcher {
17+
const MirrorMatcher();
18+
19+
bool isNewReflectionCapabilities(InstanceCreationExpression node) =>
20+
'${node.constructorName.type.name}' == REFLECTION_CAPABILITIES_NAME;
21+
22+
bool hasReflectionCapabilitiesUri(UriBasedDirective node) {
23+
return node.uri.stringValue == REFLECTION_CAPABILITIES_URI;
24+
}
25+
26+
bool hasBootstrapUri(UriBasedDirective node) {
27+
return node.uri.stringValue == BOOTSTRAP_URI;
28+
}
29+
}

modules_dart/transform/lib/src/transform/reflection_remover/ast_tester.dart

Lines changed: 0 additions & 44 deletions
This file was deleted.

modules_dart/transform/lib/src/transform/reflection_remover/rewriter.dart

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,33 @@ library angular2.transform.reflection_remover.rewriter;
22

33
import 'package:analyzer/src/generated/ast.dart';
44
import 'package:angular2/src/transform/common/logging.dart';
5+
import 'package:angular2/src/transform/common/mirror_matcher.dart';
56
import 'package:angular2/src/transform/common/mirror_mode.dart';
67
import 'package:angular2/src/transform/common/names.dart';
78
import 'package:path/path.dart' as path;
89

9-
import 'ast_tester.dart';
1010
import 'codegen.dart';
1111

1212
class Rewriter {
1313
final String _code;
1414
final Codegen _codegen;
15-
final AstTester _tester;
15+
final MirrorMatcher _mirrorMatcher;
1616
final MirrorMode _mirrorMode;
1717
final bool _writeStaticInit;
1818

1919
Rewriter(this._code, this._codegen,
20-
{AstTester tester,
20+
{MirrorMatcher mirrorMatcher,
2121
MirrorMode mirrorMode: MirrorMode.none,
2222
bool writeStaticInit: true})
2323
: _mirrorMode = mirrorMode,
2424
_writeStaticInit = writeStaticInit,
25-
_tester = tester == null ? const AstTester() : tester;
25+
_mirrorMatcher =
26+
mirrorMatcher == null ? const MirrorMatcher() : mirrorMatcher;
2627

2728
/// Rewrites the provided code removing imports of the
2829
/// {@link ReflectionCapabilities} library and instantiations of
2930
/// {@link ReflectionCapabilities}, as detected by the (potentially) provided
30-
/// {@link AstTester}.
31+
/// {@link MirrorMatcher}.
3132
///
3233
/// To the extent possible, this method does not change line numbers or
3334
/// offsets in the provided code to facilitate debugging via source maps.
@@ -62,9 +63,9 @@ class _RewriterVisitor extends Object with RecursiveAstVisitor<Object> {
6263
Object visitImportDirective(ImportDirective node) {
6364
buf.write(_rewriter._code.substring(_currentIndex, node.offset));
6465
_currentIndex = node.offset;
65-
if (_rewriter._tester.isReflectionCapabilitiesImport(node)) {
66+
if (_rewriter._mirrorMatcher.hasReflectionCapabilitiesUri(node)) {
6667
_rewriteReflectionCapabilitiesImport(node);
67-
} else if (_rewriter._tester.isBootstrapImport(node)) {
68+
} else if (_rewriter._mirrorMatcher.hasBootstrapUri(node)) {
6869
_rewriteBootstrapImportToStatic(node);
6970
}
7071
if (!_importAdded && _rewriter._writeStaticInit) {
@@ -78,7 +79,8 @@ class _RewriterVisitor extends Object with RecursiveAstVisitor<Object> {
7879
@override
7980
Object visitAssignmentExpression(AssignmentExpression node) {
8081
if (node.rightHandSide is InstanceCreationExpression &&
81-
_rewriter._tester.isNewReflectionCapabilities(node.rightHandSide)) {
82+
_rewriter._mirrorMatcher
83+
.isNewReflectionCapabilities(node.rightHandSide)) {
8284
reflectionCapabilityAssignments.add(node);
8385
_rewriteReflectionCapabilitiesAssignment(node);
8486
}
@@ -87,7 +89,7 @@ class _RewriterVisitor extends Object with RecursiveAstVisitor<Object> {
8789

8890
@override
8991
Object visitInstanceCreationExpression(InstanceCreationExpression node) {
90-
if (_rewriter._tester.isNewReflectionCapabilities(node) &&
92+
if (_rewriter._mirrorMatcher.isNewReflectionCapabilities(node) &&
9193
!reflectionCapabilityAssignments.contains(node.parent)) {
9294
logger.error('Unexpected format in creation of '
9395
'${REFLECTION_CAPABILITIES_NAME}');
@@ -112,10 +114,10 @@ class _RewriterVisitor extends Object with RecursiveAstVisitor<Object> {
112114

113115
_rewriteBootstrapImportToStatic(ImportDirective node) {
114116
if (_rewriter._writeStaticInit) {
115-
// rewrite `bootstrap.dart` to `bootstrap_static.dart`
117+
// rewrite bootstrap import to its static version.
116118
buf.write(_rewriter._code.substring(_currentIndex, node.offset));
117119
// TODO(yjbanov): handle import "..." show/hide ...
118-
buf.write("import 'package:angular2/bootstrap_static.dart';");
120+
buf.write("import '$BOOTSTRAP_STATIC_URI';");
119121
} else {
120122
// leave it as is
121123
buf.write(_rewriter._code.substring(_currentIndex, node.end));

modules_dart/transform/lib/src/transform/transformer.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ class AngularTransformerGroup extends TransformerGroup {
3232
];
3333
} else {
3434
phases = [
35-
[new ReflectionRemover(options)],
3635
[new DirectiveProcessor(options)],
3736
[new DirectiveMetadataLinker()],
37+
[new ReflectionRemover(options)],
3838
[
3939
new DeferredRewriter(options),
4040
new StylesheetCompiler(),

modules_dart/transform/test/transform/integration/simple_annotation_files/expected/index.ng_deps.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,14 @@ library web_foo.ng_deps.dart;
33
import 'index.dart';
44
import 'package:angular2/src/core/reflection/reflection.dart' as _ngRef;
55
import 'package:angular2/bootstrap_static.dart';
6-
import 'index.ng_deps.dart' as ngStaticInit;
7-
import 'index.ng_deps.dart' as i1;
86
import 'package:angular2/src/core/reflection/reflection.dart';
97
import 'bar.dart';
10-
import 'bar.ng_deps.dart' as i3;
8+
import 'bar.ng_deps.dart' as i2;
119
export 'index.dart';
1210

1311
var _visited = false;
1412
void initReflector() {
1513
if (_visited) return;
1614
_visited = true;
17-
i1.initReflector();
18-
i3.initReflector();
15+
i2.initReflector();
1916
}

0 commit comments

Comments
 (0)