Chromium Code Reviews| 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..73e9ea8881bc8ccf15045a23e9f48e38ceb00680 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,61 @@ 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) {} else if (functionNode.parent |
|
Siggi Cherem (dart-lang)
2017/08/28 22:16:41
if (x) {} else if (y)
=>
if (!x && y)
?
Johnni Winther
2017/08/29 07:59:03
It should have been:
if (functionNode.parent is
|
| + 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); |
| + } |
| + } |
| } |
| } |