<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHP_CodeSniffer" xsi:noNamespaceSchemaLocation="phpcs.xsd">
    <description>The coding standard for PHP_CodeSniffer itself.</description>

    <file>autoload.php</file>
    <file>bin</file>
    <file>scripts</file>
    <file>src</file>
    <file>tests</file>

    <exclude-pattern>*/src/Standards/*/Tests/*\.(inc|css|js)$</exclude-pattern>
    <exclude-pattern>*/tests/Core/*/*\.(inc|css|js)$</exclude-pattern>
    <exclude-pattern>*/tests/Core/*/Fixtures/*\.php$</exclude-pattern>

    <arg name="basepath" value="."/>
    <arg name="colors"/>
    <arg name="parallel" value="75"/>
    <arg value="p"/>

    <!-- Include the whole PEAR standard -->
    <rule ref="PEAR">
        <exclude name="PEAR.NamingConventions.ValidFunctionName"/>
        <exclude name="PEAR.NamingConventions.ValidVariableName"/>
        <exclude name="PEAR.Commenting.ClassComment"/>
        <exclude name="PEAR.Commenting.FileComment.MissingAuthorTag"/>
        <exclude name="PEAR.Commenting.FileComment.MissingCategoryTag"/>
        <exclude name="PEAR.Commenting.FileComment.MissingPackageTag"/>
        <exclude name="PEAR.Commenting.FileComment.MissingLinkTag"/>
        <exclude name="PEAR.Commenting.FileComment.MissingVersion"/>
        <exclude name="PEAR.Commenting.InlineComment"/>
        <exclude name="Generic.Files.LineLength"/>
    </rule>

    <!-- Include some sniffs from other standards that don't conflict with PEAR -->
    <rule ref="Squiz.Arrays.ArrayBracketSpacing"/>
    <rule ref="Squiz.Arrays.ArrayDeclaration"/>
    <rule ref="Squiz.Commenting.ClosingDeclarationComment"/>
    <rule ref="Squiz.ControlStructures.ControlSignature"/>
    <rule ref="Squiz.ControlStructures.ElseIfDeclaration"/>
    <rule ref="Squiz.Commenting.BlockComment"/>
    <rule ref="Squiz.Commenting.DocCommentAlignment"/>
    <rule ref="Squiz.Commenting.EmptyCatchComment"/>
    <rule ref="Squiz.Commenting.InlineComment"/>
    <rule ref="Squiz.Commenting.LongConditionClosingComment"/>
    <rule ref="Squiz.Commenting.PostStatementComment">
        <exclude name="Squiz.Commenting.PostStatementComment.AnnotationFound"/>
    </rule>
    <rule ref="Squiz.Commenting.VariableComment"/>
    <rule ref="Squiz.Formatting.OperatorBracket"/>
    <rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing"/>
    <rule ref="Squiz.Operators.ComparisonOperatorUsage"/>
    <rule ref="Squiz.PHP.DisallowInlineIf"/>
    <rule ref="Squiz.Scope.MethodScope"/>
    <rule ref="Squiz.Strings.ConcatenationSpacing"/>
    <rule ref="Squiz.WhiteSpace.ControlStructureSpacing"/>
    <rule ref="Squiz.WhiteSpace.FunctionClosingBraceSpace"/>
    <rule ref="Squiz.WhiteSpace.FunctionSpacing"/>
    <rule ref="Squiz.WhiteSpace.MemberVarSpacing"/>
    <rule ref="Squiz.WhiteSpace.OperatorSpacing"/>
    <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
    <rule ref="Generic.Arrays.DisallowLongArraySyntax"/>
    <rule ref="Generic.Commenting.Todo"/>
    <rule ref="Generic.ControlStructures.DisallowYodaConditions"/>
    <rule ref="Generic.ControlStructures.InlineControlStructure"/>
    <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
    <rule ref="Generic.Formatting.SpaceAfterCast"/>
    <rule ref="Generic.NamingConventions.ConstructorName"/>
    <rule ref="Generic.PHP.DeprecatedFunctions"/>
    <rule ref="Generic.PHP.LowerCaseKeyword"/>
    <rule ref="Generic.Strings.UnnecessaryStringConcat"/>
    <rule ref="Generic.WhiteSpace.IncrementDecrementSpacing"/>
    <rule ref="PSR2.Classes.PropertyDeclaration"/>
    <rule ref="PSR2.Methods.MethodDeclaration"/>
    <rule ref="PSR2.Files.EndFileNewline"/>
    <rule ref="PSR12.Files.OpenTag"/>
    <rule ref="Zend.Files.ClosingTag"/>

    <!-- We use custom indent rules for arrays -->
    <rule ref="Generic.Arrays.ArrayIndent"/>
    <rule ref="Squiz.Arrays.ArrayDeclaration.KeyNotAligned">
        <severity>0</severity>
    </rule>
    <rule ref="Squiz.Arrays.ArrayDeclaration.ValueNotAligned">
        <severity>0</severity>
    </rule>
    <rule ref="Squiz.Arrays.ArrayDeclaration.CloseBraceNotAligned">
        <severity>0</severity>
    </rule>
    <rule ref="Squiz.Arrays.ArrayDeclaration.CloseBraceNewLine">
        <severity>0</severity>
    </rule>

    <!-- Don't enforce single line arrays for single item arrays in test files. Readability over brevity. -->
    <rule ref="Squiz.Arrays.ArrayDeclaration.MultiLineNotAllowed">
        <exclude-pattern>tests/*\.php$</exclude-pattern>
        <exclude-pattern>Standards/*/Tests/*/*UnitTest\.php$</exclude-pattern>
    </rule>

    <!-- Check var names, but we don't want leading underscores for private vars -->
    <rule ref="Squiz.NamingConventions.ValidVariableName"/>
    <rule ref="Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore">
        <severity>0</severity>
    </rule>

    <!-- Only one argument per line in multi-line function calls -->
    <rule ref="PEAR.Functions.FunctionCallSignature">
        <properties>
            <property name="allowMultipleArguments" value="false"/>
        </properties>
    </rule>

    <!-- Have 12 chars padding maximum -->
    <rule ref="Generic.Formatting.MultipleStatementAlignment">
        <properties>
            <property name="maxPadding" value="12"/>
        </properties>
    </rule>

    <!-- Ban some functions -->
    <rule ref="Generic.PHP.ForbiddenFunctions">
        <properties>
            <property name="forbiddenFunctions" type="array">
                <element key="sizeof" value="count"/>
                <element key="delete" value="unset"/>
                <element key="print" value="echo"/>
                <element key="is_null" value="null"/>
                <element key="create_function" value="null"/>
            </property>
        </properties>
    </rule>

    <!-- Do not allow unreachable code. -->
    <rule ref="Squiz.PHP.NonExecutableCode"/>

    <!-- Do not allow ambiguous conditions. -->
    <rule ref="Generic.CodeAnalysis.RequireExplicitBooleanOperatorPrecedence"/>

    <!-- The testing bootstrap file uses string concats to stop IDEs seeing the class aliases -->
    <rule ref="Generic.Strings.UnnecessaryStringConcat">
        <exclude-pattern>tests/bootstrap\.php</exclude-pattern>
    </rule>

    <!-- This test file specifically *needs* Windows line endings for testing purposes. -->
    <rule ref="Generic.Files.LineEndings.InvalidEOLChar">
        <exclude-pattern>tests/Core/Tokenizers/PHP/StableCommentWhitespaceWinTest\.php</exclude-pattern>
    </rule>

    <!-- Avoid false positive with this sniff detecting itself -->
    <rule ref="Generic.Commenting.Todo">
        <exclude-pattern>src/Standards/Generic/Sniffs/Commenting/TodoSniff\.php</exclude-pattern>
        <exclude-pattern>src/Standards/Generic/Tests/Commenting/TodoUnitTest\.php</exclude-pattern>
    </rule>

    <!-- @see https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/122#discussion_r1414167897 -->
    <rule ref="Squiz.Commenting.VariableComment">
        <exclude-pattern>src/Util/Tokens\.php</exclude-pattern>
    </rule>
</ruleset>
