private static boolean hasSuperMethod(PsiMethod method) { PsiClass containingClass = method.getContainingClass(); if(containingClass == null) { return false; } for(PsiMethod candidate : containingClass.findMethodsByName(method.getName(), true)) { if(candidate.getContainingClass() != containingClass && PsiSuperMethodImplUtil.isSuperMethodSmart(method, candidate)) { return true; } } return false; }
/** * @return error if static method overrides instance method or * instance method overrides static. see JLS 8.4.6.1, 8.4.6.2 */ static HighlightInfo checkStaticMethodOverride(@NotNull PsiMethod method,@NotNull PsiFile containingFile) { // constructors are not members and therefor don't override class methods if (method.isConstructor()) { return null; } PsiClass aClass = method.getContainingClass(); if (aClass == null) return null; final HierarchicalMethodSignature methodSignature = PsiSuperMethodImplUtil.getHierarchicalMethodSignature(method); final List<HierarchicalMethodSignature> superSignatures = methodSignature.getSuperSignatures(); if (superSignatures.isEmpty()) { return null; } boolean isStatic = method.hasModifierProperty(PsiModifier.STATIC); for (HierarchicalMethodSignature signature : superSignatures) { final PsiMethod superMethod = signature.getMethod(); final PsiClass superClass = superMethod.getContainingClass(); if (superClass == null) continue; final HighlightInfo highlightInfo = checkStaticMethodOverride(aClass, method, isStatic, superClass, superMethod,containingFile); if (highlightInfo != null) { return highlightInfo; } } return null; }
private static boolean overridesObjectOrGroovyObject(PsiMethod method) { final String name = method.getName(); if (!OBJECT_METHODS.contains(name) && !GROOVY_OBJECT_METHODS.contains(name)) return false; final PsiMethod superMethod = PsiSuperMethodImplUtil.findDeepestSuperMethod(method); if (superMethod == null) return false; final PsiClass superClass = superMethod.getContainingClass(); if (superClass == null) return false; final String qname = superClass.getQualifiedName(); return CommonClassNames.JAVA_LANG_OBJECT.equals(qname) || GroovyCommonClassNames.GROOVY_OBJECT.equals(qname); }
@Override @NotNull public PsiMethod[] findSuperMethods(boolean checkAccess) { return PsiSuperMethodImplUtil.findSuperMethods(this, checkAccess); /*PsiClass containingClass = getContainingClass(); Set<PsiMethod> methods = new HashSet<PsiMethod>(); findSuperMethodRecursively(methods, containingClass, false, new HashSet<PsiClass>(), createMethodSignature(this), new HashSet<MethodSignature>()); return methods.toArray(new PsiMethod[methods.size()]);*/ }
private static boolean hasSuperMethod(PsiMethod method) { PsiClass containingClass = method.getContainingClass(); if (containingClass == null) return false; for (PsiMethod candidate : containingClass.findMethodsByName(method.getName(), true)) { if (candidate.getContainingClass() != containingClass && PsiSuperMethodImplUtil.isSuperMethodSmart(method, candidate)) { return true; } } return false; }
@NotNull public PsiMethod[] findSuperMethods(boolean checkAccess) { return PsiSuperMethodImplUtil.findSuperMethods(this, checkAccess); /*PsiClass containingClass = getContainingClass(); Set<PsiMethod> methods = new HashSet<PsiMethod>(); findSuperMethodRecursively(methods, containingClass, false, new HashSet<PsiClass>(), createMethodSignature(this), new HashSet<MethodSignature>()); return methods.toArray(new PsiMethod[methods.size()]);*/ }
/** * @return error if static method overrides instance method or * instance method overrides static. see JLS 8.4.6.1, 8.4.6.2 */ static HighlightInfo checkStaticMethodOverride(@NotNull PsiMethod method, @NotNull PsiFile containingFile) { // constructors are not members and therefor don't override class methods if(method.isConstructor()) { return null; } PsiClass aClass = method.getContainingClass(); if(aClass == null) { return null; } final HierarchicalMethodSignature methodSignature = PsiSuperMethodImplUtil.getHierarchicalMethodSignature(method); final List<HierarchicalMethodSignature> superSignatures = methodSignature.getSuperSignatures(); if(superSignatures.isEmpty()) { return null; } boolean isStatic = method.hasModifierProperty(PsiModifier.STATIC); for(HierarchicalMethodSignature signature : superSignatures) { final PsiMethod superMethod = signature.getMethod(); final PsiClass superClass = superMethod.getContainingClass(); if(superClass == null) { continue; } final HighlightInfo highlightInfo = checkStaticMethodOverride(aClass, method, isStatic, superClass, superMethod, containingFile); if(highlightInfo != null) { return highlightInfo; } } return null; }
@Override @NotNull public HierarchicalMethodSignature getHierarchicalMethodSignature() { return PsiSuperMethodImplUtil.getHierarchicalMethodSignature(this); }
@Override @NotNull public PsiMethod[] findSuperMethods() { return PsiSuperMethodImplUtil.findSuperMethods(this); }
@Override @NotNull public PsiMethod[] findSuperMethods(boolean checkAccess) { return PsiSuperMethodImplUtil.findSuperMethods(this, checkAccess); }
@Override @NotNull public PsiMethod[] findSuperMethods(PsiClass parentClass) { return PsiSuperMethodImplUtil.findSuperMethods(this, parentClass); }
@Override @NotNull public List<MethodSignatureBackedByPsiMethod> findSuperMethodSignaturesIncludingStatic(boolean checkAccess) { return PsiSuperMethodImplUtil.findSuperMethodSignaturesIncludingStatic(this, checkAccess); }
@Override public PsiMethod findDeepestSuperMethod() { return PsiSuperMethodImplUtil.findDeepestSuperMethod(this); }
@Override @NotNull public PsiMethod[] findDeepestSuperMethods() { return PsiSuperMethodImplUtil.findDeepestSuperMethods(this); }
@NotNull @Override public Collection<HierarchicalMethodSignature> getVisibleSignatures() { return PsiSuperMethodImplUtil.getVisibleSignatures(this); }
@Override @NotNull public Collection<HierarchicalMethodSignature> getVisibleSignatures() { return PsiSuperMethodImplUtil.getVisibleSignatures(this); }