. * * @copyright Copyright MantisBT Team - mantisbt-dev@lists.sourceforge.net */ /** * The coding standard for MantisBT. * * @see https://mantisbt.org/wiki/doku.php/mantisbt:coding_guidelines#code_blocks * * A overview for the cs-fixer rules * @see https://cs.symfony.com/doc/rules * @see https://mlocati.github.io/php-cs-fixer-configurator/ */ use Symplify\EasyCodingStandard\Config\ECSConfig; return ECSConfig::configure() ->withPaths([ // __DIR__ . '/', // __DIR__ . '/api', // __DIR__ . '/core', // __DIR__ . '/tests', // __DIR__ . '/plugins/MantisCoreFormatting', __DIR__ . '/tests/fixer_test_malformed.php', // __DIR__ . '/ecs.php', ]) ->withSkip([ \PhpCsFixer\Fixer\Whitespace\SpacesInsideParenthesesFixer::class => [ __DIR__ . '/ecs.php', ], __DIR__ . '/build', __DIR__ . '/config', __DIR__ . '/lang', __DIR__ . '/library', ]) /** * General spacing * Indentation: Tab * Line endings: LF "\n" */ ->withSpacing( /* indentation: */ \Symplify\EasyCodingStandard\ValueObject\Option::INDENTATION_TAB, /* * devy - comment will removed if the question is answered * * @see LineEndingFixer; "\n" is the default for the LineEndingFixer * @see LineEndingsSniff, [ 'eolChar' => "\n" ] * * todo both fixers do the job without setting this value. * Check if this is required. */ // /* lineEnding: */ "\n", ) // PHP language level 7.4 // ->withPhpCsFixerSets(php74Migration: true) ->withRules([ /** * Basic: Encoding * * PHP code MUST use only UTF-8 without BOM (remove BOM). * * @see https://cs.symfony.com/doc/rules/basic/encoding.html */ \PhpCsFixer\Fixer\Basic\EncodingFixer::class, /** * Whitespace: Line encoding * * All PHP files must use same line ending. Default is "\n" * * Sniff: LineEndingsSniff with ['eolChar' => "\n"] * * @see https://cs.symfony.com/doc/rules/whitespace/line_ending.html */ \PhpCsFixer\Fixer\Whitespace\LineEndingFixer::class, /** * Whitespace: No trailing whitespaces * * Remove trailing whitespace at the end of non-blank lines. * * "$foo = 'bar'···" > "$foo = 'bar'" * * @see https://cs.symfony.com/doc/rules/whitespace/no_trailing_whitespace.html */ \PhpCsFixer\Fixer\Whitespace\NoTrailingWhitespaceFixer::class, /** * Whitespace: Single blank line at eof * * A PHP file without end tag must always end with a single empty line feed. * * Sniff: PSR2.Files.EndFileNewline * * @see https://cs.symfony.com/doc/rules/whitespace/single_blank_line_at_eof.html */ \PhpCsFixer\Fixer\Whitespace\SingleBlankLineAtEofFixer::class, /** * Whitespaces: No whitespace in blank lines * * Remove trailing whitespace at the end of blank lines. * * * ··· * $a = 1;" * * * * $a = 1;" * * * @see https://cs.symfony.com/doc/rules/whitespace/no_whitespace_in_blank_line.html */ \PhpCsFixer\Fixer\Whitespace\NoWhitespaceInBlankLineFixer::class, /** * String: Single quotes * * Convert double quotes to single quotes for simple strings. * * Configurable. Default is keep double-quoted strings if they contain a * single-quoted string. * * $a = "sample" > $a = 'sample' * $b = "sample with 'single-quotes'" > $b = "sample with 'single-quotes'" * * Sniff: Squiz.Strings.DoubleQuoteUsage * * @see https://cs.symfony.com/doc/rules/string_notation/single_quote.html */ \PhpCsFixer\Fixer\StringNotation\SingleQuoteFixer::class, /** * PHP tag: Full opening tag * * " " " tag MUST be omitted from files containing only PHP. * * Sniff: PSR2.Files.ClosingTag * * @see https://cs.symfony.com/doc/rules/php_tag/no_closing_tag.html */ \PhpCsFixer\Fixer\PhpTag\NoClosingTagFixer::class, /** * Casing: Constant case: lower * * The PHP constants true, false, and null MUST be written * using the correct casing. * * Configurable. Default is "lower" * * "$a = FALse" > "a = false" * * Sniff: Generic.PHP.LowerCaseConstant * * @see https://cs.symfony.com/doc/rules/casing/constant_case.html */ \PhpCsFixer\Fixer\Casing\ConstantCaseFixer::class, /** * Casing: Lowercase keywords * * PHP keywords MUST be in lower case. * * "FOREACH( $a AS $B )" > "foreach( $a as $B )" * * Sniff: Generic.PHP.LowerCaseKeyword * * @see https://cs.symfony.com/doc/rules/casing/lowercase_keywords.html */ \PhpCsFixer\Fixer\Casing\LowercaseKeywordsFixer::class, /** * Function: No spaces after function name * * When making a method or function call, there MUST NOT be a space * between the method or function name and the opening parenthesis. * * "foo ( test ( 3 ) );" > "foo( test( 3 ) )" * * Sniffs: Function * * @see https://cs.symfony.com/doc/rules/function_notation/no_spaces_after_function_name.html */ \PhpCsFixer\Fixer\FunctionNotation\NoSpacesAfterFunctionNameFixer::class, /** * Function: No space after function declaration * * Spaces should be properly placed in a function declaration. * * Configurable. Default match MantisBT CS * * "function foo () {}" > "function foo() {}" * * @see https://cs.symfony.com/doc/rules/function_notation/function_declaration.html */ \PhpCsFixer\Fixer\FunctionNotation\FunctionDeclarationFixer::class, /** * Operator: Space around operators * * Configurable. Default is "single_space" * * "$a=1+2;" > "$a = 1 + 2;" * * Sniff: OperatorSpacingSniff * * @see https://cs.symfony.com/doc/rules/operator/binary_operator_spaces.html */ \PhpCsFixer\Fixer\Operator\BinaryOperatorSpacesFixer::class, /** * Array: Array syntax * * Configurable. Default is "short" syntax. * * array(1,2) > [1,2]; * * @see https://cs.symfony.com/doc/rules/array_notation/array_syntax.html */ \PhpCsFixer\Fixer\ArrayNotation\ArraySyntaxFixer::class, /** * Array: Trim array spaces * * Arrays should be formatted like function/method arguments, * without leading or trailing single line space. * * [ ] > [] * [ 1,2 ] > [1,2] * * @see https://cs.symfony.com/doc/rules/array_notation/trim_array_spaces.html */ \PhpCsFixer\Fixer\ArrayNotation\TrimArraySpacesFixer::class, /** * Array: No whitespace before comma in array * * In array declaration, there MUST NOT be a whitespace before * each comma. * * [1 , 2 , 8] > [1, 2, 3] * * @see https://cs.symfony.com/doc/rules/array_notation/no_whitespace_before_comma_in_array.html */ \PhpCsFixer\Fixer\ArrayNotation\NoWhitespaceBeforeCommaInArrayFixer::class, /** * Array: Whitespace after comma * * In array declaration, there MUST be a whitespace after each comma. * * Configurable. * * [1,2,3] > [1, 2, 3] * * "ensure_single_space" => false * ['one', 'two', 'three'] * [1, 2, 3] * * @see https://cs.symfony.com/doc/rules/array_notation/whitespace_after_comma_in_array.html */ \PhpCsFixer\Fixer\ArrayNotation\WhitespaceAfterCommaInArrayFixer::class, /** * Whitespace: Array indention * * Each element of an array must be indented exactly once. * * * $foo = [ * 'bar' => [ * 'baz' => true, * ], * ]; * * * $foo = [ * 'bar' => [ * 'baz' => true, * ], * ]; * * * @see https://cs.symfony.com/doc/rules/whitespace/array_indentation.html */ \PhpCsFixer\Fixer\Whitespace\ArrayIndentationFixer::class, /** * Control structure: Continuation position: same line * * Configurable. Default is "same_line" * * * if( $baz == true ) { * echo "foo"; * } * else { * echo "bar"; * } * * * if( $baz == true ) { * echo "foo"; * } else { * echo "bar"; * } * * * @see https://cs.symfony.com/doc/rules/control_structure/control_structure_continuation_position.html */ \PhpCsFixer\Fixer\ControlStructure\ControlStructureContinuationPositionFixer::class, /** * Control structure: Braces * * The body of each control structure MUST be enclosed within braces. * * * if( $foo === $bar ) * echo 'same' * * * if( $foo === $bar ) { * echo 'same' * } * * * Sniff: InlineControlStructureSniff * * @see https://cs.symfony.com/doc/rules/control_structure/control_structure_braces.html */ \PhpCsFixer\Fixer\ControlStructure\ControlStructureBracesFixer::class, /** * Language construct: Single space around a language construct * * @todo consider about it. * * @see https://cs.symfony.com/doc/rules/language_construct/single_space_around_construct.html */ // \PhpCsFixer\Fixer\LanguageConstruct\SingleSpaceAroundConstructFixer::class, /** * Whitespace: Statement indention * * Each statement must be indented. * * @note: Issues with mixed indention (tab and whitespaces)? * * @see https://cs.symfony.com/doc/rules/whitespace/statement_indentation.html */ \PhpCsFixer\Fixer\Whitespace\StatementIndentationFixer::class, /** * Comment: Spacing of single line comment * * #comment > # comment * * @see https://cs.symfony.com/doc/rules/comment/single_line_comment_spacing.html */ \PhpCsFixer\Fixer\Comment\SingleLineCommentSpacingFixer::class, ]) /** * File: Line endings * * Line endings MUST be "\n". * * @see LineEndingFixer * * The LineEndingFixer does the same, but is not configurable, * "\n" is the default. This sniff is a little more explicit. * * @see https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/master/src/Standards/Generic/Sniffs/Files/LineEndingsSniff.php */ // ->withConfiguredRule(\PHP_CodeSniffer\Standards\Generic\Sniffs\Files\LineEndingsSniff::class, [ // 'eolChar' => "\n", // ]) /** * Basic: Position of braces * * Opening braces on same line * * "Class Name {}" * "function name() {}" * * @see https://cs.symfony.com/doc/rules/basic/braces_position.html */ ->withConfiguredRule(\PhpCsFixer\Fixer\Basic\BracesPositionFixer::class, [ 'classes_opening_brace' => 'same_line', 'functions_opening_brace' => 'same_line', ]) /** * Whitespace: Spaces inside parentheses * * "function foo($bar, $baz)" > "function foo( $bar, $baz )" * "if($bar === $baz)" > "if( $bar === $baz )" * "foo( )" > "foo()" * * Sniffs: * - build/CodeSniffer/Mantis/Sniffs/ControlStructures/ControlSignatureSniff.php * - ControlStructureSpacingSniff * - FunctionDeclarationArgumentSpacingSniff * * @see https://cs.symfony.com/doc/rules/whitespace/spaces_inside_parentheses.html */ ->withConfiguredRule(\PhpCsFixer\Fixer\Whitespace\SpacesInsideParenthesesFixer::class, [ 'space' => 'single', ]) /** * Sniff: control structure spacing * * this will fix only control structures * if ($baz == true) > if ( $baz == true ) * * but not * function('boo') > function( 'boo' ) * * for this the sniff FunctionDeclarationArgumentSpacingSniff is needed * * @see FunctionDeclarationArgumentSpacingSniff * * Both are fixed with one * @see SpacesInsideParenthesesFixer */ // ->withConfiguredRule(PHP_CodeSniffer\Standards\PSR2\Sniffs\ControlStructures\ControlStructureSpacingSniff::class, [ // 'requiredSpacesAfterOpen' => 1, // 'requiredSpacesBeforeClose' => 1, // ]) // ->withConfiguredRule( // \PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\FunctionDeclarationArgumentSpacingSniff::class, [ // 'equalsSpacing' => 1, // 'requiredSpacesAfterOpen' => 1, // 'requiredSpacesBeforeClose' => 1 // ] // ) // Sniff concat spaces // @see ConcatSpaceFixer // ->withConfiguredRule(\PHP_CodeSniffer\Standards\Squiz\Sniffs\Strings\ConcatenationSpacingSniff::class, [ // 'spacing' => 1, // 'ignoreNewlines' => true, // ]) /** * Operator: Concat spaces * * Spacing to apply around concatenation operator. * * @see https://cs.symfony.com/doc/rules/operator/concat_space.html */ ->withConfiguredRule(\PhpCsFixer\Fixer\Operator\ConcatSpaceFixer::class, [ 'spacing' => 'one', ]) // single_line_comment_style // https://mlocati.github.io/php-cs-fixer-configurator/#version:3.52|fixer:single_line_comment_style ->withConfiguredRule(\PhpCsFixer\Fixer\Comment\SingleLineCommentStyleFixer::class, [ 'comment_types' => ['asterisk'], ]) /** * Cast: No space after cast * * "$bar = ( string ) $a;" > "$bar = (string)$a;" * * Sniff: NoSpaceAfterCast * * @see https://mlocati.github.io/php-cs-fixer-configurator/#version:3.52|fixer:cast_spaces */ ->withConfiguredRule( \PhpCsFixer\Fixer\CastNotation\CastSpacesFixer::class, [ 'space' => 'none' ] ) /** * Whitespace: No extra blank line * * * function foo() { * * return 'bar'; * } * * * function foo() { * return 'bar'; * } * * * Sniff: OpeningFunctionBraceKernighanRitchie * * @see https://cs.symfony.com/doc/rules/whitespace/no_extra_blank_lines.html */ ->withConfiguredRule( \PhpCsFixer\Fixer\Whitespace\NoExtraBlankLinesFixer::class, [ 'tokens' => [ # no space after opening braces 'parenthesis_brace_block', 'extra' ]] ) /** * Function: Argument spaces * * @todo check * * Sniff: PEAR.Functions.FunctionCallSignature [allowMultipleArguments => false] * * @see https://cs.symfony.com/doc/rules/function_notation/method_argument_space.html#example-5 */ // ->withConfiguredRule(\PhpCsFixer\Fixer\FunctionNotation\MethodArgumentSpaceFixer::class, [ // 'on_multiline' => 'ensure_single_line' // ]) ;