diff options
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.java | 142 |
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); } } } |