Klasse InferenceContext18

java.lang.Object
org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18

public class InferenceContext18 extends Object
Main class for new type inference as per JLS8 sect 18. Keeps contextual state and drives the algorithm.

Inference Basics

  • 18.1.1 Inference variables: InferenceVariable
  • 18.1.2 Constraint Formulas: subclasses of ConstraintFormula
  • 18.1.3 Bounds: TypeBound
    Capture bounds are directly captured in BoundSet.captures, throws-bounds in BoundSet.inThrows.
    Also: BoundSet: main state during inference.
Each instance of InferenceContext18 manages instances of the above and coordinates the inference process.

Queries and utilities

  • 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.

Phases of Inference

  • 18.2 Reduction: reduce() with most work happening in implementations of ConstraintFormula.reduce(InferenceContext18):
    • 18.2.1 Expression Compatibility Constraints: ConstraintFormula.reduce(InferenceContext18).
    • 18.2.2 Type Compatibility Constraints ff. ConstraintFormula.reduce(InferenceContext18).
  • 18.3 Incorporation: BoundSet.incorporate(InferenceContext18); during inference new constraints are accepted via BoundSet.reduceOneConstraint(InferenceContext18, ConstraintFormula) (combining 18.2 Ungültige Eingabe: "&" 18.3)
  • 18.4 Resolution: resolve(InferenceVariable[]).
Some of the above operations accumulate their results into currentBounds, whereas the last phase returns the resulting bound set while keeping the previous state in currentBounds.

18.5. Uses of Inference

