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 |