Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2014, 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 import "dart:mirrors"; | |
| 6 | |
| 7 import "package:expect/expect.dart"; | |
| 8 | |
| 9 class Superclass {} | |
| 10 class Subclass1 extends Superclass {} | |
| 11 class Subclass2 extends Superclass {} | |
| 12 | |
| 13 typedef bool NumberPredicate(num x); | |
| 14 typedef bool IntegerPredicate(int x); | |
| 15 typedef bool DoublePredicate(double x); | |
| 16 | |
| 17 typedef num NumberGenerator(); | |
| 18 typedef int IntegerGenerator(); | |
| 19 typedef double DoubleGenerator(); | |
| 20 | |
| 21 class A<T> {} | |
| 22 class B<T> extends A<T> {} | |
| 23 class C<T extends num> {} | |
| 24 | |
| 25 main() { | |
| 26 // Classes. | |
| 27 TypeMirror Super = reflectType(Superclass); | |
| 28 TypeMirror Sub1 = reflectType(Subclass1); | |
| 29 TypeMirror Sub2 = reflectType(Subclass2); | |
| 30 TypeMirror Obj = reflectType(Object); | |
| 31 | |
| 32 Expect.isTrue(Obj.isAssignableTo(Obj)); | |
| 33 Expect.isTrue(Super.isAssignableTo(Super)); | |
| 34 Expect.isTrue(Sub1.isAssignableTo(Sub1)); | |
| 35 Expect.isTrue(Sub2.isAssignableTo(Sub2)); | |
| 36 | |
| 37 Expect.isTrue(Sub1.isAssignableTo(Super)); | |
| 38 Expect.isTrue(Super.isAssignableTo(Sub1)); | |
| 39 | |
| 40 Expect.isTrue(Sub2.isAssignableTo(Super)); | |
| 41 Expect.isTrue(Super.isAssignableTo(Sub2)); | |
| 42 | |
| 43 Expect.isFalse(Sub2.isAssignableTo(Sub1)); | |
| 44 Expect.isFalse(Sub1.isAssignableTo(Sub2)); | |
| 45 | |
| 46 Expect.isTrue(Sub1.isAssignableTo(Obj)); | |
| 47 Expect.isTrue(Obj.isAssignableTo(Sub1)); | |
| 48 | |
| 49 Expect.isTrue(Sub2.isAssignableTo(Obj)); | |
| 50 Expect.isTrue(Obj.isAssignableTo(Sub2)); | |
| 51 | |
| 52 Expect.isTrue(Super.isAssignableTo(Obj)); | |
| 53 Expect.isTrue(Obj.isAssignableTo(Super)); | |
| 54 | |
| 55 | |
| 56 // Function typedef - argument type. | |
| 57 TypeMirror Func = reflectType(Function); | |
| 58 TypeMirror NumPred = reflectType(NumberPredicate); | |
| 59 TypeMirror IntPred = reflectType(IntegerPredicate); | |
| 60 TypeMirror DubPred = reflectType(DoublePredicate); | |
| 61 | |
| 62 Expect.isTrue(Func.isAssignableTo(Func)); | |
| 63 Expect.isTrue(NumPred.isAssignableTo(NumPred)); | |
| 64 Expect.isTrue(IntPred.isAssignableTo(IntPred)); | |
| 65 Expect.isTrue(DubPred.isAssignableTo(DubPred)); | |
| 66 | |
| 67 Expect.isTrue(NumPred.isAssignableTo(Func)); | |
| 68 Expect.isTrue(NumPred.isAssignableTo(IntPred)); | |
| 69 Expect.isTrue(NumPred.isAssignableTo(DubPred)); | |
| 70 | |
| 71 Expect.isTrue(IntPred.isAssignableTo(Func)); | |
| 72 Expect.isTrue(IntPred.isAssignableTo(NumPred)); | |
| 73 Expect.isFalse(IntPred.isAssignableTo(DubPred)); | |
| 74 | |
| 75 Expect.isTrue(DubPred.isAssignableTo(Func)); | |
| 76 Expect.isTrue(DubPred.isAssignableTo(NumPred)); | |
| 77 Expect.isFalse(DubPred.isAssignableTo(IntPred)); | |
| 78 | |
| 79 Expect.isTrue(Func.isAssignableTo(Obj)); | |
| 80 Expect.isTrue(NumPred.isAssignableTo(Obj)); | |
| 81 Expect.isTrue(IntPred.isAssignableTo(Obj)); | |
| 82 Expect.isTrue(DubPred.isAssignableTo(Obj)); | |
|
gbracha
2014/01/11 01:53:30
I hesitate to suggest more cases, but the reverse
| |
| 83 | |
| 84 | |
| 85 // Function typedef - return type. | |
| 86 TypeMirror NumGen = reflectType(NumberGenerator); | |
| 87 TypeMirror IntGen = reflectType(IntegerGenerator); | |
| 88 TypeMirror DubGen = reflectType(DoubleGenerator); | |
| 89 | |
| 90 Expect.isTrue(NumGen.isAssignableTo(NumGen)); | |
| 91 Expect.isTrue(IntGen.isAssignableTo(IntGen)); | |
| 92 Expect.isTrue(DubGen.isAssignableTo(DubGen)); | |
| 93 | |
| 94 Expect.isTrue(NumGen.isAssignableTo(Func)); | |
| 95 Expect.isTrue(NumGen.isAssignableTo(IntGen)); | |
| 96 Expect.isTrue(NumGen.isAssignableTo(DubGen)); | |
| 97 | |
| 98 Expect.isTrue(IntGen.isAssignableTo(Func)); | |
| 99 Expect.isTrue(IntGen.isAssignableTo(NumGen)); | |
| 100 Expect.isFalse(IntGen.isAssignableTo(DubGen)); | |
| 101 | |
| 102 Expect.isTrue(DubGen.isAssignableTo(Func)); | |
| 103 Expect.isTrue(DubGen.isAssignableTo(NumGen)); | |
| 104 Expect.isFalse(DubGen.isAssignableTo(IntGen)); | |
| 105 | |
| 106 Expect.isTrue(Func.isAssignableTo(Obj)); | |
| 107 Expect.isTrue(NumGen.isAssignableTo(Obj)); | |
| 108 Expect.isTrue(IntGen.isAssignableTo(Obj)); | |
| 109 Expect.isTrue(DubGen.isAssignableTo(Obj)); | |
|
gbracha
2014/01/11 01:53:30
Again, the inverse holds as well.
| |
| 110 | |
| 111 | |
| 112 // Function - argument type. | |
| 113 TypeMirror NumPredRef = reflectType(NumberPredicate).referent; | |
| 114 TypeMirror IntPredRef = reflectType(IntegerPredicate).referent; | |
| 115 TypeMirror DubPredRef = reflectType(DoublePredicate).referent; | |
| 116 | |
| 117 Expect.isTrue(Func.isAssignableTo(Func)); | |
| 118 Expect.isTrue(NumPredRef.isAssignableTo(NumPredRef)); | |
| 119 Expect.isTrue(IntPredRef.isAssignableTo(IntPredRef)); | |
| 120 Expect.isTrue(DubPredRef.isAssignableTo(DubPredRef)); | |
| 121 | |
| 122 Expect.isTrue(NumPredRef.isAssignableTo(Func)); | |
| 123 Expect.isTrue(NumPredRef.isAssignableTo(IntPredRef)); | |
| 124 Expect.isTrue(NumPredRef.isAssignableTo(DubPredRef)); | |
| 125 | |
| 126 Expect.isTrue(IntPredRef.isAssignableTo(Func)); | |
| 127 Expect.isTrue(IntPredRef.isAssignableTo(NumPredRef)); | |
| 128 Expect.isFalse(IntPredRef.isAssignableTo(DubPredRef)); | |
| 129 | |
| 130 Expect.isTrue(DubPredRef.isAssignableTo(Func)); | |
| 131 Expect.isTrue(DubPredRef.isAssignableTo(NumPredRef)); | |
| 132 Expect.isFalse(DubPredRef.isAssignableTo(IntPredRef)); | |
| 133 | |
| 134 Expect.isTrue(Func.isAssignableTo(Obj)); | |
| 135 Expect.isTrue(NumPredRef.isAssignableTo(Obj)); | |
| 136 Expect.isTrue(IntPredRef.isAssignableTo(Obj)); | |
| 137 Expect.isTrue(DubPredRef.isAssignableTo(Obj)); | |
| 138 | |
| 139 | |
| 140 // Function - return type. | |
| 141 TypeMirror NumGenRef = reflectType(NumberGenerator).referent; | |
| 142 TypeMirror IntGenRef = reflectType(IntegerGenerator).referent; | |
| 143 TypeMirror DubGenRef = reflectType(DoubleGenerator).referent; | |
| 144 | |
| 145 Expect.isTrue(NumGenRef.isAssignableTo(NumGenRef)); | |
| 146 Expect.isTrue(IntGenRef.isAssignableTo(IntGenRef)); | |
| 147 Expect.isTrue(DubGenRef.isAssignableTo(DubGenRef)); | |
| 148 | |
| 149 Expect.isTrue(NumGenRef.isAssignableTo(Func)); | |
| 150 Expect.isTrue(NumGenRef.isAssignableTo(IntGenRef)); | |
| 151 Expect.isTrue(NumGenRef.isAssignableTo(DubGenRef)); | |
| 152 | |
| 153 Expect.isTrue(IntGenRef.isAssignableTo(Func)); | |
| 154 Expect.isTrue(IntGenRef.isAssignableTo(NumGenRef)); | |
| 155 Expect.isFalse(IntGenRef.isAssignableTo(DubGenRef)); | |
| 156 | |
| 157 Expect.isTrue(DubGenRef.isAssignableTo(Func)); | |
| 158 Expect.isTrue(DubGenRef.isAssignableTo(NumGenRef)); | |
| 159 Expect.isFalse(DubGenRef.isAssignableTo(IntGenRef)); | |
| 160 | |
| 161 Expect.isTrue(Func.isAssignableTo(Obj)); | |
| 162 Expect.isTrue(NumGenRef.isAssignableTo(Obj)); | |
| 163 Expect.isTrue(IntGenRef.isAssignableTo(Obj)); | |
| 164 Expect.isTrue(DubGenRef.isAssignableTo(Obj)); | |
| 165 | |
| 166 | |
| 167 // Function typedef / function. | |
| 168 Expect.isTrue(NumPred.isAssignableTo(NumPredRef)); | |
| 169 Expect.isTrue(IntPred.isAssignableTo(IntPredRef)); | |
| 170 Expect.isTrue(DubPred.isAssignableTo(DubPredRef)); | |
| 171 Expect.isTrue(NumPredRef.isAssignableTo(NumPred)); | |
| 172 Expect.isTrue(IntPredRef.isAssignableTo(IntPred)); | |
| 173 Expect.isTrue(DubPredRef.isAssignableTo(DubPred)); | |
| 174 | |
| 175 | |
| 176 // Function typedef / function. | |
| 177 Expect.isTrue(NumGen.isAssignableTo(NumGenRef)); | |
| 178 Expect.isTrue(IntGen.isAssignableTo(IntGenRef)); | |
| 179 Expect.isTrue(DubGen.isAssignableTo(DubGenRef)); | |
| 180 Expect.isTrue(NumGenRef.isAssignableTo(NumGen)); | |
| 181 Expect.isTrue(IntGenRef.isAssignableTo(IntGen)); | |
| 182 Expect.isTrue(DubGenRef.isAssignableTo(DubGen)); | |
| 183 | |
| 184 | |
| 185 // Type variable. | |
| 186 TypeMirror TFromA = reflectClass(A).typeVariables.single; | |
| 187 TypeMirror TFromB = reflectClass(B).typeVariables.single; | |
| 188 TypeMirror TFromC = reflectClass(C).typeVariables.single; | |
| 189 | |
| 190 Expect.isTrue(TFromA.isAssignableTo(TFromA)); | |
| 191 Expect.isTrue(TFromB.isAssignableTo(TFromB)); | |
| 192 Expect.isTrue(TFromC.isAssignableTo(TFromC)); | |
| 193 | |
| 194 Expect.isFalse(TFromA.isAssignableTo(TFromB)); | |
| 195 Expect.isFalse(TFromA.isAssignableTo(TFromC)); | |
| 196 Expect.isFalse(TFromB.isAssignableTo(TFromA)); | |
| 197 Expect.isFalse(TFromB.isAssignableTo(TFromC)); | |
| 198 Expect.isFalse(TFromC.isAssignableTo(TFromA)); | |
| 199 Expect.isFalse(TFromC.isAssignableTo(TFromB)); | |
| 200 | |
| 201 Expect.isTrue(TFromC.isAssignableTo(reflectType(num))); | |
| 202 Expect.isTrue(reflectType(num).isAssignableTo(TFromC)); | |
| 203 | |
| 204 | |
| 205 // dynamic & void. | |
| 206 TypeMirror Dynamic = currentMirrorSystem().dynamicType; | |
| 207 Expect.isTrue(Obj.isAssignableTo(Dynamic)); | |
| 208 Expect.isTrue(Super.isAssignableTo(Dynamic)); | |
| 209 Expect.isTrue(Sub1.isAssignableTo(Dynamic)); | |
| 210 Expect.isTrue(Sub2.isAssignableTo(Dynamic)); | |
| 211 Expect.isTrue(NumPred.isAssignableTo(Dynamic)); | |
| 212 Expect.isTrue(IntPred.isAssignableTo(Dynamic)); | |
| 213 Expect.isTrue(DubPred.isAssignableTo(Dynamic)); | |
| 214 Expect.isTrue(NumPredRef.isAssignableTo(Dynamic)); | |
| 215 Expect.isTrue(IntPredRef.isAssignableTo(Dynamic)); | |
| 216 Expect.isTrue(DubPredRef.isAssignableTo(Dynamic)); | |
| 217 Expect.isTrue(NumGen.isAssignableTo(Dynamic)); | |
| 218 Expect.isTrue(IntGen.isAssignableTo(Dynamic)); | |
| 219 Expect.isTrue(DubGen.isAssignableTo(Dynamic)); | |
| 220 Expect.isTrue(NumGenRef.isAssignableTo(Dynamic)); | |
| 221 Expect.isTrue(IntGenRef.isAssignableTo(Dynamic)); | |
| 222 Expect.isTrue(DubGenRef.isAssignableTo(Dynamic)); | |
| 223 Expect.isTrue(TFromA.isAssignableTo(Dynamic)); | |
| 224 Expect.isTrue(TFromB.isAssignableTo(Dynamic)); | |
| 225 Expect.isTrue(TFromC.isAssignableTo(Dynamic)); | |
| 226 Expect.isTrue(Dynamic.isAssignableTo(Obj)); | |
| 227 Expect.isTrue(Dynamic.isAssignableTo(Super)); | |
| 228 Expect.isTrue(Dynamic.isAssignableTo(Sub1)); | |
| 229 Expect.isTrue(Dynamic.isAssignableTo(Sub2)); | |
| 230 Expect.isTrue(Dynamic.isAssignableTo(NumPred)); | |
| 231 Expect.isTrue(Dynamic.isAssignableTo(IntPred)); | |
| 232 Expect.isTrue(Dynamic.isAssignableTo(DubPred)); | |
| 233 Expect.isTrue(Dynamic.isAssignableTo(NumPredRef)); | |
| 234 Expect.isTrue(Dynamic.isAssignableTo(IntPredRef)); | |
| 235 Expect.isTrue(Dynamic.isAssignableTo(DubPredRef)); | |
| 236 Expect.isTrue(Dynamic.isAssignableTo(NumGen)); | |
| 237 Expect.isTrue(Dynamic.isAssignableTo(IntGen)); | |
| 238 Expect.isTrue(Dynamic.isAssignableTo(DubGen)); | |
| 239 Expect.isTrue(Dynamic.isAssignableTo(NumGenRef)); | |
| 240 Expect.isTrue(Dynamic.isAssignableTo(IntGenRef)); | |
| 241 Expect.isTrue(Dynamic.isAssignableTo(DubGenRef)); | |
| 242 Expect.isTrue(Dynamic.isAssignableTo(TFromA)); | |
| 243 Expect.isTrue(Dynamic.isAssignableTo(TFromB)); | |
| 244 Expect.isTrue(Dynamic.isAssignableTo(TFromC)); | |
| 245 | |
| 246 TypeMirror Void = currentMirrorSystem().voidType; | |
|
gbracha
2014/01/11 01:53:30
Void vs. Void?
Also there are some special cases
| |
| 247 Expect.isFalse(Obj.isAssignableTo(Void)); | |
| 248 Expect.isFalse(Super.isAssignableTo(Void)); | |
| 249 Expect.isFalse(Sub1.isAssignableTo(Void)); | |
| 250 Expect.isFalse(Sub2.isAssignableTo(Void)); | |
| 251 Expect.isFalse(NumPred.isAssignableTo(Void)); | |
| 252 Expect.isFalse(IntPred.isAssignableTo(Void)); | |
| 253 Expect.isFalse(DubPred.isAssignableTo(Void)); | |
| 254 Expect.isFalse(NumPredRef.isAssignableTo(Void)); | |
| 255 Expect.isFalse(IntPredRef.isAssignableTo(Void)); | |
| 256 Expect.isFalse(DubPredRef.isAssignableTo(Void)); | |
| 257 Expect.isFalse(NumGen.isAssignableTo(Void)); | |
| 258 Expect.isFalse(IntGen.isAssignableTo(Void)); | |
| 259 Expect.isFalse(DubGen.isAssignableTo(Void)); | |
| 260 Expect.isFalse(NumGenRef.isAssignableTo(Void)); | |
| 261 Expect.isFalse(IntGenRef.isAssignableTo(Void)); | |
| 262 Expect.isFalse(DubGenRef.isAssignableTo(Void)); | |
| 263 Expect.isFalse(TFromA.isAssignableTo(Void)); | |
| 264 Expect.isFalse(TFromB.isAssignableTo(Void)); | |
| 265 Expect.isFalse(TFromC.isAssignableTo(Void)); | |
| 266 Expect.isFalse(Void.isAssignableTo(Obj)); | |
| 267 Expect.isFalse(Void.isAssignableTo(Super)); | |
| 268 Expect.isFalse(Void.isAssignableTo(Sub1)); | |
| 269 Expect.isFalse(Void.isAssignableTo(Sub2)); | |
| 270 Expect.isFalse(Void.isAssignableTo(NumPred)); | |
| 271 Expect.isFalse(Void.isAssignableTo(IntPred)); | |
| 272 Expect.isFalse(Void.isAssignableTo(DubPred)); | |
| 273 Expect.isFalse(Void.isAssignableTo(NumPredRef)); | |
| 274 Expect.isFalse(Void.isAssignableTo(IntPredRef)); | |
| 275 Expect.isFalse(Void.isAssignableTo(DubPredRef)); | |
| 276 Expect.isFalse(Void.isAssignableTo(NumGen)); | |
| 277 Expect.isFalse(Void.isAssignableTo(IntGen)); | |
| 278 Expect.isFalse(Void.isAssignableTo(DubGen)); | |
| 279 Expect.isFalse(Void.isAssignableTo(NumGenRef)); | |
| 280 Expect.isFalse(Void.isAssignableTo(IntGenRef)); | |
| 281 Expect.isFalse(Void.isAssignableTo(DubGenRef)); | |
| 282 Expect.isFalse(Void.isAssignableTo(TFromA)); | |
| 283 Expect.isFalse(Void.isAssignableTo(TFromB)); | |
| 284 Expect.isFalse(Void.isAssignableTo(TFromC)); | |
| 285 | |
| 286 Expect.isTrue(Dynamic.isAssignableTo(Void)); | |
| 287 Expect.isTrue(Void.isAssignableTo(Dynamic)); | |
| 288 } | |
| OLD | NEW |