| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 // Test that `covariant` can be parsed (and ignored) by | 5 // Test that `covariant` can be parsed (and ignored) by |
| 6 // dart2js and the VM. | 6 // dart2js and the VM. |
| 7 // This test only checks for non-strong mode behavior. | 7 // This test only checks for non-strong mode behavior. |
| 8 // | 8 // |
| 9 // Generally, `covariant` should be ignored, when it is used in the right | 9 // Generally, `covariant` should be ignored, when it is used in the right |
| 10 // places. | 10 // places. |
| 11 | 11 |
| 12 import 'package:expect/expect.dart'; | 12 import 'package:expect/expect.dart'; |
| 13 | 13 |
| 14 // Top level field may not have a covariant. | 14 // Top level field may not have a covariant. |
| 15 // Would be considered a minor (acceptable) bug, if it was accepted here too. | 15 // Would be considered a minor (acceptable) bug, if it was accepted here too. |
| 16 covariant /// 00: compile-time error | 16 covariant // /// 00: compile-time error |
| 17 int x0; | 17 int x0; |
| 18 | 18 |
| 19 covariant int covariant; /// 00b: compile-time error | 19 covariant int covariant; // /// 00b: compile-time error |
| 20 | 20 |
| 21 int covariant; /// 00c: ok | 21 int covariant; // /// 00c: ok |
| 22 | 22 |
| 23 // Getters may never have `covariant`. (Neither on the top-level nor as members) | 23 // Getters may never have `covariant`. (Neither on the top-level nor as members) |
| 24 covariant /// 01: compile-time error | 24 covariant // /// 01: compile-time error |
| 25 int get x1 => 499; | 25 int get x1 => 499; |
| 26 | 26 |
| 27 // Top level setters may not have a covariant. | 27 // Top level setters may not have a covariant. |
| 28 // Would be considered a minor (acceptable) bug, if it was accepted here too. | 28 // Would be considered a minor (acceptable) bug, if it was accepted here too. |
| 29 void set x2( | 29 void set x2( |
| 30 covariant /// 02: compile-time error | 30 covariant /// 02: compile-time error |
| 31 int val) {} | 31 int val) {} |
| 32 | 32 |
| 33 // Same as above, but with `covariant` in different positions. | 33 // Same as above, but with `covariant` in different positions. |
| 34 // The `covariant` is just wrong there. | 34 // The `covariant` is just wrong there. |
| 35 | 35 |
| 36 int | 36 int |
| 37 covariant /// 03: compile-time error | 37 covariant // /// 03: compile-time error |
| 38 x3; | 38 x3; |
| 39 | 39 |
| 40 int | 40 int |
| 41 covariant /// 04: compile-time error | 41 covariant // /// 04: compile-time error |
| 42 get x4 => 499; | 42 get x4 => 499; |
| 43 | 43 |
| 44 void set x5( | 44 void set x5( |
| 45 int | 45 int |
| 46 covariant /// 05: compile-time error | 46 covariant /// 05: compile-time error |
| 47 val) {} | 47 val) {} |
| 48 | 48 |
| 49 | 49 |
| 50 // Same without types. | 50 // Same without types. |
| 51 | 51 |
| 52 // Since `covariant` is a built-in identifier, it is not allowed here. | 52 // Since `covariant` is a built-in identifier, it is not allowed here. |
| 53 covariant x6; /// 06: compile-time error | 53 covariant x6; // /// 06: compile-time error |
| 54 | 54 |
| 55 covariant covariant; /// 06b: compile-time error | 55 covariant covariant; // /// 06b: compile-time error |
| 56 | 56 |
| 57 // Getters may never have `covariant`. | 57 // Getters may never have `covariant`. |
| 58 covariant /// 07: compile-time error | 58 covariant // /// 07: compile-time error |
| 59 get x7 => 499; | 59 get x7 => 499; |
| 60 | 60 |
| 61 // Top level setters may not have a covariant. | 61 // Top level setters may not have a covariant. |
| 62 // Would be considered a minor (acceptable) bug, if it was accepted here too. | 62 // Would be considered a minor (acceptable) bug, if it was accepted here too. |
| 63 void set x8( | 63 void set x8( |
| 64 covariant /// 08: compile-time error | 64 covariant /// 08: compile-time error |
| 65 val) {} | 65 val) {} |
| 66 | 66 |
| 67 // If there is no type, then `covariant` is simply the parameter name: | 67 // If there is no type, then `covariant` is simply the parameter name: |
| 68 void set x9(covariant) {} | 68 void set x9(covariant) {} |
| 69 | 69 |
| 70 // Covariant won't work on return types. | 70 // Covariant won't work on return types. |
| 71 covariant /// 10: compile-time error | 71 covariant // /// 10: compile-time error |
| 72 int f10() => 499; | 72 int f10() => 499; |
| 73 | 73 |
| 74 // Covariant won't work as a return type. | 74 // Covariant won't work as a return type. |
| 75 covariant /// 11: compile-time error | 75 covariant // /// 11: compile-time error |
| 76 f11() => 499; | 76 f11() => 499; |
| 77 | 77 |
| 78 // Covariant should not work on top-level methods. | 78 // Covariant should not work on top-level methods. |
| 79 // It's a minor (acceptable) bug to not error out here. | 79 // It's a minor (acceptable) bug to not error out here. |
| 80 int f12( | 80 int f12( |
| 81 covariant /// 12: compile-time error | 81 covariant /// 12: compile-time error |
| 82 int x) => 499; | 82 int x) => 499; |
| 83 | 83 |
| 84 // `Covariant` must be in front of the types. | 84 // `Covariant` must be in front of the types. |
| 85 int f13( | 85 int f13( |
| (...skipping 25 matching lines...) Expand all Loading... |
| 111 // `Covariant` must be in front of modifiers. | 111 // `Covariant` must be in front of modifiers. |
| 112 int f17( | 112 int f17( |
| 113 final | 113 final |
| 114 covariant /// 17: compile-time error | 114 covariant /// 17: compile-time error |
| 115 int | 115 int |
| 116 x) => 499; | 116 x) => 499; |
| 117 | 117 |
| 118 // On its own, `covariant` is just a parameter name. | 118 // On its own, `covariant` is just a parameter name. |
| 119 int f18(covariant) => covariant; | 119 int f18(covariant) => covariant; |
| 120 | 120 |
| 121 covariant; /// 19: compile-time error | 121 covariant; // /// 19: compile-time error |
| 122 | 122 |
| 123 // All of the above as statics in a class. | 123 // All of the above as statics in a class. |
| 124 class A { | 124 class A { |
| 125 // Static fields may not have a covariant. | 125 // Static fields may not have a covariant. |
| 126 // Would be considered a minor (acceptable) bug, if it was accepted here too. | 126 // Would be considered a minor (acceptable) bug, if it was accepted here too. |
| 127 static | 127 static |
| 128 covariant /// 20: compile-time error | 128 covariant // /// 20: compile-time error |
| 129 int x20; | 129 int x20; |
| 130 | 130 |
| 131 static covariant int covariant /// 20b: compile-time error | 131 static covariant int covariant // /// 20b: compile-time error |
| 132 | 132 |
| 133 static int covariant; /// 20c: ok | 133 static int covariant; // /// 20c: ok |
| 134 | 134 |
| 135 // Getters may never have `covariant`. | 135 // Getters may never have `covariant`. |
| 136 static | 136 static |
| 137 covariant /// 21: compile-time error | 137 covariant // /// 21: compile-time error |
| 138 int get x21 => 499; | 138 int get x21 => 499; |
| 139 | 139 |
| 140 // Getters may never have `covariant`. | 140 // Getters may never have `covariant`. |
| 141 covariant /// 21b: compile-time error | 141 covariant // /// 21b: compile-time error |
| 142 static | 142 static |
| 143 int get x21b => 499; | 143 int get x21b => 499; |
| 144 | 144 |
| 145 // Static setters may not have a covariant. | 145 // Static setters may not have a covariant. |
| 146 // Would be considered a minor (acceptable) bug, if it was accepted here too. | 146 // Would be considered a minor (acceptable) bug, if it was accepted here too. |
| 147 static void set x22( | 147 static void set x22( |
| 148 covariant /// 22: compile-time error | 148 covariant /// 22: compile-time error |
| 149 int val) {} | 149 int val) {} |
| 150 | 150 |
| 151 // Same as above, but with `covariant` in different positions. | 151 // Same as above, but with `covariant` in different positions. |
| 152 // The `covariant` is just wrong there. | 152 // The `covariant` is just wrong there. |
| 153 | 153 |
| 154 static int | 154 static int |
| 155 covariant /// 23: compile-time error | 155 covariant // /// 23: compile-time error |
| 156 x23; | 156 x23; |
| 157 | 157 |
| 158 static int | 158 static int |
| 159 covariant /// 24: compile-time error | 159 covariant // /// 24: compile-time error |
| 160 get x24 => 499; | 160 get x24 => 499; |
| 161 | 161 |
| 162 static void set x25( | 162 static void set x25( |
| 163 int | 163 int |
| 164 covariant /// 25: compile-time error | 164 covariant /// 25: compile-time error |
| 165 val) {} | 165 val) {} |
| 166 | 166 |
| 167 // Since `covariant` is a built-in identifier, it is not allowed here. | 167 // Since `covariant` is a built-in identifier, it is not allowed here. |
| 168 static covariant x26; /// 26: compile-time error | 168 static covariant x26; /// 26: compile-time error |
| 169 static covariant covariant; /// 26b: compile-time error | 169 static covariant covariant; /// 26b: compile-time error |
| 170 | 170 |
| 171 // Getters may never have `covariant`. | 171 // Getters may never have `covariant`. |
| 172 static | 172 static |
| 173 covariant /// 27: compile-time error | 173 covariant // /// 27: compile-time error |
| 174 get x27 => 499; | 174 get x27 => 499; |
| 175 | 175 |
| 176 covariant /// 27b: compile-time error | 176 covariant // /// 27b: compile-time error |
| 177 static | 177 static |
| 178 get x27b => 499; | 178 get x27b => 499; |
| 179 | 179 |
| 180 // Static setters may not have a covariant. | 180 // Static setters may not have a covariant. |
| 181 // Would be considered a minor (acceptable) bug, if it was accepted here too. | 181 // Would be considered a minor (acceptable) bug, if it was accepted here too. |
| 182 static void set x28( | 182 static void set x28( |
| 183 covariant /// 28: compile-time error | 183 covariant /// 28: compile-time error |
| 184 val) {} | 184 val) {} |
| 185 | 185 |
| 186 // If there is no type, then `covariant` is simply the parameter name: | 186 // If there is no type, then `covariant` is simply the parameter name: |
| 187 static void set x29(covariant) {} | 187 static void set x29(covariant) {} |
| 188 | 188 |
| 189 // Covariant won't work on return types. | 189 // Covariant won't work on return types. |
| 190 static | 190 static |
| 191 covariant /// 30: compile-time error | 191 covariant // /// 30: compile-time error |
| 192 int f30() => 499; | 192 int f30() => 499; |
| 193 | 193 |
| 194 covariant /// 30b: compile-time error | 194 covariant // /// 30b: compile-time error |
| 195 static | 195 static |
| 196 int f30b() => 499; | 196 int f30b() => 499; |
| 197 | 197 |
| 198 // Covariant won't work as a return type. | 198 // Covariant won't work as a return type. |
| 199 static | 199 static |
| 200 covariant /// 31: compile-time error | 200 covariant // /// 31: compile-time error |
| 201 f31() => 499; | 201 f31() => 499; |
| 202 | 202 |
| 203 covariant /// 31b: compile-time error | 203 covariant // /// 31b: compile-time error |
| 204 static | 204 static |
| 205 f31b() => 499; | 205 f31b() => 499; |
| 206 | 206 |
| 207 // Covariant should not work on static methods. | 207 // Covariant should not work on static methods. |
| 208 // It's a minor (acceptable) bug to not error out here. | 208 // It's a minor (acceptable) bug to not error out here. |
| 209 static int f32( | 209 static int f32( |
| 210 covariant /// 32: compile-time error | 210 covariant /// 32: compile-time error |
| 211 int x) => 499; | 211 int x) => 499; |
| 212 | 212 |
| 213 // `Covariant` must be in front of the types. | 213 // `Covariant` must be in front of the types. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 240 // `Covariant` must be in front of modifiers. | 240 // `Covariant` must be in front of modifiers. |
| 241 static int f37( | 241 static int f37( |
| 242 final | 242 final |
| 243 covariant /// 37: compile-time error | 243 covariant /// 37: compile-time error |
| 244 int | 244 int |
| 245 x) => 499; | 245 x) => 499; |
| 246 | 246 |
| 247 // `Covariant` on its own is just a parameter name. | 247 // `Covariant` on its own is just a parameter name. |
| 248 static int f38(covariant) => covariant; | 248 static int f38(covariant) => covariant; |
| 249 | 249 |
| 250 static covariant; /// 39: compile-time error | 250 static covariant; // /// 39: compile-time error |
| 251 | 251 |
| 252 } | 252 } |
| 253 | 253 |
| 254 // All of the above as instance members in a class. | 254 // All of the above as instance members in a class. |
| 255 class B { | 255 class B { |
| 256 covariant /// 40: ok | 256 covariant // /// 40: ok |
| 257 int x40; | 257 int x40; |
| 258 | 258 |
| 259 covariant int covariant; /// 40b: ok | 259 covariant int covariant; // /// 40b: ok |
| 260 | 260 |
| 261 int covariant; /// 40c: ok | 261 int covariant; // /// 40c: ok |
| 262 | 262 |
| 263 // Getters may never have `covariant`. | 263 // Getters may never have `covariant`. |
| 264 covariant /// 41: compile-time error | 264 covariant // /// 41: compile-time error |
| 265 int get x41 => 499; | 265 int get x41 => 499; |
| 266 | 266 |
| 267 void set x42( | 267 void set x42( |
| 268 covariant /// 42: ok | 268 covariant // /// 42: ok |
| 269 int val) {} | 269 int val) {} |
| 270 | 270 |
| 271 // `covariant` in the wrong position. | 271 // `covariant` in the wrong position. |
| 272 int | 272 int |
| 273 covariant /// 43: compile-time error | 273 covariant // /// 43: compile-time error |
| 274 x43; | 274 x43; |
| 275 | 275 |
| 276 // `covariant` in the wrong position. | 276 // `covariant` in the wrong position. |
| 277 int | 277 int |
| 278 covariant /// 44: compile-time error | 278 covariant // /// 44: compile-time error |
| 279 get x44 => 499; | 279 get x44 => 499; |
| 280 | 280 |
| 281 void set x45( | 281 void set x45( |
| 282 int | 282 int |
| 283 covariant /// 45: compile-time error | 283 covariant /// 45: compile-time error |
| 284 val) {} | 284 val) {} |
| 285 | 285 |
| 286 // Since `covariant` is a built-in identifier, it is not allowed here. | 286 // Since `covariant` is a built-in identifier, it is not allowed here. |
| 287 covariant x46; /// 46: compile-time error | 287 covariant x46; /// 46: compile-time error |
| 288 covariant covariant; /// 46b: compile-time error | 288 covariant covariant; /// 46b: compile-time error |
| 289 | 289 |
| 290 // Getters may never have `covariant`. | 290 // Getters may never have `covariant`. |
| 291 covariant /// 47: compile-time error | 291 covariant // /// 47: compile-time error |
| 292 get x47 => 499; | 292 get x47 => 499; |
| 293 | 293 |
| 294 void set x48( | 294 void set x48( |
| 295 covariant /// 48: ok | 295 covariant // /// 48: ok |
| 296 val) {} | 296 val) {} |
| 297 | 297 |
| 298 // If there is no type, then `covariant` is simply the parameter name: | 298 // If there is no type, then `covariant` is simply the parameter name: |
| 299 void set x49(covariant) {} | 299 void set x49(covariant) {} |
| 300 | 300 |
| 301 // Covariant won't work on return types. | 301 // Covariant won't work on return types. |
| 302 covariant /// 50: compile-time error | 302 covariant // /// 50: compile-time error |
| 303 int f50() => 499; | 303 int f50() => 499; |
| 304 | 304 |
| 305 // Covariant won't work as a return type. | 305 // Covariant won't work as a return type. |
| 306 covariant /// 51: compile-time error | 306 covariant // /// 51: compile-time error |
| 307 f51() => 499; | 307 f51() => 499; |
| 308 | 308 |
| 309 int f52( | 309 int f52( |
| 310 covariant /// 52: ok | 310 covariant // /// 52: ok |
| 311 int x) => 499; | 311 int x) => 499; |
| 312 | 312 |
| 313 // `Covariant` must be in front of the types. | 313 // `Covariant` must be in front of the types. |
| 314 int f53( | 314 int f53( |
| 315 int | 315 int |
| 316 covariant /// 53: compile-time error | 316 covariant /// 53: compile-time error |
| 317 x) => 499; | 317 x) => 499; |
| 318 | 318 |
| 319 int f54( | 319 int f54( |
| 320 covariant /// 54: ok | 320 covariant // /// 54: ok |
| 321 final x) => 499; | 321 final x) => 499; |
| 322 | 322 |
| 323 // `Covariant` must be in front of modifiers. | 323 // `Covariant` must be in front of modifiers. |
| 324 int f55( | 324 int f55( |
| 325 final | 325 final |
| 326 covariant /// 55: compile-time error | 326 covariant /// 55: compile-time error |
| 327 x) => 499; | 327 x) => 499; |
| 328 | 328 |
| 329 int f56( | 329 int f56( |
| 330 covariant /// 56: ok | 330 covariant // /// 56: ok |
| 331 final int x) => 499; | 331 final int x) => 499; |
| 332 | 332 |
| 333 // `Covariant` must be in front of modifiers. | 333 // `Covariant` must be in front of modifiers. |
| 334 int f57( | 334 int f57( |
| 335 final | 335 final |
| 336 covariant /// 57: compile-time error | 336 covariant /// 57: compile-time error |
| 337 int | 337 int |
| 338 x) => 499; | 338 x) => 499; |
| 339 | 339 |
| 340 // `Covariant` on its own is just a parameter name. | 340 // `Covariant` on its own is just a parameter name. |
| 341 int f58(covariant) => covariant; | 341 int f58(covariant) => covariant; |
| 342 | 342 |
| 343 covariant; /// 59: compile-time error | 343 covariant; // /// 59: compile-time error |
| 344 } | 344 } |
| 345 | 345 |
| 346 void use(x) {} | 346 void use(x) {} |
| 347 | 347 |
| 348 main() { | 348 main() { |
| 349 x0 = 0; | 349 x0 = 0; |
| 350 covariant = 0; /// 00b: continued | 350 covariant = 0; // /// 00b: continued |
| 351 covariant = 0; /// 00c: continued | 351 covariant = 0; // /// 00c: continued |
| 352 use(x1); | 352 use(x1); |
| 353 x2 = 499; | 353 x2 = 499; |
| 354 use(x3); | 354 use(x3); |
| 355 use(x4); | 355 use(x4); |
| 356 x5 = 42; | 356 x5 = 42; |
| 357 x6 = 0; /// 06: continued | 357 x6 = 0; /// 06: continued |
| 358 covariant = 0; /// 06b: continued | 358 covariant = 0; /// 06b: continued |
| 359 use(x7); | 359 use(x7); |
| 360 x8 = 11; | 360 x8 = 11; |
| 361 x9 = 12; | 361 x9 = 12; |
| 362 use(f10()); | 362 use(f10()); |
| 363 use(f11()); | 363 use(f11()); |
| 364 use(f12(2)); | 364 use(f12(2)); |
| 365 use(f13(3)); | 365 use(f13(3)); |
| 366 use(f14(3)); | 366 use(f14(3)); |
| 367 use(f15(3)); | 367 use(f15(3)); |
| 368 use(f16(3)); | 368 use(f16(3)); |
| 369 use(f17(3)); | 369 use(f17(3)); |
| 370 Expect.equals(123, f18(123)); | 370 Expect.equals(123, f18(123)); |
| 371 use(covariant); /// 19: continued | 371 use(covariant); // /// 19: continued |
| 372 | 372 |
| 373 A.x20 = 0; | 373 A.x20 = 0; |
| 374 A.covariant = 0; /// 20b: continued | 374 A.covariant = 0; // /// 20b: continued |
| 375 A.covariant = 0; /// 20c: continued | 375 A.covariant = 0; // /// 20c: continued |
| 376 use(A.x21); | 376 use(A.x21); |
| 377 use(A.x21b); | 377 use(A.x21b); |
| 378 A.x22 = 499; | 378 A.x22 = 499; |
| 379 use(A.x23); | 379 use(A.x23); |
| 380 use(A.x24); | 380 use(A.x24); |
| 381 A.x25 = 42; | 381 A.x25 = 42; |
| 382 A.x26 = 0; /// 26: continued | 382 A.x26 = 0; /// 26: continued |
| 383 A.covariant = 0; /// 26b: continued | 383 A.covariant = 0; /// 26b: continued |
| 384 use(A.x27); | 384 use(A.x27); |
| 385 use(A.x27b); | 385 use(A.x27b); |
| 386 A.x28 = 11; | 386 A.x28 = 11; |
| 387 A.x29 = 12; | 387 A.x29 = 12; |
| 388 use(A.f30()); | 388 use(A.f30()); |
| 389 use(A.f31()); | 389 use(A.f31()); |
| 390 use(A.f31b()); | 390 use(A.f31b()); |
| 391 use(A.f32(2)); | 391 use(A.f32(2)); |
| 392 use(A.f33(3)); | 392 use(A.f33(3)); |
| 393 use(A.f34(3)); | 393 use(A.f34(3)); |
| 394 use(A.f35(3)); | 394 use(A.f35(3)); |
| 395 use(A.f36(3)); | 395 use(A.f36(3)); |
| 396 use(A.f37(3)); | 396 use(A.f37(3)); |
| 397 Expect.equals(1234, A.f38(1234)); | 397 Expect.equals(1234, A.f38(1234)); |
| 398 use(A.covariant); /// 39: continued | 398 use(A.covariant); // /// 39: continued |
| 399 | 399 |
| 400 var b = new B(); | 400 var b = new B(); |
| 401 b.x40 = 0; | 401 b.x40 = 0; |
| 402 b.covariant = 0; /// 40b: continued | 402 b.covariant = 0; // /// 40b: continued |
| 403 b.covariant = 0; /// 40c: continued | 403 b.covariant = 0; // /// 40c: continued |
| 404 use(b.x41); | 404 use(b.x41); |
| 405 b.x42 = 499; | 405 b.x42 = 499; |
| 406 use(b.x43); | 406 use(b.x43); |
| 407 use(b.x44); | 407 use(b.x44); |
| 408 b.x45 = 42; | 408 b.x45 = 42; |
| 409 b.x46 = 0; /// 46: continued | 409 b.x46 = 0; /// 46: continued |
| 410 b.covariant = 0; /// 46b: continued | 410 b.covariant = 0; /// 46b: continued |
| 411 use(b.x47); | 411 use(b.x47); |
| 412 b.x48 = 11; | 412 b.x48 = 11; |
| 413 b.x49 = 12; | 413 b.x49 = 12; |
| 414 use(b.f50()); | 414 use(b.f50()); |
| 415 use(b.f51()); | 415 use(b.f51()); |
| 416 use(b.f52(2)); | 416 use(b.f52(2)); |
| 417 use(b.f53(2)); | 417 use(b.f53(2)); |
| 418 use(b.f54(3)); | 418 use(b.f54(3)); |
| 419 use(b.f55(3)); | 419 use(b.f55(3)); |
| 420 use(b.f56(3)); | 420 use(b.f56(3)); |
| 421 use(b.f57(3)); | 421 use(b.f57(3)); |
| 422 Expect.equals(12345, b.f58(12345)); | 422 Expect.equals(12345, b.f58(12345)); |
| 423 use(B.covariant); /// 59: continued | 423 use(B.covariant); // /// 59: continued |
| 424 } | 424 } |
| OLD | NEW |