Index: test/codegen/lib/mirrors/metadata_test.dart |
diff --git a/test/codegen/lib/mirrors/metadata_test.dart b/test/codegen/lib/mirrors/metadata_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2e1c854be28f4e581e533d1916d45fe8cb095b11 |
--- /dev/null |
+++ b/test/codegen/lib/mirrors/metadata_test.dart |
@@ -0,0 +1,71 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library test.metadata_test; |
+ |
+import 'dart:mirrors'; |
+ |
+const string = 'a metadata string'; |
+ |
+const symbol = const Symbol('symbol'); |
+ |
+const hest = 'hest'; |
+ |
+@symbol @string |
+class MyClass { |
+ @hest @hest @symbol |
+ var x; |
+ var y; |
+ |
+ @string @symbol @string |
+ myMethod() => 1; |
+ myOtherMethod() => 2; |
+} |
+ |
+checkMetadata(DeclarationMirror mirror, List expectedMetadata) { |
+ List metadata = mirror.metadata.map((m) => m.reflectee).toList(); |
+ if (metadata == null) { |
+ throw 'Null metadata on $mirror'; |
+ } |
+ int expectedLength = expectedMetadata.length; |
+ int actualLength = metadata.length; |
+ if (expectedLength != actualLength) { |
+ throw 'Expected length = $expectedLength, but got length = $actualLength.'; |
+ } |
+ for (int i = 0; i < expectedLength; i++) { |
+ if (metadata[i] != expectedMetadata[i]) { |
+ throw '${metadata[i]} is not "${expectedMetadata[i]}"' |
+ ' in $mirror at index $i'; |
+ } |
+ } |
+ print(metadata); |
+} |
+ |
+@symbol @string @symbol |
+main() { |
+ if (MirrorSystem.getName(symbol) != 'symbol') { |
+ // This happened in dart2js due to how early library metadata is |
+ // computed. |
+ throw 'Bad constant: $symbol'; |
+ } |
+ |
+ MirrorSystem mirrors = currentMirrorSystem(); |
+ ClassMirror myClassMirror = reflectClass(MyClass); |
+ checkMetadata(myClassMirror, [symbol, string]); |
+ LibraryMirror lib = mirrors.findLibrary(#test.metadata_test); |
+ MethodMirror function = lib.declarations[#main]; |
+ checkMetadata(function, [symbol, string, symbol]); |
+ MethodMirror method = myClassMirror.declarations[#myMethod]; |
+ checkMetadata(method, [string, symbol, string]); |
+ method = myClassMirror.declarations[#myOtherMethod]; |
+ checkMetadata(method, []); |
+ |
+ VariableMirror xMirror = myClassMirror.declarations[#x]; |
+ checkMetadata(xMirror, [hest, hest, symbol]); |
+ |
+ VariableMirror yMirror = myClassMirror.declarations[#y]; |
+ checkMetadata(yMirror, []); |
+ |
+ // TODO(ahe): Test local functions. |
+} |