protected ResolvedOperationInHierarchy createResolvedOperationInHierarchy(JvmOperation candidate, IOverrideCheckResult checkResult) { ResolvedOperationInHierarchy result = new ResolvedOperationInHierarchy(candidate, getBottom()); result.setCheckResult(checkResult); return result; }
@Override public String toString() { return String.format("%s overridden by %s", getDeclaration().getIdentifier(), getBottom()); } }
@Override protected TypeParameterSubstitutor<?> getSubstitutor() { if (isRawTypeInheritance()) { return new RawTypeSubstitutor(getContextType().getOwner()); } TypeParameterSubstitutor<?> result = super.getSubstitutor(); List<JvmTypeParameter> typeParameters = getTypeParameters(); if (!typeParameters.isEmpty()) { List<JvmTypeParameter> resolvedTypeParameters = getResolvedTypeParameters(); int max = Math.min(typeParameters.size(), resolvedTypeParameters.size()); ITypeReferenceOwner owner = getContextType().getOwner(); Map<JvmTypeParameter, LightweightMergedBoundTypeArgument> additionalMapping = Maps.newHashMapWithExpectedSize(max); for(int i = 0; i < max; i++) { LightweightTypeReference localReference = owner.newParameterizedTypeReference(resolvedTypeParameters.get(i)); additionalMapping.put(typeParameters.get(i), new LightweightMergedBoundTypeArgument(localReference, VarianceInfo.INVARIANT)); } result.enhanceMapping(additionalMapping); } return result; }
@Override public IResolvedOperation getAsBottom() { JvmOperation operation = getDeclaration(); JvmDeclaredType declaringType = operation.getDeclaringType(); List<LightweightTypeReference> superTypes = getContextType().getAllSuperTypes(); for(LightweightTypeReference superType: superTypes) { if (superType.getType() == declaringType) { return new BottomResolvedOperation(operation, superType, getBottom().getOverrideTester()); } } throw new IllegalStateException(String.format("Could not find declaring type of method %s in hierarchy of %s", operation.getIdentifier(), getContextType().getIdentifier())); }
protected EnumSet<OverrideCheckDetails> getAllDetails(AbstractResolvedOperation overriding, JvmOperation overridden, OverrideCheckDetails primary) { EnumSet<OverrideCheckDetails> result = EnumSet.of(primary); AbstractResolvedOperation overriddenInHierarchy = new ResolvedOperationInHierarchy(overridden, overriding.getBottom()); switch(primary) { case CURRENT:
@Override protected Map<JvmTypeParameter, LightweightMergedBoundTypeArgument> getContextTypeParameterMapping() { return getBottom().getContextTypeParameterMapping(); }
return new LazyOverrideCheckResult(overriding, overridden, OverrideCheckDetails.STATIC_MISMATCH); AbstractResolvedOperation overriddenInHierarchy = new ResolvedOperationInHierarchy(overridden, overriding.getBottom()); if (parameterCount != 0 && !isMatchingParameterList(overriding, overriddenInHierarchy)) { return new LazyOverrideCheckResult(overriding, overridden, OverrideCheckDetails.PARAMETER_TYPE_MISMATCH);