Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java')
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java142
1 files changed, 71 insertions, 71 deletions
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java
index 8ae0a05c3..05f223526 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java
@@ -42,7 +42,7 @@ import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.ITeamAnchor;
/**
* Main class for new type inference as per JLS8 sect 18.
* Keeps contextual state and drives the algorithm.
- *
+ *
* <h2>Inference Basics</h2>
* <ul>
* <li>18.1.1 Inference variables: {@link InferenceVariable}</li>
@@ -112,14 +112,14 @@ public class InferenceContext18 {
/** to conform with javac regarding https://bugs.openjdk.java.net/browse/JDK-8026527 */
static final boolean SIMULATE_BUG_JDK_8026527 = true;
-
- /** Temporary workaround until we know fully what to do with https://bugs.openjdk.java.net/browse/JDK-8054721
+
+ /** Temporary workaround until we know fully what to do with https://bugs.openjdk.java.net/browse/JDK-8054721
* It looks likely that we have a bug independent of this JLS bug in that we clear the capture bounds eagerly.
*/
static final boolean SHOULD_WORKAROUND_BUG_JDK_8054721 = true; // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=437444#c24 onwards
-
+
static final boolean SHOULD_WORKAROUND_BUG_JDK_8153748 = true; // emulating javac behaviour after private email communication
-
+
/**
* Detail flag to control the extent of {@link #SIMULATE_BUG_JDK_8026527}.
* A setting of 'false' implements the advice from http://mail.openjdk.java.net/pipermail/lambda-spec-experts/2013-December/000447.html
@@ -134,7 +134,7 @@ public class InferenceContext18 {
InvocationSite currentInvocation;
/** arguments of #currentInvocation, if any */
Expression[] invocationArguments;
-
+
/** The inference variables for which as solution is sought. */
InferenceVariable[] inferenceVariables;
@@ -156,7 +156,7 @@ public class InferenceContext18 {
/** Invocation Type Inference (18.5.2) has been completed (for some target type). */
public static final int TYPE_INFERRED = 2;
public static final int TYPE_INFERRED_FINAL = 3; // as above plus asserting that target type was a proper type
-
+
/** Signals whether any type compatibility makes use of unchecked conversion. */
public List<ConstraintFormula> constraintsWithUncheckedConversion;
public boolean usesUncheckedConversion;
@@ -168,12 +168,12 @@ public class InferenceContext18 {
public BoundSet b2;
private BoundSet b3;
/** Not per JLS: inbox for emulation of how javac passes type bounds from inner to outer */
- private BoundSet innerInbox;
+ private BoundSet innerInbox;
/** Not per JLS: signal when current is ready to directly merge all bounds from inner. */
private boolean directlyAcceptingInnerBounds = false;
/** Not per JLS: pushing bounds from inner to outer may have to be deferred till after overload resolution, store here a runnable to perform the push. */
private Runnable pushToOuterJob = null;
-
+
public static boolean isSameSite(InvocationSite site1, InvocationSite site2) {
if (site1 == site2)
return true;
@@ -188,7 +188,7 @@ public class InferenceContext18 {
public static final int CHECK_STRICT = 1;
public static final int CHECK_LOOSE = 2;
public static final int CHECK_VARARG = 3;
-
+
static class SuspendedInferenceRecord {
InvocationSite site;
Expression[] invocationArguments;
@@ -203,7 +203,7 @@ public class InferenceContext18 {
this.usesUncheckedConversion = usesUncheckedConversion;
}
}
-
+
/** Construct an inference context for an invocation (method/constructor). */
public InferenceContext18(Scope scope, Expression[] arguments, InvocationSite site, InferenceContext18 outerContext) {
this.scope = scope;
@@ -227,7 +227,7 @@ public class InferenceContext18 {
* @return the set of inference variables created for the given typeParameters
*/
public InferenceVariable[] createInitialBoundSet(TypeVariableBinding[] typeParameters) {
- //
+ //
if (this.currentBounds == null) {
this.currentBounds = new BoundSet();
}
@@ -240,7 +240,7 @@ public class InferenceContext18 {
}
/**
- * Substitute any type variables mentioned in 'type' by the corresponding inference variable, if one exists.
+ * Substitute any type variables mentioned in 'type' by the corresponding inference variable, if one exists.
*/
public TypeBinding substitute(TypeBinding type) {
InferenceSubstitution inferenceSubstitution = new InferenceSubstitution(this);
@@ -369,7 +369,7 @@ public class InferenceContext18 {
break;
}
}
- }
+ }
}
/** JLS 18.5.1 Invocation Applicability Inference. */
@@ -378,8 +378,8 @@ public class InferenceContext18 {
}
/** Perform steps from JLS 18.5.2. needed for computing the bound set B3. */
- boolean computeB3(InvocationSite invocationSite, TypeBinding targetType, MethodBinding method)
- throws InferenceFailureException
+ boolean computeB3(InvocationSite invocationSite, TypeBinding targetType, MethodBinding method)
+ throws InferenceFailureException
{
boolean result = ConstraintExpressionFormula.inferPolyInvocationType(this, invocationSite, targetType, method);
if (result) {
@@ -390,16 +390,16 @@ public class InferenceContext18 {
return result;
}
- /** JLS 18.5.2 Invocation Type Inference
+ /** JLS 18.5.2 Invocation Type Inference
*/
- public BoundSet inferInvocationType(TypeBinding expectedType, InvocationSite invocationSite, MethodBinding method) throws InferenceFailureException
+ public BoundSet inferInvocationType(TypeBinding expectedType, InvocationSite invocationSite, MethodBinding method) throws InferenceFailureException
{
// not JLS: simply ensure that null hints from the return type have been seen even in standalone contexts:
if (expectedType == null && method.returnType != null)
substitute(method.returnType); // result is ignore, the only effect is on InferenceVariable.nullHints
-
+
this.currentBounds = this.b2.copy();
-
+
int step = (expectedType == null || expectedType.isProperType(true)) ? TYPE_INFERRED_FINAL : TYPE_INFERRED;
try {
@@ -407,7 +407,7 @@ public class InferenceContext18 {
if (expectedType != null
&& expectedType != TypeBinding.VOID
&& invocationSite instanceof Expression && ((Expression) invocationSite).isTrulyExpression()
- && ((Expression)invocationSite).isPolyExpression(method))
+ && ((Expression)invocationSite).isPolyExpression(method))
{
// 3. bullet: special treatment for poly expressions
if (!computeB3(invocationSite, expectedType, method)) {
@@ -458,7 +458,7 @@ public class InferenceContext18 {
// don't bother with finding the necessary superset, just resolve all:
if (solution == null)
solution = resolve(this.inferenceVariables);
- // * ~ apply substitutions to all constraints:
+ // * ~ apply substitutions to all constraints:
bottomIt = bottomSet.iterator();
while (bottomIt.hasNext()) {
ConstraintFormula constraint = bottomIt.next();
@@ -553,7 +553,7 @@ public class InferenceContext18 {
TypeBinding parameter = getParameter(method.parameters, i, method.isVarargs());
if (parameter == null)
return ReductionResult.FALSE;
- parameter = substitution.substitute(substitution, parameter);
+ parameter = substitution.substitute(substitution, parameter);
ReductionResult result = addJDK_8153748ConstraintsFromExpression(argument, parameter, method, substitution);
if (result == ReductionResult.FALSE)
return ReductionResult.FALSE;
@@ -610,7 +610,7 @@ public class InferenceContext18 {
}
return null;
}
-
+
InferenceSubstitution enrichSubstitution(InferenceSubstitution substitution, Invocation innerInvocation, MethodBinding innerMethod) {
if (innerMethod instanceof ParameterizedGenericMethodBinding) {
InferenceContext18 innerContext = innerInvocation.getInferenceContext((ParameterizedMethodBinding) innerMethod);
@@ -699,7 +699,7 @@ public class InferenceContext18 {
MethodBinding innerMethod = invocation.binding();
if (innerMethod == null)
return true; // -> proceed with no new C set elements.
-
+
Expression[] arguments = invocation.arguments();
TypeBinding[] argumentTypes = arguments == null ? Binding.NO_PARAMETERS : new TypeBinding[arguments.length];
for (int i = 0; i < argumentTypes.length; i++)
@@ -707,7 +707,7 @@ public class InferenceContext18 {
InferenceContext18 innerContext = null;
if (innerMethod instanceof ParameterizedGenericMethodBinding)
innerContext = invocation.getInferenceContext((ParameterizedGenericMethodBinding) innerMethod);
-
+
if (innerContext != null) {
MethodBinding shallowMethod = innerMethod.shallowOriginal();
innerContext.outerContext = this;
@@ -739,7 +739,7 @@ public class InferenceContext18 {
return true;
}
-
+
protected int getInferenceKind(MethodBinding nonGenericMethod, TypeBinding[] argumentTypes) {
switch (this.scope.parameterCompatibilityLevel(nonGenericMethod, argumentTypes)) {
case Scope.AUTOBOX_COMPATIBLE:
@@ -754,8 +754,8 @@ public class InferenceContext18 {
/**
* 18.5.3 Functional Interface Parameterization Inference
*/
- public ReferenceBinding inferFunctionalInterfaceParameterization(LambdaExpression lambda, BlockScope blockScope,
- ParameterizedTypeBinding targetTypeWithWildCards)
+ public ReferenceBinding inferFunctionalInterfaceParameterization(LambdaExpression lambda, BlockScope blockScope,
+ ParameterizedTypeBinding targetTypeWithWildCards)
{
TypeBinding[] q = createBoundsForFunctionalInterfaceParameterizationInference(targetTypeWithWildCards);
if (q == null || q.length != lambda.arguments().length) {
@@ -782,7 +782,7 @@ public class InferenceContext18 {
/**
* Create initial bound set for 18.5.3 Functional Interface Parameterization Inference
* @param functionalInterface the functional interface F<A1,..Am>
- * @return the parameter types Q1..Qk of the function type of the type F<α1, ..., αm>, or null
+ * @return the parameter types Q1..Qk of the function type of the type F<α1, ..., αm>, or null
*/
TypeBinding[] createBoundsForFunctionalInterfaceParameterizationInference(ParameterizedTypeBinding functionalInterface) {
if (this.currentBounds == null)
@@ -871,7 +871,7 @@ public class InferenceContext18 {
return false;
}
}
-
+
// FALSE: inference fails
// TRUE: constraints have been incorporated
// null: need to create the si <: ti constraint
@@ -895,13 +895,13 @@ public class InferenceContext18 {
for (int i = 0; i < elements.length; i++)
if (!siSuperI(elements[i], funcI))
break checkSuper;
- return null; // bullet 4
+ return null; // bullet 4
// each element of the intersection is a superinterface of I, or a parameterization of a superinterface of I.
}
for (int i = 0; i < elements.length; i++)
if (siSubI(elements[i], funcI))
return null; // bullet 5
- // some element of the intersection is a subinterface of I, or a parameterization of a subinterface of I.
+ // some element of the intersection is a subinterface of I, or a parameterization of a subinterface of I.
}
// all passed, time to do some work:
TypeBinding siCapture = si.capture(this.scope, expri.sourceStart, expri.sourceEnd);
@@ -916,7 +916,7 @@ public class InferenceContext18 {
return null;
}
- private boolean checkExpression(Expression expri, TypeBinding[] u, TypeBinding r1, TypeBinding[] v, TypeBinding r2)
+ private boolean checkExpression(Expression expri, TypeBinding[] u, TypeBinding r1, TypeBinding[] v, TypeBinding r2)
throws InferenceFailureException {
if (expri instanceof LambdaExpression && !((LambdaExpression)expri).argumentsTypeElided()) {
for (int i = 0; i < u.length; i++) {
@@ -955,7 +955,7 @@ public class InferenceContext18 {
break checkPrimitive2;
}
return true;
- }
+ }
}
return reduceAndIncorporate(ConstraintTypeFormula.create(r1, r2, ReductionResult.SUBTYPE));
} else if (expri instanceof ReferenceExpression && ((ReferenceExpression)expri).isExactMethodReference()) {
@@ -968,7 +968,7 @@ public class InferenceContext18 {
return true;
MethodBinding method = reference.getExactMethod();
TypeBinding returnType = method.isConstructor() ? method.declaringClass : method.returnType;
- if (r1.isPrimitiveType() && !r2.isPrimitiveType() && returnType.isPrimitiveType())
+ if (r1.isPrimitiveType() && !r2.isPrimitiveType() && returnType.isPrimitiveType())
return true;
if (r2.isPrimitiveType() && !r1.isPrimitiveType() && !returnType.isPrimitiveType())
return true;
@@ -1029,14 +1029,14 @@ public class InferenceContext18 {
this.b2 = this.currentBounds.copy(); // Preserve the result after reduction, without effects of resolve() for later use in invocation type inference.
BoundSet solution = resolve(this.inferenceVariables);
-
+
/* If inferring applicability make a final pass over the initial constraints preserved as final constraints to make sure they hold true at a macroscopic level.
See https://bugs.eclipse.org/bugs/show_bug.cgi?id=426537#c55 onwards.
*/
if (inferringApplicability && solution != null && this.finalConstraints != null) {
for (ConstraintExpressionFormula constraint: this.finalConstraints) {
if (constraint.left.isPolyExpression())
- continue; // avoid redundant re-inference, inner poly's own constraints get validated in its own context & poly invocation type inference proved compatibility against target.
+ continue; // avoid redundant re-inference, inner poly's own constraints get validated in its own context & poly invocation type inference proved compatibility against target.
constraint.applySubstitution(solution, this.inferenceVariables);
if (!this.currentBounds.reduceOneConstraint(this, constraint)) {
return null;
@@ -1045,11 +1045,11 @@ public class InferenceContext18 {
}
return solution;
}
-
+
public /*@Nullable*/ BoundSet solve() throws InferenceFailureException {
return solve(false);
}
-
+
public /*@Nullable*/ BoundSet solve(InferenceVariable[] toResolve) throws InferenceFailureException {
if (!reduce())
return null;
@@ -1060,8 +1060,8 @@ public class InferenceContext18 {
}
/**
- * JLS 18.2. reduce all initial constraints
- * @throws InferenceFailureException
+ * JLS 18.2. reduce all initial constraints
+ * @throws InferenceFailureException
*/
private boolean reduce() throws InferenceFailureException {
// Caution: This can be reentered recursively even as an earlier call is munching through the constraints !
@@ -1128,11 +1128,11 @@ public class InferenceContext18 {
/**
* <b>JLS 18.4</b> Resolution
* @return answer null if some constraint resolved to FALSE, otherwise the boundset representing the solution
- * @throws InferenceFailureException
+ * @throws InferenceFailureException
*/
private /*@Nullable*/ BoundSet resolve(InferenceVariable[] toResolve) throws InferenceFailureException {
this.captureId = 0;
- // NOTE: 18.5.2 ...
+ // NOTE: 18.5.2 ...
// "(While it was necessary to demonstrate that the inference variables in B1 could be resolved
// in order to establish applicability, the resulting instantiations are not considered part of B1.)
// For this reason, resolve works on a temporary bound set, copied before any modification.
@@ -1181,7 +1181,7 @@ public class InferenceContext18 {
if (glb == null) {
// inconsistent intersection
tmpBoundSet = prevBoundSet; // clean up
- break variables; // and start over
+ break variables; // and start over
}
}
}
@@ -1202,7 +1202,7 @@ public class InferenceContext18 {
final BoundSet kurrentBoundSet = tmpBoundSet;
Substitution theta = new Substitution() {
@Override
- public LookupEnvironment environment() {
+ public LookupEnvironment environment() {
return InferenceContext18.this.environment;
}
@Override
@@ -1281,7 +1281,7 @@ public class InferenceContext18 {
}
return tmpBoundSet;
}
-
+
private TypeBinding intersectionFromGlb(TypeBinding[] glbs) {
ReferenceBinding[] refGlbs = new ReferenceBinding[glbs.length];
for (int i = 0; i < glbs.length; i++) {
@@ -1297,9 +1297,9 @@ public class InferenceContext18 {
return intersection;
return null;
}
-
+
int captureId = 0;
-
+
/** For 18.4: "Let Z1, ..., Zn be fresh type variables" use capture bindings. */
private CaptureBinding18 freshCapture(InferenceVariable variable) {
int id = this.captureId++;
@@ -1310,7 +1310,7 @@ public class InferenceContext18 {
start, end, id, this.environment);
}
// === ===
-
+
private boolean setUpperBounds(CaptureBinding18 typeVariable, TypeBinding[] substitutedUpperBounds) {
// 18.4: ... define the upper bound of Zi as glb(L1θ, ..., Lkθ)
if (substitutedUpperBounds.length == 1) {
@@ -1337,7 +1337,7 @@ public class InferenceContext18 {
Arrays.sort(types, new Comparator<TypeBinding>() {
@Override
public int compare(TypeBinding o1, TypeBinding o2) {
- int i1 = o1.id, i2 = o2.id;
+ int i1 = o1.id, i2 = o2.id;
return (i1<i2 ? -1 : (i1==i2 ? 0 : 1));
}
});
@@ -1349,7 +1349,7 @@ public class InferenceContext18 {
*/
private Set<InferenceVariable> getSmallestVariableSet(BoundSet bounds, InferenceVariable[] subSet) {
// "Given a set of inference variables to resolve, let V be the union of this set and
- // all variables upon which the resolution of at least one variable in this set depends."
+ // all variables upon which the resolution of at least one variable in this set depends."
Set<InferenceVariable> v = new HashSet<InferenceVariable>();
Map<InferenceVariable,Set<InferenceVariable>> dependencies = new HashMap<>(); // compute only once, store for the final loop over 'v'.
for (InferenceVariable iv : subSet) {
@@ -1408,7 +1408,7 @@ public class InferenceContext18 {
// causing non-termination of the algorithm.
// Since that is not acceptable, I'm *interpreting* the spec to request a search for a constraint
// that "best matches" the given conditions.
-
+
// collect all constraints participating in a cycle
HashMap<ConstraintFormula,Set<ConstraintFormula>> dependencies = new HashMap<ConstraintFormula, Set<ConstraintFormula>>();
Set<ConstraintFormula> cycles = new HashSet<ConstraintFormula>();
@@ -1447,7 +1447,7 @@ public class InferenceContext18 {
}
if (candidatesII.isEmpty())
candidatesII = c; // not spec'ed but needed to avoid returning null below, witness: java.util.stream.Collectors
-
+
// tentatively: (iii) has the form ⟨Expression → T⟩
Set<ConstraintFormula> candidatesIII = new HashSet<ConstraintFormula>();
for (ConstraintFormula candidate : candidatesII) {
@@ -1459,7 +1459,7 @@ public class InferenceContext18 {
} else { // candidatesIII contains all relevant constraints ⟨Expression → T⟩
// (iv) contains an expression that appears to the left of the expression
// of every other constraint satisfying the previous three requirements
-
+
// collect containment info regarding all expressions in candidate constraints:
// (a) find minimal enclosing expressions:
Map<ConstraintExpressionFormula,ConstraintExpressionFormula> expressionContainedBy = new HashMap<ConstraintExpressionFormula, ConstraintExpressionFormula>();
@@ -1486,7 +1486,7 @@ public class InferenceContext18 {
containmentForest.put(parent, children = new HashSet<ConstraintExpressionFormula>());
children.add(parentRelation.getKey());
}
-
+
// approximate the spec by searching the largest containment tree:
int bestRank = -1;
ConstraintExpressionFormula candidate = null;
@@ -1500,7 +1500,7 @@ public class InferenceContext18 {
if (candidate != null)
return candidate;
}
-
+
if (candidatesIII.isEmpty())
throw new IllegalStateException("cannot pick constraint from cyclic set"); //$NON-NLS-1$
return candidatesIII.iterator().next();
@@ -1552,7 +1552,7 @@ public class InferenceContext18 {
}
/** non-roots answer -1, roots answer the size of the spanned tree */
- private int rankNode(ConstraintExpressionFormula parent,
+ private int rankNode(ConstraintExpressionFormula parent,
Map<ConstraintExpressionFormula,ConstraintExpressionFormula> expressionContainedBy,
Map<ConstraintExpressionFormula, Set<ConstraintExpressionFormula>> containmentForest)
{
@@ -1570,7 +1570,7 @@ public class InferenceContext18 {
return sum;
}
- private Set<ConstraintFormula> findBottomSet(Set<ConstraintFormula> constraints,
+ private Set<ConstraintFormula> findBottomSet(Set<ConstraintFormula> constraints,
Set<InferenceVariable> allOutputVariables, List<Set<InferenceVariable>> components)
{
// 18.5.2 bullet 5.(1)
@@ -1621,7 +1621,7 @@ public class InferenceContext18 {
types[i] = last;
return types;
}
-
+
public SuspendedInferenceRecord enterPolyInvocation(InvocationSite invocation, Expression[] innerArguments) {
SuspendedInferenceRecord record = new SuspendedInferenceRecord(this.currentInvocation, this.invocationArguments, this.inferenceVariables, this.inferenceKind, this.usesUncheckedConversion);
this.inferenceVariables = null;
@@ -1630,7 +1630,7 @@ public class InferenceContext18 {
this.usesUncheckedConversion = false;
return record;
}
-
+
public SuspendedInferenceRecord enterLambda(LambdaExpression lambda) {
SuspendedInferenceRecord record = new SuspendedInferenceRecord(this.currentInvocation, this.invocationArguments, this.inferenceVariables, this.inferenceKind, this.usesUncheckedConversion);
this.inferenceVariables = null;
@@ -1665,7 +1665,7 @@ public class InferenceContext18 {
System.arraycopy(this.inferenceVariables, 0, this.inferenceVariables=new InferenceVariable[l1+l2], l2, l1);
System.arraycopy(record.inferenceVariables, 0, this.inferenceVariables, 0, l2);
}
-
+
// replace invocation site & arguments:
this.currentInvocation = record.site;
this.invocationArguments = record.invocationArguments;
@@ -1682,11 +1682,11 @@ public class InferenceContext18 {
}
return this.seenInnerContexts.add(innerContext);
}
-
+
private Substitution getResultSubstitution(final BoundSet result) {
return new Substitution() {
@Override
- public LookupEnvironment environment() {
+ public LookupEnvironment environment() {
return InferenceContext18.this.environment;
}
@Override
@@ -1723,7 +1723,7 @@ public class InferenceContext18 {
public static TypeBinding getParameter(TypeBinding[] parameters, int rank, boolean isVarArgs) {
if (isVarArgs) {
if (rank >= parameters.length-1)
- return ((ArrayBinding)parameters[parameters.length-1]).elementsType();
+ return ((ArrayBinding)parameters[parameters.length-1]).elementsType();
} else if (rank >= parameters.length) {
return null;
}
@@ -1745,7 +1745,7 @@ public class InferenceContext18 {
}
/* We used to check if expected type is null and if so return method, but that is wrong - it injects an incompatible method into overload resolution.
if we get here with expected type set to null at all, the target context does not define a target type (vanilla context), so inference has done its
- best and nothing more to do than to signal error.
+ best and nothing more to do than to signal error.
*/
ProblemMethodBinding problemMethod = new ProblemMethodBinding(method, method.selector, method.parameters, ProblemReasons.InvocationTypeInferenceFailure);
problemMethod.returnType = expectedType != null ? expectedType : method.returnType;
@@ -1831,7 +1831,7 @@ public class InferenceContext18 {
this.constraintsWithUncheckedConversion.add(constraint);
this.usesUncheckedConversion = true;
}
-
+
void reportUncheckedConversions(BoundSet solution) {
if (this.constraintsWithUncheckedConversion != null) {
int len = this.constraintsWithUncheckedConversion.size();
@@ -1855,7 +1855,7 @@ public class InferenceContext18 {
}
}
}
-
+
/** For use by 15.12.2.6 Method Invocation Type */
public boolean usesUncheckedConversion() {
return this.constraintsWithUncheckedConversion != null;
@@ -1884,7 +1884,7 @@ public class InferenceContext18 {
if (binding instanceof ParameterizedGenericMethodBinding) {
MethodBinding shallowOriginal = binding.shallowOriginal();
TypeBinding[] solutions = getSolutions(shallowOriginal.typeVariables(), polyInvocation, result);
- if (solutions == null) // in CEF.reduce, we lift inner poly expressions into outer context only if their target type has inference variables.
+ if (solutions == null) // in CEF.reduce, we lift inner poly expressions into outer context only if their target type has inference variables.
continue;
methodSubstitute = this.environment.createParameterizedGenericMethod(shallowOriginal, solutions);
} else {
@@ -1893,7 +1893,7 @@ public class InferenceContext18 {
MethodBinding shallowOriginal = binding.shallowOriginal();
ReferenceBinding genericType = shallowOriginal.declaringClass;
TypeBinding[] solutions = getSolutions(genericType.typeVariables(), polyInvocation, result);
- if (solutions == null) // in CEF.reduce, we lift inner poly expressions into outer context only if their target type has inference variables.
+ if (solutions == null) // in CEF.reduce, we lift inner poly expressions into outer context only if their target type has inference variables.
continue;
ParameterizedTypeBinding parameterizedType = this.environment.createParameterizedType(genericType, solutions, binding.declaringClass.enclosingType());
for (MethodBinding parameterizedMethod : parameterizedType.methods()) {
@@ -1914,7 +1914,7 @@ public class InferenceContext18 {
}
}
TypeBinding parameterType = InferenceContext18.getParameter(parameters, i, variableArity);
- forwardResults(result, polyInvocation, methodSubstitute, parameterType);
+ forwardResults(result, polyInvocation, methodSubstitute, parameterType);
}
}
}

Back to the top