move apigen and static analysis scripts to plugins. removed extra files

This commit is contained in:
Maxim Bachinsky 2020-08-19 17:06:08 +03:00
parent e3e730c762
commit 1b444a4582
35 changed files with 938 additions and 1457 deletions

View File

@ -1,210 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<!--
Checkstyle configuration that checks the Google coding conventions from:
- Google Java Style
https://google-styleguide.googlecode.com/svn-history/r130/trunk/javaguide.html
Checkstyle is very configurable. Be sure to read the documentation at
http://checkstyle.sf.net (or in your downloaded distribution).
Most Checks are configurable, be sure to consult the documentation.
To completely disable a check, just comment it out or delete it from the file.
Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
-->
<module name = "Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>
<property name="fileExtensions" value="java, properties, xml"/>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<module name="TreeWalker">
<module name="MethodLength">
<property name="max" value="40"/>
</module>
<module name="FinalParameters">
<property name="tokens" value="METHOD_DEF, CTOR_DEF, LITERAL_CATCH, FOR_EACH_CLAUSE"/>
</module>
<module name="OuterTypeFilename"/>
<module name="IllegalTokenText">
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
<property name="format" value="\\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
<property name="message" value="Avoid using corresponding octal or Unicode escape."/>
</module>
<module name="AvoidEscapedUnicodeCharacters">
<property name="allowEscapesForControlCharacters" value="true"/>
<property name="allowByTailComment" value="true"/>
<property name="allowNonPrintableEscapes" value="true"/>
</module>
<module name="LineLength">
<property name="max" value="150"/>
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<module name="AvoidStarImport"/>
<module name="OneTopLevelClass"/>
<module name="NoLineWrap"/>
<module name="EmptyBlock">
<property name="option" value="TEXT"/>
<property name="tokens" value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
</module>
<module name="NeedBraces"/>
<module name="LeftCurly">
<property name="maxLineLength" value="150"/>
</module>
<module name="RightCurly"/>
<module name="RightCurly">
<property name="option" value="alone"/>
<property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
</module>
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
<message key="ws.notFollowed"
value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
<message key="ws.notPreceded"
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
</module>
<module name="OneStatementPerLine"/>
<module name="MultipleVariableDeclarations"/>
<module name="ArrayTypeStyle"/>
<module name="MissingSwitchDefault"/>
<module name="FallThrough"/>
<module name="UpperEll"/>
<module name="ModifierOrder"/>
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="COMMA"/>
<property name="option" value="EOL"/>
</module>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
<message key="name.invalidPattern"
value="Package name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="TypeName">
<message key="name.invalidPattern"
value="Type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MemberName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Member name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ParameterName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="LocalVariableName">
<property name="tokens" value="VARIABLE_DEF"/>
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<property name="allowOneCharVarInForLoop" value="true"/>
<message key="name.invalidPattern"
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ClassTypeParameterName">
<property name="format" value="^[T]([A-Z][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MethodTypeParameterName">
<property name="format" value="^[T]([A-Z][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Method type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="NoFinalizer"/>
<module name="GenericWhitespace">
<message key="ws.followed"
value="GenericWhitespace ''{0}'' is followed by whitespace."/>
<message key="ws.preceded"
value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
<message key="ws.illegalFollow"
value="GenericWhitespace ''{0}'' should followed by whitespace."/>
<message key="ws.notPreceded"
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
</module>
<module name="Indentation">
<property name="basicOffset" value="4"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="4"/>
<property name="throwsIndent" value="4"/>
<property name="lineWrappingIndentation" value="4"/>
<property name="arrayInitIndent" value="4"/>
</module>
<module name="AbbreviationAsWordInName">
<property name="ignoreFinal" value="false"/>
<property name="allowedAbbreviationLength" value="1"/>
</module>
<module name="OverloadMethodsDeclarationOrder"/>
<module name="VariableDeclarationUsageDistance"/>
<module name="MethodParamPad"/>
<module name="OperatorWrap">
<property name="option" value="NL"/>
<property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
</module>
<module name="AnnotationLocation">
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
</module>
<module name="AnnotationLocation">
<property name="tokens" value="VARIABLE_DEF"/>
<property name="allowSamelineMultipleAnnotations" value="true"/>
</module>
<module name="NonEmptyAtclauseDescription"/>
<module name="JavadocTagContinuationIndentation"/>
<module name="SummaryJavadocCheck">
<property name="forbiddenSummaryFragments" value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
</module>
<module name="JavadocParagraph"/>
<module name="AtclauseOrder">
<property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
<property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
</module>
<module name="JavadocMethod">
<property name="scope" value="nothing"/>
<property name="allowMissingParamTags" value="true"/>
<property name="allowMissingThrowsTags" value="true"/>
<property name="allowMissingReturnTag" value="true"/>
<property name="minLineCount" value="2"/>
<property name="allowedAnnotations" value="Override, Test"/>
<property name="allowThrowsTagsForSubclasses" value="true"/>
</module>
<module name="MethodName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
<message key="name.invalidPattern"
value="Method name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="SingleLineJavadoc"/>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected"/>
</module>
<module name="SuppressWarningsHolder" />
</module>
<module name="SuppressWarningsFilter" />
</module>

View File

