feat(dart/transform) Remove import of dart:mirrors

+ Precede the call to `new ReflectionCapabilities()` with our generated
code which populates the reflection map statically.
+ Add the import of our generated code.
+ Once we are generating all necessary code, we will remove the
import of reflection_capabilities.dart and the instantiation of
`ReflectionCapabilities`, cutting the dependency on dart:mirrors.

Closes #761
This commit is contained in:
Tim Blasi
2015-02-20 15:16:59 -08:00
committed by Misko Hevery
parent fad25c2b10
commit 3b6aaf9054
25 changed files with 339 additions and 187 deletions
@@ -1,3 +0,0 @@
<html><head></head><body>
<script type="application/dart" src="index.dart"></script>
</body></html>
@@ -1,3 +0,0 @@
<html><head></head><body>
<script type="application/dart" src="index.bootstrap.dart"></script>
</body></html>
@@ -1,6 +0,0 @@
library web_foo;
import 'package:angular2/src/core/annotations/annotations.dart';
import 'package:angular2/src/core/application.dart';
void main() {}
@@ -1,10 +1,11 @@
library angular2.src.transform.generated;
import 'package:angular2/src/reflection/reflection.dart' show reflector;
import 'bar.dart' as i0;
import 'foo.dart' as i1;
import 'package:angular2/src/core/annotations/annotations.dart' as i2;
import 'index.dart' as i3;
main() {
setupReflection() {
reflector
..registerType(i0.MyComponent, {
"factory": (i1.MyContext c) => new i0.MyComponent(c),
@@ -13,5 +14,4 @@ main() {
const i2.Component(componentServices: const [i1.MyContext])
]
});
i3.main();
}
@@ -1,8 +1,10 @@
library web_foo;
import 'package:angular2/src/core/application.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart';
void main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(MyComponent);
}
@@ -0,0 +1,9 @@
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library angular2.test.transform;
/// Mocked out version of [ReflectionCapabilities], defined in
/// src/reflection/reflection_capabilities.dart. Importing the actual file in
/// tests causes issues with resolution due to transitive dependencies.
class ReflectionCapabilities {}
@@ -1,14 +1,14 @@
library angular2.src.transform.generated;
import 'package:angular2/src/reflection/reflection.dart' show reflector;
import 'bar.dart' as i0;
import 'package:angular2/src/core/annotations/annotations.dart' as i1;
import 'index.dart' as i2;
main() {
setupReflection() {
reflector
..registerType(i0.MyComponent, {
"factory": () => new i0.MyComponent(),
"parameters": const [const []],
"annotations": const [const i1.Component(selector: '[soup]')]
});
i2.main();
}
@@ -0,0 +1,13 @@
library web_foo;
import 'package:angular2/src/core/application.dart';
import 'package:angular2/src/reflection/reflection.dart';
import 'index.bootstrap.dart' as ngStaticInit;
import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart';
void main() {
ngStaticInit.setupReflection();
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(MyComponent);
}
@@ -1,8 +1,11 @@
library web_foo;
import 'package:angular2/src/core/application.dart';
import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart';
void main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(MyComponent);
}
@@ -1,14 +1,14 @@
library angular2.src.transform.generated;
import 'package:angular2/src/reflection/reflection.dart' show reflector;
import 'bar.dart' as i0;
import 'package:angular2/src/core/annotations/annotations.dart' as i1;
import 'index.dart' as i2;
main() {
setupReflection() {
reflector
..registerType(i0.MyComponent, {
"factory": () => new i0.MyComponent(),
"parameters": const [const []],
"annotations": const [const i1.Component(selector: '[soup]')]
});
i2.main();
}
@@ -1,8 +1,10 @@
library web_foo;
import 'package:angular2/src/core/application.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart';
void main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(MyComponent);
}
@@ -18,7 +18,8 @@ main() {
var formatter = new DartFormatter();
var transform = new AngularTransformer(new TransformerOptions('web/index.dart',
'web/index.dart', 'web/index.bootstrap.dart', 'web/index.html'));
reflectionEntryPoint: 'web/index.dart',
newEntryPoint: 'web/index.bootstrap.dart'));
class TestConfig {
final String name;
@@ -32,42 +33,37 @@ class TestConfig {
}
void _runTests() {
// Each test has its own directory for inputs & an `expected` directory for
// expected outputs.
/*
* Each test has its own directory for inputs & an `expected` directory for
* expected outputs.
*
* In addition to these declared inputs, we inject a set of common inputs for
* every test.
*/
var commonInputs = {
'angular2|lib/src/core/annotations/annotations.dart':
'../../lib/src/core/annotations/annotations.dart',
'angular2|lib/src/core/application.dart': 'common.dart',
'angular2|lib/src/reflection/reflection_capabilities.dart':
'reflection_capabilities.dart'
};
var tests = [
new TestConfig('Html entry point',
inputs: {
'a|web/index.html': 'common.html',
'a|web/index.dart': 'html_entry_point_files/index.dart',
'angular2|lib/src/core/annotations/annotations.dart':
'../../lib/src/core/annotations/annotations.dart',
'angular2|lib/src/core/application.dart': 'common.dart'
},
outputs: {
'a|web/index.html': 'html_entry_point_files/expected/index.html'
}),
new TestConfig('Simple',
inputs: {
'a|web/index.html': 'common.html',
'a|web/index.dart': 'simple_annotation_files/index.dart',
'a|web/bar.dart': 'simple_annotation_files/bar.dart',
'angular2|lib/src/core/annotations/annotations.dart':
'../../lib/src/core/annotations/annotations.dart',
'angular2|lib/src/core/application.dart': 'common.dart'
'a|web/bar.dart': 'simple_annotation_files/bar.dart'
},
outputs: {
'a|web/index.bootstrap.dart':
'simple_annotation_files/expected/index.bootstrap.dart'
'simple_annotation_files/expected/index.bootstrap.dart',
'a|web/index.dart': 'simple_annotation_files/expected/index.dart',
}),
new TestConfig('Two injected dependencies',
inputs: {
'a|web/index.html': 'common.html',
'a|web/index.dart': 'two_deps_files/index.dart',
'a|web/foo.dart': 'two_deps_files/foo.dart',
'a|web/bar.dart': 'two_deps_files/bar.dart',
'angular2|lib/src/core/annotations/annotations.dart':
'../../lib/src/core/annotations/annotations.dart',
'angular2|lib/src/core/application.dart': 'common.dart'
'a|web/bar.dart': 'two_deps_files/bar.dart'
},
outputs: {
'a|web/index.bootstrap.dart':
@@ -75,7 +71,6 @@ void _runTests() {
}),
new TestConfig('List of types',
inputs: {
'a|web/index.html': 'common.html',
'a|web/index.dart': 'list_of_types_files/index.dart',
'a|web/foo.dart': 'list_of_types_files/foo.dart',
'a|web/bar.dart': 'list_of_types_files/bar.dart',
@@ -89,7 +84,6 @@ void _runTests() {
}),
new TestConfig('Component with synthetic Constructor',
inputs: {
'a|web/index.html': 'common.html',
'a|web/index.dart': 'synthetic_ctor_files/index.dart',
'a|web/bar.dart': 'synthetic_ctor_files/bar.dart',
'angular2|lib/src/core/annotations/annotations.dart':
@@ -102,7 +96,6 @@ void _runTests() {
}),
new TestConfig('Component with two annotations',
inputs: {
'a|web/index.html': 'common.html',
'a|web/index.dart': 'two_annotations_files/index.dart',
'a|web/bar.dart': 'two_annotations_files/bar.dart',
'angular2|lib/src/core/annotations/annotations.dart':
@@ -114,17 +107,20 @@ void _runTests() {
outputs: {
'a|web/index.bootstrap.dart':
'two_annotations_files/expected/index.bootstrap.dart'
}),
})
];
var cache = {};
for (var config in tests) {
// Read in input & output files.
config.assetPathToInputPath.forEach((key, value) {
config.assetPathToInputPath[key] =
cache.putIfAbsent(value, () => new File('test/transform/${value}').readAsStringSync());
});
config.assetPathToInputPath
..addAll(commonInputs)
..forEach((key, value) {
config.assetPathToInputPath[key] = cache.putIfAbsent(value,
() => new File('test/transform/${value}').readAsStringSync());
});
config.assetPathToExpectedOutputPath.forEach((key, value) {
config.assetPathToExpectedOutputPath[key] = cache.putIfAbsent(value, () {
var code = new File('test/transform/${value}').readAsStringSync();
@@ -1,10 +1,11 @@
library angular2.src.transform.generated;
import 'package:angular2/src/reflection/reflection.dart' show reflector;
import 'bar.dart' as i0;
import 'package:angular2/src/core/annotations/annotations.dart' as i1;
import 'package:angular2/src/core/annotations/template.dart' as i2;
import 'index.dart' as i3;
main() {
setupReflection() {
reflector
..registerType(i0.MyComponent, {
"factory": () => new i0.MyComponent(),
@@ -14,5 +15,4 @@ main() {
const i2.Template(inline: 'Salad')
]
});
i3.main();
}
@@ -1,8 +1,10 @@
library web_foo;
import 'package:angular2/src/core/application.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart';
void main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(MyComponent);
}
@@ -1,10 +1,11 @@
library angular2.src.transform.generated;
import 'package:angular2/src/reflection/reflection.dart' show reflector;
import 'bar.dart' as i0;
import 'foo.dart' as i1;
import 'package:angular2/src/core/annotations/annotations.dart' as i2;
import 'index.dart' as i3;
main() {
setupReflection() {
reflector
..registerType(i0.MyComponent, {
"factory":
@@ -12,5 +13,4 @@ main() {
"parameters": const [const [i1.MyContext, String]],
"annotations": const [const i2.Component(selector: i1.preDefinedSelector)]
});
i3.main();
}
@@ -1,8 +1,10 @@
library web_foo;
import 'package:angular2/src/core/application.dart';
import 'package:angular2/src/reflection/reflection_capabilities.dart';
import 'bar.dart';
void main() {
reflector.reflectionCapabilities = new ReflectionCapabilities();
bootstrap(MyComponent);
}