sleekbyte/tailor

View on GitHub
src/main/java/com/sleekbyte/tailor/common/Rules.java

Summary

Maintainability
A
0 mins
Test Coverage
package com.sleekbyte.tailor.common;

import com.sleekbyte.tailor.listeners.BlankLineListener;
import com.sleekbyte.tailor.listeners.BraceStyleListener;
import com.sleekbyte.tailor.listeners.ConstantNamingListener;
import com.sleekbyte.tailor.listeners.FileListener;
import com.sleekbyte.tailor.listeners.ForceTypeCastListener;
import com.sleekbyte.tailor.listeners.KPrefixListener;
import com.sleekbyte.tailor.listeners.LowerCamelCaseListener;
import com.sleekbyte.tailor.listeners.MultipleImportListener;
import com.sleekbyte.tailor.listeners.RedundantParenthesesListener;
import com.sleekbyte.tailor.listeners.SemicolonTerminatedListener;
import com.sleekbyte.tailor.listeners.TodoCommentListener;
import com.sleekbyte.tailor.listeners.TrailingClosureListener;
import com.sleekbyte.tailor.listeners.UpperCamelCaseListener;
import com.sleekbyte.tailor.listeners.whitespace.AngleBracketWhitespaceListener;
import com.sleekbyte.tailor.listeners.whitespace.ArrowWhitespaceListener;
import com.sleekbyte.tailor.listeners.whitespace.ColonWhitespaceListener;
import com.sleekbyte.tailor.listeners.whitespace.CommaWhitespaceListener;
import com.sleekbyte.tailor.listeners.whitespace.CommentWhitespaceListener;
import com.sleekbyte.tailor.listeners.whitespace.OperatorWhitespaceListener;
import com.sleekbyte.tailor.listeners.whitespace.ParenthesisWhitespaceListener;

/**
 * Enum for all rules implemented in Tailor.
 */
public enum Rules {
    ARROW_WHITESPACE,
    ANGLE_BRACKET_WHITESPACE,
    BRACE_STYLE,
    COLON_WHITESPACE,
    COMMA_WHITESPACE,
    COMMENT_WHITESPACE,
    CONSTANT_K_PREFIX,
    CONSTANT_NAMING,
    FORCED_TYPE_CAST,
    FUNCTION_WHITESPACE,
    LEADING_WHITESPACE,
    LOWER_CAMEL_CASE,
    MAX_CLASS_LENGTH,
    MAX_CLOSURE_LENGTH,
    MAX_FILE_LENGTH,
    MAX_FUNCTION_LENGTH,
    MAX_LINE_LENGTH,
    MAX_NAME_LENGTH,
    MAX_STRUCT_LENGTH,
    MIN_NAME_LENGTH,
    MULTIPLE_IMPORTS,
    OPERATOR_WHITESPACE,
    PARENTHESIS_WHITESPACE,
    REDUNDANT_PARENTHESES,
    TERMINATING_NEWLINE,
    TERMINATING_SEMICOLON,
    TODO_SYNTAX,
    TRAILING_CLOSURE,
    TRAILING_WHITESPACE,
    UPPER_CAMEL_CASE;

    private static final String BASE_STYLE_GUIDE_LINK = "https://github.com/sleekbyte/tailor/wiki/Rules#";
    public static final int REMEDIATION_POINTS = 50000;
    private String name;
    private RuleCategory category;
    private String className;
    private String description;
    private String examples;

    public String getName() {
        return this.name;
    }

    public String getCategory() {
        return this.category.toString();
    }

    public String getClassName() {
        return this.className;
    }

    public String getDescription() {
        return this.description;
    }

    public String getExamples() {
        return this.examples;
    }

    public String getLink() {
        return BASE_STYLE_GUIDE_LINK + this.getName();
    }

    /**
     * Provide a rough estimate for how long it would take to resolve the reported issue.
     *
     * @return an integer indicating the effort involved to remedy the issue
     */
    public int getRemediationPoints() {
        return REMEDIATION_POINTS;
    }

