| 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 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 } | 330 } |
| 331 | 331 |
| 332 Future testLocalsThree() { | 332 Future testLocalsThree() { |
| 333 return MockCompiler.create((MockCompiler compiler) { | 333 return MockCompiler.create((MockCompiler compiler) { |
| 334 ResolverVisitor visitor = compiler.resolverVisitor(); | 334 ResolverVisitor visitor = compiler.resolverVisitor(); |
| 335 Node tree = parseStatement("{ var a = 1; if (true) { a; } }"); | 335 Node tree = parseStatement("{ var a = 1; if (true) { a; } }"); |
| 336 ResolutionResult result = visitor.visit(tree); | 336 ResolutionResult result = visitor.visit(tree); |
| 337 Expect.equals(const NoneResult(), result); | 337 Expect.equals(const NoneResult(), result); |
| 338 MethodScope scope = visitor.scope; | 338 MethodScope scope = visitor.scope; |
| 339 Expect.equals(0, scope.elements.length); | 339 Expect.equals(0, scope.elements.length); |
| 340 Expect.equals(3, map(visitor).length); | 340 Expect.equals(2, map(visitor).length); |
| 341 List<Element> elements = map(visitor).values.toList(); | 341 List<Element> elements = map(visitor).values.toList(); |
| 342 Expect.equals(elements[0], elements[1]); | 342 Expect.equals(elements[0], elements[1]); |
| 343 }); | 343 }); |
| 344 } | 344 } |
| 345 | 345 |
| 346 Future testLocalsFour() { | 346 Future testLocalsFour() { |
| 347 return MockCompiler.create((MockCompiler compiler) { | 347 return MockCompiler.create((MockCompiler compiler) { |
| 348 ResolverVisitor visitor = compiler.resolverVisitor(); | 348 ResolverVisitor visitor = compiler.resolverVisitor(); |
| 349 Node tree = parseStatement("{ var a = 1; if (true) { var a = 1; } }"); | 349 Node tree = parseStatement("{ var a = 1; if (true) { var a = 1; } }"); |
| 350 ResolutionResult result = visitor.visit(tree); | 350 ResolutionResult result = visitor.visit(tree); |
| 351 Expect.equals(const NoneResult(), result); | 351 Expect.equals(const NoneResult(), result); |
| 352 MethodScope scope = visitor.scope; | 352 MethodScope scope = visitor.scope; |
| 353 Expect.equals(0, scope.elements.length); | 353 Expect.equals(0, scope.elements.length); |
| 354 Expect.equals(2, map(visitor).length); | 354 Expect.equals(2, map(visitor).length); |
| 355 List<Element> elements = map(visitor).values.toList(); | 355 List<Element> elements = map(visitor).values.toList(); |
| 356 Expect.notEquals(elements[0], elements[1]); | 356 Expect.notEquals(elements[0], elements[1]); |
| 357 }); | 357 }); |
| 358 } | 358 } |
| 359 | 359 |
| 360 Future testLocalsFive() { | 360 Future testLocalsFive() { |
| 361 return MockCompiler.create((MockCompiler compiler) { | 361 return MockCompiler.create((MockCompiler compiler) { |
| 362 ResolverVisitor visitor = compiler.resolverVisitor(); | 362 ResolverVisitor visitor = compiler.resolverVisitor(); |
| 363 If tree = | 363 If tree = |
| 364 parseStatement("if (true) { var a = 1; a; } else { var a = 2; a;}"); | 364 parseStatement("if (true) { var a = 1; a; } else { var a = 2; a;}"); |
| 365 ResolutionResult result = visitor.visit(tree); | 365 ResolutionResult result = visitor.visit(tree); |
| 366 Expect.equals(const NoneResult(), result); | 366 Expect.equals(const NoneResult(), result); |
| 367 MethodScope scope = visitor.scope; | 367 MethodScope scope = visitor.scope; |
| 368 Expect.equals(0, scope.elements.length); | 368 Expect.equals(0, scope.elements.length); |
| 369 Expect.equals(6, map(visitor).length); | 369 Expect.equals(4, map(visitor).length); |
| 370 | 370 |
| 371 Block thenPart = tree.thenPart; | 371 Block thenPart = tree.thenPart; |
| 372 List statements1 = thenPart.statements.nodes.toList(); | 372 List statements1 = thenPart.statements.nodes.toList(); |
| 373 Node def1 = statements1[0].definitions.nodes.head; | 373 Node def1 = statements1[0].definitions.nodes.head; |
| 374 Node id1 = statements1[1].expression; | 374 Node id1 = statements1[1].expression; |
| 375 Expect.equals(visitor.registry.mapping[def1], | 375 Expect.equals(visitor.registry.mapping[def1], |
| 376 visitor.registry.mapping[id1]); | 376 visitor.registry.mapping[id1]); |
| 377 | 377 |
| 378 Block elsePart = tree.elsePart; | 378 Block elsePart = tree.elsePart; |
| 379 List statements2 = elsePart.statements.nodes.toList(); | 379 List statements2 = elsePart.statements.nodes.toList(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 } | 412 } |
| 413 | 413 |
| 414 Future testFor() { | 414 Future testFor() { |
| 415 return MockCompiler.create((MockCompiler compiler) { | 415 return MockCompiler.create((MockCompiler compiler) { |
| 416 ResolverVisitor visitor = compiler.resolverVisitor(); | 416 ResolverVisitor visitor = compiler.resolverVisitor(); |
| 417 For tree = parseStatement("for (int i = 0; i < 10; i = i + 1) { i = 5; }"); | 417 For tree = parseStatement("for (int i = 0; i < 10; i = i + 1) { i = 5; }"); |
| 418 visitor.visit(tree); | 418 visitor.visit(tree); |
| 419 | 419 |
| 420 MethodScope scope = visitor.scope; | 420 MethodScope scope = visitor.scope; |
| 421 Expect.equals(0, scope.elements.length); | 421 Expect.equals(0, scope.elements.length); |
| 422 Expect.equals(9, map(visitor).length); | 422 Expect.equals(7, map(visitor).length); |
| 423 | 423 |
| 424 VariableDefinitions initializer = tree.initializer; | 424 VariableDefinitions initializer = tree.initializer; |
| 425 Node iNode = initializer.definitions.nodes.head; | 425 Node iNode = initializer.definitions.nodes.head; |
| 426 Element iElement = visitor.registry.mapping[iNode]; | 426 Element iElement = visitor.registry.mapping[iNode]; |
| 427 | 427 |
| 428 // Check that we have the expected nodes. This test relies on the mapping | 428 // Check that we have the expected nodes. This test relies on the mapping |
| 429 // field to be a linked hash map (preserving insertion order). | 429 // field to be a linked hash map (preserving insertion order). |
| 430 Expect.isTrue(map(visitor) is LinkedHashMap); | 430 Expect.isTrue(map(visitor) is LinkedHashMap); |
| 431 List<Node> nodes = map(visitor).keys.toList(); | 431 List<Node> nodes = map(visitor).keys.toList(); |
| 432 List<Element> elements = map(visitor).values.toList(); | 432 List<Element> elements = map(visitor).values.toList(); |
| 433 | 433 |
| 434 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | 434 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; |
| 435 // ^^^^^ | 435 // ^^^^^ |
| 436 checkSendSet(iElement, nodes[0], elements[0]); | 436 checkSendSet(iElement, nodes[0], elements[0]); |
| 437 | 437 |
| 438 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | 438 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; |
| 439 // ^ | 439 // ^ |
| 440 checkIdentifier(iElement, nodes[1], elements[1]); | 440 checkSend(iElement, nodes[1], elements[1]); |
| 441 | |
| 442 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | |
| 443 // ^ | |
| 444 checkSend(iElement, nodes[2], elements[2]); | |
| 445 | 441 |
| 446 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | 442 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; |
| 447 // ^ | 443 // ^ |
| 448 checkIdentifier(iElement, nodes[3], elements[3]); | 444 checkIdentifier(iElement, nodes[2], elements[2]); |
| 449 | 445 |
| 450 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | 446 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; |
| 451 // ^ | 447 // ^ |
| 452 checkIdentifier(iElement, nodes[4], elements[4]); | 448 checkSend(iElement, nodes[3], elements[3]); |
| 453 | |
| 454 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | |
| 455 // ^ | |
| 456 checkSend(iElement, nodes[5], elements[5]); | |
| 457 | 449 |
| 458 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | 450 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; |
| 459 // ^^^^^^^^^ | 451 // ^^^^^^^^^ |
| 460 checkSendSet(iElement, nodes[6], elements[6]); | 452 checkSendSet(iElement, nodes[4], elements[4]); |
| 461 | 453 |
| 462 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | 454 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; |
| 463 // ^ | 455 // ^ |
| 464 checkIdentifier(iElement, nodes[7], elements[7]); | 456 checkIdentifier(iElement, nodes[5], elements[5]); |
| 465 | 457 |
| 466 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; | 458 // for (int i = 0; i < 10; i = i + 1) { i = 5; }; |
| 467 // ^^^^^ | 459 // ^^^^^ |
| 468 checkSendSet(iElement, nodes[8], elements[8]); | 460 checkSendSet(iElement, nodes[6], elements[6]); |
| 469 }); | 461 }); |
| 470 } | 462 } |
| 471 | 463 |
| 472 checkIdentifier(Element expected, Node node, Element actual) { | 464 checkIdentifier(Element expected, Node node, Element actual) { |
| 473 Expect.isTrue(node is Identifier, node.toDebugString()); | 465 Expect.isTrue(node is Identifier, node.toDebugString()); |
| 474 Expect.equals(expected, actual); | 466 Expect.equals(expected, actual); |
| 475 } | 467 } |
| 476 | 468 |
| 477 checkSend(Element expected, Node node, Element actual) { | 469 checkSend(Element expected, Node node, Element actual) { |
| 478 Expect.isTrue(node is Send, node.toDebugString()); | 470 Expect.isTrue(node is Send, node.toDebugString()); |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 920 expectedWarnings: [], | 912 expectedWarnings: [], |
| 921 expectedErrors: [MessageKind.CANNOT_RESOLVE]); | 913 expectedErrors: [MessageKind.CANNOT_RESOLVE]); |
| 922 }, | 914 }, |
| 923 () { | 915 () { |
| 924 String script = | 916 String script = |
| 925 """class A { | 917 """class A { |
| 926 int foo; | 918 int foo; |
| 927 int bar; | 919 int bar; |
| 928 A() : this.foo = bar; | 920 A() : this.foo = bar; |
| 929 }"""; | 921 }"""; |
| 930 return resolveConstructor(script, "A a = new A();", "A", "", 3, | 922 return resolveConstructor(script, "A a = new A();", "A", "", 2, |
| 931 expectedWarnings: [], | 923 expectedWarnings: [], |
| 932 expectedErrors: [MessageKind.NO_INSTANCE_AVAILABLE]); | 924 expectedErrors: [MessageKind.NO_INSTANCE_AVAILABLE]); |
| 933 }, | 925 }, |
| 934 () { | 926 () { |
| 935 String script = | 927 String script = |
| 936 """class A { | 928 """class A { |
| 937 int foo() => 42; | 929 int foo() => 42; |
| 938 A() : foo(); | 930 A() : foo(); |
| 939 }"""; | 931 }"""; |
| 940 return resolveConstructor(script, "A a = new A();", "A", "", 0, | 932 return resolveConstructor(script, "A a = new A();", "A", "", 0, |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1389 } | 1381 } |
| 1390 main() => A.m(); | 1382 main() => A.m(); |
| 1391 ''', functionName: 'm'); | 1383 ''', functionName: 'm'); |
| 1392 check(''' | 1384 check(''' |
| 1393 class A { | 1385 class A { |
| 1394 m() => () => await - 3; | 1386 m() => () => await - 3; |
| 1395 } | 1387 } |
| 1396 main() => new A().m(); | 1388 main() => new A().m(); |
| 1397 ''', className: 'A'); | 1389 ''', className: 'A'); |
| 1398 } | 1390 } |
| OLD | NEW |