Skip to content
This repository was archived by the owner on Jan 20, 2018. It is now read-only.

Commit 1266742

Browse files
committed
1 parent a79fe40 commit 1266742

17 files changed

+140
-37
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 0.3.0-dev
2+
3+
* Library initializers now pass a `LibraryIdentifier` to `initialize` instead of
4+
just a `Symbol`. This provides the package, and path to the library in addition
5+
to the symbol so that paths can be normalized.
6+
17
## 0.2.0
28

39
* `entryPoint` and `newEntryPoint` transformer options were renamed to
File renamed without changes.

lib/src/initializer.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,23 @@ abstract class Initializer<T> {
2626

2727
/// Typedef for a custom filter function.
2828
typedef bool InitializerFilter(Initializer initializer);
29+
30+
/// When annotating libraries, this is passed to the initializer.
31+
class LibraryIdentifier {
32+
// The qualified name of the library.
33+
final Symbol name;
34+
35+
// The package this library lives in. May be null if its the same as the root
36+
// package.
37+
final String package;
38+
39+
// The path to the library.
40+
final String path;
41+
42+
const LibraryIdentifier(this.name, this.package, this.path);
43+
44+
bool operator ==(LibraryIdentifier other) =>
45+
name == other.name && package == other.package && path == other.path;
46+
47+
String toString() => '$name: $package:$path';
48+
}

lib/src/mirror_loader.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,22 @@ class InitializationCrawler {
145145
annotatedValue = (declaration.owner as ObjectMirror)
146146
.getField(declaration.simpleName).reflectee;
147147
} else if (declaration is LibraryMirror) {
148-
annotatedValue = declaration.qualifiedName;
148+
var package;
149+
var filePath;
150+
Uri uri = declaration.uri;
151+
if (uri.scheme == 'file' || uri.scheme.startsWith('http')) {
152+
filePath = path.url.relative(
153+
uri.path, from: path.url.dirname(_root.uri.path));
154+
} else if (uri.scheme == 'package') {
155+
var segments = uri.pathSegments;
156+
package = segments[0];
157+
filePath = path.url.joinAll(segments.getRange(1, segments.length));
158+
} else {
159+
throw new UnsupportedError('Unsupported uri scheme ${uri.scheme} for '
160+
'library ${declaration}.');
161+
}
162+
annotatedValue =
163+
new LibraryIdentifier(declaration.qualifiedName, package, filePath);
149164
} else {
150165
throw _UNSUPPORTED_DECLARATION;
151166
}

lib/transformer.dart

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,10 @@ class _BootstrapFileBuilder {
242242
var initializersBuffer = new StringBuffer();
243243
var libraryPrefixes = new Map<LibraryElement, String>();
244244

245-
// Import the static_loader and original entry point.
245+
// Import the static_loader, initializer, and original entry point.
246246
importsBuffer
247247
.writeln("import 'package:initialize/src/static_loader.dart';");
248+
importsBuffer.writeln("import 'package:initialize/initialize.dart';");
248249
libraryPrefixes[entryLib] = 'i0';
249250

250251
initializersBuffer.writeln(' initializers.addAll([');
@@ -300,7 +301,27 @@ $initializersBuffer
300301
final metaPrefix = libraryPrefixes[annotationElement.library];
301302
var elementString;
302303
if (element is LibraryElement) {
303-
elementString = '#${element.name}';
304+
var segments = element.source.uri.pathSegments;
305+
var package = segments[0];
306+
var libraryPath;
307+
var packageString;
308+
if (_newEntryPoint.package == package &&
309+
_newEntryPoint.path.startsWith('${segments[1]}/')) {
310+
// reset `package` to null, we will do a relative path in this case.
311+
packageString = 'null';
312+
libraryPath = path.url.relative(
313+
path.url.joinAll(segments.getRange(1, segments.length)),
314+
from: path.url.dirname(path.url.join(_newEntryPoint.path)));
315+
} else if (segments[1] == 'lib') {
316+
packageString = "'$package'";
317+
libraryPath = path.url.joinAll(segments.getRange(2, segments.length));
318+
} else {
319+
_logger.error('Unable to import `${element.source.uri.path}` from '
320+
'${_newEntryPoint.path}.');
321+
}
322+
323+
elementString = "const LibraryIdentifier("
324+
"#${element.name}, $packageString, '$libraryPath')";
304325
} else if (element is ClassElement || element is FunctionElement) {
305326
elementString =
306327
'${libraryPrefixes[data.element.library]}.${element.name}';

pubspec.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: initialize
2-
version: 0.2.0
2+
version: 0.3.0-dev
33
author: Polymer.dart Authors <[email protected]>
44
description: Generic building blocks for doing static initialization.
55
homepage: https://github.com/dart-lang/initialize
@@ -9,6 +9,8 @@ dependencies:
99
html5lib: '>=0.12.0 <0.13.0'
1010
path: '>=1.3.0 <2.0.0'
1111
dev_dependencies:
12+
test_package:
13+
path: test_package
1214
unittest: '>=0.10.0 <0.12.0'
1315
environment:
1416
sdk: '>=1.4.0 <2.0.0'

test/bar.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
library initialize.test.bar;
66

77
import 'foo.dart';
8-
import 'initialize_tracker.dart';
8+
import 'package:initialize/src/initialize_tracker.dart';
99

1010
// Foo should be initialized first.
1111
@initializeTracker

test/cycle_a.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44
library initialize.test.cycle_a;
55

6-
import 'initialize_tracker.dart';
6+
import 'package:initialize/src/initialize_tracker.dart';
77
import 'cycle_b.dart';
88

99
@initializeTracker

test/cycle_b.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44
library initialize.test.cycle_b;
55

6-
import 'initialize_tracker.dart';
6+
import 'package:initialize/src/initialize_tracker.dart';
77
import 'cycle_a.dart';
88

99
@initializeTracker

test/foo.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
@initializeTracker
55
library initialize.test.foo;
66

7-
import 'initialize_tracker.dart';
7+
import 'package:initialize/src/initialize_tracker.dart';
88

99
@initializeTracker
1010
class Foo {}

test/initializer_custom_filter_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'dart:async';
77
import 'package:initialize/initialize.dart';
88
import 'package:unittest/unittest.dart';
99
import 'package:unittest/compact_vm_config.dart';
10-
import 'initialize_tracker.dart';
10+
import 'package:initialize/src/initialize_tracker.dart';
1111

1212
main() {
1313
useCompactVMConfiguration();

test/initializer_test.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ library initialize.initializer_test;
66

77
import 'foo.dart';
88
import 'bar.dart';
9-
import 'initialize_tracker.dart';
9+
import 'package:initialize/src/initialize_tracker.dart';
1010
import 'package:initialize/initialize.dart';
11+
import 'package:test_package/foo.dart';
1112
import 'package:unittest/unittest.dart';
1213
import 'package:unittest/compact_vm_config.dart';
1314

@@ -18,14 +19,17 @@ main() {
1819
run().then((_) {
1920
test('annotations are seen in post-order with superclasses first', () {
2021
var expectedNames = [
21-
#initialize.test.foo,
22+
const LibraryIdentifier(#test_package.bar, 'test_package', 'bar.dart'),
23+
const LibraryIdentifier(#test_package.foo, 'test_package','foo.dart'),
24+
const LibraryIdentifier(#initialize.test.foo, null, 'foo.dart'),
2225
foo,
2326
fooBar,
2427
Foo,
25-
#initialize.test.bar,
28+
const LibraryIdentifier(#initialize.test.bar, null, 'bar.dart'),
2629
bar,
2730
Bar,
28-
#initialize.initializer_test,
31+
const LibraryIdentifier(
32+
#initialize.initializer_test, null, 'initializer_test.dart'),
2933
zap,
3034
Zoop, // Zap extends Zoop, so Zoop comes first.
3135
Zap

test/transformer_test.dart

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ main() {
4545
4646
import 'package:initialize/initialize.dart';
4747
import 'package:test_initializers/common.dart';
48+
import 'baz.dart';
4849
4950
@DynamicInit('Bar')
5051
@DynamicInit('Bar2')
@@ -54,6 +55,12 @@ main() {
5455
@initMethod
5556
bar() {}
5657
''',
58+
'bar|lib/baz.dart': '''
59+
@constInit
60+
library baz;
61+
62+
import 'package:test_initializers/common.dart';
63+
''',
5764
// Mock out the Initialize package plus some initializers.
5865
'initialize|lib/initialize.dart': mockInitialize,
5966
'test_initializers|lib/common.dart': commonInitializers,
@@ -65,29 +72,32 @@ main() {
6572
</body></html>'''.replaceAll(' ', ''),
6673
'a|web/index.bootstrap.dart': '''
6774
import 'package:initialize/src/static_loader.dart';
75+
import 'package:initialize/initialize.dart';
6876
import 'index.dart' as i0;
69-
import 'package:bar/bar.dart' as i1;
77+
import 'package:bar/baz.dart' as i1;
7078
import 'package:test_initializers/common.dart' as i2;
71-
import 'package:initialize/initialize.dart' as i3;
72-
import 'foo.dart' as i4;
79+
import 'package:bar/bar.dart' as i3;
80+
import 'package:initialize/initialize.dart' as i4;
81+
import 'foo.dart' as i5;
7382
7483
main() {
7584
initializers.addAll([
76-
new InitEntry(const i2.DynamicInit('bar'), #bar),
77-
new InitEntry(const i2.DynamicInit('bar2'), #bar),
78-
new InitEntry(const i2.DynamicInit('bar()'), i1.bar),
79-
new InitEntry(i3.initMethod, i1.bar),
80-
new InitEntry(const i2.DynamicInit('Bar'), i1.Bar),
81-
new InitEntry(const i2.DynamicInit('Bar2'), i1.Bar),
82-
new InitEntry(i2.constInit, #foo),
83-
new InitEntry(i3.initMethod, i4.foo),
84-
new InitEntry(i2.constInit, i4.Foo),
85+
new InitEntry(i2.constInit, const LibraryIdentifier(#baz, 'bar', 'baz.dart')),
86+
new InitEntry(const i2.DynamicInit('bar'), const LibraryIdentifier(#bar, 'bar', 'bar.dart')),
87+
new InitEntry(const i2.DynamicInit('bar2'), const LibraryIdentifier(#bar, 'bar', 'bar.dart')),
88+
new InitEntry(const i2.DynamicInit('bar()'), i3.bar),
89+
new InitEntry(i4.initMethod, i3.bar),
90+
new InitEntry(const i2.DynamicInit('Bar'), i3.Bar),
91+
new InitEntry(const i2.DynamicInit('Bar2'), i3.Bar),
92+
new InitEntry(i2.constInit, const LibraryIdentifier(#foo, null, 'foo.dart')),
93+
new InitEntry(i4.initMethod, i5.foo),
94+
new InitEntry(i2.constInit, i5.Foo),
8595
]);
8696
8797
i0.main();
8898
}
8999
'''.replaceAll(' ', '')
90-
});
100+
}, []);
91101

92102
testPhases('constructor arguments', [[transformer]], {
93103
'a|web/index.dart': '''
@@ -121,26 +131,27 @@ main() {
121131
}, {
122132
'a|web/index.bootstrap.dart': '''
123133
import 'package:initialize/src/static_loader.dart';
134+
import 'package:initialize/initialize.dart';
124135
import 'index.dart' as i0;
125136
import 'package:test_initializers/common.dart' as i1;
126137
import 'foo.dart' as i2;
127138
128139
main() {
129140
initializers.addAll([
130-
new InitEntry(const i1.DynamicInit(i2.foo), #web_foo),
131-
new InitEntry(const i1.DynamicInit(i2.Foo.foo), #web_foo),
132-
new InitEntry(const i1.DynamicInit(const [i2.foo, i2.Foo.foo, 'foo']), #web_foo),
133-
new InitEntry(const i1.DynamicInit(const {'foo': i2.foo, 'Foo.foo': i2.Foo.foo, 'bar': 'bar'}), #web_foo),
134-
new InitEntry(const i1.DynamicInit('foo'), #web_foo),
135-
new InitEntry(const i1.DynamicInit(true), #web_foo),
136-
new InitEntry(const i1.DynamicInit(null), #web_foo),
137-
new InitEntry(const i1.DynamicInit(1), #web_foo),
138-
new InitEntry(const i1.DynamicInit(1.1), #web_foo),
139-
new InitEntry(const i1.NamedArgInit(1, name: 'Bill'), #web_foo),
141+
new InitEntry(const i1.DynamicInit(i2.foo), const LibraryIdentifier(#web_foo, null, 'index.dart')),
142+
new InitEntry(const i1.DynamicInit(i2.Foo.foo), const LibraryIdentifier(#web_foo, null, 'index.dart')),
143+
new InitEntry(const i1.DynamicInit(const [i2.foo, i2.Foo.foo, 'foo']), const LibraryIdentifier(#web_foo, null, 'index.dart')),
144+
new InitEntry(const i1.DynamicInit(const {'foo': i2.foo, 'Foo.foo': i2.Foo.foo, 'bar': 'bar'}), const LibraryIdentifier(#web_foo, null, 'index.dart')),
145+
new InitEntry(const i1.DynamicInit('foo'), const LibraryIdentifier(#web_foo, null, 'index.dart')),
146+
new InitEntry(const i1.DynamicInit(true), const LibraryIdentifier(#web_foo, null, 'index.dart')),
147+
new InitEntry(const i1.DynamicInit(null), const LibraryIdentifier(#web_foo, null, 'index.dart')),
148+
new InitEntry(const i1.DynamicInit(1), const LibraryIdentifier(#web_foo, null, 'index.dart')),
149+
new InitEntry(const i1.DynamicInit(1.1), const LibraryIdentifier(#web_foo, null, 'index.dart')),
150+
new InitEntry(const i1.NamedArgInit(1, name: 'Bill'), const LibraryIdentifier(#web_foo, null, 'index.dart')),
140151
]);
141152
142153
i0.main();
143154
}
144155
'''.replaceAll(' ', '')
145-
});
156+
}, []);
146157
}

test_package/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Initialize tests package
2+
========================
3+
4+
Package used in the `initialize` packages tests. This is just a helper to make
5+
sure that it correctly normalizes urls in mirror mode.

test_package/lib/bar.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
@initializeTracker
5+
library test_package.bar;
6+
7+
import 'package:initialize/src/initialize_tracker.dart';

test_package/lib/foo.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
@initializeTracker
5+
library test_package.foo;
6+
7+
import 'bar.dart'; // Keep for the annotation
8+
import 'package:initialize/src/initialize_tracker.dart';

test_package/pubspec.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
name: test_package
2+
dependencies:
3+
initialize:
4+
path: ../

0 commit comments

Comments
 (0)