@ -1,339 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>
<property name="fileExtensions" value="java, properties, xml"/>
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<module name="TreeWalker">
<!-- CUSTOM CHECKS START-->
<module name="NullAnnotationsCheck"/>
<module name="CustomDeclarationOrder">
<property name="customDeclarationOrder"
value="Field(static final)
### Field(static)
### Ctor(static)
### Method(static)
### Field(.*)
### Ctor(.*)
### Method(.*)
### InnerEnum(.*)
### InnerInterface(.*)
### InnerClass(.*)"/>
</module>
<!-- CUSTOM CHECKS END-->
<module name="AbbreviationAsWordInName">
<property name="ignoreFinal" value="false"/>
<property name="allowedAbbreviationLength" value="1"/>
</module>
<!-- <module name="AbstractClassName"/> -->
<module name="AnnotationLocation">
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
<property name="allowSamelineSingleParameterlessAnnotation" value="false"/>
</module>
<module name="AnnotationLocation">
<property name="tokens"
value="VARIABLE_DEF, PARAMETER_DEF, ANNOTATION_DEF, TYPECAST, LITERAL_THROWS, IMPLEMENTS_CLAUSE, TYPE_ARGUMENT, LITERAL_NEW, DOT, ANNOTATION_FIELD_DEF"/>
<property name="allowSamelineMultipleAnnotations" value="true"/>
</module>
<!-- <module name="AnnotationUseStyle"/> -->
<!-- <module name="AnonInnerLength"/> -->
<!-- <module name="ArrayTrailingComma"/> -->
<module name="ArrayTypeStyle"/>
<module name="AtclauseOrder">
<property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
<property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
</module>
<module name="AvoidEscapedUnicodeCharacters">
<property name="allowEscapesForControlCharacters" value="true"/>
<property name="allowByTailComment" value="true"/>
<property name="allowNonPrintableEscapes" value="true"/>
</module>
<!-- <module name="AvoidInlineConditionals"/> -->
<module name="AvoidNestedBlocks">
<property name="allowInSwitchCase" value="true"/>
</module>
<module name="AvoidStarImport"/>
<module name="AvoidStaticImport"/>
<!-- <module name="BooleanExpressionComplexity"/> -->
<module name="CatchParameterName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- <module name="ClassDataAbstractionCoupling"/> -->
<!-- <module name="ClassFanOutComplexity"/> -->
<module name="ClassTypeParameterName">
<property name="format" value="^[T]([A-Z][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="CommentsIndentation"/>
<module name="ConstantName"/>
<!-- <module name="CovariantEquals"/> -->
<!-- <module name="CustomImportOrder"/> -->
<!-- <module name="CyclomaticComplexity"/> -->
<!-- <module name="DeclarationOrder"/> -->
<module name="DefaultComesLast"/>
<!-- <module name="DescendantToken"/> -->
<!-- <module name="DesignForExtension"/> -->
<module name="EmptyBlock">
<property name="option" value="TEXT"/>
<property name="tokens"
value="LITERAL_WHILE, LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_DO, LITERAL_IF, LITERAL_ELSE, LITERAL_FOR, INSTANCE_INIT, STATIC_INIT, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_CASE, LITERAL_DEFAULT"/>
</module>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected"/>
</module>
<!-- <module name="EmptyForInitializerPad"/> -->
<!-- <module name="EmptyForIteratorPad"/> -->
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
<module name="EmptyStatement"/>
<!-- <module name="EqualsAvoidNull"/> -->
<module name="EqualsHashCode"/>
<!-- <module name="ExecutableStatementCount"/> -->
<!-- <module name="ExplicitInitialization"/> -->
<module name="FallThrough"/>
<!-- <module name="FileLength"/> -->
<!-- <module name="FinalClass"/> -->
<module name="FinalLocalVariable"/>
<module name="FinalParameters">
<property name="tokens" value="METHOD_DEF, CTOR_DEF, LITERAL_CATCH, FOR_EACH_CLAUSE"/>
</module>
<module name="GenericWhitespace">
<message key="ws.followed"
value="GenericWhitespace ''{0}'' is followed by whitespace."/>
<message key="ws.preceded"
value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
<message key="ws.illegalFollow"
value="GenericWhitespace ''{0}'' should followed by whitespace."/>
<message key="ws.notPreceded"
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
</module>
<!-- <module name="Header"/> -->
<!-- <module name="HiddenField"> -->
<!-- <module name="HideUtilityClassConstructor"/> -->
<!-- <module name="IllegalCatch"/> -->
<!-- <module name="IllegalImport"/> -->
<!-- <module name="IllegalInstantiation"/> -->
<!-- <module name="IllegalThrows"/> -->
<!-- <module name="IllegalToken"/> -->
<module name="IllegalTokenText">
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
<property name="format" value="\\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
<property name="message" value="Avoid using corresponding octal or Unicode escape."/>
</module>
<!-- <module name="IllegalType"/> -->
<!-- <module name="ImportControl"/> -->
<!-- <module name="ImportOrder"/> -->
<module name="Indentation">
<property name="basicOffset" value="4"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="4"/>
<property name="throwsIndent" value="4"/>
<property name="lineWrappingIndentation" value="4"/>
<property name="arrayInitIndent" value="8"/>
</module>
<module name="InnerAssignment"/>
<module name="InnerTypeLast"/>
<module name="InterfaceIsType"/>
<module name="InterfaceTypeParameterName">
<property name="format" value="^[T]([A-Z][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="JavadocMethod">
<property name="scope" value="nothing"/>
<property name="allowMissingParamTags" value="true"/>
<property name="allowMissingThrowsTags" value="true"/>
<property name="allowMissingReturnTag" value="true"/>
<property name="minLineCount" value="2"/>
<property name="allowedAnnotations" value="Override, Test"/>
<property name="allowThrowsTagsForSubclasses" value="true"/>
</module>
<!-- <module name="JavadocPackage"/> -->
<module name="JavadocParagraph"/>
<!-- <module name="JavadocStyle"/> -->
<!-- https://youtrack.jetbrains.com/issue/IDEA-121723 <module name="JavadocTagContinuationIndentation"/> -->
<!-- <module name="JavadocType"/> -->
<!-- <module name="JavadocVariable"/> -->
<!-- <module name="JavaNCSS"/> -->
<module name="LeftCurly">
<property name="maxLineLength" value="150"/>
</module>
<module name="LineLength">
<property name="max" value="150"/>
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<module name="LocalFinalVariableName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Final variable/parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="LocalVariableName">
<property name="allowOneCharVarInForLoop" value="true"/>
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- <module name="MagicNumber"/> -->
<module name="MemberName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Member name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- <module name="MethodCount"/> -->
<module name="MethodLength">
<property name="max" value="40"/>
</module>
<module name="MethodName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
<message key="name.invalidPattern"
value="Method name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MethodParamPad"/>
<module name="MethodTypeParameterName">
<property name="format" value="^[T]([A-Z][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Method type name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- <module name="MissingCtor"/> -->
<!-- <module name="MissingDeprecated"/> -->
<module name="MissingOverride"/>
<module name="MissingSwitchDefault"/>
<!-- <module name="ModifiedControlVariable"/> -->
<module name="ModifierOrder"/>
<!-- <module name="MultipleStringLiterals"/> -->
<module name="MultipleVariableDeclarations"/>
<module name="MutableException"/>
<module name="NeedBraces"/>
<!-- <module name="NestedForDepth"/> -->
<!-- <module name="NestedIfDepth"/> -->
<!-- <module name="NestedTryDepth"/> -->
<!-- <module name="NewlineAtEndOfFile"/> -->
<module name="NoClone"/>
<module name="NoFinalizer"/>
<module name="NoLineWrap"/>
<module name="NonEmptyAtclauseDescription"/>
<module name="NoWhitespaceAfter">
<property name="tokens"
value="ARRAY_INIT, INC, DEC, UNARY_MINUS, UNARY_PLUS, BNOT, LNOT, DOT, ARRAY_DECLARATOR, INDEX_OP"/>
</module>
<module name="NoWhitespaceBefore">
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, GENERIC_END"/>
</module>
<!-- <module name="NPathComplexity"/> -->
<module name="OneStatementPerLine"/>
<module name="OneTopLevelClass"/>
<module name="OperatorWrap">
<property name="option" value="NL"/>
<property name="tokens"
value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
</module>
<module name="OuterTypeFilename"/>
<!-- <module name="OuterTypeNumber"/> -->
<module name="OverloadMethodsDeclarationOrder"/>
<!-- <module name="PackageAnnotation"/> -->
<!-- <module name="PackageDeclaration"/> -->
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
<message key="name.invalidPattern"
value="Package name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ParameterAssignment"/>
<module name="ParameterName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- <module name="ParameterNumber"/> -->
<!-- <module name="ParenPad"/> -->
<module name="RedundantImport"/>
<!-- <module name="RedundantModifier"/> -->
<!-- <module name="Regexp"/> -->
<!-- <module name="RegexpHeader"/> -->
<!-- <module name="RegexpMultiline"/> -->
<!-- <module name="RegexpOnFilename"/> -->
<!-- <module name="RegexpSingleline"/> -->
<!-- <module name="RegexpSinglelineJava"/> -->
<!-- <module name="ReturnCount"/> -->
<module name="RequireThis">
<property name="checkMethods" value="false"/>
</module>
<module name="RightCurly"/>
<module name="RightCurly">
<property name="option" value="alone"/>
<property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="COMMA"/>
<property name="option" value="EOL"/>
</module>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<module name="SingleLineJavadoc"/>
<module name="SingleSpaceSeparator"/>
<module name="StaticVariableName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Static variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="StringLiteralEquality"/>
<module name="SummaryJavadoc">
<property name="forbiddenSummaryFragments" value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
</module>
<!-- <module name="SuperClone"/> -->
<!-- <module name="SuperFinalize"/> -->
<!-- <module name="SuppressWarnings"/> -->
<module name="SuppressWarningsHolder"/>
<!-- <module name="ThrowsCount"/> -->
<!-- <module name="TodoComment"/> -->
<!-- <module name="TrailingComment"/> -->
<!-- <module name="Translation"/> -->
<!-- <module name="TypecastParenPad"/> -->
<module name="TypeName">
<message key="name.invalidPattern"
value="Type name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- <module name="UncommentedMain"/> -->
<!-- <module name="UniqueProperties"/> -->
<module name="UnnecessaryParentheses">
<property name="tokens"
value=" EXPR, IDENT, NUM_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONG, STRING_LITERAL, LITERAL_NULL, LITERAL_FALSE, LITERAL_TRUE, ASSIGN, BAND_ASSIGN, BOR_ASSIGN, BSR_ASSIGN, BXOR_ASSIGN, DIV_ASSIGN, MINUS_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, SL_ASSIGN, SR_ASSIGN, STAR_ASSIGN"/>
</module>
<module name="UnusedImports"/>
<module name="UpperEll"/>
<module name="VariableDeclarationUsageDistance"/>
<!-- <module name="VisibilityModifier"/> -->
<!-- <module name="WhitespaceAfter"/> -->
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
<message key="ws.notFollowed"
value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
<message key="ws.notPreceded"
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
</module>
<!-- <module name="WriteTag"/> -->
</module>
<module name="SuppressWarningsFilter"/>
</module>

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<!-- ignore all issues in resource generation -->
<Class name="~.*\.R\$.*"/>
</Match>
<Match>
<Class name="~.*\.Manifest\$.*"/>
</Match>
<Match>
<!-- ignore concrete check groups -->
<Bug code="DP"/>
</Match>
<Match>
<!-- ignore concrete checks -->
<Bug pattern="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE, NP_UNWRITTEN_FIELD, UWF_NULL_FIELD, UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR, PZLA_PREFER_ZERO_LENGTH_ARRAYS, EI_EXPOSE_REP, EI_EXPOSE_REP2, REC_CATCH_EXCEPTION, EQ_COMPARETO_USE_OBJECT_EQUALS, BC_UNCONFIRMED_CAST, EQ_DOESNT_OVERRIDE_EQUALS, BC_IMPOSSIBLE_CAST" />
</Match>
<Match>
<Bug code="UPM" />
<Class name="~.*\$\$Lambda\$.*"/>
</Match>
</FindBugsFilter>

View File

@ -1,44 +0,0 @@
repositories {
maven {
url 'https://dl.bintray.com/touchin/touchin-tools'
metadataSources {
artifact()
}
}
}
configurations {
apigenerator
}
dependencies {
apigenerator 'ru.touchin:api-generator:1.4.0-beta3'
}
android.libraryVariants.all { variant ->
final File generatedModelsDirectory = new File("${project.buildDir}/generated/source/models/${variant.dirName}")
def generateJsonModelsTask = tasks.create("apiGenerator${variant.name}") doLast {
javaexec {
main = "-jar"
workingDir = file("${rootDir}")
args = [
configurations.apigenerator.asPath,
"generate-client-code",
"--output-language",
"KOTLIN",
"--specification-path",
rootProject.extensions.findByName("pathToApiSchemes"),
"--kotlin-methods-generation-mode",
"COROUTINE",
"--output-path",
"${generatedModelsDirectory.path}",
"--package-name",
"${rootProject.extensions.findByName("applicationId") ?: applicationId}"
]
}
}
generateJsonModelsTask.description = 'Generates Java classes for JSON models'
variant.registerJavaGeneratingTask generateJsonModelsTask, generatedModelsDirectory
}

View File

@ -1,38 +0,0 @@
repositories {
maven {
url "https://dl.bintray.com/touchin/touchin-tools"
metadataSources {
artifact()
}
}
}
configurations {
apigeneratorKotlinServer
}
dependencies {
apigeneratorKotlinServer 'ru.touchin:api-generator:1.4.0-beta1'
}
task generateApiModelsKotlinServer doLast {
javaexec {
main = "-jar"
workingDir = file("${rootDir}")
args = [
configurations.apigeneratorKotlinServer.asPath,
"generate-client-code",
"--output-language",
"KOTLIN_SERVER",
"--specification-path",
rootProject.extensions.findByName("pathToApiSchemes"),
"--output-path",
"${rootDir}/src/main/kotlin",
"--package-name",
rootProject.extensions.findByName("apiPackageName"),
"--recreate_output_dirs",
false
]
}
}

View File

