private boolean hasCompatibleTypeParameters(IMethod overriding, IMethod overridden) throws JavaModelException { ITypeParameter[] overriddenTypeParameters= overridden.getTypeParameters(); ITypeParameter[] overridingTypeParameters= overriding.getTypeParameters(); int nOverridingTypeParameters= overridingTypeParameters.length; if (overriddenTypeParameters.length != nOverridingTypeParameters) { return nOverridingTypeParameters == 0; } Substitutions overriddenSubst= getMethodSubstitions(overridden); Substitutions overridingSubst= getMethodSubstitions(overriding); for (int i= 0; i < nOverridingTypeParameters; i++) { String erasure1= overriddenSubst.getErasure(overriddenTypeParameters[i].getElementName()); String erasure2= overridingSubst.getErasure(overridingTypeParameters[i].getElementName()); if (erasure1 == null || !erasure1.equals(erasure2)) { return false; } // comparing only the erasure is not really correct: Need to compare all bounds, that can be in different order int nBounds= overriddenTypeParameters[i].getBounds().length; if (nBounds > 1 && nBounds != overridingTypeParameters[i].getBounds().length) { return false; } } return true; }
private boolean hasCompatibleTypeParameters(IMethod overriding, IMethod overridden) throws JavaModelException { ITypeParameter[] overriddenTypeParameters= overridden.getTypeParameters(); ITypeParameter[] overridingTypeParameters= overriding.getTypeParameters(); int nOverridingTypeParameters= overridingTypeParameters.length; if (overriddenTypeParameters.length != nOverridingTypeParameters) { return nOverridingTypeParameters == 0; } Substitutions overriddenSubst= getMethodSubstitions(overridden); Substitutions overridingSubst= getMethodSubstitions(overriding); for (int i= 0; i < nOverridingTypeParameters; i++) { String erasure1= overriddenSubst.getErasure(overriddenTypeParameters[i].getElementName()); String erasure2= overridingSubst.getErasure(overridingTypeParameters[i].getElementName()); if (erasure1 == null || !erasure1.equals(erasure2)) { return false; } // comparing only the erasure is not really correct: Need to compare all bounds, that can be in different order int nBounds= overriddenTypeParameters[i].getBounds().length; if (nBounds > 1 && nBounds != overridingTypeParameters[i].getBounds().length) { return false; } } return true; }
private boolean hasCompatibleTypeParameters(IMethod overriding, IMethod overridden) throws JavaModelException { ITypeParameter[] overriddenTypeParameters= overridden.getTypeParameters(); ITypeParameter[] overridingTypeParameters= overriding.getTypeParameters(); int nOverridingTypeParameters= overridingTypeParameters.length; if (overriddenTypeParameters.length != nOverridingTypeParameters) { return nOverridingTypeParameters == 0; } Substitutions overriddenSubst= getMethodSubstitions(overridden); Substitutions overridingSubst= getMethodSubstitions(overriding); for (int i= 0; i < nOverridingTypeParameters; i++) { String erasure1= overriddenSubst.getErasure(overriddenTypeParameters[i].getElementName()); String erasure2= overridingSubst.getErasure(overridingTypeParameters[i].getElementName()); if (erasure1 == null || !erasure1.equals(erasure2)) { return false; } // comparing only the erasure is not really correct: Need to compare all bounds, that can be in different order int nBounds= overriddenTypeParameters[i].getBounds().length; if (nBounds > 1 && nBounds != overridingTypeParameters[i].getBounds().length) { return false; } } return true; }
private String getVariableErasure(IMember context, String variableName) throws JavaModelException { IType type; if (context instanceof IMethod) { String subst= getMethodSubstitions((IMethod) context).getErasure(variableName); if (subst != null) { return subst; } type= context.getDeclaringType(); } else { type= (IType) context; } String subst= getTypeSubstitions(type).getErasure(variableName); if (subst != null) { return subst; } IJavaElement parent= type.getParent(); if (parent instanceof IMethod) { return getVariableErasure((IMethod) parent, variableName); } else if (type.getDeclaringType() != null) { return getVariableErasure(type.getDeclaringType(), variableName); } return variableName; // not a type variable }
private String getVariableErasure(IMember context, String variableName) throws JavaModelException { IType type; if (context instanceof IMethod) { String subst= getMethodSubstitions((IMethod) context).getErasure(variableName); if (subst != null) { return subst; } type= context.getDeclaringType(); } else { type= (IType) context; } String subst= getTypeSubstitions(type).getErasure(variableName); if (subst != null) { return subst; } IJavaElement parent= type.getParent(); if (parent instanceof IMethod) { return getVariableErasure((IMethod) parent, variableName); } else if (type.getDeclaringType() != null) { return getVariableErasure(type.getDeclaringType(), variableName); } return variableName; // not a type variable }
private String getVariableErasure(IMember context, String variableName) throws JavaModelException { IType type; if (context instanceof IMethod) { String subst= getMethodSubstitions((IMethod) context).getErasure(variableName); if (subst != null) { return subst; } type= context.getDeclaringType(); } else { type= (IType) context; } String subst= getTypeSubstitions(type).getErasure(variableName); if (subst != null) { return subst; } return variableName; // not a type variable }