| 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 library dart2js.resolution.compute_members; | 5 library dart2js.resolution.compute_members; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/names.dart' show Identifiers, Names; | 8 import '../common/names.dart' show Identifiers, Names; |
| 9 import '../common/resolution.dart' show Resolution; | 9 import '../common/resolution.dart' show Resolution; |
| 10 import '../elements/resolution_types.dart'; | 10 import '../elements/resolution_types.dart'; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 /// If [name] and [names] are not null, the computation is restricted to | 92 /// If [name] and [names] are not null, the computation is restricted to |
| 93 /// members with these names. | 93 /// members with these names. |
| 94 void computeSuperMembers(String name, Setlet<Name> names); | 94 void computeSuperMembers(String name, Setlet<Name> names); |
| 95 | 95 |
| 96 /// Compute the members of the super class of [cls] and store them in | 96 /// Compute the members of the super class of [cls] and store them in |
| 97 /// [classMembers]. | 97 /// [classMembers]. |
| 98 /// | 98 /// |
| 99 /// If [name] and [names] are not null, the computation is restricted to | 99 /// If [name] and [names] are not null, the computation is restricted to |
| 100 /// members with these names. | 100 /// members with these names. |
| 101 void computeSuperClassMembers(String name, Setlet<Name> names) { | 101 void computeSuperClassMembers(String name, Setlet<Name> names) { |
| 102 InterfaceType supertype = cls.supertype; | 102 ResolutionInterfaceType supertype = cls.supertype; |
| 103 if (supertype == null) return; | 103 if (supertype == null) return; |
| 104 ClassElement superclass = supertype.element; | 104 ClassElement superclass = supertype.element; |
| 105 | 105 |
| 106 // Inherit class and interface members from superclass. | 106 // Inherit class and interface members from superclass. |
| 107 void inheritClassMember(DeclaredMember member) { | 107 void inheritClassMember(DeclaredMember member) { |
| 108 if (shouldSkipMember(member)) return; | 108 if (shouldSkipMember(member)) return; |
| 109 if (!member.isStatic) { | 109 if (!member.isStatic) { |
| 110 DeclaredMember inherited = member.inheritFrom(supertype); | 110 DeclaredMember inherited = member.inheritFrom(supertype); |
| 111 classMembers[member.name] = inherited; | 111 classMembers[member.name] = inherited; |
| 112 } | 112 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 inheritMixinMember( | 155 inheritMixinMember( |
| 156 mixinApplication.mixin.lookupClassMember(memberName)); | 156 mixinApplication.mixin.lookupClassMember(memberName)); |
| 157 } | 157 } |
| 158 } else { | 158 } else { |
| 159 computeAllClassMembers(resolution, mixinApplication.mixin); | 159 computeAllClassMembers(resolution, mixinApplication.mixin); |
| 160 mixinApplication.mixin.forEachClassMember(inheritMixinMember); | 160 mixinApplication.mixin.forEachClassMember(inheritMixinMember); |
| 161 } | 161 } |
| 162 } | 162 } |
| 163 } else { | 163 } else { |
| 164 LibraryElement library = cls.library; | 164 LibraryElement library = cls.library; |
| 165 InterfaceType thisType = cls.thisType; | 165 ResolutionInterfaceType thisType = cls.thisType; |
| 166 | 166 |
| 167 void createMember(MemberElement element) { | 167 void createMember(MemberElement element) { |
| 168 if (element.isConstructor) return; | 168 if (element.isConstructor) return; |
| 169 String elementName = element.name; | 169 String elementName = element.name; |
| 170 if (shouldSkipName(elementName)) return; | 170 if (shouldSkipName(elementName)) return; |
| 171 if (nameText != null && elementName != nameText) return; | 171 if (nameText != null && elementName != nameText) return; |
| 172 | 172 |
| 173 void addDeclaredMember( | 173 void addDeclaredMember(Name name, ResolutionDartType type, |
| 174 Name name, DartType type, FunctionType functionType) { | 174 ResolutionFunctionType functionType) { |
| 175 DeclaredMember inherited = classMembers[name]; | 175 DeclaredMember inherited = classMembers[name]; |
| 176 DeclaredMember declared; | 176 DeclaredMember declared; |
| 177 if (element.isAbstract) { | 177 if (element.isAbstract) { |
| 178 declared = new DeclaredAbstractMember( | 178 declared = new DeclaredAbstractMember( |
| 179 name, element, thisType, type, functionType, inherited); | 179 name, element, thisType, type, functionType, inherited); |
| 180 } else { | 180 } else { |
| 181 declared = | 181 declared = |
| 182 new DeclaredMember(name, element, thisType, type, functionType); | 182 new DeclaredMember(name, element, thisType, type, functionType); |
| 183 } | 183 } |
| 184 declaredMembers[name] = declared; | 184 declaredMembers[name] = declared; |
| 185 classMembers[name] = declared; | 185 classMembers[name] = declared; |
| 186 checkValidOverride(declared, inherited); | 186 checkValidOverride(declared, inherited); |
| 187 } | 187 } |
| 188 | 188 |
| 189 Name name = new Name(element.name, library); | 189 Name name = new Name(element.name, library); |
| 190 if (element.isField) { | 190 if (element.isField) { |
| 191 DartType type = element.computeType(resolution); | 191 ResolutionDartType type = element.computeType(resolution); |
| 192 addDeclaredMember(name, type, new FunctionType.synthesized(type)); | 192 addDeclaredMember( |
| 193 name, type, new ResolutionFunctionType.synthesized(type)); |
| 193 if (!element.isConst && !element.isFinal) { | 194 if (!element.isConst && !element.isFinal) { |
| 194 addDeclaredMember( | 195 addDeclaredMember( |
| 195 name.setter, | 196 name.setter, |
| 196 type, | 197 type, |
| 197 new FunctionType.synthesized( | 198 new ResolutionFunctionType.synthesized( |
| 198 const VoidType(), <DartType>[type])); | 199 const ResolutionVoidType(), <ResolutionDartType>[type])); |
| 199 } | 200 } |
| 200 } else if (element.isGetter) { | 201 } else if (element.isGetter) { |
| 201 FunctionType functionType = element.computeType(resolution); | 202 ResolutionFunctionType functionType = element.computeType(resolution); |
| 202 DartType type = functionType.returnType; | 203 ResolutionDartType type = functionType.returnType; |
| 203 addDeclaredMember(name, type, functionType); | 204 addDeclaredMember(name, type, functionType); |
| 204 } else if (element.isSetter) { | 205 } else if (element.isSetter) { |
| 205 FunctionType functionType = element.computeType(resolution); | 206 ResolutionFunctionType functionType = element.computeType(resolution); |
| 206 DartType type; | 207 ResolutionDartType type; |
| 207 if (!functionType.parameterTypes.isEmpty) { | 208 if (!functionType.parameterTypes.isEmpty) { |
| 208 type = functionType.parameterTypes.first; | 209 type = functionType.parameterTypes.first; |
| 209 } else { | 210 } else { |
| 210 type = const DynamicType(); | 211 type = const ResolutionDynamicType(); |
| 211 } | 212 } |
| 212 name = name.setter; | 213 name = name.setter; |
| 213 addDeclaredMember(name, type, functionType); | 214 addDeclaredMember(name, type, functionType); |
| 214 } else { | 215 } else { |
| 215 assert(invariant(element, element.isFunction)); | 216 assert(invariant(element, element.isFunction)); |
| 216 FunctionType type = element.computeType(resolution); | 217 ResolutionFunctionType type = element.computeType(resolution); |
| 217 addDeclaredMember(name, type, type); | 218 addDeclaredMember(name, type, type); |
| 218 } | 219 } |
| 219 } | 220 } |
| 220 | 221 |
| 221 cls.forEachLocalMember(createMember); | 222 cls.forEachLocalMember(createMember); |
| 222 if (cls.isPatched) { | 223 if (cls.isPatched) { |
| 223 cls.implementation.forEachLocalMember((Element element) { | 224 cls.implementation.forEachLocalMember((Element element) { |
| 224 if (element.isDeclaration) { | 225 if (element.isDeclaration) { |
| 225 createMember(element); | 226 createMember(element); |
| 226 } | 227 } |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 reportMessage(inherited.element, MessageKind.NO_STATIC_OVERRIDE, () { | 374 reportMessage(inherited.element, MessageKind.NO_STATIC_OVERRIDE, () { |
| 374 reportErrorWithContext( | 375 reportErrorWithContext( |
| 375 declared.element, | 376 declared.element, |
| 376 MessageKind.NO_STATIC_OVERRIDE, | 377 MessageKind.NO_STATIC_OVERRIDE, |
| 377 inherited.element, | 378 inherited.element, |
| 378 MessageKind.NO_STATIC_OVERRIDE_CONT); | 379 MessageKind.NO_STATIC_OVERRIDE_CONT); |
| 379 }); | 380 }); |
| 380 } | 381 } |
| 381 } | 382 } |
| 382 | 383 |
| 383 DartType declaredType = declared.functionType; | 384 ResolutionDartType declaredType = declared.functionType; |
| 384 for (Member inherited in superMember.declarations) { | 385 for (Member inherited in superMember.declarations) { |
| 385 if (inherited.element == declared.element) { | 386 if (inherited.element == declared.element) { |
| 386 // TODO(ahe): For some reason, "call" elements are repeated in | 387 // TODO(ahe): For some reason, "call" elements are repeated in |
| 387 // superMember.declarations. Investigate why. | 388 // superMember.declarations. Investigate why. |
| 388 } else if (cls == inherited.declarer.element) { | 389 } else if (cls == inherited.declarer.element) { |
| 389 // An error should already have been reported. | 390 // An error should already have been reported. |
| 390 assert( | 391 assert( |
| 391 invariant(declared.element, resolution.reporter.hasReportedError, | 392 invariant(declared.element, resolution.reporter.hasReportedError, |
| 392 message: "Member $inherited inherited from its " | 393 message: "Member $inherited inherited from its " |
| 393 "declaring class: ${cls}.")); | 394 "declaring class: ${cls}.")); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 418 } else if (declared.isMethod && inherited.isDeclaredByField) { | 419 } else if (declared.isMethod && inherited.isDeclaredByField) { |
| 419 reportError(MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD, | 420 reportError(MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD, |
| 420 MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT); | 421 MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT); |
| 421 } else if (declared.isGetter && inherited.isMethod) { | 422 } else if (declared.isGetter && inherited.isMethod) { |
| 422 reportError(MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER, | 423 reportError(MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER, |
| 423 MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT); | 424 MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT); |
| 424 } else if (declared.isMethod && inherited.isGetter) { | 425 } else if (declared.isMethod && inherited.isGetter) { |
| 425 reportError(MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD, | 426 reportError(MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD, |
| 426 MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT); | 427 MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT); |
| 427 } else { | 428 } else { |
| 428 DartType inheritedType = inherited.functionType; | 429 ResolutionDartType inheritedType = inherited.functionType; |
| 429 if (!resolution.types.isSubtype(declaredType, inheritedType)) { | 430 if (!resolution.types.isSubtype(declaredType, inheritedType)) { |
| 430 void reportWarning( | 431 void reportWarning( |
| 431 var marker, MessageKind warningKind, MessageKind infoKind) { | 432 var marker, MessageKind warningKind, MessageKind infoKind) { |
| 432 reportMessage(marker, MessageKind.INVALID_OVERRIDE_METHOD, () { | 433 reportMessage(marker, MessageKind.INVALID_OVERRIDE_METHOD, () { |
| 433 reporter.reportWarning( | 434 reporter.reportWarning( |
| 434 reporter.createMessage(declared.element, warningKind, { | 435 reporter.createMessage(declared.element, warningKind, { |
| 435 'declaredType': declared.type, | 436 'declaredType': declared.type, |
| 436 'name': declared.name.text, | 437 'name': declared.name.text, |
| 437 'class': cls.thisType, | 438 'class': cls.thisType, |
| 438 'inheritedType': inherited.type, | 439 'inheritedType': inherited.type, |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 /// If [name] and [names] are not null, the computation is restricted to | 589 /// If [name] and [names] are not null, the computation is restricted to |
| 589 /// members with these names. | 590 /// members with these names. |
| 590 Map<Name, Setlet<Member>> computeSuperMembers( | 591 Map<Name, Setlet<Member>> computeSuperMembers( |
| 591 String name, Setlet<Name> names) { | 592 String name, Setlet<Name> names) { |
| 592 computeSuperClassMembers(name, names); | 593 computeSuperClassMembers(name, names); |
| 593 return computeSuperInterfaceMembers(name, names); | 594 return computeSuperInterfaceMembers(name, names); |
| 594 } | 595 } |
| 595 | 596 |
| 596 Map<Name, Setlet<Member>> computeSuperInterfaceMembers( | 597 Map<Name, Setlet<Member>> computeSuperInterfaceMembers( |
| 597 String name, Setlet<Name> names) { | 598 String name, Setlet<Name> names) { |
| 598 InterfaceType supertype = cls.supertype; | 599 ResolutionInterfaceType supertype = cls.supertype; |
| 599 assert(invariant(cls, supertype != null, | 600 assert(invariant(cls, supertype != null, |
| 600 message: "Interface members computed for $cls.")); | 601 message: "Interface members computed for $cls.")); |
| 601 ClassElement superclass = supertype.element; | 602 ClassElement superclass = supertype.element; |
| 602 | 603 |
| 603 Map<Name, Setlet<Member>> inheritedInterfaceMembers = | 604 Map<Name, Setlet<Member>> inheritedInterfaceMembers = |
| 604 new Map<Name, Setlet<Member>>(); | 605 new Map<Name, Setlet<Member>>(); |
| 605 | 606 |
| 606 void inheritInterfaceMember( | 607 void inheritInterfaceMember( |
| 607 InterfaceType supertype, MemberSignature member) { | 608 ResolutionInterfaceType supertype, MemberSignature member) { |
| 608 if (shouldSkipMember(member)) return; | 609 if (shouldSkipMember(member)) return; |
| 609 Setlet<Member> members = inheritedInterfaceMembers.putIfAbsent( | 610 Setlet<Member> members = inheritedInterfaceMembers.putIfAbsent( |
| 610 member.name, () => new Setlet<Member>()); | 611 member.name, () => new Setlet<Member>()); |
| 611 for (DeclaredMember declaredMember in member.declarations) { | 612 for (DeclaredMember declaredMember in member.declarations) { |
| 612 members.add(declaredMember.inheritFrom(supertype)); | 613 members.add(declaredMember.inheritFrom(supertype)); |
| 613 } | 614 } |
| 614 } | 615 } |
| 615 | 616 |
| 616 void inheritInterfaceMembers(InterfaceType supertype) { | 617 void inheritInterfaceMembers(ResolutionInterfaceType supertype) { |
| 617 supertype.element.forEachInterfaceMember((MemberSignature member) { | 618 supertype.element.forEachInterfaceMember((MemberSignature member) { |
| 618 inheritInterfaceMember(supertype, member); | 619 inheritInterfaceMember(supertype, member); |
| 619 }); | 620 }); |
| 620 } | 621 } |
| 621 | 622 |
| 622 if (names != null) { | 623 if (names != null) { |
| 623 for (Name memberName in names) { | 624 for (Name memberName in names) { |
| 624 inheritInterfaceMember( | 625 inheritInterfaceMember( |
| 625 supertype, superclass.lookupInterfaceMember(memberName)); | 626 supertype, superclass.lookupInterfaceMember(memberName)); |
| 626 } | 627 } |
| 627 } else { | 628 } else { |
| 628 inheritInterfaceMembers(supertype); | 629 inheritInterfaceMembers(supertype); |
| 629 } | 630 } |
| 630 | 631 |
| 631 // Inherit interface members from superinterfaces. | 632 // Inherit interface members from superinterfaces. |
| 632 for (Link<DartType> link = cls.interfaces; | 633 for (Link<ResolutionDartType> link = cls.interfaces; |
| 633 !link.isEmpty; | 634 !link.isEmpty; |
| 634 link = link.tail) { | 635 link = link.tail) { |
| 635 InterfaceType superinterface = link.head; | 636 ResolutionInterfaceType superinterface = link.head; |
| 636 if (names != null) { | 637 if (names != null) { |
| 637 MembersCreator._computeClassMember( | 638 MembersCreator._computeClassMember( |
| 638 resolution, superinterface.element, name, names); | 639 resolution, superinterface.element, name, names); |
| 639 for (Name memberName in names) { | 640 for (Name memberName in names) { |
| 640 inheritInterfaceMember(superinterface, | 641 inheritInterfaceMember(superinterface, |
| 641 superinterface.element.lookupInterfaceMember(memberName)); | 642 superinterface.element.lookupInterfaceMember(memberName)); |
| 642 } | 643 } |
| 643 } else { | 644 } else { |
| 644 MembersCreator.computeAllClassMembers( | 645 MembersCreator.computeAllClassMembers( |
| 645 resolution, superinterface.element); | 646 resolution, superinterface.element); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 661 checkInterfaceMember(name, interfaceMember, classMember); | 662 checkInterfaceMember(name, interfaceMember, classMember); |
| 662 }); | 663 }); |
| 663 } | 664 } |
| 664 | 665 |
| 665 /// Compute the interface members of [cls] given the set of inherited | 666 /// Compute the interface members of [cls] given the set of inherited |
| 666 /// interface members [inheritedInterfaceMembers] and declared members | 667 /// interface members [inheritedInterfaceMembers] and declared members |
| 667 /// [declaredMembers]. The computed members are stored in [interfaceMembers]. | 668 /// [declaredMembers]. The computed members are stored in [interfaceMembers]. |
| 668 void computeInterfaceMembers( | 669 void computeInterfaceMembers( |
| 669 Map<Name, Setlet<Member>> inheritedInterfaceMembers, | 670 Map<Name, Setlet<Member>> inheritedInterfaceMembers, |
| 670 Map<Name, Member> declaredMembers) { | 671 Map<Name, Member> declaredMembers) { |
| 671 InterfaceType thisType = cls.thisType; | 672 ResolutionInterfaceType thisType = cls.thisType; |
| 672 // Compute the interface members by overriding the inherited members with | 673 // Compute the interface members by overriding the inherited members with |
| 673 // a declared member or by computing a single, possibly synthesized, | 674 // a declared member or by computing a single, possibly synthesized, |
| 674 // inherited member. | 675 // inherited member. |
| 675 inheritedInterfaceMembers | 676 inheritedInterfaceMembers |
| 676 .forEach((Name name, Setlet<Member> inheritedMembers) { | 677 .forEach((Name name, Setlet<Member> inheritedMembers) { |
| 677 Member declared = declaredMembers[name]; | 678 Member declared = declaredMembers[name]; |
| 678 if (declared != null) { | 679 if (declared != null) { |
| 679 // Check that [declaredMember] is a valid override | 680 // Check that [declaredMember] is a valid override |
| 680 for (Member inherited in inheritedMembers) { | 681 for (Member inherited in inheritedMembers) { |
| 681 checkValidOverride(declared, inherited); | 682 checkValidOverride(declared, inherited); |
| 682 } | 683 } |
| 683 if (!declared.isStatic) { | 684 if (!declared.isStatic) { |
| 684 interfaceMembers[name] = declared; | 685 interfaceMembers[name] = declared; |
| 685 } | 686 } |
| 686 } else if (inheritedMembers.length == 1) { | 687 } else if (inheritedMembers.length == 1) { |
| 687 interfaceMembers[name] = inheritedMembers.single; | 688 interfaceMembers[name] = inheritedMembers.single; |
| 688 } else { | 689 } else { |
| 689 bool someAreGetters = false; | 690 bool someAreGetters = false; |
| 690 bool allAreGetters = true; | 691 bool allAreGetters = true; |
| 691 Map<DartType, Setlet<Member>> subtypesOfAllInherited = | 692 Map<ResolutionDartType, Setlet<Member>> subtypesOfAllInherited = |
| 692 new Map<DartType, Setlet<Member>>(); | 693 new Map<ResolutionDartType, Setlet<Member>>(); |
| 693 outer: | 694 outer: |
| 694 for (Member inherited in inheritedMembers) { | 695 for (Member inherited in inheritedMembers) { |
| 695 if (inherited.isGetter) { | 696 if (inherited.isGetter) { |
| 696 someAreGetters = true; | 697 someAreGetters = true; |
| 697 if (!allAreGetters) break outer; | 698 if (!allAreGetters) break outer; |
| 698 } else { | 699 } else { |
| 699 allAreGetters = false; | 700 allAreGetters = false; |
| 700 if (someAreGetters) break outer; | 701 if (someAreGetters) break outer; |
| 701 } | 702 } |
| 702 for (MemberSignature other in inheritedMembers) { | 703 for (MemberSignature other in inheritedMembers) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 int minRequiredParameters; | 767 int minRequiredParameters; |
| 767 int maxPositionalParameters; | 768 int maxPositionalParameters; |
| 768 Set<String> names = new Set<String>(); | 769 Set<String> names = new Set<String>(); |
| 769 for (MemberSignature member in inheritedMembers) { | 770 for (MemberSignature member in inheritedMembers) { |
| 770 int requiredParameters = 0; | 771 int requiredParameters = 0; |
| 771 int optionalParameters = 0; | 772 int optionalParameters = 0; |
| 772 if (member.isSetter) { | 773 if (member.isSetter) { |
| 773 requiredParameters = 1; | 774 requiredParameters = 1; |
| 774 } | 775 } |
| 775 if (member.type.isFunctionType) { | 776 if (member.type.isFunctionType) { |
| 776 FunctionType type = member.type; | 777 ResolutionFunctionType type = member.type; |
| 777 type.namedParameters.forEach((String name) => names.add(name)); | 778 type.namedParameters.forEach((String name) => names.add(name)); |
| 778 requiredParameters = type.parameterTypes.length; | 779 requiredParameters = type.parameterTypes.length; |
| 779 optionalParameters = type.optionalParameterTypes.length; | 780 optionalParameters = type.optionalParameterTypes.length; |
| 780 } | 781 } |
| 781 int positionalParameters = requiredParameters + optionalParameters; | 782 int positionalParameters = requiredParameters + optionalParameters; |
| 782 if (minRequiredParameters == null || | 783 if (minRequiredParameters == null || |
| 783 minRequiredParameters > requiredParameters) { | 784 minRequiredParameters > requiredParameters) { |
| 784 minRequiredParameters = requiredParameters; | 785 minRequiredParameters = requiredParameters; |
| 785 } | 786 } |
| 786 if (maxPositionalParameters == null || | 787 if (maxPositionalParameters == null || |
| 787 maxPositionalParameters < positionalParameters) { | 788 maxPositionalParameters < positionalParameters) { |
| 788 maxPositionalParameters = positionalParameters; | 789 maxPositionalParameters = positionalParameters; |
| 789 } | 790 } |
| 790 } | 791 } |
| 791 int optionalParameters = maxPositionalParameters - minRequiredParameters; | 792 int optionalParameters = maxPositionalParameters - minRequiredParameters; |
| 792 // TODO(johnniwinther): Support function types with both optional | 793 // TODO(johnniwinther): Support function types with both optional |
| 793 // and named parameters? | 794 // and named parameters? |
| 794 if (optionalParameters == 0 || names.isEmpty) { | 795 if (optionalParameters == 0 || names.isEmpty) { |
| 795 DartType dynamic = const DynamicType(); | 796 ResolutionDartType dynamic = const ResolutionDynamicType(); |
| 796 List<DartType> requiredParameterTypes = | 797 List<ResolutionDartType> requiredParameterTypes = |
| 797 new List.filled(minRequiredParameters, dynamic); | 798 new List.filled(minRequiredParameters, dynamic); |
| 798 List<DartType> optionalParameterTypes = | 799 List<ResolutionDartType> optionalParameterTypes = |
| 799 new List.filled(optionalParameters, dynamic); | 800 new List.filled(optionalParameters, dynamic); |
| 800 List<String> namedParameters = names.toList() | 801 List<String> namedParameters = names.toList() |
| 801 ..sort((a, b) => a.compareTo(b)); | 802 ..sort((a, b) => a.compareTo(b)); |
| 802 List<DartType> namedParameterTypes = | 803 List<ResolutionDartType> namedParameterTypes = |
| 803 new List.filled(namedParameters.length, dynamic); | 804 new List.filled(namedParameters.length, dynamic); |
| 804 FunctionType memberType = new FunctionType.synthesized( | 805 ResolutionFunctionType memberType = |
| 805 const DynamicType(), | 806 new ResolutionFunctionType.synthesized( |
| 806 requiredParameterTypes, | 807 const ResolutionDynamicType(), |
| 807 optionalParameterTypes, | 808 requiredParameterTypes, |
| 808 namedParameters, | 809 optionalParameterTypes, |
| 809 namedParameterTypes); | 810 namedParameters, |
| 810 DartType type = memberType; | 811 namedParameterTypes); |
| 812 ResolutionDartType type = memberType; |
| 811 if (inheritedMembers.first.isGetter || inheritedMembers.first.isSetter) { | 813 if (inheritedMembers.first.isGetter || inheritedMembers.first.isSetter) { |
| 812 type = const DynamicType(); | 814 type = const ResolutionDynamicType(); |
| 813 } | 815 } |
| 814 interfaceMembers[name] = | 816 interfaceMembers[name] = |
| 815 new SyntheticMember(inheritedMembers, type, memberType); | 817 new SyntheticMember(inheritedMembers, type, memberType); |
| 816 } | 818 } |
| 817 } | 819 } |
| 818 } | 820 } |
| 819 | 821 |
| 820 abstract class ClassMemberMixin implements ClassElement { | 822 abstract class ClassMemberMixin implements ClassElement { |
| 821 /// When [classMembers] and [interfaceMembers] have not been fully computed | 823 /// When [classMembers] and [interfaceMembers] have not been fully computed |
| 822 /// [computedMembersNames] holds the names for which members have already been | 824 /// [computedMembersNames] holds the names for which members have already been |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 956 message: "Members have not been fully computed for $this.")); | 958 message: "Members have not been fully computed for $this.")); |
| 957 if (interfaceMembersAreClassMembers) { | 959 if (interfaceMembersAreClassMembers) { |
| 958 classMembers.forEach((_, member) { | 960 classMembers.forEach((_, member) { |
| 959 if (!member.isStatic) f(member); | 961 if (!member.isStatic) f(member); |
| 960 }); | 962 }); |
| 961 } else { | 963 } else { |
| 962 interfaceMembers.forEach((_, member) => f(member)); | 964 interfaceMembers.forEach((_, member) => f(member)); |
| 963 } | 965 } |
| 964 } | 966 } |
| 965 } | 967 } |
| OLD | NEW |