Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1070)

Unified Diff: pkg/compiler/lib/src/inferrer/builder.dart

Issue 2955353002: Split inference type-info accessors into members, parameters and local functions (Closed)
Patch Set: Updated cf. comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/elements/modelx.dart ('k') | pkg/compiler/lib/src/inferrer/builder_kernel.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/inferrer/builder.dart
diff --git a/pkg/compiler/lib/src/inferrer/builder.dart b/pkg/compiler/lib/src/inferrer/builder.dart
index 086354f39e946a2b7403a094fc9028172822dd71..41de26471bc0bb92e18d3688c47dce9ebb313144 100644
--- a/pkg/compiler/lib/src/inferrer/builder.dart
+++ b/pkg/compiler/lib/src/inferrer/builder.dart
@@ -102,7 +102,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
new LocalsHandler(inferrer, types, compiler.options, node, fieldScope);
}
- ElementGraphBuilder(Element element, ResolvedAst resolvedAst,
+ ElementGraphBuilder(AstElement element, ResolvedAst resolvedAst,
Compiler compiler, InferrerEngine inferrer, [LocalsHandler handler])
: this.internal(
element,
@@ -891,7 +891,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
}
void analyzeSuperConstructorCall(
- AstElement target, ArgumentsTypes arguments) {
+ ConstructorElement target, ArgumentsTypes arguments) {
ResolvedAst resolvedAst = target.resolvedAst;
inferrer.analyze(resolvedAst, arguments);
isThisExposed = isThisExposed || inferrer.checkIfExposesThis(target);
@@ -944,7 +944,8 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
ElementGraphBuilder visitor = this;
if (inferrer.hasAlreadyComputedTypeOfParameterDefault(element)) return;
if (element.functionDeclaration != analyzedElement) {
- visitor = new ElementGraphBuilder(element.functionDeclaration,
+ ConstructorElement constructor = element.functionDeclaration;
+ visitor = new ElementGraphBuilder(constructor,
element.functionDeclaration.resolvedAst, compiler, inferrer);
}
TypeInformation type =
@@ -962,15 +963,15 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
isThisExposed = false;
signature.forEachParameter((FormalElement _element) {
ParameterElement element = _element;
- TypeInformation parameterType = inferrer.typeOfElement(element);
+ TypeInformation parameterType = inferrer.typeOfParameter(element);
if (element.isInitializingFormal) {
InitializingFormalElement initializingFormal = element;
if (initializingFormal.fieldElement.isFinal) {
- inferrer.recordTypeOfFinalField(node, analyzedElement,
+ inferrer.recordTypeOfFinalField(
initializingFormal.fieldElement, parameterType);
} else {
locals.updateField(initializingFormal.fieldElement, parameterType);
- inferrer.recordTypeOfNonFinalField(initializingFormal.node,
+ inferrer.recordTypeOfNonFinalField(
initializingFormal.fieldElement, parameterType);
}
}
@@ -1006,7 +1007,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
ConstructorElement target = cls.superclass.lookupDefaultConstructor();
ArgumentsTypes arguments = new ArgumentsTypes([], {});
analyzeSuperConstructorCall(target, arguments);
- inferrer.registerCalledElement(node, null, null, outermostElement,
+ inferrer.registerCalledMember(node, null, null, outermostElement,
target.implementation, arguments, sideEffects, inLoop);
}
visit(node.body);
@@ -1020,8 +1021,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
TypeInformation type = locals.fieldScope.readField(field);
ResolvedAst resolvedAst = field.resolvedAst;
if (type == null && resolvedAst.body == null) {
- inferrer.recordTypeOfNonFinalField(
- spannable, field, types.nullType);
+ inferrer.recordTypeOfNonFinalField(field, types.nullType);
}
});
}
@@ -1039,7 +1039,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
} else {
signature.forEachParameter((FormalElement _element) {
ParameterElement element = _element;
- locals.update(element, inferrer.typeOfElement(element), node);
+ locals.update(element, inferrer.typeOfParameter(element), node);
});
visit(node.body);
switch (function.asyncMarker) {
@@ -1052,26 +1052,22 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
} else if (!locals.seenReturnOrThrow) {
// We haven'TypeInformation seen returns on all branches. So the method may
// also return null.
- returnType = inferrer.addReturnTypeFor(
- analyzedElement, returnType, types.nullType);
+ recordReturnType(types.nullType);
}
break;
case AsyncMarker.SYNC_STAR:
// TODO(asgerf): Maybe make a ContainerTypeMask for these? The type
// contained is the method body's return type.
- returnType = inferrer.addReturnTypeFor(
- analyzedElement, returnType, types.syncStarIterableType);
+ recordReturnType(types.syncStarIterableType);
break;
case AsyncMarker.ASYNC:
- returnType = inferrer.addReturnTypeFor(
- analyzedElement, returnType, types.asyncFutureType);
+ recordReturnType(types.asyncFutureType);
break;
case AsyncMarker.ASYNC_STAR:
- returnType = inferrer.addReturnTypeFor(
- analyzedElement, returnType, types.asyncStarStreamType);
+ recordReturnType(types.asyncStarStreamType);
break;
}
}
@@ -1098,7 +1094,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
ElementGraphBuilder visitor = new ElementGraphBuilder(
element, element.resolvedAst, compiler, inferrer, closureLocals);
visitor.run();
- inferrer.recordReturnType(element, visitor.returnType);
+ inferrer.recordReturnTypeOfLocalFunction(element, visitor.returnType);
// Record the types of captured non-boxed variables. Types of
// these variables may already be there, because of an analysis of
@@ -1109,11 +1105,11 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
nestedClosureData.forEachCapturedVariable((variable, field) {
if (!nestedClosureData.isVariableBoxed(variable)) {
if (variable == nestedClosureData.thisLocal) {
- inferrer.recordType(field, thisType);
+ inferrer.recordTypeOfField(field, thisType);
}
// The type is null for type parameters.
if (locals.locals[variable] == null) return;
- inferrer.recordType(field, locals.locals[variable]);
+ inferrer.recordTypeOfField(field, locals.locals[variable]);
}
capturedVariables.add(variable);
});
@@ -1210,8 +1206,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
// If the field is being used before this constructor
// actually had a chance to initialize it, say it can be
// null.
- inferrer.recordTypeOfNonFinalField(
- resolvedAst.node, element, types.nullType);
+ inferrer.recordTypeOfNonFinalField(element, types.nullType);
}
// Accessing a field does not expose [:this:].
return true;
@@ -1996,14 +1991,13 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
node, setterSelector, setterMask, receiverType, arguments);
} else if (element.isField) {
if (element.isFinal) {
- inferrer.recordTypeOfFinalField(
- node, outermostElement, element, rhsType);
+ inferrer.recordTypeOfFinalField(element, rhsType);
} else {
if (analyzedElement.isGenerativeConstructor) {
locals.updateField(element, rhsType);
}
if (visitingInitializers) {
- inferrer.recordTypeOfNonFinalField(node, element, rhsType);
+ inferrer.recordTypeOfNonFinalField(element, rhsType);
} else {
handleDynamicSend(
node, setterSelector, setterMask, receiverType, arguments);
@@ -2044,7 +2038,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
/// Handle a .call invocation on the values retrieved from the super
/// [element]. For instance `super.foo(bar)` where `foo` is a field or getter.
TypeInformation handleSuperClosureCall(
- ast.Send node, Element element, ast.NodeList arguments) {
+ ast.Send node, MemberElement element, ast.NodeList arguments) {
ArgumentsTypes argumentTypes = analyzeArguments(arguments.nodes);
Selector selector = elements.getSelector(node);
TypeMask mask = inTreeData.typeOfSend(node);
@@ -2055,7 +2049,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
node,
selector,
mask,
- inferrer.typeOfElement(element),
+ inferrer.typeOfMember(element),
outermostElement,
argumentTypes,
sideEffects,
@@ -2354,8 +2348,8 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
} else if (Elements.isConstructorOfTypedArraySubclass(
constructor, closedWorld)) {
int length = findLength(node);
- TypeInformation elementType = inferrer
- .returnTypeOfElement(target.enclosingClass.lookupMember('[]'));
+ TypeInformation elementType =
+ inferrer.returnTypeOfMember(target.enclosingClass.lookupMember('[]'));
return inferrer.concreteTypes.putIfAbsent(
node,
() => types.allocateList(types.nonNullExact(target.enclosingClass),
@@ -2384,7 +2378,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
/// Handle invocation of a top level or static field or getter [element].
TypeInformation handleStaticFieldOrGetterInvoke(
- ast.Send node, Element element) {
+ ast.Send node, MemberElement element) {
ArgumentsTypes arguments = analyzeArguments(node.arguments);
Selector selector = elements.getSelector(node);
TypeMask mask = inTreeData.typeOfSend(node);
@@ -2393,7 +2387,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
node,
selector,
mask,
- inferrer.typeOfElement(element),
+ inferrer.typeOfMember(element),
outermostElement,
arguments,
sideEffects,
@@ -2706,7 +2700,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
// This only works for function statements. We need a
// more sophisticated type system with function types to support
// more.
- return inferrer.registerCalledElement(node, selector, mask,
+ return inferrer.registerCalledLocalFunction(node, selector, mask,
outermostElement, function, argumentTypes, sideEffects, inLoop);
}
@@ -2722,7 +2716,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
}
TypeInformation handleStaticSend(ast.Node node, Selector selector,
- TypeMask mask, Element element, ArgumentsTypes arguments) {
+ TypeMask mask, MemberElement element, ArgumentsTypes arguments) {
assert(!element.isFactoryConstructor ||
!(element as ConstructorElement).isRedirectingFactory);
// Erroneous elements may be unresolved, for example missing getters.
@@ -2730,8 +2724,8 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
// TODO(herhut): should we follow redirecting constructors here? We would
// need to pay attention if the constructor is pointing to an erroneous
// element.
- return inferrer.registerCalledElement(node, selector, mask,
- outermostElement, element, arguments, sideEffects, inLoop);
+ return inferrer.registerCalledMember(node, selector, mask, outermostElement,
+ element, arguments, sideEffects, inLoop);
}
TypeInformation handleDynamicSend(ast.Node node, Selector selector,
@@ -2808,7 +2802,13 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
}
void recordReturnType(TypeInformation type) {
- returnType = inferrer.addReturnTypeFor(analyzedElement, returnType, type);
+ if (analyzedElement.isLocal) {
+ returnType = inferrer.addReturnTypeForLocalFunction(
+ analyzedElement, returnType, type);
+ } else {
+ returnType =
+ inferrer.addReturnTypeForMethod(analyzedElement, returnType, type);
+ }
}
TypeInformation synthesizeForwardingCall(
@@ -2843,7 +2843,7 @@ class ElementGraphBuilder extends ast.Visitor<TypeInformation>
}
ArgumentsTypes arguments = new ArgumentsTypes(unnamed, named);
- return inferrer.registerCalledElement(node, null, null, outermostElement,
+ return inferrer.registerCalledMember(node, null, null, outermostElement,
element, arguments, sideEffects, inLoop);
}
« no previous file with comments | « pkg/compiler/lib/src/elements/modelx.dart ('k') | pkg/compiler/lib/src/inferrer/builder_kernel.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698