| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 // VMOptions=--use_mirrored_compilation_error=true | |
| 6 | |
| 7 @notDefined | |
| 8 library mirrored_compilation_error_test; | |
| 9 | |
| 10 import 'dart:mirrors'; | |
| 11 import "package:expect/expect.dart"; | |
| 12 | |
| 13 @notDefined | |
| 14 class Class<@notDefined T> { | |
| 15 @notDefined | |
| 16 var field; | |
| 17 | |
| 18 @notDefined | |
| 19 method(@notDefined param) {} | |
| 20 } | |
| 21 | |
| 22 class Class2 { | |
| 23 method() { +++; } | |
| 24 get getter { +++; } | |
| 25 set setter(x) { +++; } | |
| 26 | |
| 27 static staticFunction() { +++; } | |
| 28 static get staticGetter { +++; } | |
| 29 static set staticSetter(x) { +++; } | |
| 30 | |
| 31 Class2() {} | |
| 32 Class2.constructor() { +++; } | |
| 33 } | |
| 34 | |
| 35 toplevelFunction() { +++; } | |
| 36 get toplevelGetter { +++; } | |
| 37 set toplevelSetter(x) { +++; } | |
| 38 | |
| 39 | |
| 40 class G<A extends int, B extends String> { | |
| 41 G(); | |
| 42 factory G.swap() = G<B,A>; /// static type warning | |
| 43 } | |
| 44 | |
| 45 raises(closure) { | |
| 46 Expect.throws(closure, | |
| 47 (e) => e is MirroredCompilationError, | |
| 48 'Expected a deferred compilation error'); | |
| 49 } | |
| 50 | |
| 51 bool get inCheckedMode { | |
| 52 try { | |
| 53 var i = 1; | |
| 54 String s = i; | |
| 55 return false; | |
| 56 } catch (e) { | |
| 57 return true; | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 main() { | |
| 62 | |
| 63 // Metadata. | |
| 64 | |
| 65 raises(() => reflectClass(Class).metadata); | |
| 66 raises(() => reflectClass(Class).typeVariables.single.metadata); | |
| 67 raises(() => reflectClass(Class).declarations[#field].metadata); | |
| 68 raises(() => reflectClass(Class).declarations[#method].metadata); | |
| 69 raises(() => reflectClass(Class).declarations[#method].parameters.single.metad
ata); | |
| 70 raises(() => reflectClass(Class).owner.metadata); | |
| 71 | |
| 72 | |
| 73 // Invocation. | |
| 74 | |
| 75 InstanceMirror im = reflect(new Class2()); | |
| 76 raises(() => im.invoke(#method, [])); | |
| 77 raises(() => im.getField(#getter)); | |
| 78 raises(() => im.setField(#setter, 'some value')); | |
| 79 // The implementation is within its right to defer the compilation even | |
| 80 // further here, so we apply the tear-off to force compilation. | |
| 81 raises(() => im.getField(#method).apply([])); | |
| 82 | |
| 83 ClassMirror cm = reflectClass(Class2); | |
| 84 raises(() => cm.invoke(#staticFunction, [])); | |
| 85 raises(() => cm.getField(#staticGetter)); | |
| 86 raises(() => cm.setField(#staticSetter, 'some value')); | |
| 87 raises(() => cm.getField(#staticFunction).apply([])); | |
| 88 raises(() => cm.newInstance(#constructor, [])); | |
| 89 | |
| 90 LibraryMirror lm = reflectClass(Class2).owner; | |
| 91 raises(() => lm.invoke(#toplevelFunction, [])); | |
| 92 raises(() => lm.getField(#toplevelGetter)); | |
| 93 raises(() => lm.setField(#toplevelSetter, 'some value')); | |
| 94 raises(() => lm.getField(#toplevelFunction).apply([])); | |
| 95 | |
| 96 | |
| 97 // Bounds violation. | |
| 98 | |
| 99 if (inCheckedMode) { | |
| 100 ClassMirror cm = reflect(new G<int, String>()).type; | |
| 101 raises(() => cm.newInstance(#swap, [])); | |
| 102 } | |
| 103 } | |
| OLD | NEW |