blob: d4153d2cf7cfebf265274fa969abff965769c17a [file] [log] [blame]
// Copyright (c) 2022, 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.
import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart';
import '../base/lookup_result.dart';
import '../base/messages.dart';
import '../base/problems.dart';
import 'builder.dart';
import 'declaration_builders.dart';
import 'library_builder.dart';
import 'member_builder.dart';
import 'nullability_builder.dart';
import 'property_builder.dart';
import 'type_builder.dart';
/// Shared implementation between extension and extension type declaration
/// builders.
mixin DeclarationBuilderMixin implements IDeclarationBuilder {
/// Lookup a static member of this declaration.
@override
MemberLookupResult? findStaticBuilder(
String name,
int fileOffset,
Uri fileUri,
LibraryBuilder accessingLibrary,
) {
if (accessingLibrary.nameOriginBuilder !=
libraryBuilder.nameOriginBuilder &&
name.startsWith("_")) {
return null;
}
MemberLookupResult? result = nameSpace.lookup(name);
if (result != null && !result.isStatic) {
result = null;
}
return result;
}
@override
DartType buildAliasedType(
LibraryBuilder library,
NullabilityBuilder nullabilityBuilder,
List<TypeBuilder>? arguments,
TypeUse typeUse,
Uri fileUri,
int charOffset,
ClassHierarchyBase? hierarchy, {
required bool hasExplicitTypeArguments,
}) {
return buildAliasedTypeWithBuiltArguments(
library,
nullabilityBuilder.build(),
buildAliasedTypeArguments(library, arguments, hierarchy),
typeUse,
fileUri,
charOffset,
hasExplicitTypeArguments: hasExplicitTypeArguments,
);
}
@override
InterfaceType? get thisType => null;
@override
LookupResult? lookupLocalMember(String name, {bool required = false}) {
LookupResult? result = nameSpace.lookup(name);
if (required && result == null) {
internalProblem(
codeInternalProblemNotFoundIn.withArguments(name, fullNameForErrors),
-1,
null,
);
}
return result;
}
MemberBuilder? lookupLocalMemberByName(
Name name, {
bool setter = false,
bool required = false,
}) {
LookupResult? result = lookupLocalMember(name.text, required: required);
NamedBuilder? builder = setter ? result?.setable : result?.getable;
if (builder == null && setter) {
// When looking up setters, we include assignable fields.
builder = result?.getable;
if (builder is! PropertyBuilder || !builder.hasSetter) {
builder = null;
}
}
if (builder != null) {
if (name.isPrivate && libraryBuilder.library != name.library) {
builder = null;
} else if (builder is PropertyBuilder &&
builder.hasConcreteField &&
!builder.isStatic) {
// Non-external extension instance fields are invalid.
builder = null;
} else if (builder.isDuplicate) {
// Duplicates are not visible in the instance scope.
builder = null;
}
}
return builder as MemberBuilder?;
}
}