@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 void doVisitMatchingTypeParameters(ParameterizedTypeReference actual, ParameterizedTypeReference declaration) { if (actual.isFunctionType() ^ declaration.isFunctionType() /* one or the other is a function type but not both */) { FunctionTypeReference actualFunctionType = actual.tryConvertToFunctionTypeReference(false); if (actualFunctionType != null) { FunctionTypeReference declarationFunctionType = declaration.tryConvertToFunctionTypeReference(false); if (declarationFunctionType != null) { List<LightweightTypeReference> actualParameterTypes = actualFunctionType.getParameterTypes(); List<LightweightTypeReference> declarationParameterTypes = declarationFunctionType.getParameterTypes(); int max = Math.min(actualParameterTypes.size(), declarationParameterTypes.size()); for(int i = 0; i < max; i++) { LightweightTypeReference actualParameterType = actualParameterTypes.get(i); LightweightTypeReference declarationParameterType = declarationParameterTypes.get(i); outerVisit(declarationParameterType, actualParameterType, declaration, VarianceInfo.IN, VarianceInfo.IN); } LightweightTypeReference actualReturnType = actualFunctionType.getReturnType(); LightweightTypeReference declarationReturnType = declarationFunctionType.getReturnType(); if (actualReturnType != null && declarationReturnType != null) { outerVisit(declarationReturnType, actualReturnType, declaration, VarianceInfo.OUT, VarianceInfo.OUT); } return; } } } super.doVisitMatchingTypeParameters(actual, declaration); } };
@Override protected void doVisitArrayTypeReference(ArrayTypeReference reference, ParameterizedTypeReference declaration) { JvmType type = declaration.getType(); if (type instanceof JvmTypeParameter) { if (shouldProcess((JvmTypeParameter) type)) { JvmTypeParameter typeParameter = (JvmTypeParameter) type; processTypeParameter(typeParameter, reference); } } else if (declaration.isSubtypeOf(Iterable.class)) { ArrayTypeReference array = declaration.tryConvertToArray(); if (array != null) { outerVisit(array, reference); } } }
@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 if (reference.isSubtypeOf(Iterable.class)) { ArrayTypeReference array = reference.tryConvertToArray(); if (array != null) { outerVisit(declaration, array); } } } @Override
@Override protected void acceptHint(UnboundTypeReference reference, LightweightTypeReference param) { if (!shouldProcess(reference.getTypeParameter())) { reference.tryResolve(); if (reference.internalIsResolved()) { outerVisit(reference, param); } else { super.acceptHint(reference, param); } } else { reference.acceptHint(boundByInference(param)); } }