protected AbstractTypeReferencePairWalker(ITypeReferenceOwner owner) { this.owner = owner; this.recursionGuard = Sets.newHashSetWithExpectedSize(3); parameterizedTypeReferenceTraverser = createParameterizedTypeReferenceTraverser(); wildcardTypeReferenceTraverser = createWildcardTypeReferenceTraverser(); arrayTypeReferenceTraverser = createArrayTypeReferenceTraverser(); compoundTypeReferenceTraverser = createCompoundTypeReferenceTraverser(); unboundTypeReferenceTraverser = createUnboundTypeReferenceTraverser(); }
@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 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); } }
protected void doVisitMatchingTypeParameters(ParameterizedTypeReference reference, ParameterizedTypeReference declaration) { Map<JvmTypeParameter, LightweightMergedBoundTypeArgument> actualMapping = getTypeParameterMapping(reference); TypeParameterSubstitutor<?> actualSubstitutor = createTypeParameterSubstitutor(actualMapping); Map<JvmTypeParameter, LightweightMergedBoundTypeArgument> declaredMapping = getTypeParameterMapping(declaration); TypeParameterSubstitutor<?> declaredSubstitutor = createTypeParameterSubstitutor(declaredMapping); Set<JvmTypeParameter> actualBoundParameters = actualMapping.keySet(); Set<JvmTypeParameter> visited = Sets.newHashSet(); LightweightMergedBoundTypeArgument declaredBoundArgument = declaredMapping.get(actualBoundParameter); while(declaredBoundArgument == null && actualBoundParameter != null) { actualBoundParameter = findMappedParameter(actualBoundParameter, actualMapping, visited); if (actualBoundParameter == null) continue outer; || !reference.getIdentifier().equals(actual.getIdentifier()) || !declaredTypeReference.getIdentifier().equals(declaration.getIdentifier())) { outerVisit(declaredTypeReference, actual, declaration, VarianceInfo.INVARIANT, VarianceInfo.INVARIANT);