@Override protected void addHint(UnboundTypeReference typeParameter, LightweightTypeReference reference) { if (!typeParameter.internalIsResolved() && getExpectedVariance() == VarianceInfo.INVARIANT) { if (getExpectedVariance() == getActualVariance() && reference.getKind() != LightweightTypeReference.KIND_UNBOUND_TYPE_REFERENCE) { doAddHint(typeParameter, reference, BoundTypeArgumentSource.INFERRED_EXPECTATION); } else if (getActualVariance() == VarianceInfo.IN && !typeParameter.hasSignificantHints()) { if (reference.getKind() != LightweightTypeReference.KIND_UNBOUND_TYPE_REFERENCE) { doAddHint(typeParameter, reference, BoundTypeArgumentSource.INFERRED_EXPECTATION); } else { UnboundTypeReference casted = (UnboundTypeReference)reference; List<LightweightBoundTypeArgument> hints = casted.getAllHints(); for(LightweightBoundTypeArgument hint: hints) { // avoid bogus transitive hints, e.g. if a reference was used with another variance // INFERRED_LATER serves as an indicator for these hints if (hint.getSource() == BoundTypeArgumentSource.INFERRED_LATER) { return; } } doAddHint(typeParameter, reference, BoundTypeArgumentSource.INFERRED_EXPECTATION); } } } }
protected void doAddHint(UnboundTypeReference typeParameter, LightweightTypeReference reference, BoundTypeArgumentSource source) { typeParameter.acceptHint( reference.getWrapperTypeIfPrimitive(), source, getOrigin(), getExpectedVariance(), getActualVariance()); } };