void (@NotNull PsiClass aClass, @NotNull PsiJavaCodeReferenceElement implementsReference) { final PsiElement target = implementsReference.resolve(); if (!(target instanceof PsiClass implementsClass)) { return; } @NonNls final String className = implementsClass.getQualifiedName(); if (className == null || !className.endsWith("Listener")) { return; } final PsiMethod[] interfaceMethods = implementsClass.getMethods(); if (interfaceMethods.length < 2) { return; } boolean allDefault = true; for (PsiMethod interfaceMethod : interfaceMethods) { if (!interfaceMethod.hasModifierProperty(PsiModifier.DEFAULT)) { allDefault = false; break; } } if (allDefault) { return; } @NonNls final String adapterName = className.substring(0, className.length() - 8) + "Adapter"; final GlobalSearchScope scope = implementsClass.getResolveScope(); final PsiClass adapterClass = JavaPsiFacade.getInstance(aClass.getProject()).findClass(adapterName, scope); if (adapterClass == null || adapterClass.equals(aClass) || !adapterClass.hasModifierProperty(PsiModifier.ABSTRACT) || adapterClass.isDeprecated()) { return; } final PsiReferenceList implementsList = adapterClass.getImplementsList(); if (implementsList == null) { return; } final PsiJavaCodeReferenceElement[] referenceElements = implementsList.getReferenceElements(); boolean adapterImplementsListener = false; for (PsiJavaCodeReferenceElement referenceElement : referenceElements) { final PsiElement implementsTarget = referenceElement.resolve(); if (!implementsClass.equals(implementsTarget)) { continue; } adapterImplementsListener = true; } if (!adapterImplementsListener) { return; } if (checkForEmptyMethods) { boolean emptyMethodFound = false; final PsiMethod[] methods = aClass.getMethods(); for (PsiMethod method : methods) { final PsiCodeBlock body = method.getBody(); if (!ControlFlowUtils.isEmptyCodeBlock(body)) { continue; } final PsiMethod[] superMethods = method.findSuperMethods(implementsClass); if (superMethods.length == 0) { continue; } emptyMethodFound = true; break; } if (!emptyMethodFound) { return; } } registerError(implementsReference, aClass, adapterName); }