Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: pkg/analyzer/lib/src/dart/element/type.dart

Issue 2378243004: fix #27454, prune FunctionTypeImpl.parameters (Closed)
Patch Set: fix null type Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/member.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/member.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698