@Override
    public void visitClassContext(ClassContext classContext) {
        try {
            JavaClass cls = classContext.getJavaClass();

            if (cls.isAbstract() || cls.isInterface()) {
                return;
            }

            if (Values.DOTTED_JAVA_LANG_OBJECT.equals(cls.getSuperclassName())) {
                return;
            }

            JavaClass[] infs = cls.getInterfaces();
            if (infs.length > 0) {
                Set<QMethod> clsMethods = buildMethodSet(cls);
                for (JavaClass inf : infs) {
                    Set<QMethod> infMethods = buildMethodSet(inf);
                    if (!infMethods.isEmpty()) {
                        infMethods.removeAll(clsMethods);

                        if (!infMethods.isEmpty()) {
                            JavaClass superCls = cls.getSuperClass();
                            filterSuperInterfaceMethods(inf, infMethods, superCls);
                            if (!infMethods.isEmpty() && !superCls.implementationOf(inf)) {
                                int priority = AnalysisContext.currentAnalysisContext().isApplicationClass(superCls) ? NORMAL_PRIORITY : LOW_PRIORITY;
                                BugInstance bi = new BugInstance(this, BugType.SCII_SPOILED_CHILD_INTERFACE_IMPLEMENTOR.name(), priority).addClass(cls)
                                        .addString("Implementing interface: " + inf.getClassName()).addString("Methods:");
                                for (QMethod methodInfo : infMethods) {
                                    bi.addString('\t' + methodInfo.toString());
                                }

                                bugReporter.reportBug(bi);
                                return;
                            }
                        }
                    }
                }
            }

        } catch (ClassNotFoundException cnfe) {
            bugReporter.reportMissingClass(cnfe);
        }
    }
@ Override public void visitClassContext ( ClassContext classContext ) { try { JavaClass cls = classContext . getJavaClass ( ) ; if ( cls . isAbstract ( ) || cls . isInterface ( ) ) { return ; } if ( Values . DOTTED_JAVA_LANG_OBJECT . equals ( cls . getSuperclassName ( ) ) ) { return ; } JavaClass [ ] infs = cls . getInterfaces ( ) ; if ( infs . length > 0 ) { Set < QMethod > clsMethods = buildMethodSet ( cls ) ; for ( JavaClass inf : infs ) { Set < QMethod > infMethods = buildMethodSet ( inf ) ; if ( ! infMethods . isEmpty ( ) ) { infMethods . removeAll ( clsMethods ) ; if ( ! infMethods . isEmpty ( ) ) { JavaClass superCls = cls . getSuperClass ( ) ; filterSuperInterfaceMethods ( inf , infMethods , superCls ) ; if ( ! infMethods . isEmpty ( ) && ! superCls . implementationOf ( inf ) ) { int priority = AnalysisContext . currentAnalysisContext ( ) . isApplicationClass ( superCls ) ? NORMAL_PRIORITY : LOW_PRIORITY ; BugInstance bi = new BugInstance ( this , BugType . SCII_SPOILED_CHILD_INTERFACE_IMPLEMENTOR . name ( ) , priority ) . addClass ( cls ) . addString ( "Implementing interface: " + inf . getClassName ( ) ) . addString ( "Methods:" ) ; for ( QMethod methodInfo : infMethods ) { bi . addString ( '\t' + methodInfo . toString ( ) ) ; } bugReporter . reportBug ( bi ) ; return ; } } } } } } catch ( ClassNotFoundException cnfe ) { bugReporter . reportMissingClass ( cnfe ) ; } }
looks for classes that implement interfaces but don't provide those methods

@param classContext
the context object of the currently parsed class