blob: c01fd855c8759d7456a9bf7a897807371768b93f [file] [log] [blame]
// 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;
}
}
}