    static {
        ARROW_WHITESPACE.name = "arrow-whitespace";
        ARROW_WHITESPACE.description = "Flags all return arrows (->) that are not space delimited.";
        ARROW_WHITESPACE.examples =  RuleExamples.get(ARROW_WHITESPACE.name);
        ARROW_WHITESPACE.className = ArrowWhitespaceListener.class.getName();
        ARROW_WHITESPACE.category = RuleCategory.STYLE;

        ANGLE_BRACKET_WHITESPACE.name = "angle-bracket-whitespace";
        ANGLE_BRACKET_WHITESPACE.description = "Ensure no whitespace is present immediately before/after an opening"
            + " chevron and before the closing chevron.";
        ANGLE_BRACKET_WHITESPACE.examples = RuleExamples.get(ANGLE_BRACKET_WHITESPACE.name);
        ANGLE_BRACKET_WHITESPACE.className = AngleBracketWhitespaceListener.class.getName();
        ANGLE_BRACKET_WHITESPACE.category = RuleCategory.STYLE;

        BRACE_STYLE.name = "brace-style";
        BRACE_STYLE.description = "Definitions of constructs should follow the One True Brace Style (1TBS).";
        BRACE_STYLE.examples = RuleExamples.get(BRACE_STYLE.name);
        BRACE_STYLE.className = BraceStyleListener.class.getName();
        BRACE_STYLE.category = RuleCategory.STYLE;

        COLON_WHITESPACE.name = "colon-whitespace";
        COLON_WHITESPACE.description = "Flag whitespace violations around colons (:).";
        COLON_WHITESPACE.examples = RuleExamples.get(COLON_WHITESPACE.name);
        COLON_WHITESPACE.className = ColonWhitespaceListener.class.getName();
        COLON_WHITESPACE.category = RuleCategory.STYLE;

        COMMA_WHITESPACE.name = "comma-whitespace";
        COMMA_WHITESPACE.description = "Flags all commas (,) that are not left associated.";
        COMMA_WHITESPACE.examples = RuleExamples.get(COMMA_WHITESPACE.name);
        COMMA_WHITESPACE.className = CommaWhitespaceListener.class.getName();
        COMMA_WHITESPACE.category = RuleCategory.STYLE;

        COMMENT_WHITESPACE.name = "comment-whitespace";
        COMMENT_WHITESPACE.description = "Ensure at least one whitespace character after a comment opening symbol"
            + " (// or /*) and at least one whitespace character before a comment closing symbol (*/).";
        COMMENT_WHITESPACE.examples = RuleExamples.get(COMMENT_WHITESPACE.name);
        COMMENT_WHITESPACE.className = CommentWhitespaceListener.class.getName();
        COMMENT_WHITESPACE.category = RuleCategory.STYLE;

        CONSTANT_K_PREFIX.name = "constant-k-prefix";
        CONSTANT_K_PREFIX.description = "Flag constants with prefix k.";
        CONSTANT_K_PREFIX.examples = RuleExamples.get(CONSTANT_K_PREFIX.name);
        CONSTANT_K_PREFIX.className = KPrefixListener.class.getName();
        CONSTANT_K_PREFIX.category = RuleCategory.STYLE;

        CONSTANT_NAMING.name = "constant-naming";
        CONSTANT_NAMING.description = "Global constants should follow either UpperCamelCase or lowerCamelCase naming "
            + "conventions. Local constants should follow lowerCamelCase naming conventions.";
        CONSTANT_NAMING.examples = RuleExamples.get(CONSTANT_NAMING.name);
        CONSTANT_NAMING.className = ConstantNamingListener.class.getName();
        CONSTANT_NAMING.category = RuleCategory.STYLE;

        FORCED_TYPE_CAST.name = "forced-type-cast";
        FORCED_TYPE_CAST.description = "Flag uses of the forced form of the type cast operator (as!).";
        FORCED_TYPE_CAST.examples = RuleExamples.get(FORCED_TYPE_CAST.name);
        FORCED_TYPE_CAST.className = ForceTypeCastListener.class.getName();
        FORCED_TYPE_CAST.category = RuleCategory.BUG_RISK;

        FUNCTION_WHITESPACE.name = "function-whitespace";
        FUNCTION_WHITESPACE.description = "Every function declaration except those at the start and end of file "
            + "should have one blank line before and after itself.";
        FUNCTION_WHITESPACE.examples = RuleExamples.get(FUNCTION_WHITESPACE.name);
        FUNCTION_WHITESPACE.className = BlankLineListener.class.getName();
        FUNCTION_WHITESPACE.category = RuleCategory.STYLE;

        LEADING_WHITESPACE.name = "leading-whitespace";
        LEADING_WHITESPACE.description = "Verify that source files begin with a non-whitespace character.";
        LEADING_WHITESPACE.examples = RuleExamples.get(LEADING_WHITESPACE.name);
        LEADING_WHITESPACE.className = FileListener.class.getName();
        LEADING_WHITESPACE.category = RuleCategory.STYLE;

        LOWER_CAMEL_CASE.name = "lower-camel-case";
        LOWER_CAMEL_CASE.description = "Method and variable names should follow lowerCamelCase naming convention.";
        LOWER_CAMEL_CASE.examples = RuleExamples.get(LOWER_CAMEL_CASE.name);
        LOWER_CAMEL_CASE.className = LowerCamelCaseListener.class.getName();
        LOWER_CAMEL_CASE.category = RuleCategory.STYLE;

        MAX_CLASS_LENGTH.name = Messages.MAX_CLASS_LENGTH_OPT;
        MAX_CLASS_LENGTH.description = "Enforce a line limit on the lengths of class bodies.";
        MAX_CLASS_LENGTH.examples = RuleExamples.get(MAX_CLASS_LENGTH.name);
        MAX_CLASS_LENGTH.className = FileListener.class.getName();
        MAX_CLASS_LENGTH.category = RuleCategory.COMPLEXITY;

        MAX_CLOSURE_LENGTH.name = Messages.MAX_CLOSURE_LENGTH_OPT;
        MAX_CLOSURE_LENGTH.description = "Enforce a line limit on the lengths of closure bodies.";
        MAX_CLOSURE_LENGTH.examples = RuleExamples.get(MAX_CLOSURE_LENGTH.name);
        MAX_CLOSURE_LENGTH.className = FileListener.class.getName();
        MAX_CLOSURE_LENGTH.category = RuleCategory.COMPLEXITY;

        MAX_FILE_LENGTH.name = Messages.MAX_FILE_LENGTH_OPT;
        MAX_FILE_LENGTH.description = "Enforce a line limit on each file.";
        MAX_FILE_LENGTH.examples = RuleExamples.get(MAX_FILE_LENGTH.name);
        MAX_FILE_LENGTH.className = FileListener.class.getName();
        MAX_FILE_LENGTH.category = RuleCategory.COMPLEXITY;

        MAX_FUNCTION_LENGTH.name = Messages.MAX_FUNCTION_LENGTH_OPT;
        MAX_FUNCTION_LENGTH.description = "Enforce a line limit on the lengths of function bodies.";
        MAX_FUNCTION_LENGTH.examples = RuleExamples.get(MAX_FUNCTION_LENGTH.name);
        MAX_FUNCTION_LENGTH.className = FileListener.class.getName();
        MAX_FUNCTION_LENGTH.category = RuleCategory.COMPLEXITY;

        MAX_LINE_LENGTH.name = Messages.MAX_LINE_LENGTH_LONG_OPT;
        MAX_LINE_LENGTH.description = "Enforce a character limit on the length of each line.";
        MAX_LINE_LENGTH.examples = RuleExamples.get(MAX_LINE_LENGTH.name);
        MAX_LINE_LENGTH.className = FileListener.class.getName();
        MAX_LINE_LENGTH.category = RuleCategory.COMPLEXITY;

        MAX_NAME_LENGTH.name = Messages.MAX_NAME_LENGTH_OPT;
        MAX_NAME_LENGTH.description = "Enforce a character limit on the length of each construct name.";
        MAX_NAME_LENGTH.examples = RuleExamples.get(MAX_NAME_LENGTH.name);
        MAX_NAME_LENGTH.className = FileListener.class.getName();
        MAX_NAME_LENGTH.category = RuleCategory.STYLE;

        MAX_STRUCT_LENGTH.name = Messages.MAX_STRUCT_LENGTH_OPT;
        MAX_STRUCT_LENGTH.description = "Enforce a line limit on the lengths of struct bodies.";
        MAX_STRUCT_LENGTH.examples = RuleExamples.get(MAX_STRUCT_LENGTH.name);
        MAX_STRUCT_LENGTH.className = FileListener.class.getName();
        MAX_STRUCT_LENGTH.category = RuleCategory.COMPLEXITY;

        MIN_NAME_LENGTH.name = Messages.MIN_NAME_LENGTH_OPT;
        MIN_NAME_LENGTH.description = "Enforce a minimum character limit on the length of each construct name.";
        MIN_NAME_LENGTH.examples = RuleExamples.get(MIN_NAME_LENGTH.name);
        MIN_NAME_LENGTH.className = FileListener.class.getName();
        MIN_NAME_LENGTH.category = RuleCategory.STYLE;

        MULTIPLE_IMPORTS.name = "multiple-imports";
        MULTIPLE_IMPORTS.description = "Multiple import statements should not be defined on a single line.";
        MULTIPLE_IMPORTS.examples = RuleExamples.get(MULTIPLE_IMPORTS.name);
        MULTIPLE_IMPORTS.className = MultipleImportListener.class.getName();
        MULTIPLE_IMPORTS.category = RuleCategory.STYLE;

        OPERATOR_WHITESPACE.name = "operator-whitespace";
        OPERATOR_WHITESPACE.description = "Flags operators that are not space delimited in operator declarations.";
        OPERATOR_WHITESPACE.examples = RuleExamples.get(OPERATOR_WHITESPACE.name);
        OPERATOR_WHITESPACE.className = OperatorWhitespaceListener.class.getName();
        OPERATOR_WHITESPACE.category = RuleCategory.STYLE;

        PARENTHESIS_WHITESPACE.name = "parenthesis-whitespace";
        PARENTHESIS_WHITESPACE.description = "Ensure no whitespace is present immediately before/after an opening"
            + " parenthesis and before the closing parenthesis.";
        PARENTHESIS_WHITESPACE.examples = RuleExamples.get(PARENTHESIS_WHITESPACE.name);
        PARENTHESIS_WHITESPACE.className = ParenthesisWhitespaceListener.class.getName();
        PARENTHESIS_WHITESPACE.category = RuleCategory.STYLE;

        REDUNDANT_PARENTHESES.name = "redundant-parentheses";
        REDUNDANT_PARENTHESES.description = "Control flow constructs, exception handling constructs, and "
            + "values assigned in variable/constant declarations should not be enclosed in parentheses.";
        REDUNDANT_PARENTHESES.examples = RuleExamples.get(REDUNDANT_PARENTHESES.name);
        REDUNDANT_PARENTHESES.className = RedundantParenthesesListener.class.getName();
        REDUNDANT_PARENTHESES.category = RuleCategory.STYLE;

        TERMINATING_NEWLINE.name = "terminating-newline";
        TERMINATING_NEWLINE.description = "Verify that source files terminate with exactly one '\\n' character.";
        TERMINATING_NEWLINE.examples = RuleExamples.get(TERMINATING_NEWLINE.name);
        TERMINATING_NEWLINE.className = FileListener.class.getName();
        TERMINATING_NEWLINE.category = RuleCategory.STYLE;

        TERMINATING_SEMICOLON.name = "terminating-semicolon";
        TERMINATING_SEMICOLON.description = "Statements should not be terminated with semicolons.";
        TERMINATING_SEMICOLON.examples = RuleExamples.get(TERMINATING_SEMICOLON.name);
        TERMINATING_SEMICOLON.className = SemicolonTerminatedListener.class.getName();
        TERMINATING_SEMICOLON.category = RuleCategory.STYLE;

        TODO_SYNTAX.name = "todo-syntax";
        TODO_SYNTAX.description = "TODO comments should follow either <TODO: description> or"
            + " <TODO(dev-name): description> format.";
        TODO_SYNTAX.examples = RuleExamples.get(TODO_SYNTAX.name);
        TODO_SYNTAX.className = TodoCommentListener.class.getName();
        TODO_SYNTAX.category = RuleCategory.STYLE;

        TRAILING_CLOSURE.name = "trailing-closure";
        TRAILING_CLOSURE.description = "Functions that have a closure as their last argument should be called"
            + "using trailing closure syntax.";
        TRAILING_CLOSURE.examples = RuleExamples.get(TRAILING_CLOSURE.name);
        TRAILING_CLOSURE.className = TrailingClosureListener.class.getName();
        TRAILING_CLOSURE.category = RuleCategory.STYLE;

        TRAILING_WHITESPACE.name = "trailing-whitespace";
        TRAILING_WHITESPACE.description = "Flag whitespace after the last non-whitespace character on each line "
            + "until the newline.";
        TRAILING_WHITESPACE.examples = RuleExamples.get(TRAILING_WHITESPACE.name);
        TRAILING_WHITESPACE.className = FileListener.class.getName();
        TRAILING_WHITESPACE.category = RuleCategory.STYLE;

        UPPER_CAMEL_CASE.name = "upper-camel-case";
        UPPER_CAMEL_CASE.description = "Class, enum, enum value, struct, and protocol names should follow"
            + " UpperCamelCase naming convention.";
        UPPER_CAMEL_CASE.examples = RuleExamples.get(UPPER_CAMEL_CASE.name);
        UPPER_CAMEL_CASE.className = UpperCamelCaseListener.class.getName();
        UPPER_CAMEL_CASE.category = RuleCategory.STYLE;
    }
}