@ -1,233 +0,0 @@
apply plugin: 'cpd'
apply plugin: 'io.gitlab.arturbosch.detekt'
def getCpdTask
def getLintTask
def getKotlinDetektTasks
def appendError
def appendCpdErrors
def appendKotlinErrors
def appendLintErrors
repositories {
maven { url "http://dl.bintray.com/touchin/touchin-tools" }
}
configurations {
pngtastic
}
cpd {
skipLexicalErrors = true
}
import org.apache.tools.ant.taskdefs.condition.Os
ext.getIdeaFormatTask = { isAndroidProject, sources ->
def ideaPath = System.getenv("IDEA_HOME")
if (ideaPath == null) {
return tasks.create((isAndroidProject ? "android" : "server") + "donothing")
}
return tasks.create((isAndroidProject ? "android" : "server") + "IdeaFormat_$project.name", Exec) {
def inspectionPath
def params = ["-r", "-mask", "*.java,*.kt,*.xml"]
for (String source : sources) {
params.add(source)
}
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
inspectionPath = ['cmd', '/c', "\"${ideaPath}\\bin\\format.bat\" ${params.join(" ")}"]
} else {
inspectionPath = ["$ideaPath/bin/format.sh"]
}
commandLine inspectionPath
if (!Os.isFamily(Os.FAMILY_WINDOWS)) {
args = params
}
}
}
ext.getStaticAnalysisTaskNames = { isAndroidProject, sources, buildVariant ->
def tasksNames = new ArrayList<String>()
try {
tasksNames.add(getCpdTask(isAndroidProject, sources))
tasksNames.addAll(getKotlinDetektTasks())
if (isAndroidProject) {
tasksNames.add(getLintTask(buildVariant))
}
} catch (Exception exception) {
println(exception.toString())
}
return tasksNames
}
ext.generateReport = { isAndroidProject ->
StringBuilder consoleReport = new StringBuilder()
consoleReport.append("STATIC ANALYSIS RESULTS:")
def count = 0
def previousCount = count
count = appendCpdErrors(count, new File("${project.buildDir}/reports/cpd.xml"))
if (count - previousCount > 0) {
consoleReport.append("\nCPD: FAILED (" + (count - previousCount) + " errors)")
} else {
consoleReport.append("\nCPD: PASSED")
}
previousCount = count
subprojects.forEach { subproject ->
def reportFile = new File("${rootProject.buildDir}/reports/kotlin-detekt-${subproject.name}.xml")
if (reportFile.exists()) {
count = appendKotlinErrors(count, reportFile).toInteger()
}
}
if (count - previousCount > 0) {
consoleReport.append("\nKotlin-detekt: FAILED (" + (count - previousCount) + " errors)")
} else {
consoleReport.append("\nKotlin-detekt: PASSED")
}
if (isAndroidProject) {
previousCount = count
count = appendLintErrors(count, new File("${rootProject.buildDir}/reports/lint_report.xml"))
if (count - previousCount > 0) {
consoleReport.append("\nLint: FAILED (" + (count - previousCount) + " errors)")
} else {
consoleReport.append("\nLint: PASSED")
}
}
if (count > 0) {
consoleReport.append("\nOverall: FAILED (" + count + " errors)")
throw new Exception(consoleReport.toString())
} else {
consoleReport.append("\nOverall: PASSED")
println(consoleReport.toString())
}
}
appendError = { number, analyzer, file, line, errorId, errorLink, description ->
println("$number. $analyzer : $description ($errorId)\n\tat $file: $line")
}
appendKotlinErrors = { count, checkstyleFile ->
def rootNode = new XmlParser().parse(checkstyleFile)
for (def fileNode : rootNode.children()) {
if (!fileNode.name().equals("file")) {
continue
}
for (def errorNode : fileNode.children()) {
if (!errorNode.name().equals("error")) {
continue
}
count++
appendError(count, "Detekt", fileNode.attribute("name"), errorNode.attribute("line"), errorNode.attribute("source"), "", errorNode.attribute("message"))
}
}
return count
}
appendCpdErrors = { count, cpdFile ->
def rootNode = new XmlParser().parse(cpdFile)
for (def duplicationNode : rootNode.children()) {
if (!duplicationNode.name().equals("duplication")) {
continue
}
count++
def duplicationIndex = 0
String duplicationPoints = ""
for (def filePointNode : duplicationNode.children()) {
if (filePointNode.name().equals("file")) {
def file = filePointNode.attribute("path")
def line = filePointNode.attribute("line")
duplicationPoints += "\n " + file + ":" + line
duplicationIndex++
}
}
println("$count CPD: code duplication $duplicationPoints")
}
return count
}
appendLintErrors = { count, lintFile ->
def rootNode = new XmlParser().parse(lintFile)
for (def issueNode : rootNode.children()) {
if (!issueNode.name().equals("issue")
|| !issueNode.attribute("severity").equals("Error")) {
continue
}
for (def locationNode : issueNode.children()) {
if (!locationNode.name().equals("location")) {
continue
}
count++
appendError(count, "Lint", locationNode.attribute("file"), locationNode.attribute("line"),
issueNode.attribute("id"), issueNode.attribute("explanation"), issueNode.attribute("message"))
}
}
return count
}
getCpdTask = { isAndroidProject, sources ->
def taskName = (isAndroidProject ? "android" : "server") + "cpd_${rootProject.name}"
def task = tasks.findByName(taskName)
if (task == null) {
task = tasks.create(taskName, tasks.findByName('cpdCheck').getClass().getSuperclass()) {
minimumTokenCount = 60
source = files(sources)
ignoreFailures = true
reports {
xml {
enabled = true
destination = file("${rootProject.buildDir}/reports/cpd.xml")
}
}
}
}
return task.path
}
getLintTask = { buildVariant ->
def appProject = subprojects.find { it.plugins.hasPlugin("com.android.application") }
def lintTaskPath
if (buildVariant != null) {
lintTaskPath = ":${appProject.name}:lint${buildVariant.name.capitalize()}"
} else {
def lintDebugTasks = appProject.tasks.matching { it.getName().contains("lint") && it.getName().contains("Debug") }
lintTaskPath = lintDebugTasks.first().path
}
if (lintTaskPath == null) {
throw IllegalStateException("Unable to find lint debug task for build variant: ${buildVariant}")
}
return lintTaskPath
}
getKotlinDetektTasks = {
subprojects
.findResults { it.tasks.findByName("detekt")?.path }
.findAll { !it.contains(":libs") }
}
task optimizePng {
doFirst {
def jarArgs = new ArrayList<String>()
jarArgs.add(configurations.pngtastic.asPath)
def relatedPathIndex = "${rootDir}".length() + 1
for (def file : fileTree(dir: "${rootDir}", include: '**/src/**/res/drawable**/*.png')) {
jarArgs.add(file.absolutePath.substring(relatedPathIndex))
}
for (def file : fileTree(dir: "${rootDir}", include: '**/src/**/res/mipmap**/*.png')) {
jarArgs.add(file.absolutePath.substring(relatedPathIndex))
}
javaexec { main = "-jar"; args = jarArgs; workingDir = file("${rootDir}") }
}
}
dependencies {
pngtastic 'com.github.depsypher:pngtastic:1.2'
}

19
gradle/plugins/.gitignore vendored Normal file
View File

