Chromium Code Reviews| Index: pkg/compiler/lib/src/inferrer/inferrer_visitor.dart |
| diff --git a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart |
| index 37d29ed976f76b5bee036631a9a6a4f768cdb9a7..ab77d7b8bec4f95d44314233d23993fcc4460d44 100644 |
| --- a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart |
| +++ b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart |
| @@ -16,7 +16,11 @@ import '../diagnostics/spannable.dart' show |
| Spannable; |
| import '../elements/elements.dart'; |
| import '../resolution/operators.dart'; |
| -import '../resolved_visitor.dart'; |
| +import '../resolution/semantic_visitor.dart'; |
| +import '../resolution/send_resolver.dart' show |
| + SendResolverMixin; |
| +import '../resolution/tree_elements.dart' show |
| + TreeElements; |
| import '../tree/tree.dart'; |
| import '../types/types.dart' show |
| TypeMask; |
| @@ -683,8 +687,17 @@ class LocalsHandler<T> { |
| } |
| } |
| -abstract class InferrerVisitor |
| - <T, E extends MinimalInferrerEngine<T>> extends NewResolvedVisitor<T> { |
| +abstract class InferrerVisitor<T, E extends MinimalInferrerEngine<T>> |
| + extends Visitor<T> |
| + with SendResolverMixin, |
| + SemanticSendResolvedMixin<T, dynamic>, |
| + CompoundBulkMixin<T, dynamic>, |
| + PrefixBulkMixin<T, dynamic>, |
| + PostfixBulkMixin<T, dynamic>, |
| + ErrorBulkMixin<T, dynamic>, |
| + NewBulkMixin<T, dynamic>, |
| + SetBulkMixin<T, dynamic> |
| + implements SemanticSendVisitor<T, dynamic> { |
| final Compiler compiler; |
| final AstElement analyzedElement; |
| final TypeSystem<T> types; |
| @@ -695,6 +708,7 @@ abstract class InferrerVisitor |
| new Map<JumpTarget, List<LocalsHandler<T>>>(); |
| LocalsHandler<T> locals; |
| final List<T> cascadeReceiverStack = new List<T>(); |
| + final TreeElements elements; |
| bool accumulateIsChecks = false; |
| bool conditionIsSimple = false; |
| @@ -720,7 +734,7 @@ abstract class InferrerVisitor |
| [LocalsHandler<T> handler]) |
| : this.analyzedElement = analyzedElement, |
| this.locals = handler, |
| - super(analyzedElement.resolvedAst.elements) { |
| + this.elements = analyzedElement.resolvedAst.elements { |
| if (handler != null) return; |
| Node node = analyzedElement.node; |
| FieldInitializationScope<T> fieldScope = |
| @@ -730,6 +744,12 @@ abstract class InferrerVisitor |
| locals = new LocalsHandler<T>(inferrer, types, compiler, node, fieldScope); |
| } |
| + @override |
| + SemanticSendVisitor get sendVisitor => this; |
| + |
| + @override |
| + T apply(Node node, _) => visit(node); |
| + |
| T handleSendSet(SendSet node); |
| T handleDynamicInvoke(Send node); |
| @@ -743,6 +763,26 @@ abstract class InferrerVisitor |
| T visitFunctionExpression(FunctionExpression node); |
| @override |
| + T bulkHandleSet(SendSet node, _) { |
| + return handleSendSet(node); |
| + } |
| + |
| + @override |
| + T bulkHandleCompound(SendSet node, _) { |
| + return handleSendSet(node); |
| + } |
| + |
| + @override |
| + T bulkHandlePrefix(SendSet node, _) { |
| + return handleSendSet(node); |
| + } |
| + |
| + @override |
| + T bulkHandlePostfix(SendSet node, _) { |
| + return handleSendSet(node); |
| + } |
| + |
| + @override |
| T visitAssert(Send node, Node expression, _) { |
| if (!compiler.enableUserAssertions) { |
| return types.nullType; |
| @@ -821,11 +861,6 @@ abstract class InferrerVisitor |
| return types.nonNullSubtype(compiler.symbolClass); |
| } |
| - T visitTypePrefixSend(Send node) { |
| - // TODO(johnniwinther): Remove the need for handling this node. |
| - return types.dynamicType; |
| - } |
| - |
| @override |
| void previsitDeferredAccess(Send node, PrefixElement prefix, _) { |
| // Deferred access does not affect inference. |
| @@ -839,6 +874,30 @@ abstract class InferrerVisitor |
| return types.dynamicType; |
| } |
| + |
| + @override |
| + T bulkHandleNode(Node node, String message, _) { |
| + return internalError(node, message.replaceAll('#', '$node')); |
| + } |
| + |
| + @override |
|
Johnni Winther
2015/08/21 10:55:12
These are not used, yet.
|
| + T visitConstantGet( |
| + Send node, |
| + ConstantExpression constant, |
| + _) { |
| + return bulkHandleNode(node, "Constant read `#` unhandled.", _); |
| + } |
| + |
| + @override |
| + T visitConstantInvoke( |
| + Send node, |
| + ConstantExpression constant, |
| + NodeList arguments, |
| + CallStructure callStructure, |
| + _) { |
| + return bulkHandleNode(node, "Constant invoke `#` unhandled.", _); |
| + } |
| + |
| T visitClassTypeLiteralGet( |
| Send node, |
| ConstantExpression constant, |
| @@ -928,6 +987,11 @@ abstract class InferrerVisitor |
| outermostElement.enclosingClass.superclass); |
| } |
| + @override |
| + T visitThisGet(Identifier node, _) { |
| + return thisType; |
| + } |
| + |
| T visitIdentifier(Identifier node) { |
| if (node.isThis()) { |
| return thisType; |