public class InferenceContext18 extends Object
InferenceVariableConstraintFormulaTypeBoundBoundSet.captures, throws-bounds in BoundSet.inThrows.BoundSet: main state during inference.InferenceContext18 manages instances of the above and coordinates the inference process.
TypeBinding.isProperType(boolean):
used to exclude "types" that mention inference variables (18.1.1).TypeBinding.mentionsAny(TypeBinding[], int):
does the receiver type binding mention any of the given types?TypeBinding.substituteInferenceVariable(InferenceVariable, TypeBinding):
replace occurrences of an inference variable with a proper type.TypeBinding.collectInferenceVariables(Set):
collect all inference variables mentioned in the receiver type into the given set.TypeVariableBinding.getTypeBounds(InferenceVariable, InferenceSubstitution):
Compute the initial type bounds for one inference variable as per JLS8 sect 18.1.3.reduce() with most work happening in implementations of
ConstraintFormula.reduce(InferenceContext18):
ConstraintExpressionFormula.reduce(InferenceContext18).ConstraintTypeFormula.reduce(InferenceContext18).BoundSet.incorporate(InferenceContext18); during inference new constraints
are accepted via BoundSet.reduceOneConstraint(InferenceContext18, ConstraintFormula) (combining 18.2 & 18.3)resolve(InferenceVariable[]).
currentBounds, whereas
the last phase returns the resulting bound set while keeping the previous state in currentBounds.
inferInvocationApplicability(MethodBinding, TypeBinding[], boolean). Prepare the initial state for
inference of a generic invocation - no target type used at this point.
Need to call solve() afterwards to produce the intermediate result.Scope.findMethod(ReferenceBinding, char[], TypeBinding[], InvocationSite, boolean) et al
to select applicable methods into overload resolution.inferInvocationType(BoundSet, TypeBinding, InvocationSite, MethodBinding). After a
most specific method has been picked, and given a target type determine the final generic instantiation.
As long as a target type is still unavailable this phase keeps getting deferred.
Different wrappers exist for the convenience of different callers.LambdaExpression.resolveType(BlockScope).ParameterizedGenericMethodBinding.computeCompatibleMethod(MethodBinding, TypeBinding[], Scope, InvocationSite, int).
PGMB#computeCompatibleMethod() for the basic protocol.Invocation x ParameterizedGenericMethodBinding,
see Invocation.registerInferenceContext() and
getInferenceContext().inferenceKind
and stepCompleted.currentBounds, see block inside ConstraintExpressionFormula.reduce(InferenceContext18).rebindInnerPolies(BoundSet, TypeBinding[]), which must be called whenever
18.5.2 finishes.Expression.checkAgainstFinalTargetType(TypeBinding, Scope), which, too, is called from
rebindInnerPolies(BoundSet, TypeBinding[]).ASTNode.resolvePolyExpressionArguments(Invocation, MethodBinding, TypeBinding[], Scope) exists,
which is called in two situations: (1) for non-generic outer invocations from MessageSend#findMethodBinding() and
Statement#findConstructorBinding(); (2) for generic outer invocations from rebindInnerPolies(BoundSet, TypeBinding[]).Scope.parameterCompatibilityLevel18(org.eclipse.jdt.internal.compiler.lookup.MethodBinding, org.eclipse.jdt.internal.compiler.lookup.TypeBinding[], boolean, org.eclipse.jdt.internal.compiler.lookup.InvocationSite) (where the outer invocation did not involve any inference).Invocation.updateBindings(MethodBinding,TypeBinding).CHECK_LOOSE. Only if that fails, another attempt is made in mode CHECK_VARARG.
Which of these two attempts was successful is stored in inferenceKind.
This field must be consulted whenever arguments of an invocation should be further processed.
See also getParameter(TypeBinding[], int, boolean) and its clients.| Modifier and Type | Field and Description |
|---|---|
static int |
APPLICABILITY_INFERRED
Applicability Inference (18.5.1) has been completed.
|
static int |
BINDINGS_UPDATED
All nested elements have been fully resolved.
|
static int |
CHECK_LOOSE |
static int |
CHECK_STRICT |
static int |
CHECK_VARARG |
List<org.eclipse.jdt.internal.compiler.lookup.ConstraintFormula> |
constraintsWithUncheckedConversion
Signals whether any type compatibility makes use of unchecked conversion.
|
static int |
NOT_INFERRED |
InferenceContext18 |
outerContext
Link to an outer inference context, used for bundled error reporting.
|
int |
stepCompleted
Marks how much work has been done so far? Used to avoid performing any of these tasks more than once.
|
static int |
TYPE_INFERRED
Invocation Type Inference (18.5.2) has been completed (for some target type).
|
| Constructor and Description |
|---|
InferenceContext18(Scope scope) |
InferenceContext18(Scope scope,
Expression[] arguments,
InvocationSite site)
Construct an inference context for an invocation (method/constructor).
|
| Modifier and Type | Method and Description |
|---|---|
void |
addProblemMethod(ProblemMethodBinding problemMethod) |
void |
addThrowsContraints(TypeBinding[] parameters,
InferenceVariable[] variables,
ReferenceBinding[] thrownExceptions)
JLS 18.1.3 Bounds: throws α: the inference variable α appears in a throws clause
|
InferenceVariable[] |
addTypeVariableSubstitutions(TypeBinding[] typeVariables)
Add new inference variables for the given type variables.
|
InferenceVariable[] |
createInitialBoundSet(TypeVariableBinding[] typeParameters)
JLS 18.1.3: Create initial bounds from a given set of type parameters declarations.
|
void |
createInitialConstraintsForParameters(TypeBinding[] parameters,
boolean checkVararg,
TypeBinding varArgsType,
MethodBinding method)
JLS 18.5.1: compute bounds from formal and actual parameters.
|
org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord |
enterLambda(LambdaExpression lambda) |
org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord |
enterPolyInvocation(InvocationSite invocation,
Expression[] innerArguments) |
TypeBinding[] |
getFunctionInterfaceArgumentSolutions(TypeBinding[] a) |
static TypeBinding |
getParameter(TypeBinding[] parameters,
int rank,
boolean isVarArgs)
Retrieve the rank'th parameter, possibly respecting varargs invocation, see 15.12.2.4.
|
MethodBinding |
getReturnProblemMethodIfNeeded(TypeBinding expectedType,
MethodBinding method)
Create a problem method signaling failure of invocation type inference,
unless the given candidate is tolerable to be compatible with buggy javac.
|
TypeBinding[] |
getSolutions(TypeVariableBinding[] typeParameters,
InvocationSite site,
org.eclipse.jdt.internal.compiler.lookup.BoundSet boundSet)
Retrieve the resolved solutions for all given type variables.
|
boolean |
hasResultFor(TypeBinding targetType) |
ReferenceBinding |
inferFunctionalInterfaceParameterization(LambdaExpression lambda,
BlockScope blockScope,
ParameterizedTypeBinding targetTypeWithWildCards)
18.5.3 Functional Interface Parameterization Inference
|
void |
inferInvocationApplicability(MethodBinding method,
TypeBinding[] arguments,
boolean isDiamond)
JLS 18.5.1 Invocation Applicability Inference.
|
org.eclipse.jdt.internal.compiler.lookup.BoundSet |
inferInvocationType(org.eclipse.jdt.internal.compiler.lookup.BoundSet b1,
TypeBinding expectedType,
InvocationSite invocationSite,
MethodBinding method)
JLS 18.5.2 Invocation Type Inference
|
MethodBinding |
inferInvocationType(Invocation invocation,
ParameterizedGenericMethodBinding method)
Simplified API to perform Invocation Type Inference (JLS 18.5.2)
and perform subsequent steps: bound check, rebinding of inner poly expressions,
and creating of a problem method binding if needed.
|
boolean |
isMoreSpecificThan(MethodBinding m1,
MethodBinding m2,
boolean isVarArgs,
boolean isVarArgs2)
18.5.4 More Specific Method Inference
|
boolean |
isResolved(org.eclipse.jdt.internal.compiler.lookup.BoundSet boundSet)
Have all inference variables been instantiated successfully?
|
boolean |
isVarArgs() |
static void |
missingImplementation(String msg) |
static ParameterizedTypeBinding |
parameterizedWithWildcard(TypeBinding type)
If 'type' is a parameterized type and one of its arguments is a wildcard answer the casted type, else null.
|
void |
rebindInnerPolies(org.eclipse.jdt.internal.compiler.lookup.BoundSet bounds,
TypeBinding[] parameterTypes)
After inference has finished, iterate all inner poly expressions (Invocations), that
have been included in the inference.
|
boolean |
rebindInnerPolies(MethodBinding method,
InvocationSite site) |
void |
recordUncheckedConversion(org.eclipse.jdt.internal.compiler.lookup.ConstraintTypeFormula constraint)
Record the fact that the given constraint requires unchecked conversion.
|
boolean |
reduceAndIncorporate(org.eclipse.jdt.internal.compiler.lookup.ConstraintFormula constraint)
When inference produces a new constraint, reduce it to a suitable type bound and add the latter to the bound set.
|
boolean |
reduceWithEqualityConstraints(TypeBinding[] p,
TypeBinding[] q) |
boolean |
registerSolution(TypeBinding targetType,
MethodBinding updatedBinding) |
void |
reportInvalidInvocation(Invocation invocation,
MethodBinding binding) |
void |
resumeSuspendedInference(org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord record) |
org.eclipse.jdt.internal.compiler.lookup.BoundSet |
solve()
Try to solve the inference problem defined by constraints and bounds previously registered.
|
org.eclipse.jdt.internal.compiler.lookup.BoundSet |
solve(InferenceVariable[] toResolve) |
TypeBinding |
substitute(TypeBinding type)
Substitute any type variables mentioned in 'type' by the corresponding inference variable, if one exists.
|
String |
toString() |
boolean |
usesUncheckedConversion()
For use by 15.12.2.6 Method Invocation Type
|
public int stepCompleted
public static final int NOT_INFERRED
public static final int APPLICABILITY_INFERRED
public static final int TYPE_INFERRED
public static final int BINDINGS_UPDATED
public List<org.eclipse.jdt.internal.compiler.lookup.ConstraintFormula> constraintsWithUncheckedConversion
public InferenceContext18 outerContext
public static final int CHECK_STRICT
public static final int CHECK_LOOSE
public static final int CHECK_VARARG
public InferenceContext18(Scope scope, Expression[] arguments, InvocationSite site)
public InferenceContext18(Scope scope)
public InferenceVariable[] createInitialBoundSet(TypeVariableBinding[] typeParameters)
public TypeBinding substitute(TypeBinding type)
public void createInitialConstraintsForParameters(TypeBinding[] parameters, boolean checkVararg, TypeBinding varArgsType, MethodBinding method)
public InferenceVariable[] addTypeVariableSubstitutions(TypeBinding[] typeVariables)
public void addThrowsContraints(TypeBinding[] parameters, InferenceVariable[] variables, ReferenceBinding[] thrownExceptions)
public void inferInvocationApplicability(MethodBinding method, TypeBinding[] arguments, boolean isDiamond)
public org.eclipse.jdt.internal.compiler.lookup.BoundSet inferInvocationType(org.eclipse.jdt.internal.compiler.lookup.BoundSet b1,
TypeBinding expectedType,
InvocationSite invocationSite,
MethodBinding method)
throws InferenceFailureException
Callers are responsible for any post-processing (see rebindInnerPolies(BoundSet, TypeBinding[])).
b1 - "the bound set produced by reduction in order to demonstrate that m is applicable in 18.5.1"InferenceFailureExceptionpublic MethodBinding inferInvocationType(Invocation invocation, ParameterizedGenericMethodBinding method)
invocation - invocation being inferredmethod - current candidate method binding for this invocationpublic boolean hasResultFor(TypeBinding targetType)
public boolean registerSolution(TypeBinding targetType, MethodBinding updatedBinding)
public ReferenceBinding inferFunctionalInterfaceParameterization(LambdaExpression lambda, BlockScope blockScope, ParameterizedTypeBinding targetTypeWithWildCards)
public boolean reduceWithEqualityConstraints(TypeBinding[] p, TypeBinding[] q)
public boolean isMoreSpecificThan(MethodBinding m1, MethodBinding m2, boolean isVarArgs, boolean isVarArgs2)
public org.eclipse.jdt.internal.compiler.lookup.BoundSet solve()
throws InferenceFailureException
InferenceFailureException - a compile error has been detected during inferencepublic org.eclipse.jdt.internal.compiler.lookup.BoundSet solve(InferenceVariable[] toResolve) throws InferenceFailureException
InferenceFailureExceptionpublic boolean isResolved(org.eclipse.jdt.internal.compiler.lookup.BoundSet boundSet)
public TypeBinding[] getSolutions(TypeVariableBinding[] typeParameters, InvocationSite site, org.eclipse.jdt.internal.compiler.lookup.BoundSet boundSet)
typeParameters - boundSet - where instantiations are to be foundnull elements for any type variable that could not be substituted.public boolean reduceAndIncorporate(org.eclipse.jdt.internal.compiler.lookup.ConstraintFormula constraint)
throws InferenceFailureException
InferenceFailureExceptionpublic org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord enterPolyInvocation(InvocationSite invocation, Expression[] innerArguments)
public org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord enterLambda(LambdaExpression lambda)
public void resumeSuspendedInference(org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord record)
public boolean rebindInnerPolies(MethodBinding method, InvocationSite site)
public void rebindInnerPolies(org.eclipse.jdt.internal.compiler.lookup.BoundSet bounds,
TypeBinding[] parameterTypes)
public boolean isVarArgs()
public static TypeBinding getParameter(TypeBinding[] parameters, int rank, boolean isVarArgs)
public MethodBinding getReturnProblemMethodIfNeeded(TypeBinding expectedType, MethodBinding method)
public void reportInvalidInvocation(Invocation invocation, MethodBinding binding)
public void addProblemMethod(ProblemMethodBinding problemMethod)
public static ParameterizedTypeBinding parameterizedWithWildcard(TypeBinding type)
public TypeBinding[] getFunctionInterfaceArgumentSolutions(TypeBinding[] a)
public void recordUncheckedConversion(org.eclipse.jdt.internal.compiler.lookup.ConstraintTypeFormula constraint)
public boolean usesUncheckedConversion()
public static void missingImplementation(String msg)
Copyright © 2015. All rights reserved.