private void processBoundTypeArgument(LightweightBoundTypeArgument boundTypeArgument, List<LightweightTypeReference> types, List<VarianceInfo> variances, Object origin, Set<Object> seenOrigin) { types.add(boundTypeArgument.getTypeReference()); addVariance(boundTypeArgument, variances, origin, seenOrigin); }
protected boolean canResolveTo(LightweightTypeReference reference, List<LightweightBoundTypeArgument> allHints) { List<LightweightBoundTypeArgument> inferredHints = Lists.newArrayListWithCapacity(allHints.size()); List<LightweightBoundTypeArgument> effectiveHints = Lists.newArrayListWithCapacity(allHints.size()); EnumSet<VarianceInfo> varianceHints = EnumSet.noneOf(VarianceInfo.class); for(LightweightBoundTypeArgument hint: allHints) { if (hint.getOrigin() instanceof VarianceInfo) { varianceHints.add((VarianceInfo) hint.getOrigin()); } else { effectiveHints.add(hint); if (hint.getSource() == BoundTypeArgumentSource.INFERRED) { inferredHints.add(hint); } } } if (effectiveHints.isEmpty()) return false; boolean result = getServices().getBoundTypeArgumentMerger().isPossibleMergeResult(!inferredHints.isEmpty() ? inferredHints : effectiveHints, reference); return result; }
if (allArguments.size() == 1) { LightweightBoundTypeArgument argument = Iterables.getOnlyElement(allArguments); return getSingleArgumentAsMergedArgument(argument); switch(boundTypeArgument.getDeclaredVariance()) { case INVARIANT: processBoundTypeArgument(boundTypeArgument, invariantTypes, invariantVariances, origin, seenOrigin); break; case OUT: BoundTypeArgumentSource source = boundTypeArgument.getSource(); if (invariantTypes.isEmpty() && isTransitiveHintFromReslved(boundTypeArgument, origin, source)) { invariantTypesFromOut.add(boundTypeArgument.getTypeReference()); if (seenOrigin.add(origin)) { addVariance(boundTypeArgument, outVariances, origin, seenOrigin); break; case IN: processBoundTypeArgument(boundTypeArgument, inTypes, inVariances, origin, seenOrigin); break; variance = VarianceInfo.INVARIANT.mergeDeclaredWithActuals(invariantVariances); if (variance == null && invariantVariances.contains(VarianceInfo.IN) && invariantTypes.size() > 1) { type = getCommonSuperTypes(invariantTypes, owner); } else if (!invariantTypesFromOut.isEmpty()) { LightweightTypeReference fromOut = invariantTypesFromOut.get(0); type = getCommonSuperTypes(outTypes, owner); variance = VarianceInfo.OUT.mergeDeclaredWithActuals(outVariances); if (!inVariances.isEmpty()) {
LightweightMergedBoundTypeArgument typeArgument = getServices().getBoundTypeArgumentMerger().merge(!inferredHints.isEmpty() ? inferredHints : effectiveHints, getOwner()); if (typeArgument != null) { resolvedTo = typeArgument.getTypeReference();
LightweightMergedBoundTypeArgument merged = merge(allArguments, candidate.getOwner()); if (merged == null) return false;
Map<JvmTypeParameter, LightweightMergedBoundTypeArgument> mergedTypeParameterMapping = Maps.newLinkedHashMap(); for(Map.Entry<JvmTypeParameter, List<LightweightBoundTypeArgument>> mapping: typeParameterMapping.entrySet()) { mergedTypeParameterMapping.put(mapping.getKey(), typeReference.getServices().getBoundTypeArgumentMerger().merge(mapping.getValue(), owner));