| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| part of 'declaration_builders.dart'; | |
| abstract class ExtensionBuilder implements DeclarationBuilder { | |
| /// The type of the on-clause of the extension declaration. | |
| TypeBuilder get onType; | |
| /// Reference for the extension built by this builder. | |
| Reference get reference; | |
| /// Return the [Extension] built by this builder. | |
| Extension get extension; | |
| /// Looks up extension member by [name] taking privacy into account. | |
| /// | |
| /// If [name] is `[]` or `[]=` then the `operator []` and `operator []=` | |
| /// members are returned as the [MemberLookupResult.getable] and | |
| /// [MemberLookupResult.setable], respectively. | |
| MemberLookupResult? lookupExtensionMemberByName(Name name); | |
| } | |
| abstract class ExtensionBuilderImpl extends DeclarationBuilderImpl | |
| with DeclarationBuilderMixin | |
| implements ExtensionBuilder { | |
| @override | |
| DartType buildAliasedTypeWithBuiltArguments( | |
| LibraryBuilder library, | |
| Nullability nullability, | |
| List<DartType> arguments, | |
| TypeUse typeUse, | |
| Uri fileUri, | |
| int charOffset, { | |
| required bool hasExplicitTypeArguments, | |
| }) { | |
| throw new UnsupportedError( | |
| "ExtensionBuilder.buildTypesWithBuiltArguments " | |
| "is not supported in library '${library.importUri}'.", | |
| ); | |
| } | |
| @override | |
| // Coverage-ignore(suite): Not run. | |
| Nullability computeNullabilityWithArguments( | |
| List<TypeBuilder>? typeArguments, { | |
| required Map<TypeParameterBuilder, TraversalState> | |
| typeParametersTraversalState, | |
| }) => Nullability.nonNullable; | |
| @override | |
| MemberLookupResult? lookupExtensionMemberByName(Name name) { | |
| if (name.isPrivate && libraryBuilder.library != name.library) { | |
| return null; | |
| } | |
| MemberLookupResult? result = lookupLocalMember(name.text, required: false); | |
| if (result != null && result.isInvalidLookup) { | |
| return result; | |
| } | |
| if (name == indexGetName) { | |
| // We need to find `operator []=` as well. | |
| MemberLookupResult? setterResult = lookupLocalMember( | |
| indexSetName.text, | |
| required: false, | |
| ); | |
| if (setterResult != null && !setterResult.isInvalidLookup) { | |
| if (result != null) { | |
| // Return `operator []` and `operator []=` as the getable and | |
| // setable results, respectively. | |
| return new GetableSetableMemberResult( | |
| result.getable!, | |
| setterResult.getable!, | |
| isStatic: result.isStatic, | |
| ); | |
| // Return `operator []=` as the setable result. | |
| } else { | |
| return new SetableMemberResult( | |
| setterResult.getable!, | |
| isStatic: setterResult.isStatic, | |
| ); | |
| } | |
| } else { | |
| // Return `operator []` as the getable result. | |
| return result; | |
| } | |
| } else if (name == indexSetName) { | |
| // We need to find `operator []` as well. | |
| MemberLookupResult? getterResult = lookupLocalMember( | |
| indexGetName.text, | |
| required: false, | |
| ); | |
| if (getterResult != null && !getterResult.isInvalidLookup) { | |
| if (result != null) { | |
| // Return `operator []` and `operator []=` as the getable and | |
| // setable results, respectively. | |
| return new GetableSetableMemberResult( | |
| getterResult.getable!, | |
| result.getable!, | |
| isStatic: result.isStatic, | |
| ); | |
| } else { | |
| // Return `operator []` as the getable result. | |
| return getterResult; | |
| } | |
| } else if (result != null) { | |
| // Return `operator []=` as the setable result. | |
| return new SetableMemberResult( | |
| result.getable!, | |
| isStatic: result.isStatic, | |
| ); | |
| } else { | |
| return null; | |
| } | |
| } else { | |
| return result; | |
| } | |
| } | |
| } |