<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="phpList Coding Standard">
    <description>
        This standard requires PHP_CodeSniffer >= 3.5.3.
    </description>

    <arg name="colors"/>
    <arg name="extensions" value="php"/>

    <!--The complete PSR-12 rule set-->
    <rule ref="PSR12"/>

    <!-- Arrays -->
    <rule ref="Generic.Arrays.DisallowLongArraySyntax"/>
    <rule ref="Squiz.Arrays.ArrayBracketSpacing"/>

    <!-- Classes -->
    <rule ref="Generic.Classes.DuplicateClassName"/>
    <rule ref="PSR1.Classes.ClassDeclaration"/>
    <rule ref="Squiz.Classes.ClassFileName"/>
    <rule ref="Squiz.Classes.DuplicateProperty"/>
    <rule ref="Squiz.Classes.LowercaseClassKeywords"/>
    <rule ref="Squiz.Classes.SelfMemberReference"/>

    <!-- Code analysis -->
    <rule ref="Generic.CodeAnalysis.AssignmentInCondition"/>
    <rule ref="Generic.CodeAnalysis.EmptyStatement"/>
    <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
    <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
    <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
    <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
    <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
    <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>

    <!-- Commenting -->
    <rule ref="Generic.Commenting.Fixme"/>
    <rule ref="Generic.Commenting.Todo"/>
    <rule ref="PEAR.Commenting.InlineComment"/>
    <rule ref="Squiz.Commenting.DocCommentAlignment"/>
    <rule ref="Squiz.Commenting.EmptyCatchComment"/>
    <rule ref="Squiz.Commenting.FunctionCommentThrowTag"/>
    <rule ref="Squiz.Commenting.PostStatementComment"/>

    <!-- Control structures -->
    <rule ref="PEAR.ControlStructures.ControlSignature"/>

    <!-- Debug -->
    <rule ref="Generic.Debug.ClosureLinter"/>

    <!-- Files -->
    <rule ref="Generic.Files.LineLength">
        <exclude-pattern>Configuration/TCA/</exclude-pattern>
    </rule>
    <rule ref="Generic.Files.OneClassPerFile"/>
    <rule ref="Generic.Files.OneInterfacePerFile"/>
    <rule ref="Generic.Files.OneObjectStructurePerFile"/>
    <rule ref="Zend.Files.ClosingTag"/>

    <!-- Formatting -->
    <rule ref="PEAR.Formatting.MultiLineAssignment"/>

    <!-- Functions -->
    <rule ref="Generic.Functions.CallTimePassByReference"/>
    <rule ref="Squiz.Functions.FunctionDuplicateArgument"/>
    <rule ref="Squiz.Functions.GlobalFunction"/>

    <!-- Methods -->
    <rule ref="PSR2.Methods.MethodDeclaration.Underscore"/>

    <!-- Metrics -->
    <rule ref="Generic.Metrics.CyclomaticComplexity"/>
    <rule ref="Generic.Metrics.NestingLevel"/>

    <!-- Naming conventions -->
    <rule ref="Generic.NamingConventions.ConstructorName"/>
    <rule ref="PEAR.NamingConventions.ValidClassName"/>

    <!-- Objects -->
    <rule ref="Squiz.Objects.ObjectMemberComma"/>

    <!-- Operators -->
    <rule ref="Squiz.Operators.IncrementDecrementUsage"/>
    <rule ref="Squiz.Operators.ValidLogicalOperators"/>

    <!-- PHP -->
    <rule ref="Generic.PHP.BacktickOperator"/>
    <rule ref="Generic.PHP.CharacterBeforePHPOpeningTag"/>
    <rule ref="Generic.PHP.DeprecatedFunctions"/>
    <rule ref="Generic.PHP.DisallowAlternativePHPTags"/>
    <rule ref="Generic.PHP.DisallowShortOpenTag"/>
    <rule ref="Generic.PHP.DiscourageGoto"/>
    <rule ref="Generic.PHP.ForbiddenFunctions"/>
    <rule ref="Generic.PHP.NoSilencedErrors"/>
    <rule ref="Squiz.PHP.CommentedOutCode">
        <properties>
            <property name="maxPercentage" value="70"/>
        </properties>
    </rule>
    <rule ref="Squiz.PHP.DisallowMultipleAssignments"/>
    <rule ref="Squiz.PHP.DisallowSizeFunctionsInLoops"/>
    <rule ref="Squiz.PHP.DiscouragedFunctions"/>
    <rule ref="Squiz.PHP.Eval"/>
    <rule ref="Squiz.PHP.GlobalKeyword"/>
    <rule ref="Squiz.PHP.Heredoc"/>
    <rule ref="Squiz.PHP.InnerFunctions"/>
    <rule ref="Squiz.PHP.LowercasePHPFunctions"/>
    <rule ref="Squiz.PHP.NonExecutableCode"/>

    <!-- Scope -->
    <rule ref="Squiz.Scope.MemberVarScope"/>
    <rule ref="Squiz.Scope.StaticThisUsage"/>

    <!--Strings-->
    <rule ref="Squiz.Strings.DoubleQuoteUsage"/>

    <!-- Whitespace -->
    <rule ref="PEAR.WhiteSpace.ObjectOperatorIndent"/>
    <rule ref="PEAR.WhiteSpace.ScopeClosingBrace"/>
    <rule ref="Squiz.WhiteSpace.CastSpacing"/>
    <rule ref="Squiz.WhiteSpace.LogicalOperatorSpacing"/>
    <rule ref="Squiz.WhiteSpace.OperatorSpacing">
        <properties>
            <property name="ignoreNewlines" value="true" />
        </properties>
    </rule>
    <rule ref="Squiz.WhiteSpace.PropertyLabelSpacing"/>
    <rule ref="Squiz.WhiteSpace.SemicolonSpacing"/>
</ruleset>