@ -0,0 +1,19 @@
# Generated files
bin/
gen/
# Gradle files
.gradle/
build/
/*/build/
# Local configuration file (sdk path, etc)
local.properties
# Log Files
*.log
.gradle
.idea
.DS_Store
/captures
*.iml

View File

@ -0,0 +1,52 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
`java-gradle-plugin`
`kotlin-dsl`
}
// The kotlin-dsl plugin requires a repository to be declared
repositories {
jcenter()
google()
}
dependencies {
// android gradle plugin, required by custom plugin
implementation("com.android.tools.build:gradle:4.0.1")
implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.10.0")
implementation("de.aaschmid:gradle-cpd-plugin:3.1")
// kotlin plugin, required by custom plugin
implementation(kotlin("gradle-plugin", embeddedKotlinVersion))
gradleKotlinDsl()
implementation(kotlin("stdlib-jdk8"))
}
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions {
jvmTarget = "1.8"
}
gradlePlugin {
plugins {
create("api-generator-android") {
id = "api-generator-android"
implementationClass = "apigen.ApiGeneratorAndroidPlugin"
}
create("api-generator-backend") {
id = "api-generator-backend"
implementationClass = "apigen.ApiGeneratorBackendPlugin"
}
create("static-analysis-android") {
id = "static-analysis-android"
implementationClass = "static_analysis.plugins.StaticAnalysisAndroidPlugin"
}
create("static-analysis-backend") {
id = "static-analysis-backend"
implementationClass = "static_analysis.plugins.StaticAnalysisBackendPlugin"
}
}
}

View File

View File

@ -0,0 +1,37 @@
package apigen
import com.android.build.gradle.LibraryExtension
import org.gradle.api.Project
import org.gradle.kotlin.dsl.getByType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
class ApiGeneratorAndroidPlugin : ApiGeneratorPlugin() {
override fun apply(target: Project) {
super.apply(target)
with(target) {
val extension = getExtension()
val outputDir = getDirectoryForGeneration()
extension.outputDirPath = outputDir.path
extension.recreateOutputDir = true
afterEvaluate {
extensions.getByType<LibraryExtension>().apply {
sourceSets.getByName("main")
.java
.srcDir(outputDir)
}
tasks
.filterIsInstance(KotlinCompile::class.java)
.forEach {
it.source(outputDir)
}
}
}
}
private fun Project.getDirectoryForGeneration() = file("$buildDir/generated/api")
}

View File

@ -0,0 +1,19 @@
package apigen
import org.gradle.api.Project
class ApiGeneratorBackendPlugin : ApiGeneratorPlugin() {
override fun apply(target: Project) {
super.apply(target)
with(target) {
val extension = getExtension()
extension.outputDirPath = file("src/main/kotlin").path
extension.recreateOutputDir = false
extension.outputLanguage = OutputLanguage.KotlinServer
}
}
}

View File

@ -0,0 +1,22 @@
package apigen
open class ApiGeneratorExtension(
var pathToApiSchemes: String? = null,
var outputPackageName: String = "",
var outputDirPath: String = "",
var recreateOutputDir: Boolean = false,
var outputLanguage: OutputLanguage? = null
)
sealed class OutputLanguage(val argName: String, val methodOutputType: MethodOutputType? = null) {
object KotlinServer : OutputLanguage("KOTLIN_SERVER")
class KotlinAndroid(methodOutputType: MethodOutputType = MethodOutputType.Rx) : OutputLanguage("KOTLIN", methodOutputType)
object Java : OutputLanguage("JAVA")
object Swift : OutputLanguage("SWIFT")
}
sealed class MethodOutputType(val argName: String) {
object Rx : MethodOutputType("REACTIVE")
object RetrofitCall : MethodOutputType("CALL")
object Coroutine : MethodOutputType("COROUTINE")
}

View File

@ -0,0 +1,76 @@
package apigen
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.repositories
abstract class ApiGeneratorPlugin : Plugin<Project> {
companion object {
const val API_GENERATOR_CONFIG = "apiGenerator"
const val API_GENERATOR_EXT_NAME = "apiGenerator"
const val API_GENERATOR_VERSION = "1.4.0-beta4"
}
override fun apply(target: Project) {
with(target) {
repositories {
maven {
url = uri("https://dl.bintray.com/touchin/touchin-tools")
metadataSources {
artifact()
}
}
}
configurations.create(API_GENERATOR_CONFIG)
dependencies {
add(API_GENERATOR_CONFIG, "ru.touchin:api-generator:$API_GENERATOR_VERSION")
}
extensions.create<ApiGeneratorExtension>(API_GENERATOR_EXT_NAME)
val apiGenTask = createApiGeneratorTask()
gradle.projectsEvaluated {
tasks.getByName("preBuild").dependsOn(apiGenTask)
}
}
}
protected fun Project.getExtension(): ApiGeneratorExtension = extensions.getByName(API_GENERATOR_EXT_NAME) as ApiGeneratorExtension
private fun Project.createApiGeneratorTask(): Task = tasks.create(API_GENERATOR_CONFIG).doLast {
val extension = getExtension()
val pathToApiSchemes = extension.pathToApiSchemes ?: throw IllegalStateException("Configure path to api schemes for api generator plugin")
val outputLanguage = extension.outputLanguage ?: throw IllegalStateException("Configure output language code for api generator plugin")
javaexec {
main = "-jar"
workingDir = rootDir
args = listOfNotNull(
configurations.getByName("apiGenerator").asPath,
"generate-client-code",
"--output-language",
outputLanguage.argName,
"--specification-path",
pathToApiSchemes,
"--kotlin-methods-generation-mode".takeIf { outputLanguage.methodOutputType != null },
outputLanguage.methodOutputType?.argName,
"--output-path",
extension.outputDirPath,
"--package-name",
extension.outputPackageName,
"--recreate_output_dirs",
extension.recreateOutputDir.toString()
)
}
}
}

View File

@ -0,0 +1,12 @@
package static_analysis.errors
class AndroidLintError(
private val filePath: String,
private val fileLine: String,
private val errorId: String,
private val description: String
) : StaticAnalysisError {
override fun print(count: Int): String = "\n$count. Android Lint. $description ($errorId)\n\tat [$filePath:$fileLine]"
}

View File

@ -0,0 +1,12 @@
package static_analysis.errors
class CpdError(
private val duplications: List<Pair<String, String>>,
private val codeFragment: String
) : StaticAnalysisError {
override fun print(count: Int): String = "\n$count. CPD. Code duplication in files: " +
duplications.joinToString(separator = "") { (file, line) -> "\n\t[$file:$line]" } +
"\n\n Duplicated code:\n\n$codeFragment\n"
}

View File

@ -0,0 +1,12 @@
package static_analysis.errors
class DetektError(
private val filePath: String,
private val fileLine: String,
private val errorId: String,
private val description: String
) : StaticAnalysisError {
override fun print(count: Int): String = "\n$count. Detekt. $description ($errorId)\n\tat [$filePath:$fileLine]"
}

View File

@ -0,0 +1,5 @@
package static_analysis.errors
interface StaticAnalysisError {
fun print(count: Int): String
}

View File

@ -0,0 +1,65 @@
package static_analysis.linters
import com.android.build.gradle.AppExtension
import com.android.build.gradle.AppPlugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.findByType
import static_analysis.errors.AndroidLintError
import static_analysis.errors.StaticAnalysisError
import static_analysis.plugins.StaticAnalysisExtension
import static_analysis.utils.typedChildren
import static_analysis.utils.xmlParser
class AndroidLinter : Linter {
override val name: String = "Android lint"
override fun getErrors(project: Project): List<StaticAnalysisError> = xmlParser(project.getLintReportFile())
.typedChildren()
.filter { it.name() == "issue" && (it.attribute("severity") as String) == "Error" }
.map { errorNode ->
errorNode
.typedChildren()
.filter { it.name() == "location" }
.map { locationNode ->
AndroidLintError(
filePath = locationNode.attribute("file") as String,
fileLine = locationNode.attribute("line") as String,
errorId = errorNode.attribute("id") as String,
description = errorNode.attribute("message") as String
)
}
}
.flatten()
override fun setupForProject(project: Project, extension: StaticAnalysisExtension) {
project.gradle.projectsEvaluated {
project.subprojects
.mapNotNull { it.extensions.findByType<AppExtension>() }
.first()
.lintOptions.apply {
isAbortOnError = false
isCheckAllWarnings = true
isWarningsAsErrors = false
xmlReport = true
htmlReport = false
isCheckDependencies = true
disable("MissingConstraints", "VectorRaster")
xmlOutput = project.getLintReportFile()
lintConfig = project.file("${extension.buildScriptDir}/static_analysis_configs/lint.xml")
}
}
}
override fun getTaskNames(project: Project, buildType: String?): List<String> = project
.subprojects
.filter { it.plugins.hasPlugin(AppPlugin::class.java) }
.mapNotNull { subproject: Project ->
subproject.tasks.find { task ->
task.name.contains(buildType!!, ignoreCase = true) && task.name.contains("lint")
}?.path
}
private fun Project.getLintReportFile() = file("${rootProject.buildDir}/reports/lint-report.xml")
}

View File

@ -0,0 +1,57 @@
package static_analysis.linters
import de.aaschmid.gradle.plugins.cpd.Cpd
import de.aaschmid.gradle.plugins.cpd.CpdExtension
import org.gradle.api.Project
import org.gradle.kotlin.dsl.findByType
import org.gradle.kotlin.dsl.withType
import static_analysis.errors.CpdError
import static_analysis.errors.StaticAnalysisError
import static_analysis.plugins.StaticAnalysisExtension
import static_analysis.utils.getSources
import static_analysis.utils.typedChildren
import static_analysis.utils.xmlParser
class CpdLinter : Linter {
override val name: String = "CPD"
override fun getErrors(project: Project): List<StaticAnalysisError> = xmlParser(project.getCpdReportFile())
.typedChildren()
.filter { it.name() == "duplication" }
.map { duplicationNode ->
val children = duplicationNode
.typedChildren()
CpdError(
duplications = children
.filter { it.name() == "file" }
.map { fileNode -> fileNode.attribute("path") as String to fileNode.attribute("line") as String },
codeFragment = children.findLast { it.name() == "codefragment" }!!.text()
)
}
override fun setupForProject(project: Project, extension: StaticAnalysisExtension) {
project.extensions.findByType<CpdExtension>()!!.apply {
isSkipLexicalErrors = true
language = "kotlin"
minimumTokenCount = 60
}
project.tasks.withType<Cpd> {
reports.xml.destination = project.getCpdReportFile()
ignoreFailures = true
source = project.getSources(extension.excludes)
}
}
override fun getTaskNames(project: Project, buildType: String?): List<String> = project
.rootProject
.tasks
.withType<Cpd>()
.map { it.path }
private fun Project.getCpdReportFile() = file("${rootProject.buildDir}/reports/cpd.xml")
}

View File

@ -0,0 +1,62 @@
package static_analysis.linters
import io.gitlab.arturbosch.detekt.Detekt
import org.gradle.api.Project
import static_analysis.errors.DetektError
import static_analysis.errors.StaticAnalysisError
import static_analysis.plugins.StaticAnalysisExtension
import static_analysis.utils.getSources
import static_analysis.utils.typedChildren
import static_analysis.utils.xmlParser
class DetektLinter : Linter {
override val name: String = "Detekt"
override fun getErrors(project: Project): List<StaticAnalysisError> = xmlParser(project.getDetektReportFile())
.typedChildren()
.filter { fileNode -> fileNode.name() == "file" }
.map { fileNode ->
fileNode
.typedChildren()
.filter { it.name() == "error" }
.map { errorNode ->
DetektError(
filePath = fileNode.attribute("name") as String,
fileLine = errorNode.attribute("line") as String,
errorId = errorNode.attribute("source") as String,
description = errorNode.attribute("message") as String
)
}
}
.flatten()
override fun setupForProject(project: Project, extension: StaticAnalysisExtension) {
project
.tasks
.withType(Detekt::class.java) {
exclude("**/test/**")
exclude("resources/")
exclude("build/")
exclude("tmp/")
jvmTarget = "1.8"
config.setFrom(project.files("${extension.buildScriptDir!!}/static_analysis_configs/detekt-config.yml"))
reports {
txt.enabled = false
html.enabled = false
xml {
enabled = true
destination = project.getDetektReportFile()
}
}
source = project.getSources(extension.excludes)
}
}
override fun getTaskNames(project: Project, buildType: String?): List<String> = listOf(":detekt")
private fun Project.getDetektReportFile() = file("${rootProject.buildDir}/reports/detekt.xml")
}

View File

@ -0,0 +1,12 @@
package static_analysis.linters
import org.gradle.api.Project
import static_analysis.errors.StaticAnalysisError
import static_analysis.plugins.StaticAnalysisExtension
interface Linter {
val name: String
fun getErrors(project: Project): List<StaticAnalysisError>
fun setupForProject(project: Project, extension: StaticAnalysisExtension)
fun getTaskNames(project: Project, buildType: String? = null): List<String>
}

View File

@ -0,0 +1,43 @@
package static_analysis.plugins
import com.android.build.gradle.AppExtension
import org.gradle.api.Project
import org.gradle.kotlin.dsl.getByType
import static_analysis.linters.AndroidLinter
import static_analysis.linters.CpdLinter
import static_analysis.linters.DetektLinter
import static_analysis.linters.Linter
class StaticAnalysisAndroidPlugin : StaticAnalysisPlugin() {
override fun createStaticAnalysisTasks(project: Project, linters: List<Linter>) {
project.subprojects {
if (plugins.hasPlugin("com.android.application")) {
extensions.getByType<AppExtension>().apply {
applicationVariants.forEach { variant ->
project.tasks.register("staticAnalysis${variant.name.capitalize()}") {
setupStaticAnalysisTask(linters, variant.name)
}
}
project.tasks.register("staticAnalysis") {
setupStaticAnalysisTask(
linters = linters,
buildVariant = applicationVariants.first { it.name.contains("Debug") }.name
)
}
}
}
}
}
override fun createLinters(): List<Linter> = listOf(
DetektLinter(),
CpdLinter(),
AndroidLinter()
)
}

View File

@ -0,0 +1,21 @@
package static_analysis.plugins
import org.gradle.api.Project
import static_analysis.linters.CpdLinter
import static_analysis.linters.DetektLinter
import static_analysis.linters.Linter
class StaticAnalysisBackendPlugin : StaticAnalysisPlugin() {
override fun createStaticAnalysisTasks(project: Project, linters: List<Linter>) {
project.tasks.register("staticAnalysis") {
setupStaticAnalysisTask(linters)
}
}
override fun createLinters(): List<Linter> = listOf(
CpdLinter(),
DetektLinter()
)
}

View File

@ -0,0 +1,6 @@
package static_analysis.plugins
open class StaticAnalysisExtension(
var excludes: String = "",
var buildScriptDir: String? = null
)

View File

@ -0,0 +1,47 @@
package static_analysis.plugins
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.getByType
import static_analysis.linters.Linter
import static_analysis.utils.ReportGenerator
abstract class StaticAnalysisPlugin : Plugin<Project> {
companion object {
const val DETEKT_ID = "io.gitlab.arturbosch.detekt"
const val CPD_ID = "de.aaschmid.cpd"
const val STATIC_ANALYSIS_EXT_NAME = "staticAnalysis"
}
override fun apply(target: Project) {
with(target) {
pluginManager.apply(CPD_ID)
pluginManager.apply(DETEKT_ID)
extensions.create<StaticAnalysisExtension>(STATIC_ANALYSIS_EXT_NAME)
val linters = createLinters()
afterEvaluate {
linters.forEach { it.setupForProject(target, extensions.getByType()) }
}
gradle.projectsEvaluated {
createStaticAnalysisTasks(target, linters)
}
}
}
fun Task.setupStaticAnalysisTask(linters: List<Linter>, buildVariant: String? = null) {
doFirst { ReportGenerator.generate(linters, project) }
dependsOn(*(linters.map { it.getTaskNames(project, buildVariant) }.flatten().toTypedArray()))
}
abstract fun createLinters(): List<Linter>
abstract fun createStaticAnalysisTasks(project: Project, linters: List<Linter>)
}

View File

@ -0,0 +1,33 @@
package static_analysis.utils
import groovy.util.Node
import groovy.util.XmlParser
import org.gradle.api.Project
import org.gradle.api.file.FileTree
import java.io.File
fun Node.typedChildren() = children() as List<Node>
fun xmlParser(file: File) = XmlParser().parse(file)
fun Project.getSources(excludes: String): FileTree = files(
project
.rootProject
.subprojects
.filter { subproject -> subproject.subprojects.isEmpty() && !excludes.contains(subproject.path) }
.map { subproject -> subproject.file("${subproject.projectDir.path}/src/main") }
.filter { it.exists() && it.isDirectory }
.flatMap { srcDir ->
srcDir
.listFiles()
.orEmpty()
.flatMap {
listOf(
File(srcDir.path, "java"),
File(srcDir.path, "kotlin")
)
}
}
.filter { it.exists() && it.isDirectory }
.map { it.path }
).asFileTree

View File

@ -0,0 +1,52 @@
package static_analysis.utils
import org.gradle.api.Project
import static_analysis.errors.StaticAnalysisError
import static_analysis.linters.Linter
object ReportGenerator {
fun generate(linters: List<Linter>, project: Project) {
val groupedErrors = linters
.map { linter -> linter to linter.getErrors(project) }
val lintersResults = groupedErrors
.map { it.first.name to it.second.size }
val allErrors = groupedErrors
.map { it.second }
.flatten()
val consoleReport = StringBuilder("\nSTATIC ANALYSIS ERRORS:").apply {
appendAllErrors(allErrors)
append("\nREPORT:\n")
appendReportsSummary(lintersResults)
appendOverallSummary(allErrors)
}
if (allErrors.isEmpty()) {
println(consoleReport)
} else {
throw Exception(consoleReport.toString())
}
}
private fun StringBuilder.appendAllErrors(errors: List<StaticAnalysisError>) = errors
.mapIndexed { index, staticAnalysisError -> staticAnalysisError.print(index + 1) }
.forEach { error -> append(error) }
private fun StringBuilder.appendReportsSummary(lintersResults: List<Pair<String, Int>>) = lintersResults
.forEach { this.appendSummary(it.first, it.second) }
private fun StringBuilder.appendOverallSummary(errors: List<StaticAnalysisError>) = appendSummary("Overall", errors.size)
private fun StringBuilder.appendSummary(header: String, quantityOfErrors: Int) {
assert(quantityOfErrors < 0)
append("\n$header: ")
append(if (quantityOfErrors == 0) "PASSED" else "FAILED ($quantityOfErrors errors)")
}
}

View File

@ -1,166 +0,0 @@
buildscript {
repositories {
maven { url "https://plugins.gradle.org/m2" }
}
dependencies {
classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.5.1"
}
}
def getServerProjectSources
def getAndroidProjectSources
apply from: "$buildScriptsDir/gradle/commonStaticAnalysis.gradle"
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs <<
"-Xlint:cast" <<
"-Xlint:divzero" <<
"-Xlint:empty" <<
"-Xlint:deprecation" <<
"-Xlint:finally" <<
"-Xlint:overrides" <<
"-Xlint:path" <<
"-Werror"
}
def excludes = rootProject.extensions.findByName("staticAnalysisExcludes")
def androidSources = getAndroidProjectSources(excludes)
def androidStaticAnalysisTasks = getStaticAnalysisTaskNames(true, androidSources, null)
def androidIdeaFormatTask = getIdeaFormatTask(true, androidSources)
task staticAnalysisWithFormatting {
androidStaticAnalysisTasks.each { task ->
tasks.findByName(task)?.mustRunAfter(androidIdeaFormatTask)
}
dependsOn androidIdeaFormatTask
dependsOn androidStaticAnalysisTasks
doFirst {
generateReport(true)
}
}
task staticAnalysis {
dependsOn androidStaticAnalysisTasks
doFirst {
generateReport(true)
}
}
def serverStaticAnalysisTasks = getStaticAnalysisTaskNames(false, getServerProjectSources(excludes), null)
def serverIdeaFormatTask = getIdeaFormatTask(false, getServerProjectSources(excludes))
task serverStaticAnalysisWithFormatting {
serverStaticAnalysisTasks.each { task ->
tasks.findByName(task)?.mustRunAfter(serverIdeaFormatTask)
}
dependsOn serverIdeaFormatTask
dependsOn serverStaticAnalysisTasks
doFirst {
generateReport(false)
}
}
task serverStaticAnalysis {
dependsOn serverStaticAnalysisTasks
doFirst {
generateReport(false)
}
}
subprojects { subproject ->
if (subproject.plugins.hasPlugin("com.android.application")) {
subproject.android {
lintOptions.abortOnError = false
lintOptions.checkAllWarnings = true
lintOptions.warningsAsErrors = false
lintOptions.xmlReport = true
lintOptions.xmlOutput = file "$rootProject.buildDir/reports/lint_report.xml"
lintOptions.htmlReport = false
lintOptions.lintConfig = file "$buildScriptsDir/lint/lint.xml"
lintOptions.checkDependencies true
lintOptions.disable 'MissingConstraints', 'VectorRaster'
applicationVariants.all { variant ->
task("staticAnalysis${variant.name.capitalize()}") {
dependsOn getStaticAnalysisTaskNames(true, androidSources, variant)
doFirst { generateReport(true) }
}
}
}
}
def regex = ~':detekt$'
tasks.forEach { task ->
if (!task.name.contains(":libs") && task.path =~ regex) {
task.exclude '**/test/**'
task.exclude 'resources/'
task.exclude 'build/'
task.exclude 'tmp/'
task.jvmTarget = "1.8"
}
}
detekt {
config = files("$buildScriptsDir/kotlin/detekt-config.yml")
reports {
txt.enabled = false
html.enabled = false
xml {
enabled = true
destination = file("${rootProject.buildDir}/reports/kotlin-detekt-${subproject.name}.xml")
}
}
}
}
}
getServerProjectSources = { excludes ->
def sources = new ArrayList<String>()
def sourcesDirectory = new File(project.projectDir.path, 'src')
for (def sourceFlavorDirectory : sourcesDirectory.listFiles()) {
def javaSourceDirectory = new File(sourceFlavorDirectory.path, 'java')
def kotlinSourceDirectory = new File(sourceFlavorDirectory.path, 'kotlin')
if (javaSourceDirectory.exists() && javaSourceDirectory.isDirectory()) {
sources.add(javaSourceDirectory.absolutePath)
}
if (kotlinSourceDirectory.exists() && kotlinSourceDirectory.isDirectory()) {
sources.add(kotlinSourceDirectory.absolutePath)
}
}
return sources
}
getAndroidProjectSources = { excludes ->
def sources = new ArrayList<String>()
for (def project : rootProject.subprojects) {
if (!project.subprojects.isEmpty() || (excludes != null && excludes.contains(project.path))) {
continue
}
def sourcesDirectory = new File(project.projectDir.path, 'src')
if (!sourcesDirectory.exists() || !sourcesDirectory.isDirectory()) {
continue
}
for (def sourceFlavorDirectory : sourcesDirectory.listFiles()) {
def javaSourceDirectory = new File(sourceFlavorDirectory.path, 'java')
def kotlinSourceDirectory = new File(sourceFlavorDirectory.path, 'kotlin')
if (javaSourceDirectory.exists() && javaSourceDirectory.isDirectory()) {
sources.add(javaSourceDirectory.absolutePath)
}
if (kotlinSourceDirectory.exists() && kotlinSourceDirectory.isDirectory()) {
sources.add(kotlinSourceDirectory.absolutePath)
}
}
}
return sources
}

View File

@ -1,272 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="InvalidPackage" severity="error">
<ignore regexp="Invalid package reference in library.*not included in Android.*java.*"/>
</issue>
<issue id="GradleCompatible" severity="error">
<ignore regexp="All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions *. Examples include *"/>
</issue>
<!-- todo: lint bug? -->
<issue id="MissingPermission" severity="ignore"/>
<!-- todo: lint bug? -->
<issue id="MissingSuperCall" severity="ignore"/>
<!--All activities should have locked orientation-->
<issue id="LockedOrientationActivity" severity="ignore"/>
<issue id="AllowAllHostnameVerifier" severity="error"/>
<issue id="InvalidUsesTagAttribute" severity="error"/>
<issue id="MissingIntentFilterForMediaSearch" severity="error"/>
<issue id="MissingMediaBrowserServiceIntentFilter" severity="error"/>
<issue id="MissingOnPlayFromSearch" severity="error"/>
<issue id="ShiftFlags" severity="error"/>
<issue id="LocalSuppress" severity="error"/>
<issue id="SwitchIntDef" severity="error"/>
<issue id="UniqueConstants" severity="error"/>
<issue id="InlinedApi" severity="error"/>
<issue id="Override" severity="error"/>
<issue id="UnusedAttribute" severity="warning"/>
<issue id="AppCompatResource" severity="error"/>
<issue id="BadHostnameVerifier" severity="error"/>
<issue id="EnforceUTF8" severity="error"/>
<issue id="ByteOrderMark" severity="error"/>
<issue id="StopShip" severity="error"/>
<issue id="MissingPrefix" severity="error"/>
<issue id="MangledCRLF" severity="error"/>
<issue id="DuplicateIds" severity="error"/>
<issue id="DuplicateDefinition" severity="error"/>
<issue id="ReferenceType" severity="error"/>
<issue id="UnsafeDynamicallyLoadedCode" severity="error"/>
<issue id="UnsafeNativeCodeLocation" severity="error"/>
<issue id="FullBackupContent" severity="error"/>
<issue id="ValidFragment" severity="error"/>
<issue id="GradleCompatible" severity="error"/>
<issue id="GradlePluginVersion" severity="error"/>
<issue id="GradleGetter" severity="error"/>
<issue id="GradleIdeError" severity="error"/>
<issue id="NotInterpolated" severity="error"/>
<issue id="StringShouldBeInt" severity="error"/>
<issue id="AccidentalOctal" severity="error"/>
<issue id="GridLayout" severity="error"/>
<issue id="HardcodedDebugMode" severity="error"/>
<issue id="IconExpectedSize" severity="error"/>
<issue id="IncludeLayoutParam" severity="error"/>
<issue id="TrustAllX509TrustManager" severity="warning"/>
<issue id="DefaultLocale" severity="error"/>
<issue id="InvalidResourceFolder" severity="error"/>
<issue id="LongLogTag" severity="error"/>
<issue id="LogTagMismatch" severity="error"/>
<issue id="DuplicateActivity" severity="error"/>
<issue id="MockLocation" severity="error"/>
<issue id="MultipleUsesSdk" severity="error"/>
<issue id="UniquePermission" severity="error"/>
<issue id="WrongManifestParent" severity="error"/>
<issue id="ManifestResource" severity="error"/>
<issue id="ManifestTypo" severity="error"/>
<issue id="Instantiatable" severity="error"/>
<issue id="LibraryCustomView" severity="error"/>
<issue id="ResAuto" severity="error"/>
<issue id="NamespaceTypo" severity="error"/>
<issue id="UnusedNamespace" severity="error"/>
<issue id="NfcTechWhitespace" severity="error"/>
<issue id="OnClick" severity="error"/>
<issue id="DalvikOverride" severity="error"/>
<issue id="OverrideAbstract" severity="error"/>
<issue id="ParcelCreator" severity="error"/>
<issue id="PackagedPrivateKey" severity="error"/>
<issue id="Proguard" severity="error"/>
<issue id="PropertyEscape" severity="error"/>
<issue id="ParcelClassLoader" severity="error"/>
<issue id="RecyclerView" severity="error"/>
<issue id="RequiredSize" severity="error"/>
<issue id="AaptCrash" severity="error"/>
<issue id="ResourceCycle" severity="error"/>
<issue id="ResourceName" severity="error"/>
<issue id="ValidRestrictions" severity="error"/>
<issue id="RtlCompat" severity="error"/>
<issue id="ScrollViewSize" severity="error"/>
<issue id="SecureRandom" severity="error"/>
<issue id="SetWorldReadable" severity="error"/>
<issue id="SetWorldWritable" severity="error"/>
<issue id="ServiceCast" severity="error"/>
<issue id="SSLCertificateSocketFactoryCreateSocket" severity="error"/>
<issue id="SSLCertificateSocketFactoryGetInsecure" severity="error"/>
<issue id="StringFormatMatches" severity="error"/>
<issue id="StringFormatInvalid" severity="error"/>
<issue id="UseCheckPermission" severity="error"/>
<issue id="CheckResult" severity="warning"/>
<issue id="ResourceAsColor" severity="error"/>
<issue id="Range" severity="error"/>
<issue id="ResourceType" severity="warning"/>
<issue id="WrongThread" severity="error"/>
<issue id="WrongConstant" severity="error"/>
<issue id="ProtectedPermissions" severity="error"/>
<issue id="MenuTitle" severity="error"/>
<issue id="ExtraTranslation" severity="error"/>
<issue id="MissingLeanbackLauncher" severity="error"/>
<issue id="MissingLeanbackSupport" severity="error"/>
<issue id="PermissionImpliesUnsupportedHardware" severity="error"/>
<issue id="UnsupportedTvHardware" severity="error"/>
<issue id="MissingTvBanner" severity="error"/>
<issue id="TypographyOther" severity="error"/>
<issue id="TypographyQuotes" severity="warning"/>
<issue id="UnsafeProtectedBroadcastReceiver" severity="error"/>
<issue id="UnprotectedSMSBroadcastReceiver" severity="error"/>
<issue id="VectorRaster" severity="error"/>
<issue id="ViewTag" severity="error"/>
<issue id="WrongViewCast" severity="error"/>
<issue id="Wakelock" severity="error"/>
<issue id="WrongCall" severity="error"/>
<issue id="WrongCase" severity="error"/>
<issue id="InvalidId" severity="error"/>
<issue id="NotSibling" severity="error"/>
<issue id="UnknownIdInLayout" severity="error"/>
<issue id="WrongFolder" severity="error"/>
<issue id="AdapterViewChildren" severity="error"/>
<issue id="SetJavaScriptEnabled" severity="warning"/>
<issue id="AddJavascriptInterface" severity="warning"/>
<issue id="AllowBackup" severity="error"/>
<issue id="AlwaysShowAction" severity="error"/>
<issue id="AppCompatMethod" severity="error"/>
<issue id="Assert" severity="error"/>
<issue id="CommitPrefEdits" severity="error"/>
<issue id="CommitTransaction" severity="error"/>
<issue id="CustomViewStyleable" severity="error"/>
<issue id="CutPasteId" severity="error"/>
<issue id="Deprecated" severity="error"/>
<issue id="DeviceAdmin" severity="error"/>
<issue id="DisableBaselineAlignment" severity="error"/>
<issue id="DrawAllocation" severity="warning"/>
<issue id="DuplicateIncludedIds" severity="error"/>
<issue id="DuplicateUsesFeature" severity="error"/>
<issue id="ExportedContentProvider" severity="error"/>
<issue id="ExportedReceiver" severity="error"/>
<issue id="ExportedService" severity="error"/>
<issue id="ExtraText" severity="error"/>
<issue id="GetInstance" severity="error"/>
<issue id="GifUsage" severity="warning"/>
<issue id="GradleDependency" severity="warning"/>
<issue id="GradleDeprecated" severity="error"/>
<issue id="GradleDynamicVersion" severity="error"/>
<issue id="GradleOverrides" severity="error"/>
<issue id="GradlePath" severity="warning"/>
<issue id="GrantAllUris" severity="error"/>
<issue id="HandlerLeak" severity="error"/>
<issue id="HardcodedText" severity="error"/>
<issue id="IconColors" severity="warning"/>
<issue id="IconDensities" severity="warning"/>
<issue id="IconDipSize" severity="error"/>
<issue id="IconDuplicates" severity="error"/>
<issue id="IconDuplicatesConfig" severity="error"/>
<issue id="IconExtension" severity="error"/>
<issue id="IconLocation" severity="error"/>
<issue id="IconMixedNinePatch" severity="error"/>
<issue id="IconNoDpi" severity="error"/>
<issue id="IconXmlAndPng" severity="error"/>
<issue id="IllegalResourceRef" severity="error"/>
<issue id="InOrMmUsage" severity="error"/>
<issue id="InconsistentArrays" severity="error"/>
<issue id="InefficientWeight" severity="warning"/>
<issue id="InflateParams" severity="warning"/>
<issue id="InnerclassSeparator" severity="error"/>
<issue id="LocaleFolder" severity="error"/>
<issue id="LogConditional" severity="error"/>
<issue id="ManifestOrder" severity="error"/>
<issue id="MipmapIcons" severity="error"/>
<issue id="MissingApplicationIcon" severity="error"/>
<issue id="MissingId" severity="error"/>
<issue id="MissingVersion" severity="error"/>
<issue id="NestedWeights" severity="warning"/>
<issue id="NewerVersionAvailable" severity="warning"/>
<issue id="ObsoleteLayoutParam" severity="error"/>
<issue id="OldTargetApi" severity="error"/>
<issue id="PackageManagerGetSignatures" severity="error"/>
<issue id="PrivateResource" severity="error"/>
<issue id="ProguardSplit" severity="error"/>
<issue id="PxUsage" severity="error"/>
<issue id="Recycle" severity="error"/>
<issue id="Registered" severity="error"/>
<issue id="RtlEnabled" severity="error"/>
<issue id="SQLiteString" severity="error"/>
<issue id="ScrollViewCount" severity="error"/>
<issue id="ScrollViewSize" severity="error"/>
<issue id="SdCardPath" severity="error"/>
<issue id="ShortAlarm" severity="warning"/>
<issue id="ShowToast" severity="error"/>
<issue id="SignatureOrSystemPermissions" severity="error"/>
<issue id="SimpleDateFormat" severity="error"/>
<issue id="SpUsage" severity="error"/>
<issue id="StateListReachable" severity="error"/>
<issue id="SuspiciousImport" severity="error"/>
<issue id="TextFields" severity="error"/>
<issue id="TextViewEdits" severity="error"/>
<issue id="TooDeepLayout" severity="warning"/>
<issue id="TooManyViews" severity="warning"/>
<issue id="TypographyDashes" severity="warning"/>
<issue id="UnknownIdInLayout" severity="error"/>
<issue id="UnlocalizedSms" severity="error"/>
<issue id="UnusedIds" severity="error"/>
<issue id="UseAlpha2" severity="error"/>
<issue id="UseSparseArrays" severity="warning"/>
<issue id="UseValueOf" severity="error"/>
<issue id="UsesMinSdkAttributes" severity="error"/>
<issue id="UsingHttp" severity="warning"/>
<issue id="WorldReadableFiles" severity="warning"/>
<issue id="WorldWriteableFiles" severity="warning"/>
<issue id="WrongRegion" severity="warning"/>
<!-- DISABLE RULES BELOW -->
<issue id="GoogleAppIndexingApiWarning" severity="ignore"/>
<issue id="GoogleAppIndexingWarning" severity="ignore"/>
<issue id="AppLinksAutoVerifyError" severity="ignore"/>
<issue id="AppLinksAutoVerifyWarning" severity="ignore"/>
<issue id="ClickableViewAccessibility" severity="ignore"/>
<issue id="SetTextI18n" severity="ignore"/>
<issue id="EasterEgg" severity="ignore"/>
<issue id="BackButton" severity="ignore"/>
<issue id="FieldGetter" severity="ignore"/>
<issue id="Orientation" severity="ignore"/>
<issue id="Suspicious0dp" severity="ignore"/>
<issue id="NegativeMargin" severity="ignore"/>
<issue id="MissingQuantity" severity="ignore"/>
<issue id="ImpliedQuantity" severity="ignore"/>
<issue id="TrulyRandom" severity="ignore"/>
<issue id="SelectableText" severity="ignore"/>
<issue id="UnusedIds" severity="ignore"/>
<issue id="ButtonCase" severity="ignore"/>
<issue id="ButtonOrder" severity="ignore"/>
<issue id="ButtonStyle" severity="ignore"/>
<issue id="ContentDescription" severity="ignore"/>
<issue id="ExportedPreferenceActivity" severity="ignore"/>
<!-- remove when facebook will update support library in sdk -->
<issue id="GradleCompatible" severity="ignore"/>
<issue id="IconLauncherShape" severity="ignore"/>
<issue id="IconMissingDensityFolder" severity="ignore"/>
<issue id="InconsistentLayout" severity="ignore"/>
<issue id="LabelFor" severity="ignore"/>
<issue id="MissingTranslation" severity="ignore"/>
<issue id="NestedScrolling" severity="ignore"/>
<issue id="MergeRootFrame" severity="ignore"/>
<issue id="NewApi" severity="ignore"/>
<issue id="Overdraw" severity="ignore"/>
<issue id="PluralsCandidate" severity="ignore"/>
<issue id="RelativeOverlap" severity="ignore"/>
<issue id="RtlHardcoded" severity="ignore"/>
<issue id="RtlSymmetry" severity="ignore"/>
<issue id="SmallSp" severity="ignore"/>
<issue id="StringFormatCount" severity="ignore"/>
<issue id="TypographyFractions" severity="ignore"/>
<issue id="Typos" severity="ignore"/>
<issue id="UnusedQuantity" severity="ignore"/>
<issue id="UnusedResources" severity="ignore"/>
<issue id="UseCompoundDrawables" severity="ignore"/>
<issue id="UselessLeaf" severity="ignore"/>
<issue id="UselessParent" severity="ignore"/>
<issue id="ViewConstructor" severity="ignore"/>
<issue id="ViewHolder" severity="ignore"/>
<issue id="WebViewLayout" severity="ignore"/>
<issue id="TypographyEllipsis" severity="ignore"/>
<issue id="PermissionImpliesUnsupportedChromeOsHardware" severity="ignore"/>
</lint>

View File

@ -1,131 +0,0 @@
<?xml version="1.0"?>
<ruleset name="All Java Rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<description>Every Java Rule in PMD</description>
<rule ref="rulesets/java/android.xml"/>
<rule ref="rulesets/java/basic.xml">
<exclude name="SimplifiedTernary"/>
</rule>
<rule ref="rulesets/java/braces.xml"/>
<rule ref="rulesets/java/clone.xml"/>
<rule ref="rulesets/java/codesize.xml"/>
<rule ref="rulesets/java/codesize.xml/TooManyMethods">
<properties>
<property name="maxmethods" value="20"/>
</properties>
</rule>
<rule ref="rulesets/java/codesize.xml/CyclomaticComplexity">
<properties>
<property name="showClassesComplexity" value="false"/>
<property name="violationSuppressXPath" value="./MethodDeclarator[@Image='hashCode' or @Image='equals']"/>
</properties>
</rule>
<rule ref="rulesets/java/codesize.xml/StdCyclomaticComplexity">
<properties>
<property name="showClassesComplexity" value="false"/>
<property name="violationSuppressXPath" value="./MethodDeclarator[@Image='hashCode' or @Image='equals']"/>
</properties>
</rule>
<rule ref="rulesets/java/codesize.xml/ModifiedCyclomaticComplexity">
<properties>
<property name="showClassesComplexity" value="false"/>
<property name="violationSuppressXPath" value="./MethodDeclarator[@Image='hashCode' or @Image='equals']"/>
</properties>
</rule>
<rule ref="rulesets/java/codesize.xml/NPathComplexity">
<properties>
<property name="violationSuppressXPath" value="./MethodDeclarator[@Image='hashCode' or @Image='equals']"/>
</properties>
</rule>
<rule ref="rulesets/java/comments.xml">
<exclude name="CommentSize"/>
<exclude name="CommentRequired"/>
<exclude name="CommentDefaultAccessModifier"/>
</rule>
<rule ref="rulesets/java/controversial.xml">
<exclude name="AtLeastOneConstructor"/>
<exclude name="OnlyOneReturn"/>
<exclude name="UseConcurrentHashMap"/>
<exclude name="NullAssignment"/>
<exclude name="DataflowAnomalyAnalysis"/>
<exclude name="AvoidFinalLocalVariable"/>
</rule>
<rule ref="rulesets/java/controversial.xml/AvoidLiteralsInIfCondition">
<properties>
<property name="ignoreMagicNumbers" value="-1,0,1"/>
</properties>
</rule>
<rule ref="rulesets/java/coupling.xml">
<exclude name="LoosePackageCoupling"/>
<exclude name="LawOfDemeter"/>
<exclude name="LooseCoupling"/>
</rule>
<rule ref="rulesets/java/coupling.xml/ExcessiveImports">
<properties>
<property name="minimum" value="50"/>
</properties>
</rule>
<rule ref="rulesets/java/design.xml">
<exclude name="GodClass"/>
<exclude name="ConfusingTernary"/>
<exclude name="ReturnEmptyArrayRatherThanNull"/>
<exclude name="FieldDeclarationsShouldBeAtStartOfClass"/>
<exclude name="EmptyMethodInAbstractClassShouldBeAbstract"/>
</rule>
<rule ref="rulesets/java/empty.xml"/>
<rule ref="rulesets/java/empty.xml/EmptyCatchBlock">
<properties>
<property name="allowCommentedBlocks" value="true"/>
</properties>
</rule>
<rule ref="rulesets/java/finalizers.xml"/>
<rule ref="rulesets/java/imports.xml"/>
<rule ref="rulesets/java/j2ee.xml">
<exclude name="DoNotUseThreads"/>
</rule>
<rule ref="rulesets/java/javabeans.xml">
<exclude name="BeanMembersShouldSerialize"/>
</rule>
<rule ref="rulesets/java/junit.xml"/>
<rule ref="rulesets/java/logging-jakarta-commons.xml">
<exclude name="GuardLogStatement"/>
</rule>
<rule ref="rulesets/java/logging-java.xml"/>
<rule ref="rulesets/java/migrating.xml"/>
<rule ref="rulesets/java/naming.xml">
<exclude name="SuspiciousEqualsMethodName"/>
<exclude name="AbstractNaming"/>
<exclude name="ShortVariable"/>
<exclude name="LongVariable"/>
<exclude name="GenericsNaming"/>
</rule>
<rule ref="rulesets/java/naming.xml/ShortClassName">
<properties>
<property name="minimum" value="4"/>
</properties>
</rule>
<rule ref="rulesets/java/optimizations.xml">
<exclude name="AvoidInstantiatingObjectsInLoops"/>
</rule>
<rule ref="rulesets/java/strictexception.xml">
<exclude name="AvoidCatchingGenericException"/>
<exclude name="SignatureDeclareThrowsException"/>
</rule>
<rule ref="rulesets/java/strings.xml"/>
<rule ref="rulesets/java/sunsecure.xml">
<exclude name="MethodReturnsInternalArray"/>
<exclude name="ArrayIsStoredDirectly"/>
</rule>
<rule ref="rulesets/java/typeresolution.xml">
<exclude name="SignatureDeclareThrowsException"/>
<exclude name="LooseCoupling"/>
</rule>
<rule ref="rulesets/java/unnecessary.xml">
<exclude name="UselessParentheses"/>
</rule>
<rule ref="rulesets/java/unusedcode.xml"/>
</ruleset>

View File

@ -23,7 +23,7 @@ formatting:
active: true
console-reports:
active: true
active: false
exclude:
# - 'ProjectStatisticsReport'
# - 'ComplexityReport'

View File

@ -0,0 +1,273 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="InvalidPackage" severity="error">
<ignore regexp="Invalid package reference in library.*not included in Android.*java.*" />
</issue>
<issue id="GradleCompatible" severity="error">
<ignore
regexp="All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions *. Examples include *" />
</issue>
<!-- todo: lint bug? -->
<issue id="MissingPermission" severity="ignore" />
<!-- todo: lint bug? -->
<issue id="MissingSuperCall" severity="ignore" />
<!--All activities should have locked orientation-->
<issue id="LockedOrientationActivity" severity="ignore" />
<issue id="AllowAllHostnameVerifier" severity="error" />
<issue id="InvalidUsesTagAttribute" severity="error" />
<issue id="MissingIntentFilterForMediaSearch" severity="error" />
<issue id="MissingMediaBrowserServiceIntentFilter" severity="error" />
<issue id="MissingOnPlayFromSearch" severity="error" />
<issue id="ShiftFlags" severity="error" />
<issue id="LocalSuppress" severity="error" />
<issue id="SwitchIntDef" severity="error" />
<issue id="UniqueConstants" severity="error" />
<issue id="InlinedApi" severity="error" />
<issue id="Override" severity="error" />
<issue id="UnusedAttribute" severity="warning" />
<issue id="AppCompatResource" severity="error" />
<issue id="BadHostnameVerifier" severity="error" />
<issue id="EnforceUTF8" severity="error" />
<issue id="ByteOrderMark" severity="error" />
<issue id="StopShip" severity="error" />
<issue id="MissingPrefix" severity="error" />
<issue id="MangledCRLF" severity="error" />
<issue id="DuplicateIds" severity="error" />
<issue id="DuplicateDefinition" severity="error" />
<issue id="ReferenceType" severity="error" />
<issue id="UnsafeDynamicallyLoadedCode" severity="error" />
<issue id="UnsafeNativeCodeLocation" severity="error" />
<issue id="FullBackupContent" severity="error" />
<issue id="ValidFragment" severity="error" />
<issue id="GradleCompatible" severity="error" />
<issue id="GradlePluginVersion" severity="error" />
<issue id="GradleGetter" severity="error" />
<issue id="GradleIdeError" severity="error" />
<issue id="NotInterpolated" severity="error" />
<issue id="StringShouldBeInt" severity="error" />
<issue id="AccidentalOctal" severity="error" />
<issue id="GridLayout" severity="error" />
<issue id="HardcodedDebugMode" severity="error" />
<issue id="IconExpectedSize" severity="error" />
<issue id="IncludeLayoutParam" severity="error" />
<issue id="TrustAllX509TrustManager" severity="warning" />
<issue id="DefaultLocale" severity="error" />
<issue id="InvalidResourceFolder" severity="error" />
<issue id="LongLogTag" severity="error" />
<issue id="LogTagMismatch" severity="error" />
<issue id="DuplicateActivity" severity="error" />
<issue id="MockLocation" severity="error" />
<issue id="MultipleUsesSdk" severity="error" />
<issue id="UniquePermission" severity="error" />
<issue id="WrongManifestParent" severity="error" />
<issue id="ManifestResource" severity="error" />
<issue id="ManifestTypo" severity="error" />
<issue id="Instantiatable" severity="error" />
<issue id="LibraryCustomView" severity="error" />
<issue id="ResAuto" severity="error" />
<issue id="NamespaceTypo" severity="error" />
<issue id="UnusedNamespace" severity="error" />
<issue id="NfcTechWhitespace" severity="error" />
<issue id="OnClick" severity="error" />
<issue id="DalvikOverride" severity="error" />
<issue id="OverrideAbstract" severity="error" />
<issue id="ParcelCreator" severity="error" />
<issue id="PackagedPrivateKey" severity="error" />
<issue id="Proguard" severity="error" />
<issue id="PropertyEscape" severity="error" />
<issue id="ParcelClassLoader" severity="error" />
<issue id="RecyclerView" severity="error" />
<issue id="RequiredSize" severity="error" />
<issue id="AaptCrash" severity="error" />
<issue id="ResourceCycle" severity="error" />
<issue id="ResourceName" severity="error" />
<issue id="ValidRestrictions" severity="error" />
<issue id="RtlCompat" severity="error" />
<issue id="ScrollViewSize" severity="error" />
<issue id="SecureRandom" severity="error" />
<issue id="SetWorldReadable" severity="error" />
<issue id="SetWorldWritable" severity="error" />
<issue id="ServiceCast" severity="error" />
<issue id="SSLCertificateSocketFactoryCreateSocket" severity="error" />
<issue id="SSLCertificateSocketFactoryGetInsecure" severity="error" />
<issue id="StringFormatMatches" severity="error" />
<issue id="StringFormatInvalid" severity="error" />
<issue id="UseCheckPermission" severity="error" />
<issue id="CheckResult" severity="warning" />
<issue id="ResourceAsColor" severity="error" />
<issue id="Range" severity="error" />
<issue id="ResourceType" severity="warning" />
<issue id="WrongThread" severity="error" />
<issue id="WrongConstant" severity="error" />
<issue id="ProtectedPermissions" severity="error" />
<issue id="MenuTitle" severity="error" />
<issue id="ExtraTranslation" severity="error" />
<issue id="MissingLeanbackLauncher" severity="error" />
<issue id="MissingLeanbackSupport" severity="error" />
<issue id="PermissionImpliesUnsupportedHardware" severity="error" />
<issue id="UnsupportedTvHardware" severity="error" />
<issue id="MissingTvBanner" severity="error" />
<issue id="TypographyOther" severity="error" />
<issue id="TypographyQuotes" severity="warning" />
<issue id="UnsafeProtectedBroadcastReceiver" severity="error" />
<issue id="UnprotectedSMSBroadcastReceiver" severity="error" />
<issue id="VectorRaster" severity="error" />
<issue id="ViewTag" severity="error" />
<issue id="WrongViewCast" severity="error" />
<issue id="Wakelock" severity="error" />
<issue id="WrongCall" severity="error" />
<issue id="WrongCase" severity="error" />
<issue id="InvalidId" severity="error" />
<issue id="NotSibling" severity="error" />
<issue id="UnknownIdInLayout" severity="error" />
<issue id="WrongFolder" severity="error" />
<issue id="AdapterViewChildren" severity="error" />
<issue id="SetJavaScriptEnabled" severity="warning" />
<issue id="AddJavascriptInterface" severity="warning" />
<issue id="AllowBackup" severity="error" />
<issue id="AlwaysShowAction" severity="error" />
<issue id="AppCompatMethod" severity="error" />
<issue id="Assert" severity="error" />
<issue id="CommitPrefEdits" severity="error" />
<issue id="CommitTransaction" severity="error" />
<issue id="CustomViewStyleable" severity="error" />
<issue id="CutPasteId" severity="error" />
<issue id="Deprecated" severity="error" />
<issue id="DeviceAdmin" severity="error" />
<issue id="DisableBaselineAlignment" severity="error" />
<issue id="DrawAllocation" severity="warning" />
<issue id="DuplicateIncludedIds" severity="error" />
<issue id="DuplicateUsesFeature" severity="error" />
<issue id="ExportedContentProvider" severity="error" />
<issue id="ExportedReceiver" severity="error" />
<issue id="ExportedService" severity="error" />
<issue id="ExtraText" severity="error" />
<issue id="GetInstance" severity="error" />
<issue id="GifUsage" severity="warning" />
<issue id="GradleDependency" severity="warning" />
<issue id="GradleDeprecated" severity="error" />
<issue id="GradleDynamicVersion" severity="error" />
<issue id="GradleOverrides" severity="error" />
<issue id="GradlePath" severity="warning" />
<issue id="GrantAllUris" severity="error" />
<issue id="HandlerLeak" severity="error" />
<issue id="HardcodedText" severity="error" />
<issue id="IconColors" severity="warning" />
<issue id="IconDensities" severity="warning" />
<issue id="IconDipSize" severity="error" />
<issue id="IconDuplicates" severity="error" />
<issue id="IconDuplicatesConfig" severity="error" />
<issue id="IconExtension" severity="error" />
<issue id="IconLocation" severity="error" />
<issue id="IconMixedNinePatch" severity="error" />
<issue id="IconNoDpi" severity="error" />
<issue id="IconXmlAndPng" severity="error" />
<issue id="IllegalResourceRef" severity="error" />
<issue id="InOrMmUsage" severity="error" />
<issue id="InconsistentArrays" severity="error" />
<issue id="InefficientWeight" severity="warning" />
<issue id="InflateParams" severity="warning" />
<issue id="InnerclassSeparator" severity="error" />
<issue id="LocaleFolder" severity="error" />
<issue id="LogConditional" severity="error" />
<issue id="ManifestOrder" severity="error" />
<issue id="MipmapIcons" severity="error" />
<issue id="MissingApplicationIcon" severity="error" />
<issue id="MissingId" severity="error" />
<issue id="MissingVersion" severity="error" />
<issue id="NestedWeights" severity="warning" />
<issue id="NewerVersionAvailable" severity="warning" />
<issue id="ObsoleteLayoutParam" severity="error" />
<issue id="OldTargetApi" severity="error" />
<issue id="PackageManagerGetSignatures" severity="error" />
<issue id="PrivateResource" severity="error" />
<issue id="ProguardSplit" severity="error" />
<issue id="PxUsage" severity="error" />
<issue id="Recycle" severity="error" />
<issue id="Registered" severity="error" />
<issue id="RtlEnabled" severity="error" />
<issue id="SQLiteString" severity="error" />
<issue id="ScrollViewCount" severity="error" />
<issue id="ScrollViewSize" severity="error" />
<issue id="SdCardPath" severity="error" />
<issue id="ShortAlarm" severity="warning" />
<issue id="ShowToast" severity="error" />
<issue id="SignatureOrSystemPermissions" severity="error" />
<issue id="SimpleDateFormat" severity="error" />
<issue id="SpUsage" severity="error" />
<issue id="StateListReachable" severity="error" />
<issue id="SuspiciousImport" severity="error" />
<issue id="TextFields" severity="error" />
<issue id="TextViewEdits" severity="error" />
<issue id="TooDeepLayout" severity="warning" />
<issue id="TooManyViews" severity="warning" />
<issue id="TypographyDashes" severity="warning" />
<issue id="UnknownIdInLayout" severity="error" />
<issue id="UnlocalizedSms" severity="error" />
<issue id="UnusedIds" severity="error" />
<issue id="UseAlpha2" severity="error" />
<issue id="UseSparseArrays" severity="warning" />
<issue id="UseValueOf" severity="error" />
<issue id="UsesMinSdkAttributes" severity="error" />
<issue id="UsingHttp" severity="warning" />
<issue id="WorldReadableFiles" severity="warning" />
<issue id="WorldWriteableFiles" severity="warning" />
<issue id="WrongRegion" severity="warning" />
<!-- DISABLE RULES BELOW -->
<issue id="GoogleAppIndexingApiWarning" severity="ignore" />
<issue id="GoogleAppIndexingWarning" severity="ignore" />
<issue id="AppLinksAutoVerifyError" severity="ignore" />
<issue id="AppLinksAutoVerifyWarning" severity="ignore" />
<issue id="ClickableViewAccessibility" severity="ignore" />
<issue id="SetTextI18n" severity="ignore" />
<issue id="EasterEgg" severity="ignore" />
<issue id="BackButton" severity="ignore" />
<issue id="FieldGetter" severity="ignore" />
<issue id="Orientation" severity="ignore" />
<issue id="Suspicious0dp" severity="ignore" />
<issue id="NegativeMargin" severity="ignore" />
<issue id="MissingQuantity" severity="ignore" />
<issue id="ImpliedQuantity" severity="ignore" />
<issue id="TrulyRandom" severity="ignore" />
<issue id="SelectableText" severity="ignore" />
<issue id="UnusedIds" severity="ignore" />
<issue id="ButtonCase" severity="ignore" />
<issue id="ButtonOrder" severity="ignore" />
<issue id="ButtonStyle" severity="ignore" />
<issue id="ContentDescription" severity="ignore" />
<issue id="ExportedPreferenceActivity" severity="ignore" />
<!-- remove when facebook will update support library in sdk -->
<issue id="GradleCompatible" severity="ignore" />
<issue id="IconLauncherShape" severity="ignore" />
<issue id="IconMissingDensityFolder" severity="ignore" />
<issue id="InconsistentLayout" severity="ignore" />
<issue id="LabelFor" severity="ignore" />
<issue id="MissingTranslation" severity="ignore" />
<issue id="NestedScrolling" severity="ignore" />
<issue id="MergeRootFrame" severity="ignore" />
<issue id="NewApi" severity="ignore" />
<issue id="Overdraw" severity="ignore" />
<issue id="PluralsCandidate" severity="ignore" />
<issue id="RelativeOverlap" severity="ignore" />
<issue id="RtlHardcoded" severity="ignore" />
<issue id="RtlSymmetry" severity="ignore" />
<issue id="SmallSp" severity="ignore" />
<issue id="StringFormatCount" severity="ignore" />
<issue id="TypographyFractions" severity="ignore" />
<issue id="Typos" severity="ignore" />
<issue id="UnusedQuantity" severity="ignore" />
<issue id="UnusedResources" severity="ignore" />
<issue id="UseCompoundDrawables" severity="ignore" />
<issue id="UselessLeaf" severity="ignore" />
<issue id="UselessParent" severity="ignore" />
<issue id="ViewConstructor" severity="ignore" />
<issue id="ViewHolder" severity="ignore" />
<issue id="WebViewLayout" severity="ignore" />
<issue id="TypographyEllipsis" severity="ignore" />
<issue id="PermissionImpliesUnsupportedChromeOsHardware" severity="ignore" />
</lint>