add support for evaluating private identifiers and inlining the result into the bootstrap
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b9baa6b..0abd507 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.6.0+2
+
+* Private identifiers will now be evaluated and inlined into the bootstrap file
+by the transformer, [29](https://github.com/dart-lang/initialize/issues/29).
+
## 0.6.0+1
* Fix for `LibraryIdentifier` paths when initializer starts from inline scripts
diff --git a/lib/build/initializer_plugin.dart b/lib/build/initializer_plugin.dart
index 466065f..8822dc4 100644
--- a/lib/build/initializer_plugin.dart
+++ b/lib/build/initializer_plugin.dart
@@ -229,24 +229,27 @@
buffer.write('}');
} else if (expression is Identifier) {
var element = expression.bestElement;
- if (element == null || !element.isPublic) {
- logger.error('Private constants are not supported in intializer '
- 'constructors, found $element.');
- }
- libraryPrefixes.putIfAbsent(
+ if (element == null) {
+ logger.error('Unable to get `bestElement` for expression: $expression');
+ } else if (!element.isPublic) {
+ // Inline the evaluated value of private identifiers.
+ buffer.write(_evaluateExpression(expression, pluginData));
+ } else {
+ libraryPrefixes.putIfAbsent(
element.library, () => 'i${libraryPrefixes.length}');
- buffer.write('${libraryPrefixes[element.library]}.');
- if (element is ClassElement) {
- buffer.write(element.name);
- } else if (element is PropertyAccessorElement) {
- var variable = element.variable;
- if (variable is FieldElement) {
- buffer.write('${variable.enclosingElement.name}.');
+ buffer.write('${libraryPrefixes[element.library]}.');
+ if (element is ClassElement) {
+ buffer.write(element.name);
+ } else if (element is PropertyAccessorElement) {
+ var variable = element.variable;
+ if (variable is FieldElement) {
+ buffer.write('${variable.enclosingElement.name}.');
+ }
+ buffer.write('${variable.name}');
+ } else {
+ logger.error('Unsupported argument to initializer constructor.');
}
- buffer.write('${variable.name}');
- } else {
- logger.error('Unsupported argument to initializer constructor.');
}
} else if (expression is PropertyAccess) {
buffer.write(buildExpression(expression.target, pluginData));
@@ -256,26 +259,32 @@
'Instance creation expressions are not supported (yet). Instead, '
'please assign it to a const variable and use that instead.');
} else {
- // Try to evaluate the constant and use that.
- var result = pluginData.resolver.evaluateConstant(
- pluginData.initializer.targetElement.library, expression);
- if (!result.isValid) {
- logger.error('Invalid expression in initializer, found $expression. '
- 'And got the following errors: ${result.errors}.');
- }
- var value = result.value.value;
- if (value == null) {
- logger.error('Unsupported expression in initializer, found '
- '$expression. Please file a bug at '
- 'https://github.com/dart-lang/initialize/issues');
- }
-
- if (value is String) value = _stringValue(value);
- buffer.write(value);
+ buffer.write(_evaluateExpression(expression, pluginData));
}
return buffer.toString();
}
+ _evaluateExpression(Expression expression, InitializerPluginData pluginData) {
+ var logger = pluginData.logger;
+ var result = pluginData.resolver.evaluateConstant(
+ pluginData.initializer.targetElement.library, expression);
+ if (!result.isValid) {
+ logger.error('Invalid expression in initializer, found $expression. '
+ 'And got the following errors: ${result.errors}.');
+ return null;
+ }
+ var value = result.value.value;
+ if (value == null) {
+ logger.error('Unsupported expression in initializer, found '
+ '$expression. Please file a bug at '
+ 'https://github.com/dart-lang/initialize/issues');
+ return null;
+ }
+
+ if (value is String) value = _stringValue(value);
+ return value;
+ }
+
// Returns an expression for a string value. Wraps it in single quotes and
// escapes existing single quotes and escapes.
_stringValue(String value) {
diff --git a/pubspec.yaml b/pubspec.yaml
index 21298d9..2d0b048 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: initialize
-version: 0.6.0+1
+version: 0.6.0+2
author: Polymer.dart Authors <web@dartlang.org>
description: Generic building blocks for doing static initialization.
homepage: https://github.com/dart-lang/initialize
diff --git a/test/transformer_test.dart b/test/transformer_test.dart
index 8b43d45..d9c6130 100644
--- a/test/transformer_test.dart
+++ b/test/transformer_test.dart
@@ -116,6 +116,7 @@
testPhases('constructor arguments', phases, {
'a|web/index.dart': '''
@DynamicInit(foo)
+ @DynamicInit(_foo)
@DynamicInit(Foo.foo)
@DynamicInit(bar.Foo.bar)
@DynamicInit(bar.Foo.foo)
@@ -139,6 +140,7 @@
const x = 'x';
const y = 'y';
+ const _foo = '_foo';
class MyConst {
const MyConst;
@@ -172,6 +174,7 @@
main() {
initializers.addAll([
new InitEntry(const i1.DynamicInit(i2.foo), const LibraryIdentifier(#web_foo, null, 'index.dart')),
+ new InitEntry(const i1.DynamicInit('_foo'), const LibraryIdentifier(#web_foo, null, 'index.dart')),
new InitEntry(const i1.DynamicInit(i2.Foo.foo), const LibraryIdentifier(#web_foo, null, 'index.dart')),
new InitEntry(const i1.DynamicInit(i2.Foo.bar), const LibraryIdentifier(#web_foo, null, 'index.dart')),
new InitEntry(const i1.DynamicInit(i2.Foo.foo), const LibraryIdentifier(#web_foo, null, 'index.dart')),