| Index: pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
|
| diff --git a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
|
| index ef8b455a7738552dd70c70d7e074e9c993aee4ea..86dc99775d3ff94d191d69fdd9e2c21b35406e11 100644
|
| --- a/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/kernel_inferrer_engine.dart
|
| @@ -4,11 +4,18 @@
|
|
|
| import 'package:kernel/ast.dart' as ir;
|
|
|
| +import '../closure.dart';
|
| +import '../common.dart';
|
| +import '../common_elements.dart';
|
| import '../compiler.dart';
|
| import '../constants/values.dart';
|
| import '../elements/entities.dart';
|
| +import '../elements/types.dart';
|
| +import '../kernel/element_map.dart';
|
| +import '../js_model/locals.dart';
|
| import '../types/types.dart';
|
| import '../world.dart';
|
| +import 'builder_kernel.dart';
|
| import 'inferrer_engine.dart';
|
| import 'type_graph_inferrer.dart';
|
| import 'type_graph_nodes.dart';
|
| @@ -16,16 +23,25 @@ import 'type_system.dart';
|
|
|
| class KernelTypeGraphInferrer extends TypeGraphInferrer<ir.Node> {
|
| final Compiler _compiler;
|
| + final KernelToElementMapForBuilding _elementMap;
|
| + final GlobalLocalsMap _globalLocalsMap;
|
| + final ClosureDataLookup<ir.Node> _closureDataLookup;
|
|
|
| - KernelTypeGraphInferrer(this._compiler, ClosedWorld closedWorld,
|
| - ClosedWorldRefiner closedWorldRefiner, {bool disableTypeInference: false})
|
| + KernelTypeGraphInferrer(
|
| + this._compiler,
|
| + this._elementMap,
|
| + this._globalLocalsMap,
|
| + this._closureDataLookup,
|
| + ClosedWorld closedWorld,
|
| + ClosedWorldRefiner closedWorldRefiner,
|
| + {bool disableTypeInference: false})
|
| : super(closedWorld, closedWorldRefiner,
|
| disableTypeInference: disableTypeInference);
|
|
|
| @override
|
| InferrerEngine<ir.Node> createInferrerEngineFor(FunctionEntity main) {
|
| - return new KernelInferrerEngine(
|
| - _compiler, closedWorld, closedWorldRefiner, main);
|
| + return new KernelInferrerEngine(_compiler, _elementMap, _globalLocalsMap,
|
| + _closureDataLookup, closedWorld, closedWorldRefiner, main);
|
| }
|
|
|
| @override
|
| @@ -61,10 +77,25 @@ class KernelGlobalTypeInferenceResults
|
| }
|
|
|
| class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
|
| - KernelInferrerEngine(Compiler compiler, ClosedWorld closedWorld,
|
| - ClosedWorldRefiner closedWorldRefiner, FunctionEntity mainElement)
|
| - : super(compiler, closedWorld, closedWorldRefiner, mainElement,
|
| - const KernelTypeSystemStrategy());
|
| + final KernelToElementMapForBuilding _elementMap;
|
| + final GlobalLocalsMap _globalLocalsMap;
|
| + final ClosureDataLookup<ir.Node> _closureDataLookup;
|
| +
|
| + KernelInferrerEngine(
|
| + Compiler compiler,
|
| + this._elementMap,
|
| + this._globalLocalsMap,
|
| + this._closureDataLookup,
|
| + ClosedWorld closedWorld,
|
| + ClosedWorldRefiner closedWorldRefiner,
|
| + FunctionEntity mainElement)
|
| + : super(
|
| + compiler,
|
| + closedWorld,
|
| + closedWorldRefiner,
|
| + mainElement,
|
| + new KernelTypeSystemStrategy(
|
| + _elementMap, _globalLocalsMap, _closureDataLookup));
|
|
|
| @override
|
| ConstantValue getFieldConstant(FieldEntity field) {
|
| @@ -81,8 +112,9 @@ class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
|
| @override
|
| TypeInformation computeMemberTypeInformation(
|
| MemberEntity member, ir.Node body) {
|
| - throw new UnimplementedError(
|
| - 'KernelInferrerEngine.computeMemberTypeInformation');
|
| + KernelTypeGraphBuilder visitor =
|
| + new KernelTypeGraphBuilder(member, compiler, _elementMap, this);
|
| + return visitor.run();
|
| }
|
|
|
| @override
|
| @@ -97,12 +129,45 @@ class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
|
|
|
| @override
|
| ir.Node computeMemberBody(MemberEntity member) {
|
| - throw new UnimplementedError('KernelInferrerEngine.computeMemberBody');
|
| + MemberDefinition definition = _elementMap.getMemberDefinition(member);
|
| + switch (definition.kind) {
|
| + case MemberKind.regular:
|
| + ir.Member node = definition.node;
|
| + if (node is ir.Field) {
|
| + return node.initializer;
|
| + } else if (node is ir.Procedure) {
|
| + return node.function;
|
| + }
|
| + break;
|
| + case MemberKind.constructor:
|
| + case MemberKind.constructorBody:
|
| + ir.Member node = definition.node;
|
| + if (node is ir.Constructor) {
|
| + return node.function;
|
| + } else if (node is ir.Procedure) {
|
| + return node.function;
|
| + }
|
| + break;
|
| + case MemberKind.closureCall:
|
| + ir.Member node = definition.node;
|
| + if (node is ir.FunctionDeclaration) {
|
| + return node.function;
|
| + } else if (node is ir.FunctionExpression) {
|
| + return node.function;
|
| + }
|
| + break;
|
| + case MemberKind.closureField:
|
| + break;
|
| + }
|
| + failedAt(member, 'Unexpected member definition: $definition.');
|
| + return null;
|
| }
|
|
|
| @override
|
| int computeMemberSize(MemberEntity member) {
|
| - throw new UnimplementedError('KernelInferrerEngine.computeMemberSize');
|
| + // TODO(johnniwinther): Find an ordering that can be shared between the
|
| + // front ends.
|
| + return 0;
|
| }
|
|
|
| @override
|
| @@ -112,7 +177,14 @@ class KernelInferrerEngine extends InferrerEngineImpl<ir.Node> {
|
| }
|
|
|
| class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> {
|
| - const KernelTypeSystemStrategy();
|
| + KernelToElementMapForBuilding _elementMap;
|
| + GlobalLocalsMap _globalLocalsMap;
|
| + ClosureDataLookup<ir.Node> _closureDataLookup;
|
| +
|
| + KernelTypeSystemStrategy(
|
| + this._elementMap, this._globalLocalsMap, this._closureDataLookup);
|
| +
|
| + ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
|
|
|
| @override
|
| bool checkClassEntity(ClassEntity cls) => true;
|
| @@ -137,13 +209,62 @@ class KernelTypeSystemStrategy implements TypeSystemStrategy<ir.Node> {
|
| @override
|
| ParameterTypeInformation createParameterTypeInformation(
|
| Local parameter, TypeSystem<ir.Node> types) {
|
| - throw new UnimplementedError(
|
| - 'KernelTypeSystemStrategy.createParameterTypeInformation');
|
| + MemberEntity context = parameter.memberContext;
|
| + KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(context);
|
| + ir.FunctionNode functionNode =
|
| + localsMap.getFunctionNodeForParameter(parameter);
|
| + DartType type =
|
| + _elementMap.getDartType(localsMap.getParameterType(parameter));
|
| + MemberEntity member;
|
| + bool isClosure = false;
|
| + if (functionNode.parent is ir.Member) {
|
| + member = _elementMap.getMember(functionNode.parent);
|
| + } else if (functionNode.parent is ir.FunctionExpression ||
|
| + functionNode.parent is ir.FunctionDeclaration) {
|
| + ClosureRepresentationInfo info =
|
| + _closureDataLookup.getClosureInfo(functionNode.parent);
|
| + member = info.callMethod;
|
| + isClosure = true;
|
| + }
|
| + MemberTypeInformation memberTypeInformation =
|
| + types.getInferredTypeOfMember(member);
|
| + if (isClosure) {
|
| + return new ParameterTypeInformation.localFunction(
|
| + memberTypeInformation, parameter, type, member);
|
| + } else if (member.isInstanceMember) {
|
| + return new ParameterTypeInformation.instanceMember(memberTypeInformation,
|
| + parameter, type, member, new ParameterAssignments());
|
| + } else {
|
| + return new ParameterTypeInformation.static(
|
| + memberTypeInformation, parameter, type, member);
|
| + }
|
| }
|
|
|
| @override
|
| MemberTypeInformation createMemberTypeInformation(MemberEntity member) {
|
| - throw new UnimplementedError(
|
| - 'KernelTypeSystemStrategy.createParameterTypeInformation');
|
| + if (member.isField) {
|
| + FieldEntity field = member;
|
| + DartType type = _elementEnvironment.getFieldType(field);
|
| + return new FieldTypeInformation(field, type);
|
| + } else if (member.isGetter) {
|
| + FunctionEntity getter = member;
|
| + DartType type = _elementEnvironment.getFunctionType(getter);
|
| + return new GetterTypeInformation(getter, type);
|
| + } else if (member.isSetter) {
|
| + FunctionEntity setter = member;
|
| + return new SetterTypeInformation(setter);
|
| + } else if (member.isFunction) {
|
| + FunctionEntity method = member;
|
| + DartType type = _elementEnvironment.getFunctionType(method);
|
| + return new MethodTypeInformation(method, type);
|
| + } else {
|
| + ConstructorEntity constructor = member;
|
| + if (constructor.isFactoryConstructor) {
|
| + DartType type = _elementEnvironment.getFunctionType(constructor);
|
| + return new FactoryConstructorTypeInformation(constructor, type);
|
| + } else {
|
| + return new GenerativeConstructorTypeInformation(constructor);
|
| + }
|
| + }
|
| }
|
| }
|
|
|