Index: lib/build/initializer_plugin.dart |
diff --git a/lib/build/initializer_plugin.dart b/lib/build/initializer_plugin.dart |
index 035161ea427d3ceb138ddb4d127bb4103bd1cbc8..f70e885b51c80c48a2c1b2360fa82e1f1b2bbd14 100644 |
--- a/lib/build/initializer_plugin.dart |
+++ b/lib/build/initializer_plugin.dart |
@@ -92,8 +92,6 @@ class DefaultInitializerPlugin implements InitializerPlugin { |
var constructor = annotation.constructorName == null |
? '' |
: '.${annotation.constructorName}'; |
- // TODO(jakemac): Support more than raw values here |
- // https://github.com/dart-lang/static_init/issues/5 |
var args = buildArgumentList(annotation.arguments, pluginData); |
return 'const $metaPrefix.${clazz}$constructor$args'; |
} |
@@ -202,14 +200,8 @@ class DefaultInitializerPlugin implements InitializerPlugin { |
var logger = pluginData.logger; |
var libraryPrefixes = pluginData.libraryPrefixes; |
var buffer = new StringBuffer(); |
- if (expression is StringLiteral) { |
- var value = expression.stringValue; |
- if (value == null) { |
- logger.error('Only const strings are allowed in initializer ' |
- 'expressions, found $expression'); |
- } |
- value = value.replaceAll(r'\', r'\\').replaceAll(r"'", r"\'"); |
- buffer.write("'$value'"); |
+ if (expression is StringLiteral && expression.stringValue != null) { |
+ buffer.write(_stringValue(expression.stringValue)); |
} else if (expression is BooleanLiteral || |
expression is DoubleLiteral || |
expression is IntegerLiteral || |
@@ -239,7 +231,7 @@ class DefaultInitializerPlugin implements InitializerPlugin { |
var element = expression.bestElement; |
if (element == null || !element.isPublic) { |
logger.error('Private constants are not supported in intializer ' |
- 'constructors, found $element.'); |
+ 'constructors, found $element.'); |
} |
libraryPrefixes.putIfAbsent( |
element.library, () => 'i${libraryPrefixes.length}'); |
@@ -256,10 +248,38 @@ class DefaultInitializerPlugin implements InitializerPlugin { |
} else { |
logger.error('Unsupported argument to initializer constructor.'); |
} |
+ } else if (expression is PropertyAccess) { |
+ buffer.write(buildExpression(expression.target, pluginData)); |
+ buffer.write('.${expression.propertyName}'); |
+ } else if (expression is InstanceCreationExpression) { |
+ logger.error('Unsupported expression in initializer, found $expression. ' |
+ 'Instance creation expressions are not supported (yet). Instead, ' |
+ 'please assign it to a const variable and use that instead.'); |
} else { |
- logger.error('Only literals and identifiers are allowed for initializer ' |
- 'expressions, found $expression.'); |
+ // 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); |
} |
return buffer.toString(); |
} |
+ |
+ // Returns an expression for a string value. Wraps it in single quotes and |
+ // escapes existing single quotes and escapes. |
+ _stringValue(String value) { |
+ value = value.replaceAll(r'\', r'\\').replaceAll(r"'", r"\'"); |
+ return "'$value'"; |
+ } |
} |