| <!-- |
| ~ Licensed to the Apache Software Foundation (ASF) under one or more |
| ~ contributor license agreements. See the NOTICE file distributed with |
| ~ this work for additional information regarding copyright ownership. |
| ~ The ASF licenses this file to You under the Apache License, Version 2.0 |
| ~ (the "License"); you may not use this file except in compliance with |
| ~ the License. You may obtain a copy of the License at |
| ~ |
| ~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~ |
| ~ Unless required by applicable law or agreed to in writing, software |
| ~ distributed under the License is distributed on an "AS IS" BASIS, |
| ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ~ See the License for the specific language governing permissions and |
| ~ limitations under the License. |
| --> |
| <!-- |
| If you wish to turn off checking for a section of code, you can put a comment in the source |
| before and after the section, with the following syntax: |
| // scalastyle:off |
| ... // stuff that breaks the styles |
| // scalastyle:on |
| You can also disable only one rule, by specifying its rule id, as specified in: |
| http://www.scalastyle.org/rules-0.7.0.html |
| // scalastyle:off no.finalize |
| override def finalize(): Unit = ... |
| // scalastyle:on no.finalize |
| This file is divided into 3 sections: |
| (1) rules that we enforce. |
| (2) rules that we would like to enforce, but haven't cleaned up the codebase to turn on yet |
| (or we need to make the scalastyle rule more configurable). |
| (3) rules that we don't want to enforce. |
| --> |
| |
| <scalastyle> |
| <name>Scalastyle standard configuration</name> |
| |
| <!-- ================================================================================ --> |
| <!-- rules we enforce --> |
| <!-- ================================================================================ --> |
| |
| <!-- The first few lines of each file need to match text--> |
| <check level="error" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true"> |
| <parameters> |
| <parameter name="header"><![CDATA[/* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */]]></parameter> |
| </parameters> |
| </check> |
| |
| <!-- You need Spaces before and after the plus sign--> |
| <check level="error" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"/> |
| |
| <check level="error" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"/> |
| |
| <!-- Check that there are no Spaces at the end of the line--> |
| <check level="error" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"/> |
| |
| <check level="error" class="org.scalastyle.file.FileLineLengthChecker" enabled="true"> |
| <parameters> |
| <parameter name="maxLineLength"><![CDATA[500]]></parameter> |
| <parameter name="tabSize"><![CDATA[2]]></parameter> |
| <parameter name="ignoreImports">true</parameter> |
| </parameters> |
| </check> |
| |
| <check level="error" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter> |
| </parameters> |
| </check> |
| |
| <!-- The number of method parameters cannot exceed a certain value--> |
| <check customId="argcount" level="error" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true"> |
| <parameters> |
| <parameter name="maxParameters"><![CDATA[8]]></parameter> |
| </parameters> |
| </check> |
| |
| <!-- Can't use Finalize ()--> |
| <check level="error" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"/> |
| |
| <check level="error" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"/> |
| |
| <!-- The long literal needs to be followed by L--> |
| <check level="error" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"/> |
| |
| <!-- 'If' statements require braces to allow single or double lines to be written--> |
| <check level="error" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true"> |
| <parameters> |
| <parameter name="singleLineAllowed"><![CDATA[true]]></parameter> |
| <parameter name="doubleLineAllowed"><![CDATA[true]]></parameter> |
| </parameters> |
| </check> |
| |
| <!-- Cyclomatic complexity of a method--> |
| <check level="error" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true"> |
| <parameters> |
| <parameter name="maximum">20</parameter> |
| </parameters> |
| </check> |
| |
| <!-- You can't have Spaces after the open parenthesis, there are a lot of places in the code--> |
| <check enabled="true" class="org.scalastyle.scalariform.DisallowSpaceAfterTokenChecker" level="error"> |
| <parameters> |
| <parameter name="tokens">LPAREN</parameter> |
| </parameters> |
| </check> |
| |
| <!-- Methods cannot exceed the maximum number of rows --> |
| <check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true"> |
| <parameters> |
| <parameter name="maxLength">500</parameter> |
| <parameter name="ignoreComments">false</parameter> |
| </parameters> |
| </check> |
| |
| <!-- Method requires an explicit return type--> |
| <check level="error" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"/> |
| |
| <check enabled="true" class="org.scalastyle.scalariform.RedundantIfChecker" level="warning"/> |
| |
| <!-- Check that file ends with a newline character--> |
| <check level="error" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"/> |
| |
| <!-- Non-ascii characters cannot be used--> |
| <check customId="nonascii" level="error" class="org.scalastyle.scalariform.NonASCIICharacterChecker" |
| enabled="true"/> |
| |
| <!-- Comments need to start with a space--> |
| <check level="warning" class="org.scalastyle.scalariform.SpaceAfterCommentStartChecker" enabled="true"/> |
| |
| <!-- You must have a space before checking these markers--> |
| <check level="error" class="org.scalastyle.scalariform.EnsureSingleSpaceBeforeTokenChecker" enabled="true"> |
| <parameters> |
| <parameter name="tokens">ARROW, EQUALS, ELSE, TRY, CATCH, FINALLY, LARROW, RARROW</parameter> |
| </parameters> |
| </check> |
| |
| <!-- Check that these markers must be followed by Spaces--> |
| <check level="error" class="org.scalastyle.scalariform.EnsureSingleSpaceAfterTokenChecker" enabled="true"> |
| <parameters> |
| <parameter name="tokens">ARROW, EQUALS, COMMA, COLON, IF, ELSE, DO, WHILE, FOR, MATCH, TRY, CATCH, FINALLY, |
| LARROW, RARROW |
| </parameter> |
| </parameters> |
| </check> |
| |
| <!-- The class field must start with a lowercase case and the object field must start with a uppercase case--> |
| <check enabled="true" class="org.scalastyle.scalariform.FieldNamesChecker" level="warning"> |
| <parameters> |
| <parameter name="regex">^[a-z][A-Za-z0-9]*$</parameter> |
| <parameter name="objectFieldRegex">^[A-Z][A-Za-z0-9]*$</parameter> |
| </parameters> |
| </check> |
| |
| <!-- The same string literal cannot appear more than once in a file--> |
| <check enabled="true" class="org.scalastyle.scalariform.MultipleStringLiteralsChecker" level="warning"> |
| <parameters> |
| <parameter name="allowed">1</parameter> |
| <parameter name="ignoreRegex">^\"\"$</parameter> |
| </parameters> |
| </check> |
| |
| <!-- Method parameter name is regular or not: starts with a lowercase letter--> |
| <check enabled="true" class="org.scalastyle.scalariform.MethodArgumentNamesChecker" level="warning"> |
| <parameters> |
| <parameter name="regex">^[a-z][A-Za-z0-9]*$</parameter> |
| <parameter name="ignoreRegex">^$</parameter> |
| </parameters> |
| </check> |
| |
| <!-- Equals () and hashCode() need to be implemented at the same time--> |
| <check level="error" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"/> |
| |
| <!-- Do not use the java@override annotation--> |
| <check level="error" class="org.scalastyle.scalariform.OverrideJavaChecker" enabled="true"/> |
| |
| <!-- Cannot use?? symbol --> |
| <check level="error" class="org.scalastyle.scalariform.NotImplementedErrorUsage" enabled="true"/> |
| |
| <!-- Comma, no space before the closing parenthesis--> |
| <check level="error" class="org.scalastyle.scalariform.DisallowSpaceBeforeTokenChecker" enabled="true"> |
| <parameters> |
| <parameter name="tokens">COMMA, RPAREN</parameter> |
| </parameters> |
| </check> |
| |
| <!-- ================================================================================ --> |
| <!-- Custom checker --> |
| <!-- ================================================================================ --> |
| |
| <check customId="println" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">println</parameter> |
| </parameters> |
| <customMessage><![CDATA[Are you sure you want to println? if yes, wrap the code block with |
| // scalastyle:off println |
| println(...) |
| // scalastyle:on println]]></customMessage> |
| </check> |
| |
| <check customId="javaconversions" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">JavaConversions</parameter> |
| </parameters> |
| <customMessage>Instead of importing implicits in scala.collection.JavaConversions._, import |
| scala.collection.JavaConverters._ and use .asScala / .asJava methods |
| </customMessage> |
| </check> |
| |
| <check customId="hadoopconfiguration" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">spark(.sqlContext)?.sparkContext.hadoopConfiguration</parameter> |
| </parameters> |
| <customMessage><![CDATA[ |
| Are you sure that you want to use sparkContext.hadoopConfiguration? In most cases, you should use |
| spark.sessionState.newHadoopConf() instead, so that the hadoop configurations specified in Spark session |
| configuration will come into effect. |
| If you must use sparkContext.hadoopConfiguration, wrap the code block with |
| // scalastyle:off hadoopconfiguration |
| spark.sparkContext.hadoopConfiguration... |
| // scalastyle:on hadoopconfiguration |
| ]]></customMessage> |
| </check> |
| |
| <check customId="runtimeaddshutdownhook" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">Runtime\.getRuntime\.addShutdownHook</parameter> |
| </parameters> |
| <customMessage><![CDATA[ |
| Are you sure that you want to use Runtime.getRuntime.addShutdownHook? In most cases, you should use |
| ShutdownHookManager.addShutdownHook instead. |
| If you must use Runtime.getRuntime.addShutdownHook, wrap the code block with |
| // scalastyle:off runtimeaddshutdownhook |
| Runtime.getRuntime.addShutdownHook(...) |
| // scalastyle:on runtimeaddshutdownhook |
| ]]></customMessage> |
| </check> |
| |
| <check customId="awaitresult" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">Await\.result</parameter> |
| </parameters> |
| <customMessage><![CDATA[ |
| Are you sure that you want to use Await.result? In most cases, you should use ThreadUtils.awaitResult instead. |
| If you must use Await.result, wrap the code block with |
| // scalastyle:off awaitresult |
| Await.result(...) |
| // scalastyle:on awaitresult |
| ]]></customMessage> |
| </check> |
| |
| <check customId="awaitready" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">Await\.ready</parameter> |
| </parameters> |
| <customMessage><![CDATA[ |
| Are you sure that you want to use Await.ready? In most cases, you should use ThreadUtils.awaitReady instead. |
| If you must use Await.ready, wrap the code block with |
| // scalastyle:off awaitready |
| Await.ready(...) |
| // scalastyle:on awaitready |
| ]]></customMessage> |
| </check> |
| |
| <check customId="throwerror" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">throw new \w+Error\(</parameter> |
| </parameters> |
| <customMessage><![CDATA[ |
| Are you sure that you want to throw Error? In most cases, you should use appropriate Exception instead. |
| If you must throw Error, wrap the code block with |
| // scalastyle:off throwerror |
| throw new XXXError(...) |
| // scalastyle:on throwerror |
| ]]></customMessage> |
| </check> |
| |
| <check customId="commonslang2" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">org\.apache\.commons\.lang\.</parameter> |
| </parameters> |
| <customMessage>Use Commons Lang 3 classes (package org.apache.commons.lang3.*) instead |
| of Commons Lang 2 (package org.apache.commons.lang.*) |
| </customMessage> |
| </check> |
| |
| <check customId="FileSystemGet" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">FileSystem.get\([a-zA-Z_$][a-zA-Z_$0-9]*\)</parameter> |
| </parameters> |
| <customMessage><![CDATA[ |
| Are you sure that you want to use "FileSystem.get(Configuration conf)"? If the input |
| configuration is not set properly, a default FileSystem instance will be returned. It can |
| lead to errors when you deal with multiple file systems. Please consider using |
| "FileSystem.get(URI uri, Configuration conf)" or "Path.getFileSystem(Configuration conf)" instead. |
| If you must use the method "FileSystem.get(Configuration conf)", wrap the code block with |
| // scalastyle:off FileSystemGet |
| FileSystem.get(...) |
| // scalastyle:on FileSystemGet |
| ]]></customMessage> |
| </check> |
| |
| <check customId="SingleSpaceBetweenRParenAndLCurlyBrace" level="error" class="org.scalastyle.file.RegexChecker" |
| enabled="true"> |
| <parameters> |
| <parameter name="regex">\)\{</parameter> |
| </parameters> |
| <customMessage><![CDATA[ |
| Single Space between ')' and `{`. |
| ]]></customMessage> |
| </check> |
| |
| <check customId="NoScalaDoc" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">(?m)^(\s*)/[*][*].*$(\r|)\n^\1 [*]</parameter> |
| </parameters> |
| <customMessage>Use Javadoc style indentation for multiline comments</customMessage> |
| </check> |
| |
| <check customId="GuavaToStringHelper" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> |
| <parameters> |
| <parameter name="regex">Objects.toStringHelper</parameter> |
| </parameters> |
| <customMessage>Avoid using Object.toStringHelper. Use ToStringBuilder instead.</customMessage> |
| </check> |
| |
| |
| <!-- ================================================================================ --> |
| <!-- rules we don't want --> |
| <!-- ================================================================================ --> |
| |
| <!-- We cannot turn the following two on, because it'd fail a lot of string interpolation use cases. --> |
| <!-- Ideally the following two rules should be configurable to rule out string interpolation. --> |
| <check level="error" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="false"/> |
| |
| <check level="error" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="false"/> |
| |
| <!-- This breaks symbolic method names so we don't turn it on. --> |
| <!-- Maybe we should update it to allow basic symbolic names, and then we are good to go. --> |
| <check level="error" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="false"> |
| <parameters> |
| <parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter> |
| </parameters> |
| </check> |
| |
| <check level="error" class="org.scalastyle.scalariform.DeprecatedJavaChecker" enabled="false"/> |
| |
| <check level="error" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="false"> |
| <parameters> |
| <parameter name="illegalImports"><![CDATA[scala.collection.Seq,scala.collection.IndexedSeq]]></parameter> |
| </parameters> |
| <customMessage><![CDATA[ |
| Don't import scala.collection.Seq and scala.collection.IndexedSeq as it may bring some problems with cross-build between Scala 2.12 and 2.13. |
| Please refer below page to see the details of changes around Seq / IndexedSeq. |
| https://docs.scala-lang.org/overviews/core/collections-migration-213.html |
| If you really need to use scala.collection.Seq or scala.collection.IndexedSeq, please use the fully-qualified name instead. |
| ]]></customMessage> |
| </check> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.NamedArgumentChecker" level="warning"> |
| <parameters> |
| <parameter name="checkString">false</parameter> |
| <parameter name="ignoreMethod">^set.+$</parameter> |
| </parameters> |
| </check> |
| |
| <check level="error" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="false"> |
| <parameters> |
| <parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter> |
| </parameters> |
| </check> |
| |
| <!-- We want the opposite of this: NewLineAtEofChecker --> |
| <check level="error" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"/> |
| |
| <!-- This one complains about all kinds of random things. Disable. --> |
| <check level="error" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="false"/> |
| |
| <!-- We use return quite a bit for control flows and guards --> |
| <check level="error" class="org.scalastyle.scalariform.ReturnChecker" enabled="false"/> |
| |
| <!-- We use null a lot in low level code and to interface with 3rd party code --> |
| <check level="error" class="org.scalastyle.scalariform.NullChecker" enabled="false"/> |
| |
| <!-- Doesn't seem super big deal here ... --> |
| <check level="error" class="org.scalastyle.scalariform.NoCloneChecker" enabled="false"/> |
| |
| <!-- Doesn't seem super big deal here ... --> |
| <check level="error" class="org.scalastyle.file.FileLengthChecker" enabled="false"> |
| <parameters> |
| <parameter name="maxFileLength">800></parameter> |
| </parameters> |
| </check> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.ScalaDocChecker" level="warning"> |
| <parameters> |
| <parameter name="ignoreRegex">(.*Spec$)|(.*SpecIT$)</parameter> |
| <parameter name="ignoreTokenTypes">PatDefOrDcl,TypeDefOrDcl,FunDefOrDcl,TmplDef</parameter> |
| <parameter name="ignoreOverride">false</parameter> |
| <parameter name="indentStyle">anydoc</parameter> |
| </parameters> |
| </check> |
| |
| <!-- Doesn't seem super big deal here ... --> |
| <check level="error" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="false"> |
| <parameters> |
| <parameter name="maxTypes">30</parameter> |
| </parameters> |
| </check> |
| |
| <!-- Not exactly feasible to enforce this right now. --> |
| <!-- It is also infrequent that somebody introduces a new class with a lot of methods. --> |
| <check level="error" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="false"> |
| <parameters> |
| <parameter name="maxMethods"><![CDATA[30]]></parameter> |
| </parameters> |
| </check> |
| |
| <!-- Doesn't seem super big deal here, and we have a lot of magic numbers ... --> |
| <check level="error" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="false"> |
| <parameters> |
| <parameter name="ignore">-1,0,1,2,3</parameter> |
| </parameters> |
| </check> |
| |
| <check level="error" class="org.scalastyle.file.FileTabChecker" enabled="false"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.VarFieldChecker" level="error"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.VarLocalChecker" level="warning"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.WhileChecker" level="warning"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.XmlLiteralChecker" level="warning"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.TodoCommentChecker" level="warning"> |
| <parameters> |
| <parameter default="TODO|FIXME" type="string" name="words"/> |
| </parameters> |
| </check> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.ClassTypeParameterChecker" level="error"> |
| <parameters> |
| <parameter name="regex">^[A-Z_]$</parameter> |
| </parameters> |
| </check> |
| |
| <check enabled="false" level="warning" class="org.scalastyle.scalariform.EmptyInterpolatedStringChecker"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.EmptyClassChecker" level="warning"/> |
| |
| <check level="error" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="false"> |
| <parameters> |
| <parameter name="regex"><![CDATA[(config|[A-Z][A-Za-z]*)]]></parameter> |
| </parameters> |
| </check> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.PackageNamesChecker" level="warning"> |
| <parameters> |
| <parameter name="regex">^[a-z][A-Za-z]*$</parameter> |
| </parameters> |
| </check> |
| |
| <check level="error" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="false"> |
| <parameters> |
| <parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter> |
| </parameters> |
| </check> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.PatternMatchAlignChecker" level="warning"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.ProcedureDeclarationChecker" level="warning"/> |
| |
| <check level="error" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="false"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.UnderscoreImportChecker" level="warning"> |
| <parameters> |
| <parameter name="ignoreRegex">collection\.JavaConverters\._|scala\.concurrent\.duration\._</parameter> |
| </parameters> |
| </check> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.BlockImportChecker" level="warning"/> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.ImportGroupingChecker" level="warning"/> |
| |
| <check level="error" class="org.scalastyle.scalariform.ImportOrderChecker" enabled="false"> |
| <parameters> |
| <parameter name="groups">java,scala,3rdParty,linkis</parameter> |
| <parameter name="group.java">javax?\..*</parameter> |
| <parameter name="group.scala">scala\..*</parameter> |
| <parameter name="group.3rdParty">(?!org\.apache\.linkis\.).*</parameter> |
| <parameter name="group.linkis">org\.apache\.linkis\..*</parameter> |
| </parameters> |
| </check> |
| |
| <check enabled="false" class="org.scalastyle.scalariform.LowercasePatternMatchChecker" level="warning"/> |
| |
| </scalastyle> |