@Override protected void doVisitWildcardTypeReference(WildcardTypeReference reference, StringBuilder param) { param.append("?"); if (reference.getLowerBound() != null) { param.append(" super "); reference.getLowerBound().accept(this, param); } else { List<LightweightTypeReference> upperBounds = reference.getUpperBounds(); if (!upperBounds.isEmpty()) { if (upperBounds.size() == 1 && upperBounds.get(0).isType(Object.class)) { return; } param.append(" extends "); for(int i = 0; i < upperBounds.size(); i++) { if (i != 0) { param.append(" & "); } upperBounds.get(i).accept(this, param); } } } }
protected LightweightTypeReference getMostSpecialTypeIfAllWildcards(List<LightweightTypeReference> types) { boolean objectIsCandidate = false; boolean lowerBoundSeen = false; for(LightweightTypeReference type: types) { if (type instanceof WildcardTypeReference) { if (((WildcardTypeReference) type).getLowerBound() == null) { objectIsCandidate = true; } else { lowerBoundSeen = true; } } else { return null; } } if (!lowerBoundSeen) { return null; } if (objectIsCandidate) return owner.newWildcardExtendsObject(); return getMostSpecialType(types); }
@Override protected void doVisitWildcardTypeReference(WildcardTypeReference reference, ArrayTypeReference declaration) { LightweightTypeReference lowerBound = reference.getLowerBound(); if (lowerBound != null) { outerVisit(declaration, lowerBound, declaration, expectedVariance, VarianceInfo.IN); } else { for(LightweightTypeReference upperBound: reference.getUpperBounds()) { outerVisit(declaration, upperBound, declaration, expectedVariance, VarianceInfo.OUT); } } } }
@Override protected void doVisitWildcardTypeReference(WildcardTypeReference reference, ArrayTypeReference declaration) { LightweightTypeReference lowerBound = reference.getLowerBound(); if (lowerBound != null) { outerVisit(declaration, lowerBound); } else { for(LightweightTypeReference upperBound: reference.getUpperBounds()) { outerVisit(declaration, upperBound); } } } };
@Override protected LightweightTypeReference doVisitWildcardTypeReference(final WildcardTypeReference reference) { final LightweightTypeReference unknownType = this.visit(reference.getUpperBounds()); if ((unknownType != null)) { return unknownType; } final LightweightTypeReference lowerBound = reference.getLowerBound(); if ((lowerBound != null)) { return lowerBound.<LightweightTypeReference>accept(this); } return null; }
@Override public void doVisitTypeReference(LightweightTypeReference reference, WildcardTypeReference declaration) { LightweightTypeReference declaredLowerBound = declaration.getLowerBound(); if (declaredLowerBound != null) { outerVisit(declaredLowerBound, reference, declaration, VarianceInfo.IN, VarianceInfo.INVARIANT); } else { for (LightweightTypeReference declaredUpperBound : declaration.getUpperBounds()) { outerVisit(declaredUpperBound, reference, declaration, VarianceInfo.OUT, VarianceInfo.INVARIANT); } } } }
@Override protected void doVisitWildcardTypeReference(WildcardTypeReference reference, ParameterizedTypeReference declaration) { LightweightTypeReference lowerBound = reference.getLowerBound(); if (lowerBound != null) { outerVisit(declaration, lowerBound, declaration, expectedVariance, VarianceInfo.IN); } else { for(LightweightTypeReference upperBound: reference.getUpperBounds()) { outerVisit(declaration, upperBound, declaration, expectedVariance, VarianceInfo.OUT); } } }
@Override protected void doVisitWildcardTypeReference(WildcardTypeReference reference, WildcardTypeReference declaration) { LightweightTypeReference declaredLowerBound = declaration.getLowerBound(); if (declaredLowerBound != null) { LightweightTypeReference actualLowerBound = reference.getLowerBound(); if (actualLowerBound != null) { outerVisit(declaredLowerBound, actualLowerBound, declaration, VarianceInfo.IN, VarianceInfo.IN); } else { for (LightweightTypeReference actualUpperBound : reference.getUpperBounds()) { outerVisit(declaredLowerBound, actualUpperBound, declaration, VarianceInfo.IN, VarianceInfo.OUT); } } } else { LightweightTypeReference actualLowerBound = reference.getLowerBound(); for (LightweightTypeReference declaredUpperBound : declaration.getUpperBounds()) { for (LightweightTypeReference actualUpperBound : reference.getUpperBounds()) { outerVisit(declaredUpperBound, actualUpperBound, declaration, VarianceInfo.OUT, VarianceInfo.OUT); } if (actualLowerBound != null) { outerVisit(declaredUpperBound, actualLowerBound, declaration, VarianceInfo.OUT, VarianceInfo.IN); } } } }
protected int doIsConformant(WildcardTypeReference left, WildcardTypeReference right, int flags) { if ((flags & AS_TYPE_ARGUMENT) != 0) { LightweightTypeReference leftLowerBound = left.getLowerBound(); if (leftLowerBound != null) { LightweightTypeReference rightLowerBound = right.getLowerBound(); if (rightLowerBound != null) { int newFlags = flags & ~(ALLOW_RAW_TYPE_CONVERSION | AS_TYPE_ARGUMENT | ALLOW_BOXING_UNBOXING | ALLOW_PRIMITIVE_WIDENING | ALLOW_SYNONYMS | ALLOW_FUNCTION_CONVERSION);
@Override protected Boolean doVisitWildcardTypeReference(WildcardTypeReference reference) { if (reference.isResolved()) { return true; } if (!visit(reference.getUpperBounds())) { return false; } LightweightTypeReference lowerBound = reference.getLowerBound(); if (lowerBound != null) { return lowerBound.accept(this); } return true; }
@Override protected void doVisitWildcardTypeReference(WildcardTypeReference reference, UnboundTypeReference declaration) { LightweightTypeReference lowerBound = reference.getLowerBound(); if (lowerBound != null) { outerVisit(declaration, lowerBound, declaration, getExpectedVariance(), VarianceInfo.IN); } else { for (LightweightTypeReference upperBound : reference.getUpperBounds()) { outerVisit(declaration, upperBound, declaration, getExpectedVariance(), VarianceInfo.OUT); } } }
@Override protected void doVisitWildcardTypeReference(final WildcardTypeReference reference) { this.appender.append("?"); LightweightTypeReference _lowerBound = reference.getLowerBound(); boolean _tripleNotEquals = (_lowerBound != null); if (_tripleNotEquals) { this.appender.append(" super "); reference.getLowerBound().accept(this); } else { final Function1<LightweightTypeReference, Boolean> _function = (LightweightTypeReference it) -> {
@Override protected LocalTypeSubstitutor.SubstitutionResult doVisitWildcardTypeReference(WildcardTypeReference reference, VarianceInfo varianceInfo) { WildcardTypeReference result = owner.newWildcardTypeReference(); LightweightTypeReference lowerBound = reference.getLowerBound(); boolean didSubstitute = false; if (lowerBound != null) { SubstitutionResult visited = lowerBound.accept(this, VarianceInfo.IN); result.setLowerBound(visited.typeReference); didSubstitute = didSubstitute || visited.didSubstitute; } for(LightweightTypeReference upperBound: reference.getUpperBounds()) { SubstitutionResult visited = upperBound.accept(this, VarianceInfo.OUT); result.addUpperBound(visited.typeReference); didSubstitute = didSubstitute || visited.didSubstitute; } if (result.getUpperBounds().isEmpty()) { throw new IllegalStateException("UpperBounds may not be empty"); } return new SubstitutionResult(result, didSubstitute); }
@Override protected LightweightTypeReference doVisitWildcardTypeReference(WildcardTypeReference reference, ConstraintVisitingInfo visiting) { if (reference.isResolved() && reference.isOwnedBy(getOwner())) return reference; LightweightTypeReference lowerBound = reference.getLowerBound(); if (lowerBound instanceof UnboundTypeReference) { if (!handles.add(((UnboundTypeReference) lowerBound).getHandle())) { WildcardTypeReference result = getOwner().newWildcardTypeReference(); for(LightweightTypeReference upperBound: reference.getUpperBounds()) { result.addUpperBound(visitTypeArgument(upperBound, visiting)); } return result; } } return super.doVisitWildcardTypeReference(reference, visiting); }
protected int doIsConformant(WildcardTypeReference left, LightweightTypeReference right, int flags) { if ((flags & AS_TYPE_ARGUMENT) != 0 || (flags & AS_NESTED_TYPE_ARGUMENT) != 0) { LightweightTypeReference lowerBound = left.getLowerBound(); if (lowerBound != null) { int newFlags = flags & ~(ALLOW_RAW_TYPE_CONVERSION | AS_TYPE_ARGUMENT | ALLOW_BOXING_UNBOXING | ALLOW_PRIMITIVE_WIDENING | ALLOW_SYNONYMS | ALLOW_FUNCTION_CONVERSION);
upperBoundSeen = true; result.addUpperBound(visit(constraint.getTypeReference()).getWrapperTypeIfPrimitive()); } else if (result.getLowerBound() == null) { result.setLowerBound(visit(constraint.getTypeReference()).getWrapperTypeIfPrimitive()); if (!upperBoundSeen && result.getLowerBound() != null) { LightweightTypeReference upperBound = getObjectReference(); result.addUpperBound(upperBound);
if (constraintTypeRef.getTypeReference().getKind() != LightweightTypeReference.KIND_WILDCARD_TYPE_REFERENCE && constraintTypeRef.getDeclaredVariance() == VarianceInfo.OUT && constraintTypeRef.getActualVariance() == VarianceInfo.INVARIANT) { if (resolvedTo.getKind() == LightweightTypeReference.KIND_WILDCARD_TYPE_REFERENCE && ((WildcardTypeReference) resolvedTo).getLowerBound() != null) { if(resolvedTo.getInvariantBoundSubstitute().isAssignableFrom(constraintTypeRef.getTypeReference())) { WildcardTypeReference wildcard = resolvedTo.getOwner().newWildcardTypeReference();
@Override protected LightweightTypeReference doVisitWildcardTypeReference(WildcardTypeReference reference, Set<JvmTypeParameter> visiting) { if (reference.isResolved() && reference.isOwnedBy(getOwner())) return reference; WildcardTypeReference result = getOwner().newWildcardTypeReference(); LightweightTypeReference lowerBound = reference.getLowerBound(); if (lowerBound != null) { LightweightTypeReference visited = visitTypeArgument(lowerBound, visiting, true); if (visited.isWildcard()) { LightweightTypeReference substitute = visited.getInvariantBoundSubstitute(); result.setLowerBound(substitute); } else { result.setLowerBound(visited); } } for(LightweightTypeReference upperBound: reference.getUpperBounds()) { LightweightTypeReference visitedArgument = visitTypeArgument(upperBound, visiting); LightweightTypeReference upperBoundSubstitute = visitedArgument.getUpperBoundSubstitute(); result.addUpperBound(upperBoundSubstitute); } if (result.getUpperBounds().isEmpty()) { throw new IllegalStateException("UpperBounds may not be empty"); } return result; } };
@Override public void doVisitUnboundTypeReference(UnboundTypeReference reference, WildcardTypeReference declaration) { if (declaration.getLowerBound() == null) { if (!reference.internalIsResolved()) { List<LightweightTypeReference> upperBounds = declaration.getUpperBounds(); for(LightweightTypeReference upperBound: upperBounds) { if (!upperBound.isResolved() || !reference.canResolveTo(upperBound)) { super.doVisitUnboundTypeReference(reference, declaration); return; } } reference.tryResolve(); if (reference.internalIsResolved()) { outerVisit(reference, declaration); } else { addHint(reference, declaration); } return; } } super.doVisitUnboundTypeReference(reference, declaration); } }
return reference; WildcardTypeReference result = getOwner().newWildcardTypeReference(); LightweightTypeReference lowerBound = reference.getLowerBound(); if (lowerBound != null) { LightweightTypeReference visited = visitTypeArgument(lowerBound, visiting, true);