| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
| 6 | 6 |
| 7 class MetadataCollector { | 7 class MetadataCollector { |
| 8 final Compiler _compiler; | 8 final Compiler _compiler; |
| 9 final Emitter _emitter; | 9 final Emitter _emitter; |
| 10 | 10 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 /// mirrors_patch to implement DeclarationMirror.metadata. | 42 /// mirrors_patch to implement DeclarationMirror.metadata. |
| 43 jsAst.Fun buildMetadataFunction(Element element) { | 43 jsAst.Fun buildMetadataFunction(Element element) { |
| 44 if (!_mustEmitMetadataFor(element)) return null; | 44 if (!_mustEmitMetadataFor(element)) return null; |
| 45 return _compiler.withCurrentElement(element, () { | 45 return _compiler.withCurrentElement(element, () { |
| 46 List<jsAst.Expression> metadata = <jsAst.Expression>[]; | 46 List<jsAst.Expression> metadata = <jsAst.Expression>[]; |
| 47 Link link = element.metadata; | 47 Link link = element.metadata; |
| 48 // TODO(ahe): Why is metadata sometimes null? | 48 // TODO(ahe): Why is metadata sometimes null? |
| 49 if (link != null) { | 49 if (link != null) { |
| 50 for (; !link.isEmpty; link = link.tail) { | 50 for (; !link.isEmpty; link = link.tail) { |
| 51 MetadataAnnotation annotation = link.head; | 51 MetadataAnnotation annotation = link.head; |
| 52 ConstantExpression constant = | 52 ConstantValue constant = |
| 53 _backend.constants.getConstantForMetadata(annotation); | 53 _backend.constants.getConstantValueForMetadata(annotation); |
| 54 if (constant == null) { | 54 if (constant == null) { |
| 55 _compiler.internalError(annotation, 'Annotation value is null.'); | 55 _compiler.internalError(annotation, 'Annotation value is null.'); |
| 56 } else { | 56 } else { |
| 57 metadata.add(_emitter.constantReference(constant.value)); | 57 metadata.add(_emitter.constantReference(constant)); |
| 58 } | 58 } |
| 59 } | 59 } |
| 60 } | 60 } |
| 61 if (metadata.isEmpty) return null; | 61 if (metadata.isEmpty) return null; |
| 62 return js('function() { return # }', | 62 return js('function() { return # }', |
| 63 new jsAst.ArrayInitializer(metadata)); | 63 new jsAst.ArrayInitializer(metadata)); |
| 64 }); | 64 }); |
| 65 } | 65 } |
| 66 | 66 |
| 67 List<int> reifyDefaultArguments(FunctionElement function) { | 67 List<int> reifyDefaultArguments(FunctionElement function) { |
| 68 FunctionSignature signature = function.functionSignature; | 68 FunctionSignature signature = function.functionSignature; |
| 69 if (signature.optionalParameterCount == 0) return const []; | 69 if (signature.optionalParameterCount == 0) return const []; |
| 70 List<int> defaultValues = <int>[]; | 70 List<int> defaultValues = <int>[]; |
| 71 for (ParameterElement element in signature.optionalParameters) { | 71 for (ParameterElement element in signature.optionalParameters) { |
| 72 ConstantExpression constant = | 72 ConstantValue constant = |
| 73 _backend.constants.getConstantForVariable(element); | 73 _backend.constants.getConstantValueForVariable(element); |
| 74 jsAst.Expression expression = (constant == null) | 74 jsAst.Expression expression = (constant == null) |
| 75 ? null | 75 ? null |
| 76 : _emitter.constantReference(constant.value); | 76 : _emitter.constantReference(constant); |
| 77 defaultValues.add(addGlobalMetadata(expression)); | 77 defaultValues.add(addGlobalMetadata(expression)); |
| 78 } | 78 } |
| 79 return defaultValues; | 79 return defaultValues; |
| 80 } | 80 } |
| 81 | 81 |
| 82 int reifyMetadata(MetadataAnnotation annotation) { | 82 int reifyMetadata(MetadataAnnotation annotation) { |
| 83 ConstantExpression constant = | 83 ConstantValue constant = |
| 84 _backend.constants.getConstantForMetadata(annotation); | 84 _backend.constants.getConstantValueForMetadata(annotation); |
| 85 if (constant == null) { | 85 if (constant == null) { |
| 86 _compiler.internalError(annotation, 'Annotation value is null.'); | 86 _compiler.internalError(annotation, 'Annotation value is null.'); |
| 87 return -1; | 87 return -1; |
| 88 } | 88 } |
| 89 return addGlobalMetadata(_emitter.constantReference(constant.value)); | 89 return addGlobalMetadata(_emitter.constantReference(constant)); |
| 90 } | 90 } |
| 91 | 91 |
| 92 int reifyType(DartType type, {bool ignoreTypeVariables: false}) { | 92 int reifyType(DartType type, {bool ignoreTypeVariables: false}) { |
| 93 return reifyTypeForOutputUnit(type, | 93 return reifyTypeForOutputUnit(type, |
| 94 _compiler.deferredLoadTask.mainOutputUnit, | 94 _compiler.deferredLoadTask.mainOutputUnit, |
| 95 ignoreTypeVariables: ignoreTypeVariables); | 95 ignoreTypeVariables: ignoreTypeVariables); |
| 96 } | 96 } |
| 97 | 97 |
| 98 int reifyTypeForOutputUnit(DartType type, OutputUnit outputUnit, | 98 int reifyTypeForOutputUnit(DartType type, OutputUnit outputUnit, |
| 99 {bool ignoreTypeVariables: false}) { | 99 {bool ignoreTypeVariables: false}) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 // TODO(ahe): Why is metadata sometimes null? | 157 // TODO(ahe): Why is metadata sometimes null? |
| 158 if (link != null) { | 158 if (link != null) { |
| 159 for (; !link.isEmpty; link = link.tail) { | 159 for (; !link.isEmpty; link = link.tail) { |
| 160 metadata.add(reifyMetadata(link.head)); | 160 metadata.add(reifyMetadata(link.head)); |
| 161 } | 161 } |
| 162 } | 162 } |
| 163 return metadata; | 163 return metadata; |
| 164 }); | 164 }); |
| 165 } | 165 } |
| 166 } | 166 } |
| OLD | NEW |