These are the main entries from the compiler into the inference engine:
18.5.1 Invocation Applicability Inference
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(boolean) with true afterwards to produce the intermediate result.
Called indirectly from Scope.findMethod(ReferenceBinding, char[], TypeBinding[], InvocationSite, boolean) et al to select applicable methods into overload resolution.
18.5.2 Invocation Type Inference
inferInvocationType(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.
18.5.3 Functional Interface Parameterization Inference
Controlled from FunctionalExpression.resolveType(BlockScope).
18.5.4 More Specific Method Inference
Not Yet Implemented
For 18.5.1 and 18.5.2 high-level control is implemented in ParameterizedGenericMethodBinding.computeCompatibleMethod(MethodBinding, TypeBinding[], Scope, InvocationSite).

Inference Lifecycle

  • Decision whether or not an invocation is a variable-arity invocation is made by first attempting to solve 18.5.1 in mode 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.
    • Felddetails

      • DEBUG

        public static final boolean DEBUG
        Siehe auch:
      • stepCompleted

        public int stepCompleted
        Marks how much work has been done so far? Used to avoid performing any of these tasks more than once.
      • NOT_INFERRED

        public static final int NOT_INFERRED
        Siehe auch:
      • APPLICABILITY_INFERRED

        public static final int APPLICABILITY_INFERRED
        Applicability Inference (18.5.1) has been completed.
        Siehe auch:
      • TYPE_INFERRED

        public static final int TYPE_INFERRED
        Invocation Type Inference (18.5.2) has been completed (for some target type).
        Siehe auch:
      • TYPE_INFERRED_FINAL

        public static final int TYPE_INFERRED_FINAL
        Siehe auch:
      • constraintsWithUncheckedConversion

        public List<org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ConstraintFormula> constraintsWithUncheckedConversion
        Signals whether any type compatibility makes use of unchecked conversion.
      • usesUncheckedConversion

        public boolean usesUncheckedConversion
      • outerContext

        public InferenceContext18 outerContext
      • b2

        public org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BoundSet b2
      • CHECK_UNKNOWN

        public static final int CHECK_UNKNOWN
        Siehe auch:
      • CHECK_STRICT

        public static final int CHECK_STRICT
        Siehe auch:
      • CHECK_LOOSE

        public static final int CHECK_LOOSE
        Siehe auch:
      • CHECK_VARARG

        public static final int CHECK_VARARG
        Siehe auch:
    • Konstruktordetails

      • InferenceContext18

        public InferenceContext18(Scope scope, Expression[] arguments, InvocationSite site, InferenceContext18 outerContext)
        Construct an inference context for an invocation (method/constructor).
      • InferenceContext18

        public InferenceContext18(Scope scope)
    • Methodendetails

      • isSameSite

        public static boolean isSameSite(InvocationSite site1, InvocationSite site2)
      • createInitialBoundSet

        public InferenceVariable[] createInitialBoundSet(TypeVariableBinding[] typeParameters)
        JLS 18.1.3: Create initial bounds from a given set of type parameters declarations.
        Gibt zurück:
        the set of inference variables created for the given typeParameters
      • substitute

        public TypeBinding substitute(TypeBinding type)
        Substitute any type variables mentioned in 'type' by the corresponding inference variable, if one exists.
      • createInitialConstraintsForParameters

        public void createInitialConstraintsForParameters(TypeBinding[] parameters, boolean checkVararg, TypeBinding varArgsType, MethodBinding method)
        JLS 18.5.1: compute bounds from formal and actual parameters.
      • addTypeVariableSubstitutions

        public InferenceVariable[] addTypeVariableSubstitutions(TypeBinding[] typeArguments, boolean capturesOnly)
        Add new inference variables for the given type arguments. CAVEAT: when passing capturesOnly as true, then the result array may contain nulls!
      • addThrowsContraints

        public void addThrowsContraints(TypeBinding[] parameters, InferenceVariable[] variables, ReferenceBinding[] thrownExceptions)
        JLS 18.1.3 Bounds: throws α: the inference variable α appears in a throws clause
      • inferInvocationApplicability

        public void inferInvocationApplicability(MethodBinding method, TypeBinding[] arguments, boolean isDiamond)
        JLS 18.5.1 Invocation Applicability Inference.
      • inferInvocationType

        public org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BoundSet inferInvocationType(TypeBinding expectedType, InvocationSite invocationSite, MethodBinding method) throws InferenceFailureException
        JLS 18.5.2 Invocation Type Inference
        Löst aus:
        InferenceFailureException
      • pushBoundsTo

        public void pushBoundsTo(InferenceContext18 outer)
        Not per JLS: invent more bubbling up of inner bounds.
      • flushBoundOutbox

        public void flushBoundOutbox()
        Not JLS: after overload resolution is done, perform the push of type bounds to outer inference, if any.
      • getInferenceKind

        protected int getInferenceKind(MethodBinding nonGenericMethod, TypeBinding[] argumentTypes)
      • inferFunctionalInterfaceParameterization

        public ReferenceBinding inferFunctionalInterfaceParameterization(LambdaExpression lambda, BlockScope blockScope, ParameterizedTypeBinding targetTypeWithWildCards)
        18.5.3 Functional Interface Parameterization Inference
      • reduceWithEqualityConstraints

        public boolean reduceWithEqualityConstraints(TypeBinding[] p, TypeBinding[] q)
        from 18.5.3: Otherwise, a set of constraint formulas is formed with, for all i (1 ≤ i ≤ n), ‹Pi = Qi›. This constraint formula set is reduced to form the bound set B.
      • isMoreSpecificThan

        public boolean isMoreSpecificThan(MethodBinding m1, MethodBinding m2, boolean isVarArgs, boolean isVarArgs2)
        18.5.4 More Specific Method Inference
      • solve

        public org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BoundSet solve(boolean inferringApplicability) throws InferenceFailureException
        Try to solve the inference problem defined by constraints and bounds previously registered.
        Gibt zurück:
        a bound set representing the solution, or null if inference failed
        Löst aus:
        InferenceFailureException - a compile error has been detected during inference
      • solve

        public org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BoundSet solve() throws InferenceFailureException
        Löst aus:
        InferenceFailureException
      • solve

        public org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BoundSet solve(InferenceVariable[] toResolve, boolean isRecordPatternTypeInference) throws InferenceFailureException
        Löst aus:
        InferenceFailureException
      • isResolved

        public boolean isResolved(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BoundSet boundSet)
        Have all inference variables been instantiated successfully?
      • getSolutions

        public TypeBinding[] getSolutions(TypeVariableBinding[] typeParameters, InvocationSite site, org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BoundSet boundSet)
        Retrieve the resolved solutions for all given type variables.
        Parameter:
        typeParameters -
        boundSet - where instantiations are to be found
        Gibt zurück:
        array containing the substituted types or null elements for any type variable that could not be substituted.
      • reduceAndIncorporate

        public boolean reduceAndIncorporate(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ConstraintFormula constraint) throws InferenceFailureException
        When inference produces a new constraint, reduce it to a suitable type bound and add the latter to the bound set.
        Löst aus:
        InferenceFailureException
      • enterPolyInvocation

        public org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord enterPolyInvocation(InvocationSite invocation, Expression[] innerArguments)
      • enterLambda

        public org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord enterLambda(LambdaExpression lambda)
      • integrateInnerInferenceB2

        public void integrateInnerInferenceB2(InferenceContext18 innerCtx)
      • resumeSuspendedInference

        public void resumeSuspendedInference(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InferenceContext18.SuspendedInferenceRecord record, InferenceContext18 innerContext)
      • isVarArgs

        public boolean isVarArgs()
      • getParameter

        public static TypeBinding getParameter(TypeBinding[] parameters, int rank, boolean isVarArgs)
        Retrieve the rank'th parameter, possibly respecting varargs invocation, see 15.12.2.4. Returns null if out of bounds and CHECK_VARARG was not requested. Precondition: isVarArgs implies method.isVarargs()
      • getReturnProblemMethodIfNeeded

        public 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.
      • toString

        public String toString()
        Setzt außer Kraft:
        toString in Klasse Object
      • parameterizedWithWildcard

        public 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. A nonnull answer is ensured to also have nonnull arguments.
      • getFunctionInterfaceArgumentSolutions

        public TypeBinding[] getFunctionInterfaceArgumentSolutions(TypeBinding[] a)
        From 18.5.3:
        • If B contains an instantiation (§18.1.3) for αi, T, then A'i = T.
        • Otherwise, A'i = Ai.
      • recordUncheckedConversion

        public void recordUncheckedConversion(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ConstraintTypeFormula constraint)
        Record the fact that the given constraint requires unchecked conversion.
      • usesUncheckedConversion

        public boolean usesUncheckedConversion()
        For use by 15.12.2.6 Method Invocation Type
      • missingImplementation

        public static void missingImplementation(String msg)
      • forwardResults

        public void forwardResults(org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BoundSet result, Invocation invocation, ParameterizedMethodBinding pmb, TypeBinding targetType)
      • updateInnerDiamonds

        public static void updateInnerDiamonds(ParameterizedMethodBinding pmb, Expression[] arguments)
      • cleanUp

        public void cleanUp()
      • inferRecordPatternParameterization

        public ReferenceBinding inferRecordPatternParameterization(RecordPattern recordPattern, BlockScope scope2, TypeBinding candidateT)
      • isInexactVarargsInference

        public boolean isInexactVarargsInference()
      • setInexactVarargsInference

        public void setInexactVarargsInference(boolean isInexactVarargsInference)
      • hasPrematureOverloadResolution

        public boolean hasPrematureOverloadResolution()