package de.is24.deadcode4j.analyzer;
import de.is24.deadcode4j.AnalysisContext;
import de.is24.deadcode4j.AnalysisSink;
import de.is24.deadcode4j.AnalyzedCode;
import javax.annotation.Nonnull;
import java.util.Set;
import static com.google.common.collect.Sets.newHashSet;
/**
* Analyzes class files: marks a class as being in use if it is a direct subclass of one of the specified classes.
*
* @since 1.4
*/
public final class CustomSuperClassAnalyzer extends SuperClassAnalyzer {
@Nonnull
private final Set<String> superClassesNotFoundInClassPath;
/**
* Creates a new <code>CustomAnnotationsAnalyzer</code>.
*
* @param customSuperClasses a list of fully qualified class names indicating that the extending class is in use
* @since 1.4
*/
public CustomSuperClassAnalyzer(@Nonnull Iterable<String> customSuperClasses) {
super("_custom-superclass_", customSuperClasses);
superClassesNotFoundInClassPath = newHashSet(customSuperClasses);
}
@Override
public void finishAnalysis(@Nonnull AnalysisContext analysisContext) {
super.finishAnalysis(analysisContext);
superClassesNotFoundInClassPath.removeAll(getSuperClassesFoundInClassPath(analysisContext));
}
@Override
public void finishAnalysis(@Nonnull AnalysisSink analysisSink, @Nonnull AnalyzedCode analyzedCode) {
super.finishAnalysis(analysisSink, analyzedCode);
for (String interfaceName : superClassesNotFoundInClassPath) {
logger.warn("SuperClass [{}] wasn't ever found in the class path. You should remove the configuration entry.", interfaceName);
}
}
}