| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 import 'dart:async'; | 5 import 'dart:async'; |
| 6 | 6 |
| 7 import 'package:async_helper/async_helper.dart'; | 7 import 'package:async_helper/async_helper.dart'; |
| 8 import 'package:expect/expect.dart'; | 8 import 'package:expect/expect.dart'; |
| 9 | 9 |
| 10 import 'package:compiler/src/elements/resolution_types.dart'; | 10 import 'package:compiler/src/elements/resolution_types.dart'; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 static String staticString; | 172 static String staticString; |
| 173 static int staticInt; | 173 static int staticInt; |
| 174 } | 174 } |
| 175 """; | 175 """; |
| 176 compiler.parseScript(script); | 176 compiler.parseScript(script); |
| 177 LibraryElement mainApp = compiler.mainApp; | 177 LibraryElement mainApp = compiler.mainApp; |
| 178 ClassElement foo = mainApp.find("Class"); | 178 ClassElement foo = mainApp.find("Class"); |
| 179 foo.ensureResolved(compiler.resolution); | 179 foo.ensureResolved(compiler.resolution); |
| 180 FunctionElement method = foo.lookupLocalMember('forIn'); | 180 FunctionElement method = foo.lookupLocalMember('forIn'); |
| 181 | 181 |
| 182 analyzeIn( | 182 analyzeIn(compiler, method, """{ |
| 183 compiler, | |
| 184 method, | |
| 185 """{ | |
| 186 for (var e in <String>[]) {} | 183 for (var e in <String>[]) {} |
| 187 }"""); | 184 }"""); |
| 188 analyzeIn( | 185 analyzeIn(compiler, method, """{ |
| 189 compiler, | |
| 190 method, | |
| 191 """{ | |
| 192 for (String e in <String>[]) {} | 186 for (String e in <String>[]) {} |
| 193 }"""); | 187 }"""); |
| 194 analyzeIn( | 188 analyzeIn( |
| 195 compiler, | 189 compiler, |
| 196 method, | 190 method, |
| 197 """{ | 191 """{ |
| 198 for (int e in <String>[]) {} | 192 for (int e in <String>[]) {} |
| 199 }""", | 193 }""", |
| 200 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 194 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 201 analyzeIn( | 195 analyzeIn(compiler, method, """{ |
| 202 compiler, | |
| 203 method, | |
| 204 """{ | |
| 205 for (int e in []) {} | 196 for (int e in []) {} |
| 206 }"""); | 197 }"""); |
| 207 | 198 |
| 208 analyzeIn( | 199 analyzeIn(compiler, method, """{ |
| 209 compiler, | |
| 210 method, | |
| 211 """{ | |
| 212 for (var e in new HasUntypedIterator()) {} | 200 for (var e in new HasUntypedIterator()) {} |
| 213 }"""); | 201 }"""); |
| 214 analyzeIn( | 202 analyzeIn(compiler, method, """{ |
| 215 compiler, | |
| 216 method, | |
| 217 """{ | |
| 218 for (String e in new HasUntypedIterator()) {} | 203 for (String e in new HasUntypedIterator()) {} |
| 219 }"""); | 204 }"""); |
| 220 analyzeIn( | 205 analyzeIn(compiler, method, """{ |
| 221 compiler, | |
| 222 method, | |
| 223 """{ | |
| 224 for (int e in new HasUntypedIterator()) {} | 206 for (int e in new HasUntypedIterator()) {} |
| 225 }"""); | 207 }"""); |
| 226 | 208 |
| 227 analyzeIn( | 209 analyzeIn(compiler, method, """{ |
| 228 compiler, | |
| 229 method, | |
| 230 """{ | |
| 231 for (var e in new HasIntIterator()) {} | 210 for (var e in new HasIntIterator()) {} |
| 232 }"""); | 211 }"""); |
| 233 analyzeIn( | 212 analyzeIn( |
| 234 compiler, | 213 compiler, |
| 235 method, | 214 method, |
| 236 """{ | 215 """{ |
| 237 for (String e in new HasIntIterator()) {} | 216 for (String e in new HasIntIterator()) {} |
| 238 }""", | 217 }""", |
| 239 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 218 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 240 analyzeIn( | 219 analyzeIn(compiler, method, """{ |
| 241 compiler, | |
| 242 method, | |
| 243 """{ | |
| 244 for (int e in new HasIntIterator()) {} | 220 for (int e in new HasIntIterator()) {} |
| 245 }"""); | 221 }"""); |
| 246 | 222 |
| 247 analyzeIn( | 223 analyzeIn( |
| 248 compiler, | 224 compiler, |
| 249 method, | 225 method, |
| 250 """{ | 226 """{ |
| 251 for (var e in new HasNoIterator()) {} | 227 for (var e in new HasNoIterator()) {} |
| 252 }""", | 228 }""", |
| 253 warnings: MessageKind.UNDEFINED_GETTER); | 229 warnings: MessageKind.UNDEFINED_GETTER); |
| 254 analyzeIn( | 230 analyzeIn( |
| 255 compiler, | 231 compiler, |
| 256 method, | 232 method, |
| 257 """{ | 233 """{ |
| 258 for (String e in new HasNoIterator()) {} | 234 for (String e in new HasNoIterator()) {} |
| 259 }""", | 235 }""", |
| 260 warnings: MessageKind.UNDEFINED_GETTER); | 236 warnings: MessageKind.UNDEFINED_GETTER); |
| 261 analyzeIn( | 237 analyzeIn( |
| 262 compiler, | 238 compiler, |
| 263 method, | 239 method, |
| 264 """{ | 240 """{ |
| 265 for (int e in new HasNoIterator()) {} | 241 for (int e in new HasNoIterator()) {} |
| 266 }""", | 242 }""", |
| 267 warnings: MessageKind.UNDEFINED_GETTER); | 243 warnings: MessageKind.UNDEFINED_GETTER); |
| 268 | 244 |
| 269 analyzeIn( | 245 analyzeIn(compiler, method, """{ |
| 270 compiler, | |
| 271 method, | |
| 272 """{ | |
| 273 for (var e in new HasCustomIntIterator()) {} | 246 for (var e in new HasCustomIntIterator()) {} |
| 274 }"""); | 247 }"""); |
| 275 analyzeIn( | 248 analyzeIn( |
| 276 compiler, | 249 compiler, |
| 277 method, | 250 method, |
| 278 """{ | 251 """{ |
| 279 for (String e in new HasCustomIntIterator()) {} | 252 for (String e in new HasCustomIntIterator()) {} |
| 280 }""", | 253 }""", |
| 281 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 254 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 282 analyzeIn( | 255 analyzeIn(compiler, method, """{ |
| 283 compiler, | |
| 284 method, | |
| 285 """{ | |
| 286 for (int e in new HasCustomIntIterator()) {} | 256 for (int e in new HasCustomIntIterator()) {} |
| 287 }"""); | 257 }"""); |
| 288 | 258 |
| 289 analyzeIn( | 259 analyzeIn( |
| 290 compiler, | 260 compiler, |
| 291 method, | 261 method, |
| 292 """{ | 262 """{ |
| 293 for (var e in new HasCustomNoCurrentIterator()) {} | 263 for (var e in new HasCustomNoCurrentIterator()) {} |
| 294 }""", | 264 }""", |
| 295 hints: MessageKind.UNDEFINED_GETTER); | 265 hints: MessageKind.UNDEFINED_GETTER); |
| 296 analyzeIn( | 266 analyzeIn( |
| 297 compiler, | 267 compiler, |
| 298 method, | 268 method, |
| 299 """{ | 269 """{ |
| 300 for (String e in new HasCustomNoCurrentIterator()) {} | 270 for (String e in new HasCustomNoCurrentIterator()) {} |
| 301 }""", | 271 }""", |
| 302 hints: MessageKind.UNDEFINED_GETTER); | 272 hints: MessageKind.UNDEFINED_GETTER); |
| 303 analyzeIn( | 273 analyzeIn( |
| 304 compiler, | 274 compiler, |
| 305 method, | 275 method, |
| 306 """{ | 276 """{ |
| 307 for (int e in new HasCustomNoCurrentIterator()) {} | 277 for (int e in new HasCustomNoCurrentIterator()) {} |
| 308 }""", | 278 }""", |
| 309 hints: MessageKind.UNDEFINED_GETTER); | 279 hints: MessageKind.UNDEFINED_GETTER); |
| 310 | 280 |
| 311 analyzeIn( | 281 analyzeIn(compiler, method, """{ |
| 312 compiler, | |
| 313 method, | |
| 314 """{ | |
| 315 var localDyn; | 282 var localDyn; |
| 316 for (localDyn in <String>[]) {} | 283 for (localDyn in <String>[]) {} |
| 317 }"""); | 284 }"""); |
| 318 analyzeIn( | 285 analyzeIn(compiler, method, """{ |
| 319 compiler, | |
| 320 method, | |
| 321 """{ | |
| 322 String localString; | 286 String localString; |
| 323 for (localString in <String>[]) {} | 287 for (localString in <String>[]) {} |
| 324 }"""); | 288 }"""); |
| 325 analyzeIn( | 289 analyzeIn( |
| 326 compiler, | 290 compiler, |
| 327 method, | 291 method, |
| 328 """{ | 292 """{ |
| 329 int localInt; | 293 int localInt; |
| 330 for (localInt in <String>[]) {} | 294 for (localInt in <String>[]) {} |
| 331 }""", | 295 }""", |
| 332 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 296 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 333 | 297 |
| 334 analyzeIn( | 298 analyzeIn(compiler, method, """{ |
| 335 compiler, | |
| 336 method, | |
| 337 """{ | |
| 338 for (topLevelDyn in <String>[]) {} | 299 for (topLevelDyn in <String>[]) {} |
| 339 }"""); | 300 }"""); |
| 340 analyzeIn( | 301 analyzeIn(compiler, method, """{ |
| 341 compiler, | |
| 342 method, | |
| 343 """{ | |
| 344 for (topLevelString in <String>[]) {} | 302 for (topLevelString in <String>[]) {} |
| 345 }"""); | 303 }"""); |
| 346 analyzeIn( | 304 analyzeIn( |
| 347 compiler, | 305 compiler, |
| 348 method, | 306 method, |
| 349 """{ | 307 """{ |
| 350 for (topLevelInt in <String>[]) {} | 308 for (topLevelInt in <String>[]) {} |
| 351 }""", | 309 }""", |
| 352 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 310 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 353 | 311 |
| 354 analyzeIn( | 312 analyzeIn(compiler, method, """{ |
| 355 compiler, | |
| 356 method, | |
| 357 """{ | |
| 358 for (instanceDyn in <String>[]) {} | 313 for (instanceDyn in <String>[]) {} |
| 359 }"""); | 314 }"""); |
| 360 analyzeIn( | 315 analyzeIn(compiler, method, """{ |
| 361 compiler, | |
| 362 method, | |
| 363 """{ | |
| 364 for (instanceString in <String>[]) {} | 316 for (instanceString in <String>[]) {} |
| 365 }"""); | 317 }"""); |
| 366 analyzeIn( | 318 analyzeIn( |
| 367 compiler, | 319 compiler, |
| 368 method, | 320 method, |
| 369 """{ | 321 """{ |
| 370 for (instanceInt in <String>[]) {} | 322 for (instanceInt in <String>[]) {} |
| 371 }""", | 323 }""", |
| 372 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 324 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 373 | 325 |
| 374 analyzeIn( | 326 analyzeIn(compiler, method, """{ |
| 375 compiler, | |
| 376 method, | |
| 377 """{ | |
| 378 for (staticDyn in <String>[]) {} | 327 for (staticDyn in <String>[]) {} |
| 379 }"""); | 328 }"""); |
| 380 analyzeIn( | 329 analyzeIn(compiler, method, """{ |
| 381 compiler, | |
| 382 method, | |
| 383 """{ | |
| 384 for (staticString in <String>[]) {} | 330 for (staticString in <String>[]) {} |
| 385 }"""); | 331 }"""); |
| 386 analyzeIn( | 332 analyzeIn( |
| 387 compiler, | 333 compiler, |
| 388 method, | 334 method, |
| 389 """{ | 335 """{ |
| 390 for (staticInt in <String>[]) {} | 336 for (staticInt in <String>[]) {} |
| 391 }""", | 337 }""", |
| 392 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 338 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 393 } | 339 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 412 static String staticString; | 358 static String staticString; |
| 413 static int staticInt; | 359 static int staticInt; |
| 414 } | 360 } |
| 415 """; | 361 """; |
| 416 compiler.parseScript(script); | 362 compiler.parseScript(script); |
| 417 LibraryElement mainApp = compiler.mainApp; | 363 LibraryElement mainApp = compiler.mainApp; |
| 418 ClassElement foo = mainApp.find("Class"); | 364 ClassElement foo = mainApp.find("Class"); |
| 419 foo.ensureResolved(compiler.resolution); | 365 foo.ensureResolved(compiler.resolution); |
| 420 FunctionElement method = foo.lookupLocalMember('forIn'); | 366 FunctionElement method = foo.lookupLocalMember('forIn'); |
| 421 | 367 |
| 422 analyzeIn( | 368 analyzeIn(compiler, method, """{ |
| 423 compiler, | |
| 424 method, | |
| 425 """{ | |
| 426 var stream; | 369 var stream; |
| 427 await for (var e in stream) {} | 370 await for (var e in stream) {} |
| 428 }"""); | 371 }"""); |
| 429 analyzeIn( | 372 analyzeIn(compiler, method, """{ |
| 430 compiler, | |
| 431 method, | |
| 432 """{ | |
| 433 var stream; | 373 var stream; |
| 434 await for (String e in stream) {} | 374 await for (String e in stream) {} |
| 435 }"""); | 375 }"""); |
| 436 analyzeIn( | 376 analyzeIn(compiler, method, """{ |
| 437 compiler, | |
| 438 method, | |
| 439 """{ | |
| 440 var stream; | 377 var stream; |
| 441 await for (int e in stream) {} | 378 await for (int e in stream) {} |
| 442 }"""); | 379 }"""); |
| 443 | 380 |
| 444 analyzeIn( | 381 analyzeIn( |
| 445 compiler, | 382 compiler, |
| 446 method, | 383 method, |
| 447 """{ | 384 """{ |
| 448 await for (var e in []) {} | 385 await for (var e in []) {} |
| 449 }""", | 386 }""", |
| 450 hints: MessageKind.NOT_ASSIGNABLE); | 387 hints: MessageKind.NOT_ASSIGNABLE); |
| 451 | 388 |
| 452 analyzeIn( | 389 analyzeIn(compiler, method, """{ |
| 453 compiler, | |
| 454 method, | |
| 455 """{ | |
| 456 Stream<String> stream; | 390 Stream<String> stream; |
| 457 await for (var e in stream) {} | 391 await for (var e in stream) {} |
| 458 }"""); | 392 }"""); |
| 459 analyzeIn( | 393 analyzeIn(compiler, method, """{ |
| 460 compiler, | |
| 461 method, | |
| 462 """{ | |
| 463 Stream<String> stream; | 394 Stream<String> stream; |
| 464 await for (String e in stream) {} | 395 await for (String e in stream) {} |
| 465 }"""); | 396 }"""); |
| 466 analyzeIn( | 397 analyzeIn( |
| 467 compiler, | 398 compiler, |
| 468 method, | 399 method, |
| 469 """{ | 400 """{ |
| 470 Stream<String> stream; | 401 Stream<String> stream; |
| 471 await for (int e in stream) {} | 402 await for (int e in stream) {} |
| 472 }""", | 403 }""", |
| 473 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 404 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 474 | 405 |
| 475 analyzeIn( | 406 analyzeIn(compiler, method, """{ |
| 476 compiler, | |
| 477 method, | |
| 478 """{ | |
| 479 CustomStream<String> stream; | 407 CustomStream<String> stream; |
| 480 await for (var e in stream) {} | 408 await for (var e in stream) {} |
| 481 }"""); | 409 }"""); |
| 482 analyzeIn( | 410 analyzeIn(compiler, method, """{ |
| 483 compiler, | |
| 484 method, | |
| 485 """{ | |
| 486 CustomStream<String> stream; | 411 CustomStream<String> stream; |
| 487 await for (String e in stream) {} | 412 await for (String e in stream) {} |
| 488 }"""); | 413 }"""); |
| 489 analyzeIn( | 414 analyzeIn( |
| 490 compiler, | 415 compiler, |
| 491 method, | 416 method, |
| 492 """{ | 417 """{ |
| 493 CustomStream<String> stream; | 418 CustomStream<String> stream; |
| 494 await for (int e in stream) {} | 419 await for (int e in stream) {} |
| 495 }""", | 420 }""", |
| 496 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 421 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 497 | 422 |
| 498 analyzeIn( | 423 analyzeIn(compiler, method, """{ |
| 499 compiler, | |
| 500 method, | |
| 501 """{ | |
| 502 StringStream stream; | 424 StringStream stream; |
| 503 await for (var e in stream) {} | 425 await for (var e in stream) {} |
| 504 }"""); | 426 }"""); |
| 505 analyzeIn( | 427 analyzeIn(compiler, method, """{ |
| 506 compiler, | |
| 507 method, | |
| 508 """{ | |
| 509 StringStream stream; | 428 StringStream stream; |
| 510 await for (String e in stream) {} | 429 await for (String e in stream) {} |
| 511 }"""); | 430 }"""); |
| 512 analyzeIn( | 431 analyzeIn( |
| 513 compiler, | 432 compiler, |
| 514 method, | 433 method, |
| 515 """{ | 434 """{ |
| 516 StringStream stream; | 435 StringStream stream; |
| 517 await for (int e in stream) {} | 436 await for (int e in stream) {} |
| 518 }""", | 437 }""", |
| 519 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 438 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 520 | 439 |
| 521 analyzeIn( | 440 analyzeIn(compiler, method, """{ |
| 522 compiler, | |
| 523 method, | |
| 524 """{ | |
| 525 Stream<String> stream; | 441 Stream<String> stream; |
| 526 var localDyn; | 442 var localDyn; |
| 527 await for (localDyn in stream) {} | 443 await for (localDyn in stream) {} |
| 528 }"""); | 444 }"""); |
| 529 analyzeIn( | 445 analyzeIn(compiler, method, """{ |
| 530 compiler, | |
| 531 method, | |
| 532 """{ | |
| 533 Stream<String> stream; | 446 Stream<String> stream; |
| 534 String localString; | 447 String localString; |
| 535 await for (localString in stream) {} | 448 await for (localString in stream) {} |
| 536 }"""); | 449 }"""); |
| 537 analyzeIn( | 450 analyzeIn( |
| 538 compiler, | 451 compiler, |
| 539 method, | 452 method, |
| 540 """{ | 453 """{ |
| 541 Stream<String> stream; | 454 Stream<String> stream; |
| 542 int localInt; | 455 int localInt; |
| 543 await for (localInt in stream) {} | 456 await for (localInt in stream) {} |
| 544 }""", | 457 }""", |
| 545 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 458 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 546 | 459 |
| 547 analyzeIn( | 460 analyzeIn(compiler, method, """{ |
| 548 compiler, | |
| 549 method, | |
| 550 """{ | |
| 551 Stream<String> stream; | 461 Stream<String> stream; |
| 552 await for (topLevelDyn in stream) {} | 462 await for (topLevelDyn in stream) {} |
| 553 }"""); | 463 }"""); |
| 554 analyzeIn( | 464 analyzeIn(compiler, method, """{ |
| 555 compiler, | |
| 556 method, | |
| 557 """{ | |
| 558 Stream<String> stream; | 465 Stream<String> stream; |
| 559 await for (topLevelString in stream) {} | 466 await for (topLevelString in stream) {} |
| 560 }"""); | 467 }"""); |
| 561 analyzeIn( | 468 analyzeIn( |
| 562 compiler, | 469 compiler, |
| 563 method, | 470 method, |
| 564 """{ | 471 """{ |
| 565 Stream<String> stream; | 472 Stream<String> stream; |
| 566 await for (topLevelInt in stream) {} | 473 await for (topLevelInt in stream) {} |
| 567 }""", | 474 }""", |
| 568 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 475 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 569 | 476 |
| 570 analyzeIn( | 477 analyzeIn(compiler, method, """{ |
| 571 compiler, | |
| 572 method, | |
| 573 """{ | |
| 574 Stream<String> stream; | 478 Stream<String> stream; |
| 575 await for (instanceDyn in stream) {} | 479 await for (instanceDyn in stream) {} |
| 576 }"""); | 480 }"""); |
| 577 analyzeIn( | 481 analyzeIn(compiler, method, """{ |
| 578 compiler, | |
| 579 method, | |
| 580 """{ | |
| 581 Stream<String> stream; | 482 Stream<String> stream; |
| 582 await for (instanceString in stream) {} | 483 await for (instanceString in stream) {} |
| 583 }"""); | 484 }"""); |
| 584 analyzeIn( | 485 analyzeIn( |
| 585 compiler, | 486 compiler, |
| 586 method, | 487 method, |
| 587 """{ | 488 """{ |
| 588 Stream<String> stream; | 489 Stream<String> stream; |
| 589 await for (instanceInt in stream) {} | 490 await for (instanceInt in stream) {} |
| 590 }""", | 491 }""", |
| 591 hints: MessageKind.FORIN_NOT_ASSIGNABLE); | 492 hints: MessageKind.FORIN_NOT_ASSIGNABLE); |
| 592 | 493 |
| 593 analyzeIn( | 494 analyzeIn(compiler, method, """{ |
| 594 compiler, | |
| 595 method, | |
| 596 """{ | |
| 597 Stream<String> stream; | 495 Stream<String> stream; |
| 598 await for (staticDyn in stream) {} | 496 await for (staticDyn in stream) {} |
| 599 }"""); | 497 }"""); |
| 600 analyzeIn( | 498 analyzeIn(compiler, method, """{ |
| 601 compiler, | |
| 602 method, | |
| 603 """{ | |
| 604 Stream<String> stream; | 499 Stream<String> stream; |
| 605 await for (staticString in stream) {} | 500 await for (staticString in stream) {} |
| 606 }"""); | 501 }"""); |
| 607 analyzeIn( | 502 analyzeIn( |
| 608 compiler, | 503 compiler, |
| 609 method, | 504 method, |
| 610 """{ | 505 """{ |
| 611 Stream<String> stream; | 506 Stream<String> stream; |
| 612 await for (staticInt in stream) {} | 507 await for (staticInt in stream) {} |
| 613 }""", | 508 }""", |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 default: break; | 599 default: break; |
| 705 }"""); | 600 }"""); |
| 706 | 601 |
| 707 check(""" | 602 check(""" |
| 708 switch (Enum.A) { | 603 switch (Enum.A) { |
| 709 case Enum.A: break; | 604 case Enum.A: break; |
| 710 case Enum.B: break; | 605 case Enum.B: break; |
| 711 case Enum.C: break; | 606 case Enum.C: break; |
| 712 }"""); | 607 }"""); |
| 713 | 608 |
| 714 check( | 609 check(""" |
| 715 """ | |
| 716 switch (Enum.A) { | 610 switch (Enum.A) { |
| 717 case Enum.B: break; | 611 case Enum.B: break; |
| 718 case Enum.C: break; | 612 case Enum.C: break; |
| 719 }""", | 613 }""", warnings: MessageKind.MISSING_ENUM_CASES); |
| 720 warnings: MessageKind.MISSING_ENUM_CASES); | |
| 721 | 614 |
| 722 check( | 615 check(""" |
| 723 """ | |
| 724 switch (Enum.A) { | 616 switch (Enum.A) { |
| 725 case Enum.A: break; | 617 case Enum.A: break; |
| 726 case Enum.C: break; | 618 case Enum.C: break; |
| 727 }""", | 619 }""", warnings: MessageKind.MISSING_ENUM_CASES); |
| 728 warnings: MessageKind.MISSING_ENUM_CASES); | |
| 729 | 620 |
| 730 check( | 621 check(""" |
| 731 """ | |
| 732 switch (Enum.A) { | 622 switch (Enum.A) { |
| 733 case Enum.A: break; | 623 case Enum.A: break; |
| 734 case Enum.B: break; | 624 case Enum.B: break; |
| 735 }""", | 625 }""", warnings: MessageKind.MISSING_ENUM_CASES); |
| 736 warnings: MessageKind.MISSING_ENUM_CASES); | |
| 737 | 626 |
| 738 check( | 627 check(""" |
| 739 """ | |
| 740 switch (Enum.A) { | 628 switch (Enum.A) { |
| 741 case Enum.A: break; | 629 case Enum.A: break; |
| 742 }""", | 630 }""", warnings: MessageKind.MISSING_ENUM_CASES); |
| 743 warnings: MessageKind.MISSING_ENUM_CASES); | |
| 744 | 631 |
| 745 check( | 632 check(""" |
| 746 """ | |
| 747 switch (Enum.A) { | 633 switch (Enum.A) { |
| 748 case Enum.B: break; | 634 case Enum.B: break; |
| 749 }""", | 635 }""", warnings: MessageKind.MISSING_ENUM_CASES); |
| 750 warnings: MessageKind.MISSING_ENUM_CASES); | |
| 751 | 636 |
| 752 check( | 637 check(""" |
| 753 """ | |
| 754 switch (Enum.A) { | 638 switch (Enum.A) { |
| 755 case Enum.C: break; | 639 case Enum.C: break; |
| 756 }""", | 640 }""", warnings: MessageKind.MISSING_ENUM_CASES); |
| 757 warnings: MessageKind.MISSING_ENUM_CASES); | |
| 758 | 641 |
| 759 check( | 642 check(""" |
| 760 """ | |
| 761 switch (Enum.A) { | 643 switch (Enum.A) { |
| 762 }""", | 644 }""", warnings: MessageKind.MISSING_ENUM_CASES); |
| 763 warnings: MessageKind.MISSING_ENUM_CASES); | |
| 764 } | 645 } |
| 765 | 646 |
| 766 testOperators(MockCompiler compiler) { | 647 testOperators(MockCompiler compiler) { |
| 767 check(String code, {warnings}) { | 648 check(String code, {warnings}) { |
| 768 analyze(compiler, code, warnings: warnings); | 649 analyze(compiler, code, warnings: warnings); |
| 769 } | 650 } |
| 770 | 651 |
| 771 // TODO(karlklose): add the DartC tests for operators when we can parse | 652 // TODO(karlklose): add the DartC tests for operators when we can parse |
| 772 // classes with operators. | 653 // classes with operators. |
| 773 for (final op in ['+', '-', '*', '/', '%', '~/', '|', '&']) { | 654 for (final op in ['+', '-', '*', '/', '%', '~/', '|', '&']) { |
| (...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1657 Future check(String code, [expectedWarnings]) { | 1538 Future check(String code, [expectedWarnings]) { |
| 1658 return analyzeTopLevel(code, expectedWarnings); | 1539 return analyzeTopLevel(code, expectedWarnings); |
| 1659 } | 1540 } |
| 1660 | 1541 |
| 1661 return Future.wait([ | 1542 return Future.wait([ |
| 1662 check("""int i = 0;"""), | 1543 check("""int i = 0;"""), |
| 1663 check("""int i = '';""", NOT_ASSIGNABLE), | 1544 check("""int i = '';""", NOT_ASSIGNABLE), |
| 1664 check("""class Class { | 1545 check("""class Class { |
| 1665 int i = 0; | 1546 int i = 0; |
| 1666 }"""), | 1547 }"""), |
| 1667 check( | 1548 check("""class Class { |
| 1668 """class Class { | |
| 1669 int i = ''; | 1549 int i = ''; |
| 1670 }""", | 1550 }""", NOT_ASSIGNABLE), |
| 1671 NOT_ASSIGNABLE), | |
| 1672 ]); | 1551 ]); |
| 1673 } | 1552 } |
| 1674 | 1553 |
| 1675 void testTypeVariableExpressions(MockCompiler compiler) { | 1554 void testTypeVariableExpressions(MockCompiler compiler) { |
| 1676 String script = """class Foo<T> { | 1555 String script = """class Foo<T> { |
| 1677 void method() {} | 1556 void method() {} |
| 1678 }"""; | 1557 }"""; |
| 1679 compiler.parseScript(script); | 1558 compiler.parseScript(script); |
| 1680 LibraryElement mainApp = compiler.mainApp; | 1559 LibraryElement mainApp = compiler.mainApp; |
| 1681 ClassElement foo = mainApp.find("Foo"); | 1560 ClassElement foo = mainApp.find("Foo"); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1873 check(r'''class Class { | 1752 check(r'''class Class { |
| 1874 int a; | 1753 int a; |
| 1875 Class(this.a); | 1754 Class(this.a); |
| 1876 } | 1755 } |
| 1877 '''), | 1756 '''), |
| 1878 check(r'''class Class { | 1757 check(r'''class Class { |
| 1879 var a; | 1758 var a; |
| 1880 Class(int this.a); | 1759 Class(int this.a); |
| 1881 } | 1760 } |
| 1882 '''), | 1761 '''), |
| 1883 check( | 1762 check(r'''class Class { |
| 1884 r'''class Class { | |
| 1885 String a; | 1763 String a; |
| 1886 Class(int this.a); | 1764 Class(int this.a); |
| 1887 } | 1765 } |
| 1888 ''', | 1766 ''', NOT_ASSIGNABLE), |
| 1889 NOT_ASSIGNABLE), | |
| 1890 check(r'''class Class { | 1767 check(r'''class Class { |
| 1891 var a; | 1768 var a; |
| 1892 Class(int a) : this.a = a; | 1769 Class(int a) : this.a = a; |
| 1893 } | 1770 } |
| 1894 '''), | 1771 '''), |
| 1895 check( | 1772 check(r'''class Class { |
| 1896 r'''class Class { | |
| 1897 String a; | 1773 String a; |
| 1898 Class(int a) : this.a = a; | 1774 Class(int a) : this.a = a; |
| 1899 } | 1775 } |
| 1900 ''', | 1776 ''', NOT_ASSIGNABLE), |
| 1901 NOT_ASSIGNABLE), | |
| 1902 | 1777 |
| 1903 // Check this-calls. | 1778 // Check this-calls. |
| 1904 check(r'''class Class { | 1779 check(r'''class Class { |
| 1905 var a; | 1780 var a; |
| 1906 Class(this.a); | 1781 Class(this.a); |
| 1907 Class.named(int a) : this(a); | 1782 Class.named(int a) : this(a); |
| 1908 } | 1783 } |
| 1909 '''), | 1784 '''), |
| 1910 check( | 1785 check(r'''class Class { |
| 1911 r'''class Class { | |
| 1912 String a; | 1786 String a; |
| 1913 Class(this.a); | 1787 Class(this.a); |
| 1914 Class.named(int a) : this(a); | 1788 Class.named(int a) : this(a); |
| 1915 } | 1789 } |
| 1916 ''', | 1790 ''', NOT_ASSIGNABLE), |
| 1917 NOT_ASSIGNABLE), | |
| 1918 check(r'''class Class { | 1791 check(r'''class Class { |
| 1919 String a; | 1792 String a; |
| 1920 Class(var a) : this.a = a; | 1793 Class(var a) : this.a = a; |
| 1921 Class.named(int a) : this(a); | 1794 Class.named(int a) : this(a); |
| 1922 } | 1795 } |
| 1923 '''), | 1796 '''), |
| 1924 check( | 1797 check(r'''class Class { |
| 1925 r'''class Class { | |
| 1926 String a; | 1798 String a; |
| 1927 Class(String a) : this.a = a; | 1799 Class(String a) : this.a = a; |
| 1928 Class.named(int a) : this(a); | 1800 Class.named(int a) : this(a); |
| 1929 } | 1801 } |
| 1930 ''', | 1802 ''', NOT_ASSIGNABLE), |
| 1931 NOT_ASSIGNABLE), | |
| 1932 | 1803 |
| 1933 // Check super-calls. | 1804 // Check super-calls. |
| 1934 check(r'''class Super { | 1805 check(r'''class Super { |
| 1935 var a; | 1806 var a; |
| 1936 Super(this.a); | 1807 Super(this.a); |
| 1937 } | 1808 } |
| 1938 class Class extends Super { | 1809 class Class extends Super { |
| 1939 Class.named(int a) : super(a); | 1810 Class.named(int a) : super(a); |
| 1940 } | 1811 } |
| 1941 '''), | 1812 '''), |
| 1942 check( | 1813 check(r'''class Super { |
| 1943 r'''class Super { | |
| 1944 String a; | 1814 String a; |
| 1945 Super(this.a); | 1815 Super(this.a); |
| 1946 } | 1816 } |
| 1947 class Class extends Super { | 1817 class Class extends Super { |
| 1948 Class.named(int a) : super(a); | 1818 Class.named(int a) : super(a); |
| 1949 } | 1819 } |
| 1950 ''', | 1820 ''', NOT_ASSIGNABLE), |
| 1951 NOT_ASSIGNABLE), | |
| 1952 check(r'''class Super { | 1821 check(r'''class Super { |
| 1953 String a; | 1822 String a; |
| 1954 Super(var a) : this.a = a; | 1823 Super(var a) : this.a = a; |
| 1955 } | 1824 } |
| 1956 class Class extends Super { | 1825 class Class extends Super { |
| 1957 Class.named(int a) : super(a); | 1826 Class.named(int a) : super(a); |
| 1958 } | 1827 } |
| 1959 '''), | 1828 '''), |
| 1960 check( | 1829 check(r'''class Super { |
| 1961 r'''class Super { | |
| 1962 String a; | 1830 String a; |
| 1963 Super(String a) : this.a = a; | 1831 Super(String a) : this.a = a; |
| 1964 } | 1832 } |
| 1965 class Class extends Super { | 1833 class Class extends Super { |
| 1966 Class.named(int a) : super(a); | 1834 Class.named(int a) : super(a); |
| 1967 } | 1835 } |
| 1968 ''', | 1836 ''', NOT_ASSIGNABLE), |
| 1969 NOT_ASSIGNABLE), | |
| 1970 | 1837 |
| 1971 // Check super-calls involving generics. | 1838 // Check super-calls involving generics. |
| 1972 check(r'''class Super<T> { | 1839 check(r'''class Super<T> { |
| 1973 var a; | 1840 var a; |
| 1974 Super(this.a); | 1841 Super(this.a); |
| 1975 } | 1842 } |
| 1976 class Class extends Super<String> { | 1843 class Class extends Super<String> { |
| 1977 Class.named(int a) : super(a); | 1844 Class.named(int a) : super(a); |
| 1978 } | 1845 } |
| 1979 '''), | 1846 '''), |
| 1980 check( | 1847 check(r'''class Super<T> { |
| 1981 r'''class Super<T> { | |
| 1982 T a; | 1848 T a; |
| 1983 Super(this.a); | 1849 Super(this.a); |
| 1984 } | 1850 } |
| 1985 class Class extends Super<String> { | 1851 class Class extends Super<String> { |
| 1986 Class.named(int a) : super(a); | 1852 Class.named(int a) : super(a); |
| 1987 } | 1853 } |
| 1988 ''', | 1854 ''', NOT_ASSIGNABLE), |
| 1989 NOT_ASSIGNABLE), | |
| 1990 check(r'''class Super<T> { | 1855 check(r'''class Super<T> { |
| 1991 T a; | 1856 T a; |
| 1992 Super(var a) : this.a = a; | 1857 Super(var a) : this.a = a; |
| 1993 } | 1858 } |
| 1994 class Class extends Super<String> { | 1859 class Class extends Super<String> { |
| 1995 Class.named(int a) : super(a); | 1860 Class.named(int a) : super(a); |
| 1996 } | 1861 } |
| 1997 '''), | 1862 '''), |
| 1998 check( | 1863 check(r'''class Super<T> { |
| 1999 r'''class Super<T> { | |
| 2000 T a; | 1864 T a; |
| 2001 Super(T a) : this.a = a; | 1865 Super(T a) : this.a = a; |
| 2002 } | 1866 } |
| 2003 class Class extends Super<String> { | 1867 class Class extends Super<String> { |
| 2004 Class.named(int a) : super(a); | 1868 Class.named(int a) : super(a); |
| 2005 } | 1869 } |
| 2006 ''', | 1870 ''', NOT_ASSIGNABLE), |
| 2007 NOT_ASSIGNABLE), | |
| 2008 | 1871 |
| 2009 // Check instance creations. | 1872 // Check instance creations. |
| 2010 check(r'''class Class { | 1873 check(r'''class Class { |
| 2011 var a; | 1874 var a; |
| 2012 Class(this.a); | 1875 Class(this.a); |
| 2013 } | 1876 } |
| 2014 method(int a) => new Class(a); | 1877 method(int a) => new Class(a); |
| 2015 '''), | 1878 '''), |
| 2016 check( | 1879 check(r'''class Class { |
| 2017 r'''class Class { | |
| 2018 String a; | 1880 String a; |
| 2019 Class(this.a); | 1881 Class(this.a); |
| 2020 } | 1882 } |
| 2021 method(int a) => new Class(a); | 1883 method(int a) => new Class(a); |
| 2022 ''', | 1884 ''', NOT_ASSIGNABLE), |
| 2023 NOT_ASSIGNABLE), | |
| 2024 check(r'''class Class { | 1885 check(r'''class Class { |
| 2025 String a; | 1886 String a; |
| 2026 Class(var a) : this.a = a; | 1887 Class(var a) : this.a = a; |
| 2027 } | 1888 } |
| 2028 method(int a) => new Class(a); | 1889 method(int a) => new Class(a); |
| 2029 '''), | 1890 '''), |
| 2030 check( | 1891 check(r'''class Class { |
| 2031 r'''class Class { | |
| 2032 String a; | 1892 String a; |
| 2033 Class(String a) : this.a = a; | 1893 Class(String a) : this.a = a; |
| 2034 } | 1894 } |
| 2035 method(int a) => new Class(a); | 1895 method(int a) => new Class(a); |
| 2036 ''', | 1896 ''', NOT_ASSIGNABLE), |
| 2037 NOT_ASSIGNABLE), | |
| 2038 | 1897 |
| 2039 // Check instance creations involving generics. | 1898 // Check instance creations involving generics. |
| 2040 check(r'''class Class<T> { | 1899 check(r'''class Class<T> { |
| 2041 var a; | 1900 var a; |
| 2042 Class(this.a); | 1901 Class(this.a); |
| 2043 } | 1902 } |
| 2044 method(int a) => new Class<String>(a); | 1903 method(int a) => new Class<String>(a); |
| 2045 '''), | 1904 '''), |
| 2046 check( | 1905 check(r'''class Class<T> { |
| 2047 r'''class Class<T> { | |
| 2048 T a; | 1906 T a; |
| 2049 Class(this.a); | 1907 Class(this.a); |
| 2050 } | 1908 } |
| 2051 method(int a) => new Class<String>(a); | 1909 method(int a) => new Class<String>(a); |
| 2052 ''', | 1910 ''', NOT_ASSIGNABLE), |
| 2053 NOT_ASSIGNABLE), | |
| 2054 check(r'''class Class<T> { | 1911 check(r'''class Class<T> { |
| 2055 T a; | 1912 T a; |
| 2056 Class(var a) : this.a = a; | 1913 Class(var a) : this.a = a; |
| 2057 } | 1914 } |
| 2058 method(int a) => new Class<String>(a); | 1915 method(int a) => new Class<String>(a); |
| 2059 '''), | 1916 '''), |
| 2060 check( | 1917 check(r'''class Class<T> { |
| 2061 r'''class Class<T> { | |
| 2062 T a; | 1918 T a; |
| 2063 Class(String a) : this.a = a; | 1919 Class(String a) : this.a = a; |
| 2064 } | 1920 } |
| 2065 method(int a) => new Class<String>(a); | 1921 method(int a) => new Class<String>(a); |
| 2066 ''', | 1922 ''', NOT_ASSIGNABLE), |
| 2067 NOT_ASSIGNABLE), | |
| 2068 ]); | 1923 ]); |
| 2069 } | 1924 } |
| 2070 | 1925 |
| 2071 void testGetterSetterInvocation(MockCompiler compiler) { | 1926 void testGetterSetterInvocation(MockCompiler compiler) { |
| 2072 compiler.parseScript(r'''int get variable => 0; | 1927 compiler.parseScript(r'''int get variable => 0; |
| 2073 void set variable(String s) {} | 1928 void set variable(String s) {} |
| 2074 | 1929 |
| 2075 class Class { | 1930 class Class { |
| 2076 int get instanceField => 0; | 1931 int get instanceField => 0; |
| 2077 void set instanceField(String s) {} | 1932 void set instanceField(String s) {} |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2184 class G<V> extends F<V, V> { | 2039 class G<V> extends F<V, V> { |
| 2185 V g; | 2040 V g; |
| 2186 } | 2041 } |
| 2187 '''); | 2042 '''); |
| 2188 | 2043 |
| 2189 check(String text, {warnings, hints, infos}) { | 2044 check(String text, {warnings, hints, infos}) { |
| 2190 analyze(compiler, '{ $text }', | 2045 analyze(compiler, '{ $text }', |
| 2191 warnings: warnings, hints: hints, infos: infos); | 2046 warnings: warnings, hints: hints, infos: infos); |
| 2192 } | 2047 } |
| 2193 | 2048 |
| 2194 check( | 2049 check(r''' |
| 2195 r''' | |
| 2196 A a = new B(); | 2050 A a = new B(); |
| 2197 if (a is C) { | 2051 if (a is C) { |
| 2198 var x = a.c; | 2052 var x = a.c; |
| 2199 }''', | 2053 }''', |
| 2200 warnings: [MessageKind.UNDEFINED_GETTER], | 2054 warnings: [MessageKind.UNDEFINED_GETTER], |
| 2201 hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE], | 2055 hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE], |
| 2202 infos: []); | 2056 infos: []); |
| 2203 | 2057 |
| 2204 check( | 2058 check(r''' |
| 2205 r''' | |
| 2206 A a = new B(); | 2059 A a = new B(); |
| 2207 if (a is C) { | 2060 if (a is C) { |
| 2208 var x = '${a.c}${a.c}'; | 2061 var x = '${a.c}${a.c}'; |
| 2209 }''', | 2062 }''', |
| 2210 warnings: [MessageKind.UNDEFINED_GETTER, MessageKind.UNDEFINED_GETTER], | 2063 warnings: [MessageKind.UNDEFINED_GETTER, MessageKind.UNDEFINED_GETTER], |
| 2211 hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE], | 2064 hints: [MessageKind.NOT_MORE_SPECIFIC_SUBTYPE], |
| 2212 infos: []); | 2065 infos: []); |
| 2213 | 2066 |
| 2214 check( | 2067 check(r''' |
| 2215 r''' | |
| 2216 A a = new B(); | 2068 A a = new B(); |
| 2217 if (a is C) { | 2069 if (a is C) { |
| 2218 var x = '${a.d}${a.d}'; // Type promotion wouldn't help. | 2070 var x = '${a.d}${a.d}'; // Type promotion wouldn't help. |
| 2219 }''', | 2071 }''', |
| 2220 warnings: [MessageKind.UNDEFINED_GETTER, MessageKind.UNDEFINED_GETTER], | 2072 warnings: [MessageKind.UNDEFINED_GETTER, MessageKind.UNDEFINED_GETTER], |
| 2221 hints: [], | 2073 hints: [], |
| 2222 infos: []); | 2074 infos: []); |
| 2223 | 2075 |
| 2224 check( | 2076 check(''' |
| 2225 ''' | |
| 2226 D<int> d = new E(); | 2077 D<int> d = new E(); |
| 2227 if (d is E) { // Suggest E<int>. | 2078 if (d is E) { // Suggest E<int>. |
| 2228 var x = d.e; | 2079 var x = d.e; |
| 2229 }''', | 2080 }''', warnings: [ |
| 2230 warnings: [ | 2081 MessageKind.UNDEFINED_GETTER |
| 2231 MessageKind.UNDEFINED_GETTER | 2082 ], hints: [ |
| 2232 ], | 2083 checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, |
| 2233 hints: [ | 2084 {'shownTypeSuggestion': 'E<int>'}) |
| 2234 checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, | 2085 ], infos: []); |
| 2235 {'shownTypeSuggestion': 'E<int>'}) | |
| 2236 ], | |
| 2237 infos: []); | |
| 2238 | 2086 |
| 2239 check( | 2087 check(''' |
| 2240 ''' | |
| 2241 D<int> d = new F(); | 2088 D<int> d = new F(); |
| 2242 if (d is F) { // Suggest F<int, dynamic>. | 2089 if (d is F) { // Suggest F<int, dynamic>. |
| 2243 var x = d.f; | 2090 var x = d.f; |
| 2244 }''', | 2091 }''', warnings: [ |
| 2245 warnings: [ | 2092 MessageKind.UNDEFINED_GETTER |
| 2246 MessageKind.UNDEFINED_GETTER | 2093 ], hints: [ |
| 2247 ], | 2094 checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, |
| 2248 hints: [ | 2095 {'shownTypeSuggestion': 'F<int, dynamic>'}) |
| 2249 checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, | 2096 ], infos: []); |
| 2250 {'shownTypeSuggestion': 'F<int, dynamic>'}) | |
| 2251 ], | |
| 2252 infos: []); | |
| 2253 | 2097 |
| 2254 check( | 2098 check(''' |
| 2255 ''' | |
| 2256 D<int> d = new G(); | 2099 D<int> d = new G(); |
| 2257 if (d is G) { // Suggest G<int>. | 2100 if (d is G) { // Suggest G<int>. |
| 2258 var x = d.f; | 2101 var x = d.f; |
| 2259 }''', | 2102 }''', warnings: [ |
| 2260 warnings: [ | 2103 MessageKind.UNDEFINED_GETTER |
| 2261 MessageKind.UNDEFINED_GETTER | 2104 ], hints: [ |
| 2262 ], | 2105 checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, |
| 2263 hints: [ | 2106 {'shownTypeSuggestion': 'G<int>'}) |
| 2264 checkMessage(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, | 2107 ], infos: []); |
| 2265 {'shownTypeSuggestion': 'G<int>'}) | |
| 2266 ], | |
| 2267 infos: []); | |
| 2268 | 2108 |
| 2269 check( | 2109 check(''' |
| 2270 ''' | |
| 2271 F<double, int> f = new G(); | 2110 F<double, int> f = new G(); |
| 2272 if (f is G) { // Cannot suggest a more specific type. | 2111 if (f is G) { // Cannot suggest a more specific type. |
| 2273 var x = f.g; | 2112 var x = f.g; |
| 2274 }''', | 2113 }''', |
| 2275 warnings: [MessageKind.UNDEFINED_GETTER], | 2114 warnings: [MessageKind.UNDEFINED_GETTER], |
| 2276 hints: [MessageKind.NOT_MORE_SPECIFIC], | 2115 hints: [MessageKind.NOT_MORE_SPECIFIC], |
| 2277 infos: []); | 2116 infos: []); |
| 2278 | 2117 |
| 2279 check( | 2118 check(''' |
| 2280 ''' | |
| 2281 D<int> d = new E(); | 2119 D<int> d = new E(); |
| 2282 if (d is E) { | 2120 if (d is E) { |
| 2283 var x = d.f; // Type promotion wouldn't help. | 2121 var x = d.f; // Type promotion wouldn't help. |
| 2284 }''', | 2122 }''', |
| 2285 warnings: [MessageKind.UNDEFINED_GETTER], | 2123 warnings: [MessageKind.UNDEFINED_GETTER], hints: [], infos: []); |
| 2286 hints: [], | |
| 2287 infos: []); | |
| 2288 | 2124 |
| 2289 check( | 2125 check(''' |
| 2290 ''' | |
| 2291 A a = new B(); | 2126 A a = new B(); |
| 2292 if (a is B) { | 2127 if (a is B) { |
| 2293 a = null; | 2128 a = null; |
| 2294 var x = a.b; | 2129 var x = a.b; |
| 2295 }''', | 2130 }''', |
| 2296 warnings: [MessageKind.UNDEFINED_GETTER], | 2131 warnings: [MessageKind.UNDEFINED_GETTER], |
| 2297 hints: [MessageKind.POTENTIAL_MUTATION], | 2132 hints: [MessageKind.POTENTIAL_MUTATION], |
| 2298 infos: [MessageKind.POTENTIAL_MUTATION_HERE]); | 2133 infos: [MessageKind.POTENTIAL_MUTATION_HERE]); |
| 2299 | 2134 |
| 2300 check( | 2135 check(''' |
| 2301 ''' | |
| 2302 A a = new B(); | 2136 A a = new B(); |
| 2303 if (a is B) { | 2137 if (a is B) { |
| 2304 a = null; | 2138 a = null; |
| 2305 var x = a.c; // Type promotion wouldn't help. | 2139 var x = a.c; // Type promotion wouldn't help. |
| 2306 }''', | 2140 }''', |
| 2307 warnings: [MessageKind.UNDEFINED_GETTER], | 2141 warnings: [MessageKind.UNDEFINED_GETTER], hints: [], infos: []); |
| 2308 hints: [], | |
| 2309 infos: []); | |
| 2310 | 2142 |
| 2311 check( | 2143 check(''' |
| 2312 ''' | |
| 2313 A a = new B(); | 2144 A a = new B(); |
| 2314 local() { a = new A(); } | 2145 local() { a = new A(); } |
| 2315 if (a is B) { | 2146 if (a is B) { |
| 2316 var x = a.b; | 2147 var x = a.b; |
| 2317 }''', | 2148 }''', |
| 2318 warnings: [MessageKind.UNDEFINED_GETTER], | 2149 warnings: [MessageKind.UNDEFINED_GETTER], |
| 2319 hints: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE], | 2150 hints: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE], |
| 2320 infos: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE]); | 2151 infos: [MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE]); |
| 2321 | 2152 |
| 2322 check( | 2153 check(''' |
| 2323 ''' | |
| 2324 A a = new B(); | 2154 A a = new B(); |
| 2325 local() { a = new A(); } | 2155 local() { a = new A(); } |
| 2326 if (a is B) { | 2156 if (a is B) { |
| 2327 var x = a.c; // Type promotion wouldn't help. | 2157 var x = a.c; // Type promotion wouldn't help. |
| 2328 }''', | 2158 }''', |
| 2329 warnings: [MessageKind.UNDEFINED_GETTER], | 2159 warnings: [MessageKind.UNDEFINED_GETTER], hints: [], infos: []); |
| 2330 hints: [], | |
| 2331 infos: []); | |
| 2332 | 2160 |
| 2333 check( | 2161 check(''' |
| 2334 ''' | |
| 2335 A a = new B(); | 2162 A a = new B(); |
| 2336 if (a is B) { | 2163 if (a is B) { |
| 2337 var x = () => a; | 2164 var x = () => a; |
| 2338 var y = a.b; | 2165 var y = a.b; |
| 2339 } | 2166 } |
| 2340 a = new A();''', | 2167 a = new A();''', warnings: [ |
| 2341 warnings: [ | 2168 MessageKind.UNDEFINED_GETTER |
| 2342 MessageKind.UNDEFINED_GETTER | 2169 ], hints: [ |
| 2343 ], | 2170 MessageKind.ACCESSED_IN_CLOSURE |
| 2344 hints: [ | 2171 ], infos: [ |
| 2345 MessageKind.ACCESSED_IN_CLOSURE | 2172 MessageKind.ACCESSED_IN_CLOSURE_HERE, |
| 2346 ], | 2173 MessageKind.POTENTIAL_MUTATION_HERE |
| 2347 infos: [ | 2174 ]); |
| 2348 MessageKind.ACCESSED_IN_CLOSURE_HERE, | |
| 2349 MessageKind.POTENTIAL_MUTATION_HERE | |
| 2350 ]); | |
| 2351 | 2175 |
| 2352 check( | 2176 check(''' |
| 2353 ''' | |
| 2354 A a = new B(); | 2177 A a = new B(); |
| 2355 if (a is B) { | 2178 if (a is B) { |
| 2356 var x = () => a; | 2179 var x = () => a; |
| 2357 var y = a.c; // Type promotion wouldn't help. | 2180 var y = a.c; // Type promotion wouldn't help. |
| 2358 } | 2181 } |
| 2359 a = new A();''', | 2182 a = new A();''', |
| 2360 warnings: [MessageKind.UNDEFINED_GETTER], | 2183 warnings: [MessageKind.UNDEFINED_GETTER], hints: [], infos: []); |
| 2361 hints: [], | |
| 2362 infos: []); | |
| 2363 } | 2184 } |
| 2364 | 2185 |
| 2365 void testCascade(MockCompiler compiler) { | 2186 void testCascade(MockCompiler compiler) { |
| 2366 compiler.parseScript(r'''typedef A AFunc(); | 2187 compiler.parseScript(r'''typedef A AFunc(); |
| 2367 typedef Function FuncFunc(); | 2188 typedef Function FuncFunc(); |
| 2368 class A { | 2189 class A { |
| 2369 A a; | 2190 A a; |
| 2370 B b; | 2191 B b; |
| 2371 C c; | 2192 C c; |
| 2372 AFunc afunc() => null; | 2193 AFunc afunc() => null; |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2789 TreeElements elements = compiler.resolveNodeStatement(node, element); | 2610 TreeElements elements = compiler.resolveNodeStatement(node, element); |
| 2790 TypeCheckerVisitor checker = | 2611 TypeCheckerVisitor checker = |
| 2791 new TypeCheckerVisitor(compiler, elements, compiler.resolution.types); | 2612 new TypeCheckerVisitor(compiler, elements, compiler.resolution.types); |
| 2792 DiagnosticCollector collector = compiler.diagnosticCollector; | 2613 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 2793 collector.clear(); | 2614 collector.clear(); |
| 2794 checker.analyze(node, mustHaveType: false); | 2615 checker.analyze(node, mustHaveType: false); |
| 2795 generateOutput(compiler, text); | 2616 generateOutput(compiler, text); |
| 2796 compareWarningKinds(text, warnings, collector.warnings); | 2617 compareWarningKinds(text, warnings, collector.warnings); |
| 2797 compareWarningKinds(text, hints, collector.hints); | 2618 compareWarningKinds(text, hints, collector.hints); |
| 2798 } | 2619 } |
| OLD | NEW |