package com.bignerdranch.linette.detectors; import com.android.annotations.NonNull; import com.android.tools.lint.detector.api.Category; import com.android.tools.lint.detector.api.Context; import com.android.tools.lint.detector.api.Detector; import com.android.tools.lint.detector.api.Implementation; import com.android.tools.lint.detector.api.Issue; import com.android.tools.lint.detector.api.JavaContext; import com.android.tools.lint.detector.api.Location; import com.android.tools.lint.detector.api.Scope; import com.android.tools.lint.detector.api.Severity; import com.android.tools.lint.detector.api.TextFormat; import java.io.File; import java.util.Arrays; import java.util.EnumSet; import java.util.List; import lombok.ast.AstVisitor; import lombok.ast.EnumConstant; import lombok.ast.EnumDeclaration; import lombok.ast.EnumTypeBody; import lombok.ast.ForwardingAstVisitor; import lombok.ast.Node; /** * Lint check for enum usage. */ public class EnumDetector extends Detector implements Detector.JavaScanner { private static final Class<? extends Detector> DETECTOR_CLASS = EnumDetector.class; private static final EnumSet<Scope> DETECTOR_SCOPE = Scope.JAVA_FILE_SCOPE; private static final Implementation IMPLEMENTATION = new Implementation( DETECTOR_CLASS, DETECTOR_SCOPE ); private static final String ISSUE_ID = "Enum"; private static final String ISSUE_DESCRIPTION = "Avoid Using Enums"; private static final String ISSUE_EXPLANATION = "No real Android programmer should ever use enums. EVER."; private static final Category ISSUE_CATEGORY = Category.PERFORMANCE; private static final int ISSUE_PRIORITY = 5; private static final Severity ISSUE_SEVERITY = Severity.WARNING; public static final Issue ISSUE = Issue.create( ISSUE_ID, ISSUE_DESCRIPTION, ISSUE_EXPLANATION, ISSUE_CATEGORY, ISSUE_PRIORITY, ISSUE_SEVERITY, IMPLEMENTATION ); /** * Constructs a new {@link EnumDetector} check */ public EnumDetector() { } @Override public boolean appliesTo(@NonNull Context context, @NonNull File file) { return true; } @Override public EnumSet<Scope> getApplicableFiles() { return Scope.JAVA_FILE_SCOPE; } @Override public List<Class<? extends Node>> getApplicableNodeTypes() { return Arrays.<Class<? extends Node>>asList( EnumDeclaration.class, EnumTypeBody.class, EnumConstant.class ); } @Override public AstVisitor createJavaVisitor(@NonNull JavaContext context) { return new EnumChecker(context); } private static class EnumChecker extends ForwardingAstVisitor { private final JavaContext mContext; public EnumChecker(JavaContext context) { mContext = context; } @Override public boolean visitEnumDeclaration(EnumDeclaration node) { mContext.report(ISSUE, Location.create(mContext.file), ISSUE.getBriefDescription(TextFormat.TEXT)); return super.visitEnumDeclaration(node); } } }