blob: 12453f58c992ebbe90e6401ccaa3d22e0b414cc4 [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.
/// Facade interfaces for KernelToElementMap.
// TODO(48820): Remove after migrating element_map.dart and
// element_map_impl.dart.
import 'package:kernel/ast.dart' as ir
show
Class,
Constructor,
DartType,
Expression,
Field,
InterfaceType,
LibraryDependency,
LocalFunction,
Member,
Name,
Procedure,
ProcedureStubKind,
StaticInvocation;
import 'package:kernel/type_environment.dart' as ir
show TypeEnvironment, StaticTypeContext;
import '../common.dart' show DiagnosticReporter;
import '../common/elements.dart' show CommonElements, ElementEnvironment;
import '../elements/entities.dart'
show
ClassEntity,
ConstructorEntity,
FieldEntity,
FunctionEntity,
Local,
MemberEntity,
ImportEntity;
import '../constants/values.dart';
import '../elements/indexed.dart' show IndexedClass;
import '../elements/names.dart' show Name;
import '../elements/types.dart' show DartType, DartTypes, InterfaceType;
import '../ir/constants.dart' show Dart2jsConstantEvaluator;
import '../native/behavior.dart';
import '../js_backend/native_data.dart' show NativeBasicData;
import '../options.dart';
import '../universe/selector.dart';
enum ForeignKind {
JS,
JS_BUILTIN,
JS_EMBEDDED_GLOBAL,
JS_INTERCEPTOR_CONSTANT,
NONE,
}
abstract class KernelElementEnvironment implements ElementEnvironment {
Iterable<ConstantValue> getMemberMetadata(MemberEntity member,
{bool includeParameterMetadata = false});
}
abstract class KernelToElementMapForNativeData {
KernelElementEnvironment get elementEnvironment;
ClassEntity getClass(ir.Class node);
MemberEntity getMember(ir.Member node);
NativeBehavior getNativeBehaviorForMethod(ir.Member member,
Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
{required bool isJsInterop});
NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
{required bool isJsInterop});
NativeBehavior getNativeBehaviorForFieldStore(ir.Field field);
}
abstract class KernelToElementMapForClassHierarchy {
ClassEntity? getSuperClass(ClassEntity cls);
int getHierarchyDepth(IndexedClass cls);
Iterable<InterfaceType> getSuperTypes(ClassEntity cls);
ClassEntity? getAppliedMixin(IndexedClass cls);
bool implementsFunction(IndexedClass cls);
}
abstract class KernelToElementMapForImpactData {
CommonElements get commonElements;
Dart2jsConstantEvaluator get constantEvaluator;
CompilerOptions get options;
DiagnosticReporter get reporter;
DartTypes get types;
ConstructorEntity getConstructor(ir.Member node);
DartType getDartType(ir.DartType type);
}
abstract class KernelToElementMapForDeferredLoading {
CommonElements get commonElements;
ConstantValue? getConstantValue(
ir.StaticTypeContext staticTypeContext, ir.Expression node,
{bool requireConstant = true,
bool implicitNull = false,
bool checkCasts = true});
ImportEntity getImport(ir.LibraryDependency? node);
ir.Member getMemberNode(MemberEntity member);
ir.StaticTypeContext getStaticTypeContext(MemberEntity member);
}
abstract class KernelToElementMapForKernelImpact {
CommonElements get commonElements;
KernelElementEnvironment get elementEnvironment;
NativeBasicData get nativeBasicData;
ir.TypeEnvironment get typeEnvironment;
InterfaceType createInterfaceType(
ir.Class cls, List<ir.DartType> typeArguments);
ClassEntity getClass(ir.Class node);
ConstantValue? getConstantValue(
ir.StaticTypeContext staticTypeContext, ir.Expression node,
{bool requireConstant = true,
bool implicitNull = false,
bool checkCasts = true});
ConstructorEntity getConstructor(ir.Member node);
ConstructorEntity getSuperConstructor(
ir.Constructor sourceNode, ir.Member targetNode);
DartType getDartType(ir.DartType type);
FieldEntity getField(ir.Field node);
ForeignKind getForeignKind(ir.StaticInvocation node);
FunctionEntity getMethod(ir.Procedure node);
FunctionEntity getSuperNoSuchMethod(ClassEntity cls);
InterfaceType getInterfaceType(ir.InterfaceType type);
ImportEntity? getImport(ir.LibraryDependency? node);
InterfaceType? getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node);
Local getLocalFunction(ir.LocalFunction node);
MemberEntity getMember(ir.Member node);
Name getName(ir.Name name);
NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
{required bool isJsInterop});
NativeBehavior getNativeBehaviorForFieldStore(ir.Field field);
NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node);
NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
ir.StaticInvocation node);
NativeBehavior getNativeBehaviorForMethod(ir.Member member,
Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
{required bool isJsInterop});
Selector getInvocationSelector(ir.Name irName, int positionalArguments,
List<String> namedArguments, int typeArguments);
}
// Members which dart2js ignores.
bool memberIsIgnorable(ir.Member node, {ir.Class? cls}) {
if (node is! ir.Procedure) return false;
ir.Procedure member = node;
switch (member.stubKind) {
case ir.ProcedureStubKind.Regular:
case ir.ProcedureStubKind.ConcreteForwardingStub:
case ir.ProcedureStubKind.NoSuchMethodForwarder:
return false;
case ir.ProcedureStubKind.AbstractForwardingStub:
case ir.ProcedureStubKind.MemberSignature:
case ir.ProcedureStubKind.AbstractMixinStub:
case ir.ProcedureStubKind.ConcreteMixinStub:
return true;
}
}