| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 analyzer.src.dart.element.type; | 5 library analyzer.src.dart.element.type; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/token.dart'; | 9 import 'package:analyzer/dart/ast/token.dart'; |
| 10 import 'package:analyzer/dart/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 } | 508 } |
| 509 | 509 |
| 510 @override | 510 @override |
| 511 List<ParameterElement> get parameters { | 511 List<ParameterElement> get parameters { |
| 512 List<ParameterElement> baseParameters = this.baseParameters; | 512 List<ParameterElement> baseParameters = this.baseParameters; |
| 513 // no parameters, quick return | 513 // no parameters, quick return |
| 514 int parameterCount = baseParameters.length; | 514 int parameterCount = baseParameters.length; |
| 515 if (parameterCount == 0) { | 515 if (parameterCount == 0) { |
| 516 return baseParameters; | 516 return baseParameters; |
| 517 } | 517 } |
| 518 |
| 518 // create specialized parameters | 519 // create specialized parameters |
| 519 List<ParameterElement> specializedParameters = | 520 var specializedParams = new List<ParameterElement>(parameterCount); |
| 520 new List<ParameterElement>(parameterCount); | 521 |
| 522 var parameterTypes = TypeParameterTypeImpl.getTypes(typeParameters); |
| 521 for (int i = 0; i < parameterCount; i++) { | 523 for (int i = 0; i < parameterCount; i++) { |
| 522 specializedParameters[i] = ParameterMember.from(baseParameters[i], this); | 524 var parameter = baseParameters[i]; |
| 525 if (parameter?.type == null) { |
| 526 specializedParams[i] = parameter; |
| 527 continue; |
| 528 } |
| 529 |
| 530 // Check if parameter type depends on defining type type arguments, or |
| 531 // if it needs to be pruned. |
| 532 |
| 533 if (parameter is FieldFormalParameterElement) { |
| 534 // TODO(jmesserly): this seems like it won't handle pruning correctly. |
| 535 specializedParams[i] = new FieldFormalParameterMember(parameter, this); |
| 536 continue; |
| 537 } |
| 538 |
| 539 var baseType = parameter.type as TypeImpl; |
| 540 TypeImpl type; |
| 541 if (typeArguments.isEmpty || |
| 542 typeArguments.length != typeParameters.length) { |
| 543 type = baseType.pruned(newPrune); |
| 544 } else { |
| 545 type = baseType.substitute2(typeArguments, parameterTypes, newPrune); |
| 546 } |
| 547 |
| 548 specializedParams[i] = identical(type, baseType) |
| 549 ? parameter |
| 550 : new ParameterMember(parameter, this, type); |
| 523 } | 551 } |
| 524 return specializedParameters; | 552 return specializedParams; |
| 525 } | 553 } |
| 526 | 554 |
| 527 @override | 555 @override |
| 528 DartType get returnType { | 556 DartType get returnType { |
| 529 DartType baseReturnType = this.baseReturnType; | 557 DartType baseReturnType = this.baseReturnType; |
| 530 if (baseReturnType == null) { | 558 if (baseReturnType == null) { |
| 531 // TODO(brianwilkerson) This is a patch. The return type should never be | 559 // TODO(brianwilkerson) This is a patch. The return type should never be |
| 532 // null and we need to understand why it is and fix it. | 560 // null and we need to understand why it is and fix it. |
| 533 return DynamicTypeImpl.instance; | 561 return DynamicTypeImpl.instance; |
| 534 } | 562 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 // variables, and see if the result is equal. | 655 // variables, and see if the result is equal. |
| 628 if (typeFormals.isNotEmpty) { | 656 if (typeFormals.isNotEmpty) { |
| 629 List<DartType> freshVariables = | 657 List<DartType> freshVariables = |
| 630 relateTypeFormals(this, object, (t, s) => t == s); | 658 relateTypeFormals(this, object, (t, s) => t == s); |
| 631 if (freshVariables == null) { | 659 if (freshVariables == null) { |
| 632 return false; | 660 return false; |
| 633 } | 661 } |
| 634 return instantiate(freshVariables) == | 662 return instantiate(freshVariables) == |
| 635 object.instantiate(freshVariables); | 663 object.instantiate(freshVariables); |
| 636 } | 664 } |
| 665 |
| 637 return returnType == object.returnType && | 666 return returnType == object.returnType && |
| 638 TypeImpl.equalArrays( | 667 TypeImpl.equalArrays( |
| 639 normalParameterTypes, object.normalParameterTypes) && | 668 normalParameterTypes, object.normalParameterTypes) && |
| 640 TypeImpl.equalArrays( | 669 TypeImpl.equalArrays( |
| 641 optionalParameterTypes, object.optionalParameterTypes) && | 670 optionalParameterTypes, object.optionalParameterTypes) && |
| 642 _equals(namedParameterTypes, object.namedParameterTypes); | 671 _equals(namedParameterTypes, object.namedParameterTypes); |
| 643 } | 672 } |
| 644 return false; | 673 return false; |
| 645 } | 674 } |
| 646 | 675 |
| (...skipping 2101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2748 | 2777 |
| 2749 @override | 2778 @override |
| 2750 TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this; | 2779 TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this; |
| 2751 | 2780 |
| 2752 @override | 2781 @override |
| 2753 VoidTypeImpl substitute2( | 2782 VoidTypeImpl substitute2( |
| 2754 List<DartType> argumentTypes, List<DartType> parameterTypes, | 2783 List<DartType> argumentTypes, List<DartType> parameterTypes, |
| 2755 [List<FunctionTypeAliasElement> prune]) => | 2784 [List<FunctionTypeAliasElement> prune]) => |
| 2756 this; | 2785 this; |
| 2757 } | 2786 } |
| OLD | NEW |