blob: d709a754cb93b5a4b4beb1b65963451d62fcba42 [file] [log] [blame]
// Copyright (c) 2017, 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.
/// Entity model for elements derived from Kernel IR.
import 'package:kernel/ast.dart' as ir;
import '../elements/entities.dart';
import '../elements/indexed.dart';
import '../elements/names.dart';
import '../elements/types.dart';
const String kElementPrefix = 'k:';
class KLibrary extends IndexedLibrary {
@override
final String name;
@override
final Uri canonicalUri;
@override
final bool isNonNullableByDefault;
KLibrary(this.name, this.canonicalUri, this.isNonNullableByDefault);
@override
String toString() => '${kElementPrefix}library($name)';
}
class KClass extends IndexedClass {
@override
final KLibrary library;
@override
final String name;
@override
final bool isAbstract;
KClass(this.library, this.name, {this.isAbstract});
@override
bool get isClosure => false;
@override
String toString() => '${kElementPrefix}class($name)';
}
abstract class KMember extends IndexedMember {
@override
final KLibrary library;
@override
final KClass enclosingClass;
final Name _name;
final bool _isStatic;
KMember(this.library, this.enclosingClass, this._name,
{bool isStatic = false})
: _isStatic = isStatic;
@override
String get name => _name.text;
@override
Name get memberName => _name;
@override
bool get isAssignable => false;
@override
bool get isConst => false;
@override
bool get isAbstract => false;
@override
bool get isSetter => false;
@override
bool get isGetter => false;
@override
bool get isFunction => false;
@override
bool get isField => false;
@override
bool get isConstructor => false;
@override
bool get isInstanceMember => enclosingClass != null && !_isStatic;
@override
bool get isStatic => enclosingClass != null && _isStatic;
@override
bool get isTopLevel => enclosingClass == null;
String get _kind;
@override
String toString() => '${kElementPrefix}$_kind'
'(${enclosingClass != null ? '${enclosingClass.name}.' : ''}$name)';
}
abstract class KFunction extends KMember
implements FunctionEntity, IndexedFunction {
@override
final ParameterStructure parameterStructure;
@override
final bool isExternal;
@override
final AsyncMarker asyncMarker;
KFunction(KLibrary library, KClass enclosingClass, Name name,
this.parameterStructure, this.asyncMarker,
{bool isStatic = false, this.isExternal = false})
: super(library, enclosingClass, name, isStatic: isStatic);
}
abstract class KConstructor extends KFunction
implements ConstructorEntity, IndexedConstructor {
@override
final bool isConst;
KConstructor(
KClass enclosingClass, Name name, ParameterStructure parameterStructure,
{bool isExternal, this.isConst})
: super(enclosingClass.library, enclosingClass, name, parameterStructure,
AsyncMarker.SYNC,
isExternal: isExternal);
@override
bool get isConstructor => true;
@override
bool get isInstanceMember => false;
@override
bool get isStatic => false;
@override
bool get isTopLevel => false;
@override
bool get isFromEnvironmentConstructor => false;
@override
String get _kind => 'constructor';
}
class KGenerativeConstructor extends KConstructor {
KGenerativeConstructor(
KClass enclosingClass, Name name, ParameterStructure parameterStructure,
{bool isExternal, bool isConst})
: super(enclosingClass, name, parameterStructure,
isExternal: isExternal, isConst: isConst);
@override
bool get isFactoryConstructor => false;
@override
bool get isGenerativeConstructor => true;
}
class KFactoryConstructor extends KConstructor {
@override
final bool isFromEnvironmentConstructor;
KFactoryConstructor(
KClass enclosingClass, Name name, ParameterStructure parameterStructure,
{bool isExternal, bool isConst, this.isFromEnvironmentConstructor})
: super(enclosingClass, name, parameterStructure,
isExternal: isExternal, isConst: isConst);
@override
bool get isFactoryConstructor => true;
@override
bool get isGenerativeConstructor => false;
}
class KMethod extends KFunction {
@override
final bool isAbstract;
KMethod(KLibrary library, KClass enclosingClass, Name name,
ParameterStructure parameterStructure, AsyncMarker asyncMarker,
{bool isStatic, bool isExternal, this.isAbstract})
: super(library, enclosingClass, name, parameterStructure, asyncMarker,
isStatic: isStatic, isExternal: isExternal);
@override
bool get isFunction => true;
@override
String get _kind => 'method';
}
class KGetter extends KFunction {
@override
final bool isAbstract;
KGetter(KLibrary library, KClass enclosingClass, Name name,
AsyncMarker asyncMarker,
{bool isStatic, bool isExternal, this.isAbstract})
: super(library, enclosingClass, name, ParameterStructure.getter,
asyncMarker,
isStatic: isStatic, isExternal: isExternal);
@override
bool get isGetter => true;
@override
String get _kind => 'getter';
}
class KSetter extends KFunction {
@override
final bool isAbstract;
KSetter(KLibrary library, KClass enclosingClass, Name name,
{bool isStatic, bool isExternal, this.isAbstract})
: super(library, enclosingClass, name, ParameterStructure.setter,
AsyncMarker.SYNC,
isStatic: isStatic, isExternal: isExternal);
@override
bool get isAssignable => true;
@override
bool get isSetter => true;
@override
String get _kind => 'setter';
}
class KField extends KMember implements FieldEntity, IndexedField {
@override
final bool isAssignable;
@override
final bool isConst;
KField(KLibrary library, KClass enclosingClass, Name name,
{bool isStatic, this.isAssignable, this.isConst})
: super(library, enclosingClass, name, isStatic: isStatic);
@override
bool get isField => true;
@override
String get _kind => 'field';
}
class KTypeVariable extends IndexedTypeVariable {
@override
final Entity typeDeclaration;
@override
final String name;
@override
final int index;
KTypeVariable(this.typeDeclaration, this.name, this.index);
@override
String toString() =>
'${kElementPrefix}type_variable(${typeDeclaration.name}.$name)';
}
class KLocalFunction implements Local {
@override
final String name;
final MemberEntity memberContext;
final Entity executableContext;
final ir.LocalFunction node;
FunctionType functionType;
KLocalFunction(
this.name, this.memberContext, this.executableContext, this.node);
@override
String toString() => '${kElementPrefix}local_function'
'(${memberContext.name}.${name ?? '<anonymous>'})';
}
class KLocalTypeVariable implements TypeVariableEntity {
@override
final KLocalFunction typeDeclaration;
@override
final String name;
@override
final int index;
DartType bound;
DartType defaultType;
KLocalTypeVariable(this.typeDeclaration, this.name, this.index);
@override
String toString() =>
'${kElementPrefix}local_type_variable(${typeDeclaration.name}.$name)';
}