protected void outerVisit(LightweightTypeReference declaredType, LightweightTypeReference actualType, Object origin, VarianceInfo expectedVariance, VarianceInfo actualVariance) { VarianceInfo oldExpectedVariance = this.expectedVariance; VarianceInfo oldActualVariance = this.actualVariance; Object oldOrigin = this.origin; try { this.expectedVariance = expectedVariance; this.actualVariance = actualVariance; this.origin = origin; outerVisit(declaredType, actualType); } finally { this.expectedVariance = oldExpectedVariance; this.actualVariance = oldActualVariance; this.origin = oldOrigin; } }
public void processPairedReferences(LightweightTypeReference declaredType, LightweightTypeReference actualType) { outerVisit(declaredType, actualType, declaredType, VarianceInfo.OUT, VarianceInfo.OUT); }
@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 doVisitTypeReference(LightweightTypeReference reference, CompoundTypeReference declaration) { List<LightweightTypeReference> components = declaration.getMultiTypeComponents(); if (!components.isEmpty()) { for (LightweightTypeReference component: components) { outerVisit(component, reference); } } } }
@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 doVisitInnerFunctionTypeReference(InnerFunctionTypeReference reference, ParameterizedTypeReference declaration) { super.doVisitInnerFunctionTypeReference(reference, declaration); outerVisit(declaration, reference.getOuter()); }
@Override protected void doVisitInnerTypeReference(InnerTypeReference reference, ParameterizedTypeReference declaration) { super.doVisitInnerTypeReference(reference, declaration); outerVisit(declaration, reference.getOuter()); }
@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 doVisitArrayTypeReference(ArrayTypeReference reference, ArrayTypeReference declaration) { outerVisit(declaration.getComponentType(), reference.getComponentType()); }
@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); } } } }
@Override protected void doVisitParameterizedTypeReference(ParameterizedTypeReference reference, ArrayTypeReference declaration) { JvmType type = reference.getType(); if (type instanceof JvmTypeParameter) { if (shouldProcess((JvmTypeParameter) type)) { JvmTypeParameter typeParameter = (JvmTypeParameter) type; processTypeParameter(typeParameter, declaration); } } else { LightweightTypeReference declarationAsList = declaration.tryConvertToListType(); outerVisit(declarationAsList, reference); } }
@Override protected void doVisitTypeReference(LightweightTypeReference reference, UnboundTypeReference declaration) { if (declaration.internalIsResolved() || getOwner().isResolved(declaration.getHandle())) { declaration.tryResolve(); outerVisit(declaration, reference, declaration, getExpectedVariance(), getActualVariance()); } else { processTypeParameter(declaration.getTypeParameter(), reference); } }
|| !reference.getIdentifier().equals(actual.getIdentifier()) || !declaredTypeReference.getIdentifier().equals(declaration.getIdentifier())) { outerVisit(declaredTypeReference, actual, declaration, VarianceInfo.INVARIANT, VarianceInfo.INVARIANT);