src/main/java/com/sleekbyte/tailor/common/Rules.java
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;
}
}