| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 import 'dart:collection'; | 6 import 'dart:collection'; |
| 7 | 7 |
| 8 import 'package:async_helper/async_helper.dart'; | 8 import 'package:async_helper/async_helper.dart'; |
| 9 import 'package:expect/expect.dart'; | 9 import 'package:expect/expect.dart'; |
| 10 import 'package:compiler/src/constants/expressions.dart'; | 10 import 'package:compiler/src/constants/expressions.dart'; |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 () => testLocals([["foo", true], ["bar", true]]), | 301 () => testLocals([["foo", true], ["bar", true]]), |
| 302 | 302 |
| 303 () => testLocals([["foo", false], ["bar", false], ["foobar", true]]), | 303 () => testLocals([["foo", false], ["bar", false], ["foobar", true]]), |
| 304 () => testLocals([["foo", false], ["bar", true], ["foobar", true]]), | 304 () => testLocals([["foo", false], ["bar", true], ["foobar", true]]), |
| 305 () => testLocals([["foo", true], ["bar", true], ["foobar", true]]), | 305 () => testLocals([["foo", true], ["bar", true], ["foobar", true]]), |
| 306 | 306 |
| 307 () => testLocals([["foo", false], ["foo", false]]) | 307 () => testLocals([["foo", false], ["foo", false]]) |
| 308 .then((MockCompiler compiler) { | 308 .then((MockCompiler compiler) { |
| 309 Expect.equals(1, compiler.errors.length); | 309 Expect.equals(1, compiler.errors.length); |
| 310 Expect.equals( | 310 Expect.equals( |
| 311 new Message(MessageKind.DUPLICATE_DEFINITION, {'name': 'foo'}, false), | 311 new Message( |
| 312 MessageTemplate.TEMPLATES[MessageKind.DUPLICATE_DEFINITION], |
| 313 {'name': 'foo'}, false), |
| 312 compiler.errors[0].message); | 314 compiler.errors[0].message); |
| 313 })], (f) => f()); | 315 })], (f) => f()); |
| 314 } | 316 } |
| 315 | 317 |
| 316 | 318 |
| 317 Future testLocalsTwo() { | 319 Future testLocalsTwo() { |
| 318 return MockCompiler.create((MockCompiler compiler) { | 320 return MockCompiler.create((MockCompiler compiler) { |
| 319 ResolverVisitor visitor = compiler.resolverVisitor(); | 321 ResolverVisitor visitor = compiler.resolverVisitor(); |
| 320 Node tree = parseStatement("if (true) { var a = 1; var b = 2; }"); | 322 Node tree = parseStatement("if (true) { var a = 1; var b = 2; }"); |
| 321 ResolutionResult result = visitor.visit(tree); | 323 ResolutionResult result = visitor.visit(tree); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 // Test that we get a warning when Foo is not defined. | 486 // Test that we get a warning when Foo is not defined. |
| 485 Map mapping = compiler.resolveStatement(statement).map; | 487 Map mapping = compiler.resolveStatement(statement).map; |
| 486 | 488 |
| 487 Expect.equals(1, mapping.length); // Only [bar] has an element. | 489 Expect.equals(1, mapping.length); // Only [bar] has an element. |
| 488 Expect.equals(1, compiler.warnings.length); | 490 Expect.equals(1, compiler.warnings.length); |
| 489 | 491 |
| 490 Node warningNode = compiler.warnings[0].node; | 492 Node warningNode = compiler.warnings[0].node; |
| 491 | 493 |
| 492 Expect.equals( | 494 Expect.equals( |
| 493 new Message( | 495 new Message( |
| 494 MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'Foo'}, false), | 496 MessageTemplate.TEMPLATES[MessageKind.CANNOT_RESOLVE_TYPE], |
| 497 {'typeName': 'Foo'}, false), |
| 495 compiler.warnings[0].message); | 498 compiler.warnings[0].message); |
| 496 VariableDefinitions definition = compiler.parsedTree; | 499 VariableDefinitions definition = compiler.parsedTree; |
| 497 Expect.equals(warningNode, definition.type); | 500 Expect.equals(warningNode, definition.type); |
| 498 compiler.clearMessages(); | 501 compiler.clearMessages(); |
| 499 | 502 |
| 500 // Test that there is no warning after defining Foo. | 503 // Test that there is no warning after defining Foo. |
| 501 compiler.parseScript("class Foo {}"); | 504 compiler.parseScript("class Foo {}"); |
| 502 mapping = compiler.resolveStatement(statement).map; | 505 mapping = compiler.resolveStatement(statement).map; |
| 503 Expect.equals(1, mapping.length); | 506 Expect.equals(1, mapping.length); |
| 504 Expect.equals(0, compiler.warnings.length); | 507 Expect.equals(0, compiler.warnings.length); |
| 505 | 508 |
| 506 // Test that 'var' does not create a warning. | 509 // Test that 'var' does not create a warning. |
| 507 mapping = compiler.resolveStatement("var foo;").map; | 510 mapping = compiler.resolveStatement("var foo;").map; |
| 508 Expect.equals(1, mapping.length); | 511 Expect.equals(1, mapping.length); |
| 509 Expect.equals(0, compiler.warnings.length); | 512 Expect.equals(0, compiler.warnings.length); |
| 510 }); | 513 }); |
| 511 } | 514 } |
| 512 | 515 |
| 513 Future testSuperclass() { | 516 Future testSuperclass() { |
| 514 return Future.wait([ | 517 return Future.wait([ |
| 515 MockCompiler.create((MockCompiler compiler) { | 518 MockCompiler.create((MockCompiler compiler) { |
| 516 compiler.parseScript("class Foo extends Bar {}"); | 519 compiler.parseScript("class Foo extends Bar {}"); |
| 517 compiler.resolveStatement("Foo bar;"); | 520 compiler.resolveStatement("Foo bar;"); |
| 518 Expect.equals(1, compiler.errors.length); | 521 Expect.equals(1, compiler.errors.length); |
| 519 var cannotResolveBar = new Message(MessageKind.CANNOT_EXTEND_MALFORMED, | 522 var cannotResolveBar = new Message( |
| 523 MessageTemplate.TEMPLATES[MessageKind.CANNOT_EXTEND_MALFORMED], |
| 520 {'className': 'Foo', 'malformedType': 'Bar'}, false); | 524 {'className': 'Foo', 'malformedType': 'Bar'}, false); |
| 521 Expect.equals(cannotResolveBar, compiler.errors[0].message); | 525 Expect.equals(cannotResolveBar, compiler.errors[0].message); |
| 522 compiler.clearMessages(); | 526 compiler.clearMessages(); |
| 523 }), | 527 }), |
| 524 MockCompiler.create((MockCompiler compiler) { | 528 MockCompiler.create((MockCompiler compiler) { |
| 525 compiler.parseScript("class Foo extends Bar {}"); | 529 compiler.parseScript("class Foo extends Bar {}"); |
| 526 compiler.parseScript("class Bar {}"); | 530 compiler.parseScript("class Bar {}"); |
| 527 Map mapping = compiler.resolveStatement("Foo bar;").map; | 531 Map mapping = compiler.resolveStatement("Foo bar;").map; |
| 528 Expect.equals(1, mapping.length); | 532 Expect.equals(1, mapping.length); |
| 529 | 533 |
| 530 ClassElement fooElement = compiler.mainApp.find('Foo'); | 534 ClassElement fooElement = compiler.mainApp.find('Foo'); |
| 531 ClassElement barElement = compiler.mainApp.find('Bar'); | 535 ClassElement barElement = compiler.mainApp.find('Bar'); |
| 532 Expect.equals(barElement.computeType(compiler), | 536 Expect.equals(barElement.computeType(compiler), |
| 533 fooElement.supertype); | 537 fooElement.supertype); |
| 534 Expect.isTrue(fooElement.interfaces.isEmpty); | 538 Expect.isTrue(fooElement.interfaces.isEmpty); |
| 535 Expect.isTrue(barElement.interfaces.isEmpty); | 539 Expect.isTrue(barElement.interfaces.isEmpty); |
| 536 }), | 540 }), |
| 537 ]); | 541 ]); |
| 538 } | 542 } |
| 539 | 543 |
| 540 Future testVarSuperclass() { | 544 Future testVarSuperclass() { |
| 541 return MockCompiler.create((MockCompiler compiler) { | 545 return MockCompiler.create((MockCompiler compiler) { |
| 542 compiler.parseScript("class Foo extends var {}"); | 546 compiler.parseScript("class Foo extends var {}"); |
| 543 compiler.resolveStatement("Foo bar;"); | 547 compiler.resolveStatement("Foo bar;"); |
| 544 Expect.equals(1, compiler.errors.length); | 548 Expect.equals(1, compiler.errors.length); |
| 545 Expect.equals( | 549 Expect.equals( |
| 546 new Message( | 550 new Message( |
| 547 MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'var'}, false), | 551 MessageTemplate.TEMPLATES[MessageKind.CANNOT_RESOLVE_TYPE], |
| 552 {'typeName': 'var'}, false), |
| 548 compiler.errors[0].message); | 553 compiler.errors[0].message); |
| 549 compiler.clearMessages(); | 554 compiler.clearMessages(); |
| 550 }); | 555 }); |
| 551 } | 556 } |
| 552 | 557 |
| 553 Future testOneInterface() { | 558 Future testOneInterface() { |
| 554 return MockCompiler.create((MockCompiler compiler) { | 559 return MockCompiler.create((MockCompiler compiler) { |
| 555 compiler.parseScript("class Foo implements Bar {}"); | 560 compiler.parseScript("class Foo implements Bar {}"); |
| 556 compiler.resolveStatement("Foo bar;"); | 561 compiler.resolveStatement("Foo bar;"); |
| 557 Expect.equals(1, compiler.errors.length); | 562 Expect.equals(1, compiler.errors.length); |
| 558 Expect.equals( | 563 Expect.equals( |
| 559 new Message( | 564 new Message( |
| 560 MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'bar'}, false), | 565 MessageTemplate.TEMPLATES[MessageKind.CANNOT_RESOLVE_TYPE], |
| 566 {'typeName': 'bar'}, false), |
| 561 compiler.errors[0].message); | 567 compiler.errors[0].message); |
| 562 compiler.clearMessages(); | 568 compiler.clearMessages(); |
| 563 | 569 |
| 564 // Add the abstract class to the world and make sure everything is setup | 570 // Add the abstract class to the world and make sure everything is setup |
| 565 // correctly. | 571 // correctly. |
| 566 compiler.parseScript("abstract class Bar {}"); | 572 compiler.parseScript("abstract class Bar {}"); |
| 567 | 573 |
| 568 ResolverVisitor visitor = | 574 ResolverVisitor visitor = |
| 569 new ResolverVisitor(compiler, null, | 575 new ResolverVisitor(compiler, null, |
| 570 new ResolutionRegistry.internal(compiler, | 576 new ResolutionRegistry.internal(compiler, |
| (...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1381 } | 1387 } |
| 1382 main() => A.m(); | 1388 main() => A.m(); |
| 1383 ''', functionName: 'm'); | 1389 ''', functionName: 'm'); |
| 1384 check(''' | 1390 check(''' |
| 1385 class A { | 1391 class A { |
| 1386 m() => () => await - 3; | 1392 m() => () => await - 3; |
| 1387 } | 1393 } |
| 1388 main() => new A().m(); | 1394 main() => new A().m(); |
| 1389 ''', className: 'A'); | 1395 ''', className: 'A'); |
| 1390 } | 1396 } |
| OLD | NEW |