Index: pkg/compiler/lib/src/js_emitter/metadata_collector.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart |
index bd4ab2977a33f45cc8051c6ee5843a4bb8377247..44c484d1a2f75a98af3a48d1520a0fb188d64181 100644 |
--- a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart |
+++ b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart |
@@ -10,14 +10,15 @@ class MetadataCollector { |
/// A list of JS expressions that represent metadata, parameter names and |
/// type variable types. |
- final List<String> globalMetadata = <String>[]; |
+ final List<jsAst.Expression> globalMetadata = <jsAst.Expression>[]; |
/// A map used to canonicalize the entries of globalMetadata. |
final Map<String, int> _globalMetadataMap = <String, int>{}; |
/// A map with lists of JS expressions, one list for each output unit. The |
/// entries represent types including function types and typedefs. |
- final Map<OutputUnit, List<String>> types = <OutputUnit, List<String>>{}; |
+ final Map<OutputUnit, List<jsAst.Expression>> types = |
+ <OutputUnit, List<jsAst.Expression>>{}; |
/// A map used to canonicalize the entries of types. |
final Map<OutputUnit, Map<String, int>> _typesMap = |
@@ -70,11 +71,10 @@ class MetadataCollector { |
for (ParameterElement element in signature.optionalParameters) { |
ConstantExpression constant = |
_backend.constants.getConstantForVariable(element); |
- String stringRepresentation = (constant == null) |
- ? "null" |
- : jsAst.prettyPrint( |
- _emitter.constantReference(constant.value), _compiler).getText(); |
- defaultValues.add(addGlobalMetadata(stringRepresentation)); |
+ jsAst.Expression expression = (constant == null) |
+ ? null |
+ : _emitter.constantReference(constant.value); |
+ defaultValues.add(addGlobalMetadata(expression)); |
} |
return defaultValues; |
} |
@@ -86,9 +86,7 @@ class MetadataCollector { |
_compiler.internalError(annotation, 'Annotation value is null.'); |
return -1; |
} |
- return addGlobalMetadata( |
- jsAst.prettyPrint( |
- _emitter.constantReference(constant.value), _compiler).getText()); |
+ return addGlobalMetadata(_emitter.constantReference(constant.value)); |
} |
int reifyType(DartType type, {bool ignoreTypeVariables: false}) { |
@@ -112,31 +110,33 @@ class MetadataCollector { |
return _backend.isAccessibleByReflection(typedef.element); |
}); |
- return addTypeInOutputUnit( |
- jsAst.prettyPrint(representation, _compiler).getText(), outputUnit); |
+ return addTypeInOutputUnit(representation, outputUnit); |
} |
int reifyName(String name) { |
- return addGlobalMetadata('"$name"'); |
+ return addGlobalMetadata(js('"$name"')); |
} |
- int addGlobalMetadata(String string) { |
+ int addGlobalMetadata(jsAst.Expression expression) { |
+ // TODO(sigmund): consider adding an effient way to compare expressions |
+ String string = jsAst.prettyPrint(expression, _compiler).getText(); |
return _globalMetadataMap.putIfAbsent(string, () { |
- globalMetadata.add(string); |
+ globalMetadata.add(expression); |
return globalMetadata.length - 1; |
}); |
} |
- int addTypeInOutputUnit(String compiledType, OutputUnit outputUnit) { |
+ int addTypeInOutputUnit(jsAst.Expression type, OutputUnit outputUnit) { |
+ String string = jsAst.prettyPrint(type, _compiler).getText(); |
if (_typesMap[outputUnit] == null) { |
_typesMap[outputUnit] = <String, int>{}; |
} |
- return _typesMap[outputUnit].putIfAbsent(compiledType, () { |
+ return _typesMap[outputUnit].putIfAbsent(string, () { |
if (types[outputUnit] == null) |
- types[outputUnit] = <String>[]; |
+ types[outputUnit] = <jsAst.Expression>[]; |
- types[outputUnit].add(compiledType); |
+ types[outputUnit].add(type); |
return types[outputUnit].length - 1; |
}); |
} |