OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library dev_compiler.src.checker.checker; | 5 library dev_compiler.src.checker.checker; |
6 | 6 |
7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; |
8 import 'package:analyzer/src/generated/ast.dart'; | 8 import 'package:analyzer/src/generated/ast.dart'; |
9 import 'package:analyzer/src/generated/element.dart'; | 9 import 'package:analyzer/src/generated/element.dart'; |
10 import 'package:analyzer/src/generated/scanner.dart' show Token, TokenType; | 10 import 'package:analyzer/src/generated/scanner.dart' show Token, TokenType; |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 var entries = node.entries; | 449 var entries = node.entries; |
450 for (int i = 0; i < entries.length; i++) { | 450 for (int i = 0; i < entries.length; i++) { |
451 var entry = entries[i]; | 451 var entry = entries[i]; |
452 entry.key = checkArgument(entry.key, ktype); | 452 entry.key = checkArgument(entry.key, ktype); |
453 entry.value = checkArgument(entry.value, vtype); | 453 entry.value = checkArgument(entry.value, vtype); |
454 } | 454 } |
455 super.visitMapLiteral(node); | 455 super.visitMapLiteral(node); |
456 } | 456 } |
457 | 457 |
458 // Check invocations | 458 // Check invocations |
459 bool checkArgumentList(ArgumentList node, FunctionType type) { | 459 bool checkArgumentList(ArgumentList node, DartType type) { |
460 NodeList<Expression> list = node.arguments; | 460 NodeList<Expression> list = node.arguments; |
461 int len = list.length; | 461 int len = list.length; |
| 462 if (len == 0) return true; |
| 463 FunctionType ft = type; |
462 for (int i = 0; i < len; ++i) { | 464 for (int i = 0; i < len; ++i) { |
463 Expression arg = list[i]; | 465 Expression arg = list[i]; |
464 ParameterElement element = node.getStaticParameterElementFor(arg); | 466 ParameterElement element = node.getStaticParameterElementFor(arg); |
465 if (element == null) { | 467 if (element == null) { |
466 if (type.parameters.length < len) { | 468 if (ft.parameters.length < len) { |
467 // We found an argument mismatch, the analyzer will report this too, | 469 // We found an argument mismatch, the analyzer will report this too, |
468 // so no need to insert an error for this here. | 470 // so no need to insert an error for this here. |
469 continue; | 471 continue; |
470 } | 472 } |
471 element = type.parameters[i]; | 473 element = ft.parameters[i]; |
472 // TODO(vsm): When can this happen? | 474 // TODO(vsm): When can this happen? |
473 assert(element != null); | 475 assert(element != null); |
474 } | 476 } |
475 DartType expectedType = _rules.elementType(element); | 477 DartType expectedType = _rules.elementType(element); |
476 if (expectedType == null) expectedType = _rules.provider.dynamicType; | 478 if (expectedType == null) expectedType = _rules.provider.dynamicType; |
477 list[i] = checkArgument(arg, expectedType); | 479 list[i] = checkArgument(arg, expectedType); |
478 } | 480 } |
479 return true; | 481 return true; |
480 } | 482 } |
481 | 483 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 node.expression = _checkReturn(node.expression, node); | 561 node.expression = _checkReturn(node.expression, node); |
560 node.visitChildren(this); | 562 node.visitChildren(this); |
561 } | 563 } |
562 | 564 |
563 visitReturnStatement(ReturnStatement node) { | 565 visitReturnStatement(ReturnStatement node) { |
564 node.expression = _checkReturn(node.expression, node); | 566 node.expression = _checkReturn(node.expression, node); |
565 node.visitChildren(this); | 567 node.visitChildren(this); |
566 } | 568 } |
567 | 569 |
568 visitPropertyAccess(PropertyAccess node) { | 570 visitPropertyAccess(PropertyAccess node) { |
569 if (_rules.isDynamicGet(node.realTarget)) { | 571 if (_rules.isDynamicGet(node.realTarget, node.propertyName.name)) { |
570 _recordDynamicInvoke(node); | 572 _recordDynamicInvoke(node); |
571 } | 573 } |
572 node.visitChildren(this); | 574 node.visitChildren(this); |
573 } | 575 } |
574 | 576 |
575 visitPrefixedIdentifier(PrefixedIdentifier node) { | 577 visitPrefixedIdentifier(PrefixedIdentifier node) { |
576 final target = node.prefix; | 578 final target = node.prefix; |
577 // Check if the prefix is a library - PrefixElement denotes a library | 579 // Check if the prefix is a library - PrefixElement denotes a library |
578 // access. | 580 // access. |
579 if (target.staticElement is! PrefixElement && _rules.isDynamicGet(target)) { | 581 if (target.staticElement is! PrefixElement && |
| 582 _rules.isDynamicGet(target, node.identifier.name)) { |
580 _recordDynamicInvoke(node); | 583 _recordDynamicInvoke(node); |
581 } | 584 } |
582 node.visitChildren(this); | 585 node.visitChildren(this); |
583 } | 586 } |
584 | 587 |
585 @override visitDefaultFormalParameter(DefaultFormalParameter node) { | 588 @override visitDefaultFormalParameter(DefaultFormalParameter node) { |
586 _visitMaybeConst(node, (node) { | 589 _visitMaybeConst(node, (node) { |
587 // Check that defaults have the proper subtype. | 590 // Check that defaults have the proper subtype. |
588 var parameter = node.parameter; | 591 var parameter = node.parameter; |
589 var parameterType = _rules.elementType(parameter.element); | 592 var parameterType = _rules.elementType(parameter.element); |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 void _recordDynamicInvoke(AstNode node) { | 795 void _recordDynamicInvoke(AstNode node) { |
793 _reporter.log(new DynamicInvoke(_rules, node)); | 796 _reporter.log(new DynamicInvoke(_rules, node)); |
794 } | 797 } |
795 | 798 |
796 void _recordMessage(StaticInfo info) { | 799 void _recordMessage(StaticInfo info) { |
797 if (info == null) return; | 800 if (info == null) return; |
798 if (info.level >= logger.Level.SEVERE) _failure = true; | 801 if (info.level >= logger.Level.SEVERE) _failure = true; |
799 _reporter.log(info); | 802 _reporter.log(info); |
800 } | 803 } |
801 } | 804 } |
OLD | NEW |