| Index: pkg/compiler/lib/src/ssa/type_builder.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
|
| index 8ef448ac111e3f8a8dd5dda7e879699d9465d83e..e7b06c9a6960a099e6a14527fbc5d3e0fc313b36 100644
|
| --- a/pkg/compiler/lib/src/ssa/type_builder.dart
|
| +++ b/pkg/compiler/lib/src/ssa/type_builder.dart
|
| @@ -16,7 +16,7 @@ import '../universe/use.dart' show TypeUse;
|
|
|
| /// Functions to insert type checking, coercion, and instruction insertion
|
| /// depending on the environment for dart code.
|
| -class TypeBuilder {
|
| +abstract class TypeBuilder {
|
| final GraphBuilder builder;
|
| TypeBuilder(this.builder);
|
|
|
| @@ -71,24 +71,25 @@ class TypeBuilder {
|
|
|
| /// Helper to create an instruction that gets the value of a type variable.
|
| HInstruction addTypeVariableReference(
|
| - ResolutionTypeVariableType type, MemberElement member,
|
| + TypeVariableType type, MemberEntity member,
|
| {SourceInformation sourceInformation}) {
|
| assert(assertTypeInContext(type));
|
| - if (type is MethodTypeVariableType) {
|
| + if (type.element.typeDeclaration is! ClassEntity) {
|
| + // GENERIC_METHODS: We currently don't reify method type variables.
|
| return builder.graph.addConstantNull(builder.closedWorld);
|
| }
|
| - bool isClosure = member.enclosingElement.isClosure;
|
| + bool isClosure = member.enclosingClass.isClosure;
|
| if (isClosure) {
|
| - ClosureClassElement closureClass = member.enclosingElement;
|
| + ClosureClassElement closureClass = member.enclosingClass;
|
| LocalFunctionElement localFunction = closureClass.methodElement;
|
| - member = localFunction.outermostEnclosingMemberOrTopLevel;
|
| + member = localFunction.memberContext;
|
| }
|
| bool isInConstructorContext =
|
| - member.isConstructor || member.isGenerativeConstructorBody;
|
| + member.isConstructor || member is ConstructorBodyEntity;
|
| Local typeVariableLocal =
|
| builder.localsHandler.getTypeVariableAsLocal(type);
|
| if (isClosure) {
|
| - if (member.isFactoryConstructor ||
|
| + if ((member is ConstructorEntity && member.isFactoryConstructor) ||
|
| (isInConstructorContext &&
|
| builder.hasDirectLocal(typeVariableLocal))) {
|
| // The type variable is used from a closure in a factory constructor.
|
| @@ -131,11 +132,10 @@ class TypeBuilder {
|
| }
|
|
|
| /// Generate code to extract the type argument from the object.
|
| - HInstruction readTypeVariable(
|
| - ResolutionTypeVariableType variable, Element member,
|
| + HInstruction readTypeVariable(TypeVariableType variable, MemberEntity member,
|
| {SourceInformation sourceInformation}) {
|
| assert(member.isInstanceMember);
|
| - assert(variable is! MethodTypeVariableType);
|
| + assert(variable.element.typeDeclaration is ClassEntity);
|
| HInstruction target = builder.localsHandler.readThis();
|
| builder.push(new HTypeInfoReadVariable(
|
| variable, target, builder.commonMasks.dynamicType)
|
| @@ -143,20 +143,22 @@ class TypeBuilder {
|
| return builder.pop();
|
| }
|
|
|
| + InterfaceType getThisType(ClassEntity cls);
|
| +
|
| HInstruction buildTypeArgumentRepresentations(
|
| - ResolutionDartType type, MemberElement sourceElement) {
|
| + DartType type, MemberEntity sourceElement) {
|
| assert(!type.isTypeVariable);
|
| // Compute the representation of the type arguments, including access
|
| // to the runtime type information for type variables as instructions.
|
| - assert(type.element.isClass);
|
| - ResolutionInterfaceType interface = type;
|
| + assert(type.isInterfaceType);
|
| + InterfaceType interface = type;
|
| List<HInstruction> inputs = <HInstruction>[];
|
| - for (ResolutionDartType argument in interface.typeArguments) {
|
| + for (DartType argument in interface.typeArguments) {
|
| inputs.add(analyzeTypeArgument(argument, sourceElement));
|
| }
|
| HInstruction representation = new HTypeInfoExpression(
|
| TypeInfoExpressionKind.INSTANCE,
|
| - interface.element.thisType,
|
| + getThisType(interface.element),
|
| inputs,
|
| builder.commonMasks.dynamicType);
|
| return representation;
|
| @@ -164,9 +166,9 @@ class TypeBuilder {
|
|
|
| /// Check that [type] is valid in the context of `localsHandler.contextClass`.
|
| /// This should only be called in assertions.
|
| - bool assertTypeInContext(ResolutionDartType type, [Spannable spannable]) {
|
| + bool assertTypeInContext(DartType type, [Spannable spannable]) {
|
| if (builder.compiler.options.useKernel) return true;
|
| - ClassElement contextClass = DartTypes.getClassContext(type);
|
| + ClassEntity contextClass = DartTypes.getClassContext(type);
|
| assert(
|
| contextClass == null ||
|
| contextClass == builder.localsHandler.contextClass,
|
| @@ -178,7 +180,7 @@ class TypeBuilder {
|
| }
|
|
|
| HInstruction analyzeTypeArgument(
|
| - ResolutionDartType argument, MemberElement sourceElement,
|
| + DartType argument, MemberEntity sourceElement,
|
| {SourceInformation sourceInformation}) {
|
| assert(assertTypeInContext(argument));
|
| argument = argument.unaliased;
|
| @@ -193,8 +195,10 @@ class TypeBuilder {
|
| }
|
|
|
| List<HInstruction> inputs = <HInstruction>[];
|
| - argument.forEachTypeVariable((variable) {
|
| - if (variable is! MethodTypeVariableType) {
|
| + argument.forEachTypeVariable((TypeVariableType variable) {
|
| + if (variable.element.typeDeclaration is ClassEntity) {
|
| + // GENERIC_METHODS: We currently only reify class type variables but not
|
| + // method type variables.
|
| inputs.add(analyzeTypeArgument(variable, sourceElement));
|
| }
|
| });
|
| @@ -230,16 +234,21 @@ class TypeBuilder {
|
| /// Invariant: [type] must be valid in the context.
|
| /// See [LocalsHandler.substInContext].
|
| HInstruction buildTypeConversion(
|
| - HInstruction original, ResolutionDartType type, int kind) {
|
| + HInstruction original, DartType type, int kind) {
|
| if (type == null) return original;
|
| - // GENERIC_METHODS: The following statement was added for parsing and
|
| - // ignoring method type variables; must be generalized for full support of
|
| - // generic methods.
|
| - type = type.dynamifyMethodTypeVariableType;
|
| + if (type.isTypeVariable) {
|
| + TypeVariableType typeVariable = type;
|
| + // GENERIC_METHODS: The following statement was added for parsing and
|
| + // ignoring method type variables; must be generalized for full support of
|
| + // generic methods.
|
| + if (typeVariable.element.typeDeclaration is! ClassEntity) {
|
| + type = const DynamicType();
|
| + }
|
| + }
|
| type = type.unaliased;
|
| assert(assertTypeInContext(type, original));
|
| if (type.isInterfaceType && !type.treatAsRaw) {
|
| - ResolutionInterfaceType interfaceType = type;
|
| + InterfaceType interfaceType = type;
|
| TypeMask subtype =
|
| new TypeMask.subtype(interfaceType.element, builder.closedWorld);
|
| HInstruction representations =
|
|
|