diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 887b9c2b7b..366dc7ace4 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -58,23 +58,3 @@ jobs: diff -B ./src/Standards/PSR12/ruleset.xml <(xmllint --format "./src/Standards/PSR12/ruleset.xml") diff -B ./src/Standards/Squiz/ruleset.xml <(xmllint --format "./src/Standards/Squiz/ruleset.xml") diff -B ./src/Standards/Zend/ruleset.xml <(xmllint --format "./src/Standards/Zend/ruleset.xml") - - pear: - name: "PHP: 7.4 | PEAR package validation" - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Install PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '7.4' - coverage: none - - - name: Validate the PEAR package file contents - run: php scripts/validate-pear-package.php - - - name: Validate the PEAR package - run: pear package-validate package.xml diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..0d4f85e60e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5182 @@ +# Changelog +The file documents changes to the PHP_CodeSniffer project. + +## [Unreleased] + +### Added +- Added support for readonly classes to File::getClassProperties() through a new is_readonly array index in the return value + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Added support for readonly class to a number of sniffs + - Generic.CodeAnalysis.UnnecessaryFinalModifier + - PEAR.Commenting.ClassComment + - PEAR.Commenting.FileComment + - PSR2.Classes.ClassDeclaration + - Squiz.Classes.ClassDeclaration + - Squiz.Classes.LowercaseClassKeywords + - Squiz.Commenting.ClassComment + - Squiz.Commenting.DocCommentAlignment + - Squiz.Commenting.FileComment + - Squiz.Commenting.InlineComment + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Squiz.Commenting.FunctionComment: new ParamNameUnexpectedAmpersandPrefix error for parameters annotated as passed by reference while the parameter is not passed by reference + - Thanks to Dan Wallis (@fredden) for the patch +- Documentation has been added for the following sniffs: + - PSR2.Files.ClosingTag + - PSR2.Methods.FunctionCallSignature + - PSR2.Methods.FunctionClosingBrace + - Thanks to Atsushi Okui (@blue32a) for the patch + +### Changed +- Changes have been made to the way PHPCS handles invalid sniff properties being set in a custom ruleset + - Fixes PHP 8.2 deprecation notices for properties set in a (custom) ruleset for complete standards/complete sniff categories + - Invalid sniff properties set for individual sniffs will now result in an error and halt the execution of PHPCS + - A descriptive error message is provided to allow users to fix their ruleset + - Sniff properties set for complete standards/complete sniff categories will now only be set on sniffs which explicitly support the property + - The property will be silently ignored for those sniffs which do not support the property + - For sniff developers, it is strongly recommended for sniffs to explicitly declare any user-adjustable public properties + - If dynamic properties need to be supported for a sniff, either declare the magic __set()/__get()/__isset()/__unset() methods on the sniff or let the sniff extend stdClass + - Note: The #[\AllowDynamicProperties] attribute will have no effect for properties which are being set in rulesets. + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- The third parameter for the Ruleset::setSniffProperty() method has been changed to expect an array + - Sniff developers/integrators of PHPCS may need to make some small adjustments to allow for this change + - Existing code will continue to work but will throw a deprecation error + - The backwards compatiblity layer will be removed in PHPCS 4.0 + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- When using auto report width (the default) a value of 80 columns will be used if an auto width cannot be determined + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Sniff error messages are now more informative to help bugs get reported to the correct project + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- PSR2.Classes.PropertyDeclaration now enforces that the readonly modifier comes after the visibility modifier + - PSR2 and PSR12 do not have documented rules for this as they pre-date the readonly modifier + - PSR-PER has been used to confirm the order of this keyword so it can be applied to PSR2 and PSR12 correctly + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- PEAR.Commenting.FunctionComment + Squiz.Commenting.FunctionComment: the SpacingAfter error can now be auto-fixed. + - Thanks to Dan Wallis (@fredden) for the patch +- Squiz.PHP.InnerFunctions sniff no longer reports on OO methods for OO structures declared within a function or closure + - Thanks to @Daimona for the patch + +### Removed +- Removed support for installing via PEAR + - Use composer or the phar files + +### Fixed +- Fixed bug #3557 : Squiz.Arrays.ArrayDeclaration will now ignore PHP 7.4 array unpacking when determining whether an array is associative + - Thanks to Volker Dusch (@edorian) for the patch +- Fixed bug #3717 : Squiz.Commenting.FunctionComment: fixed false positive for InvalidNoReturn when type is never + - Thanks to Choraimy Kroonstuiver (@axlon) for the patch +- Fixed bug #3722 : Potential "Uninitialized string offset 1" in octal notation backfill + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3728 : PHP 8.2 | PSR1/SideEffects: allow for readonly classes + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3770 : Squiz/NonExecutableCode: prevent false positives for switching between PHP and HTML + - Thanks to Dan Wallis (@fredden) for the patch +- Fixed bug #3776 : Generic/JSHint: error when JSHint is not available + - Thanks to Dan Wallis (@fredden) for the patch +- Fixed bug #3777 : Squiz/NonExecutableCode: slew of bug fixes, mostly related to modern PHP + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3779 : Squiz/LowercasePHPFunctions + Generic/ForbiddenFunctions: bug fix for class names in attributes + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3785 : Squiz.Commenting.FunctionComment: potential "Uninitialized string offset 0" when a type contains a duplicate pipe symbol + - Thanks to Dan Wallis (@fredden) for the patch +- Fixed bug #3787 : PEAR/Squiz/[MultiLine]FunctionDeclaration: allow for PHP 8.1 new in initializers + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3789 : Incorrect tokenization for ternary operator with match inside of it + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3797 : Tokenizer/PHP: more context sensitive keyword fixes + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3801 : File::getMethodParameters(): allow for readonly promoted properties without visibility + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3805 : Generic/FunctionCallArgumentSpacing: prevent fixer conflict over PHP 7.3+ trailing comma's in function calls + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3806 : Squiz.PHP.InnerFunctions sniff now correctly reports inner functions declared within a closure + - Thanks to @Daimona for the patch +- Fixed bug #3809 : GitBlame report was broken when passing a basepath + - Thanks to Chris (@datengraben) for the patch +- Fixed bug #3813 : Squiz.Commenting.FunctionComment: false positive for parameter name mismatch on parameters annotated as passed by reference + - Thanks to Dan Wallis (@fredden) for the patch +- Fixed bug #3816 : PSR12/FileHeader: bug fix - false positives on PHP 8.2+ readonly classes + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3877 : Filter names can be case-sensitive. The -h help text will now display the correct case for the available filters + - Thanks to @simonsan for the patch +- Fixed bug #3906 : Tokenizer/CSS: fixed a bug related to the unsupported slash comment syntax + - Thanks to Dan Wallis (@fredden) for the patch + +## [3.7.2] - 2023-02-23 +### Changed +- Newer versions of Composer will now suggest installing PHPCS using require-dev instead of require + - Thanks to Gary Jones (@GaryJones) for the patch +- A custom Out Of Memory error will now be shown if PHPCS or PHPCBF run out of memory during a run + - Error message provides actionable information about how to fix the problem and ensures the error is not silent + - Thanks to Juliette Reinders Folmer (@jrfnl) and Alain Schlesser (@schlessera) for the patch +- Generic.PHP.LowerCaseType sniff now correctly examines types inside arrow functions + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Squiz.Formatting.OperatorBracket no longer reports false positives in match() structures + +### Fixed +- Fixed bug #3616 : Squiz.PHP.DisallowComparisonAssignment false positive for PHP 8 match expression + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3618 : Generic.WhiteSpace.ArbitraryParenthesesSpacing false positive for return new parent() + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3632 : Short list not tokenized correctly in control structures without braces + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3639 : Tokenizer not applying tab replacement to heredoc/nowdoc closers + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3640 : Generic.WhiteSpace.DisallowTabIndent not reporting errors for PHP 7.3 flexible heredoc/nowdoc syntax + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3645 : PHPCS can show 0 exit code when running in parallel even if child process has fatal error + - Thanks to Alex Panshin (@enl) for the patch +- Fixed bug #3653 : False positives for match() in OperatorSpacingSniff + - Thanks to Jaroslav Hanslík (@kukulich) for the patch +- Fixed bug #3666 : PEAR.Functions.FunctionCallSignature incorrect indent fix when checking mixed HTML/PHP files +- Fixed bug #3668 : PSR12.Classes.ClassInstantiation.MissingParentheses false positive when instantiating parent classes + - Similar issues also fixed in Generic.Functions.FunctionCallArgumentSpacing and Squiz.Formatting.OperatorBracket + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch +- Fixed bug #3672 : Incorrect ScopeIndent.IncorrectExact report for match inside array literal +- Fixed bug #3694 : Generic.WhiteSpace.SpreadOperatorSpacingAfter does not ignore spread operator in PHP 8.1 first class callables + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch + +## [3.7.1] - 2022-06-18 +### Fixed +- Fixed bug #3609 : Methods/constants with name empty/isset/unset are always reported as error + - Thanks to Juliette Reinders Folmer (@jrfnl) for the patch + +## [3.7.0] - 2022-06-13 +### Added +- Added support for PHP 8.1 explicit octal notation + - This new syntax has been backfilled for PHP versions less than 8.1 + - Thanks to Mark Baker for the patch + - Thanks to Juliette Reinders Folmer for additional fixes +- Added support for PHP 8.1 enums + - This new syntax has been backfilled for PHP versions less than 8.1 + - Includes a new T_ENUM_CASE token to represent the case statements inside an enum + - Thanks to Jaroslav Hanslík for the patch + - Thanks to Juliette Reinders Folmer for additional core and sniff support +- Added support for the PHP 8.1 readonly token + - Tokenzing of the readonly keyword has been backfilled for PHP versions less than 8.1 + - Thanks to Jaroslav Hanslík for the patch +- Added support for PHP 8.1 intersection types + - Includes a new T_TYPE_INTERSECTION token to represent the ampersand character inside intersection types + - Thanks to Jaroslav Hanslík for the patch + +### Changed +- File::getMethodParameters now supports the new PHP 8.1 readonly token + - When constructor property promotion is used, a new property_readonly array index is included in the return value + - This is a boolean value indicating if the property is readonly + - If the readonly token is detected, a new readonly_token array index is included in the return value + - This contains the token index of the readonly keyword + - Thanks to Juliette Reinders Folmer for the patch +- Support for new PHP 8.1 readonly keyword has been added to the following sniffs: + - Generic.PHP.LowerCaseKeyword + - PSR2.Classes.PropertyDeclaration + - Squiz.Commenting.BlockComment + - Squiz.Commenting.DocCommentAlignment + - Squiz.Commenting.VariableComment + - Squiz.WhiteSpace.ScopeKeywordSpacing + - Thanks to Juliette Reinders Folmer for the patches +- The parallel feature is now more efficient and runs faster in some situations due to improved process management + - Thanks to Sergei Morozov for the patch +- The list of installed coding standards now has consistent ordering across all platforms + - Thanks to Juliette Reinders Folmer for the patch +- Generic.PHP.UpperCaseConstant and Generic.PHP.LowerCaseConstant now ignore type declarations + - These sniffs now only report errors for true/false/null when used as values + - Thanks to Juliette Reinders Folmer for the patch +- Generic.PHP.LowerCaseType now supports the PHP 8.1 never type + - Thanks to Jaroslav Hanslík for the patch + +### Fixed +- Fixed bug #3502 : A match statement within an array produces Squiz.Arrays.ArrayDeclaration.NoKeySpecified +- Fixed bug #3503 : Squiz.Commenting.FunctionComment.ThrowsNoFullStop false positive when one line @throw +- Fixed bug #3505 : The nullsafe operator is not counted in Generic.Metrics.CyclomaticComplexity + - Thanks to Mark Baker for the patch +- Fixed bug #3526 : PSR12.Properties.ConstantVisibility false positive when using public final const syntax + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3530 : Line indented incorrectly false positive when using match-expression inside switch case +- Fixed bug #3534 : Name of typed enum tokenized as T_GOTO_LABEL + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3546 : Tokenizer/PHP: bug fix - parent/static keywords in class instantiations + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3550 : False positive from PSR2.ControlStructures.SwitchDeclaration.TerminatingComment when using trailing comment + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3575: Squiz.Scope.MethodScope misses visibility keyword on previous line + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3604: Tokenizer/PHP: bug fix for double quoted strings using ${ + - Thanks to Juliette Reinders Folmer for the patch + +## [3.6.2] - 2021-12-13 +### Changed +- Processing large code bases that use tab indenting inside comments and strings will now be faster + - Thanks to Thiemo Kreuz for the patch + +### Fixed +- Fixed bug #3388 : phpcs does not work when run from WSL drives + - Thanks to Juliette Reinders Folmer and Graham Wharton for the patch +- Fixed bug #3422 : Squiz.WhiteSpace.ScopeClosingBrace fixer removes HTML content when fixing closing brace alignment + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3437 : PSR12 does not forbid blank lines at the start of the class body + - Added new PSR12.Classes.OpeningBraceSpace sniff to enforce this +- Fixed bug #3440 : Squiz.WhiteSpace.MemberVarSpacing false positives when attributes used without docblock + - Thanks to Vadim Borodavko for the patch +- Fixed bug #3448 : PHP 8.1 deprecation notice while generating running time value + - Thanks to Juliette Reinders Folmer and Andy Postnikov for the patch +- Fixed bug #3456 : PSR12.Classes.ClassInstantiation.MissingParentheses false positive using attributes on anonymous class + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3460 : Generic.Formatting.MultipleStatementAlignment false positive on closure with parameters + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3468 : do/while loops are double-counted in Generic.Metrics.CyclomaticComplexity + - Thanks to Mark Baker for the patch +- Fixed bug #3469 : Ternary Operator and Null Coalescing Operator are not counted in Generic.Metrics.CyclomaticComplexity + - Thanks to Mark Baker for the patch +- Fixed bug #3472 : PHP 8 match() expression is not counted in Generic.Metrics.CyclomaticComplexity + - Thanks to Mark Baker for the patch + +## [3.6.1] - 2021-10-11 +### Changed +- PHPCS annotations can now be specified using hash-style comments + - Previously, only slash-style and block-style comments could be used to do things like disable errors + - Thanks to Juliette Reinders Folmer for the patch +- The new PHP 8.1 tokenisation for ampersands has been reverted to use the existing PHP_CodeSniffer method + - The PHP 8.1 tokens T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG and T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG are unsued + - Ampersands continue to be tokenized as T_BITWISE_AND for all PHP versions + - Thanks to Juliette Reinders Folmer and Anna Filina for the patch +- File::getMethodParameters() no longer incorrectly returns argument attributes in the type hint array index + - A new has_attributes array index is available and set to TRUE if the argument has attributes defined + - Thanks to Juliette Reinders Folmer for the patch +- Fixed an issue where some sniffs would not run on PHP files that only used the short echo tag + - The following sniffs were affected: + - Generic.Files.ExecutableFile + - Generic.Files.LowercasedFilename + - Generic.Files.LineEndings + - Generic.Files.EndFileNewline + - Generic.Files.EndFileNoNewline + - Generic.PHP.ClosingPHPTag + - Generic.PHP.Syntax + - Generic.VersionControl.GitMergeConflict + - Generic.WhiteSpace.DisallowSpaceIndent + - Generic.WhiteSpace.DisallowTabIndent + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.BlockComment now correctly applies rules for block comments after a short echo tag + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Generic.NamingConventions.ConstructorName no longer throws deprecation notices on PHP 8.1 + - Thanks to Juliette Reinders Folmer for the patch +- Fixed false positives when using attributes in the following sniffs: + - PEAR.Commenting.FunctionComment + - Squiz.Commenting.InlineComment + - Squiz.Commenting.BlockComment + - Squiz.Commenting.VariableComment + - Squiz.WhiteSpace.MemberVarSpacing + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3294 : Bug in attribute tokenization when content contains PHP end token or attribute closer on new line + - Thanks to Alessandro Chitolina for the patch + - Thanks to Juliette Reinders Folmer for the tests +- Fixed bug #3296 : PSR2.ControlStructures.SwitchDeclaration takes phpcs:ignore as content of case body +- Fixed bug #3297 : PSR2.ControlStructures.SwitchDeclaration.TerminatingComment does not handle try/finally blocks + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3302 : PHP 8.0 | Tokenizer/PHP: bugfix for union types using namespace operator + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3303 : findStartOfStatement() doesn't work with T_OPEN_TAG_WITH_ECHO +- Fixed bug #3316 : Arrow function not tokenized correctly when using null in union type +- Fixed bug #3317 : Problem with how phpcs handles ignored files when running in parallel + - Thanks to Emil Andersson for the patch +- Fixed bug #3324 : PHPCS hangs processing some nested arrow functions inside a function call +- Fixed bug #3326 : Generic.Formatting.MultipleStatementAlignment error with const DEFAULT + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3333 : Squiz.Objects.ObjectInstantiation: null coalesce operators are not recognized as assignment + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3340 : Ensure interface and trait names are always tokenized as T_STRING + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3342 : PSR12/Squiz/PEAR standards all error on promoted properties with docblocks + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3345 : IF statement with no braces and double catch turned into syntax error by auto-fixer + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3352 : PSR2.ControlStructures.SwitchDeclaration can remove comments on the same line as the case statement while fixing + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3357 : Generic.Functions.OpeningFunctionBraceBsdAllman removes return type when additional lines are present + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3362 : Generic.WhiteSpace.ScopeIndent false positive for arrow functions inside arrays +- Fixed bug #3384 : Squiz.Commenting.FileComment.SpacingAfterComment false positive on empty file +- Fixed bug #3394 : Fix PHP 8.1 auto_detect_line_endings deprecation notice +- Fixed bug #3400 : PHP 8.1: prevent deprecation notices about missing return types + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3424 : PHPCS fails when using PHP 8 Constructor property promotion with attributes + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3425 : PHP 8.1 | Runner::processChildProcs(): fix passing null to non-nullable bug + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3445 : Nullable parameter after attribute incorrectly tokenized as ternary operator + - Thanks to Juliette Reinders Folmer for the patch + +## [3.6.0] - 2021-04-09 +### Added +- Added support for PHP 8.0 union types + - A new T_TYPE_UNION token is available to represent the pipe character + - File::getMethodParameters(), getMethodProperties(), and getMemberProperties() will now return union types + - Thanks to Juliette Reinders Folmer for the patch +- Added support for PHP 8.0 named function call arguments + - A new T_PARAM_NAME token is available to represent the label with the name of the function argument in it + - Thanks to Juliette Reinders Folmer for the patch +- Added support for PHP 8.0 attributes + - The PHP-supplied T_ATTRIBUTE token marks the start of an attribute + - A new T_ATTRIBUTE_END token is available to mark the end of an attribute + - New attribute_owner and attribute_closer indexes are available in the tokens array for all tokens inside an attribute + - Tokenizing of attributes has been backfilled for older PHP versions + - The following sniffs have been updated to support attributes: + - PEAR.Commenting.ClassComment + - PEAR.Commenting.FileComment + - PSR1.Files.SideEffects + - PSR12.Files.FileHeader + - Squiz.Commenting.ClassComment + - Squiz.Commenting.FileComment + - Squiz.WhiteSpace.FunctionSpacing + - Thanks to Vadim Borodavko for the patch + - Thanks to Alessandro Chitolina for the patch +- Added support for PHP 8.0 dereferencing of text strings with interpolated variables + - Thanks to Juliette Reinders Folmer for the patch +- Added support for PHP 8.0 match expressions + - Match expressions are now tokenised with parenthesis and scope openers and closers + - Sniffs can listen for the T_MATCH token to process match expressions + - Note that the case and default statements inside match expressions do not have scopes set + - A new T_MATCH_ARROW token is available to represent the arrows in match expressions + - A new T_MATCH_DEFAULT token is available to represent the default keyword in match expressions + - All tokenizing of match expressions has been backfilled for older PHP versions + - The following sniffs have been updated to support match expressions: + - Generic.CodeAnalysis.AssignmentInCondition + - Generic.CodeAnalysis.EmptyPHPStatement + - Thanks to Vadim Borodavko for the patch + - Generic.CodeAnalysis.EmptyStatement + - Generic.PHP.LowerCaseKeyword + - PEAR.ControlStructures.ControlSignature + - PSR12.ControlStructures.BooleanOperatorPlacement + - Squiz.Commenting.LongConditionClosingComment + - Squiz.Commenting.PostStatementComment + - Squiz.ControlStructures.LowercaseDeclaration + - Squiz.ControlStructures.ControlSignature + - Squiz.Formatting.OperatorBracket + - Squiz.PHP.DisallowMultipleAssignments + - Squiz.Objects.ObjectInstantiation + - Squiz.WhiteSpace.ControlStructureSpacing + - Thanks to Juliette Reinders Folmer for the patch +- Added Generic.NamingConventions.AbstractClassNamePrefix to enforce that class names are prefixed with "Abstract" + - Thanks to Anna Borzenko for the contribution +- Added Generic.NamingConventions.InterfaceNameSuffix to enforce that interface names are suffixed with "Interface" + - Thanks to Anna Borzenko for the contribution +- Added Generic.NamingConventions.TraitNameSuffix to enforce that trait names are suffixed with "Trait" + - Thanks to Anna Borzenko for the contribution + +### Changed +- The value of the T_FN_ARROW token has changed from "T_FN_ARROW" to "PHPCS_T_FN_ARROW" to avoid package conflicts + - This will have no impact on custom sniffs unless they are specifically looking at the value of the T_FN_ARROW constant + - If sniffs are just using constant to find arrow functions, they will continue to work without modification + - Thanks to Juliette Reinders Folmer for the patch +- File::findStartOfStatement() now works correctly when passed the last token in a statement +- File::getMethodParameters() now supports PHP 8.0 constructor property promotion + - Returned method params now include a "property_visibility" and "visibility_token" index if property promotion is detected + - Thanks to Juliette Reinders Folmer for the patch +- File::getMethodProperties() now includes a "return_type_end_token" index in the return value + - This indicates the last token in the return type, which is helpful when checking union types + - Thanks to Juliette Reinders Folmer for the patch +- Include patterns are now ignored when processing STDIN + - Previously, checks using include patterns were excluded when processing STDIN when no file path was provided via --stdin-path + - Now, all include and exclude rules are ignored when no file path is provided, allowing all checks to run + - If you want include and exclude rules enforced when checking STDIN, use --stdin-path to set the file path + - Thanks to Juliette Reinders Folmer for the patch +- Spaces are now correctly escaped in the paths to external on Windows + - Thanks to Juliette Reinders Folmer for the patch +- Generic.CodeAnalysis.UnusedFunctionParameter can now be configured to ignore variable usage for specific type hints + -- This allows you to suppress warnings for some variables that are not required, but leave warnings for others + -- Set the ignoreTypeHints array property to a list of type hints to ignore + -- Thanks to Petr Bugyík for the patch +- Generic.Formatting.MultipleStatementAlignment can now align statements at the start of the assignment token + - Previously, the sniff enforced that the values were aligned, even if this meant the assignment tokens were not + - Now, the sniff can enforce that the assignment tokens are aligned, even if this means the values are not + - Set the "alignAtEnd" sniff property to "false" to align the assignment tokens + - The default remains at "true", so the assigned values are aligned + - Thanks to John P. Bloch for the patch +- Generic.PHP.LowerCaseType now supports checking of typed properties + - Thanks to Juliette Reinders Folmer for the patch +- Generic.PHP.LowerCaseType now supports checking of union types + - Thanks to Juliette Reinders Folmer for the patch +- PEAR.Commenting.FunctionComment and Squiz.Commenting.FunctionComment sniffs can now ignore private and protected methods + - Set the "minimumVisibility" sniff property to "protected" to ignore private methods + - Set the "minimumVisibility" sniff property to "public" to ignore both private and protected methods + - The default remains at "private", so all methods are checked + - Thanks to Vincent Langlet for the patch +- PEAR.Commenting.FunctionComment and Squiz.Commenting.FunctionComment sniffs can now ignore return tags in any method + - Previously, only __construct and __destruct were ignored + - Set the list of method names to ignore in the "specialMethods" sniff property + - The default remains at "__construct" and "__destruct" only + - Thanks to Vincent Langlet for the patch +- PSR2.ControlStructures.SwitchDeclaration now supports nested switch statements where every branch terminates + - Previously, if a CASE only contained a SWITCH and no direct terminating statement, a fall-through error was displayed + - Now, the error is surpressed if every branch of the SWITCH has a terminating statement + - Thanks to Vincent Langlet for the patch +- The PSR2.Methods.FunctionCallSignature.SpaceBeforeCloseBracket error message is now reported on the closing parenthesis token + - Previously, the error was being reported on the function keyword, leading to confusing line numbers in the error report +- Squiz.Commenting.FunctionComment is now able to ignore function comments that are only inheritdoc statements + - Set the skipIfInheritdoc sniff property to "true" to skip checking function comments if the content is only {@inhertidoc} + - The default remains at "false", so these comments will continue to report errors + - Thanks to Jess Myrbo for the patch +- Squiz.Commenting.FunctionComment now supports the PHP 8 mixed type + - Thanks to Vadim Borodavko for the patch +- Squiz.PHP.NonExecutableCode now has improved handling of syntax errors + - Thanks to Thiemo Kreuz for the patch +- Squiz.WhiteSpace.ScopeKeywordSpacing now checks spacing when using PHP 8.0 constructor property promotion + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Fixed an issue that could occurr when checking files on network drives, such as with WSL2 on Windows 10 + - This works around a long-standing PHP bug with is_readable() + - Thanks to Michael S for the patch +- Fixed a number of false positives in the Squiz.PHP.DisallowMultipleAssignments sniff + - Sniff no longer errors for default value assignments in arrow functions + - Sniff no longer errors for assignments on first line of closure + - Sniff no longer errors for assignments after a goto label + - Thanks to Jaroslav Hanslík for the patch +- Fixed bug #2913 : Generic.WhiteSpace.ScopeIndent false positive when opening and closing tag on same line inside conditional +- Fixed bug #2992 : Enabling caching using a ruleset produces invalid cache files when using --sniffs and --exclude CLI args +- Fixed bug #3003 : Squiz.Formatting.OperatorBracket autofix incorrect when assignment used with null coalescing operator +- Fixed bug #3145 : Autoloading of sniff fails when multiple classes declared in same file +- Fixed bug #3157 : PSR2.ControlStructures.SwitchDeclaration.BreakIndent false positive when case keyword is not indented +- Fixed bug #3163 : Undefined index error with pre-commit hook using husky on PHP 7.4 + - Thanks to Ismo Vuorinen for the patch +- Fixed bug #3165 : Squiz.PHP.DisallowComparisonAssignment false positive when comparison inside closure +- Fixed bug #3167 : Generic.WhiteSpace.ScopeIndent false positive when using PHP 8.0 constructor property promotion +- Fixed bug #3170 : Squiz.WhiteSpace.OperatorSpacing false positive when using negation with string concat + - This also fixes the same issue in the PSR12.Operators.OperatorSpacing sniff +- Fixed bug #3177 : Incorrect tokenization of GOTO statements in mixed PHP/HTML files + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3184 : PSR2.Namespace.NamespaceDeclaration false positive on namespace operator + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3188 : Squiz.WhiteSpace.ScopeKeywordSpacing false positive for static return type + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3192 : findStartOfStatement doesn't work correctly inside switch + - Thanks to Vincent Langlet for the patch +- Fixed bug #3195 : Generic.WhiteSpace.ScopeIndent confusing message when combination of tabs and spaces found +- Fixed bug #3197 : Squiz.NamingConventions.ValidVariableName does not use correct error code for all member vars +- Fixed bug #3219 : Generic.Formatting.MultipleStatementAlignment false positive for empty anonymous classes and closures +- Fixed bug #3258 : Squiz.Formatting.OperatorBracket duplicate error messages for unary minus + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3273 : Squiz.Functions.FunctionDeclarationArgumentSpacing reports line break as 0 spaces between parenthesis +- Fixed bug #3277 : Nullable static return typehint causes whitespace error +- Fixed bug #3284 : Unused parameter false positive when using array index in arrow function + +## [3.5.8] - 2020-10-23 +### Removed +- Reverted a change to the way include/exclude patterns are processed for STDIN content + - This change is not backwards compatible and will be re-introduced in version 3.6.0 + +## [3.5.7] - 2020-10-23 +### Added +- The PHP 8.0 T_NULLSAFE_OBJECT_OPERATOR token has been made available for older versions + - Existing sniffs that check for T_OBJECT_OPERATOR have been modified to apply the same rules for the nullsafe object operator + - Thanks to Juliette Reinders Folmer for the patch +- The new method of PHP 8.0 tokenizing for namespaced names has been revert to thr pre 8.0 method + - This maintains backwards compatible for existing sniffs on PHP 8.0 + - This change will be removed in PHPCS 4.0 as the PHP 8.0 tokenizing method will be backported for pre 8.0 versions + - Thanks to Juliette Reinders Folmer for the patch +- Added support for changes to the way PHP 8.0 tokenizes hash comments + - The existing PHP 5-7 behaviour has been replicated for version 8, so no sniff changes are required + - Thanks to Juliette Reinders Folmer for the patch +- Running the unit tests now includes warnings in the found and fixable error code counts + - Thanks to Juliette Reinders Folmer for the patch +- PSR12.Functions.NullableTypeDeclaration now supports the PHP8 static return type + - Thanks to Juliette Reinders Folmer for the patch + +### Changed +- The autoloader has been changed to fix sniff class name detection issues that may occur when running on PHP 7.4+ + - Thanks to Eloy Lafuente for the patch +- PSR12.ControlStructures.BooleanOperatorPlacement.FoundMixed error message is now more accurate when using the allowOnly setting + - Thanks to Vincent Langlet for the patch + +### Fixed +- Fixed Squiz.Formatting.OperatorBracket false positive when exiting with a negative number +- Fixed Squiz.PHP.DisallowComparisonAssignment false positive for methods called on an object +- Fixed bug #2882 : Generic.Arrays.ArrayIndent can request close brace indent to be less than the statement indent level +- Fixed bug #2883 : Generic.WhiteSpace.ScopeIndent.Incorrect issue after NOWDOC +- Fixed bug #2975 : Undefined offset in PSR12.Functions.ReturnTypeDeclaration when checking function return type inside ternary +- Fixed bug #2988 : Undefined offset in Squiz.Strings.ConcatenationSpacing during live coding + - Thanks to Thiemo Kreuz for the patch +- Fixed bug #2989 : Incorrect auto-fixing in Generic.ControlStructures.InlineControlStructure during live coding + - Thanks to Thiemo Kreuz for the patch +- Fixed bug #3007 : Directory exclude pattern improperly excludes directories with names that start the same + - Thanks to Steve Talbot for the patch +- Fixed bug #3043 : Squiz.WhiteSpace.OperatorSpacing false positive for negation in arrow function + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3049 : Incorrect error with arrow function and parameter passed as reference + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3053 : PSR2 incorrect fix when multiple use statements on same line do not have whitespace between them +- Fixed bug #3058 : Progress gets unaligned when 100% happens at the end of the available dots +- Fixed bug #3059 : Squiz.Arrays.ArrayDeclaration false positive when using type casting + - Thanks to Sergei Morozov for the patch +- Fixed bug #3060 : Squiz.Arrays.ArrayDeclaration false positive for static functions + - Thanks to Sergei Morozov for the patch +- Fixed bug #3065 : Should not fix Squiz.Arrays.ArrayDeclaration.SpaceBeforeComma if comment between element and comma + - Thanks to Sergei Morozov for the patch +- Fixed bug #3066 : No support for namespace operator used in type declarations + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3075 : PSR12.ControlStructures.BooleanOperatorPlacement false positive when operator is the only content on line +- Fixed bug #3099 : Squiz.WhiteSpace.OperatorSpacing false positive when exiting with negative number + - Thanks to Sergei Morozov for the patch +- Fixed bug #3102 : PSR12.Squiz.OperatorSpacing false positive for default values of arrow functions + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #3124 : PSR-12 not reporting error for empty lines with only whitespace +- Fixed bug #3135 : Ignore annotations are broken on PHP 8.0 + - Thanks to Juliette Reinders Folmer for the patch + +## [3.5.6] - 2020-08-10 +### Added +- Added support for PHP 8.0 magic constant dereferencing + - Thanks to Juliette Reinders Folmer for the patch +- Added support for changes to the way PHP 8.0 tokenizes comments + - The existing PHP 5-7 behaviour has been replicated for version 8, so no sniff changes are required + - Thanks to Juliette Reinders Folmer for the patch +- `File::getMethodProperties()` now detects the PHP 8.0 static return type + - Thanks to Juliette Reinders Folmer for the patch +- The PHP 8.0 static return type is now supported for arrow functions + - Thanks to Juliette Reinders Folmer for the patch + +### Changed +- The cache is no longer used if the list of loaded PHP extensions changes + - Thanks to Juliette Reinders Folmer for the patch +- `Generic.NamingConventions.CamelCapsFunctionName` no longer reports `__serialize` and `__unserialize` as invalid names + - Thanks to Filip Š for the patch +- `PEAR.NamingConventions.ValidFunctionName` no longer reports `__serialize` and `__unserialize` as invalid names + - Thanks to Filip Š for the patch +- `Squiz.Scope.StaticThisUsage` now detects usage of `$this` inside closures and arrow functions + - Thanks to Michał Bundyra for the patch + +### Fixed +- Fixed bug #2877 : PEAR.Functions.FunctionCallSignature false positive for array of functions + - Thanks to Vincent Langlet for the patch +- Fixed bug #2888 : PSR12.Files.FileHeader blank line error with multiple namespaces in one file +- Fixed bug #2926 : phpcs hangs when using arrow functions that return heredoc +- Fixed bug #2943 : Redundant semicolon added to a file when fixing PSR2.Files.ClosingTag.NotAllowed +- Fixed bug #2967 : Markdown generator does not output headings correctly + - Thanks to Petr Bugyík for the patch +- Fixed bug #2977 : File::isReference() does not detect return by reference for closures + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2994 : Generic.Formatting.DisallowMultipleStatements false positive for FOR loop with no body +- Fixed bug #3033 : Error generated during tokenizing of goto statements on PHP 8 + - Thanks to Juliette Reinders Folmer for the patch + +## [3.5.5] - 2020-04-17 +### Changed +- The T_FN backfill now works more reliably so T_FN tokens only ever represent real arrow functions + - Thanks to Juliette Reinders Folmer for the patch +- Fixed an issue where including sniffs using paths containing multiple dots would silently fail +- Generic.CodeAnalysis.EmptyPHPStatement now detects empty statements at the start of control structures + +### Fixed +- Error wording in PEAR.Functions.FunctionCallSignature now always uses "parenthesis" instead of sometimes using "bracket" + - Thanks to Vincent Langlet for the patch +- Fixed bug #2787 : Squiz.PHP.DisallowMultipleAssignments not ignoring typed property declarations + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2810 : PHPCBF fails to fix file with empty statement at start on control structure +- Fixed bug #2812 : Squiz.Arrays.ArrayDeclaration not detecting some arrays with multiple arguments on the same line + - Thanks to Jakub Chábek for the patch +- Fixed bug #2826 : Generic.WhiteSpace.ArbitraryParenthesesSpacing doesn't detect issues for statements directly after a control structure + - Thanks to Vincent Langlet for the patch +- Fixed bug #2848 : PSR12.Files.FileHeader false positive for file with mixed PHP and HTML and no file header +- Fixed bug #2849 : Generic.WhiteSpace.ScopeIndent false positive with arrow function inside array +- Fixed bug #2850 : Generic.PHP.LowerCaseKeyword complains __HALT_COMPILER is uppercase +- Fixed bug #2853 : Undefined variable error when using Info report + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2865 : Double arrow tokenized as T_STRING when placed after function named "fn" +- Fixed bug #2867 : Incorrect scope matching when arrow function used inside IF condition +- Fixed bug #2868 : phpcs:ignore annotation doesnt work inside a docblock +- Fixed bug #2878 : PSR12.Files.FileHeader conflicts with Generic.Files.LineEndings +- Fixed bug #2895 : PSR2.Methods.FunctionCallSignature.MultipleArguments false positive with arrow function argument + +## [3.5.4] - 2020-01-31 +### Changed +- The PHP 7.4 numeric separator backfill now works correctly for more float formats + - Thanks to Juliette Reinders Folmer for the patch +- The PHP 7.4 numeric separator backfill is no longer run on PHP version 7.4.0 or greater +- File::getCondition() now accepts a 3rd argument that allows for the closest matching token to be returned + - By default, it continues to return the first matched token found from the top of the file +- Fixed detection of array return types for arrow functions +- Added Generic.PHP.DisallowRequestSuperglobal to ban the use of the $_REQUEST superglobal + - Thanks to Morerice for the contribution +- Generic.ControlStructures.InlineControlStructure no longer shows errors for WHILE and FOR statements without a body + - Previously it required these to have curly braces, but there were no statements to enclose in them + - Thanks to Juliette Reinders Folmer for the patch +- PSR12.ControlStructures.BooleanOperatorPlacement can now be configured to enforce a specific operator position + - By default, the sniff ensures that operators are all at the begining or end of lines, but not a mix of both + - Set the allowOnly property to "first" to enforce all boolean operators to be at the start of a line + - Set the allowOnly property to "last" to enforce all boolean operators to be at the end of a line + - Thanks to Vincent Langlet for the patch +- PSR12.Files.ImportStatement now auto-fixes import statements by removing the leading slash + - Thanks to Michał Bundyra for the patch +- Squiz.ControlStructures.ForLoopDeclaration now has a setting to ignore newline characters + - Default remains FALSE, so newlines are not allowed within FOR definitions + - Override the "ignoreNewlines" setting in a ruleset.xml file to change +- Squiz.PHP.InnerFunctions now handles multiple nested anon classes correctly + +### Fixed +- Fixed bug #2497 : Sniff properties not set when referencing a sniff using relative paths or non-native slashes + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2657 : Squiz.WhiteSpace.FunctionSpacing can remove spaces between comment and first/last method during auto-fixing + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2688 : Case statements not tokenized correctly when switch is contained within ternary +- Fixed bug #2698 : PHPCS throws errors determining auto report width when shell_exec is disabled + - Thanks to Matthew Peveler for the patch +- Fixed bug #2730 : PSR12.ControlStructures.ControlStructureSpacing does not ignore comments between conditions + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2732 : PSR12.Files.FileHeader misidentifies file header in mixed content file +- Fixed bug #2745 : AbstractArraySniff wrong indices when mixed coalesce and ternary values + - Thanks to Michał Bundyra for the patch +- Fixed bug #2748 : Wrong end of statement for fn closures + - Thanks to Michał Bundyra for the patch +- Fixed bug #2751 : Autoload relative paths first to avoid confusion with files from the global include path + - Thanks to Klaus Purer for the patch +- Fixed bug #2763 : PSR12 standard reports errors for multi-line FOR definitions +- Fixed bug #2768 : Generic.Files.LineLength false positive for non-breakable strings at exactly the soft limit + - Thanks to Alex Miles for the patch +- Fixed bug #2773 : PSR2.Methods.FunctionCallSignature false positive when arrow function has array return type +- Fixed bug #2790 : PSR12.Traits.UseDeclaration ignores block comments + - Thanks to Vincent Langlet for the patch +- Fixed bug #2791 : PSR12.Functions.NullableTypeDeclaration false positive when ternary operator used with instanceof + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2802 : Can't specify a report file path using the tilde shortcut +- Fixed bug #2804 : PHP4-style typed properties not tokenized correctly + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2805 : Undefined Offset notice during live coding of arrow functions + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2843 : Tokenizer does not support alternative syntax for declare statements + - Thanks to Juliette Reinders Folmer for the patch + +## [3.5.3] - 2019-12-04 +### Changed +- The PHP 7.4 T_FN token has been made available for older versions + - T_FN represents the fn string used for arrow functions + - The double arrow becomes the scope opener, and uses a new T_FN_ARROW token type + - The token after the statement (normally a semicolon) becomes the scope closer + - The token is also associated with the opening and closing parenthesis of the statement + - Any functions named "fn" will cause have a T_FN token for the function name, but have no scope information + - Thanks to Michał Bundyra for the help with this change +- PHP 7.4 numeric separators are now tokenized in the same way when using older PHP versions + - Previously, a number like 1_000 would tokenize as T_LNUMBER (1), T_STRING (_000) + - Now, the number tokenizes as T_LNUMBER (1_000) + - Sniff developers should consider how numbers with underscores impact their custom sniffs +- The PHPCS file cache now takes file permissions into account + - The cache is now invalidated for a file when its permissions are changed +- File::getMethodParameters() now supports arrow functions +- File::getMethodProperties() now supports arrow functions +- Added Fixer::changeCodeBlockIndent() to change the indent of a code block while auto-fixing + - Can be used to either increase or decrease the indent + - Useful when moving the start position of something like a closure, where you want the content to also move +- Added Generic.Files.ExecutableFile sniff + - Ensures that files are not executable + - Thanks to Matthew Peveler for the contribution +- Generic.CodeAnalysis.EmptyPhpStatement now reports unnecessary semicolons after control structure closing braces + - Thanks to Vincent Langlet for the patch +- Generic.PHP.LowerCaseKeyword now enforces that the "fn" keyword is lowercase + - Thanks to Michał Bundyra for the patch +- Generic.WhiteSpace.ScopeIndent now supports static arrow functions +- PEAR.Functions.FunctionCallSignature now adjusts the indent of function argument contents during auto-fixing + - Previously, only the first line of an argument was changed, leading to inconsistent indents + - This change also applies to PSR2.Methods.FunctionCallSignature +- PSR2.ControlStructures.ControlStructureSpacing now checks whitespace before the closing parenthesis of multi-line control structures + - Previously, it incorrectly applied the whitespace check for single-line definitions only +- PSR12.Functions.ReturnTypeDeclaration now checks the return type of arrow functions + - Thanks to Michał Bundyra for the patch +- PSR12.Traits.UseDeclaration now ensures all trait import statements are grouped together + - Previously, the trait import section of the class ended when the first non-import statement was found + - Checking now continues throughout the class to ensure all statements are grouped together + - This also ensures that empty lines are not requested after an import statement that isn't the last one +- Squiz.Functions.LowercaseFunctionKeywords now enforces that the "fn" keyword is lowercase + - Thanks to Michał Bundyra for the patch + +### Fixed +- Fixed bug #2586 : Generic.WhiteSpace.ScopeIndent false positives when indenting open tags at a non tab-stop +- Fixed bug #2638 : Squiz.CSS.DuplicateClassDefinitionSniff sees comments as part of the class name + - Thanks to Raphael Horber for the patch +- Fixed bug #2640 : Squiz.WhiteSpace.OperatorSpacing false positives for some negation operators + - Thanks to Jakub Chábek and Juliette Reinders Folmer for the patch +- Fixed bug #2674 : Squiz.Functions.FunctionDeclarationArgumentSpacing prints wrong argument name in error message +- Fixed bug #2676 : PSR12.Files.FileHeader locks up when file ends with multiple inline comments +- Fixed bug #2678 : PSR12.Classes.AnonClassDeclaration incorrectly enforcing that closing brace be on a line by itself +- Fixed bug #2685 : File::getMethodParameters() setting typeHintEndToken for vars with no type hint + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2694 : AbstractArraySniff produces invalid indices when using ternary operator + - Thanks to Michał Bundyra for the patch +- Fixed bug #2702 : Generic.WhiteSpace.ScopeIndent false positive when using ternary operator with short arrays + +## [3.5.2] - 2019-10-28 +### Changed +- Generic.ControlStructures.DisallowYodaConditions now returns less false positives + - False positives were being returned for array comparisions, or when performing some function calls +- Squiz.WhiteSpace.SemicolonSpacing.Incorrect error message now escapes newlines and tabs + - Provides a clearer error message as whitespace is now visible + - Also allows for better output for report types such as CSV and XML +- The error message for PSR12.Files.FileHeader.SpacingAfterBlock has been made clearer + - It now uses the wording from the published PSR-12 standard to indicate that blocks must be separated by a blank line + - Thanks to Craig Duncan for the patch + +### Fixed +- Fixed bug #2654 : Incorrect indentation for arguments of multiline function calls +- Fixed bug #2656 : Squiz.WhiteSpace.MemberVarSpacing removes comments before first member var during auto fixing + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2663 : Generic.NamingConventions.ConstructorName complains about old constructor in interfaces +- Fixed bug #2664 : PSR12.Files.OpenTag incorrectly identifies PHP file with only an opening tag +- Fixed bug #2665 : PSR12.Files.ImportStatement should not apply to traits +- Fixed bug #2673 : PSR12.Traits.UseDeclaration does not allow comments or blank lines between use statements + +## [3.5.1] - 2019-10-17 +### Changed +- Very very verbose diff report output has slightly changed to improve readability + - Output is printed when running PHPCS with the --report=diff and -vvv command line arguments + - Fully qualified class names have been replaced with sniff codes + - Tokens being changed now display the line number they are on +- PSR2, PSR12, and PEAR standards now correctly check for blank lines at the start of function calls + - This check has been missing from these standards, but has now been implemented + - When using the PEAR standard, the error code is PEAR.Functions.FunctionCallSignature.FirstArgumentPosition + - When using PSR2 or PSR12, the error code is PSR2.Methods.FunctionCallSignature.FirstArgumentPosition +- PSR12.ControlStructures.BooleanOperatorPlacement no longer complains when multiple expression appears on the same line + - Previously, boolean operators were enforce to appear at the start or end of lines only + - Boolean operators can now appear in the middle of the line +- PSR12.Files.FileHeader no longer ignores comments preceding a use, namespace, or declare statement +- PSR12.Files.FileHeader now allows a hashbang line at the top of the file + +### Fixed +- Fixed bug #2506 : PSR2 standard can't auto fix multi-line function call inside a string concat statement +- Fixed bug #2530 : PEAR.Commenting.FunctionComment does not support intersection types in comments +- Fixed bug #2615 : Constant visibility false positive on non-class constants +- Fixed bug #2616 : PSR12.Files.FileHeader false positive when file only contains docblock +- Fixed bug #2619 : PSR12.Files.FileHeader locks up when inline comment is the last content in a file +- Fixed bug #2621 : PSR12.Classes.AnonClassDeclaration.CloseBraceSameLine false positive for anon class passed as function argument + - Thanks to Martins Sipenko for the patch +- Fixed bug #2623 : PSR12.ControlStructures.ControlStructureSpacing not ignoring indentation inside multi-line string arguments +- Fixed bug #2624 : PSR12.Traits.UseDeclaration doesnt apply the correct indent during auto fixing +- Fixed bug #2626 : PSR12.Files.FileHeader detects @var annotations as file docblocks +- Fixed bug #2628 : PSR12.Traits.UseDeclaration does not allow comments above a USE declaration +- Fixed bug #2632 : Incorrect indentation of lines starting with "static" inside closures +- Fixed bug #2641 : PSR12.Functions.NullableTypeDeclaration false positive when using new static() + +## [3.5.0] - 2019-09-27 +### Changed +- The included PSR12 standard is now complete and ready to use + - Check your code using PSR-12 by running PHPCS with --standard=PSR12 +- Added support for PHP 7.4 typed properties + - The nullable operator is now tokenized as T_NULLABLE inside property types, as it is elsewhere + - To get the type of a member var, use the File::getMemberProperties() method, which now contains a "type" array index + - This contains the type of the member var, or a blank string if not specified + - If the type is nullable, the return type will contain the leading ? + - If a type is specified, the position of the first token in the type will be set in a "type_token" array index + - If a type is specified, the position of the last token in the type will be set in a "type_end_token" array index + - If the type is nullable, a "nullable_type" array index will also be set to TRUE + - If the type contains namespace information, it will be cleaned of whitespace and comments in the return value +- The PSR1 standard now correctly bans alternate PHP tags + - Previously, it only banned short open tags and not the pre-7.0 alternate tags +- Added support for only checking files that have been locally staged in a git repo + - Use --filter=gitstaged to check these files + - You still need to give PHPCS a list of files or directories in which to apply the filter + - Thanks to Juliette Reinders Folmer for the contribution +- JSON reports now end with a newline character +- The phpcs.xsd schema now validates phpcs-only and phpcbf-only attributes correctly + - Thanks to Juliette Reinders Folmer for the patch +- The tokenizer now correctly identifies inline control structures in more cases +- All helper methods inside the File class now throw RuntimeException instead of TokenizerException + - Some tokenizer methods were also throwing RuntimeExpection but now correctly throw TokenizerException + - Thanks to Juliette Reinders Folmer for the patch +- The File::getMethodParameters() method now returns more information, and supports closure USE groups + - If a type hint is specified, the position of the last token in the hint will be set in a "type_hint_end_token" array index + - If a default is specified, the position of the first token in the default value will be set in a "default_token" array index + - If a default is specified, the position of the equals sign will be set in a "default_equal_token" array index + - If the param is not the last, the position of the comma will be set in a "comma_token" array index + - If the param is passed by reference, the position of the reference operator will be set in a "reference_token" array index + - If the param is variable length, the position of the variadic operator will be set in a "variadic_token" array index +- The T_LIST token and it's opening and closing parentheses now contain references to each other in the tokens array + - Uses the same parenthesis_opener/closer/owner indexes as other tokens + - Thanks to Juliette Reinders Folmer for the patch +- The T_ANON_CLASS token and it's opening and closing parentheses now contain references to each other in the tokens array + - Uses the same parenthesis_opener/closer/owner indexes as other tokens + - Only applicable if the anon class is passing arguments to the constructor + - Thanks to Juliette Reinders Folmer for the patch +- The PHP 7.4 T_BAD_CHARACTER token has been made available for older versions + - Allows you to safely look for this token, but it will not appear unless checking with PHP 7.4+ +- Metrics are now available for Squiz.WhiteSpace.FunctionSpacing + - Use the "info" report to see blank lines before/after functions + - Thanks to Juliette Reinders Folmer for the patch +- Metrics are now available for Squiz.WhiteSpace.MemberVarSpacing + - Use the "info" report to see blank lines before member vars + - Thanks to Juliette Reinders Folmer for the patch +- Added Generic.ControlStructures.DisallowYodaConditions sniff + - Ban the use of Yoda conditions + - Thanks to Mponos George for the contribution +- Added Generic.PHP.RequireStrictTypes sniff + - Enforce the use of a strict types declaration in PHP files +- Added Generic.WhiteSpace.SpreadOperatorSpacingAfter sniff + - Checks whitespace between the spread operator and the variable/function call it applies to + - Thanks to Juliette Reinders Folmer for the contribution +- Added PSR12.Classes.AnonClassDeclaration sniff + - Enforces the formatting of anonymous classes +- Added PSR12.Classes.ClosingBrace sniff + - Enforces that closing braces of classes/interfaces/traits/functions are not followed by a comment or statement +- Added PSR12.ControlStructures.BooleanOperatorPlacement sniff + - Enforces that boolean operators between conditions are consistently at the start or end of the line +- Added PSR12.ControlStructures.ControlStructureSpacing sniff + - Enforces that spacing and indents are correct inside control structure parenthesis +- Added PSR12.Files.DeclareStatement sniff + - Enforces the formatting of declare statements within a file +- Added PSR12.Files.FileHeader sniff + - Enforces the order and formatting of file header blocks +- Added PSR12.Files.ImportStatement sniff + - Enforces the formatting of import statements within a file +- Added PSR12.Files.OpenTag sniff + - Enforces that the open tag is on a line by itself when used at the start of a php-only file +- Added PSR12.Functions.ReturnTypeDeclaration sniff + - Enforces the formatting of return type declarations in functions and closures +- Added PSR12.Properties.ConstantVisibility sniff + - Enforces that constants must have their visibility defined + - Uses a warning instead of an error due to this conditionally requiring the project to support PHP 7.1+ +- Added PSR12.Traits.UseDeclaration sniff + - Enforces the formatting of trait import statements within a class +- Generic.Files.LineLength ignoreComments property now ignores comments at the end of a line + - Previously, this property was incorrectly causing the sniff to ignore any line that ended with a comment + - Now, the trailing comment is not included in the line length, but the rest of the line is still checked +- Generic.Files.LineLength now only ignores unwrappable comments when the comment is on a line by itself + - Previously, a short unwrappable comment at the end of the line would have the sniff ignore the entire line +- Generic.Functions.FunctionCallArgumentSpacing no longer checks spacing around assignment operators inside function calls + - Use the Squiz.WhiteSpace.OperatorSpacing sniff to enforce spacing around assignment operators + - Note that this sniff checks spacing around all assignment operators, not just inside function calls + - The Generic.Functions.FunctionCallArgumentSpacing.NoSpaceBeforeEquals error has been removed + - use Squiz.WhiteSpace.OperatorSpacing.NoSpaceBefore instead + - The Generic.Functions.FunctionCallArgumentSpacing.NoSpaceAfterEquals error has been removed + - use Squiz.WhiteSpace.OperatorSpacing.NoSpaceAfter instead + - This also changes the PEAR/PSR2/PSR12 standards so they no longer check assignment operators inside function calls + - They were previously checking these operators when they should not have + - Thanks to Juliette Reinders Folmer for the patch +- Generic.WhiteSpace.ScopeIndent no longer performs exact indents checking for chained method calls + - Other sniffs can be used to enforce chained method call indent rules + - Thanks to Pieter Frenssen for the patch +- PEAR.WhiteSpace.ObjectOperatorIndent now supports multi-level chained statements + - When enabled, chained calls must be indented 1 level more or less than the previous line + - Set the new "multilevel" setting to TRUE in a ruleset.xml file to enable this behaviour + - Thanks to Marcos Passos for the patch +- PSR2.ControlStructures.ControlStructureSpacing now allows whitespace after the opening parenthesis if followed by a comment + - Thanks to Michał Bundyra for the patch +- PSR2.Classes.PropertyDeclaration now enforces a single space after a property type keyword + - The PSR2 standard itself excludes this new check as it is not defined in the written standard + - Using the PSR12 standard will enforce this check +- Squiz.Commenting.BlockComment no longer requires blank line before comment if it's the first content after the PHP open tag + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Functions.FunctionDeclarationArgumentSpacing now has more accurate error messages + - This includes renaming the SpaceAfterDefault error code to SpaceAfterEquals, which reflects the real error +- Squiz.Functions.FunctionDeclarationArgumentSpacing now checks for no space after a reference operator + - If you don't want this new behaviour, exclude the SpacingAfterReference error message in a ruleset.xml file +- Squiz.Functions.FunctionDeclarationArgumentSpacing now checks for no space after a variadic operator + - If you don't want this new behaviour, exclude the SpacingAfterVariadic error message in a ruleset.xml file +- Squiz.Functions.MultiLineFunctionDeclaration now has improved fixing for the FirstParamSpacing and UseFirstParamSpacing errors +- Squiz.Operators.IncrementDecrementUsage now suggests pre-increment of variables instead of post-increment + - This change does not enforce pre-increment over post-increment; only the suggestion has changed + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.PHP.DisallowMultipleAssignments now has a second error code for when assignments are found inside control structure conditions + - The new error code is Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure + - All other multiple assignment cases use the existing error code Squiz.PHP.DisallowMultipleAssignments.Found + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.FunctionSpacing now applies beforeFirst and afterLast spacing rules to nested functions + - Previously, these rules only applied to the first and last function in a class, interface, or trait + - These rules now apply to functions nested in any statement block, including other functions and conditions +- Squiz.WhiteSpace.OperatorSpacing now has improved handling of parse errors + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.OperatorSpacing now checks spacing around the instanceof operator + - Thanks to Jakub Chábek for the patch +- Squiz.WhiteSpace.OperatorSpacing can now enforce a single space before assignment operators + - Previously, the sniff this spacing as multiple assignment operators are sometimes aligned + - Now, you can set the ignoreSpacingBeforeAssignments sniff property to FALSE to enable checking + - Default remains TRUE, so spacing before assignments is not checked by default + - Thanks to Jakub Chábek for the patch + +### Fixed +- Fixed bug #2391 : Sniff-specific ignore rules inside rulesets are filtering out too many files + - Thanks to Juliette Reinders Folmer and Willington Vega for the patch +- Fixed bug #2478 : FunctionCommentThrowTag.WrongNumber when exception is thrown once but built conditionally +- Fixed bug #2479 : Generic.WhiteSpace.ScopeIndent error when using array destructing with exact indent checking +- Fixed bug #2498 : Squiz.Arrays.ArrayDeclaration.MultiLineNotAllowed autofix breaks heredoc +- Fixed bug #2502 : Generic.WhiteSpace.ScopeIndent false positives with nested switch indentation and case fall-through +- Fixed bug #2504 : Generic.WhiteSpace.ScopeIndent false positives with nested arrays and nowdoc string +- Fixed bug #2511 : PSR2 standard not checking if closing paren of single-line function declaration is on new line +- Fixed bug #2512 : Squiz.PHP.NonExecutableCode does not support alternate SWITCH control structure + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2522 : Text generator throws error when code sample line is too long + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2526 : XML report format has bad syntax on Windows + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2529 : Generic.Formatting.MultipleStatementAlignment wrong error for assign in string concat +- Fixed bug #2534 : Unresolvable installed_paths can lead to open_basedir errors + - Thanks to Oliver Nowak for the patch +- Fixed bug #2541 : Text doc generator does not allow for multi-line rule explanations + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2549 : Searching for a phpcs.xml file can throw warnings due to open_basedir restrictions + - Thanks to Matthew Peveler for the patch +- Fixed bug #2558 : PHP 7.4 throwing offset syntax with curly braces is deprecated message + - Thanks to Matthew Peveler for the patch +- Fixed bug #2561 : PHP 7.4 compatibility fix / implode argument order + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2562 : Inline WHILE triggers SpaceBeforeSemicolon incorrectly + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2565 : Generic.ControlStructures.InlineControlStructure confused by mixed short/long tags + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2566 : Author tag email validation doesn't support all TLDs + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2575 : Custom error messages don't have data replaced when cache is enabled +- Fixed bug #2601 : Squiz.WhiteSpace.FunctionSpacing incorrect fix when spacing is 0 +- Fixed bug #2608 : PSR2 throws errors for use statements when multiple namespaces are defined in a file + +## [3.4.2] - 2019-04-11 +### Changed +- Squiz.Arrays.ArrayDeclaration now has improved handling of syntax errors + +### Fixed +- Fixed an issue where the PCRE JIT on PHP 7.3 caused PHPCS to die when using the parallel option + - PHPCS now disables the PCRE JIT before running +- Fixed bug #2368 : MySource.PHP.AjaxNullComparison throws error when first function has no doc comment +- Fixed bug #2414 : Indention false positive in switch/case/if combination +- Fixed bug #2423 : Squiz.Formatting.OperatorBracket.MissingBrackets error with static +- Fixed bug #2450 : Indentation false positive when closure containing nested IF conditions used as function argument +- Fixed bug #2452 : LowercasePHPFunctions sniff failing on "new \File()" +- Fixed bug #2453 : Squiz.CSS.SemicolonSpacingSniff false positive when style name proceeded by an asterisk + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2464 : Fixer conflict between Generic.WhiteSpace.ScopeIndent and Squiz.WhiteSpace.ScopeClosingBrace when class indented 1 space +- Fixed bug #2465 : Excluding a sniff by path is not working +- Fixed bug #2467 : PHP open/close tags inside CSS files are replaced with internal PHPCS token strings when auto fixing + +## [3.4.1] - 2019-03-19 +### Changed +- The PEAR installable version of PHPCS was missing some files, which have been re-included in this release + - The code report was not previously available for PEAR installs + - The Generic.Formatting.SpaceBeforeCast sniff was not previously available for PEAR installs + - The Generic.WhiteSpace.LanguageConstructSpacing sniff was not previously available for PEAR installs + - Thanks to Juliette Reinders Folmer for the patch +- PHPCS will now refuse to run if any of the required PHP extensions are not loaded + - Previously, PHPCS only relied on requirements being checked by PEAR and Composer + - Thanks to Juliette Reinders Folmer for the patch +- Ruleset XML parsing errors are now displayed in a readable format so they are easier to correct + - Thanks to Juliette Reinders Folmer for the patch +- The PSR2 standard no longer throws duplicate errors for spacing around FOR loop parentheses + - Thanks to Juliette Reinders Folmer for the patch +- T_PHPCS_SET tokens now contain sniffCode, sniffProperty, and sniffPropertyValue indexes + - Sniffs can use this information instead of having to parse the token content manually +- Added more guard code for syntax errors to various CSS sniffs + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Commenting.DocComment error messages now contain the name of the comment tag that caused the error + - Thanks to Juliette Reinders Folmer for the patch +- Generic.ControlStructures.InlineControlStructure now handles syntax errors correctly + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Debug.JSHint now longer requires rhino and can be run directly from the npm install + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Files.LineEndings no longer adds superfluous new line at the end of JS and CSS files + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Formatting.DisallowMultipleStatements no longer tries fix lines containing phpcs:ignore statements + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Functions.FunctionCallArgumentSpacing now has improved performance and anonymous class support + - Thanks to Juliette Reinders Folmer for the patch +- Generic.WhiteSpace.ScopeIndent now respects changes to the "exact" property using phpcs:set mid-way through a file + - This allows you change the "exact" rule for only some parts of a file +- Generic.WhiteSpace.ScopeIndent now disables exact indent checking inside all arrays + - Previously, this was only done when using long array syntax, but it now works for short array syntax as well +- PEAR.Classes.ClassDeclaration now has improved handling of PHPCS annotations and tab indents +- PSR12.Classes.ClassInstantiation has changed it's error code from MissingParenthesis to MissingParentheses +- PSR12.Keywords.ShortFormTypeKeywords now ignores all spacing inside type casts during both checking and fixing + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Classes.LowercaseClassKeywords now examines the class keyword for anonymous classes + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.ControlStructures.ControlSignature now has improved handling of parse errors + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.PostStatementComment fixer no longer adds a blank line at the start of a JS file that begins with a comment + - Fixes a conflict between this sniff and the Squiz.WhiteSpace.SuperfluousWhitespace sniff + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.PostStatementComment now ignores comments inside control structure conditions, such as FOR loops + - Fixes a conflict between this sniff and the Squiz.ControlStructures.ForLoopDeclaration sniff + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.FunctionCommentThrowTag now has improved support for unknown exception types and namespaces + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.ControlStructures.ForLoopDeclaration has improved whitespace, closure, and empty expression support + - The SpacingAfterSecondNoThird error code has been removed as part of these fixes + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.CSS.ClassDefinitionOpeningBraceSpace now handles comments and indentation correctly + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.CSS.ClassDefinitionClosingBrace now handles comments, indentation, and multiple statements on the same line correctly + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.CSS.Opacity now handles comments correctly + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.CSS.SemicolonSpacing now handles comments and syntax errors correctly + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.NamingConventions.ValidVariableName now supports variables inside anonymous classes correctly + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.PHP.LowercasePHPFunctions now handles use statements, namespaces, and comments correctly + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.FunctionSpacing now fixes function spacing correctly when a function is the first content in a file + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.SuperfluousWhitespace no longer throws errors for spacing between functions and properties in anon classes + - Thanks to Juliette Reinders Folmer for the patch +- Zend.Files.ClosingTag no longer adds a semi-colon during fixing of a file that only contains a comment + - Thanks to Juliette Reinders Folmer for the patch +- Zend.NamingConventions.ValidVariableName now supports variables inside anonymous classes correctly + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Fixed bug #2298 : PSR2.Classes.ClassDeclaration allows extended class on new line + - Thanks to Michał Bundyra for the patch +- Fixed bug #2337 : Generic.WhiteSpace.ScopeIndent incorrect error when multi-line function call starts on same line as open tag +- Fixed bug #2348 : Cache not invalidated when changing a ruleset included by another +- Fixed bug #2376 : Using __halt_compiler() breaks Generic.PHP.ForbiddenFunctions unless it's last in the function list + - Thanks to Sijun Zhu for the patch +- Fixed bug #2393 : The gitmodified filter will infinitely loop when encountering deleted file paths + - Thanks to Lucas Manzke for the patch +- Fixed bug #2396 : Generic.WhiteSpace.ScopeIndent incorrect error when multi-line IF condition mixed with HTML +- Fixed bug #2431 : Use function/const not tokenized as T_STRING when preceded by comment + +## [3.4.0] - 2018-12-20 +### Deprecated +- The Generic.Formatting.NoSpaceAfterCast sniff has been deprecated and will be removed in version 4 + - The functionality of this sniff is now available in the Generic.Formatting.SpaceAfterCast sniff + - Include the Generic.Formatting.SpaceAfterCast sniff and set the "spacing" property to "0" + - As soon as possible, replace all instances of the old sniff code with the new sniff code and property setting + - The existing sniff will continue to work until version 4 has been released + +### Changed +- Rule include patterns in a ruleset.xml file are now evaluated as OR instead of AND + - Previously, a file had to match every include pattern and no exclude patterns to be included + - Now, a file must match at least one include pattern and no exclude patterns to be included + - This is a bug fix as include patterns are already documented to work this way +- New token T_BITWISE_NOT added for the bitwise not operator + - This token was previously tokenized as T_NONE + - Any sniffs specifically looking for T_NONE tokens with a tilde as the contents must now also look for T_BITWISE_NOT + - Sniffs can continue looking for T_NONE as well as T_BITWISE_NOT to support older PHP_CodeSniffer versions +- All types of binary casting are now tokenized as T_BINARY_CAST + - Previously, the 'b' in 'b"some string with $var"' would be a T_BINARY_CAST, but only when the string contained a var + - This change ensures the 'b' is always tokenized as T_BINARY_CAST + - This change also converts '(binary)' from T_STRING_CAST to T_BINARY_CAST + - Thanks to Juliette Reinders Folmer for the help with this patch +- Array properties set inside a ruleset.xml file can now extend a previous value instead of always overwriting it + - e.g., if you include a ruleset that defines forbidden functions, can you now add to that list instead of having to redefine it + - To use this feature, add extends="true" to the property tag + - e.g., property name="forbiddenFunctionNames" type="array" extend="true" + - Thanks to Michael Moravec for the patch +- If $XDG_CACHE_HOME is set and points to a valid directory, it will be used for caching instead of the system temp directory +- PHPCBF now disables parallel running if you are passing content on STDIN + - Stops an error from being shown after the fixed output is printed +- The progress report now shows files with tokenizer errors as skipped (S) instead of a warning (W) + - The tokenizer error is still displayed in reports as normal + - Thanks to Juliette Reinders Folmer for the patch +- The Squiz standard now ensures there is no space between an increment/decrement operator and its variable +- The File::getMethodProperties() method now includes a has_body array index in the return value + - FALSE if the method has no body (as with abstract and interface methods) or TRUE otherwise + - Thanks to Chris Wilkinson for the patch +- The File::getTokensAsString() method now throws an exception if the $start param is invalid + - If the $length param is invalid, an empty string will be returned + - Stops an infinite loop when the function is passed invalid data + - Thanks to Juliette Reinders Folmer for the patch +- Added new Generic.CodeAnalysis.EmptyPHPStatement sniff + - Warns when it finds empty PHP open/close tag combinations or superfluous semicolons + - Thanks to Juliette Reinders Folmer for the contribution +- Added new Generic.Formatting.SpaceBeforeCast sniff + - Ensures there is exactly 1 space before a type cast, unless the cast statement is indented or multi-line + - Thanks to Juliette Reinders Folmer for the contribution +- Added new Generic.VersionControl.GitMergeConflict sniff + - Detects merge conflict artifacts left in files + - Thanks to Juliette Reinders Folmer for the contribution +- Added Generic.WhiteSpace.IncrementDecrementSpacing sniff + - Ensures there is no space between the operator and the variable it applies to + - Thanks to Juliette Reinders Folmer for the contribution +- Added PSR12.Functions.NullableTypeDeclaration sniff + - Ensures there is no space after the question mark in a nullable type declaration + - Thanks to Timo Schinkel for the contribution +- A number of sniffs have improved support for methods in anonymous classes + - These sniffs would often throw the same error twice for functions in nested classes + - Error messages have also been changed to be less confusing + - The full list of affected sniffs is: + - Generic.NamingConventions.CamelCapsFunctionName + - PEAR.NamingConventions.ValidFunctionName + - PSR1.Methods.CamelCapsMethodName + - PSR2.Methods.MethodDeclaration + - Squiz.Scope.MethodScope + - Squiz.Scope.StaticThisUsage + - Thanks to Juliette Reinders Folmer for the patch +- Generic.CodeAnalysis.UnusedFunctionParameter now only skips functions with empty bodies when the class implements an interface + - Thanks to Juliette Reinders Folmer for the patch +- Generic.CodeAnalysis.UnusedFunctionParameter now has additional error codes to indicate where unused params were found + - The new error code prefixes are: + - FoundInExtendedClass: when the class extends another + - FoundInImplementedInterface: when the class implements an interface + - Found: used in all other cases, including closures + - The new error code suffixes are: + - BeforeLastUsed: the unused param was positioned before the last used param in the function signature + - AfterLastUsed: the unused param was positioned after the last used param in the function signature + - This makes the new error code list for this sniff: + - Found + - FoundBeforeLastUsed + - FoundAfterLastUsed + - FoundInExtendedClass + - FoundInExtendedClassBeforeLastUsed + - FoundInExtendedClassAfterLastUsed + - FoundInImplementedInterface + - FoundInImplementedInterfaceBeforeLastUsed + - FoundInImplementedInterfaceAfterLastUsed + - These errors code make it easier for specific cases to be ignored or promoted using a ruleset.xml file + - Thanks to Juliette Reinders Folmer for the contribution +- Generic.Classes.DuplicateClassName now inspects traits for duplicate names as well as classes and interfaces + - Thanks to Chris Wilkinson for the patch +- Generic.Files.InlineHTML now ignores a BOM at the start of the file + - Thanks to Chris Wilkinson for the patch +- Generic.PHP.CharacterBeforePHPOpeningTag now ignores a BOM at the start of the file + - Thanks to Chris Wilkinson for the patch +- Generic.Formatting.SpaceAfterCast now has a setting to specify how many spaces are required after a type cast + - Default remains 1 + - Override the "spacing" setting in a ruleset.xml file to change + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Formatting.SpaceAfterCast now has a setting to ignore newline characters after a type cast + - Default remains FALSE, so newlines are not allowed + - Override the "ignoreNewlines" setting in a ruleset.xml file to change + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Formatting.SpaceAfterNot now has a setting to specify how many spaces are required after a NOT operator + - Default remains 1 + - Override the "spacing" setting in a ruleset.xml file to change + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Formatting.SpaceAfterNot now has a setting to ignore newline characters after the NOT operator + - Default remains FALSE, so newlines are not allowed + - Override the "ignoreNewlines" setting in a ruleset.xml file to change + - Thanks to Juliette Reinders Folmer for the patch +- PEAR.Functions.FunctionDeclaration now checks spacing before the opening parenthesis of functions with no body + - Thanks to Chris Wilkinson for the patch +- PEAR.Functions.FunctionDeclaration now enforces no space before the semicolon in functions with no body + - Thanks to Chris Wilkinson for the patch +- PSR2.Classes.PropertyDeclaration now checks the order of property modifier keywords + - This is a rule that is documented in PSR-2 but was not enforced by the included PSR2 standard until now + - This sniff is also able to fix the order of the modifier keywords if they are incorrect + - Thanks to Juliette Reinders Folmer for the patch +- PSR2.Methods.MethodDeclaration now checks method declarations inside traits + - Thanks to Chris Wilkinson for the patch +- Squiz.Commenting.InlineComment now has better detection of comment block boundaries +- Squiz.Classes.ClassFileName now checks that a trait name matches the filename + - Thanks to Chris Wilkinson for the patch +- Squiz.Classes.SelfMemberReference now supports scoped declarations and anonymous classes + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Classes.SelfMemberReference now fixes multiple errors at once, increasing fixer performance + - Thanks to Gabriel Ostrolucký for the patch +- Squiz.Functions.LowercaseFunctionKeywords now checks abstract and final prefixes, and auto-fixes errors + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Objects.ObjectMemberComma.Missing has been renamed to Squiz.Objects.ObjectMemberComma.Found + - The error is thrown when the comma is found but not required, so the error code was incorrect + - If you are referencing the old error code in a ruleset XML file, please use the new code instead + - If you wish to maintain backwards compatibility, you can provide rules for both the old and new codes + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.ObjectOperatorSpacing is now more tolerant of parse errors +- Squiz.WhiteSpace.ObjectOperatorSpacing now fixes errors more efficiently + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Fixed bug #2109 : Generic.Functions.CallTimePassByReference false positive for bitwise and used in function argument +- Fixed bug #2165 : Conflict between Squiz.Arrays.ArrayDeclaration and ScopeIndent sniffs when heredoc used in array +- Fixed bug #2167 : Generic.WhiteSpace.ScopeIndent shows invalid error when scope opener indented inside inline HTML +- Fixed bug #2178 : Generic.NamingConventions.ConstructorName matches methods in anon classes with same name as containing class + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2190 : PEAR.Functions.FunctionCallSignature incorrect error when encountering trailing PHPCS annotation + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2194 : Generic.Whitespace.LanguageConstructSpacing should not be checking namespace operators + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2202 : Squiz.WhiteSpace.OperatorSpacing throws error for negative index when using curly braces for string access + - Same issue fixed in Squiz.Formatting.OperatorBracket + - Thanks to Andreas Buchenrieder for the patch +- Fixed bug #2210 : Generic.NamingConventions.CamelCapsFunctionName not ignoring SoapClient __getCookies() method + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2211 : PSR2.Methods.MethodDeclaration gets confused over comments between modifier keywords + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2212 : FUNCTION and CONST in use groups being tokenised as T_FUNCTION and T_CONST + - Thanks to Chris Wilkinson for the patch +- Fixed bug #2214 : File::getMemberProperties() is recognizing method params as properties + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2236 : Memory info measurement unit is Mb but probably should be MB +- Fixed bug #2246 : CSS tokenizer does not tokenize class names correctly when they contain the string NEW + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2278 : Squiz.Operators.ComparisonOperatorUsage false positive when inline IF contained in parentheses + - Thanks to Arnout Boks for the patch +- Fixed bug #2284 : Squiz.Functions.FunctionDeclarationArgumentSpacing removing type hint during fixing + - Thanks to Michał Bundyra for the patch +- Fixed bug #2297 : Anonymous class not tokenized correctly when used as argument to another anon class + - Thanks to Michał Bundyra for the patch + +## [2.9.2] - 2018-11-08 +### Changed +- PHPCS should now run under PHP 7.3 without deprecation warnings + - Thanks to Nick Wilde for the patch + +### Fixed +- Fixed bug #1496 : Squiz.Strings.DoubleQuoteUsage not unescaping dollar sign when fixing + - Thanks to Michał Bundyra for the patch +- Fixed bug #1549 : Squiz.PHP.EmbeddedPhp fixer conflict with // comment before PHP close tag + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1890 : Incorrect Squiz.WhiteSpace.ControlStructureSpacing.NoLineAfterClose error between catch and finally statements + +## [3.3.2] - 2018-09-24 +### Changed +- Fixed a problem where the report cache was not being cleared when the sniffs inside a standard were updated +- The info report (--report=info) now has improved formatting for metrics that span multiple lines + - Thanks to Juliette Reinders Folmer for the patch +- The unit test runner now skips .bak files when looking for test cases + - Thanks to Juliette Reinders Folmer for the patch +- The Squiz standard now ensures underscores are not used to indicate visibility of private members vars and methods + - Previously, this standard enforced the use of underscores +- Generic.PHP.NoSilencedErrors error messages now contain a code snippet to show the context of the error + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Arrays.ArrayDeclaration no longer reports errors for a comma on a line new after a here/nowdoc + - Also stops a parse error being generated when auto-fixing + - The SpaceBeforeComma error message has been changed to only have one data value instead of two +- Squiz.Commenting.FunctionComment no longer errors when trying to fix indents of multi-line param comments +- Squiz.Formatting.OperatorBracket now correctly fixes statements that contain strings +- Squiz.PHP.CommentedOutCode now ignores more @-style annotations and includes better comment block detection + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Fixed a problem where referencing a relative file path in a ruleset XML file could add unnecessary sniff exclusions + - This didn't actually exclude anything, but caused verbose output to list strange exclusion rules +- Fixed bug #2110 : Squiz.WhiteSpace.FunctionSpacing is removing indents from the start of functions when fixing + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2115 : Squiz.Commenting.VariableComment not checking var types when the @var line contains a comment +- Fixed bug #2120 : Tokenizer fails to match T_INLINE_ELSE when used after function call containing closure +- Fixed bug #2121 : Squiz.PHP.DisallowMultipleAssignments false positive in while loop conditions + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2127 : File::findExtendedClassName() doesn't support nested classes + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2138 : Tokenizer detects wrong token for php ::class feature with spaces +- Fixed bug #2143 : PSR2.Namespaces.UseDeclaration does not properly fix "use function" and "use const" statements + - Thanks to Chris Wilkinson for the patch +- Fixed bug #2144 : Squiz.Arrays.ArrayDeclaration does incorrect align calculation in array with cyrillic keys +- Fixed bug #2146 : Zend.Files.ClosingTag removes closing tag from end of file without inserting a semicolon +- Fixed bug #2151 : XML schema not updated with the new array property syntax + +## [3.3.1] - 2018-07-27 +### Removed +- Support for HHVM has been dropped due to recent unfixed bugs and HHVM refocus on Hack only + - Thanks to Walt Sorensen and Juliette Reinders Folmer for helping to remove all HHVM exceptions from the core + +### Changed +- The full report (the default report) now has improved word wrapping for multi-line messages and sniff codes + - Thanks to Juliette Reinders Folmer for the patch +- The summary report now sorts files based on their directory location instead of just a basic string sort + - Thanks to Juliette Reinders Folmer for the patch +- The source report now orders error codes by name when they have the same number of errors + - Thanks to Juliette Reinders Folmer for the patch +- The junit report no longer generates validation errors with the Jenkins xUnit plugin + - Thanks to Nikolay Geo for the patch +- Generic.Commenting.DocComment no longer generates the SpacingBeforeTags error if tags are the first content in the docblock + - The sniff will still generate a MissingShort error if there is no short comment + - This allows the MissingShort error to be suppressed in a ruleset to make short descriptions optional +- Generic.Functions.FunctionCallArgumentSpacing now properly fixes multi-line function calls with leading commas + - Previously, newlines between function arguments would be removed + - Thanks to Juliette Reinders Folmer for the patch +- Generic.PHP.Syntax will now use PHP_BINARY instead of trying to discover the executable path + - This ensures that the sniff will always syntax check files using the PHP version that PHPCS is running under + - Setting the php_path config var will still override this value as normal + - Thanks to Willem Stuursma-Ruwen for the patch +- PSR2.Namespaces.UseDeclaration now supports commas at the end of group use declarations + - Also improves checking and fixing for use statements containing parse errors + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Arrays.ArrayDeclaration no longer removes the array opening brace while fixing + - This could occur when the opening brace was on a new line and the first array key directly followed + - This change also stops the KeyNotAligned error message being incorrectly reported in these cases +- Squiz.Arrays.ArrayDeclaration no longer tries to change multi-line arrays to single line when they contain comments + - Fixes a conflict between this sniff and some indentation sniffs +- Squiz.Classes.ClassDeclaration no longer enforces spacing rules when a class is followed by a function + - Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff +- The Squiz.Classes.ValidClassName.NotCamelCaps message now references PascalCase instead of CamelCase + - The "CamelCase class name" metric produced by the sniff has been changed to "PascalCase class name" + - This reflects the fact that the class name check is actually a Pascal Case check and not really Camel Case + - Thanks to Tom H Anderson for the patch +- Squiz.Commenting.InlineComment no longer enforces spacing rules when an inline comment is followed by a docblock + - Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff +- Squiz.WhiteSpace.OperatorSpacing no longer tries to fix operator spacing if the next content is a comment on a new line + - Fixes a conflict between this sniff and the Squiz.Commenting.PostStatementComment sniff + - Also stops PHPCS annotations from being moved to a different line, potentially changing their meaning + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.FunctionSpacing no longer checks spacing of functions at the top of an embedded PHP block + - Fixes a conflict between this sniff and the Squiz.PHP.EmbeddedPHP sniff + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.MemberVarSpacing no longer checks spacing before member vars that come directly after methods + - Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff +- Squiz.WhiteSpace.SuperfluousWhitespace now recognizes unicode whitespace at the start and end of a file + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Fixed bug #2029 : Squiz.Scope.MemberVarScope throws fatal error when a property is found in an interface + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2047 : PSR12.Classes.ClassInstantiation false positive when instantiating class from array index +- Fixed bug #2048 : GenericFormatting.MultipleStatementAlignment false positive when assigning values inside an array +- Fixed bug #2053 : PSR12.Classes.ClassInstantiation incorrectly fix when using member vars and some variable formats +- Fixed bug #2065 : Generic.ControlStructures.InlineControlStructure fixing fails when inline control structure contains closure +- Fixed bug #2072 : Squiz.Arrays.ArrayDeclaration throws NoComma error when array value is a shorthand IF statement +- Fixed bug #2082 : File with "defined() or define()" syntax triggers PSR1.Files.SideEffects.FoundWithSymbols +- Fixed bug #2095 : PSR2.Namespaces.NamespaceDeclaration does not handle namespaces defined over multiple lines + +## [3.3.0] - 2018-06-07 +### Deprecated +- The Squiz.WhiteSpace.LanguageConstructSpacing sniff has been deprecated and will be removed in version 4 + - The sniff has been moved to the Generic standard, with a new code of Generic.WhiteSpace.LanguageConstructSpacing + - As soon as possible, replace all instances of the old sniff code with the new sniff code in your ruleset.xml files + - The existing Squiz sniff will continue to work until version 4 has been released + - The new Generic sniff now also checks many more language constructs to enforce additional spacing rules + - Thanks to Mponos George for the contribution +- The current method for setting array properties in ruleset files has been deprecated and will be removed in version 4 + - Currently, setting an array value uses the string syntax "print=>echo,create_function=>null" + - Now, individual array elements are specified using a new "element" tag with "key" and "value" attributes + - For example, element key="print" value="echo" + - Thanks to Michał Bundyra for the patch +- The T_ARRAY_HINT token has been deprecated and will be removed in version 4 + - The token was used to ensure array type hints were not tokenized as T_ARRAY, but no other type hints were given a special token + - Array type hints now use the standard T_STRING token instead + - Sniffs referencing this token type will continue to run without error until version 4, but will not find any T_ARRAY_HINT tokens +- The T_RETURN_TYPE token has been deprecated and will be removed in version 4 + - The token was used to ensure array/self/parent/callable return types were tokenized consistently + - For namespaced return types, only the last part of the string (the class name) was tokenized as T_RETURN_TYPE + - This was not consistent and so return types are now left using their original token types so they are not skipped by sniffs + - The exception are array return types, which are tokenized as T_STRING instead of T_ARRAY, as they are for type hints + - Sniffs referencing this token type will continue to run without error until version 4, but will not find any T_RETUTN_TYPE tokens + - To get the return type of a function, use the File::getMethodProperties() method, which now contains a "return_type" array index + - This contains the return type of the function or closer, or a blank string if not specified + - If the return type is nullable, the return type will contain the leading ? + - A nullable_return_type array index in the return value will also be set to true + - If the return type contains namespace information, it will be cleaned of whitespace and comments + - To access the original return value string, use the main tokens array + +### Added +- This release contains an incomplete version of the PSR-12 coding standard + - Errors found using this standard should be valid, but it will miss a lot of violations until it is complete + - If you'd like to test and help, you can use the standard by running PHPCS with --standard=PSR12 + +### Changed +- Config values set using --runtime-set now override any config values set in rulesets or the CodeSniffer.conf file +- You can now apply include-pattern rules to individual message codes in a ruleset like you can with exclude-pattern rules + - Previously, include-pattern rules only applied to entire sniffs + - If a message code has both include and exclude patterns, the exclude patterns will be ignored +- Using PHPCS annotations to selectively re-enable sniffs is now more flexible + - Previously, you could only re-enable a sniff/category/standard using the exact same code that was disabled + - Now, you can disable a standard and only re-enable a specific category or sniff + - Or, you can disable a specific sniff and have it re-enable when you re-enable the category or standard +- The value of array sniff properties can now be set using phpcs:set annotations + - e.g., phpcs:set Standard.Category.SniffName property[] key=>value,key2=>value2 + - Thanks to Michał Bundyra for the patch +- PHPCS annotations now remain as T_PHPCS_* tokens instead of reverting to comment tokens when --ignore-annotations is used + - This stops sniffs (especially commenting sniffs) from generating a large number of false errors when ignoring + - Any custom sniffs that are using the T_PHPCS_* tokens to detect annotations may need to be changed to ignore them + - Check $phpcsFile->config->annotations to see if annotations are enabled and ignore when false +- You can now use fully or partially qualified class names for custom reports instead of absolute file paths + - To support this, you must specify an autoload file in your ruleset.xml file and use it to register an autoloader + - Your autoloader will need to load your custom report class when requested + - Thanks to Juliette Reinders Folmer for the patch +- The JSON report format now does escaping in error source codes as well as error messages + - Thanks to Martin Vasel for the patch +- Invalid installed_paths values are now ignored instead of causing a fatal error +- Improved testability of custom rulesets by allowing the installed standards to be overridden + - Thanks to Timo Schinkel for the patch +- The key used for caching PHPCS runs now includes all set config values + - This fixes a problem where changing config values (e.g., via --runtime-set) used an incorrect cache file +- The "Function opening brace placement" metric has been separated into function and closure metrics in the info report + - Closures are no longer included in the "Function opening brace placement" metric + - A new "Closure opening brace placement" metric now shows information for closures +- Multi-line T_YIELD_FROM statements are now replicated properly for older PHP versions +- The PSR2 standard no longer produces 2 error messages when the AS keyword in a foreach loop is not lowercase +- Specifying a path to a non-existent dir when using the --report-[reportType]=/path/to/report CLI option no longer throws an exception + - This now prints a readable error message, as it does when using --report-file +- The File::getMethodParamaters() method now includes a type_hint_token array index in the return value + - Provides the position in the token stack of the first token in the type hint +- The File::getMethodProperties() method now includes a return_type_token array index in the return value + - Provides the position in the token stack of the first token in the return type +- The File::getTokensAsString() method can now optionally return original (non tab-replaced) content + - Thanks to Juliette Reinders Folmer for the patch +- Removed Squiz.PHP.DisallowObEndFlush from the Squiz standard + - If you use this sniff and want to continue banning ob_end_flush(), use Generic.PHP.ForbiddenFunctions instead + - You will need to set the forbiddenFunctions property in your ruleset.xml file +- Removed Squiz.PHP.ForbiddenFunctions from the Squiz standard + - Replaced by using the forbiddenFunctions property of Generic.PHP.ForbiddenFunctions in the Squiz ruleset.xml + - Functionality of the Squiz standard remains the same, but the error codes are now different + - Previously, Squiz.PHP.ForbiddenFunctions.Found and Squiz.PHP.ForbiddenFunctions.FoundWithAlternative + - Now, Generic.PHP.ForbiddenFunctions.Found and Generic.PHP.ForbiddenFunctions.FoundWithAlternative +- Added new Generic.PHP.LowerCaseType sniff + - Ensures PHP types used for type hints, return types, and type casting are lowercase + - Thanks to Juliette Reinders Folmer for the contribution +- Added new Generic.WhiteSpace.ArbitraryParenthesesSpacing sniff + - Generates an error for whitespace inside parenthesis that don't belong to a function call/declaration or control structure + - Generates a warning for any empty parenthesis found + - Allows the required spacing to be set using the spacing sniff property (default is 0) + - Allows newlines to be used by setting the ignoreNewlines sniff property (default is false) + - Thanks to Juliette Reinders Folmer for the contribution +- Added new PSR12.Classes.ClassInstantiation sniff + - Ensures parenthesis are used when instantiating a new class +- Added new PSR12.Keywords.ShortFormTypeKeywords sniff + - Ensures the short form of PHP types is used when type casting +- Added new PSR12.Namespaces.CompundNamespaceDepth sniff + - Ensures compound namespace use statements have a max depth of 2 levels + - The max depth can be changed by setting the 'maxDepth' sniff property in a ruleset.xml file +- Added new PSR12.Operators.OperatorSpacing sniff + - Ensures operators are preceded and followed by at least 1 space +- Improved core support for grouped property declarations + - Also improves support in Squiz.WhiteSpace.ScopeKeywordSpacing and Squiz.WhiteSpace.MemberVarSpacing + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Commenting.DocComment now produces a NonParamGroup error when tags are mixed in with the @param tag group + - It would previously throw either a NonParamGroup or ParamGroup error depending on the order of tags + - This change allows the NonParamGroup error to be suppressed in a ruleset to allow the @param group to contain other tags + - Thanks to Phil Davis for the patch +- Generic.Commenting.DocComment now continues checks param tags even if the doc comment short description is missing + - This change allows the MissingShort error to be suppressed in a ruleset without all other errors being suppressed as well + - Thanks to Phil Davis for the patch +- Generic.CodeAnalysis.AssignmentInCondition now reports a different error code for assignments found in WHILE conditions + - The return value of a function call is often assigned in a WHILE condition, so this change makes it easier to exclude these cases + - The new code for this error message is Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition + - The error code for all other cases remains as Generic.CodeAnalysis.AssignmentInCondition.Found + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Functions.OpeningFunctionBraceBsdAllman now longer leaves trailing whitespace when moving the opening brace during fixing + - Also applies to fixes made by PEAR.Functions.FunctionDeclaration and Squiz.Functions.MultiLineFunctionDeclaration +- Generic.WhiteSpace.ScopeIndent now does a better job of fixing the indent of multi-line comments +- Generic.WhiteSpace.ScopeIndent now does a better job of fixing the indent of PHP open and close tags +- PEAR.Commenting.FunctionComment now report a different error code for param comment lines with too much padding + - Previously, any lines of a param comment that don't start at the exact comment position got the same error code + - Now, only comment lines with too little padding use ParamCommentAlignment as they are clearly mistakes + - Comment lines with too much padding may be using precision alignment as now use ParamCommentAlignmentExceeded + - This allows for excessive padding to be excluded from a ruleset while continuing to enforce a minimum padding +- PEAR.WhiteSpace.ObjectOperatorIndent now checks the indent of more chained operators + - Previously, it only checked chains beginning with a variable + - Now, it checks chains beginning with function calls, static class names, etc +- Squiz.Arrays.ArrayDeclaration now continues checking array formatting even if the key indent is not correct + - Allows for using different array indent rules while still checking/fixing double arrow and value alignment +- Squiz.Commenting.BlockComment has improved support for tab-indented comments + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.BlockComment auto fixing no longer breaks when two block comments follow each other + - Also stopped single-line block comments from being auto fixed when they are embedded in other code + - Also fixed as issue found when PHPCS annotations were used inside a block comment + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.BlockComment.LastLineIndent is now able to be fixed with phpcbf + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.BlockComment now aligns star-prefixed lines under the opening tag while fixing, instead of indenting them + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.FunctionComment.IncorrectTypeHint message no longer contains cut-off suggested type hints +- Squiz.Commenting.InlineComment now uses a new error code for inline comments at the end of a function + - Previously, all inline comments followed by a blank line threw a Squiz.Commenting.InlineComment.SpacingAfter error + - Now, inline comments at the end of a function will instead throw Squiz.Commenting.InlineComment.SpacingAfterAtFunctionEnd + - If you previously excluded SpacingAfter, add an exclusion for SpacingAfterAtFunctionEnd to your ruleset as well + - If you previously only included SpacingAfter, consider including SpacingAfterAtFunctionEnd as well + - The Squiz standard now excludes SpacingAfterAtFunctionEnd as the blank line is checked elsewhere + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.ControlStructures.ControlSignature now errors when a comment follows the closing brace of an earlier body + - Applies to catch, finally, else, elseif, and do/while structures + - The included PSR2 standard now enforces this rule + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Formatting.OperatorBracket.MissingBrackets message has been changed to remove the word "arithmetic" + - The sniff checks more than just arithmetic operators, so the message is now clearer +- Sniffs.Operators.ComparisonOperatorUsage now detects more cases of implicit true comparisons + - It could previously be confused by comparisons used as function arguments +- Squiz.PHP.CommentedOutCode now ignores simple @-style annotation comments so they are not flagged as commented out code + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.PHP.CommentedOutCode now ignores a greater number of short comments so they are not flagged as commented out code + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.PHP.DisallowComparisonAssignment no longer errors when using the null coalescing operator + - Given this operator is used almost exclusively to assign values, it didn't make sense to generate an error +- Squiz.WhiteSpacing.FunctionSpacing now has a property to specify how many blank lines should be before the first class method + - Only applies when a method is the first code block in a class (i.e., there are no member vars before it) + - Override the 'spacingBeforeFirst' property in a ruleset.xml file to change + - If not set, the sniff will use whatever value is set for the existing 'spacing' property +- Squiz.WhiteSpacing.FunctionSpacing now has a property to specify how many blank lines should be after the last class method + - Only applies when a method is the last code block in a class (i.e., there are no member vars after it) + - Override the 'spacingAfterLast' property in a ruleset.xml file to change + - If not set, the sniff will use whatever value is set for the existing 'spacing' property + +### Fixed +- Fixed bug #1863 : File::findEndOfStatement() not working when passed a scope opener +- Fixed bug #1876 : PSR2.Namespaces.UseDeclaration not giving error for use statements before the namespace declaration + - Adds a new PSR2.Namespaces.UseDeclaration.UseBeforeNamespace error message +- Fixed bug #1881 : Generic.Arrays.ArrayIndent is indenting sub-arrays incorrectly when comma not used after the last value +- Fixed bug #1882 : Conditional with missing braces confused by indirect variables +- Fixed bug #1915 : JS tokenizer fails to tokenize regular expression proceeded by boolean not operator +- Fixed bug #1920 : Directory exclude pattern improperly excludes files with names that start the same + - Thanks to Jeff Puckett for the patch +- Fixed bug #1922 : Equal sign alignment check broken when list syntax used before assignment operator +- Fixed bug #1925 : Generic.Formatting.MultipleStatementAlignment skipping assignments within closures +- Fixed bug #1931 : Generic opening brace placement sniffs do not correctly support function return types +- Fixed bug #1932 : Generic.ControlStructures.InlineControlStructure fixer moves new PHPCS annotations +- Fixed bug #1938 : Generic opening brace placement sniffs incorrectly move PHPCS annotations + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1939 : phpcs:set annotations do not cause the line they are on to be ignored + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1949 : Squiz.PHP.DisallowMultipleAssignments false positive when using namespaces with static assignments +- Fixed bug #1959 : SquizMultiLineFunctionDeclaration error when param has trailing comment + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1963 : Squiz.Scope.MemberVarScope does not work for multiline member declaration + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1971 : Short array list syntax not correctly tokenized if short array is the first content in a file +- Fixed bug #1979 : Tokenizer does not change heredoc to nowdoc token if the start tag contains spaces +- Fixed bug #1982 : Squiz.Arrays.ArrayDeclaration fixer sometimes puts a comma in front of the last array value +- Fixed bug #1993 : PSR1/PSR2 not reporting or fixing short open tags +- Fixed bug #1996 : Custom report paths don't work on case-sensitive filesystems +- Fixed bug #2006 : Squiz.Functions.FunctionDeclarationArgumentSpacing fixer removes comment between parens when no args + - The SpacingAfterOpenHint error message has been removed + - It is replaced by the the existing SpacingAfterOpen message + - The error message format for the SpacingAfterOpen and SpacingBeforeClose messages has been changed + - These used to contain 3 pieces of data, but now only contain 2 + - If you have customised the error messages of this sniff, please review your ruleset after upgrading +- Fixed bug #2018 : Generic.Formatting.MultipleStatementAlignment does see PHP close tag as end of statement block + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #2027 : PEAR.NamingConventions.ValidFunctionName error when function name includes double underscore + - Thanks to Juliette Reinders Folmer for the patch + +## [3.2.3] - 2018-02-21 +### Changed +- The new phpcs: comment syntax can now be prefixed with an at symbol ( @phpcs: ) + - This restores the behaviour of the previous syntax where these comments are ignored by doc generators +- The current PHP version ID is now used to generate cache files + - This ensures that only cache files generated by the current PHP version are selected + - This change fixes caching issues when using sniffs that produce errors based on the current PHP version +- A new Tokens::$phpcsCommentTokens array is now available for sniff developers to detect phpcs: comment syntax + - Thanks to Juliette Reinders Folmer for the patch +- The PEAR.Commenting.FunctionComment.Missing error message now includes the name of the function + - Thanks to Yorman Arias for the patch +- The PEAR.Commenting.ClassComment.Missing and Squiz.Commenting.ClassComment.Missing error messages now include the name of the class + - Thanks to Yorman Arias for the patch +- PEAR.Functions.FunctionCallSignature now only forces alignment at a specific tab stop while fixing + - It was enforcing this during checking, but this meant invalid errors if the OpeningIndent message was being muted + - This fixes incorrect errors when using the PSR2 standard with some code blocks +- Generic.Files.LineLength now ignores lines that only contain phpcs: annotation comments + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Formatting.MultipleStatementAlignment now skips over arrays containing comments + - Thanks to Juliette Reinders Folmer for the patch +- Generic.PHP.Syntax now forces display_errors to ON when linting + - Thanks to Raúl Arellano for the patch +- PSR2.Namespaces.UseDeclaration has improved syntax error handling and closure detection + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.PHP.CommentedOutCode now has improved comment block detection for improved accuracy + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.PHP.NonExecutableCode could fatal error while fixing file with syntax error +- Squiz.PHP.NonExecutableCode now detects unreachable code after a goto statement + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.LanguageConstructSpacing has improved syntax error handling while fixing + - Thanks to Juliette Reinders Folmer for the patch +- Improved phpcs: annotation syntax handling for a number of sniffs + - Thanks to Juliette Reinders Folmer for the patch +- Improved auto-fixing of files with incomplete comment blocks for various commenting sniffs + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Fixed test suite compatibility with PHPUnit 7 +- Fixed bug #1793 : PSR2 forcing exact indent for function call opening statements +- Fixed bug #1803 : Squiz.WhiteSpace.ScopeKeywordSpacing removes member var name while fixing if no space after scope keyword +- Fixed bug #1817 : Blank line not enforced after control structure if comment on same line as closing brace +- Fixed bug #1827 : A phpcs:enable comment is not tokenized correctly if it is outside a phpcs:disable block + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1828 : Squiz.WhiteSpace.SuperfluousWhiteSpace ignoreBlankLines property ignores whitespace after single line comments + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1840 : When a comment has too many asterisks, phpcbf gives FAILED TO FIX error +- Fixed bug #1867 : Cant use phpcs:ignore where the next line is HTML +- Fixed bug #1870 : Invalid warning in multiple assignments alignment with closure or anon class +- Fixed bug #1890 : Incorrect Squiz.WhiteSpace.ControlStructureSpacing.NoLineAfterClose error between catch and finally statements +- Fixed bug #1891 : Comment on last USE statement causes false positive for PSR2.Namespaces.UseDeclaration.SpaceAfterLastUse + - Thanks to Matt Coleman, Daniel Hensby, and Juliette Reinders Folmer for the patch +- Fixed bug #1901 : Fixed PHPCS annotations in multi-line tab-indented comments + not ignoring whole line for phpcs:set + - Thanks to Juliette Reinders Folmer for the patch + +## [3.2.2] - 2017-12-20 +### Changed +- Disabled STDIN detection on Windows + - This fixes a problem with IDE plugins (e.g., PHPStorm) hanging on Windows + +## [3.2.1] - 2017-12-18 +### Changed +- Empty diffs are no longer followed by a newline character (request #1781) +- Generic.Functions.OpeningFunctionBraceKernighanRitchie no longer complains when the open brace is followed by a close tag + - This makes the sniff more useful when used in templates + - Thanks to Joseph Zidell for the patch + +### Fixed +- Fixed problems with some scripts and plugins waiting for STDIN + - This was a notable problem with IDE plugins (e.g., PHPStorm) and build systems +- Fixed bug #1782 : Incorrect detection of operator in ternary + anonymous function + +## [3.2.0] - 2017-12-13 +### Deprecated +- This release deprecates the @codingStandards comment syntax used for sending commands to PHP_CodeSniffer + - The existing syntax will continue to work in all version 3 releases, but will be removed in version 4 + - The comment formats have been replaced by a shorter syntax: + - @codingStandardsIgnoreFile becomes phpcs:ignoreFile + - @codingStandardsIgnoreStart becomes phpcs:disable + - @codingStandardsIgnoreEnd becomes phpcs:enable + - @codingStandardsIgnoreLine becomes phpcs:ignore + - @codingStandardsChangeSetting becomes phpcs:set + - The new syntax allows for additional developer comments to be added after a -- separator + - This is useful for describing why a code block is being ignored, or why a setting is being changed + - E.g., phpcs:disable -- This code block must be left as-is. + - Comments using the new syntax are assigned new comment token types to allow them to be detected: + - phpcs:ignoreFile has the token T_PHPCS_IGNORE_FILE + - phpcs:disable has the token T_PHPCS_DISABLE + - phpcs:enable has the token T_PHPCS_ENABLE + - phpcs:ignore has the token T_PHPCS_IGNORE + - phpcs:set has the token T_PHPCS_SET + +### Changed +- The phpcs:disable and phpcs:ignore comments can now selectively ignore specific sniffs (request #604) + - E.g., phpcs:disable Generic.Commenting.Todo.Found for a specific message + - E.g., phpcs:disable Generic.Commenting.Todo for a whole sniff + - E.g., phpcs:disable Generic.Commenting for a whole category of sniffs + - E.g., phpcs:disable Generic for a whole standard + - Multiple sniff codes can be specified by comma separating them + - E.g., phpcs:disable Generic.Commenting.Todo,PSR1.Files +- @codingStandardsIgnoreLine comments now only ignore the following line if they are on a line by themselves + - If they are at the end of an existing line, they will only ignore the line they are on + - Stops some lines from accidentally being ignored + - Same rule applies for the new phpcs:ignore comment syntax +- PSR1.Files.SideEffects now respects the new phpcs:disable comment syntax + - The sniff will no longer check any code that is between phpcs:disable and phpcs:enable comments + - The sniff does not support phpcs:ignore; you must wrap code structures with disable/enable comments + - Previously, there was no way to have this sniff ignore parts of a file +- Fixed a problem where PHPCS would sometimes hang waiting for STDIN, or read incomplete versions of large files + - Thanks to Arne Jørgensen for the patch +- Array properties specified in ruleset files now have their keys and values trimmed + - This saves having to do this in individual sniffs and stops errors introduced by whitespace in rulesets + - Thanks to Juliette Reinders Folmer for the patch +- Added phpcs.xsd to allow validation of ruleset XML files + - Thanks to Renaat De Muynck for the contribution +- File paths specified using --stdin-path can now point to fake file locations (request #1488) + - Previously, STDIN files using fake file paths were excluded from checking +- Setting an empty basepath (--basepath=) on the CLI will now clear a basepath set directly in a ruleset + - Thanks to Xaver Loppenstedt for the patch +- Ignore patterns are now checked on symlink target paths instead of symlink source paths + - Restores previous behaviour of this feature +- Metrics were being double counted when multiple sniffs were recording the same metric +- Added support for bash process substitution + - Thanks to Scott Dutton for the contribution +- Files included in the cache file code hash are now sorted to aid in cache file reuse across servers +- Windows BAT files can now be used outside a PEAR install + - You must have the path to PHP set in your PATH environment variable + - Thanks to Joris Debonnet for the patch +- The JS unsigned right shift assignment operator is now properly classified as an assignment operator + - Thanks to Juliette Reinders Folmer for the patch +- The AbstractVariableSniff abstract sniff now supports anonymous classes and nested functions + - Also fixes an issue with Squiz.Scope.MemberVarScope where member vars of anonymous classes were not being checked +- Added AbstractArraySniff to make it easier to create sniffs that check array formatting + - Allows for checking of single and multi line arrays easily + - Provides a parsed structure of the array including positions of keys, values, and double arrows +- Added Generic.Arrays.ArrayIndent to enforce a single tab stop indent for array keys in multi-line arrays + - Also ensures the close brace is on a new line and indented to the same level as the original statement + - Allows for the indent size to be set using an "indent" property of the sniff +- Added Generic.PHP.DiscourageGoto to warn about the use of the GOTO language construct + - Thanks to Juliette Reinders Folmer for the contribution +- Generic.Debug.ClosureLinter was not running the gjslint command + - Thanks to Michał Bundyra for the patch +- Generic.WhiteSpace.DisallowSpaceIndent now fixes space indents in multi-line block comments + - Thanks to Juliette Reinders Folmer for the patch +- Generic.WhiteSpace.DisallowSpaceIndent now fixes mixed space/tab indents more accurately + - Thanks to Juliette Reinders Folmer for the patch +- Generic.WhiteSpace.DisallowTabIndent now fixes tab indents in multi-line block comments + - Thanks to Juliette Reinders Folmer for the patch +- PEAR.Functions.FunctionDeclaration no longer errors when a function declaration is the first content in a JS file + - Thanks to Juliette Reinders Folmer for the patch +- PEAR.Functions.FunctionCallSignature now requires the function name to be indented to an exact tab stop + - If the function name is not the start of the statement, the opening statement must be indented correctly instead + - Added a new fixable error code PEAR.Functions.FunctionCallSignature.OpeningIndent for this error +- Squiz.Functions.FunctionDeclarationArgumentSpacing is no longer confused about comments in function declarations + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.PHP.NonExecutableCode error messages now indicate which line the code block ending is on + - Makes it easier to identify where the code block exited or returned + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.FunctionComment now supports nullable type hints +- Squiz.Commenting.FunctionCommentThrowTag no longer assigns throw tags inside anon classes to the enclosing function +- Squiz.WhiteSpace.SemicolonSpacing now ignores semicolons used for empty statements inside FOR conditions + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.ControlStructures.ControlSignature now allows configuring the number of spaces before the colon in alternative syntax + - Override the 'requiredSpacesBeforeColon' setting in a ruleset.xml file to change + - Default remains at 1 + - Thanks to Nikola Kovacs for the patch +- The Squiz standard now ensures array keys are indented 4 spaces from the main statement + - Previously, this standard aligned keys 1 space from the start of the array keyword +- The Squiz standard now ensures array end braces are aligned with the main statement + - Previously, this standard aligned the close brace with the start of the array keyword +- The standard for PHP_CodeSniffer itself now enforces short array syntax +- The standard for PHP_CodeSniffer itself now uses the Generic.Arrays/ArrayIndent sniff rules +- Improved fixer conflicts and syntax error handling for a number of sniffs + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Fixed bug #1462 : Error processing cyrillic strings in Tokenizer +- Fixed bug #1573 : Squiz.WhiteSpace.LanguageConstructSpacing does not properly check for tabs and newlines + - Thanks to Michał Bundyra for the patch +- Fixed bug #1590 : InlineControlStructure CBF issue while adding braces to an if thats returning a nested function +- Fixed bug #1718 : Unclosed strings at EOF sometimes tokenized as T_WHITESPACE by the JS tokenizer +- Fixed bug #1731 : Directory exclusions do not work as expected when a single file name is passed to phpcs +- Fixed bug #1737 : Squiz.CSS.EmptyStyleDefinition sees comment as style definition and fails to report error +- Fixed bug #1746 : Very large reports can sometimes become garbled when using the parallel option +- Fixed bug #1747 : Squiz.Scope.StaticThisUsage incorrectly looking inside closures +- Fixed bug #1757 : Unknown type hint "object" in Squiz.Commenting.FunctionComment +- Fixed bug #1758 : PHPCS gets stuck creating file list when processing circular symlinks +- Fixed bug #1761 : Generic.WhiteSpace.ScopeIndent error on multi-line function call with static closure argument +- Fixed bug #1762 : Generic.WhiteSpace.Disallow[Space/Tab]Indent not inspecting content before open tag + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1769 : Custom "define" function triggers a warning about declaring new symbols +- Fixed bug #1776 : Squiz.Scope.StaticThisUsage incorrectly looking inside anon classes +- Fixed bug #1777 : Generic.WhiteSpace.ScopeIndent incorrect indent errors when self called function proceeded by comment + +## [3.1.1] - 2017-10-17 +### Changed +- Restored preference of non-dist files over dist files for phpcs.xml and phpcs.xml.dist + - The order that the files are searched is now: .phpcs.xml, phpcs.xml, .phpcs.xml.dist, phpcs.xml.dist + - Thanks to Juliette Reinders Folmer for the patch +- Progress output now correctly shows skipped files +- Progress output now shows 100% when the file list has finished processing (request #1697) +- Stopped some IDEs complaining about testing class aliases + - Thanks to Vytautas Stankus for the patch +- Squiz.Commenting.InlineComment incorrectly identified comment blocks in some cases, muting some errors + - Thanks to Juliette Reinders Folmer for the patch + +### Fixed +- Fixed bug #1512 : PEAR.Functions.FunctionCallSignature enforces spaces when no arguments if required spaces is not 0 +- Fixed bug #1522 : Squiz Arrays.ArrayDeclaration and Strings.ConcatenationSpacing fixers causing parse errors with here/ nowdocs +- Fixed bug #1570 : Squiz.Arrays.ArrayDeclaration fixer removes comments between array keyword and open parentheses +- Fixed bug #1604 : File::isReference has problems with some bitwise operators and class property references + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1645 : Squiz.Commenting.InlineComment will fail to fix comments at the end of the file + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1656 : Using the --sniffs argument has a problem with case sensitivity +- Fixed bug #1657 : Uninitialized string offset: 0 when sniffing CSS +- Fixed bug #1669 : Temporary expression proceeded by curly brace is detected as function call +- Fixed bug #1681 : Huge arrays are super slow to scan with Squiz.Arrays.ArrayDeclaration sniff +- Fixed bug #1694 : Squiz.Arrays.ArrayBracketSpacing is removing some comments during fixing + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1702 : Generic.WhiteSpaceDisallowSpaceIndent fixer bug when line only contains superfluous whitespace + +## [3.1.0] - 2017-09-20 +### Changed +- This release includes a change to support newer versions of PHPUnit (versions 4, 5, and 6 are now supported) + - The custom PHP_CodeSniffer test runner now requires a bootstrap file + - Developers with custom standards using the PHP_CodeSniffer test runner will need to do one of the following: + - run your unit tests from the PHP_CodeSniffer root dir so the bootstrap file is included + - specify the PHP_CodeSniffer bootstrap file on the command line: phpunit --bootstrap=/path/to/phpcs/tests/bootstrap.php + - require the PHP_CodeSniffer bootstrap file from your own bootstrap file + - If you don't run PHP_CodeSniffer unit tests, this change will not affect you + - Thanks to Juliette Reinders Folmer for the patch +- A phpcs.xml or phpcs.xml.dist file now takes precedence over the default_standard config setting + - Thanks to Björn Fischer for the patch +- Both phpcs.xml and phpcs.xml.dist files can now be prefixed with a dot (request #1566) + - The order that the files are searched is: .phpcs.xml, .phpcs.xml.dist, phpcs.xml, phpcs.xml.dist +- The autoloader will now search for files during unit tests runs from the same locations as during normal phpcs runs + - Allows for easier unit testing of custom standards that use helper classes or custom namespaces +- Include patterns for sniffs now use OR logic instead of AND logic + - Previously, a file had to be in each of the include patterns to be processed by a sniff + - Now, a file has to only be in at least one of the patterns + - This change reflects the original intention of the feature +- PHPCS will now follow symlinks under the list of checked directories + - This previously only worked if you specified the path to a symlink on the command line +- Output from --config-show, --config-set, and --config-delete now includes the path to the loaded config file +- PHPCS now cleanly exits if its config file is not readable + - Previously, a combination of PHP notices and PHPCS errors would be generated +- Comment tokens that start with /** are now always tokenized as docblocks + - Thanks to Michał Bundyra for the patch +- The PHP-supplied T_YIELD and T_YIELD_FROM token have been replicated for older PHP versions + - Thanks to Michał Bundyra for the patch +- Added new Generic.CodeAnalysis.AssignmentInCondition sniff to warn about variable assignments inside conditions + - Thanks to Juliette Reinders Folmer for the contribution +- Added Generic.Files.OneObjectStructurePerFile sniff to ensure there is a single class/interface/trait per file + - Thanks to Mponos George for the contribution +- Function call sniffs now check variable function names and self/static object creation + - Specific sniffs are Generic.Functions.FunctionCallArgumentSpacing, PEAR.Functions.FunctionCallSignature, and PSR2.Methods.FunctionCallSignature + - Thanks to Michał Bundyra for the patch +- Generic.Files.LineLength can now be configured to ignore all comment lines, no matter their length + - Set the ignoreComments property to TRUE (default is FALSE) in your ruleset.xml file to enable this + - Thanks to Juliette Reinders Folmer for the patch +- Generic.PHP.LowerCaseKeyword now checks self, parent, yield, yield from, and closure (function) keywords + - Thanks to Michał Bundyra for the patch +- PEAR.Functions.FunctionDeclaration now removes a blank line if it creates one by moving the curly brace during fixing +- Squiz.Commenting.FunctionCommentThrowTag now supports PHP 7.1 multi catch exceptions +- Squiz.Formatting.OperatorBracket no longer throws errors for PHP 7.1 multi catch exceptions +- Squiz.Commenting.LongConditionClosingComment now supports finally statements +- Squiz.Formatting.OperatorBracket now correctly fixes pipe separated flags +- Squiz.Formatting.OperatorBracket now correctly fixes statements containing short array syntax +- Squiz.PHP.EmbeddedPhp now properly fixes cases where the only content in an embedded PHP block is a comment + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.ControlStructureSpacing now ignores comments when checking blank lines at the top of control structures +- Squiz.WhiteSpace.ObjectOperatorSpacing now detects and fixes spaces around double colons + - Thanks to Julius Šmatavičius for the patch +- Squiz.WhiteSpace.MemberVarSpacing can now be configured to check any number of blank lines between member vars + - Set the spacing property (default is 1) in your ruleset.xml file to set the spacing +- Squiz.WhiteSpace.MemberVarSpacing can now be configured to check a different number of blank lines before the first member var + - Set the spacingBeforeFirst property (default is 1) in your ruleset.xml file to set the spacing +- Added a new PHP_CodeSniffer\Util\Tokens::$ooScopeTokens static member var for quickly checking object scope + - Includes T_CLASS, T_ANON_CLASS, T_INTERFACE, and T_TRAIT + - Thanks to Juliette Reinders Folmer for the patch +- PHP_CodeSniffer\Files\File::findExtendedClassName() now supports extended interfaces + - Thanks to Martin Hujer for the patch + +### Fixed +- Fixed bug #1550 : Squiz.Commenting.FunctionComment false positive when function contains closure +- Fixed bug #1577 : Generic.InlineControlStructureSniff breaks with a comment between body and condition in do while loops +- Fixed bug #1581 : Sniffs not loaded when one-standard directories are being registered in installed_paths +- Fixed bug #1591 : Autoloader failing to load arbitrary files when installed_paths only set via a custom ruleset +- Fixed bug #1605 : Squiz.WhiteSpace.OperatorSpacing false positive on unary minus after comment + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1615 : Uncaught RuntimeException when phpcbf fails to fix files +- Fixed bug #1637 : Generic.WhiteSpaceScopeIndent closure argument indenting incorrect with multi-line strings +- Fixed bug #1638 : Squiz.WhiteSpace.ScopeClosingBrace closure argument indenting incorrect with multi-line strings +- Fixed bug #1640 : Squiz.Strings.DoubleQuoteUsage replaces tabs with spaces when fixing + - Thanks to Juliette Reinders Folmer for the patch + +## [3.0.2] - 2017-07-18 +### Changed +- The code report now gracefully handles tokenizer exceptions +- The phpcs and phpcbf scripts and now the only places that exit() in the code + - This allows for easier usage of core PHPCS functions from external scripts + - If you are calling Runner::runPHPCS() or Runner::runPHPCBF() directly, you will get back the full range of exit codes + - If not, catch the new DeepExitException to get the error message ($e->getMessage()) and exit code ($e->getCode()); +- NOWDOC tokens are now considered conditions, just as HEREDOC tokens are + - This makes it easier to find the start and end of a NOWDOC from any token within it + - Thanks to Michał Bundyra for the patch +- Custom autoloaders are now only included once in case multiple standards are using the same one + - Thanks to Juliette Reinders Folmer for the patch +- Improved tokenizing of fallthrough CASE and DEFAULT statements that share a closing statement and use curly braces +- Improved the error message when Squiz.ControlStructures.ControlSignature detects a newline after the closing parenthesis + +### Fixed +- Fixed a problem where the source report was not printing the correct number of errors found +- Fixed a problem where the --cache=/path/to/cachefile CLI argument was not working +- Fixed bug #1465 : Generic.WhiteSpace.ScopeIndent reports incorrect errors when indenting double arrows in short arrays +- Fixed bug #1478 : Indentation in fallthrough CASE that contains a closure +- Fixed bug #1497 : Fatal error if composer prepend-autoloader is set to false + - Thanks to Kunal Mehta for the patch +- Fixed bug #1503 : Alternative control structure syntax not always recognized as scoped +- Fixed bug #1523 : Fatal error when using the --suffix argument + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1526 : Use of basepath setting can stop PHPCBF being able to write fixed files +- Fixed bug #1530 : Generic.WhiteSpace.ScopeIndent can increase indent too much for lines within code blocks +- Fixed bug #1547 : Wrong token type for backslash in use function + - Thanks to Michał Bundyra for the patch +- Fixed bug #1549 : Squiz.PHP.EmbeddedPhp fixer conflict with // comment before PHP close tag + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1560 : Squiz.Commenting.FunctionComment fatal error when fixing additional param comment lines that have no indent + +## [3.0.1] - 2017-06-14 +### Security +- This release contains a fix for a security advisory related to the improper handling of a shell command + - A properly crafted filename would allow for arbitrary code execution when using the --filter=gitmodified command line option + - All version 3 users are encouraged to upgrade to this version, especially if you are checking 3rd-party code + - e.g., you run PHPCS over libraries that you did not write + - e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories + - e.g., you allow external tool paths to be set by user-defined values + - If you are unable to upgrade but you check 3rd-party code, ensure you are not using the Git modified filter + - This advisory does not affect PHP_CodeSniffer version 2. + - Thanks to Sergei Morozov for the report and patch + +### Changed +- Arguments on the command line now override or merge with those specified in a ruleset.xml file in all cases +- PHPCS now stops looking for a phpcs.xml file as soon as one is found, favoring the closest one to the current dir +- Added missing help text for the --stdin-path CLI option to --help +- Re-added missing help text for the --file-list and --bootstrap CLI options to --help +- Runner::runPHPCS() and Runner::runPHPCBF() now return an exit code instead of exiting directly (request #1484) +- The Squiz standard now enforces short array syntax by default +- The autoloader is now working correctly with classes created with class_alias() +- The autoloader will now search for files inside all directories in the installed_paths config var + - This allows autoloading of files inside included custom coding standards without manually requiring them +- You can now specify a namespace for a custom coding standard, used by the autoloader to load non-sniff helper files + - Also used by the autoloader to help other standards directly include sniffs for your standard + - Set the value to the namespace prefix you are using for sniff files (everything up to \Sniffs\) + - e.g., if your namespace format is MyProject\CS\Standard\Sniffs\Category set the namespace to MyProject\CS\Standard + - If omitted, the namespace is assumed to be the same as the directory name containing the ruleset.xml file + - The namespace is set in the ruleset tag of the ruleset.xml file + - e.g., ruleset name="My Coding Standard" namespace="MyProject\CS\Standard" +- Rulesets can now specify custom autoloaders using the new autoload tag + - Autoloaders are included while the ruleset is being processed and before any custom sniffs are included + - Allows for very custom autoloading of helper classes well before the boostrap files are included +- The PEAR standard now includes Squiz.Commenting.DocCommentAlignment + - It previously broke comments onto multiple lines, but didn't align them + +### Fixed +- Fixed a problem where excluding a message from a custom standard's own sniff would exclude the whole sniff + - This caused some PSR2 errors to be under-reported +- Fixed bug #1442 : T_NULLABLE detection not working for nullable parameters and return type hints in some cases +- Fixed bug #1447 : Running the unit tests with a phpunit config file breaks the test suite + - Unknown arguments were not being handled correctly, but are now stored in $config->unknown +- Fixed bug #1449 : Generic.Classes.OpeningBraceSameLine doesn't detect comment before opening brace + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1450 : Coding standard located under an installed_path with the same directory name throws an error + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1451 : Sniff exclusions/restrictions dont work with custom sniffs unless they use the PHP_CodeSniffer NS +- Fixed bug #1454 : Squiz.WhiteSpace.OperatorSpacing is not checking spacing on either side of a short ternary operator + - Thanks to Mponos George for the patch +- Fixed bug #1495 : Setting an invalid installed path breaks all commands +- Fixed bug #1496 : Squiz.Strings.DoubleQuoteUsage not unescaping dollar sign when fixing + - Thanks to Michał Bundyra for the patch +- Fixed bug #1501 : Interactive mode is broken +- Fixed bug #1504 : PSR2.Namespaces.UseDeclaration hangs fixing use statement with no trailing code + +## [2.9.1] - 2017-05-22 +### Fixed +- Fixed bug #1442 : T_NULLABLE detection not working for nullable parameters and return type hints in some cases +- Fixed bug #1448 : Generic.Classes.OpeningBraceSameLine doesn't detect comment before opening brace + - Thanks to Juliette Reinders Folmer for the patch + +## [3.0.0] - 2017-05-04 +### Changed +- Added an --ignore-annotations command line argument to ignore all @codingStandards annotations in code comments (request #811) +- This allows you to force errors to be shown that would otherwise be ignored by code comments + - Also stop files being able to change sniff properties mid way through processing +- An error is now reported if no sniffs were registered to be run (request #1129) +- The autoloader will now search for files inside the directory of any loaded coding standard + - This allows autoloading of any file inside a custom coding standard without manually requiring them + - Ensure your namespace begins with your coding standard's directory name and follows PSR-4 + - e.g., StandardName\Sniffs\CategoryName\AbstractHelper or StandardName\Helpers\StringSniffHelper +- Fixed an error where STDIN was sometimes not checked when using the --parallel CLI option +- The is_closure index has been removed from the return value of File::getMethodProperties() + - This value was always false because T_FUNCTION tokens are never closures + - Closures have a token type of T_CLOSURE +- The File::isAnonymousFunction() method has been removed + - This function always returned false because it only accepted T_FUNCTION tokens, which are never closures + - Closures have a token type of T_CLOSURE +- Includes all changes from the 2.9.0 release + +### Fixed +- Fixed bug #834 : PSR2.ControlStructures.SwitchDeclaration does not handle if branches with returns + - Thanks to Fabian Wiget for the patch + +## [3.0.0RC4] - 2017-03-02 +### Security +- This release contains a fix for a security advisory related to the improper handling of shell commands + - Uses of shell_exec() and exec() were not escaping filenames and configuration settings in most cases + - A properly crafted filename or configuration option would allow for arbitrary code execution when using some features + - All users are encouraged to upgrade to this version, especially if you are checking 3rd-party code + - e.g., you run PHPCS over libraries that you did not write + - e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories + - e.g., you allow external tool paths to be set by user-defined values + - If you are unable to upgrade but you check 3rd-party code, ensure you are not using the following features: + - The diff report + - The notify-send report + - The Generic.PHP.Syntax sniff + - The Generic.Debug.CSSLint sniff + - The Generic.Debug.ClosureLinter sniff + - The Generic.Debug.JSHint sniff + - The Squiz.Debug.JSLint sniff + - The Squiz.Debug.JavaScriptLint sniff + - The Zend.Debug.CodeAnalyzer sniff + - Thanks to Klaus Purer for the report + +### Changed +- The indent property of PEAR.Classes.ClassDeclaration has been removed + - Instead of calculating the indent of the brace, it just ensures the brace is aligned with the class keyword + - Other sniffs can be used to ensure the class itself is indented correctly +- Invalid exclude rules inside a ruleset.xml file are now ignored instead of potentially causing out of memory errors + - Using the -vv command line argument now also shows the invalid exclude rule as XML +- Includes all changes from the 2.8.1 release + +### Fixed +- Fixed bug #1333 : The new autoloader breaks some frameworks with custom autoloaders +- Fixed bug #1334 : Undefined offset when explaining standard with custom sniffs + +## [3.0.0RC3] - 2017-02-02 +### Changed +- Added support for ES6 class declarations + - Previously, these class were tokenized as JS objects but are now tokenized as normal T_CLASS structures +- Added support for ES6 method declarations, where the "function" keyword is not used + - Previously, these methods were tokenized as JS objects (fixes bug #1251) + - The name of the ES6 method is now assigned the T_FUNCTION keyword and treated like a normal function + - Custom sniffs that support JS and listen for T_FUNCTION tokens can't assume the token represents the word "function" + - Check the contents of the token first, or use $phpcsFile->getDeclarationName($stackPtr) if you just want its name + - There is no change for custom sniffs that only check PHP code +- PHPCBF exit codes have been changed so they are now more useful (request #1270) + - Exit code 0 is now used to indicate that no fixable errors were found, and so nothing was fixed + - Exit code 1 is now used to indicate that all fixable errors were fixed correctly + - Exit code 2 is now used to indicate that PHPCBF failed to fix some of the fixable errors it found + - Exit code 3 is now used for general script execution errors +- Added PEAR.Commenting.FileComment.ParamCommentAlignment to check alignment of multi-line param comments +- Includes all changes from the 2.8.0 release + +### Fixed +- Fixed an issue where excluding a file using a @codingStandardsIgnoreFile comment would produce errors + - For PHPCS, it would show empty files being processed + - For PHPCBF, it would produce a PHP error +- Fixed bug #1233 : Can't set config data inside ruleset.xml file +- Fixed bug #1241 : CodeSniffer.conf not working with 3.x PHAR file + +## [3.0.0RC2] - 2016-11-30 +### Changed +- Made the Runner class easier to use with wrapper scripts +- Full usage information is no longer printed when a usage error is encountered (request #1186) + - Makes it a lot easier to find and read the error message that was printed +- Includes all changes from the 2.7.1 release + +### Fixed +- Fixed an undefined var name error that could be produced while running PHPCBF +- Fixed bug #1167 : 3.0.0RC1 PHAR does not work with PEAR standard +- Fixed bug #1208 : Excluding files doesn't work when using STDIN with a filename specified + +## [3.0.0RC1] - 2016-09-02 +### Changed +- Progress output now shows E and W in green when a file has fixable errors or warnings + - Only supported if colors are enabled +- PHPCBF no longer produces verbose output by default (request #699) + - Use the -v command line argument to show verbose fixing output + - Use the -q command line argument to disable verbose information if enabled by default +- PHPBF now prints a summary report after fixing files + - Report shows files that were fixed, how many errors were fixed, and how many remain +- PHPCBF now supports the -p command line argument to print progress information + - Prints a green F for files where fixes occurred + - Prints a red E for files that could not be fixed due to an error + - Use the -q command line argument to disable progress information if enabled by default +- Running unit tests using --verbose no longer throws errors +- Includes all changes from the 2.7.0 release + +### Fixed +- Fixed shell error appearing on some systems when trying to find executable paths + +## [3.0.0a1] - 2016-07-20 +### Changed +- Min PHP version increased from 5.1.2 to 5.4.0 +- Added optional caching of results between runs (request #530) + - Enable the cache by using the --cache command line argument + - If you want the cache file written somewhere specific, use --cache=/path/to/cacheFile + - Use the command "phpcs --config-set cache true" to turn caching on by default + - Use the --no-cache command line argument to disable caching if it is being turned on automatically +- Add support for checking file in parallel (request #421) + - Tell PHPCS how many files to check at once using the --parallel command line argument + - To check 100 files at once, using --parallel=100 + - To disable parallel checking if it is being turned on automatically, use --parallel=1 + - Requires PHP to be compiled with the PCNTL package +- The default encoding has been changed from iso-8859-1 to utf-8 (request #760) + - The --encoding command line argument still works, but you no longer have to set it to process files as utf-8 + - If encoding is being set to utf-8 in a ruleset or on the CLI, it can be safely removed + - If the iconv PHP extension is not installed, standard non-multibyte aware functions will be used +- Added a new "code" report type to show a code snippet for each error (request #419) + - The line containing the error is printed, along with 2 lines above and below it to show context + - The location of the errors is underlined in the code snippet if you also use --colors + - Use --report=code to generate this report +- Added support for custom filtering of the file list + - Developers can write their own filter classes to perform custom filtering of the list before the run starts + - Use the command line arg --filter=/path/to/filter.php to specify a filter to use + - Extend \PHP_CodeSniffer\Filters\Filter to also support the core PHPCS extension and path filtering + - Extend \PHP_CodeSniffer\Filters\ExactMatch to get the core filtering and the ability to use blacklists and whitelists + - The included \PHP_CodeSniffer\Filters\GitModified filter is a good example of an ExactMatch filter +- Added support for only checking files that have been locally modified or added in a git repo + - Use --filter=gitmodified to check these files + - You still need to give PHPCS a list of files or directories in which to check +- Added automatic discovery of executable paths (request #571) + - Thanks to Sergey Morozov for the patch +- You must now pass "-" on the command line to have PHPCS wait for STDIN + - E.g., phpcs --standard=PSR2 - + - You can still pipe content via STDIN as normal as PHPCS will see this and process it + - But without the "-", PHPCS will throw an error if no content or files are passed to it +- All PHP errors generated by sniffs are caught, re-thrown as exceptions, and reported in the standard error reports + - This should stop bugs inside sniffs causing infinite loops + - Also stops invalid reports being produced as errors don't print to the screen directly +- Sniff codes are no longer optional + - If a sniff throws and error or a warning, it must specify an internal code for that message +- The installed_paths config setting can now point directly to a standard + - Previously, it had to always point to the directory in which the standard lives +- Multiple reports can now be specified using the --report command line argument + - Report types are separated by commas + - E.g., --report=full,summary,info + - Previously, you had to use one argument for each report such as --report=full --report=summary --report=info +- You can now set the severity, message type, and exclude patterns for and entire sniff, category, or standard + - Previously, this was only available for a single message +- You can now include a single sniff code in a ruleset instead of having to include an entire sniff + - Including a sniff code will automatically exclude all other messages from that sniff + - If the sniff is already included by an imported standard, set the sniff severity to 0 and include the specific message you want +- PHPCBF no longer uses patch + - Files are now always overwritten + - The --no-patch option has been removed +- Added a --basepath option to strip a directory from the front of file paths in output (request #470) + - The basepath is absolute or relative to the current directory + - E.g., to output paths relative to current dir in reports, use --basepath=. +- Ignore rules are now checked when using STDIN (request #733) +- Added an include-pattern tag to rulesets to include a sniff for specific files and folders only (request #656) + - This is the exact opposite of the exclude-pattern tag + - This option is only usable within sniffs, not globally like exclude-patterns are +- Added a new -m option to stop error messages from being recorded, which saves a lot of memory + - PHPCBF always uses this setting to reduce memory as it never outputs error messages + - Setting the $recordErrors member var inside custom report classes is no longer supported (use -m instead) +- Exit code 2 is now used to indicate fixable errors were found (request #930) + - Exit code 3 is now used for general script execution errors + - Exit code 1 is used to indicate that coding standard errors were found, but none are fixable + - Exit code 0 is unchanged and continues to mean no coding standard errors found + +### Removed +- The included PHPCS standard has been removed + - All rules are now found inside the phpcs.xml.dist file + - Running "phpcs" without any arguments from a git clone will use this ruleset +- The included SVN pre-commit hook has been removed + - Hooks for version control systems will no longer be maintained within the PHPCS project + +## [2.9.0] - 2017-05-04 +### Changed +- Added Generic.Debug.ESLint sniff to run ESLint over JS files and report errors + - Set eslint path using: phpcs --config-set eslint_path /path/to/eslint + - Thanks to Ryan McCue for the contribution +- T_POW is now properly considered an arithmetic operator, and will be checked as such + - Thanks to Juliette Reinders Folmer for the patch +- T_SPACESHIP and T_COALESCE are now properly considered comparison operators, and will be checked as such + - Thanks to Juliette Reinders Folmer for the patch +- Generic.PHP.DisallowShortOpenTag now warns about possible short open tags even when short_open_tag is set to OFF + - Thanks to Juliette Reinders Folmer for the patch +- Generic.WhiteSpace.DisallowTabIndent now finds and fixes improper use of spaces anywhere inside the line indent + - Previously, only the first part of the indent was used to determine the indent type + - Thanks to Juliette Reinders Folmer for the patch +- PEAR.Commenting.ClassComment now supports checking of traits as well as classes and interfaces + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.FunctionCommentThrowTag now supports re-throwing exceptions (request #946) + - Thanks to Samuel Levy for the patch +- Squiz.PHP.DisallowMultipleAssignments now ignores PHP4-style member var assignments + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.FunctionSpacing now ignores spacing above functions when they are preceded by inline comments + - Stops conflicts between this sniff and comment spacing sniffs +- Squiz.WhiteSpace.OperatorSpacing no longer checks the equal sign in declare statements + - Thanks to Juliette Reinders Folmer for the patch +- Added missing error codes for a couple of sniffs so they can now be customised as normal + +### Fixed +- Fixed bug #1266 : PEAR.WhiteSpace.ScopeClosingBrace can throw an error while fixing mixed PHP/HTML +- Fixed bug #1364 : Yield From values are not recognised as returned values in Squiz FunctionComment sniff +- Fixed bug #1373 : Error in tab expansion results in white-space of incorrect size + - Thanks to Mark Clements for the patch +- Fixed bug #1381 : Tokenizer: dereferencing incorrectly identified as short array +- Fixed bug #1387 : Squiz.ControlStructures.ControlSignature does not handle alt syntax when checking space after closing brace +- Fixed bug #1392 : Scope indent calculated incorrectly when using array destructuring +- Fixed bug #1394 : integer type hints appearing as TypeHintMissing instead of ScalarTypeHintMissing + - PHP 7 type hints were also being shown when run under PHP 5 in some cases +- Fixed bug #1405 : Squiz.WhiteSpace.ScopeClosingBrace fails to fix closing brace within indented PHP tags +- Fixed bug #1421 : Ternaries used in constant scalar expression for param default misidentified by tokenizer +- Fixed bug #1431 : PHPCBF can't fix short open tags when they are not followed by a space + - Thanks to Gonçalo Queirós for the patch +- Fixed bug #1432 : PHPCBF can make invalid fixes to inline JS control structures that make use of JS objects + +## [2.8.1] - 2017-03-02 +### Security +- This release contains a fix for a security advisory related to the improper handling of shell commands + - Uses of shell_exec() and exec() were not escaping filenames and configuration settings in most cases + - A properly crafted filename or configuration option would allow for arbitrary code execution when using some features + - All users are encouraged to upgrade to this version, especially if you are checking 3rd-party code + - e.g., you run PHPCS over libraries that you did not write + - e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories + - e.g., you allow external tool paths to be set by user-defined values + - If you are unable to upgrade but you check 3rd-party code, ensure you are not using the following features: + - The diff report + - The notify-send report + - The Generic.PHP.Syntax sniff + - The Generic.Debug.CSSLint sniff + - The Generic.Debug.ClosureLinter sniff + - The Generic.Debug.JSHint sniff + - The Squiz.Debug.JSLint sniff + - The Squiz.Debug.JavaScriptLint sniff + - The Zend.Debug.CodeAnalyzer sniff + - Thanks to Klaus Purer for the report + +### Changed +- The PHP-supplied T_COALESCE_EQUAL token has been replicated for PHP versions before 7.2 +- PEAR.Functions.FunctionDeclaration now reports an error for blank lines found inside a function declaration +- PEAR.Functions.FunctionDeclaration no longer reports indent errors for blank lines in a function declaration +- Squiz.Functions.MultiLineFunctionDeclaration no longer reports errors for blank lines in a function declaration + - It would previously report that only one argument is allowed per line +- Squiz.Commenting.FunctionComment now corrects multi-line param comment padding more accurately +- Squiz.Commenting.FunctionComment now properly fixes pipe-separated param types +- Squiz.Commenting.FunctionComment now works correctly when function return types also contain a comment + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.ControlStructures.InlineIfDeclaration now supports the elvis operator + - As this is not a real PHP operator, it enforces no spaces between ? and : when the THEN statement is empty +- Squiz.ControlStructures.InlineIfDeclaration is now able to fix the spacing errors it reports + +### Fixed +- Fixed bug #1340 : STDIN file contents not being populated in some cases + - Thanks to David Biňovec for the patch +- Fixed bug #1344 : PEAR.Functions.FunctionCallSignatureSniff throws error for blank comment lines +- Fixed bug #1347 : PSR2.Methods.FunctionCallSignature strips some comments during fixing + - Thanks to Algirdas Gurevicius for the patch +- Fixed bug #1349 : Squiz.Strings.DoubleQuoteUsage.NotRequired message is badly formatted when string contains a CR newline char + - Thanks to Algirdas Gurevicius for the patch +- Fixed bug #1350 : Invalid Squiz.Formatting.OperatorBracket error when using namespaces +- Fixed bug #1369 : Empty line in multi-line function declaration cause infinite loop + +## [2.8.0] - 2017-02-02 +### Changed +- The Internal.NoCodeFound error is no longer generated for content sourced from STDIN + - This should stop some Git hooks generating errors because PHPCS is trying to process the refs passed on STDIN +- Squiz.Commenting.DocCommentAlignment now checks comments on class properties defined using the VAR keyword + - Thanks to Klaus Purer for the patch +- The getMethodParameters() method now recognises "self" as a valid type hint + - The return array now contains a new "content" index containing the raw content of the param definition + - Thanks to Juliette Reinders Folmer for the patch +- The getMethodParameters() method now supports nullable types + - The return array now contains a new "nullable_type" index set to true or false for each method param + - Thanks to Juliette Reinders Folmer for the patch +- The getMethodParameters() method now supports closures + - Thanks to Juliette Reinders Folmer for the patch +- Added more guard code for JS files with syntax errors (request #1271 and request #1272) +- Added more guard code for CSS files with syntax errors (request #1304) +- PEAR.Commenting.FunctionComment fixers now correctly handle multi-line param comments +- AbstractVariableSniff now supports anonymous classes + - Thanks to Juliette Reinders Folmer for the patch +- Generic.NamingConventions.ConstructorName and PEAR.NamingConventions.ValidVariable now support anonymous classes +- Generic.NamingConventions.CamelCapsFunctionName and PEAR.NamingConventions.ValidFunctionName now support anonymous classes + - Thanks to Juliette Reinders Folmer for the patch +- Generic.CodeAnalysis.UnusedFunctionParameter and PEAR.Functions.ValidDefaultValue now support closures + - Thanks to Juliette Reinders Folmer for the patch +- PEAR.NamingConventions.ValidClassName and Squiz.Classes.ValidClassName now support traits + - Thanks to Juliette Reinders Folmer for the patch +- Generic.Functions.FunctionCallArgumentSpacing now supports closures other PHP-provided functions + - Thanks to Algirdas Gurevicius for the patch +- Fixed an error where a nullable type character was detected as an inline then token + - A new T_NULLABLE token has been added to represent the ? nullable type character + - Thanks to Jaroslav Hanslík for the patch +- Squiz.WhiteSpace.SemicolonSpacing no longer removes comments while fixing the placement of semicolons + - Thanks to Algirdas Gurevicius for the patch + +### Fixed +- Fixed bug #1230 : JS tokeniser incorrectly tokenises bitwise shifts as comparison + - Thanks to Ryan McCue for the patch +- Fixed bug #1237 : Uninitialized string offset in PHP Tokenizer on PHP 5.2 +- Fixed bug #1239 : Warning when static method name is 'default' +- Fixed bug #1240 : False positive for function names starting with triple underscore + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1245 : SELF is not recognised as T_SELF token in: return new self +- Fixed bug #1246 : A mix of USE statements with and without braces can cause the tokenizer to mismatch brace tokens + - Thanks to Michał Bundyra for the patch +- Fixed bug #1249 : GitBlame report requires a .git directory +- Fixed bug #1252 : Squiz.Strings.ConcatenationSpacing fix creates syntax error when joining a number to a string +- Fixed bug #1253 : Generic.ControlStructures.InlineControlStructure fix creates syntax error fixing if-try/catch +- Fixed bug #1255 : Inconsistent indentation check results when ELSE on new line +- Fixed bug #1257 : Double dash in CSS class name can lead to "Named colours are forbidden" false positives +- Fixed bug #1260 : Syntax errors not being shown when error_prepend_string is set + - Thanks to Juliette Reinders Folmer for the patch +- Fixed bug #1264 : Array return type hint is sometimes detected as T_ARRAY_HINT instead of T_RETURN_TYPE + - Thanks to Jaroslav Hanslík for the patch +- Fixed bug #1265 : ES6 arrow function raises unexpected operator spacing errors +- Fixed bug #1267 : Fixer incorrectly handles filepaths with repeated dir names + - Thanks to Sergey Ovchinnikov for the patch +- Fixed bug #1276 : Commenting.FunctionComment.InvalidReturnVoid conditional issue with anonymous classes +- Fixed bug #1277 : Squiz.PHP.DisallowMultipleAssignments.Found error when var assignment is on the same line as an open tag +- Fixed bug #1284 : Squiz.Arrays.ArrayBracketSpacing.SpaceBeforeBracket false positive match for short list syntax + +## [2.7.1] - 2016-11-30 +### Changed +- Squiz.ControlStructures.ControlSignature.SpaceAfterCloseParenthesis fix now removes unnecessary whitespace +- Squiz.Formatting.OperatorBracket no longer errors for negative array indexes used within a function call +- Squiz.PHP.EmbeddedPhp no longer expects a semicolon after statements that are only opening a scope +- Fixed a problem where the content of T_DOC_COMMENT_CLOSE_TAG tokens could sometimes be (boolean) false +- Developers of custom standards with custom test runners can now have their standards ignored by the built-in test runner + - Set the value of an environment variable called PHPCS_IGNORE_TESTS with a comma separated list of your standard names + - Thanks to Juliette Reinders Folmer for the patch +- The unit test runner now loads the test sniff outside of the standard's ruleset so that exclude rules do not get applied + - This may have caused problems when testing custom sniffs inside custom standards + - Also makes the unit tests runs a little faster +- The SVN pre-commit hook now works correctly when installed via composer + - Thanks to Sergey for the patch + +### Fixed +- Fixed bug #1135 : PEAR.ControlStructures.MultiLineCondition.CloseBracketNewLine not detected if preceded by multiline function call +- Fixed bug #1138 : PEAR.ControlStructures.MultiLineCondition.Alignment not detected if closing brace is first token on line +- Fixed bug #1141 : Sniffs that check EOF newlines don't detect newlines properly when the last token is a doc block +- Fixed bug #1150 : Squiz.Strings.EchoedStrings does not properly fix bracketed statements +- Fixed bug #1156 : Generic.Formatting.DisallowMultipleStatements errors when multiple short echo tags are used on the same line + - Thanks to Nikola Kovacs for the patch +- Fixed bug #1161 : Absolute report path is treated like a relative path if it also exists within the current directory +- Fixed bug #1170 : Javascript regular expression literal not recognized after comparison operator +- Fixed bug #1180 : Class constant named FUNCTION is incorrectly tokenized +- Fixed bug #1181 : Squiz.Operators.IncrementDecrementUsage.NoBrackets false positive when incrementing properties + - Thanks to Jürgen Henge-Ernst for the patch +- Fixed bug #1188 : Generic.WhiteSpace.ScopeIndent issues with inline HTML and multi-line function signatures +- Fixed bug #1190 : phpcbf on if/else with trailing comment generates erroneous code +- Fixed bug #1191 : Javascript sniffer fails with function called "Function" +- Fixed bug #1203 : Inconsistent behavior of PHP_CodeSniffer_File::findEndOfStatement +- Fixed bug #1218 : CASE conditions using class constants named NAMESPACE/INTERFACE/TRAIT etc are incorrectly tokenized +- Fixed bug #1221 : Indented function call with multiple closure arguments can cause scope indent error +- Fixed bug #1224 : PHPCBF fails to fix code with heredoc/nowdoc as first argument to a function + +## [2.7.0] - 2016-09-02 +### Changed +- Added --file-list command line argument to allow a list of files and directories to be specified in an external file + - Useful is you have a generated list of files to check that would be too long for the command line + - File and directory paths are listed one per line + - Usage is: phpcs --file-list=/path/to/file-list ... + - Thanks to Blotzu for the patch +- Values set using @codingStandardsChangeSetting comments can now contain spaces +- Sniff unit tests can now specify a list of test files instead of letting the runner pick them (request #1078) + - Useful if a sniff needs to exclude files based on the environment, or is checking filenames + - Override the new getTestFiles() method to specify your own list of test files +- Generic.Functions.OpeningFunctionBraceKernighanRitchie now ignores spacing for function return types + - The sniff code Generic.Functions.OpeningFunctionBraceKernighanRitchie.SpaceAfterBracket has been removed + - Replaced by Generic.Functions.OpeningFunctionBraceKernighanRitchie.SpaceBeforeBrace + - The new error message is slightly clearer as it indicates that a single space is needed before the brace +- Squiz.Commenting.LongConditionClosingComment now allows for the length of a code block to be configured + - Set the lineLimit property (default is 20) in your ruleset.xml file to set the code block length + - When the code block length is reached, the sniff will enforce a closing comment after the closing brace + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.Commenting.LongConditionClosingComment now allows for the end comment format to be configured + - Set the commentFormat property (default is "//end %s") in your ruleset.xml file to set the format + - The placeholder %s will be replaced with the type of condition opener, e.g., "//end foreach" + - Thanks to Juliette Reinders Folmer for the patch +- Generic.PHPForbiddenFunctions now allows forbidden functions to have mixed case + - Previously, it would only do a strtolower comparison + - Error message now shows what case was found in the code and what the correct case should be + - Thanks to Juliette Reinders Folmer for the patch +- Added Generic.Classes.OpeningBraceSameLine to ensure opening brace of class/interface/trait is on the same line as the declaration + - Thanks to Juliette Reinders Folmer for the patch +- Added Generic.PHP.BacktickOperator to ban the use of the backtick operator for running shell commands + - Thanks to Juliette Reinders Folmer for the patch +- Added Generic.PHP.DisallowAlternativePHPTags to ban the use of alternate PHP tags + - Thanks to Juliette Reinders Folmer for the patch +- Squiz.WhiteSpace.LanguageConstructSpacing no longer checks for spaces if parenthesis are being used (request #1062) + - Makes this sniff more compatible with those that check parenthesis spacing of function calls +- Squiz.WhiteSpace.ObjectOperatorSpacing now has a setting to ignore newline characters around object operators + - Default remains FALSE, so newlines are not allowed + - Override the "ignoreNewlines" setting in a ruleset.xml file to change + - Thanks to Alex Howansky for the patch +- Squiz.Scope.MethodScope now sniffs traits as well as classes and interfaces + - Thanks to Jesse Donat for the patch +- PHPCBF is now able to fix Squiz.SelfMemberReference.IncorrectCase errors + - Thanks to Nikola Kovacs for the patch +- PHPCBF is now able to fix Squiz.Commenting.VariableComment.IncorrectVarType + - Thanks to Walt Sorensen for the patch +- PHPCBF is now able to fix Generic.PHP.DisallowShortOpenTag + - Thanks to Juliette Reinders Folmer for the patch +- Improved the formatting of the end brace when auto fixing InlineControlStructure errors (request #1121) +- Generic.Functions.OpeningFunctionBraceKernighanRitchie.BraceOnNewLine fix no longer leaves blank line after brace (request #1085) +- Generic UpperCaseConstantNameSniff now allows lowercase namespaces in constant definitions + - Thanks to Daniel Schniepp for the patch +- Squiz DoubleQuoteUsageSniff is now more tolerant of syntax errors caused by mismatched string tokens +- A few sniffs that produce errors based on the current PHP version can now be told to run using a specific PHP version + - Set the php_version config var using --config-set, --runtime-set, or in a ruleset to specify a specific PHP version + - The format of the PHP version is the same as the PHP_VERSION_ID constant (e.g., 50403 for version 5.4.3) + - Supported sniffs are Generic.PHP.DisallowAlternativePHPTags, PSR1.Classes.ClassDeclaration, Squiz.Commenting.FunctionComment + - Thanks to Finlay Beaton for the patch + +### Fixed +- Fixed bug #985 : Duplicate class definition detection generates false-positives in media queries + - Thanks to Raphael Horber for the patch +- Fixed bug #1014 : Squiz VariableCommentSniff doesn't always detect a missing comment +- Fixed bug #1066 : Undefined index: quiet in CLI.php during unit test run with -v command line arg +- Fixed bug #1072 : Squiz.SelfMemberReference.NotUsed not detected if leading namespace separator is used +- Fixed bug #1089 : Rulesets cannot be loaded if the path contains urlencoded characters +- Fixed bug #1091 : PEAR and Squiz FunctionComment sniffs throw errors for some invalid @param line formats +- Fixed bug #1092 : PEAR.Functions.ValidDefaultValue should not flag type hinted methods with a NULL default argument +- Fixed bug #1095 : Generic LineEndings sniff replaces tabs with spaces with --tab-width is set +- Fixed bug #1096 : Squiz FunctionDeclarationArgumentSpacing gives incorrect error/fix when variadic operator is followed by a space +- Fixed bug #1099 : Group use declarations are incorrectly fixed by the PSR2 standard + - Thanks to Jason McCreary for the patch +- Fixed bug #1101 : Incorrect indent errors when breaking out of PHP inside an IF statement +- Fixed bug #1102 : Squiz.Formatting.OperatorBracket.MissingBrackets faulty bracketing fix +- Fixed bug #1109 : Wrong scope indent reported in anonymous class +- Fixed bug #1112 : File docblock not recognized when require_once follows it +- Fixed bug #1120 : InlineControlStructureSniff does not handle auto-fixing for control structures that make function calls +- Fixed bug #1124 : Squiz.Operators.ComparisonOperatorUsage does not detect bracketed conditions for inline IF statements + - Thanks to Raphael Horber for the patch + +## [2.6.2] - 2016-07-14 +### Changed +- Added a new --exclude CLI argument to exclude a list of sniffs from checking and fixing (request #904) + - Accepts the same sniff codes as the --sniffs command line argument, but provides the opposite functionality +- Added a new -q command line argument to disable progress and verbose information from being printed (request #969) + - Useful if a coding standard hard-codes progress or verbose output but you want PHPCS to be quiet + - Use the command "phpcs --config-set quiet true" to turn quiet mode on by default +- Generic LineLength sniff no longer errors for comments that cannot be broken out onto a new line (request #766) + - A typical case is a comment that contains a very long URL + - The comment is ignored if putting the URL on a indented new comment line would be longer than the allowed length +- Settings extensions in a ruleset no longer causes PHP notices during unit testing + - Thanks to Klaus Purer for the patch +- Version control reports now show which errors are fixable if you are showing sources +- Added a new sniff to enforce a single space after a NOT operator (request #1051) + - Include in a ruleset using the code Generic.Formatting.SpaceAfterNot +- The Squiz.Commenting.BlockComment sniff now supports tabs for indenting comment lines (request #1056) + +### Fixed +- Fixed bug #790 : Incorrect missing @throws error in methods that use closures +- Fixed bug #908 : PSR2 standard is not checking that closing brace is on line following the body +- Fixed bug #945 : Incorrect indent behavior using deep-nested function and arrays +- Fixed bug #961 : Two anonymous functions passed as function/method arguments cause indentation false positive +- Fixed bug #1005 : Using global composer vendor autoload breaks PHP lowercase built-in function sniff + - Thanks to Michael Butler for the patch +- Fixed bug #1007 : Squiz Unreachable code detection is not working properly with a closure inside a case +- Fixed bug #1023 : PSR2.Classes.ClassDeclaration fails if class extends base class and "implements" is on trailing line +- Fixed bug #1026 : Arrays in comma delimited class properties cause ScopeIndent to increase indent +- Fixed bug #1028 : Squiz ArrayDeclaration incorrectly fixes multi-line array where end bracket is not on a new line +- Fixed bug #1034 : Squiz FunctionDeclarationArgumentSpacing gives incorrect error when first arg is a variadic +- Fixed bug #1036 : Adjacent assignments aligned analysis statement wrong +- Fixed bug #1049 : Version control reports can show notices when the report width is very small +- Fixed bug #21050 : PEAR MultiLineCondition sniff suppresses errors on last condition line + +## [2.6.1] - 2016-05-31 +### Changed +- The PHP-supplied T_COALESCE token has been replicated for PHP versions before 7.0 +- Function return types of self, parent and callable are now tokenized as T_RETURN_TYPE + - Thanks to Jaroslav Hanslík for the patch +- The default_standard config setting now allows multiple standards to be listed, like on the command line + - Thanks to Michael Mayer for the patch +- Installations done via composer now only include the composer autoloader for PHP 5.3.2+ (request #942) +- Added a rollbackChangeset() method to the Fixer class to purposely rollback the active changeset + +### Fixed +- Fixed bug #940 : Auto-fixing issue encountered with inconsistent use of braces +- Fixed bug #943 : Squiz.PHP.InnerFunctions.NotAllowed reported in anonymous classes +- Fixed bug #944 : PHP warning when running the latest phar +- Fixed bug #951 : InlineIfDeclaration: invalid error produced with UTF-8 string +- Fixed bug #957 : Operator spacing sniff errors when plus is used as part of a number + - Thanks to Klaus Purer for the patch +- Fixed bug #959 : Call-time pass-by-reference false positive if there is a square bracket before the ampersand + - Thanks to Konstantin Leboev for the patch +- Fixed bug #962 : Null coalescing operator (??) not detected as a token + - Thanks to Joel Posti for the patch +- Fixed bug #973 : Anonymous class declaration and PSR1.Files.SideEffects.FoundWithSymbols +- Fixed bug #974 : Error when file ends with "function" +- Fixed bug #979 : Anonymous function with return type hint is not refactored as expected +- Fixed bug #983 : Squiz.WhiteSpace.MemberVarSpacing.AfterComment fails to fix error when comment is not a docblock +- Fixed bug #1010 : Squiz NonExecutableCode sniff does not detect boolean OR + - Thanks to Derek Henderson for the patch +- Fixed bug #1015 : The Squiz.Commenting.FunctionComment sniff doesn't allow description in @return tag + - Thanks to Alexander Obuhovich for the patch +- Fixed bug #1022 : Duplicate spaces after opening bracket error with PSR2 standard +- Fixed bug #1025 : Syntax error in JS file can cause undefined index for parenthesis_closer + +## [2.6.0] - 2016-04-04 +### Changed +- Paths used when setting CLI arguments inside ruleset.xml files are now relative to the ruleset location (request #847) + - This change only applies to paths within ARG tags, used to set CLI arguments + - Previously, the paths were relative to the directory PHPCS was being run from + - Absolute paths are still allowed and work the same way they always have + - This change allows ruleset.xml files to be more portable +- Content passed via STDIN will now be processed even if files are specified on the command line or in a ruleset +- When passing content via STDIN, you can now specify the file path to use on the command line (request #934) + - This allows sniffs that check file paths to work correctly + - This is the same functionality provided by the phpcs_input_file line, except it is available on the command line +- Files processed with custom tokenizers will no longer be skipped if they appear minified (request #877) + - If the custom tokenizer wants minified files skipped, it can set a $skipMinified member var to TRUE + - See the included JS and CSS tokenizers for an example +- Config vars set in ruleset.xml files are now processed earlier, allowing them to be used during sniff registration + - Among other things, this allows the installed_paths config var to be set in ruleset.xml files + - Thanks to Pieter Frenssen for the patch +- Improved detection of regular expressions in the JS tokenizer +- Generic PHP Syntax sniff now uses PHP_BINARY (if available) to determine the path to PHP if no other path is available + - You can still manually set php_path to use a specific binary for testing + - Thanks to Andrew Berry for the patch +- The PHP-supplied T_POW_EQUAL token has been replicated for PHP versions before 5.6 +- Added support for PHP7 use group declarations (request #878) + - New tokens T_OPEN_USE_GROUP and T_CLOSE_USE_GROUP are assigned to the open and close curly braces +- Generic ScopeIndent sniff now reports errors for every line that needs the indent changed (request #903) + - Previously, it ignored lines that were indented correctly in the context of their block + - This change produces more technically accurate error messages, but is much more verbose +- The PSR2 and Squiz standards now allow multi-line default values in function declarations (request #542) + - Previously, these would automatically make the function a multi-line declaration +- Squiz InlineCommentSniff now allows docblocks on require(_once) and include(_once) statements + - Thanks to Gary Jones for the patch +- Squiz and PEAR Class and File sniffs no longer assume the first comment in a file is always a file comment + - phpDocumentor assigns the comment to the file only if it is not followed by a structural element + - These sniffs now follow this same rule +- Squiz ClassCommentSniff no longer checks for blank lines before class comments + - Removes the error Squiz.Commenting.ClassComment.SpaceBefore +- Renamed Squiz.CSS.Opacity.SpacingAfterPoint to Squiz.CSS.Opacity.DecimalPrecision + - Please update your ruleset if you are referencing this error code directly +- Fixed PHP tokenizer problem that caused an infinite loop when checking a comment with specific content +- Generic Disallow Space and Tab indent sniffs now detect and fix indents inside embedded HTML chunks (request #882) +- Squiz CSS IndentationSniff no longer assumes the class opening brace is at the end of a line +- Squiz FunctionCommentThrowTagSniff now ignores non-docblock comments +- Squiz ComparisonOperatorUsageSniff now allows conditions like while(true) +- PEAR FunctionCallSignatureSniff (and the Squiz and PSR2 sniffs that use it) now correctly check the first argument + - Further fix for bug #698 + +### Fixed +- Fixed bug #791 : codingStandardsChangeSetting settings not working with namespaces +- Fixed bug #872 : Incorrect detection of blank lines between CSS class names +- Fixed bug #879 : Generic InlineControlStructureSniff can create parse error when case/if/elseif/else have mixed brace and braceless definitions +- Fixed bug #883 : PSR2 is not checking for blank lines at the start and end of control structures +- Fixed bug #884 : Incorrect indentation notice for anonymous classes +- Fixed bug #887 : Using curly braces for a shared CASE/DEFAULT statement can generate an error in PSR2 SwitchDeclaration +- Fixed bug #889 : Closure inside catch/else/elseif causes indentation error +- Fixed bug #890 : Function call inside returned short array value can cause indentation error inside CASE statements +- Fixed bug #897 : Generic.Functions.CallTimePassByReference.NotAllowed false positive when short array syntax +- Fixed bug #900 : Squiz.Functions.FunctionDeclarationArgumentSpacing bug when no space between type hint and argument +- Fixed bug #902 : T_OR_EQUAL and T_POW_EQUAL are not seen as assignment tokens +- Fixed bug #910 : Unrecognized "extends" and indentation on anonymous classes +- Fixed bug #915 : JS Tokenizer generates errors when processing some decimals +- Fixed bug #928 : Endless loop when sniffing a PHP file with a git merge conflict inside a function +- Fixed bug #937 : Shebang can cause PSR1 SideEffects warning + - Thanks to Clay Loveless for the patch +- Fixed bug #938 : CallTimePassByReferenceSniff ignores functions with return value + +## [2.5.1] - 2016-01-20 +### Changed +- The PHP-supplied T_SPACESHIP token has been replicated for PHP versions before 7.0 +- T_SPACESHIP is now correctly identified as an operator + - Thanks to Alexander Obuhovich for the patch +- Generic LowerCaseKeyword now ensures array type hints are lowercase as well + - Thanks to Mathieu Rochette for the patch +- Squiz ComparisonOperatorUsageSniff no longer hangs on JS FOR loops that don't use semicolons +- PHP_CodesSniffer now includes the composer autoload.php file, if there is one + - Thanks to Klaus Purer for the patch +- Added error Squiz.Commenting.FunctionComment.ScalarTypeHintMissing for PHP7 only (request #858) + - These errors were previously reported as Squiz.Commenting.FunctionComment.TypeHintMissing on PHP7 + - Disable this error message in a ruleset.xml file if your code needs to run on both PHP5 and PHP7 +- The PHP 5.6 __debugInfo magic method no longer produces naming convention errors + - Thanks to Michael Nowack for the patch +- PEAR and Squiz FunctionComment sniffs now support variadic functions (request #841) + +### Fixed +- Fixed bug #622 : Wrong detection of Squiz.CSS.DuplicateStyleDefinition with media queries +- Fixed bug #752 : The missing exception error is reported in first found DocBlock +- Fixed bug #794 : PSR2 MultiLineFunctionDeclaration forbids comments after opening parenthesis of a multiline call +- Fixed bug #820 : PEAR/PSR2 FunctionCallSignature sniffs suggest wrong indent when there are multiple arguments on a line +- Fixed bug #822 : Ruleset hard-coded file paths are not used if not running from the same directory as the ruleset +- Fixed bug #825 : FunctionCallArgumentSpacing sniff complains about more than one space before comment in multi-line function call +- Fixed bug #828 : Null classname is tokenized as T_NULL instead of T_STRING +- Fixed bug #829 : Short array argument not fixed correctly when multiple function arguments are on the same line +- Fixed bug #831 : PHPCS freezes in an infinite loop under Windows if no standard is passed +- Fixed bug #832 : Tokenizer does not support context sensitive parsing + - Thanks to Jaroslav Hanslík for the patch +- Fixed bug #835 : PEAR.Functions.FunctionCallSignature broken when closure uses return types +- Fixed bug #838 : CSS indentation fixer changes color codes + - Thanks to Klaus Purer for the patch +- Fixed bug #839 : "__()" method is marked as not camel caps + - Thanks to Tim Bezhashvyly for the patch +- Fixed bug #852 : Generic.Commenting.DocComment not finding errors when long description is omitted +- Fixed bug #854 : Return typehints in interfaces are not reported as T_RETURN_TYPE + - Thanks to Jaroslav Hanslík for the patch +- Fixed bug #855 : Capital letter detection for multibyte strings doesn't work correctly +- Fixed bug #857 : PSR2.ControlStructure.SwitchDeclaration shouldn't check indent of curly brace closers +- Fixed bug #859 : Switch statement indention issue when returning function call with closure +- Fixed bug #861 : Single-line arrays and function calls can generate incorrect indentation errors +- Fixed bug #867 : Squiz.Strings.DoubleQuoteUsage broken for some escape codes + - Thanks to Jack Blower for the help with the fix +- Fixed bug #21005 : Incorrect indent detection when multiple properties are initialized to arrays +- Fixed bug #21010 : Incorrect missing colon detection in CSS when first style is not on new line +- Fixed bug #21011 : Incorrect error message text when newline found after opening brace + +## [2.5.0] - 2015-12-11 +### Changed +- PHPCS will now look for a phpcs.xml file in parent directories as well as the current directory (request #626) +- PHPCS will now use a phpcs.xml file even if files are specified on the command line + - This file is still only used if no standard is specified on the command line +- Added support for a phpcs.xml.dist file (request #583) + - If both a phpcs.xml and phpcs.xml.dist file are present, the phpcs.xml file will be used +- Added support for setting PHP ini values in ruleset.xml files (request #560) + - Setting the value of the new ini tags to name="memory_limit" value="32M" is the same as -d memory_limit=32M +- Added support for one or more bootstrap files to be run before processing begins + - Use the --bootstrap=file,file,file command line argument to include bootstrap files + - Useful if you want to override some of the high-level settings of PHPCS or PHPCBF + - Thanks to John Maguire for the patch +- Added additional verbose output for CSS tokenizing +- Squiz ComparisonOperatorUsageSniff now checks FOR, WHILE and DO-WHILE statements + - Thanks to Arnout Boks for the patch + +### Fixed +- Fixed bug #660 : Syntax checks can fail on Windows with PHP5.6 +- Fixed bug #784 : $this->trait is seen as a T_TRAIT token +- Fixed bug #786 : Switch indent issue with short array notation +- Fixed bug #787 : SpacingAfterDefaultBreak confused by multi-line statements +- Fixed bug #797 : Parsing CSS url() value breaks further parsing +- Fixed bug #805 : Squiz.Commenting.FunctionComment.InvalidTypeHint on Scalar types on PHP7 +- Fixed bug #807 : Cannot fix line endings when open PHP tag is not on the first line +- Fixed bug #808 : JS tokeniser incorrectly setting some function and class names to control structure tokens +- Fixed bug #809 : PHPCBF can break a require_once statement with a space before the open parenthesis +- Fixed bug #813 : PEAR FunctionCallSignature checks wrong indent when first token on line is part of a multi-line string + +## [2.4.0] - 2015-11-24 +### Changed +- Added support for PHP 7 anonymous classes + - Anonymous classes are now tokenized as T_ANON_CLASS and ignored by normal class sniffs +- Added support for PHP 7 function return type declarations + - Return types are now tokenized as T_RETURN_TYPE +- Fixed tokenizing of the XOR operator, which was incorrectly identified as a power operator (bug #765) + - The T_POWER token has been removed and replaced by the T_BITWISE_XOR token + - The PHP-supplied T_POW token has been replicated for PHP versions before 5.6 +- Traits are now tokenized in PHP versions before 5.4 to make testing easier +- Improved regular expression detection in JS files +- PEAR FunctionCallSignatureSniff now properly detects indents in more mixed HTML/PHP code blocks +- Full report now properly indents lines when newlines are found inside error messages +- Generating documentation without specifying a standard now uses the default standard instead + - Thanks to Ken Guest for the patch +- Generic InlineControlStructureSniff now supports braceless do/while loops in JS + - Thanks to Pieter Frenssen for the patch +- Added more guard code for function declarations with syntax errors + - Thanks to Yun Young-jin for the patch +- Added more guard code for foreach declarations with syntax errors + - Thanks to Johan de Ruijter for the patch +- Added more guard code for class declarations with syntax errors +- Squiz ArrayDeclarationSniff now has guard code for arrays with syntax errors +- Generic InlineControlStructureSniff now correctly fixes ELSEIF statements + +### Fixed +- Fixed bug #601 : Expected type hint int[]; found array in Squiz FunctionCommentSniff + - Thanks to Scato Eggen for the patch +- Fixed bug #625 : Consider working around T_HASHBANG in HHVM 3.5.x and 3.6.x + - Thanks to Kunal Mehta for the patch +- Fixed bug #692 : Comment tokenizer can break when using mbstring function overloading +- Fixed bug #694 : Long sniff codes can cause PHP warnings in source report when showing error codes +- Fixed bug #698 : PSR2.Methods.FunctionCallSignature.Indent forces exact indent of ternary operator parameters +- Fixed bug #704 : ScopeIndent can fail when an opening parenthesis is on a line by itself +- Fixed bug #707 : Squiz MethodScopeSniff doesn't handle nested functions +- Fixed bug #709 : Squiz.Sniffs.Whitespace.ScopeClosingBraceSniff marking indented endif in mixed inline HTML blocks +- Fixed bug #711 : Sniffing from STDIN shows Generic.Files.LowercasedFilename.NotFound error +- Fixed bug #714 : Fixes suppression of errors using docblocks + - Thanks to Andrzej Karmazyn for the patch +- Fixed bug #716 : JSON report is invalid when messages contain newlines or tabs + - Thanks to Pieter Frenssen for the patch +- Fixed bug #723 : ScopeIndent can fail when multiple array closers are on the same line +- Fixed bug #730 : ScopeIndent can fail when a short array opening square bracket is on a line by itself +- Fixed bug #732 : PHP Notice if @package name is made up of all invalid characters + - Adds new error code PEAR.Commenting.FileComment.InvalidPackageValue +- Fixed bug #748 : Auto fix for Squiz.Commenting.BlockComment.WrongEnd is incorrect + - Thanks to J.D. Grimes for the patch +- Fixed bug #753 : PSR2 standard shouldn't require space after USE block when next code is a closing tag +- Fixed bug #768 : PEAR FunctionCallSignature sniff forbids comments after opening parenthesis of a multiline call +- Fixed bug #769 : Incorrect detection of variable reference operator when used with short array syntax + - Thanks to Klaus Purer for the patch +- Fixed bug #772 : Syntax error when using PHPCBF on alternative style foreach loops +- Fixed bug #773 : Syntax error when stripping trailing PHP close tag and previous statement has no semicolon +- Fixed bug #778 : PHPCBF creates invalid PHP for inline FOREACH containing multiple control structures +- Fixed bug #781 : Incorrect checking for PHP7 return types on multi-line function declarations +- Fixed bug #782 : Conditional function declarations cause fixing conflicts in Squiz standard + - Squiz.ControlStructures.ControlSignature no longer enforces a single newline after open brace + - Squiz.WhiteSpace.ControlStructureSpacing can be used to check spacing at the start/end of control structures + +## [2.3.4] - 2015-09-09 +### Changed +- JSON report format now includes the fixable status for each error message and the total number of fixable errors +- Added more guard code for function declarations with syntax errors +- Added tokenizer support for the PHP declare construct + - Thanks to Andy Blyler for the patch +- Generic UnnecessaryStringConcatSniff can now allow strings concatenated over multiple lines + - Set the allowMultiline property to TRUE (default is FALSE) in your ruleset.xml file to enable this + - By default, concat used only for getting around line length limits still generates an error + - Thanks to Stefan Lenselink for the contribution +- Invalid byte sequences no longer throw iconv_strlen() errors (request #639) + - Thanks to Willem Stuursma for the patch +- Generic TodoSniff and FixmeSniff are now better at processing strings with invalid characters +- PEAR FunctionCallSignatureSniff now ignores indentation of inline HTML content +- Squiz ControlSignatureSniff now supports control structures with only inline HTML content + +### Fixed +- Fixed bug #636 : Some class names cause CSS tokenizer to hang +- Fixed bug #638 : VCS blame reports output error content from the blame commands for files not under VC +- Fixed bug #642 : Method params incorrectly detected when default value uses short array syntax + - Thanks to Josh Davis for the patch +- Fixed bug #644 : PEAR ScopeClosingBrace sniff does not work with mixed HTML/PHP +- Fixed bug #645 : FunctionSignature and ScopeIndent sniffs don't detect indents correctly when PHP open tag is not on a line by itself +- Fixed bug #648 : Namespace not tokenized correctly when followed by multiple use statements +- Fixed bug #654 : Comments affect indent check for BSDAllman brace style +- Fixed bug #658 : Squiz.Functions.FunctionDeclarationSpacing error for multi-line declarations with required spaces greater than zero + - Thanks to J.D. Grimes for the patch +- Fixed bug #663 : No space after class name generates: Class name "" is not in camel caps format +- Fixed bug #667 : Scope indent check can go into infinite loop due to some parse errors +- Fixed bug #670 : Endless loop in PSR1 SideEffects sniffer if no semicolon after last statement + - Thanks to Thomas Jarosch for the patch +- Fixed bug #672 : Call-time pass-by-reference false positive +- Fixed bug #683 : Comments are incorrectly reported by PSR2.ControlStructures.SwitchDeclaration sniff +- Fixed bug #687 : ScopeIndent does not check indent correctly for method prefixes like public and abstract +- Fixed bug #689 : False error on some comments after class closing brace + +## [2.3.3] - 2015-06-24 +### Changed +- Improved the performance of the CSS tokenizer, especially on very large CSS files (thousands of lines) + - Thanks to Klaus Purer for the patch +- Defined tokens for lower PHP versions are now phpcs-specific strings instead of ints + - Stops conflict with other projects, like PHP_CodeCoverage +- Added more guard code for syntax errors to various sniffs +- Improved support for older HHVM versions + - Thanks to Kunal Mehta for the patch +- Squiz ValidLogicalOperatorsSniff now ignores XOR as type casting is different when using the ^ operator (request #567) +- Squiz CommentedOutCodeSniff is now better at ignoring URLs inside comments +- Squiz ControlSignatureSniff is now better at checking embedded PHP code +- Squiz ScopeClosingBraceSniff is now better at checking embedded PHP code + +### Fixed +- Fixed bug #584 : Squiz.Arrays.ArrayDeclaration sniff gives incorrect NoComma error for multiline string values +- Fixed bug #589 : PEAR.Functions.FunctionCallSignature sniff not checking all function calls +- Fixed bug #592 : USE statement tokenising can sometimes result in mismatched scopes +- Fixed bug #594 : Tokenizer issue on closure that returns by reference +- Fixed bug #595 : Colons in CSS selectors within media queries throw false positives + - Thanks to Klaus Purer for the patch +- Fixed bug #598 : PHPCBF can break function/use closure brace placement +- Fixed bug #603 : Squiz ControlSignatureSniff hard-codes opener type while fixing +- Fixed bug #605 : Auto report-width specified in ruleset.xml ignored +- Fixed bug #611 : Invalid numeric literal on CSS files under PHP7 +- Fixed bug #612 : Multi-file diff generating incorrectly if files do not end with EOL char +- Fixed bug #615 : Squiz OperatorBracketSniff incorrectly reports and fixes operations using self:: +- Fixed bug #616 : Squiz DisallowComparisonAssignmentSniff inconsistent errors with inline IF statements +- Fixed bug #617 : Space after switch keyword in PSR-2 is not being enforced +- Fixed bug #621 : PSR2 SwitchDeclaration sniff doesn't detect, or correctly fix, case body on same line as statement + +## [2.3.2] - 2015-04-29 +### Changed +- The error message for PSR2.ControlStructures.SwitchDeclaration.WrongOpenercase is now clearer (request #579) + +### Fixed +- Fixed bug #545 : Long list of CASE statements can cause tokenizer to reach a depth limit +- Fixed bug #565 : Squiz.WhiteSpace.OperatorSpacing reports negative number in short array + - Thanks to Vašek Purchart for the patch + - Same fix also applied to Squiz.Formatting.OperatorBracket +- Fixed bug #569 : Generic ScopeIndentSniff throws PHP notices in JS files +- Fixed bug #570 : Phar class fatals in PHP less than 5.3 + +## [2.3.1] - 2015-04-23 +### Changed +- PHPCS can now exit with 0 even if errors are found + - Set the ignore_errors_on_exit config variable to 1 to set this behaviour + - Use with the ignore_warnings_on_exit config variable to never return a non-zero exit code +- Added Generic DisallowLongArraySyntaxSniff to enforce the use of the PHP short array syntax (request #483) + - Thanks to Xaver Loppenstedt for helping with tests +- Added Generic DisallowShortArraySyntaxSniff to ban the use of the PHP short array syntax (request #483) + - Thanks to Xaver Loppenstedt for helping with tests +- Generic ScopeIndentSniff no longer does exact checking for content inside parenthesis (request #528) + - Only applies to custom coding standards that set the "exact" flag to TRUE +- Squiz ConcatenationSpacingSniff now has a setting to ignore newline characters around operators (request #511) + - Default remains FALSE, so newlines are not allowed + - Override the "ignoreNewlines" setting in a ruleset.xml file to change +- Squiz InlineCommentSniff no longer checks the last char of a comment if the first char is not a letter (request #505) +- The Squiz standard has increased the max padding for statement alignment from 12 to 20 + +### Fixed +- Fixed bug #479 : Yielded values are not recognised as returned values in Squiz FunctionComment sniff +- Fixed bug #512 : Endless loop whilst parsing mixture of control structure styles +- Fixed bug #515 : Spaces in JS block incorrectly flagged as indentation error +- Fixed bug #523 : Generic ScopeIndent errors for IF in FINALLY +- Fixed bug #527 : Closure inside IF statement is not tokenized correctly +- Fixed bug #529 : Squiz.Strings.EchoedStrings gives false positive when echo'ing using an inline condition +- Fixed bug #537 : Using --config-set is breaking phpcs.phar +- Fixed bug #543 : SWITCH with closure in condition generates inline control structure error +- Fixed bug #551 : Multiple catch blocks not checked in Squiz.ControlStructures.ControlSignature sniff +- Fixed bug #554 : ScopeIndentSniff causes errors when encountering an unmatched parenthesis +- Fixed bug #558 : PHPCBF adds brace for ELSE IF split over multiple lines +- Fixed bug #564 : Generic MultipleStatementAlignment sniff reports incorrect errors for multiple assignments on a single line + +## [2.3.0] - 2015-03-04 +### Changed +- The existence of the main config file is now cached to reduce is_file() calls when it doesn't exist (request #486) +- Abstract classes inside the Sniffs directory are now ignored even if they are named [Name]Sniff.php (request #476) + - Thanks to David Vernet for the patch +- PEAR and Squiz FileComment sniffs no longer have @ in their error codes + - e.g., PEAR.Commenting.FileComment.Duplicate@categoryTag becomes PEAR.Commenting.FileComment.DuplicateCategoryTag + - e.g., Squiz.Commenting.FileComment.Missing@categoryTag becomes Squiz.Commenting.FileComment.MissingCategoryTag +- PEAR MultiLineConditionSniff now allows comment lines inside multi-line IF statement conditions + - Thanks to Klaus Purer for the patch +- Generic ForbiddenFunctionsSniff now supports setting null replacements in ruleset files (request #263) +- Generic opening function brace sniffs now support checking of closures + - Set the checkClosures property to TRUE (default is FALSE) in your ruleset.xml file to enable this + - Can also set the checkFunctions property to FALSE (default is TRUE) in your ruleset.xml file to only check closures + - Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff +- Generic OpeningFunctionBraceKernighanRitchieSniff can now fix all the errors it finds +- Generic OpeningFunctionBraceKernighanRitchieSniff now allows empty functions with braces next to each other +- Generic OpeningFunctionBraceBsdAllmanSniff now allows empty functions with braces next to each other +- Improved auto report width for the "full" report +- Improved conflict detection during auto fixing +- Generic ScopeIndentSniff is no longer confused by empty closures +- Squiz ControlSignatureSniff now always ignores comments (fixes bug #490) + - Include the Squiz.Commenting.PostStatementComment sniff in your ruleset.xml to ban these comments again +- Squiz OperatorSpacingSniff no longer throws errors for code in the form ($foo || -1 === $bar) +- Fixed errors tokenizing T_ELSEIF tokens on HHVM 3.5 +- Squiz ArrayDeclarationSniff is no longer tricked by comments after array values +- PEAR IncludingFileSniff no longer produces invalid code when removing parenthesis from require/include statements + +### Fixed +- Fixed bug #415 : The @codingStandardsIgnoreStart has no effect during fixing +- Fixed bug #432 : Properties of custom sniffs cannot be configured +- Fixed bug #453 : PSR2 standard does not allow closing tag for mixed PHP/HTML files +- Fixed bug #457 : FunctionCallSignature sniffs do not support here/nowdoc syntax and can cause syntax error when fixing +- Fixed bug #466 : PropertyLabelSpacing JS fixer issue when there is no space after colon +- Fixed bug #473 : Writing a report for an empty folder to existing file includes the existing contents +- Fixed bug #485 : PHP notice in Squiz.Commenting.FunctionComment when checking malformed @throws comment +- Fixed bug #491 : Generic InlineControlStructureSniff can correct with missing semicolon + - Thanks to Jesse Donat for the patch +- Fixed bug #492 : Use statements don't increase the scope indent +- Fixed bug #493 : PSR1_Sniffs_Methods_CamelCapsMethodNameSniff false positives for some magic method detection + - Thanks to Andreas Möller for the patch +- Fixed bug #496 : Closures in PSR2 are not checked for a space after the function keyword +- Fixed bug #497 : Generic InlineControlStructureSniff does not support alternative SWITCH syntax +- Fixed bug #500 : Functions not supported as values in Squiz ArrayDeclaration sniff +- Fixed bug #501 : ScopeClosingBrace and ScopeIndent conflict with closures used as array values + - Generic ScopeIndentSniff may now report fewer errors for closures, but perform the same fixes +- Fixed bug #502 : PSR1 SideEffectsSniff sees declare() statements as side effects + +## [2.2.0] - 2015-01-22 +### Changed +- Added (hopefully) tastefully used colors to report and progress output for the phpcs command + - Use the --colors command line argument to use colors in output + - Use the command "phpcs --config-set colors true" to turn colors on by default + - Use the --no-colors command line argument to turn colors off when the config value is set +- Added support for using the full terminal width for report output + - Use the --report-width=auto command line argument to auto-size the reports + - Use the command "phpcs --config-set report_width auto" to use auto-sizing by default +- Reports will now size to fit inside the report width setting instead of always using padding to fill the space +- If no files or standards are specified, PHPCS will now look for a phpcs.xml file in the current directory + - This file has the same format as a standard ruleset.xml file + - The phpcs.xml file should specify (at least) files to process and a standard/sniffs to use + - Useful for running the phpcs and phpcbf commands without any arguments at the top of a repository +- Default file paths can now be specified in a ruleset.xml file using the "file" tag + - File paths are only processed if no files were specified on the command line +- Extensions specified on the CLI are now merged with those set in ruleset.xml files + - Previously, the ruleset.xml file setting replaced the CLI setting completely +- Squiz coding standard now requires lowercase PHP constants (true, false and null) + - Removed Squiz.NamingConventions.ConstantCase sniff as the rule is now consistent across PHP and JS files +- Squiz FunctionOpeningBraceSpaceSniff no longer does additional checks for JS functions + - PHP and JS functions and closures are now treated the same way +- Squiz MultiLineFunctionDeclarationSniff now supports JS files +- Interactive mode no longer breaks if you also specify a report type on the command line +- PEAR InlineCommentSniff now fixes the Perl-style comments that it finds (request #375) +- PSR2 standard no longer fixes the placement of docblock open tags as comments are excluded from this standard +- PSR2 standard now sets a default tab width of 4 spaces +- Generic DocCommentSniff now only disallows lowercase letters at the start of a long/short comment (request #377) + - All non-letter characters are now allowed, including markdown special characters and numbers +- Generic DisallowMultipleStatementsSniff now allows multiple open/close tags on the same line (request #423) +- Generic CharacterBeforePHPOpeningTagSniff now only checks the first PHP tag it finds (request #423) +- Generic CharacterBeforePHPOpeningTagSniff now allows a shebang line at the start of the file (request #20481) +- Generic InlineHTMLUnitTest now allows a shebang line at the start of the file (request #20481) +- PEAR ObjectOperatorIndentSniff now only checks object operators at the start of a line +- PEAR FileComment and ClassComment sniffs no longer have @ in their error codes + - E.g., PEAR.Commenting.FileComment.Missing@categoryTag becomes PEAR.Commenting.FileComment.MissingCategoryTag + - Thanks to Grzegorz Rygielski for the patch +- Squiz ControlStructureSpacingSniff no longer enforces a blank line before CATCH statements +- Squiz FunctionCommentSniff now fixes the return type in the @return tag (request #392) +- Squiz BlockCommentSniff now only disallows lowercase letters at the start of the comment +- Squiz InlineCommentSniff now only disallows lowercase letters at the start of the comment +- Squiz OperatorSpacingSniff now has a setting to ignore newline characters around operators (request #348) + - Default remains FALSE, so newlines are not allowed + - Override the "ignoreNewlines" setting in a ruleset.xml file to change +- PSR2 ControlStructureSpacingSniff now checks for, and fixes, newlines after the opening parenthesis +- Added a markdown document generator (--generator=markdown to use) + - Thanks to Stefano Kowalke for the contribution + +### Fixed +- Fixed bug #379 : Squiz.Arrays.ArrayDeclaration.NoCommaAfterLast incorrectly detects comments +- Fixed bug #382 : JS tokenizer incorrect for inline conditionally created immediately invoked anon function +- Fixed bug #383 : Squiz.Arrays.ArrayDeclaration.ValueNoNewline incorrectly detects nested arrays +- Fixed bug #386 : Undefined offset in Squiz.FunctionComment sniff when param has no comment +- Fixed bug #390 : Indentation of non-control structures isn't adjusted when containing structure is fixed +- Fixed bug #400 : InlineControlStructureSniff fails to fix when statement has no semicolon +- Fixed bug #401 : PHPCBF no-patch option shows an error when there are no fixable violations in a file +- Fixed bug #405 : The "Squiz.WhiteSpace.FunctionSpacing" sniff removes class "}" during fixing +- Fixed bug #407 : PEAR.ControlStructures.MultiLineCondition doesn't account for comments at the end of lines +- Fixed bug #410 : The "Squiz.WhiteSpace.MemberVarSpacing" not respecting "var" +- Fixed bug #411 : Generic.WhiteSpace.ScopeIndent.Incorrect - false positive with multiple arrays in argument list +- Fixed bug #412 : PSR2 multi-line detection doesn't work for inline IF and string concats +- Fixed bug #414 : Squiz.WhiteSpace.MemberVarSpacing - inconsistent checking of member vars with comment +- Fixed bug #433 : Wrong detection of Squiz.Arrays.ArrayDeclaration.KeyNotAligned when key contains space +- Fixed bug #434 : False positive for spacing around "=>" in inline array within foreach +- Fixed bug #452 : Ruleset exclude-pattern for specific sniff code ignored when using CLI --ignore option +- Fixed bug #20482 : Scope indent sniff can get into infinite loop when processing a parse error + +## [2.1.0] - 2014-12-18 +### Changed +- Time and memory output is now shown if progress information is also shown (request #335) +- A tilde can now be used to reference a user's home directory in a path to a standard (request #353) +- Added PHP_CodeSniffer_File::findStartOfStatement() to find the first non-whitespace token in a statement + - Possible alternative for code using PHP_CodeSniffer_File::findPrevious() with the local flag set +- Added PHP_CodeSniffer_File::findEndOfStatement() to find the last non-whitespace token in a statement + - Possible alternative for code using PHP_CodeSniffer_File::findNext() with the local flag set +- Generic opening function brace sniffs now ensure the opening brace is the last content on the line + - Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff + - Also enforced in PEAR FunctionDeclarationSniff and Squiz MultiLineFunctionDeclarationSniff +- Generic DisallowTabIndentSniff now replaces tabs everywhere it finds them, except in strings and here/now docs +- Generic EmptyStatementSniff error codes now contain the type of empty statement detected (request #314) + - All messages generated by this sniff are now errors (empty CATCH was previously a warning) + - Message code Generic.CodeAnalysis.EmptyStatement.NotAllowed has been removed + - Message code Generic.CodeAnalysis.EmptyStatement.NotAllowedWarning has been removed + - New message codes have the format Generic.CodeAnalysis.EmptyStatement.Detected[TYPE] + - Example code is Generic.CodeAnalysis.EmptyStatement.DetectedCATCH + - You can now use a custom ruleset to change messages to warnings and to exclude them +- PEAR and Squiz FunctionCommentSniffs no longer ban @return tags for constructors and destructors + - Removed message PEAR.Commenting.FunctionComment.ReturnNotRequired + - Removed message Squiz.Commenting.FunctionComment.ReturnNotRequired + - Change initiated by request #324 and request #369 +- Squiz EmptyStatementSniff has been removed + - Squiz standard now includes Generic EmptyStatementSniff and turns off the empty CATCH error +- Squiz ControlSignatureSniff fixes now retain comments between the closing parenthesis and open brace +- Squiz SuperfluousWhitespaceSniff now checks for extra blank lines inside closures + - Thanks to Sertan Danis for the patch +- Squiz ArrayDeclarationSniff now skips function calls while checking multi-line arrays + +### Fixed +- Fixed bug #337 : False positive with anonymous functions in Generic_Sniffs_WhiteSpace_ScopeIndentSniff +- Fixed bug #339 : reformatting brace location can result in broken code +- Fixed bug #342 : Nested ternary operators not tokenized correctly +- Fixed bug #345 : Javascript regex not tokenized when inside array +- Fixed bug #346 : PHP path can't be determined in some cases in "phpcs.bat" (on Windows XP) +- Fixed bug #358 : False positives for Generic_Sniffs_WhiteSpace_ScopeIndentSniff +- Fixed bug #361 : Sniff-specific exclude patterns don't work for Windows +- Fixed bug #364 : Don't interpret "use function" as declaration +- Fixed bug #366 : phpcbf with PSR2 errors on control structure alternative syntax +- Fixed bug #367 : Nested Anonymous Functions Causing False Negative +- Fixed bug #371 : Shorthand binary cast causes tokenizer errors + - New token T_BINARY_CAST added for the b"string" cast format (the 'b' is the T_BINARY_CAST token) +- Fixed bug #372 : phpcbf parse problem, wrong brace placement for inline IF +- Fixed bug #373 : Double quote usage fix removing too many double quotes +- Fixed bug #20196 : 1.5.2 breaks scope_closer position + +## [2.0.0] - 2014-12-05 +### Changed +- JS tokenizer now sets functions as T_CLOSUREs if the function is anonymous +- JS tokenizer now sets all objects to T_OBJECT + - Object end braces are set to a new token T_CLOSE_OBJECT + - T_OBJECT tokens no longer act like scopes; i.e., they have no condition/opener/closer + - T_PROPERTY tokens no longer act like scopes; i.e., they have no condition/opener/closer + - T_OBJECT tokens have a bracket_closer instead, which can be used to find the ending + - T_CLOSE_OBJECT tokens have a bracket_opener +- Improved regular expression detection in the JS tokenizer +- You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment + - When the comment is found, the comment line and the following line will be ignored + - Thanks to Andy Bulford for the contribution +- PHPCBF now prints output when it is changing into directories +- Improved conflict detection during auto fixing +- The -vvv command line argument will now output the current file content for each loop during fixing +- Generic ScopeIndentSniff now checks that open/close PHP tags are aligned to the correct column +- PEAR FunctionCallSignatureSniff now checks indent of closing parenthesis even if it is not on a line by itself +- PEAR FunctionCallSignatureSniff now supports JS files +- PEAR MultiLineConditionSniff now supports JS files +- Squiz DocCommentAlignmentSniff now supports JS files +- Fixed a problem correcting the closing brace line in Squiz ArrayDeclarationSniff +- Fixed a problem auto-fixing the Squiz.WhiteSpace.FunctionClosingBraceSpace.SpacingBeforeNestedClose error +- Squiz EmbeddedPhpSniff no longer reports incorrect alignment of tags when they are not on new lines +- Squiz EmbeddedPhpSniff now aligns open tags correctly when moving them onto a new line +- Improved fixing of arrays with multiple values in Squiz ArrayDeclarationSniff +- Improved detection of function comments in Squiz FunctionCommentSpacingSniff +- Improved fixing of lines after cases statements in Squiz SwitchDeclarationSniff + +### Fixed +- Fixed bug #311 : Suppression of function prototype breaks checking of lines within function +- Fixed bug #320 : Code sniffer indentation issue +- Fixed bug #333 : Nested ternary operators causing problems + +## [1.5.6] - 2014-12-05 +### Changed +- JS tokenizer now detects xor statements correctly +- The --config-show command now pretty-prints the config values + - Thanks to Ken Guest for the patch +- Setting and removing config values now catches exceptions if the config file is not writable + - Thanks to Ken Guest for the patch +- Setting and removing config values now prints a message to confirm the action and show old values +- You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment + - When the comment is found, the comment line and the following line will be ignored + - Thanks to Andy Bulford for the contribution +- Generic ConstructorNameSniff no longer errors for PHP4 style constructors when __construct() is present + - Thanks to Thibaud Fabre for the patch + +### Fixed +- Fixed bug #280 : The --config-show option generates error when there is no config file +- Fixed bug #306 : File containing only a namespace declaration raises undefined index notice +- Fixed bug #308 : Squiz InlineIfDeclarationSniff fails on ternary operators inside closure +- Fixed bug #310 : Variadics not recognized by tokenizer +- Fixed bug #311 : Suppression of function prototype breaks checking of lines within function + +## [2.0.0RC4] - 2014-11-07 +### Changed +- JS tokenizer now detects xor statements correctly +- Improved detection of properties and objects in the JS tokenizer +- Generic ScopeIndentSniff can now fix indents using tabs instead of spaces + - Set the tabIndent property to TRUE in your ruleset.xml file to enable this + - It is important to also set a tab-width setting, either in the ruleset or on the command line, for accuracy +- Generic ScopeIndentSniff now checks and auto-fixes JS files +- Generic DisallowSpaceIndentSniff is now able to replace space indents with tab indents during fixing +- Support for phpcs-only and phpcbf-only attributes has been added to all ruleset.xml elements + - Allows parts of the ruleset to only apply when using a specific tool + - Useful for doing things like excluding indent fixes but still reporting indent errors +- Unit tests can now set command line arguments during a test run + - Override getCliValues() and pass an array of CLI arguments for each file being tested +- File-wide sniff properties can now be set using T_INLINE_HTML content during unit test runs + - Sniffs that start checking at the open tag can only, normally, have properties set using a ruleset +- Generic ConstructorNameSniff no longer errors for PHP4 style constructors when __construct() is present + - Thanks to Thibaud Fabre for the patch +- Generic DocCommentSniff now checks that the end comment tag is on a new line +- Generic MultipleStatementAlignmentSniff no longer skips assignments for closures +- Squiz DocCommentAlignment sniff now has better checking for single line doc block +- Running unit tests with the -v CLI argument no longer generates PHP errors + +### Fixed +- Fixed bug #295 : ScopeIndentSniff hangs when processing nested closures +- Fixed bug #298 : False positive in ScopeIndentSniff when anonymous functions are used with method chaining +- Fixed bug #302 : Fixing code in Squiz InlineComment sniff can remove some comment text +- Fixed bug #303 : Open and close tag on same line can cause a PHP notice checking scope indent +- Fixed bug #306 : File containing only a namespace declaration raises undefined index notice +- Fixed bug #307 : Conditional breaks in case statements get incorrect indentations +- Fixed bug #308 : Squiz InlineIfDeclarationSniff fails on ternary operators inside closure +- Fixed bug #310 : Variadics not recognized by tokenizer + +## [2.0.0RC3] - 2014-10-16 +### Changed +- Improved default output for PHPCBF and removed the options to print verbose and progress output +- If a .fixed file is supplied for a unit test file, the auto fixes will be checked against it during testing + - See Generic ScopeIndentUnitTest.inc and ScopeIndentUnitTest.inc.fixed for an example +- Fixer token replacement methods now return TRUE if the change was accepted and FALSE if rejected +- The --config-show command now pretty-prints the config values + - Thanks to Ken Guest for the patch +- Setting and removing config values now catches exceptions if the config file is not writable + - Thanks to Ken Guest for the patch +- Setting and removing config values now prints a message to confirm the action and show old values +- Generic ScopeIndentSniff has been completely rewritten to improve fixing and embedded PHP detection +- Generic DisallowTabIndent and DisallowSpaceIndent sniffs now detect indents at the start of block comments +- Generic DisallowTabIndent and DisallowSpaceIndent sniffs now detect indents inside multi-line strings +- Generic DisallowTabIndentSniff now replaces tabs inside doc block comments +- Squiz ControlStructureSpacingSniff error codes have been corrected; they were reversed +- Squiz EmbeddedPhpSniff now checks open and close tag indents and fixes some errors +- Squiz FileCommentSniff no longer throws incorrect blank line before comment errors in JS files +- Squiz ClassDeclarationSniff now has better checking for blank lines after a closing brace +- Removed error Squiz.Classes.ClassDeclaration.NoNewlineAfterCloseBrace (request #285) + - Already handled by Squiz.Classes.ClassDeclaration.CloseBraceSameLine + +### Fixed +- Fixed bug #280 : The --config-show option generates error when there is no config file + +## [2.0.0RC2] - 2014-09-26 +### Changed +- Minified JS and CSS files are now detected and skipped (fixes bug #252 and bug #19899) + - A warning will be added to the file so it can be found in the report and ignored in the future +- Fixed incorrect length of JS object operator tokens +- PHP tokenizer no longer converts class/function names to special tokens types + - Class/function names such as parent and true would become special tokens such as T_PARENT and T_TRUE +- PHPCS can now exit with 0 if only warnings were found (request #262) + - Set the ignore_warnings_on_exit config variable to 1 to set this behaviour + - Default remains at exiting with 0 only if no errors and no warnings were found + - Also changes return value of PHP_CodeSniffer_Reporting::printReport() +- Rulesets can now set associative array properties + - property name="[property]" type="array" value="foo=>bar,baz=>qux" +- Generic ForbiddenFunctionsSniff now has a public property called forbiddenFunctions (request #263) + - Override the property in a ruleset.xml file to define forbidden functions and their replacements + - A replacement of NULL indicates that no replacement is available + - e.g., value="delete=>unset,print=>echo,create_function=>null" + - Custom sniffs overriding this one will need to change the visibility of their member var +- Improved closure support in Generic ScopeIndentSniff +- Improved indented PHP tag support in Generic ScopeIndentSniff +- Improved fixing of mixed line indents in Generic ScopeIndentSniff +- Added conflict detection to the file fixer + - If 2 sniffs look to be conflicting, one change will be ignored to allow a fix to occur +- Generic CamelCapsFunctionNameSniff now ignores a single leading underscore + - Thanks to Alex Slobodiskiy for the patch +- Standards can now be located within hidden directories (further fix for bug #20323) + - Thanks to Klaus Purer for the patch +- Sniff ignore patterns now replace Win dir separators like file ignore patterns already did +- Exclude patterns now use backtick delimiters, allowing all special characters to work correctly again + - Thanks to Jeremy Edgell for the patch +- Errors converted to warnings in a ruleset (and vice versa) now retain their fixable status + - Thanks to Alexander Obuhovich for the patch +- Squiz ConcatenationSpacingSniff now has a setting to specify how many spaces there should around concat operators + - Default remains at 0 + - Override the "spacing" setting in a ruleset.xml file to change +- Added auto-fixes for Squiz InlineCommentSniff +- Generic DocCommentSniff now correctly fixes additional blank lines at the end of a comment +- Squiz OperatorBracketSniff now correctly fixes operations that include arrays +- Zend ClosingTagSniff fix now correctly leaves closing tags when followed by HTML +- Added Generic SyntaxSniff to check for syntax errors in PHP files + - Thanks to Blaine Schmeisser for the contribution +- Added Generic OneTraitPerFileSniff to check that only one trait is defined in each file + - Thanks to Alexander Obuhovich for the contribution +- Squiz DiscouragedFunctionsSniff now warns about var_dump() +- PEAR ValidFunctionNameSniff no longer throws an error for _() +- Squiz and PEAR FunctionCommentSniffs now support _() +- Generic DisallowTabIndentSniff now checks for, and fixes, mixed indents again +- Generic UpperCaseConstantSniff and LowerCaseConstantSniff now ignore function names + +### Fixed +- Fixed bug #243 : Missing DocBlock not detected +- Fixed bug #248 : FunctionCommentSniff expects ampersand on param name +- Fixed bug #265 : False positives with type hints in ForbiddenFunctionsSniff +- Fixed bug #20373 : Inline comment sniff tab handling way +- Fixed bug #20377 : Error when trying to execute phpcs with report=json +- Fixed bug #20378 : Report appended to existing file if no errors found in run +- Fixed bug #20381 : Invalid "Comment closer must be on a new line" + - Thanks to Brad Kent for the patch +- Fixed bug #20402 : SVN pre-commit hook fails due to unknown argument error + +## [1.5.5] - 2014-09-25 +### Changed +- PHP tokenizer no longer converts class/function names to special tokens types + - Class/function names such as parent and true would become special tokens such as T_PARENT and T_TRUE +- Improved closure support in Generic ScopeIndentSniff +- Improved indented PHP tag support in Generic ScopeIndentSniff +- Generic CamelCapsFunctionNameSniff now ignores a single leading underscore + - Thanks to Alex Slobodiskiy for the patch +- Standards can now be located within hidden directories (further fix for bug #20323) + - Thanks to Klaus Purer for the patch +- Added Generic SyntaxSniff to check for syntax errors in PHP files + - Thanks to Blaine Schmeisser for the contribution +- Squiz DiscouragedFunctionsSniff now warns about var_dump() +- PEAR ValidFunctionNameSniff no longer throws an error for _() +- Squiz and PEAR FunctionCommentSnif now support _() +- Generic UpperCaseConstantSniff and LowerCaseConstantSniff now ignore function names + +### Fixed +- Fixed bug #248 : FunctionCommentSniff expects ampersand on param name +- Fixed bug #265 : False positives with type hints in ForbiddenFunctionsSniff +- Fixed bug #20373 : Inline comment sniff tab handling way +- Fixed bug #20378 : Report appended to existing file if no errors found in run +- Fixed bug #20381 : Invalid "Comment closer must be on a new line" + - Thanks to Brad Kent for the patch +- Fixed bug #20386 : Squiz.Commenting.ClassComment.SpacingBefore thrown if first block comment + +## [2.0.0RC1] - 2014-08-06 +### Changed +- PHPCBF will now fix incorrect newline characters in a file +- PHPCBF now exists cleanly when there are no errors to fix +- Added phpcbf.bat file for Windows +- Verbose option no longer errors when using a phar file with a space in the path +- Fixed a reporting error when using HHVM + - Thanks to Martins Sipenko for the patch +- addFixableError() and addFixableWarning() now only return true if the fixer is enabled + - Saves checking ($phpcsFile->fixer->enabled === true) before every fix +- Added addErrorOnLine() and addWarningOnLine() to add a non-fixable violation to a line at column 1 + - Useful if you are generating errors using an external tool or parser and only know line numbers + - Thanks to Ondřej Mirtes for the patch +- CSS tokenizer now identifies embedded PHP code using the new T_EMBEDDED_PHP token type + - The entire string of PHP is contained in a single token +- PHP tokenizer contains better detection of short array syntax +- Unit test runner now also test any standards installed under the installed_paths config var +- Exclude patterns now use {} delimiters, allowing the | special character to work correctly again +- The filtering component of the --extensions argument is now ignored again when passing filenames + - Can still be used to specify a custom tokenizer for each extension when passing filenames + - If no tokenizer is specified, default values will be used for common file extensions +- Diff report now produces relative paths on Windows, where possible (further fix for bug #20234) +- If a token's content has been modified by the tab-width setting, it will now have an orig_content in the tokens array +- Generic DisallowSpaceIndent and DisallowTabIndent sniffs now check original indent content even when tab-width is set + - Previously, setting --tab-width would force both to check the indent as spaces +- Fixed a problem where PHPCBF could replace tabs with too many spaces when changing indents +- Fixed a problem that could occur with line numbers when using HHVM to check files with Windows newline characters +- Removed use of sys_get_temp_dir() as this is not supported by the min PHP version +- Squiz ArrayDeclarationSniff now supports short array syntax +- Squiz ControlSignatureSniff no longer uses the Abstract Pattern sniff + - If you are extending this sniff, you'll need to rewrite your code + - The rewrite allows this sniff to fix all control structure formatting issues it finds +- The installed_paths config var now accepts relative paths + - The paths are relative to the PHP_CodeSniffer install directory + - Thanks to Weston Ruter for the patch +- Generic ScopeIndentSniff now accounts for different open tag indents +- PEAR FunctionDeclarationSniff now ignores short arrays when checking indent + - Thanks to Daniel Tschinder for the patch +- PSR2 FunctionCallSignatureSniff now treats multi-line strings as a single-line argument, like arrays and closures + - Thanks to Dawid Nowak for the patch +- PSR2 UseDeclarationSniff now checks for a single space after the USE keyword +- Generic ForbiddenFunctionsSniff now detects calls to functions in the global namespace + - Thanks to Ole Martin Handeland for the patch +- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore namespaces beginning with TRUE/FALSE/NULL + - Thanks to Renan Gonçalves for the patch +- Squiz InlineCommentSniff no longer requires a blank line after post-statement comments (request #20299) +- Squiz SelfMemberReferenceSniff now works correctly with namespaces +- Squiz FunctionCommentSniff is now more relaxed when checking namespaced type hints +- Tab characters are now encoded in abstract pattern errors messages + - Thanks to Blaine Schmeisser for the patch +- Invalid sniff codes passed to --sniffs now show a friendly error message (request #20313) +- Generic LineLengthSniff now shows a warning if the iconv module is disabled (request #20314) +- Source report no longer shows errors if category or sniff names ends in an uppercase error + - Thanks to Jonathan Marcil for the patch + +### Fixed +- Fixed bug #20261 : phpcbf has an endless fixing loop +- Fixed bug #20268 : Incorrect documentation titles in PEAR documentation +- Fixed bug #20296 : new array notion in function comma check fails +- Fixed bug #20297 : phar does not work when renamed it to phpcs +- Fixed bug #20307 : PHP_CodeSniffer_Standards_AbstractVariableSniff analyze traits +- Fixed bug #20308 : Squiz.ValidVariableNameSniff - wrong variable usage +- Fixed bug #20309 : Use "member variable" term in sniff "processMemberVar" method +- Fixed bug #20310 : PSR2 does not check for space after function name +- Fixed bug #20322 : Display rules set to type=error even when suppressing warnings +- Fixed bug #20323 : PHPCS tries to load sniffs from hidden directories +- Fixed bug #20346 : Fixer endless loop with Squiz.CSS sniffs +- Fixed bug #20355 : No sniffs are registered with PHAR on Windows + +## [1.5.4] - 2014-08-06 +### Changed +- Removed use of sys_get_temp_dir() as this is not supported by the min PHP version +- The installed_paths config var now accepts relative paths + - The paths are relative to the PHP_CodeSniffer install directory + - Thanks to Weston Ruter for the patch +- Generic ScopeIndentSniff now accounts for different open tag indents +- PEAR FunctionDeclarationSniff now ignores short arrays when checking indent + - Thanks to Daniel Tschinder for the patch +- PSR2 FunctionCallSignatureSniff now treats multi-line strings as a single-line argument, like arrays and closures + - Thanks to Dawid Nowak for the patch +- Generic ForbiddenFunctionsSniff now detects calls to functions in the global namespace + - Thanks to Ole Martin Handeland for the patch +- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore namespaces beginning with TRUE/FALSE/NULL + - Thanks to Renan Gonçalves for the patch +- Squiz InlineCommentSniff no longer requires a blank line after post-statement comments (request #20299) +- Squiz SelfMemberReferenceSniff now works correctly with namespaces +- Tab characters are now encoded in abstract pattern errors messages + - Thanks to Blaine Schmeisser for the patch +- Invalid sniff codes passed to --sniffs now show a friendly error message (request #20313) +- Generic LineLengthSniff now shows a warning if the iconv module is disabled (request #20314) +- Source report no longer shows errors if category or sniff names ends in an uppercase error + - Thanks to Jonathan Marcil for the patch + +### Fixed +- Fixed bug #20268 : Incorrect documentation titles in PEAR documentation +- Fixed bug #20296 : new array notion in function comma check fails +- Fixed bug #20307 : PHP_CodeSniffer_Standards_AbstractVariableSniff analyze traits +- Fixed bug #20308 : Squiz.ValidVariableNameSniff - wrong variable usage +- Fixed bug #20309 : Use "member variable" term in sniff "processMemberVar" method +- Fixed bug #20310 : PSR2 does not check for space after function name +- Fixed bug #20322 : Display rules set to type=error even when suppressing warnings +- Fixed bug #20323 : PHPCS tries to load sniffs from hidden directories + +## [2.0.0a2] - 2014-05-01 +### Changed +- Added report type --report=info to show information about the checked code to make building a standard easier + - Checks a number of things, such as what line length you use, and spacing are brackets, but not everything + - Still highly experimental +- Generic LineLengthSniff now shows warnings for long lines referring to licence and VCS information + - It previously ignored these lines, but at the expense of performance +- Generic DisallowTabIndent and DisallowSpaceIndent sniffs no longer error when detecting mixed indent types + - Only the first type of indent found on a line (space or indent) is considered +- Lots of little performance improvements that can add up to a substantial saving over large code bases + - Added a "length" array index to tokens so you don't need to call strlen() of them, or deal with encoding + - Can now use isset() to find tokens inside the PHP_CodeSniffer_Tokens static vars instead of in_array() +- Custom reports can now specify a $recordErrors member var; this previously only worked for built-in reports + - When set to FALSE, error messages will not be recorded and only totals will be returned + - This can save significant memory while processing a large code base +- Removed dependence on PHP_Timer +- PHP tokenizer now supports DEFAULT statements opened with a T_SEMICOLON +- The Squiz and PHPCS standards have increased the max padding for statement alignment from 8 to 12 +- Squiz EchoedStringsSniff now supports statements without a semicolon, such as PHP embedded in HTML +- Squiz DoubleQuoteUsageSniff now properly replaces escaped double quotes when fixing a doubled quoted string +- Improved detection of nested IF statements that use the alternate IF/ENDIF syntax +- PSR1 CamelCapsMethodNameSniff now ignores magic methods + - Thanks to Eser Ozvataf for the patch +- PSR1 SideEffectsSniff now ignores methods named define() +- PSR1 and PEAR ClassDeclarationSniffs now support traits (request #20208) +- PSR2 ControlStructureSpacingSniff now allows newlines before/after parentheses + - Thanks to Maurus Cuelenaere for the patch +- PSR2 ControlStructureSpacingSniff now checks TRY and CATCH statements +- Squiz SuperfluousWhitespaceSniff now detects whitespace at the end of block comment lines + - Thanks to Klaus Purer for the patch +- Squiz LowercasePHPFunctionsSniff no longer reports errors for namespaced functions + - Thanks to Max Galbusera for the patch +- Squiz SwitchDeclarationSniff now allows exit() as a breaking statement for case/default +- Squiz ValidVariableNameSniff and Zend ValidVariableNameSniff now ignore additional PHP reserved vars + - Thanks to Mikuláš Dítě and Adrian Crepaz for the patch +- Sniff code Squiz.WhiteSpace.MemberVarSpacing.After changed to Squiz.WhiteSpace.MemberVarSpacing.Incorrect (request #20241) + +### Fixed +- Fixed bug #20200 : Invalid JSON produced with specific error message +- Fixed bug #20204 : Ruleset exclude checks are case sensitive +- Fixed bug #20213 : Invalid error, Inline IF must be declared on single line +- Fixed bug #20225 : array_merge() that takes more than one line generates error +- Fixed bug #20230 : Squiz ControlStructureSpacing sniff assumes specific condition formatting +- Fixed bug #20234 : phpcbf patch command absolute paths +- Fixed bug #20240 : Squiz block comment sniff fails when newline present +- Fixed bug #20247 : The Squiz.WhiteSpace.ControlStructureSpacing sniff and do-while + - Thanks to Alexander Obuhovich for the patch +- Fixed bug #20248 : The Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff sniff and empty scope +- Fixed bug #20252 : Unitialized string offset when package name starts with underscore + +## [1.5.3] - 2014-05-01 +### Changed +- Improved detection of nested IF statements that use the alternate IF/ENDIF syntax +- PHP tokenizer now supports DEFAULT statements opened with a T_SEMICOLON +- PSR1 CamelCapsMethodNameSniff now ignores magic methods + - Thanks to Eser Ozvataf for the patch +- PSR1 SideEffectsSniff now ignores methods named define() +- PSR1 and PEAR ClassDeclarationSniffs now support traits (request #20208) +- PSR2 ControlStructureSpacingSniff now allows newlines before/after parentheses + - Thanks to Maurus Cuelenaere for the patch +- Squiz LowercasePHPFunctionsSniff no longer reports errors for namespaced functions + - Thanks to Max Galbusera for the patch +- Squiz SwitchDeclarationSniff now allows exit() as a breaking statement for case/default +- Squiz ValidVariableNameSniff and Zend ValidVariableNameSniff now ignore additional PHP reserved vars + - Thanks to Mikuláš Dítě and Adrian Crepaz for the patch +- Sniff code Squiz.WhiteSpace.MemberVarSpacing.After changed to Squiz.WhiteSpace.MemberVarSpacing.Incorrect (request #20241) + +### Fixed +- Fixed bug #20200 : Invalid JSON produced with specific error message +- Fixed bug #20204 : Ruleset exclude checks are case sensitive +- Fixed bug #20213 : Invalid error, Inline IF must be declared on single line +- Fixed bug #20225 : array_merge() that takes more than one line generates error +- Fixed bug #20230 : Squiz ControlStructureSpacing sniff assumes specific condition formatting +- Fixed bug #20240 : Squiz block comment sniff fails when newline present +- Fixed bug #20247 : The Squiz.WhiteSpace.ControlStructureSpacing sniff and do-while + - Thanks to Alexander Obuhovich for the patch +- Fixed bug #20248 : The Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff sniff and empty scope +- Fixed bug #20252 : Uninitialized string offset when package name starts with underscore + +## [2.0.0a1] - 2014-02-05 +### Changed +- Added the phpcbf script to automatically fix many errors found by the phpcs script +- Added report type --report=diff to show suggested changes to fix coding standard violations +- The --report argument now allows for custom reports to be used + - Use the full path to your custom report class as the report name +- The --extensions argument is now respected when passing filenames; not just with directories +- The --extensions argument now allows you to specify the tokenizer for each extension + - e.g., --extensions=module/php,es/js +- Command line arguments can now be set in ruleset files + - e.g., arg name="report" value="summary" (print summary report; same as --report=summary) + - e.g., arg value="sp" (print source and progress information; same as -sp) + - The -vvv, --sniffs, --standard and -l command line arguments cannot be set in this way +- Sniff process() methods can not optionally return a token to ignore up to + - If returned, the sniff will not be executed again until the passed token is reached in the file + - Useful if you are looking for tokens like T_OPEN_TAG but only want to process the first one +- Removed the comment parser classes and replaced it with a simple comment tokenizer + - T_DOC_COMMENT tokens are now tokenized into T_DOC_COMMENT_* tokens so they can be used more easily + - This change requires a significant rewrite of sniffs that use the comment parser + - This change requires minor changes to sniffs that listen for T_DOC_COMMENT tokens directly +- Added Generic DocCommentSniff to check generic doc block formatting + - Removed doc block formatting checks from PEAR ClassCommentSniff + - Removed doc block formatting checks from PEAR FileCommentSniff + - Removed doc block formatting checks from PEAR FunctionCommentSniff + - Removed doc block formatting checks from Squiz ClassCommentSniff + - Removed doc block formatting checks from Squiz FileCommentSniff + - Removed doc block formatting checks from Squiz FunctionCommentSniff + - Removed doc block formatting checks from Squiz VariableCommentSniff +- Squiz DocCommentAlignmentSniff has had its error codes changed + - NoSpaceBeforeTag becomes NoSpaceAfterStar + - SpaceBeforeTag becomes SpaceAfterStar + - SpaceBeforeAsterisk becomes SpaceBeforeStar +- Generic MultipleStatementAlignment now aligns assignments within a block so they fit within their max padding setting + - The sniff previously requested the padding as 1 space if max padding was exceeded + - It now aligns the assignment with surrounding assignments if it can + - Removed property ignoreMultiline as multi-line assignments are now handled correctly and should not be ignored +- Squiz FunctionClosingBraceSpaceSniff now requires a blank line before the brace in all cases except function args +- Added error Squiz.Commenting.ClassComment.SpacingAfter to ensure there are no blank lines after a class comment +- Added error Squiz.WhiteSpace.MemberVarSpacing.AfterComment to ensure there are no blank lines after a member var comment + - Fixes have also been corrected to not strip the member var comment or indent under some circumstances + - Thanks to Mark Scherer for help with this fix +- Added error Squiz.Commenting.FunctionCommentThrowTag.Missing to ensure a throw is documented +- Removed error Squiz.Commenting.FunctionCommentThrowTag.WrongType +- Content passed via STDIN can now specify the filename to use so that sniffs can run the correct filename checks + - Ensure the first line of the content is: phpcs_input_file: /path/to/file +- Squiz coding standard now enforces no closing PHP tag at the end of a pure PHP file +- Squiz coding standard now enforces a single newline character at the end of the file +- Squiz ClassDeclarationSniff no longer checks for a PHP ending tag after a class definition +- Squiz ControlStructureSpacingSniff now checks TRY and CATCH statements as well +- Removed MySource ChannelExceptionSniff + +## [1.5.2] - 2014-02-05 +### Changed +- Improved support for the PHP 5.5. classname::class syntax + - PSR2 SwitchDeclarationSniff no longer throws errors when this syntax is used in CASE conditions +- Improved support for negative checks of instanceOf in Squiz ComparisonOperatorUsageSniff + - Thanks to Martin Winkel for the patch +- Generic FunctionCallArgumentSpacingSniff now longer complains about space before comma when using here/nowdocs + - Thanks to Richard van Velzen for the patch +- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore class constants + - Thanks to Kristopher Wilson for the patch +- PEAR FunctionCallSignatureSniff now has settings to specify how many spaces should appear before/after parentheses + - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change + - Default remains at 0 for both + - Thanks to Astinus Eberhard for the patch +- PSR2 ControlStructureSpacingSniff now has settings to specify how many spaces should appear before/after parentheses + - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change + - Default remains at 0 for both + - Thanks to Astinus Eberhard for the patch +- Squiz ForEachLoopDeclarationSniff now has settings to specify how many spaces should appear before/after parentheses + - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change + - Default remains at 0 for both + - Thanks to Astinus Eberhard for the patch +- Squiz ForLoopDeclarationSniff now has settings to specify how many spaces should appear before/after parentheses + - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change + - Default remains at 0 for both + - Thanks to Astinus Eberhard for the patch +- Squiz FunctionDeclarationArgumentSpacingSniff now has settings to specify how many spaces should appear before/after parentheses + - Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change + - Default remains at 0 for both + - Thanks to Astinus Eberhard for the patch +- Removed UnusedFunctionParameter, CyclomaticComplexity and NestingLevel from the Squiz standard +- Generic FixmeSniff and TodoSniff now work correctly with accented characters + +### Fixed +- Fixed bug #20145 : Custom ruleset preferences directory over installed standard +- Fixed bug #20147 : phpcs-svn-pre-commit - no more default error report +- Fixed bug #20151 : Problem handling "if(): ... else: ... endif;" syntax +- Fixed bug #20190 : Invalid regex in Squiz_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff + +## [1.5.1] - 2013-12-12 +### Changed +- Config values can now be set at runtime using the command line argument [--runtime-set key value] + - Runtime values are the same as config values, but are not written to the main config file + - Thanks to Wim Godden for the patch +- Config values can now be set in ruleset files + - e.g., config name="zend_ca_path" value="/path/to/ZendCodeAnalyzer" + - Can not be used to set config values that override command line values, such as show_warnings + - Thanks to Jonathan Marcil for helping with the patch +- Added a new installed_paths config value to allow for the setting of directories that contain standards + - By default, standards have to be installed into the CodeSniffer/Standards directory to be considered installed + - New config value allows a list of paths to be set in addition to this internal path + - Installed standards appear when using the -i arg, and can be referenced in rulesets using only their name + - Set paths by running: phpcs --config-set installed_paths /path/one,/path/two,... +- PSR2 ClassDeclarationSniff now allows a list of extended interfaces to be split across multiple lines +- Squiz DoubleQuoteUsageSniff now allows \b in double quoted strings +- Generic ForbiddenFunctionsSniff now ignores object creation + - This is a further fix for bug #20100 : incorrect Function mysql() has been deprecated report + +### Fixed +- Fixed bug #20136 : Squiz_Sniffs_WhiteSpace_ScopeKeywordSpacingSniff and Traits +- Fixed bug #20138 : Protected property underscore and camel caps issue (in trait with Zend) + - Thanks to Gaetan Rousseau for the patch +- Fixed bug #20139 : No report file generated on success + +## [1.5.0] - 2013-11-28 +### Changed +- Doc generation is now working again for installed standards + - Includes a fix for limiting the docs to specific sniffs +- Generic ScopeIndentSniff now allows for ignored tokens to be set via ruleset.xml files + - E.g., to ignore comments, override a property using: + - name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT" +- PSR2 standard now ignores comments when checking indentation rules +- Generic UpperCaseConstantNameSniff no longer reports errors where constants are used (request #20090) + - It still reports errors where constants are defined +- Individual messages can now be excluded in ruleset.xml files using the exclude tag (request #20091) + - Setting message severity to 0 continues to be supported +- Squiz OperatorSpacingSniff no longer throws errors for the ?: short ternary operator + - Thanks to Antoine Musso for the patch +- Comment parser now supports non-English characters when splitting comment lines into words + - Thanks to Nik Sun for the patch +- Exit statements are now recognised as valid closers for CASE and DEFAULT blocks + - Thanks to Maksim Kochkin for the patch +- PHP_CodeSniffer_CLI::process() can now be passed an incomplete array of CLI values + - Missing values will be set to the CLI defaults + - Thanks to Maksim Kochkin for the patch + +### Fixed +- Fixed bug #20093 : Bug with ternary operator token +- Fixed bug #20097 : CLI.php throws error in php 5.2 +- Fixed bug #20100 : incorrect Function mysql() has been deprecated report +- Fixed bug #20119 : PHP warning: invalid argument to str_repeat() in SVN blame report with -s +- Fixed bug #20123 : PSR2 complains about an empty second statement in for-loop +- Fixed bug #20131 : PHP errors in svnblame report, if there are files not under version control +- Fixed bug #20133 : Allow "HG: hg_id" as value for @version tag + +## [1.4.8] - 2013-11-26 +### Changed +- Generic ScopeIndentSniff now allows for ignored tokens to be set via ruleset.xml files + - E.g., to ignore comments, override a property using: + - name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT" +- PSR2 standard now ignores comments when checking indentation rules +- Squiz OperatorSpacingSniff no longer throws errors for the ?: short ternary operator + - Thanks to Antoine Musso for the patch +- Comment parser now supports non-English characters when splitting comment lines into words + - Thanks to Nik Sun for the patch +- Exit statements are now recognised as valid closers for CASE and DEFAULT blocks + - Thanks to Maksim Kochkin for the patch +- PHP_CodeSniffer_CLI::process() can now be passed an incomplete array of CLI values + - Missing values will be set to the CLI defaults + - Thanks to Maksim Kochkin for the patch + +### Fixed +- Fixed bug #20097 : CLI.php throws error in php 5.2 +- Fixed bug #20100 : incorrect Function mysql() has been deprecated report +- Fixed bug #20119 : PHP warning: invalid argument to str_repeat() in SVN blame report with -s +- Fixed bug #20123 : PSR2 complains about an empty second statement in for-loop +- Fixed bug #20131 : PHP errors in svnblame report, if there are files not under version control +- Fixed bug #20133 : Allow "HG: hg_id" as value for @version tag + +## [1.5.0RC4] - 2013-09-26 +### Changed +- You can now restrict violations to individual sniff codes using the --sniffs command line argument + - Previously, this only restricted violations to an entire sniff and not individual messages + - If you have scripts calling PHP_CodeSniffer::process() or creating PHP_CodeSniffer_File objects, you must update your code + - The array of restrictions passed to PHP_CodeSniffer::process() must now be an array of sniff codes instead of class names + - The PHP_CodeSniffer_File::__construct() method now requires an array of restrictions to be passed +- Doc generation is now working again +- Progress information now shows the percentage complete at the end of each line +- Added report type --report=junit to show the error list in a JUnit compatible format + - Thanks to Oleg Lobach for the contribution +- Added support for the PHP 5.4 callable type hint +- Fixed problem where some file content could be ignored when checking STDIN +- Version information is now printed when installed via composer or run from a Git clone (request #20050) +- Added Squiz DisallowBooleanStatementSniff to ban boolean operators outside of control structure conditions +- The CSS tokenizer is now more reliable when encountering 'list' and 'break' strings +- Coding standard ignore comments can now appear instead doc blocks as well as inline comments + - Thanks to Stuart Langley for the patch +- Generic LineLengthSniff now ignores SVN URL and Head URL comments + - Thanks to Karl DeBisschop for the patch +- PEAR MultiLineConditionSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Szabolcs Sulik for the patch +- PEAR MultiLineAssignmentSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Szabolcs Sulik for the patch +- PEAR FunctionDeclarationSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Szabolcs Sulik for the patch +- Squiz SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Szabolcs Sulik for the patch +- Squiz CSS IndentationSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Hugo Fonseca for the patch +- Squiz and MySource File and Function comment sniffs now allow all tags and don't require a particular licence +- Squiz standard now allows lines to be 120 characters long before warning; up from 85 +- Squiz LowercaseStyleDefinitionSniff no longer throws errors for class names in nested style definitions +- Squiz ClassFileNameSniff no longer throws errors when checking STDIN +- Squiz CSS sniffs no longer generate errors for IE filters +- Squiz CSS IndentationSniff no longer sees comments as blank lines +- Squiz LogicalOperatorSpacingSniff now ignores whitespace at the end of a line +- Squiz.Scope.MethodScope.Missing error message now mentions 'visibility' instead of 'scope modifier' + - Thanks to Renat Akhmedyanov for the patch +- Added support for the PSR2 multi-line arguments errata +- The PSR2 standard no longer throws errors for additional spacing after a type hint +- PSR UseDeclarationSniff no longer throws errors for USE statements inside TRAITs + +### Fixed +- Fixed cases where code was incorrectly assigned the T_GOTO_LABEL token when used in a complex CASE condition +- Fixed bug #20026 : Check for multi-line arrays that should be single-line is slightly wrong + - Adds new error message for single-line arrays that end with a comma +- Fixed bug #20029 : ForbiddenFunction sniff incorrectly recognizes methods in USE clauses +- Fixed bug #20043 : Mis-interpretation of Foo::class +- Fixed bug #20044 : PSR1 camelCase check does not ignore leading underscores +- Fixed bug #20045 : Errors about indentation for closures with multi-line 'use' in functions +- Fixed bug #20051 : Undefined index: scope_opener / scope_closer + - Thanks to Anthon Pang for the patch + +## [1.4.7] - 2013-09-26 +### Changed +- Added report type --report=junit to show the error list in a JUnit compatible format + - Thanks to Oleg Lobach for the contribution +- Added support for the PHP 5.4 callable type hint +- Fixed problem where some file content could be ignored when checking STDIN +- Version information is now printed when installed via composer or run from a Git clone (request #20050) +- The CSS tokenizer is now more reliable when encountering 'list' and 'break' strings +- Coding standard ignore comments can now appear instead doc blocks as well as inline comments + - Thanks to Stuart Langley for the patch +- Generic LineLengthSniff now ignores SVN URL and Head URL comments + - Thanks to Karl DeBisschop for the patch +- PEAR MultiLineConditionSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Szabolcs Sulik for the patch +- PEAR MultiLineAssignmentSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Szabolcs Sulik for the patch +- PEAR FunctionDeclarationSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Szabolcs Sulik for the patch +- Squiz SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Szabolcs Sulik for the patch +- Squiz CSS IndentationSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the 'indent' setting in a ruleset.xml file to change + - Thanks to Hugo Fonseca for the patch +- Squiz and MySource File and Function comment sniffs now allow all tags and don't require a particular licence +- Squiz LowercaseStyleDefinitionSniff no longer throws errors for class names in nested style definitions +- Squiz ClassFileNameSniff no longer throws errors when checking STDIN +- Squiz CSS sniffs no longer generate errors for IE filters +- Squiz CSS IndentationSniff no longer sees comments as blank lines +- Squiz LogicalOperatorSpacingSniff now ignores whitespace at the end of a line +- Squiz.Scope.MethodScope.Missing error message now mentions 'visibility' instead of 'scope modifier' + - Thanks to Renat Akhmedyanov for the patch +- Added support for the PSR2 multi-line arguments errata +- The PSR2 standard no longer throws errors for additional spacing after a type hint +- PSR UseDeclarationSniff no longer throws errors for USE statements inside TRAITs + +### Fixed +- Fixed bug #20026 : Check for multi-line arrays that should be single-line is slightly wrong + - Adds new error message for single-line arrays that end with a comma +- Fixed bug #20029 : ForbiddenFunction sniff incorrectly recognizes methods in USE clauses +- Fixed bug #20043 : Mis-interpretation of Foo::class +- Fixed bug #20044 : PSR1 camelCase check does not ignore leading underscores +- Fixed bug #20045 : Errors about indentation for closures with multi-line 'use' in functions + +## [1.5.0RC3] - 2013-07-25 +### Changed +- Added report type --report=json to show the error list and total counts for all checked files + - Thanks to Jeffrey Fisher for the contribution +- PHP_CodeSniffer::isCamelCaps now allows for acronyms at the start of a string if the strict flag is FALSE + - acronyms are defined as at least 2 uppercase characters in a row + - e.g., the following is now valid camel caps with strict set to FALSE: XMLParser +- The PHP tokenizer now tokenizes goto labels as T_GOTO_LABEL instead of T_STRING followed by T_COLON +- The JS tokenizer now has support for the T_THROW token +- Symlinked directories inside CodeSniffer/Standards and in ruleset.xml files are now supported + - Only available since PHP 5.2.11 and 5.3.1 + - Thanks to Maik Penz for the patch +- The JS tokenizer now correctly identifies T_INLINE_ELSE tokens instead of leaving them as T_COLON + - Thanks to Arnout Boks for the patch +- Explaining a standard (phpcs -e) that uses namespaces now works correctly +- Restricting a check to specific sniffs (phpcs --sniffs=...) now works correctly with namespaced sniffs + - Thanks to Maik Penz for the patch +- Docs added for the entire Generic standard, and many sniffs from other standards are now documented as well + - Thanks to Spencer Rinehart for the contribution +- Clearer error message for when the sniff class name does not match the directory structure +- Generated HTML docs now correctly show the open PHP tag in code comparison blocks +- Added Generic InlineHTMLSniff to ensure a file only contains PHP code +- Added Squiz ShorthandSizeSniff to check that CSS sizes are using shorthand notation only when 1 or 2 values are used +- Added Squiz ForbiddenStylesSniff to ban the use of some deprecated browser-specific styles +- Added Squiz NamedColoursSniff to ban the use of colour names +- PSR2 standard no longer enforces no whitespace between the closing parenthesis of a function call and the semicolon +- PSR2 ClassDeclarationSniff now ignores empty classes when checking the end brace position +- PSR2 SwitchDeclarationSniff no longer reports errors for empty lines between CASE statements +- PEAR ObjectOperatorIndentSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the indent setting in a ruleset.xml file to change + - Thanks to Andrey Mindubaev for the patch +- Squiz FileExtensionSniff now supports traits + - Thanks to Lucas Green for the patch +- Squiz ArrayDeclarationSniff no longer reports errors for no comma at the end of a line that contains a function call +- Squiz SwitchDeclarationSniff now supports T_CONTINUE and T_THROW as valid case/default breaking statements +- Squiz CommentedOutCodeSniff is now better at ignoring commented out HTML, XML and regular expressions +- Squiz DisallowComparisonAssignmentSniff no longer throws errors for the third expression in a FOR statement +- Squiz ColourDefinitionSniff no longer throws errors for some CSS class names +- Squiz ControlStructureSpacingSniff now supports all types of CASE/DEFAULT breaking statements +- Generic CallTimePassByReferenceSniff now reports errors for functions called using a variable + - Thanks to Maik Penz for the patch +- Generic ConstructorNameSniff no longer throws a notice for abstract constructors inside abstract classes + - Thanks to Spencer Rinehart for the patch +- Squiz ComparisonOperatorUsageSniff now checks inside elseif statements + - Thanks to Arnout Boks for the patch +- Squiz OperatorSpacingSniff now reports errors for no spacing around inline then and else tokens + - Thanks to Arnout Boks for the patch + +### Fixed +- Fixed bug #19811 : Comments not ignored in all cases in AbstractPatternSniff + - Thanks to Erik Wiffin for the patch +- Fixed bug #19892 : ELSE with no braces causes incorrect SWITCH break statement indentation error +- Fixed bug #19897 : Indenting warnings in templates not consistent +- Fixed bug #19908 : PEAR MultiLineCondition Does Not Apply elseif +- Fixed bug #19930 : option --report-file generate an empty file +- Fixed bug #19935 : notify-send reports do not vanish in gnome-shell + - Thanks to Christian Weiske for the patch +- Fixed bug #19944 : docblock squiz sniff "return void" trips over return in lambda function +- Fixed bug #19953 : PSR2 - Spaces before interface name for abstract class +- Fixed bug #19956 : phpcs warns for Type Hint missing Resource +- Fixed bug #19957 : Does not understand trait method aliasing +- Fixed bug #19968 : Permission denied on excluded directory +- Fixed bug #19969 : Sniffs with namespace not recognized in reports +- Fixed bug #19997 : Class names incorrectly detected as constants + +## [1.4.6] - 2013-07-25 +### Changed +- Added report type --report=json to show the error list and total counts for all checked files + - Thanks to Jeffrey Fisher for the contribution +- The JS tokenizer now has support for the T_THROW token +- Symlinked directories inside CodeSniffer/Standards and in ruleset.xml files are now supported + - Only available since PHP 5.2.11 and 5.3.1 + - Thanks to Maik Penz for the patch +- The JS tokenizer now correctly identifies T_INLINE_ELSE tokens instead of leaving them as T_COLON + - Thanks to Arnout Boks for the patch +- Explaining a standard (phpcs -e) that uses namespaces now works correctly +- Restricting a check to specific sniffs (phpcs --sniffs=...) now works correctly with namespaced sniffs + - Thanks to Maik Penz for the patch +- Docs added for the entire Generic standard, and many sniffs from other standards are now documented as well + - Thanks to Spencer Rinehart for the contribution +- Clearer error message for when the sniff class name does not match the directory structure +- Generated HTML docs now correctly show the open PHP tag in code comparison blocks +- Added Generic InlineHTMLSniff to ensure a file only contains PHP code +- Added Squiz ShorthandSizeSniff to check that CSS sizes are using shorthand notation only when 1 or 2 values are used +- Added Squiz ForbiddenStylesSniff to ban the use of some deprecated browser-specific styles +- Added Squiz NamedColoursSniff to ban the use of colour names +- PSR2 standard no longer enforces no whitespace between the closing parenthesis of a function call and the semicolon +- PSR2 ClassDeclarationSniff now ignores empty classes when checking the end brace position +- PSR2 SwitchDeclarationSniff no longer reports errors for empty lines between CASE statements +- PEAR ObjectOperatorIndentSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the indent setting in a ruleset.xml file to change + - Thanks to Andrey Mindubaev for the patch +- Squiz FileExtensionSniff now supports traits + - Thanks to Lucas Green for the patch +- Squiz ArrayDeclarationSniff no longer reports errors for no comma at the end of a line that contains a function call +- Squiz SwitchDeclarationSniff now supports T_CONTINUE and T_THROW as valid case/default breaking statements +- Squiz CommentedOutCodeSniff is now better at ignoring commented out HTML, XML and regular expressions +- Squiz DisallowComparisonAssignmentSniff no longer throws errors for the third expression in a FOR statement +- Squiz ColourDefinitionSniff no longer throws errors for some CSS class names +- Squiz ControlStructureSpacingSniff now supports all types of CASE/DEFAULT breaking statements +- Generic CallTimePassByReferenceSniff now reports errors for functions called using a variable + - Thanks to Maik Penz for the patch +- Generic ConstructorNameSniff no longer throws a notice for abstract constructors inside abstract classes + - Thanks to Spencer Rinehart for the patch +- Squiz ComparisonOperatorUsageSniff now checks inside elseif statements + - Thanks to Arnout Boks for the patch +- Squiz OperatorSpacingSniff now reports errors for no spacing around inline then and else tokens + - Thanks to Arnout Boks for the patch + +### Fixed +- Fixed bug #19811 : Comments not ignored in all cases in AbstractPatternSniff + - Thanks to Erik Wiffin for the patch +- Fixed bug #19892 : ELSE with no braces causes incorrect SWITCH break statement indentation error +- Fixed bug #19897 : Indenting warnings in templates not consistent +- Fixed bug #19908 : PEAR MultiLineCondition Does Not Apply elseif +- Fixed bug #19913 : Running phpcs in interactive mode causes warnings + - Thanks to Harald Franndorfer for the patch +- Fixed bug #19935 : notify-send reports do not vanish in gnome-shell + - Thanks to Christian Weiske for the patch +- Fixed bug #19944 : docblock squiz sniff "return void" trips over return in lambda function +- Fixed bug #19953 : PSR2 - Spaces before interface name for abstract class +- Fixed bug #19956 : phpcs warns for Type Hint missing Resource +- Fixed bug #19957 : Does not understand trait method aliasing +- Fixed bug #19968 : Permission denied on excluded directory +- Fixed bug #19969 : Sniffs with namespace not recognized in reports +- Fixed bug #19997 : Class names incorrectly detected as constants + +## [1.5.0RC2] - 2013-04-04 +### Changed +- Ruleset processing has been rewritten to be more predictable + - Provides much better support for relative paths inside ruleset files + - May mean that sniffs that were previously ignored are now being included when importing external rulesets + - Ruleset processing output can be seen by using the -vv command line argument + - Internal sniff registering functions have all changed, so please review custom scripts +- You can now pass multiple coding standards on the command line, comma separated (request #19144) + - Works with built-in or custom standards and rulesets, or a mix of both +- You can now exclude directories or whole standards in a ruleset XML file (request #19731) + - e.g., exclude "Generic.Commenting" or just "Generic" + - You can also pass in a path to a directory instead, if you know it +- Added Generic LowerCaseKeywordSniff to ensure all PHP keywords are defined in lowercase + - The PSR2 and Squiz standards now use this sniff +- Added Generic SAPIUsageSniff to ensure the PHP_SAPI constant is used instead of php_sapi_name() (request #19863) +- Squiz FunctionSpacingSniff now has a setting to specify how many lines there should between functions (request #19843) + - Default remains at 2 + - Override the "spacing" setting in a ruleset.xml file to change +- Squiz LowercasePHPFunctionSniff no longer throws errors for the limited set of PHP keywords it was checking + - Add a rule for Generic.PHP.LowerCaseKeyword to your ruleset to replicate this functionality +- Added support for the PHP 5.4 T_CALLABLE token so it can be used in lower PHP versions +- Generic EndFileNoNewlineSniff now supports checking of CSS and JS files +- PSR2 SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the indent setting in a ruleset.xml file to change + - Thanks to Asher Snyder for the patch +- Generic ScopeIndentSniff now has a setting to specify a list of tokens that should be ignored + - The first token on the line is checked and the whole line is ignored if the token is in the array + - Thanks to Eloy Lafuente for the patch +- Squiz LowercaseClassKeywordsSniff now checks for the TRAIT keyword + - Thanks to Anthon Pang for the patch +- If you create your own PHP_CodeSniffer object, PHPCS will no longer exit when an unknown argument is found + - This allows you to create wrapper scripts for PHPCS more easily +- PSR2 MethodDeclarationSniff no longer generates a notice for methods named "_" + - Thanks to Bart S for the patch +- Squiz BlockCommentSniff no longer reports that a blank line between a scope closer and block comment is invalid +- Generic DuplicateClassNameSniff no longer reports an invalid error if multiple PHP open tags exist in a file +- Generic DuplicateClassNameSniff no longer reports duplicate errors if multiple PHP open tags exist in a file + +### Fixed +- Fixed bug #19819 : Freeze with syntax error in use statement +- Fixed bug #19820 : Wrong message level in Generic_Sniffs_CodeAnalysis_EmptyStatementSniff +- Fixed bug #19859 : CodeSniffer::setIgnorePatterns API changed +- Fixed bug #19871 : findExtendedClassName doesn't return FQCN on namespaced classes +- Fixed bug #19879 : bitwise and operator interpreted as reference by value + +## [1.4.5] - 2013-04-04 +### Changed +- Added Generic LowerCaseKeywordSniff to ensure all PHP keywords are defined in lowercase + - The PSR2 and Squiz standards now use this sniff +- Added Generic SAPIUsageSniff to ensure the PHP_SAPI constant is used instead of php_sapi_name() (request #19863) +- Squiz FunctionSpacingSniff now has a setting to specify how many lines there should between functions (request #19843) + - Default remains at 2 + - Override the "spacing" setting in a ruleset.xml file to change +- Squiz LowercasePHPFunctionSniff no longer throws errors for the limited set of PHP keywords it was checking + - Add a rule for Generic.PHP.LowerCaseKeyword to your ruleset to replicate this functionality +- Added support for the PHP 5.4 T_CALLABLE token so it can be used in lower PHP versions +- Generic EndFileNoNewlineSniff now supports checking of CSS and JS files +- PSR2 SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented + - Default remains at 4; override the indent setting in a ruleset.xml file to change + - Thanks to Asher Snyder for the patch +- Generic ScopeIndentSniff now has a setting to specify a list of tokens that should be ignored + - The first token on the line is checked and the whole line is ignored if the token is in the array + - Thanks to Eloy Lafuente for the patch +- Squiz LowercaseClassKeywordsSniff now checks for the TRAIT keyword + - Thanks to Anthon Pang for the patch +- If you create your own PHP_CodeSniffer object, PHPCS will no longer exit when an unknown argument is found + - This allows you to create wrapper scripts for PHPCS more easily +- PSR2 MethodDeclarationSniff no longer generates a notice for methods named "_" + - Thanks to Bart S for the patch +- Squiz BlockCommentSniff no longer reports that a blank line between a scope closer and block comment is invalid +- Generic DuplicateClassNameSniff no longer reports an invalid error if multiple PHP open tags exist in a file +- Generic DuplicateClassNameSniff no longer reports duplicate errors if multiple PHP open tags exist in a file + +### Fixed +- Fixed bug #19819 : Freeze with syntax error in use statement +- Fixed bug #19820 : Wrong message level in Generic_Sniffs_CodeAnalysis_EmptyStatementSniff +- Fixed bug #19859 : CodeSniffer::setIgnorePatterns API changed +- Fixed bug #19871 : findExtendedClassName doesn't return FQCN on namespaced classes +- Fixed bug #19879 : bitwise and operator interpreted as reference by value + +## [1.5.0RC1] - 2013-02-08 +### Changed +- Reports have been completely rewritten to consume far less memory + - Each report is incrementally written to the file system during a run and then printed out when the run ends + - There is no longer a need to keep the list of errors and warnings in memory during a run +- Multi-file sniff support has been removed because they are too memory intensive + - If you have a custom multi-file sniff, you can convert it into a standard sniff quite easily + - See CodeSniffer/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php for an example + +## [1.4.4] - 2013-02-07 +### Changed +- Ignored lines no longer cause the summary report to show incorrect error and warning counts + - Thanks to Bert Van Hauwaert for the patch +- Added Generic CSSLintSniff to run CSSLint over a CSS file and report warnings + - Set full command to run CSSLint using phpcs --config-set csslint_path /path/to/csslint + - Thanks to Roman Levishchenko for the contribution +- Added PSR2 ControlStructureSpacingSniff to ensure there are no spaces before and after parenthesis in control structures + - Fixes bug #19732 : PSR2: some control structures errors not reported +- Squiz commenting sniffs now support non-English characters when checking for capital letters + - Thanks to Roman Levishchenko for the patch +- Generic EndFileNewlineSniff now supports JS and CSS files + - Thanks to Denis Ryabkov for the patch +- PSR1 SideEffectsSniff no longer reports constant declarations as side effects +- Notifysend report now supports notify-send versions before 0.7.3 + - Thanks to Ken Guest for the patch +- PEAR and Squiz FunctionCommentSniffs no longer report errors for misaligned argument comments when they are blank + - Thanks to Thomas Peterson for the patch +- Squiz FunctionDeclarationArgumentSpacingSniff now works correctly for equalsSpacing values greater than 0 + - Thanks to Klaus Purer for the patch +- Squiz SuperfluousWhitespaceSniff no longer throws errors for CSS files with no newline at the end +- Squiz SuperfluousWhitespaceSniff now allows a single newline at the end of JS and CSS files + +### Fixed +- Fixed bug #19755 : Token of T_CLASS type has no scope_opener and scope_closer keys +- Fixed bug #19759 : Squiz.PHP.NonExecutableCode fails for return function()... +- Fixed bug #19763 : Use statements for traits not recognised correctly for PSR2 code style +- Fixed bug #19764 : Instead of for traits throws uppercase constant name errors +- Fixed bug #19772 : PSR2_Sniffs_Namespaces_UseDeclarationSniff does not properly recognize last use +- Fixed bug #19775 : False positive in NonExecutableCode sniff when not using curly braces +- Fixed bug #19782 : Invalid found size functions in loop when using object operator +- Fixed bug #19799 : config folder is not created automatically +- Fixed bug #19804 : JS Tokenizer wrong /**/ parsing + +## [1.4.3] - 2012-12-04 +### Changed +- Added support for the PHP 5.5 T_FINALLY token to detect try/catch/finally statements +- Added empty CodeSniffer.conf to enable config settings for Composer installs +- Added Generic EndFileNoNewlineSniff to ensure there is no newline at the end of a file +- Autoloader can now load PSR-0 compliant classes + - Thanks to Maik Penz for the patch +- Squiz NonExecutableCodeSniff no longer throws error for multi-line RETURNs inside CASE statements + - Thanks to Marc Ypes for the patch +- Squiz OperatorSpacingSniff no longer reports errors for negative numbers inside inline THEN statements + - Thanks to Klaus Purer for the patch +- Squiz OperatorSpacingSniff no longer reports errors for the assignment of operations involving negative numbers +- Squiz SelfMemberReferenceSniff can no longer get into an infinite loop when checking a static call with a namespace + - Thanks to Andy Grunwald for the patch + +### Fixed +- Fixed bug #19699 : Generic.Files.LineLength giving false positives when tab-width is used +- Fixed bug #19726 : Wrong number of spaces expected after instanceof static +- Fixed bug #19727 : PSR2: no error reported when using } elseif { + +## [1.4.2] - 2012-11-09 +### Changed +- PHP_CodeSniffer can now be installed using Composer + - Require squizlabs/php_codesniffer in your composer.json file + - Thanks to Rob Bast, Stephen Rees-Carter, Stefano Kowalke and Ivan Habunek for help with this +- Squiz BlockCommentSniff and InlineCommentSniff no longer report errors for trait block comments +- Squiz SelfMemberReferenceSniff now supports namespaces + - Thanks to Andy Grunwald for the patch +- Squiz FileCommentSniff now uses tag names inside the error codes for many messages + - This allows you to exclude specific missing, out of order etc., tags +- Squiz SuperfluousWhitespaceSniff now has an option to ignore blank lines + - This will stop errors being reported for lines that contain only whitespace + - Set the ignoreBlankLines property to TRUE in your ruleset.xml file to enable this +- PSR2 no longer reports errors for whitespace at the end of blank lines + +### Fixed +- Fixed gitblame report not working on Windows + - Thanks to Rogerio Prado de Jesus +- Fixed an incorrect error in Squiz OperatorSpacingSniff for default values inside a closure definition +- Fixed bug #19691 : SubversionPropertiesSniff fails to find missing properties + - Thanks to Kevin Winahradsky for the patch +- Fixed bug #19692 : DisallowMultipleAssignments is triggered by a closure +- Fixed bug #19693 : exclude-patterns no longer work on specific messages +- Fixed bug #19694 : Squiz.PHP.LowercasePHPFunctions incorrectly matches return by ref functions + +## [1.4.1] - 2012-11-02 +### Changed +- All ignore patterns have been reverted to being checked against the absolute path of a file + - Patterns can be specified to be relative in a ruleset.xml file, but nowhere else + - e.g., [exclude-pattern type="relative"]^tests/*[/exclude-pattern] (with angle brackets, not square brackets) +- Added support for PHP tokenizing of T_INLINE_ELSE colons, so this token type is now available + - Custom sniffs that rely on looking for T_COLON tokens inside inline if statements must be changed to use the new token + - Fixes bug #19666 : PSR1.Files.SideEffects throws a notice Undefined index: scope_closer +- Messages can now be changed from errors to warnings (and vice versa) inside ruleset.xml files + - As you would with "message" and "severity", specify a "type" tag under a "rule" tag and set the value to "error" or "warning" +- PHP_CodeSniffer will now generate a warning on files that it detects have mixed line endings + - This warning has the code Internal.LineEndings.Mixed and can be overridden in a ruleset.xml file + - Thanks to Vit Brunner for help with this +- Sniffs inside PHP 5.3 namespaces are now supported, along with the existing underscore-style emulated namespaces + - For example: namespace MyStandard\Sniffs\Arrays; class ArrayDeclarationSniff implements \PHP_CodeSniffer_Sniff { ... + - Thanks to Till Klampaeckel for the patch +- Generic DuplicateClassNameSniff is no longer a multi-file sniff, so it won't max out your memory + - Multi-file sniff support should be considered deprecated as standard sniffs can now do the same thing +- Added Generic DisallowSpaceIndent to check that files are indented using tabs +- Added Generic OneClassPerFileSniff to check that only one class is defined in each file + - Thanks to Andy Grunwald for the contribution +- Added Generic OneInterfacePerFileSniff to check that only one interface is defined in each file + - Thanks to Andy Grunwald for the contribution +- Added Generic LowercasedFilenameSniff to check that filenames are lowercase + - Thanks to Andy Grunwald for the contribution +- Added Generic ClosingPHPTagSniff to check that each open PHP tag has a corresponding close tag + - Thanks to Andy Grunwald for the contribution +- Added Generic CharacterBeforePHPOpeningTagSniff to check that the open PHP tag is the first content in a file + - Thanks to Andy Grunwald for the contribution +- Fixed incorrect errors in Squiz OperatorBracketSniff and OperatorSpacingSniff for negative numbers in CASE statements + - Thanks to Arnout Boks for the patch +- Generic CamelCapsFunctionNameSniff no longer enforces exact case matching for PHP magic methods +- Generic CamelCapsFunctionNameSniff no longer throws errors for overridden SOAPClient methods prefixed with double underscores + - Thanks to Dorian Villet for the patch +- PEAR ValidFunctionNameSniff now supports traits +- PSR1 ClassDeclarationSniff no longer throws an error for non-namespaced code if PHP version is less than 5.3.0 + +### Fixed +- Fixed bug #19616 : Nested switches cause false error in PSR2 +- Fixed bug #19629 : PSR2 error for inline comments on multi-line argument lists +- Fixed bug #19644 : Alternative syntax, e.g. if/endif triggers Inline Control Structure error +- Fixed bug #19655 : Closures reporting as multi-line when they are not +- Fixed bug #19675 : Improper indent of nested anonymous function bodies in a call +- Fixed bug #19685 : PSR2 catch-22 with empty third statement in for loop +- Fixed bug #19687 : Anonymous functions inside arrays marked as indented incorrectly in PSR2 + +## [1.4.0] - 2012-09-26 +### Changed +- Added PSR1 and PSR2 coding standards that can be used to check your code against these guidelines +- PHP 5.4 short array syntax is now detected and tokens are assigned to the open and close characters + - New tokens are T_OPEN_SHORT_ARRAY and T_CLOSE_SHORT_ARRAY as PHP does not define its own +- Added the ability to explain a coding standard by listing the sniffs that it includes + - The sniff list includes all imported and native sniffs + - Explain a standard by using the -e and --standard=[standard] command line arguments + - E.g., phpcs -e --standard=Squiz + - Thanks to Ben Selby for the idea +- Added report to show results using notify-send + - Use --report=notifysend to generate the report + - Thanks to Christian Weiske for the contribution +- The JS tokenizer now recognises RETURN as a valid closer for CASE and DEFAULT inside switch statements +- AbstractPatternSniff now sets the ignoreComments option using a public var rather than through the constructor + - This allows the setting to be overwritten in ruleset.xml files + - Old method remains for backwards compatibility +- Generic LowerCaseConstantSniff and UpperCaseConstantSniff no longer report errors on classes named True, False or Null +- PEAR ValidFunctionNameSniff no longer enforces exact case matching for PHP magic methods +- Squiz SwitchDeclarationSniff now allows RETURN statements to close a CASE or DEFAULT statement +- Squiz BlockCommentSniff now correctly reports an error for blank lines before blocks at the start of a control structure + +### Fixed +- Fixed a PHP notice generated when loading custom array settings from a ruleset.xml file +- Fixed bug #17908 : CodeSniffer does not recognise optional @params + - Thanks to Pete Walker for the patch +- Fixed bug #19538 : Function indentation code sniffer checks inside short arrays +- Fixed bug #19565 : Non-Executable Code Sniff Broken for Case Statements with both return and break +- Fixed bug #19612 : Invalid @package suggestion + +## [1.3.6] - 2012-08-08 +### Changed +- Memory usage has been dramatically reduced when using the summary report + - Reduced memory is only available when displaying a single summary report to the screen + - PHP_CodeSniffer will not generate any messages in this case, storing only error counts instead + - Impact is most notable with very high error and warning counts +- Significantly improved the performance of Squiz NonExecutableCodeSniff +- Ignore patterns now check the relative path of a file based on the dir being checked + - Allows ignore patterns to become more generic as the path to the code is no longer included when checking + - Thanks to Kristof Coomans for the patch +- Sniff settings can now be changed by specifying a special comment format inside a file + - e.g., // @codingStandardsChangeSetting PEAR.Functions.FunctionCallSignature allowMultipleArguments false + - If you change a setting, don't forget to change it back +- Added Generic EndFileNewlineSniff to ensure PHP files end with a newline character +- PEAR FunctionCallSignatureSniff now includes a setting to force one argument per line in multi-line calls + - Set allowMultipleArguments to false +- Squiz standard now enforces one argument per line in multi-line function calls +- Squiz FunctionDeclarationArgumentSpacingSniff now supports closures +- Squiz OperatorSpacingSniff no longer throws an error for negative values inside an inline THEN statement + - Thanks to Klaus Purer for the patch +- Squiz FunctionCommentSniff now throws an error for not closing a comment with */ + - Thanks to Klaus Purer for the patch +- Summary report no longer shows two lines of PHP_Timer output when showing sources + +### Fixed +- Fixed undefined variable error in PEAR FunctionCallSignatureSniff for lines with no indent +- Fixed bug #19502 : Generic.Files.LineEndingsSniff fails if no new-lines in file +- Fixed bug #19508 : switch+return: Closing brace indented incorrectly +- Fixed bug #19532 : The PSR-2 standard don't recognize Null in class names +- Fixed bug #19546 : Error thrown for __call() method in traits + +## [1.3.5] - 2012-07-12 +### Changed +- Added Generic CamelCapsFunctionNameSniff to just check if function and method names use camel caps + - Does not allow underscore prefixes for private/protected methods + - Defaults to strict checking, where two uppercase characters can not be next to each other + - Strict checking can be disabled in a ruleset.xml file +- Squiz FunctionDeclarationArgumentSpacing now has a setting to specify how many spaces should surround equals signs + - Default remains at 0 + - Override the equalsSpacing setting in a ruleset.xml file to change +- Squiz ClassDeclarationSniff now throws errors for > 1 space before extends/implements class name with ns separator +- Squiz standard now warns about deprecated functions using Generic DeprecatedFunctionsSniff +- PEAR FunctionDeclarationSniff now reports an error for multiple spaces after the FUNCTION keyword and around USE +- PEAR FunctionDeclarationSniff now supports closures +- Squiz MultiLineFunctionDeclarationSniff now supports closures +- Exclude rules written for Unix systems will now work correctly on Windows + - Thanks to Walter Tamboer for the patch +- The PHP tokenizer now recognises T_RETURN as a valid closer for T_CASE and T_DEFAULT inside switch statements + +### Fixed +- Fixed duplicate message codes in Generic OpeningFunctionBraceKernighanRitchieSniff +- Fixed bug #18651 : PHPunit Test cases for custom standards are not working on Windows +- Fixed bug #19416 : Shorthand arrays cause bracket spacing errors +- Fixed bug #19421 : phpcs doesn't recognize ${x} as equivalent to $x +- Fixed bug #19428 : PHPCS Report "hgblame" doesn't support windows paths + - Thanks to Justin Rovang for the patch +- Fixed bug #19448 : Problem with detecting remote standards +- Fixed bug #19463 : Anonymous functions incorrectly being flagged by NonExecutableCodeSniff +- Fixed bug #19469 : PHP_CodeSniffer_File::getMemberProperties() sets wrong scope +- Fixed bug #19471 : phpcs on Windows, when using Zend standard, doesn't catch problems + - Thanks to Ivan Habunek for the patch +- Fixed bug #19478 : Incorrect indent detection in PEAR standard + - Thanks to Shane Auckland for the patch +- Fixed bug #19483 : Blame Reports fail with space in directory name + +## [1.3.4] - 2012-05-17 +### Changed +- Added missing package.xml entries for new Generic FixmeSniff + - Thanks to Jaroslav Hanslík for the patch +- Expected indents for PEAR ScopeClosingBraceSniff and FunctionCallSignatureSniff can now be set in ruleset files + - Both sniffs use a variable called "indent" + - Thanks to Thomas Despoix for the patch +- Standards designed to be installed in the PHPCS Standards dir will now work outside this dir as well + - In particular, allows the Drupal CS to work without needing to symlink it into the PHPCS install + - Thanks to Peter Philipp for the patch +- Rule references for standards, directories and specific sniffs can now be relative in ruleset.xml files + - For example: ref="../MyStandard/Sniffs/Commenting/DisallowHashCommentsSniff.php" +- Symlinked standards now work correctly, allowing aliasing of installed standards (request #19417) + - Thanks to Tom Klingenberg for the patch +- Squiz ObjectInstantiationSniff now allows objects to be returned without assigning them to a variable +- Added Squiz.Commenting.FileComment.MissingShort error message for file comments that only contains tags + - Also stops undefined index errors being generated for these comments +- Debug option -vv now shows tokenizer status for CSS files +- Added support for new gjslint error formats + - Thanks to Meck for the patch +- Generic ScopeIndentSniff now allows comment indents to not be exact even if the exact flag is set + - The start of the comment is still checked for exact indentation as normal +- Fixed an issue in AbstractPatternSniff where comments were not being ignored in some cases +- Fixed an issue in Zend ClosingTagSniff where the closing tag was not always being detected correctly + - Thanks to Jonathan Robson for the patch +- Fixed an issue in Generic FunctionCallArgumentSpacingSniff where closures could cause incorrect errors +- Fixed an issue in Generic UpperCaseConstantNameSniff where errors were incorrectly reported on goto statements + - Thanks to Tom Klingenberg for the patch +- PEAR FileCommentSniff and ClassCommentSniff now support author emails with a single character in the local part + - E.g., a@me.com + - Thanks to Denis Shapkin for the patch + +### Fixed +- Fixed bug #19290 : Generic indent sniffer fails for anonymous functions +- Fixed bug #19324 : Setting show_warnings configuration option does not work +- Fixed bug #19354 : Not recognizing references passed to method +- Fixed bug #19361 : CSS tokenizer generates errors when PHP embedded in CSS file +- Fixed bug #19374 : HEREDOC/NOWDOC Indentation problems +- Fixed bug #19381 : traits and indentations in traits are not handled properly +- Fixed bug #19394 : Notice in NonExecutableCodeSniff +- Fixed bug #19402 : Syntax error when executing phpcs on Windows with parens in PHP path + - Thanks to Tom Klingenberg for the patch +- Fixed bug #19411 : magic method error on __construct() + - The fix required a rewrite of AbstractScopeSniff, so please test any sniffs that extend this class +- Fixed bug #19412 : Incorrect error about assigning objects to variables when inside inline IF +- Fixed bug #19413 : php_cs thinks I haven't used a parameter when I have +- Fixed bug #19414 : php_cs seems to not track variables correctly in heredocs + +## [1.3.3] - 2012-02-07 +### Changed +- Added new Generic FixmeSniff that shows error messages for all FIXME comments left in your code + - Thanks to Sam Graham for the contribution +- The maxPercentage setting in the Squiz CommentedOutCodeSniff can now be overridden in a ruleset.xml file + - Thanks to Volker Dusch for the patch +- The Checkstyle and XML reports now use XMLWriter + - Only change in output is that empty file tags are no longer produced for files with no violations + - Thanks to Sebastian Bergmann for the patch +- Added PHP_CodeSniffer_Tokens::$bracketTokens to give sniff writers fast access to open and close bracket tokens +- Fixed an issue in AbstractPatternSniff where EOL tokens were not being correctly checked in some cases +- PHP_CodeSniffer_File::getTokensAsString() now detects incorrect length value (request #19313) + +### Fixed +- Fixed bug #19114 : CodeSniffer checks extension even for single file +- Fixed bug #19171 : Show sniff codes option is ignored by some report types + - Thanks to Dominic Scheirlinck for the patch +- Fixed bug #19188 : Lots of PHP Notices when analyzing the Symfony framework + - First issue was list-style.. lines in CSS files not properly adjusting open/close bracket positions + - Second issue was notices caused by bug #19137 +- Fixed bug #19208 : UpperCaseConstantName reports class members + - Was also a problem with LowerCaseConstantName as well +- Fixed bug #19256 : T_DOC_COMMENT in CSS files breaks ClassDefinitionNameSpacingSniff + - Thanks to Klaus Purer for the patch +- Fixed bug #19264 : Squiz.PHP.NonExecutableCode does not handle RETURN in CASE without BREAK +- Fixed bug #19270 : DuplicateClassName does not handle namespaces correctly +- Fixed bug #19283 : CSS @media rules cause false positives + - Thanks to Klaus Purer for the patch + +## [1.3.2] - 2011-12-01 +### Changed +- Added Generic JSHintSniff to run jshint.js over a JS file and report warnings + - Set jshint path using phpcs --config-set jshint_path /path/to/jshint-rhino.js + - Set rhino path using phpcs --config-set rhino_path /path/to/rhino + - Thanks to Alexander Weiß for the contribution +- Nowdocs are now tokenized using PHP_CodeSniffer specific T_NOWDOC tokens for easier identification +- Generic UpperCaseConstantNameSniff no longer throws errors for namespaces + - Thanks to Jaroslav Hanslík for the patch +- Squiz NonExecutableCodeSniff now detects code after thrown exceptions + - Thanks to Jaroslav Hanslík for the patch +- Squiz OperatorSpacingSniff now ignores references + - Thanks to Jaroslav Hanslík for the patch +- Squiz FunctionCommentSniff now reports a missing function comment if it finds a standard code comment instead +- Squiz FunctionCommentThrownTagSniff no longer reports errors if it can't find a function comment + +### Fixed +- Fixed unit tests not running under Windows + - Thanks to Jaroslav Hanslík for the patch +- Fixed bug #18964 : "$stackPtr must be of type T_VARIABLE" on heredocs and nowdocs +- Fixed bug #18973 : phpcs is looking for variables in a nowdoc +- Fixed bug #18974 : Blank line causes "Multi-line function call not indented correctly" + - Adds new error message to ban empty lines in multi-line function calls +- Fixed bug #18975 : "Closing parenthesis must be on a line by itself" also causes indentation error + +## [1.3.1] - 2011-11-03 +### Changed +- All report file command line arguments now work with relative paths (request #17240) +- The extensions command line argument now supports multi-part file extensions (request #17227) +- Added report type --report=hgblame to show number of errors/warnings committed by authors in a Mercurial repository + - Has the same functionality as the svnblame report + - Thanks to Ben Selby for the patch +- Added T_BACKTICK token type to make detection of backticks easier (request #18799) +- Added pattern matching support to Generic ForbiddenFunctionsSniff + - If you are extending it and overriding register() or addError() you will need to review your sniff +- Namespaces are now recognised as scope openers, although they do not require braces (request #18043) +- Added new ByteOrderMarkSniff to Generic standard (request #18194) + - Throws an error if a byte order mark is found in any PHP file + - Thanks to Piotr Karas for the contribution +- PHP_Timer output is no longer included in reports when being written to a file (request #18252) + - Also now shown for all report types if nothing is being printed to the screen +- Generic DeprecatedFunctionSniff now reports functions as deprecated and not simply forbidden (request #18288) +- PHPCS now accepts file contents from STDIN (request #18447) + - Example usage: cat temp.php | phpcs [options] -OR- phpcs [options] < temp.php + - Not every sniff will work correctly due to the lack of a valid file path +- PHP_CodeSniffer_Exception no longer extends PEAR_Exception (request #18483) + - PEAR_Exception added a requirement that PEAR had to be installed + - PHP_CodeSniffer is not used as a library, so unlikely to have any impact +- PEAR FileCommentSniff now allows GIT IDs in the version tag (request #14874) +- AbstractVariableSniff now supports heredocs + - Also includes some variable detection fixes + - Thanks to Sam Graham for the patch +- Squiz FileCommentSniff now enforces rule that package names cannot start with the word Squiz +- MySource AssignThisSniff now allows "this" to be assigned to the private var _self +- PEAR ClassDeclaration sniff now supports indentation checks when using the alternate namespace syntax + - PEAR.Classes.ClassDeclaration.SpaceBeforeBrace message now contains 2 variables instead of 1 + - Sniff allows overriding of the default indent level, which is set to 4 + - Fixes bug #18933 : Alternative namespace declaration syntax confuses scope sniffs + +### Fixed +- Fixed issue in Squiz FileCommentSniff where suggested package name was the same as the incorrect package name +- Fixed some issues with Squiz ArrayDeclarationSniff when using function calls in array values +- Fixed doc generation so it actually works again + - Also now works when being run from an SVN checkout as well as when installed as a PEAR package + - Should fix bug #18949 : Call to private method from static +- Fixed bug #18465 : "self::" does not work in lambda functions + - Also corrects conversion of T_FUNCTION tokens to T_CLOSURE, which was not fixing token condition arrays +- Fixed bug #18543 : CSS Tokenizer deletes too many # +- Fixed bug #18624 : @throws namespace problem + - Thanks to Gavin Davies for the patch +- Fixed bug #18628 : Generic.Files.LineLength gives incorrect results with Windows line-endings +- Fixed bug #18633 : CSS Tokenizer doesn't replace T_LIST tokens inside some styles +- Fixed bug #18657 : anonymous functions wrongly indented +- Fixed bug #18670 : UpperCaseConstantNameSniff fails on dynamic retrieval of class constant +- Fixed bug #18709 : Code sniffer sniffs file if even if it's in --ignore + - Thanks to Artem Lopata for the patch +- Fixed bug #18762 : Incorrect handling of define and constant in UpperCaseConstantNameSniff + - Thanks to Thomas Baker for the patch +- Fixed bug #18769 : CSS Tokenizer doesn't replace T_BREAK tokens inside some styles +- Fixed bug #18835 : Unreachable errors of inline returns of closure functions + - Thanks to Patrick Schmidt for the patch +- Fixed bug #18839 : Fix miscount of warnings in AbstractSniffUnitTest.php + - Thanks to Sam Graham for the patch +- Fixed bug #18844 : Generic_Sniffs_CodeAnalysis_UnusedFunctionParameterSniff with empty body + - Thanks to Dmitri Medvedev for the patch +- Fixed bug #18847 : Running Squiz_Sniffs_Classes_ClassDeclarationSniff results in PHP notice +- Fixed bug #18868 : jslint+rhino: errors/warnings not detected + - Thanks to Christian Weiske for the patch +- Fixed bug #18879 : phpcs-svn-pre-commit requires escapeshellarg + - Thanks to Bjorn Katuin for the patch +- Fixed bug #18951 : weird behaviour with closures and multi-line use () params + +## [1.3.0] - 2011-03-17 +### Changed +- Add a new token T_CLOSURE that replaces T_FUNCTION if the function keyword is anonymous +- Many Squiz sniffs no longer report errors when checking closures; they are now ignored +- Fixed some error messages in PEAR MultiLineConditionSniff that were not using placeholders for message data +- AbstractVariableSniff now correctly finds variable names wrapped with curly braces inside double quoted strings +- PEAR FunctionDeclarationSniff now ignores arrays in argument default values when checking multi-line declarations + +### Fixed +- Fixed bug #18200 : Using custom named ruleset file as standard no longer works +- Fixed bug #18196 : PEAR MultiLineCondition.SpaceBeforeOpenBrace not consistent with newline chars +- Fixed bug #18204 : FunctionCommentThrowTag picks wrong exception type when throwing function call +- Fixed bug #18222 : Add __invoke method to PEAR standard +- Fixed bug #18235 : Invalid error generation in Squiz.Commenting.FunctionCommentThrowTag +- Fixed bug #18250 : --standard with relative path skips Standards' "implicit" sniffs +- Fixed bug #18274 : Multi-line IF and function call indent rules conflict +- Fixed bug #18282 : Squiz doesn't handle final keyword before function comments + - Thanks to Dave Perrett for the patch +- Fixed bug #18336 : Function isUnderscoreName gives php notices + +## [1.3.0RC2] - 2011-01-14 +### Changed +- You can now print multiple reports for each run and print each to the screen or a file (request #12434) + - Format is --report-[report][=file] (e.g., --report-xml=out.xml) + - Printing to screen is done by leaving [file] empty (e.g., --report-xml) + - Multiple reports can be specified in this way (e.g., --report-summary --report-xml=out.xml) + - The standard --report and --report-file command line arguments are unchanged +- Added -d command line argument to set php.ini settings while running (request #17244) + - Usage is: phpcs -d memory_limit=32M -d ... + - Thanks to Ben Selby for the patch +- Added -p command line argument to show progress during a run + - Dot means pass, E means errors found, W means only warnings found and S means skipped file + - Particularly good for runs where you are checking more than 100 files + - Enable by default with --config-set show_progress 1 + - Will not print anything if you are already printing verbose output + - This has caused a big change in the way PHP_CodeSniffer processes files (API changes around processing) +- You can now add exclude rules for individual sniffs or error messages (request #17903) + - Only available when using a ruleset.xml file to specify rules + - Uses the same exclude-pattern tags as normal but allows them inside rule tags +- Using the -vvv option will now print a list of sniffs executed for each file and how long they took to process +- Added Generic ClosureLinterSniff to run Google's gjslint over your JS files +- The XML and CSV reports now include the severity of the error (request #18165) + - The Severity column in the CSV report has been renamed to Type, and a new Severity column added for this +- Fixed issue with Squiz FunctionCommentSniff reporting incorrect type hint when default value uses namespace + - Thanks to Anti Veeranna for the patch +- Generic FileLengthSniff now uses iconv_strlen to check line length if an encoding is specified (request #14237) +- Generic UnnecessaryStringConcatSniff now allows strings to be combined to form a PHP open or close tag +- Squiz SwitchDeclarationSniff no longer reports indentation errors for BREAK statements inside IF conditions +- Interactive mode now always prints the full error report (ignores command line) +- Improved regular expression detection in JavaScript files + - Added new T_TYPEOF token that can be used to target the typeof JS operator + - Fixes bug #17611 : Regular expression tokens not recognised +- Squiz ScopeIndentSniff removed + - Squiz standard no longer requires additional indents between ob_* methods + - Also removed Squiz OutputBufferingIndentSniff that was checking the same thing +- PHP_CodeSniffer_File::getMemberProperties() performance improved significantly + - Improves performance of Squiz ValidVariableNameSniff significantly +- Squiz OperatorSpacingSniff performance improved significantly +- Squiz NonExecutableCodeSniff performance improved significantly + - Will throw duplicate errors in some cases now, but these should be rare +- MySource IncludeSystemSniff performance improved significantly +- MySource JoinStringsSniff no longer reports an error when using join() on a named JS array +- Warnings are now reported for each file when they cannot be opened instead of stopping the script + - Hide warnings with the -n command line argument + - Can override the warnings using the code Internal.DetectLineEndings + +### Fixed +- Fixed bug #17693 : issue with pre-commit hook script with filenames that start with v +- Fixed bug #17860 : isReference function fails with references in array + - Thanks to Lincoln Maskey for the patch +- Fixed bug #17902 : Cannot run tests when tests are symlinked into tests dir + - Thanks to Matt Button for the patch +- Fixed bug #17928 : Improve error message for Generic_Sniffs_PHP_UpperCaseConstantSniff + - Thanks to Stefano Kowalke for the patch +- Fixed bug #18039 : JS Tokenizer crash when ] is last character in file +- Fixed bug #18047 : Incorrect handling of namespace aliases as constants + - Thanks to Dmitri Medvedev for the patch +- Fixed bug #18072 : Impossible to exclude path from processing when symlinked +- Fixed bug #18073 : Squiz.PHP.NonExecutableCode fault +- Fixed bug #18117 : PEAR coding standard: Method constructor not sniffed as a function +- Fixed bug #18135 : Generic FunctionCallArgumentSpacingSniff reports function declaration errors +- Fixed bug #18140 : Generic scope indent in exact mode: strange expected/found values for switch +- Fixed bug #18145 : Sniffs are not loaded for custom ruleset file + - Thanks to Scott McCammon for the patch +- Fixed bug #18152 : While and do-while with AbstractPatternSniff +- Fixed bug #18191 : Squiz.PHP.LowercasePHPFunctions does not work with new Date() +- Fixed bug #18193 : CodeSniffer doesn't reconize CR (\r) line endings + +## [1.3.0RC1] - 2010-09-03 +### Changed +- Added exclude pattern support to ruleset.xml file so you can specify ignore patterns in a standard (request #17683) + - Use new exclude-pattern tags to include the ignore rules into your ruleset.xml file + - See CodeSniffer/Standards/PHPCS/ruleset.xml for an example +- Added new --encoding command line argument to specify the encoding of the files being checked + - When set to utf-8, stops the XML-based reports from double-encoding + - When set to something else, helps the XML-based reports encode to utf-8 + - Default value is iso-8859-1 but can be changed with --config-set encoding [value] +- The report is no longer printed to screen when using the --report-file command line option (request #17467) + - If you want to print it to screen as well, use the -v command line argument +- The SVN and GIT blame reports now also show percentage of reported errors per author (request #17606) + - Thanks to Ben Selby for the patch +- Updated the SVN pre-commit hook to work with the new severity levels feature +- Generic SubversionPropertiesSniff now allows properties to have NULL values (request #17682) + - A null value indicates that the property should exist but the value should not be checked +- Generic UpperCaseConstantName Sniff now longer complains about the PHPUnit_MAIN_METHOD constant (request #17798) +- Squiz FileComment sniff now checks JS files as well as PHP files +- Squiz FunctionCommentSniff now supports namespaces in type hints + +### Fixed +- Fixed a problem in Squiz OutputBufferingIndentSniff where block comments were reported as not indented +- Fixed bug #17092 : Problems with utf8_encode and htmlspecialchars with non-ascii chars + - Use the new --encoding=utf-8 command line argument if your files are utf-8 encoded +- Fixed bug #17629 : PHP_CodeSniffer_Tokens::$booleanOperators missing T_LOGICAL_XOR + - Thanks to Matthew Turland for the patch +- Fixed bug #17699 : Fatal error generating code coverage with PHPUnit 5.3.0RC1 +- Fixed bug #17718 : Namespace 'use' statement: used global class name is recognized as constant +- Fixed bug #17734 : Generic SubversionPropertiesSniff complains on non SVN files +- Fixed bug #17742 : EmbeddedPhpSniff reacts negatively to file without closing php tag +- Fixed bug #17823 : Notice: Please no longer include PHPUnit/Framework.php + +## [1.3.0a1] - 2010-07-15 +### Changed +- All CodingStandard.php files have been replaced by ruleset.xml files + - Custom standards will need to be converted over to this new format to continue working +- You can specify a path to your own custom ruleset.xml file by using the --standard command line arg + - e.g., phpcs --standard=/path/to/my/ruleset.xml +- Added a new report type --report=gitblame to show how many errors and warnings were committed by each author + - Has the same functionality as the svnblame report + - Thanks to Ben Selby for the patch +- A new token type T_DOLLAR has been added to allow you to sniff for variable variables (feature request #17095) + - Thanks to Ian Young for the patch +- JS tokenizer now supports T_POWER (^) and T_MOD_EQUAL (%=) tokens (feature request #17441) +- If you have PHP_Timer installed, you'll now get a time/memory summary at the end of a script run + - Only happens when printing reports that are designed to be read on the command line +- Added Generic DeprecatedFunctionsSniff to warn about the use of deprecated functions (feature request #16694) + - Thanks to Sebastian Bergmann for the patch +- Added Squiz LogicalOperatorSniff to ensure that logical operators are surrounded by single spaces +- Added MySource ChannelExceptionSniff to ensure action files only throw ChannelException +- Added new method getClassProperties() for sniffs to use to determine if a class is abstract and/or final + - Thanks to Christian Kaps for the patch +- Generic UpperCaseConstantSniff no longer throws errors about namespaces + - Thanks to Christian Kaps for the patch +- Squiz OperatorBracketSniff now correctly checks value assignments in arrays +- Squiz LongConditionClosingCommentSniff now requires a comment for long CASE statements that use curly braces +- Squiz LongConditionClosingCommentSniff now requires an exact comment match on the brace +- MySource IncludeSystemSniff now ignores DOMDocument usage +- MySource IncludeSystemSniff no longer requires inclusion of systems that are being implemented +- Removed found and expected messages from Squiz ConcatenationSpacingSniff because they were messy and not helpful + +### Fixed +- Fixed a problem where Generic CodeAnalysisSniff could show warnings if checking multi-line strings +- Fixed error messages in Squiz ArrayDeclarationSniff reporting incorrect number of found and expected spaces +- Fixed bug #17048 : False positive in Squiz_WhiteSpace_ScopeKeywordSpacingSniff +- Fixed bug #17054 : phpcs more strict than PEAR CS regarding function parameter spacing +- Fixed bug #17096 : Notice: Undefined index: scope_condition in ScopeClosingBraceSniff.php + - Moved PEAR.Functions.FunctionCallArgumentSpacing to Generic.Functions.FunctionCallArgumentSpacing +- Fixed bug #17144 : Deprecated: Function eregi() is deprecated +- Fixed bug #17236 : PHP Warning due to token_get_all() in DoubleQuoteUsageSniff +- Fixed bug #17243 : Alternate Switch Syntax causes endless loop of Notices in SwitchDeclaration +- Fixed bug #17313 : Bug with switch case structure +- Fixed bug #17331 : Possible parse error: interfaces may not include member vars +- Fixed bug #17337 : CSS tokenizer fails on quotes urls +- Fixed bug #17420 : Uncaught exception when comment before function brace +- Fixed bug #17503 : closures formatting is not supported + +## [1.2.2] - 2010-01-27 +### Changed +- The core PHP_CodeSniffer_File methods now understand the concept of closures (feature request #16866) + - Thanks to Christian Kaps for the sample code +- Sniffs can now specify violation codes for each error and warning they add + - Future versions will allow you to override messages and severities using these codes + - Specifying a code is optional, but will be required if you wish to support overriding +- All reports have been broken into separate classes + - Command line usage and report output remains the same + - Thanks to Gabriele Santini for the patch +- Added an interactive mode that can be enabled using the -a command line argument + - Scans files and stops when it finds a file with errors + - Waits for user input to recheck the file (hopefully you fixed the errors) or skip the file + - Useful for very large code bases where full rechecks take a while +- The reports now show the correct number of errors and warnings found +- The isCamelCaps method now allows numbers in class names +- The JS tokenizer now correctly identifies boolean and bitwise AND and OR tokens +- The JS tokenizer now correctly identifies regular expressions used in conditions +- PEAR ValidFunctionNameSniff now ignores closures +- Squiz standard now uses the PEAR setting of 85 chars for LineLengthSniff +- Squiz ControlStructureSpacingSniff now ensure there are no spaces around parentheses +- Squiz LongConditionClosingCommentSniff now checks for comments at the end of try/catch statements +- Squiz LongConditionClosingCommentSniff now checks validity of comments for short structures if they exist +- Squiz IncrementDecrementUsageSniff now has better checking to ensure it only looks at simple variable assignments +- Squiz PostStatementCommentSniff no longer throws errors for end function comments +- Squiz InlineCommentSniff no longer throws errors for end function comments +- Squiz OperatorBracketSniff now allows simple arithmetic operations in SWITCH conditions +- Squiz ValidFunctionNameSniff now ignores closures +- Squiz MethodScopeSniff now ignores closures +- Squiz ClosingDeclarationCommentSniff now ignores closures +- Squiz GlobalFunctionSniff now ignores closures +- Squiz DisallowComparisonAssignmentSniff now ignores the assigning of arrays +- Squiz DisallowObjectStringIndexSniff now allows indexes that contain dots and reserved words +- Squiz standard now throws nesting level and cyclomatic complexity errors at much higher levels +- Squiz CommentedOutCodeSniff now ignores common comment framing characters +- Squiz ClassCommentSniff now ensures the open comment tag is the only content on the first line +- Squiz FileCommentSniff now ensures the open comment tag is the only content on the first line +- Squiz FunctionCommentSniff now ensures the open comment tag is the only content on the first line +- Squiz VariableCommentSniff now ensures the open comment tag is the only content on the first line +- Squiz NonExecutableCodeSniff now warns about empty return statements that are not required +- Removed ForbiddenStylesSniff from Squiz standard + - It is now in in the MySource standard as BrowserSpecificStylesSniff + - New BrowserSpecificStylesSniff ignores files with browser-specific suffixes +- MySource IncludeSystemSniff no longer throws errors when extending the Exception class +- MySource IncludeSystemSniff no longer throws errors for the abstract widget class +- MySource IncludeSystemSniff and UnusedSystemSniff now allow includes inside IF statements +- MySource IncludeSystemSniff no longer throws errors for included widgets inside methods +- MySource GetRequestDataSniff now throws errors for using $_FILES +- MySource CreateWidgetTypeCallbackSniff now allows return statements in nested functions +- MySource DisallowSelfActionsSniff now ignores abstract classes + +### Fixed +- Fixed a problem with the SVN pre-commit hook for PHP versions without vertical whitespace regex support +- Fixed bug #16740 : False positives for heredoc strings and unused parameter sniff +- Fixed bug #16794 : ValidLogicalOperatorsSniff doesn't report operators not in lowercase +- Fixed bug #16804 : Report filename is shortened too much +- Fixed bug #16821 : Bug in Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff + - Thanks to Jaroslav Hanslík for the patch +- Fixed bug #16836 : Notice raised when using semicolon to open case +- Fixed bug #16855 : Generic standard sniffs incorrectly for define() method +- Fixed bug #16865 : Two bugs in Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff + - Thanks to Jaroslav Hanslík for the patch +- Fixed bug #16902 : Inline If Declaration bug +- Fixed bug #16960 : False positive for late static binding in Squiz/ScopeKeywordSpacingSniff + - Thanks to Jakub Tománek for the patch +- Fixed bug #16976 : The phpcs attempts to process symbolic links that don't resolve to files +- Fixed bug #17017 : Including one file in the files sniffed alters errors reported for another file + +## [1.2.1] - 2009-11-17 +### Changed +- Added a new report type --report=svnblame to show how many errors and warnings were committed by each author + - Also shows the percentage of their code that are errors and warnings + - Requires you to have the SVN command in your path + - Make sure SVN is storing usernames and passwords (if required) or you will need to enter them for each file + - You can also use the -s command line argument to see the different types of errors authors are committing + - You can use the -v command line argument to see all authors, even if they have no errors or warnings +- Added a new command line argument --report-width to allow you to set the column width of screen reports + - Reports wont accept values less than 70 or else they get too small + - Can also be set via a config var: phpcs --config-set report_width 100 +- You can now get PHP_CodeSniffer to ignore a whole file by adding @codingStandardsIgnoreFile in the content + - If you put it in the first two lines the file wont even be tokenized, so it will be much quicker +- Reports now print their file lists in alphabetical order +- PEAR FunctionDeclarationSniff now reports error for incorrect closing bracket placement in multi-line definitions +- Added Generic CallTimePassByReferenceSniff to prohibit the passing of variables into functions by reference + - Thanks to Florian Grandel for the contribution +- Added Squiz DisallowComparisonAssignmentSniff to ban the assignment of comparison values to a variable +- Added Squiz DuplicateStyleDefinitionSniff to check for duplicate CSS styles in a single class block +- Squiz ArrayDeclarationSniff no longer checks the case of array indexes because that is not its job +- Squiz PostStatementCommentSniff now allows end comments for class member functions +- Squiz InlineCommentSniff now supports the checking of JS files +- MySource CreateWidgetTypeCallbackSniff now allows the callback to be passed to another function +- MySource CreateWidgetTypeCallbackSniff now correctly ignores callbacks used inside conditions +- Generic MultipleStatementAlignmentSniff now enforces a single space before equals sign if max padding is reached +- Fixed a problem in the JS tokenizer where regular expressions containing \// were not converted correctly +- Fixed a problem tokenizing CSS files where multiple ID targets on a line would look like comments +- Fixed a problem tokenizing CSS files where class names containing a colon looked like style definitions +- Fixed a problem tokenizing CSS files when style statements had empty url() calls +- Fixed a problem tokenizing CSS colours with the letter E in first half of the code +- Squiz ColonSpacingSniff now ensures it is only checking style definitions in CSS files and not class names +- Squiz DisallowComparisonAssignmentSniff no longer reports errors when assigning the return value of a function +- CSS tokenizer now correctly supports multi-line comments +- When only the case of var names differ for function comments, the error now indicates the case is different + +### Fixed +- Fixed an issue with Generic UnnecessaryStringConcatSniff where it incorrectly suggested removing a concat +- Fixed bug #16530 : ScopeIndentSniff reports false positive +- Fixed bug #16533 : Duplicate errors and warnings +- Fixed bug #16563 : Check file extensions problem in phpcs-svn-pre-commit + - Thanks to Kaijung Chen for the patch +- Fixed bug #16592 : Object operator indentation incorrect when first operator is on a new line +- Fixed bug #16641 : Notice output +- Fixed bug #16682 : Squiz_Sniffs_Strings_DoubleQuoteUsageSniff reports string "\0" as invalid +- Fixed bug #16683 : Typing error in PHP_CodeSniffer_CommentParser_AbstractParser +- Fixed bug #16684 : Bug in Squiz_Sniffs_PHP_NonExecutableCodeSniff +- Fixed bug #16692 : Spaces in paths in Squiz_Sniffs_Debug_JavaScriptLintSniff + - Thanks to Jaroslav Hanslík for the patch +- Fixed bug #16696 : Spelling error in MultiLineConditionSniff +- Fixed bug #16697 : MultiLineConditionSniff incorrect result with inline IF +- Fixed bug #16698 : Notice in JavaScript Tokenizer +- Fixed bug #16736 : Multi-files sniffs aren't processed when FILE is a single directory + - Thanks to Alexey Shein for the patch +- Fixed bug #16792 : Bug in Generic_Sniffs_PHP_ForbiddenFunctionsSniff + +## [1.2.0] - 2009-08-17 +### Changed +- Installed standards are now favoured over custom standards when using the cmd line arg with relative paths +- Unit tests now use a lot less memory while running +- Squiz standard now uses Generic EmptyStatementSniff but throws errors instead of warnings +- Squiz standard now uses Generic UnusedFunctionParameterSniff +- Removed unused ValidArrayIndexNameSniff from the Squiz standard + +### Fixed +- Fixed bug #16424 : SubversionPropertiesSniff print PHP Warning +- Fixed bug #16450 : Constant PHP_CODESNIFFER_VERBOSITY already defined (unit tests) +- Fixed bug #16453 : function declaration long line splitted error +- Fixed bug #16482 : phpcs-svn-pre-commit ignores extensions parameter + +## [1.2.0RC3] - 2009-07-07 +### Changed +- You can now use @codingStandardsIgnoreStart and @...End comments to suppress messages (feature request #14002) +- A warning is now included for files without any code when short_open_tag is set to Off (feature request #12952) +- You can now use relative paths to your custom standards with the --standard cmd line arg (feature request #14967) +- You can now override magic methods and functions in PEAR ValidFunctionNameSniff (feature request #15830) +- MySource IncludeSystemSniff now recognises widget action classes +- MySource IncludeSystemSniff now knows about unit test classes and changes rules accordingly + +## [1.2.0RC2] - 2009-05-25 +### Changed +- Test suite can now be run using the full path to AllTests.php (feature request #16179) + +### Fixed +- Fixed bug #15980 : PHP_CodeSniffer change php current directory + - Thanks to Dolly Aswin Harahap for the patch +- Fixed bug #16001 : Notice triggered +- Fixed bug #16054 : phpcs-svn-pre-commit not showing any errors +- Fixed bug #16071 : Fatal error: Uncaught PHP_CodeSniffer_Exception +- Fixed bug #16170 : Undefined Offset -1 in MultiLineConditionSniff.php on line 68 +- Fixed bug #16175 : Bug in Squiz-IncrementDecrementUsageSniff + +## [1.2.0RC1] - 2009-03-09 +### Changed +- Reports that are output to a file now include a trailing newline at the end of the file +- Fixed sniff names not shown in -vvv token processing output +- Added Generic SubversionPropertiesSniff to check that specific svn props are set for files + - Thanks to Jack Bates for the contribution +- The PHP version check can now be overridden in classes that extend PEAR FileCommentSniff + - Thanks to Helgi Þormar Þorbjörnsson for the suggestion +- Added Generic ConstructorNameSniff to check for PHP4 constructor name usage + - Thanks to Leif Wickland for the contribution +- Squiz standard now supports multi-line function and condition sniffs from PEAR standard +- Squiz standard now uses Generic ConstructorNameSniff +- Added MySource GetRequestDataSniff to ensure REQUEST, GET and POST are not accessed directly +- Squiz OperatorBracketSniff now allows square brackets in simple unbracketed operations + +### Fixed +- Fixed the incorrect tokenizing of multi-line block comments in CSS files +- Fixed bug #15383 : Uncaught PHP_CodeSniffer_Exception +- Fixed bug #15408 : An unexpected exception has been caught: Undefined offset: 2 +- Fixed bug #15519 : Uncaught PHP_CodeSniffer_Exception +- Fixed bug #15624 : Pre-commit hook fails with PHP errors +- Fixed bug #15661 : Uncaught PHP_CodeSniffer_Exception +- Fixed bug #15722 : "declare(encoding = 'utf-8');" leads to "Missing file doc comment" +- Fixed bug #15910 : Object operator indention not calculated correctly + +## [1.2.0a1] - 2008-12-18 +### Changed +- PHP_CodeSniffer now has a CSS tokenizer for checking CSS files +- Added support for a new multi-file sniff that sniffs all processed files at once +- Added new output format --report=emacs to output errors using the emacs standard compile output format + - Thanks to Len Trigg for the contribution +- Reports can now be written to a file using the --report-file command line argument (feature request #14953) + - The report is also written to screen when using this argument +- The CheckStyle, CSV and XML reports now include a source for each error and warning (feature request #13242) + - A new report type --report=source can be used to show you the most common errors in your files +- Added new command line argument -s to show error sources in all reports +- Added new command line argument --sniffs to specify a list of sniffs to restrict checking to + - Uses the sniff source codes that are optionally displayed in reports +- Changed the max width of error lines from 80 to 79 chars to stop blank lines in the default windows cmd window +- PHP_CodeSniffer now has a token for an asperand (@ symbol) so sniffs can listen for them + - Thanks to Andy Brockhurst for the patch +- Added Generic DuplicateClassNameSniff that will warn if the same class name is used in multiple files + - Not currently used by any standard; more of a multi-file sniff sample than anything useful +- Added Generic NoSilencedErrorsSniff that warns if PHP errors are being silenced using the @ symbol + - Thanks to Andy Brockhurst for the contribution +- Added Generic UnnecessaryStringConcatSniff that checks for two strings being concatenated +- Added PEAR FunctionDeclarationSniff to enforce the new multi-line function declaration PEAR standard +- Added PEAR MultiLineAssignmentSniff to enforce the correct indentation of multi-line assignments +- Added PEAR MultiLineConditionSniff to enforce the new multi-line condition PEAR standard +- Added PEAR ObjectOperatorIndentSniff to enforce the new chained function call PEAR standard +- Added MySource DisallowSelfActionSniff to ban the use of self::method() calls in Action classes +- Added MySource DebugCodeSniff to ban the use of Debug::method() calls +- Added MySource CreateWidgetTypeCallback sniff to check callback usage in widget type create methods +- Added Squiz DisallowObjectStringIndexSniff that forces object dot notation in JavaScript files + - Thanks to Sertan Danis for the contribution +- Added Squiz DiscouragedFunctionsSniff to warn when using debug functions +- Added Squiz PropertyLabelSniff to check whitespace around colons in JS property and label declarations +- Added Squiz DuplicatePropertySniff to check for duplicate property names in JS classes +- Added Squiz ColonSpacingSniff to check for spacing around colons in CSS style definitions +- Added Squiz SemicolonSpacingSniff to check for spacing around semicolons in CSS style definitions +- Added Squiz IndentationSniff to check for correct indentation of CSS files +- Added Squiz ColourDefinitionSniff to check that CSS colours are defined in uppercase and using shorthand +- Added Squiz EmptyStyleDefinitionSniff to check for CSS style definitions without content +- Added Squiz EmptyClassDefinitionSniff to check for CSS class definitions without content +- Added Squiz ClassDefinitionOpeningBraceSpaceSniff to check for spaces around opening brace of CSS class definitions +- Added Squiz ClassDefinitionClosingBraceSpaceSniff to check for a single blank line after CSS class definitions +- Added Squiz ClassDefinitionNameSpacingSniff to check for a blank lines inside CSS class definition names +- Added Squiz DisallowMultipleStyleDefinitionsSniff to check for multiple style definitions on a single line +- Added Squiz DuplicateClassDefinitionSniff to check for duplicate CSS class blocks that can be merged +- Added Squiz ForbiddenStylesSniff to check for usage of browser specific styles +- Added Squiz OpacitySniff to check for incorrect opacity values in CSS +- Added Squiz LowercaseStyleDefinitionSniff to check for styles that are not defined in lowercase +- Added Squiz MissingColonSniff to check for style definitions where the colon has been forgotten +- Added Squiz MultiLineFunctionDeclarationSniff to check that multi-line declarations contain one param per line +- Added Squiz JSLintSniff to check for JS errors using the jslint.js script through Rhino + - Set jslint path using phpcs --config-set jslint_path /path/to/jslint.js + - Set rhino path using phpcs --config-set rhino_path /path/to/rhino +- Added Generic TodoSniff that warns about comments that contain the word TODO +- Removed MultipleStatementAlignmentSniff from the PEAR standard as alignment is now optional +- Generic ForbiddenFunctionsSniff now has protected member var to specify if it should use errors or warnings +- Generic MultipleStatementAlignmentSniff now has correct error message if assignment is on a new line +- Generic MultipleStatementAlignmentSniff now has protected member var to allow it to ignore multi-line assignments +- Generic LineEndingsSniff now supports checking of JS files +- Generic LineEndingsSniff now supports checking of CSS files +- Generic DisallowTabIndentSniff now supports checking of CSS files +- Squiz DoubleQuoteUsageSniff now bans the use of variables in double quoted strings in favour of concatenation +- Squiz SuperfluousWhitespaceSniff now supports checking of JS files +- Squiz SuperfluousWhitespaceSniff now supports checking of CSS files +- Squiz DisallowInlineIfSniff now supports checking of JS files +- Squiz SemicolonSpacingSniff now supports checking of JS files +- Squiz PostStatementCommentSniff now supports checking of JS files +- Squiz FunctionOpeningBraceSpacingSniff now supports checking of JS files +- Squiz FunctionClosingBraceSpacingSniff now supports checking of JS files + - Empty JS functions must have their opening and closing braces next to each other +- Squiz ControlStructureSpacingSniff now supports checking of JS files +- Squiz LongConditionClosingCommentSniff now supports checking of JS files +- Squiz OperatorSpacingSniff now supports checking of JS files +- Squiz SwitchDeclarationSniff now supports checking of JS files +- Squiz CommentedOutCodeSniff now supports checking of CSS files +- Squiz DisallowSizeFunctionsInLoopsSniff now supports checking of JS files for the use of object.length +- Squiz DisallowSizeFunctionsInLoopsSniff no longer complains about size functions outside of the FOR condition +- Squiz ControlStructureSpacingSniff now bans blank lines at the end of a control structure +- Squiz ForLoopDeclarationSniff no longer throws errors for JS FOR loops without semicolons +- Squiz MultipleStatementAlignmentSniff no longer throws errors if a statement would take more than 8 spaces to align +- Squiz standard now uses Generic TodoSniff +- Squiz standard now uses Generic UnnecessaryStringConcatSniff +- Squiz standard now uses PEAR MultiLineAssignmentSniff +- Squiz standard now uses PEAR MultiLineConditionSniff +- Zend standard now uses OpeningFunctionBraceBsdAllmanSniff (feature request #14647) +- MySource JoinStringsSniff now bans the use of inline array joins and suggests the + operator +- Fixed incorrect errors that can be generated from abstract scope sniffs when moving to a new file +- Core tokenizer now matches orphaned curly braces in the same way as square brackets +- Whitespace tokens at the end of JS files are now added to the token stack +- JavaScript tokenizer now identifies properties and labels as new token types +- JavaScript tokenizer now identifies object definitions as a new token type and matches curly braces for them +- JavaScript tokenizer now identifies DIV_EQUAL and MUL_EQUAL tokens +- Improved regular expression detection in the JavaScript tokenizer +- Improve AbstractPatternSniff support so it can listen for any token type, not just weighted tokens + +### Fixed +- Fixed Squiz DoubleQuoteUsageSniff so it works correctly with short_open_tag=Off +- Fixed bug #14409 : Output of warnings to log file +- Fixed bug #14520 : Notice: Undefined offset: 1 in /usr/share/php/PHP/CodeSniffer/File.php on line +- Fixed bug #14637 : Call to processUnknownArguments() misses second parameter $pos + - Thanks to Peter Buri for the patch +- Fixed bug #14889 : Lack of clarity: licence or license +- Fixed bug #15008 : Nested Parentheses in Control Structure Sniffs +- Fixed bug #15091 : pre-commit hook attempts to sniff folders + - Thanks to Bruce Weirdan for the patch +- Fixed bug #15124 : AbstractParser.php uses deprecated split() function + - Thanks to Sebastian Bergmann for the patch +- Fixed bug #15188 : PHPCS vs HEREDOC strings +- Fixed bug #15231 : Notice: Uninitialized string offset: 0 in FileCommentSniff.php on line 555 +- Fixed bug #15336 : Notice: Undefined offset: 2 in /usr/share/php/PHP/CodeSniffer/File.php on line + +## [1.1.0] - 2008-07-14 +### Changed +- PEAR FileCommentSniff now allows tag orders to be overridden in child classes + - Thanks to Jeff Hodsdon for the patch +- Added Generic DisallowMultipleStatementsSniff to ensure there is only one statement per line +- Squiz standard now uses DisallowMultipleStatementsSniff + +### Fixed +- Fixed error in Zend ValidVariableNameSniff when checking vars in form: $class->{$var} +- Fixed bug #14077 : Fatal error: Uncaught PHP_CodeSniffer_Exception: $stackPtr is not a class member +- Fixed bug #14168 : Global Function -> Static Method and __autoload() +- Fixed bug #14238 : Line length not checked at last line of a file +- Fixed bug #14249 : wrong detection of scope_opener +- Fixed bug #14250 : ArrayDeclarationSniff emit warnings at malformed array +- Fixed bug #14251 : --extensions option doesn't work + +## [1.1.0RC3] - 2008-07-03 +### Changed +- PEAR FileCommentSniff now allows tag orders to be overridden in child classes + - Thanks to Jeff Hodsdon for the patch +- Added Generic DisallowMultipleStatementsSniff to ensure there is only one statement per line +- Squiz standard now uses DisallowMultipleStatementsSniff + +### Fixed +- Fixed error in Zend ValidVariableNameSniff when checking vars in form: $class->{$var} +- Fixed bug #14077 : Fatal error: Uncaught PHP_CodeSniffer_Exception: $stackPtr is not a class member +- Fixed bug #14168 : Global Function -> Static Method and __autoload() +- Fixed bug #14238 : Line length not checked at last line of a file +- Fixed bug #14249 : wrong detection of scope_opener +- Fixed bug #14250 : ArrayDeclarationSniff emit warnings at malformed array +- Fixed bug #14251 : --extensions option doesn't work + +## [1.1.0RC2] - 2008-06-13 +### Changed +- Permission denied errors now stop script execution but still display current errors (feature request #14076) +- Added Squiz ValidArrayIndexNameSniff to ensure array indexes do not use camel case +- Squiz ArrayDeclarationSniff now ensures arrays are not declared with camel case index values +- PEAR ValidVariableNameSniff now alerts about a possible parse error for member vars inside an interface + +### Fixed +- Fixed bug #13921 : js parsing fails for comments on last line of file +- Fixed bug #13922 : crash in case of malformed (but tokenized) php file + - PEAR and Squiz ClassDeclarationSniff now throw warnings for possible parse errors + - Squiz ValidClassNameSniff now throws warning for possible parse errors + - Squiz ClosingDeclarationCommentSniff now throws additional warnings for parse errors + +## [1.1.0RC1] - 2008-05-13 +### Changed +- Added support for multiple tokenizers so PHP_CodeSniffer can check more than just PHP files + - PHP_CodeSniffer now has a JS tokenizer for checking JavaScript files + - Sniffs need to be updated to work with additional tokenizers, or new sniffs written for them +- phpcs now exits with status 2 if the tokenizer extension has been disabled (feature request #13269) +- Added scripts/phpcs-svn-pre-commit that can be used as an SVN pre-commit hook + - Also reworked the way the phpcs script works to make it easier to wrap it with other functionality + - Thanks to Jack Bates for the contribution +- Fixed error in phpcs error message when a supplied file does not exist +- Fixed a cosmetic error in AbstractPatternSniff where the "found" string was missing some content +- Added sniffs that implement part of the PMD rule catalog to the Generic standard + - Thanks to Manuel Pichler for the contribution of all these sniffs. +- Squiz FunctionCommentThrowTagSniff no longer throws errors for function that only throw variables +- Generic ScopeIndentSniff now has private member to enforce exact indent matching +- Replaced Squiz DisallowCountInLoopsSniff with Squiz DisallowSizeFunctionsInLoopsSniff + - Thanks to Jan Miczaika for the sniff +- Squiz BlockCommentSniff now checks inline doc block comments +- Squiz InlineCommentSniff now checks inline doc block comments +- Squiz BlockCommentSniff now checks for no blank line before first comment in a function +- Squiz DocCommentAlignmentSniff now ignores inline doc block comments +- Squiz ControlStructureSpacingSniff now ensures no blank lines at the start of control structures +- Squiz ControlStructureSpacingSniff now ensures no blank lines between control structure closing braces +- Squiz IncrementDecrementUsageSniff now ensures inc/dec ops are bracketed in string concats +- Squiz IncrementDecrementUsageSniff now ensures inc/dec ops are not used in arithmetic operations +- Squiz FunctionCommentSniff no longer throws errors if return value is mixed but function returns void somewhere +- Squiz OperatorBracketSniff no allows function call brackets to count as operator brackets +- Squiz DoubleQuoteUsageSniff now supports \x \f and \v (feature request #13365) +- Squiz ComparisonOperatorUsageSniff now supports JS files +- Squiz ControlSignatureSniff now supports JS files +- Squiz ForLoopDeclarationSniff now supports JS files +- Squiz OperatorBracketSniff now supports JS files +- Squiz InlineControlStructureSniff now supports JS files +- Generic LowerCaseConstantSniff now supports JS files +- Generic DisallowTabIndentSniff now supports JS files +- Generic MultipleStatementAlignmentSniff now supports JS files +- Added Squiz ObjectMemberCommaSniff to ensure the last member of a JS object is not followed by a comma +- Added Squiz ConstantCaseSniff to ensure the PHP constants are uppercase and JS lowercase +- Added Squiz JavaScriptLintSniff to check JS files with JSL + - Set path using phpcs --config-set jsl_path /path/to/jsl +- Added MySource FirebugConsoleSniff to ban the use of "console" for JS variable and function names +- Added MySource JoinStringsSniff to enforce the use of join() to concatenate JS strings +- Added MySource AssignThisSniff to ensure this is only assigned to a var called self +- Added MySource DisallowNewWidgetSniff to ban manual creation of widget objects +- Removed warning shown in Zend CodeAnalyzerSniff when the ZCA path is not set + +### Fixed +- Fixed error in Squiz ValidVariableNameSniff when checking vars in the form $obj->$var +- Fixed error in Squiz DisallowMultipleAssignmentsSniff when checking vars in the form $obj->$var +- Fixed error in Squiz InlineCommentSniff where comments for class constants were seen as inline +- Fixed error in Squiz BlockCommentSniff where comments for class constants were not ignored +- Fixed error in Squiz OperatorBracketSniff where negative numbers were ignored during comparisons +- Fixed error in Squiz FunctionSpacingSniff where functions after member vars reported incorrect spacing +- Fixed bug #13062 : Interface comments aren't handled in PEAR standard + - Thanks to Manuel Pichler for the path +- Fixed bug #13119 : php minimum requirement need to be fix +- Fixed bug #13156 : Bug in Squiz_Sniffs_PHP_NonExecutableCodeSniff +- Fixed bug #13158 : Strange behaviour in AbstractPatternSniff +- Fixed bug #13169 : Undefined variables +- Fixed bug #13178 : Catch exception in File.php +- Fixed bug #13254 : Notices output in checkstyle report causes XML issues +- Fixed bug #13446 : crash with src of phpMyAdmin + - Thanks to Manuel Pichler for the path + +## [1.0.1a1] - 2008-04-21 +### Changed +- Fixed error in PEAR ValidClassNameSniff when checking class names with double underscores +- Moved Squiz InlineControlStructureSniff into Generic standard +- PEAR standard now throws warnings for inline control structures +- Squiz OutputBufferingIndentSniff now ignores the indentation of inline HTML +- MySource IncludeSystemSniff now ignores usage of ZipArchive +- Removed "function" from error messages for Generic function brace sniffs (feature request #13820) +- Generic UpperCaseConstantSniff no longer throws errors for declare(ticks = ...) + - Thanks to Josh Snyder for the patch +- Squiz ClosingDeclarationCommentSniff and AbstractVariableSniff now throw warnings for possible parse errors + +### Fixed +- Fixed bug #13827 : AbstractVariableSniff throws "undefined index" +- Fixed bug #13846 : Bug in Squiz.NonExecutableCodeSniff +- Fixed bug #13849 : infinite loop in PHP_CodeSniffer_File::findNext() + +## [1.0.1] - 2008-02-04 +### Changed +- Squiz ArrayDeclarationSniff now throws error if the array keyword is followed by a space +- Squiz ArrayDeclarationSniff now throws error for empty multi-line arrays +- Squiz ArrayDeclarationSniff now throws error for multi-line arrays with a single value +- Squiz DocCommentAlignmentSniff now checks for a single space before tags inside docblocks +- Squiz ForbiddenFunctionsSniff now disallows is_null() to force use of (=== NULL) instead +- Squiz VariableCommentSniff now continues throwing errors after the first one is found +- Squiz SuperfluousWhitespaceSniff now throws errors for multiple blank lines inside functions +- MySource IncludedSystemSniff now checks extended class names +- MySource UnusedSystemSniff now checks extended and implemented class names +- MySource IncludedSystemSniff now supports includeWidget() +- MySource UnusedSystemSniff now supports includeWidget() +- Added PEAR ValidVariableNameSniff to check that only private member vars are prefixed with an underscore +- Added Squiz DisallowCountInLoopsSniff to check for the use of count() in FOR and WHILE loop conditions +- Added MySource UnusedSystemSniff to check for included classes that are never used + +### Fixed +- Fixed a problem that caused the parentheses map to sometimes contain incorrect values +- Fixed bug #12767 : Cant run phpcs from dir with PEAR subdir +- Fixed bug #12773 : Reserved variables are not detected in strings + - Thanks to Wilfried Loche for the patch +- Fixed bug #12832 : Tab to space conversion does not work +- Fixed bug #12888 : extra space indentation = Notice: Uninitialized string offset... +- Fixed bug #12909 : Default generateDocs function does not work under linux + - Thanks to Paul Smith for the patch +- Fixed bug #12957 : PHP 5.3 magic method __callStatic + - Thanks to Manuel Pichler for the patch + +## [1.0.0] - 2007-12-21 +### Changed +- You can now specify the full path to a coding standard on the command line (feature request #11886) + - This allows you to use standards that are stored outside of PHP_CodeSniffer's own Standard dir + - You can also specify full paths in the CodingStandard.php include and exclude methods + - Classes, dirs and files need to be names as if the standard was part of PHP_CodeSniffer + - Thanks to Dirk Thomas for the doc generator patch and testing +- Modified the scope map to keep checking after 3 lines for some tokens (feature request #12561) + - Those tokens that must have an opener (like T_CLASS) now keep looking until EOF + - Other tokens (like T_FUNCTION) still stop after 3 lines for performance +- You can now escape commas in ignore patterns so they can be matched in file names + - Thanks to Carsten Wiedmann for the patch +- Config data is now cached in a global var so the file system is not hit so often + - You can also set config data temporarily for the script if you are using your own external script + - Pass TRUE as the third argument to PHP_CodeSniffer::setConfigData() +- PEAR ClassDeclarationSniff no longer throws errors for multi-line class declarations +- Squiz ClassDeclarationSniff now ensures there is one blank line after a class closing brace +- Squiz ClassDeclarationSniff now throws errors for a missing end PHP tag after the end class tag +- Squiz IncrementDecrementUsageSniff no longer throws errors when -= and += are being used with vars +- Squiz SwitchDeclarationSniff now throws errors for switch statements that do not contain a case statement + - Thanks to Sertan Danis for the patch +- MySource IncludeSystemSniff no longer throws errors for the Util package + +### Fixed +- Fixed bug #12621 : "space after AS" check is wrong + - Thanks to Satoshi Oikawa for the patch +- Fixed bug #12645 : error message is wrong + - Thanks to Renoiv for the patch +- Fixed bug #12651 : Increment/Decrement Operators Usage at -1 + +## [1.0.0RC3] - 2007-11-30 +### Changed +- Added new command line argument --tab-width that will convert tabs to spaces before testing + - This allows you to use the existing sniffs that check for spaces even when you use tabs + - Can also be set via a config var: phpcs --config-set tab_width 4 + - A value of zero (the default) tells PHP_CodeSniffer not to replace tabs with spaces +- You can now change the default report format from "full" to something else + - Run: phpcs --config-set report_format [format] +- Improved performance by optimising the way the scope map is created during tokenising +- Added new Squiz DisallowInlineIfSniff to disallow the usage of inline IF statements +- Fixed incorrect errors being thrown for nested switches in Squiz SwitchDeclarationSniff +- PEAR FunctionCommentSniff no longer complains about missing comments for @throws tags +- PEAR FunctionCommentSniff now throws error for missing exception class name for @throws tags +- PHP_CodeSniffer_File::isReference() now correctly returns for functions that return references +- Generic LineLengthSniff no longer warns about @version lines with CVS or SVN id tags +- Generic LineLengthSniff no longer warns about @license lines with long URLs +- Squiz FunctionCommentThrowTagSniff no longer complains about throwing variables +- Squiz ComparisonOperatorUsageSniff no longer throws incorrect errors for inline IF statements +- Squiz DisallowMultipleAssignmentsSniff no longer throws errors for assignments in inline IF statements + +### Fixed +- Fixed bug #12455 : CodeSniffer treats content inside heredoc as PHP code +- Fixed bug #12471 : Checkstyle report is broken +- Fixed bug #12476 : PHP4 destructors are reported as error +- Fixed bug #12513 : Checkstyle XML messages need to be utf8_encode()d + - Thanks to Sebastian Bergmann for the patch. +- Fixed bug #12517 : getNewlineAfter() and dos files + +## [1.0.0RC2] - 2007-11-14 +### Changed +- Added a new Checkstyle report format + - Like the current XML format but modified to look like Checkstyle output + - Thanks to Manuel Pichler for helping get the format correct +- You can now hide warnings by default + - Run: phpcs --config-set show_warnings 0 + - If warnings are hidden by default, use the new -w command line argument to override +- Added new command line argument --config-delete to delete a config value and revert to the default +- Improved overall performance by optimising tokenising and next/prev methods (feature request #12421) + - Thanks to Christian Weiske for the patch +- Added FunctionCallSignatureSniff to Squiz standard +- Added @subpackage support to file and class comment sniffs in PEAR standard (feature request #12382) + - Thanks to Carsten Wiedmann for the patch +- An error is now displayed if you use a PHP version less than 5.1.0 (feature request #12380) + - Thanks to Carsten Wiedmann for the patch +- phpcs now exits with status 2 if it receives invalid input (feature request #12380) + - This is distinct from status 1, which indicates errors or warnings were found +- Added new Squiz LanguageConstructSpacingSniff to throw errors for additional whitespace after echo etc. +- Removed Squiz ValidInterfaceNameSniff +- PEAR FunctionCommentSniff no longer complains about unknown tags + +### Fixed +- Fixed incorrect errors about missing function comments in PEAR FunctionCommentSniff +- Fixed incorrect function docblock detection in Squiz FunctionCommentSniff +- Fixed incorrect errors for list() in Squiz DisallowMultipleAssignmentsSniff +- Errors no longer thrown if control structure is followed by a CASE's BREAK in Squiz ControlStructureSpacingSniff +- Fixed bug #12368 : Autoloader cannot be found due to include_path override + - Thanks to Richard Quadling for the patch +- Fixed bug #12378 : equal sign alignments problem with while() + +## [1.0.0RC1] - 2007-11-01 +### Changed +- Main phpcs script can now be run from a CVS checkout without installing the package +- Added a new CSV report format + - Header row indicates what position each element is in + - Always use the header row to determine positions rather than assuming the format, as it may change +- XML and CSV report formats now contain information about which column the error occurred at + - Useful if you want to highlight the token that caused the error in a custom application +- Square bracket tokens now have bracket_opener and bracket_closer set +- Added new Squiz SemicolonSpacingSniff to throw errors if whitespace is found before a semicolon +- Added new Squiz ArrayBracketSpacingSniff to throw errors if whitespace is found around square brackets +- Added new Squiz ObjectOperatorSpacingSniff to throw errors if whitespace is found around object operators +- Added new Squiz DisallowMultipleAssignmentsSniff to throw errors if multiple assignments are on the same line +- Added new Squiz ScopeKeywordSpacingSniff to throw errors if there is not a single space after a scope modifier +- Added new Squiz ObjectInstantiationSniff to throw errors if new objects are not assigned to a variable +- Added new Squiz FunctionDuplicateArgumentSniff to throw errors if argument is declared multiple times in a function +- Added new Squiz FunctionOpeningBraceSpaceSniff to ensure there are no blank lines after a function open brace +- Added new Squiz CommentedOutCodeSniff to warn about comments that looks like they are commented out code blocks +- Added CyclomaticComplexitySniff to Squiz standard +- Added NestingLevelSniff to Squiz standard +- Squiz ForbiddenFunctionsSniff now recommends echo() instead of print() +- Squiz ValidLogicalOperatorsSniff now recommends ^ instead of xor +- Squiz SwitchDeclarationSniff now contains more checks + - A single space is required after the case keyword + - No space is allowed before the colon in a case or default statement + - All switch statements now require a default case + - Default case must contain a break statement + - Empty default case must contain a comment describing why the default is ignored + - Empty case statements are not allowed + - Case and default statements must not be followed by a blank line + - Break statements must be followed by a blank line or the closing brace + - There must be no blank line before a break statement +- Squiz standard is now using the PEAR IncludingFileSniff +- PEAR ClassCommentSniff no longer complains about unknown tags +- PEAR FileCommentSniff no longer complains about unknown tags +- PEAR FileCommentSniff now accepts multiple @copyright tags +- Squiz BlockCommentSniff now checks that comment starts with a capital letter +- Squiz InlineCommentSniff now has better checking to ensure comment starts with a capital letter +- Squiz ClassCommentSniff now checks that short and long comments start with a capital letter +- Squiz FunctionCommentSniff now checks that short, long and param comments start with a capital letter +- Squiz VariableCommentSniff now checks that short and long comments start with a capital letter + +### Fixed +- Fixed error with multi-token array indexes in Squiz ArrayDeclarationSniff +- Fixed error with checking shorthand IF statements without a semicolon in Squiz InlineIfDeclarationSniff +- Fixed error where constants used as default values in function declarations were seen as type hints +- Fixed bug #12316 : PEAR is no longer the default standard +- Fixed bug #12321 : wrong detection of missing function docblock + +## [0.9.0] - 2007-09-24 +### Changed +- Added a config system for setting config data across phpcs runs +- You can now change the default coding standard from PEAR to something else + - Run: phpcs --config-set default_standard [standard] +- Added new Zend coding standard to check code against the Zend Framework standards + - The complete standard is not yet implemented + - Specify --standard=Zend to use + - Thanks to Johann-Peter Hartmann for the contribution of some sniffs + - Thanks to Holger Kral for the Code Analyzer sniff + +## [0.8.0] - 2007-08-08 +### Changed +- Added new XML report format; --report=xml (feature request #11535) + - Thanks to Brett Bieber for the patch +- Added new command line argument --ignore to specify a list of files to skip (feature request #11556) +- Added PHPCS and MySource coding standards into the core install +- Scope map no longer gets confused by curly braces that act as string offsets +- Removed CodeSniffer/SniffException.php as it is no longer used +- Unit tests can now be run directly from a CVS checkout +- Made private vars and functions protected in PHP_CodeSniffer class so this package can be overridden +- Added new Metrics category to Generic coding standard + - Contains Cyclomatic Complexity and Nesting Level sniffs + - Thanks to Johann-Peter Hartmann for the contribution +- Added new Generic DisallowTabIndentSniff to throw errors if tabs are used for indentation (feature request #11738) + - PEAR and Squiz standards use this new sniff to throw more specific indentation errors +- Generic MultipleStatementAlignmentSniff has new private var to set a padding size limit (feature request #11555) +- Generic MultipleStatementAlignmentSniff can now handle assignments that span multiple lines (feature request #11561) +- Generic LineLengthSniff now has a max line length after which errors are thrown instead of warnings + - BC BREAK: Override the protected member var absoluteLineLimit and set it to zero in custom LineLength sniffs + - Thanks to Johann-Peter Hartmann for the contribution +- Comment sniff errors about incorrect tag orders are now more descriptive (feature request #11693) + +### Fixed +- Fixed bug #11473 : Invalid CamelCaps name when numbers used in names + +## [0.7.0] - 2007-07-02 +### Changed +- BC BREAK: EOL character is now auto-detected and used instead of hard-coded \n + - Pattern sniffs must now specify "EOL" instead of "\n" or "\r\n" to use auto-detection + - Please use $phpcsFile->eolChar to check for newlines instead of hard-coding "\n" or "\r\n" + - Comment parser classes now require you to pass $phpcsFile as an additional argument +- BC BREAK: Included and excluded sniffs now require .php extension + - Please update your coding standard classes and add ".php" to all sniff entries + - See CodeSniffer/Standards/PEAR/PEARCodingStandard.php for an example + +- Fixed error where including a directory of sniffs in a coding standard class did not work +- Coding standard classes can now specify a list of sniffs to exclude as well as include (feature request #11056) +- Two uppercase characters can now be placed side-by-side in class names in Squiz ValidClassNameSniff +- SVN tags now allowed in PEAR file doc blocks (feature request #11038) + - Thanks to Torsten Roehr for the patch +- Private methods in commenting sniffs and comment parser are now protected (feature request #11087) +- Added Generic LineEndingsSniff to check the EOL character of a file +- PEAR standard now only throws one error per file for incorrect line endings (eg. /r/n) +- Command line arg -v now shows number of registered sniffs +- Command line arg -vvv now shows list of registered sniffs +- Squiz ControlStructureSpacingSniff no longer throws errors if the control structure is at the end of the script +- Squiz FunctionCommentSniff now throws error for "return void" if function has return statement +- Squiz FunctionCommentSniff now throws error for functions that return void but specify something else +- Squiz ValidVariableNameSniff now allows multiple uppercase letters in a row +- Squiz ForEachLoopDeclarationSniff now throws error for AS keyword not being lowercase +- Squiz SwitchDeclarationSniff now throws errors for CASE/DEFAULT/BREAK keywords not being lowercase +- Squiz ArrayDeclarationSniff now handles multi-token array values when checking alignment +- Squiz standard now enforces a space after cast tokens +- Generic MultipleStatementAlignmentSniff no longer gets confused by assignments inside FOR conditions +- Generic MultipleStatementAlignmentSniff no longer gets confused by the use of list() +- Added Generic SpaceAfterCastSniff to ensure there is a single space after a cast token +- Added Generic NoSpaceAfterCastSniff to ensure there is no whitespace after a cast token +- Added PEAR ClassDeclarationSniff to ensure the opening brace of a class is on the line after the keyword +- Added Squiz ScopeClosingBraceSniff to ensure closing braces are aligned correctly +- Added Squiz EvalSniff to discourage the use of eval() +- Added Squiz LowercaseDeclarationSniff to ensure all declaration keywords are lowercase +- Added Squiz LowercaseClassKeywordsSniff to ensure all class declaration keywords are lowercase +- Added Squiz LowercaseFunctionKeywordsSniff to ensure all function declaration keywords are lowercase +- Added Squiz LowercasePHPFunctionsSniff to ensure all calls to inbuilt PHP functions are lowercase +- Added Squiz CastSpacingSniff to ensure cast statements dont contain whitespace +- Errors no longer thrown when checking 0 length files with verbosity on + +### Fixed +- Fixed bug #11105 : getIncludedSniffs() not working anymore + - Thanks to Blair Robertson for the patch +- Fixed bug #11120 : Uninitialized string offset in AbstractParser.php on line 200 + +## [0.6.0] - 2007-05-15 +### Changed +- The number of errors and warnings found is now shown for each file while checking the file if verbosity is enabled +- Now using PHP_EOL instead of hard-coded \n so output looks good on Windows (feature request #10761) + - Thanks to Carsten Wiedmann for the patch. +- phpcs now exits with status 0 (no errors) or 1 (errors found) (feature request #10348) +- Added new -l command line argument to stop recursion into directories (feature request #10979) + +### Fixed +- Fixed variable name error causing incorrect error message in Squiz ValidVariableNameSniff +- Fixed bug #10757 : Error in ControlSignatureSniff +- Fixed bugs #10751, #10777 : Sniffer class paths handled incorrectly in Windows + - Thanks to Carsten Wiedmann for the patch. +- Fixed bug #10961 : Error "Last parameter comment requires a blank newline after it" thrown +- Fixed bug #10983 : phpcs outputs notices when checking invalid PHP +- Fixed bug #10980 : Incorrect warnings for equals sign + +## [0.5.0] - 2007-04-17 +### Changed +- BC BREAK: Coding standards now require a class to be added so PHP_CodeSniffer can get information from them + - Please read the end user docs for info about the new class required for all coding standards + +- Coding standards can now include sniffs from other standards, or whole standards, without writing new sniff files +- PHP_CodeSniffer_File::isReference() now correctly returns for references in function declarations +- PHP_CodeSniffer_File::isReference() now returns false if you don't pass it a T_BITWISE_AND token +- PHP_CodeSniffer_File now stores the absolute path to the file so sniffs can check file locations correctly +- Fixed undefined index error in AbstractVariableSniff for variables inside an interface function definition +- Added MemberVarSpacingSniff to Squiz standard to enforce one-line spacing between member vars +- Add FunctionCommentThrowTagSniff to Squiz standard to check that @throws tags are correct + +### Fixed +- Fixed problems caused by references and type hints in Squiz FunctionDeclarationArgumentSpacingSniff +- Fixed problems with errors not being thrown for some misaligned @param comments in Squiz FunctionCommentSniff +- Fixed badly spaced comma error being thrown for "extends" class in Squiz ClassDeclarationSniff +- Errors no longer thrown for class method names in Generic ForbiddenFunctionsSniff +- Errors no longer thrown for type hints in front of references in Generic UpperCaseConstantNameSniff +- Errors no longer thrown for correctly indented buffered lines in Squiz ScopeIndexSniff +- Errors no longer thrown for user-defined functions named as forbidden functions in Generic ForbiddenFunctionsSniff +- Errors no longer thrown on __autoload functions in PEAR ValidFunctionNameSniff +- Errors now thrown for __autoload methods in PEAR ValidFunctionNameSniff +- Errors now thrown if constructors or destructors have @return tags in Squiz FunctionCommentSniff +- Errors now thrown if @throws tags dont start with a capital and end with a full stop in Squiz FunctionCommentSniff +- Errors now thrown for invalid @var tag values in Squiz VariableCommentSniff +- Errors now thrown for missing doc comment in Squiz VariableCommentSniff +- Errors now thrown for unspaced operators in FOR loop declarations in Squiz OperatorSpacingSniff +- Errors now thrown for using ob_get_clean/flush functions to end buffers in Squiz OutputBufferingIndentSniff +- Errors now thrown for all missing member variable comments in Squiz VariableCommentSniff + +## [0.4.0] - 2007-02-19 +### Changed +- Standard name specified with --standard command line argument is no longer case sensitive +- Long error and warning messages are now wrapped to 80 characters in the full error report (thanks Endre Czirbesz) +- Shortened a lot of error and warning messages so they don't take up so much room +- Squiz FunctionCommentSniff now checks that param comments start with a capital letter and end with a full stop +- Squiz FunctionSpacingSniff now reports incorrect lines below function on closing brace, not function keyword +- Squiz FileCommentSniff now checks that there are no blank lines between the open PHP tag and the comment +- PHP_CodeSniffer_File::isReference() now returns correctly when checking refs on right side of => + +### Fixed +- Fixed incorrect error with switch closing brace in Squiz SwitchDeclarationSniff +- Fixed missing error when multiple statements are not aligned correctly with object operators +- Fixed incorrect errors for some PHP special variables in Squiz ValidVariableNameSniff +- Fixed incorrect errors for arrays that only contain other arrays in Squiz ArrayDeclarationSniff +- Fixed bug #9844 : throw new Exception(\n accidentally reported as error but it ain't + +## [0.3.0] - 2007-01-11 +### Changed +- Updated package.xml to version 2 +- Specifying coding standard on command line is now optional, even if you have multiple standards installed + - PHP_CodeSniffer uses the PEAR coding standard by default if no standard is specified +- New command line option, --extensions, to specify a comma separated list of file extensions to check +- Converted all unit tests to PHPUnit 3 format +- Added new coding standard, Squiz, that can be used as an alternative to PEAR + - also contains more examples of sniffs + - some may be moved into the Generic coding standard if required +- Added MultipleStatementAlignmentSniff to Generic standard +- Added ScopeIndentSniff to Generic standard +- Added ForbiddenFunctionsSniff to Generic standard +- Added FileCommentSniff to PEAR standard +- Added ClassCommentSniff to PEAR standard +- Added FunctionCommentSniff to PEAR standard +- Change MultipleStatementSniff to MultipleStatementAlignmentSniff in PEAR standard +- Replaced Methods directory with Functions directory in Generic and PEAR standards + - also renamed some of the sniffs in those directories +- Updated file, class and method comments for all files + +### Fixed +- Fixed bug #9274 : nested_parenthesis element not set for open and close parenthesis tokens +- Fixed bug #9411 : too few pattern characters cause incorrect error report + +## [0.2.1] - 2006-11-09 +### Fixed +- Fixed bug #9274 : nested_parenthesis element not set for open and close parenthesis tokens + +## [0.2.0] - 2006-10-13 +### Changed +- Added a generic standards package that will contain generic sniffs to be used in specific coding standards + - thanks to Frederic Poeydomenge for the idea +- Changed PEAR standard to use generic sniffs where available +- Added LowerCaseConstantSniff to Generic standard +- Added UpperCaseConstantSniff to Generic standard +- Added DisallowShortOpenTagSniff to Generic standard +- Added LineLengthSniff to Generic standard +- Added UpperCaseConstantNameSniff to Generic standard +- Added OpeningMethodBraceBsdAllmanSniff to Generic standard (contrib by Frederic Poeydomenge) +- Added OpeningMethodBraceKernighanRitchieSniff to Generic standard (contrib by Frederic Poeydomenge) +- Added framework for core PHP_CodeSniffer unit tests +- Added unit test for PHP_CodeSniffer:isCamelCaps method +- ScopeClosingBraceSniff now checks indentation of BREAK statements +- Added new command line arg (-vv) to show developer debug output + +### Fixed +- Fixed some coding standard errors +- Fixed bug #8834 : Massive memory consumption +- Fixed bug #8836 : path case issues in package.xml +- Fixed bug #8843 : confusion on nested switch() +- Fixed bug #8841 : comments taken as whitespace +- Fixed bug #8884 : another problem with nested switch() statements + +## [0.1.1] - 2006-09-25 +### Changed +- Added unit tests for all PEAR sniffs +- Exception class now extends from PEAR_Exception + +### Fixed +- Fixed summary report so files without errors but with warnings are not shown when warnings are hidden + +## [0.1.0] - 2006-09-19 +### Changed +- Reorganised package contents to conform to PEAR standards +- Changed version numbering to conform to PEAR standards +- Removed duplicate require_once() of Exception.php from CodeSniffer.php + +## [0.0.5] - 2006-09-18 +### Fixed +- Fixed .bat file for situation where php.ini cannot be found so include_path is not set + +## [0.0.4] - 2006-08-28 +### Changed +- Added .bat file for easier running of PHP_CodeSniffer on Windows +- Sniff that checks method names now works for PHP4 style code where there is no scope keyword +- Sniff that checks method names now works for PHP4 style constructors +- Sniff that checks method names no longer incorrectly reports error with magic methods +- Sniff that checks method names now reports errors with non-magic methods prefixed with __ +- Sniff that checks for constant names no longer incorrectly reports errors with heredoc strings +- Sniff that checks for constant names no longer incorrectly reports errors with created objects +- Sniff that checks indentation no longer incorrectly reports errors with heredoc strings +- Sniff that checks indentation now correctly reports errors with improperly indented multi-line strings +- Sniff that checks function declarations now checks for spaces before and after an equals sign for default values +- Sniff that checks function declarations no longer incorrectly reports errors with multi-line declarations +- Sniff that checks included code no longer incorrectly reports errors when return value is used conditionally +- Sniff that checks opening brace of function no longer incorrectly reports errors with multi-line declarations +- Sniff that checks spacing after commas in function calls no longer reports too many errors for some code +- Sniff that checks control structure declarations now gives more descriptive error message + +## [0.0.3] - 2006-08-22 +### Changed +- Added sniff to check for invalid class and interface names +- Added sniff to check for invalid function and method names +- Added sniff to warn if line is greater than 85 characters +- Added sniff to check that function calls are in the correct format +- Added command line arg to print current version (--version) + +### Fixed +- Fixed error where comments were not allowed on the same line as a control structure declaration + +## [0.0.2] - 2006-07-25 +### Changed +- Removed the including of checked files to stop errors caused by parsing them +- Removed the use of reflection so checked files do not have to be included +- Memory usage has been greatly reduced +- Much faster tokenising and checking times +- Reworked the PEAR coding standard sniffs (much faster now) +- Fix some bugs with the PEAR scope indentation standard +- Better checking for installed coding standards +- Can now accept multiple files and dirs on the command line +- Added an option to list installed coding standards +- Added an option to print a summary report (number of errors and warnings shown for each file) +- Added an option to hide warnings from reports +- Added an option to print verbose output (so you know what is going on) +- Reordered command line args to put switches first (although order is not enforced) +- Switches can now be specified together (eg. php -nv) as well as separately (phpcs -n -v) + +## [0.0.1] - 2006-07-19 +### Added +- Initial preview release diff --git a/README.md b/README.md index 5c71918147..377c2d4429 100644 --- a/README.md +++ b/README.md @@ -62,11 +62,6 @@ You will then be able to run PHP_CodeSniffer from the tools directory: ./tools/phpcs -h ./tools/phpcbf -h ``` -### PEAR -If you use PEAR, you can install PHP_CodeSniffer using the PEAR installer. This will make the `phpcs` and `phpcbf` commands immediately available for use. To install PHP_CodeSniffer using the PEAR installer, first ensure you have [installed PEAR](http://pear.php.net/manual/en/installation.getting.php) and then run the following command: -```bash -pear install PHP_CodeSniffer -``` ### Git Clone You can also download the PHP_CodeSniffer source and run the `phpcs` and `phpcbf` commands directly from the Git clone: ```bash diff --git a/package.xml b/package.xml deleted file mode 100644 index 4120579390..0000000000 --- a/package.xml +++ /dev/null @@ -1,8631 +0,0 @@ - - - PHP_CodeSniffer - pear.php.net - PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files to detect and fix violations of a defined set of coding standards. - PHP_CodeSniffer is a set of two PHP scripts; the main phpcs script that tokenizes PHP, JavaScript and CSS files to detect violations of a defined coding standard, and a second phpcbf script to automatically correct coding standard violations. PHP_CodeSniffer is an essential development tool that ensures your code remains clean and consistent. - - - Greg Sherwood - squiz - gsherwood@squiz.net - yes - - 2022-06-18 - - - 3.8.0 - 3.8.0 - - - stable - stable - - BSD 3-Clause License - - - Changes have been made to the way PHPCS handles invalid sniff properties being set in a custom ruleset - -- Fixes PHP 8.2 deprecation notices for properties set in a (custom) ruleset for complete standards/complete sniff categories - -- Invalid sniff properties set for individual sniffs will now result in an error and halt the execution of PHPCS - --- A descriptive error message is provided to allow users to fix their ruleset - -- Sniff properties set for complete standards/complete sniff categories will now only be set on sniffs which explicitly support the property - --- The property will be silently ignored for those sniffs which do not support the property - -- For sniff developers, it is strongly recommended for sniffs to explicitly declare any user-adjustable public properties - --- If dynamic properties need to be supported for a sniff, either declare the magic __set()/__get()/__isset()/__unset() methods on the sniff or let the sniff extend stdClass - --- Note: The #[\AllowDynamicProperties] attribute will have no effect for properties which are being set in rulesets. - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - The third parameter for the Ruleset::setSniffProperty() method has been changed to expect an array - -- Sniff developers/integrators of PHPCS may need to make some small adjustments to allow for this change - -- Existing code will continue to work but will throw a deprecation error - -- The backwards compatiblity layer will be removed in PHPCS 4.0 - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - When using auto report width (the default) a value of 80 columns will be used if an auto width cannot be determined - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Sniff error messages are now more informative to help bugs get reported to the correct project - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Added support for readonly classes to File::getClassProperties() through a new is_readonly array index in the return value - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Added support for readonly class to a number of sniffs - -- Generic.CodeAnalysis.UnnecessaryFinalModifier - -- PEAR.Commenting.ClassComment - -- PEAR.Commenting.FileComment - -- PSR2.Classes.ClassDeclaration - -- Squiz.Classes.ClassDeclaration - -- Squiz.Classes.LowercaseClassKeywords - -- Squiz.Commenting.ClassComment - -- Squiz.Commenting.DocCommentAlignment - -- Squiz.Commenting.FileComment - -- Squiz.Commenting.InlineComment - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - PSR2.Classes.PropertyDeclaration now enforces that the readonly modifier comes after the visibility modifier - - PSR2 and PSR12 do not have documented rules for this as they pre-date the readonly modifier - - PSR-PER has been used to confirm the order of this keyword so it can be applied to PSR2 and PSR12 correctly - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Squiz.Commenting.FunctionComment: new ParamNameUnexpectedAmpersandPrefix error for parameters annotated as passed by reference while the parameter is not passed by reference - -- Thanks to Dan Wallis (@fredden) for the patch - - PEAR.Commenting.FunctionComment + Squiz.Commenting.FunctionComment: the SpacingAfter error can now be auto-fixed. - -- Thanks to Dan Wallis (@fredden) for the patch - - Squiz.PHP.InnerFunctions sniff no longer reports on OO methods for OO structures declared within a function or closure - -- Thanks to @Daimona for the patch - - Documentation has been added for the following sniffs: - -- PSR2.Files.ClosingTag - -- PSR2.Methods.FunctionCallSignature - -- PSR2.Methods.FunctionClosingBrace - -- Thanks to Atsushi Okui (@blue32a) for the patch - - Fixed bug #3557 : Squiz.Arrays.ArrayDeclaration will now ignore PHP 7.4 array unpacking when determining whether an array is associative - -- Thanks to Volker Dusch (@edorian) for the patch - - Fixed bug #3717 : Squiz.Commenting.FunctionComment: fixed false positive for InvalidNoReturn when type is never - -- Thanks to Choraimy Kroonstuiver (@axlon) for the patch - - Fixed bug #3722 : Potential "Uninitialized string offset 1" in octal notation backfill - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3728 : PHP 8.2 | PSR1/SideEffects: allow for readonly classes - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3770 : Squiz/NonExecutableCode: prevent false positives for switching between PHP and HTML - -- Thanks to Dan Wallis (@fredden) for the patch - - Fixed bug #3776 : Generic/JSHint: error when JSHint is not available - -- Thanks to Dan Wallis (@fredden) for the patch - - Fixed bug #3777 : Squiz/NonExecutableCode: slew of bug fixes, mostly related to modern PHP - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3779 : Squiz/LowercasePHPFunctions + Generic/ForbiddenFunctions: bug fix for class names in attributes - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3785 : Squiz.Commenting.FunctionComment: potential "Uninitialized string offset 0" when a type contains a duplicate pipe symbol - -- Thanks to Dan Wallis (@fredden) for the patch - - Fixed bug #3787 : PEAR/Squiz/[MultiLine]FunctionDeclaration: allow for PHP 8.1 new in initializers - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3789 : Incorrect tokenization for ternary operator with match inside of it - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3797 : Tokenizer/PHP: more context sensitive keyword fixes - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3801 : File::getMethodParameters(): allow for readonly promoted properties without visibility - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3805 : Generic/FunctionCallArgumentSpacing: prevent fixer conflict over PHP 7.3+ trailing comma's in function calls - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3806 : Squiz.PHP.InnerFunctions sniff now correctly reports inner functions declared within a closure - -- Thanks to @Daimona for the patch - - Fixed bug #3809 : GitBlame report was broken when passing a basepath - -- Thanks to Chris (@datengraben) for the patch - - Fixed bug #3813 : Squiz.Commenting.FunctionComment: false positive for parameter name mismatch on parameters annotated as passed by reference - -- Thanks to Dan Wallis (@fredden) for the patch - - Fixed bug #3816 : PSR12/FileHeader: bug fix - false positives on PHP 8.2+ readonly classes - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3877 : Filter names can be case-sensitive. The -h help text will now display the correct case for the available filters - -- Thanks to @simonsan for the patch - - Fixed bug #3906 : Tokenizer/CSS: fixed a bug related to the unsupported slash comment syntax - -- Thanks to Dan Wallis (@fredden) for the patch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5.4.0 - - - 1.4.0b1 - - - tokenizer - - - xmlwriter - - - simplexml - - - - - - - windows - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3.7.2 - 3.7.2 - - - stable - stable - - 2023-02-23 - BSD License - - - Newer versions of Composer will now suggest installing PHPCS using require-dev instead of require - -- Thanks to Gary Jones (@GaryJones) for the patch - - A custom Out Of Memory error will now be shown if PHPCS or PHPCBF run out of memory during a run - -- Error message provides actionable information about how to fix the problem and ensures the error is not silent - -- Thanks to Juliette Reinders Folmer (@jrfnl) and Alain Schlesser (@schlessera) for the patch - - Generic.PHP.LowerCaseType sniff now correctly examines types inside arrow functions - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Squiz.Formatting.OperatorBracket no longer reports false positives in match() structures - - Fixed bug #3616 : Squiz.PHP.DisallowComparisonAssignment false positive for PHP 8 match expression - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3618 : Generic.WhiteSpace.ArbitraryParenthesesSpacing false positive for return new parent() - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3632 : Short list not tokenized correctly in control structures without braces - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3639 : Tokenizer not applying tab replacement to heredoc/nowdoc closers - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3640 : Generic.WhiteSpace.DisallowTabIndent not reporting errors for PHP 7.3 flexible heredoc/nowdoc syntax - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3645 : PHPCS can show 0 exit code when running in parallel even if child process has fatal error - -- Thanks to Alex Panshin (@enl) for the patch - - Fixed bug #3653 : False positives for match() in OperatorSpacingSniff - -- Thanks to Jaroslav Hanslík (@kukulich) for the patch - - Fixed bug #3666 : PEAR.Functions.FunctionCallSignature incorrect indent fix when checking mixed HTML/PHP files - - Fixed bug #3668 : PSR12.Classes.ClassInstantiation.MissingParentheses false positive when instantiating parent classes - -- Similar issues also fixed in Generic.Functions.FunctionCallArgumentSpacing and Squiz.Formatting.OperatorBracket - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - Fixed bug #3672 : Incorrect ScopeIndent.IncorrectExact report for match inside array literal - - Fixed bug #3694 : Generic.WhiteSpace.SpreadOperatorSpacingAfter does not ignore spread operator in PHP 8.1 first class callables - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - - - - 3.7.1 - 3.7.1 - - - stable - stable - - 2022-06-18 - BSD License - - - Fixed bug #3609 : Methods/constants with name empty/isset/unset are always reported as error - -- Thanks to Juliette Reinders Folmer (@jrfnl) for the patch - - - - - 3.7.0 - 3.7.0 - - - stable - stable - - 2022-06-13 - BSD License - - - Added support for PHP 8.1 explicit octal notation - -- This new syntax has been backfilled for PHP versions less than 8.1 - -- Thanks to Mark Baker for the patch - -- Thanks to Juliette Reinders Folmer for additional fixes - - Added support for PHP 8.1 enums - -- This new syntax has been backfilled for PHP versions less than 8.1 - -- Includes a new T_ENUM_CASE token to represent the case statements inside an enum - -- Thanks to Jaroslav Hanslík for the patch - -- Thanks to Juliette Reinders Folmer for additional core and sniff support - - Added support for the PHP 8.1 readonly token - -- Tokenzing of the readonly keyword has been backfilled for PHP versions less than 8.1 - -- Thanks to Jaroslav Hanslík for the patch - - Added support for PHP 8.1 intersection types - -- Includes a new T_TYPE_INTERSECTION token to represent the ampersand character inside intersection types - -- Thanks to Jaroslav Hanslík for the patch - - File::getMethodParameters now supports the new PHP 8.1 readonly token - -- When constructor property promotion is used, a new property_readonly array index is included in the return value - --- This is a boolean value indicating if the property is readonly - -- If the readonly token is detected, a new readonly_token array index is included in the return value - --- This contains the token index of the readonly keyword - -- Thanks to Juliette Reinders Folmer for the patch - - Support for new PHP 8.1 readonly keyword has been added to the following sniffs: - -- Generic.PHP.LowerCaseKeyword - -- PSR2.Classes.PropertyDeclaration - -- Squiz.Commenting.BlockComment - -- Squiz.Commenting.DocCommentAlignment - -- Squiz.Commenting.VariableComment - -- Squiz.WhiteSpace.ScopeKeywordSpacing - -- Thanks to Juliette Reinders Folmer for the patches - - The parallel feature is now more efficient and runs faster in some situations due to improved process management - -- Thanks to Sergei Morozov for the patch - - The list of installed coding standards now has consistent ordering across all platforms - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.PHP.UpperCaseConstant and Generic.PHP.LowerCaseConstant now ignore type declarations - -- These sniffs now only report errors for true/false/null when used as values - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.PHP.LowerCaseType now supports the PHP 8.1 never type - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #3502 : A match statement within an array produces Squiz.Arrays.ArrayDeclaration.NoKeySpecified - - Fixed bug #3503 : Squiz.Commenting.FunctionComment.ThrowsNoFullStop false positive when one line @throw - - Fixed bug #3505 : The nullsafe operator is not counted in Generic.Metrics.CyclomaticComplexity - -- Thanks to Mark Baker for the patch - - Fixed bug #3526 : PSR12.Properties.ConstantVisibility false positive when using public final const syntax - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3530 : Line indented incorrectly false positive when using match-expression inside switch case - - Fixed bug #3534 : Name of typed enum tokenized as T_GOTO_LABEL - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3546 : Tokenizer/PHP: bug fix - parent/static keywords in class instantiations - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3550 : False positive from PSR2.ControlStructures.SwitchDeclaration.TerminatingComment when using trailing comment - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3575: Squiz.Scope.MethodScope misses visibility keyword on previous line - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3604: Tokenizer/PHP: bug fix for double quoted strings using ${ - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.6.2 - 3.6.2 - - - stable - stable - - 2021-12-13 - BSD License - - - Processing large code bases that use tab indenting inside comments and strings will now be faster - -- Thanks to Thiemo Kreuz for the patch - - Fixed bug #3388 : phpcs does not work when run from WSL drives - -- Thanks to Juliette Reinders Folmer and Graham Wharton for the patch - - Fixed bug #3422 : Squiz.WhiteSpace.ScopeClosingBrace fixer removes HTML content when fixing closing brace alignment - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3437 : PSR12 does not forbid blank lines at the start of the class body - -- Added new PSR12.Classes.OpeningBraceSpace sniff to enforce this - - Fixed bug #3440 : Squiz.WhiteSpace.MemberVarSpacing false positives when attributes used without docblock - -- Thanks to Vadim Borodavko for the patch - - Fixed bug #3448 : PHP 8.1 deprecation notice while generating running time value - -- Thanks to Juliette Reinders Folmer and Andy Postnikov for the patch - - Fixed bug #3456 : PSR12.Classes.ClassInstantiation.MissingParentheses false positive using attributes on anonymous class - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3460 : Generic.Formatting.MultipleStatementAlignment false positive on closure with parameters - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3468 : do/while loops are double-counted in Generic.Metrics.CyclomaticComplexity - -- Thanks to Mark Baker for the patch - - Fixed bug #3469 : Ternary Operator and Null Coalescing Operator are not counted in Generic.Metrics.CyclomaticComplexity - -- Thanks to Mark Baker for the patch - - Fixed bug #3472 : PHP 8 match() expression is not counted in Generic.Metrics.CyclomaticComplexity - -- Thanks to Mark Baker for the patch - - - - - 3.6.1 - 3.6.1 - - - stable - stable - - 2021-10-11 - BSD License - - - PHPCS annotations can now be specified using hash-style comments - -- Previously, only slash-style and block-style comments could be used to do things like disable errors - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed an issue where some sniffs would not run on PHP files that only used the short echo tag - -- The following sniffs were affected: - --- Generic.Files.ExecutableFile - --- Generic.Files.LowercasedFilename - --- Generic.Files.LineEndings - --- Generic.Files.EndFileNewline - --- Generic.Files.EndFileNoNewline - --- Generic.PHP.ClosingPHPTag - --- Generic.PHP.Syntax - --- Generic.VersionControl.GitMergeConflict - --- Generic.WhiteSpace.DisallowSpaceIndent - --- Generic.WhiteSpace.DisallowTabIndent - -- Thanks to Juliette Reinders Folmer for the patch - - The new PHP 8.1 tokenisation for ampersands has been reverted to use the existing PHP_CodeSniffer method - -- The PHP 8.1 tokens T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG and T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG are unsued - -- Ampersands continue to be tokenized as T_BITWISE_AND for all PHP versions - -- Thanks to Juliette Reinders Folmer and Anna Filina for the patch - - File::getMethodParameters() no longer incorrectly returns argument attributes in the type hint array index - -- A new has_attributes array index is available and set to TRUE if the argument has attributes defined - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.NamingConventions.ConstructorName no longer throws deprecation notices on PHP 8.1 - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.BlockComment now correctly applies rules for block comments after a short echo tag - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed false positives when using attributes in the following sniffs: - -- PEAR.Commenting.FunctionComment - -- Squiz.Commenting.InlineComment - -- Squiz.Commenting.BlockComment - -- Squiz.Commenting.VariableComment - -- Squiz.WhiteSpace.MemberVarSpacing - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3294 : Bug in attribute tokenization when content contains PHP end token or attribute closer on new line - -- Thanks to Alessandro Chitolina for the patch - -- Thanks to Juliette Reinders Folmer for the tests - - Fixed bug #3296 : PSR2.ControlStructures.SwitchDeclaration takes phpcs:ignore as content of case body - - Fixed bug #3297 : PSR2.ControlStructures.SwitchDeclaration.TerminatingComment does not handle try/finally blocks - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3302 : PHP 8.0 | Tokenizer/PHP: bugfix for union types using namespace operator - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3303 : findStartOfStatement() doesn't work with T_OPEN_TAG_WITH_ECHO - - Fixed bug #3316 : Arrow function not tokenized correctly when using null in union type - - Fixed bug #3317 : Problem with how phpcs handles ignored files when running in parallel - -- Thanks to Emil Andersson for the patch - - Fixed bug #3324 : PHPCS hangs processing some nested arrow functions inside a function call - - Fixed bug #3326 : Generic.Formatting.MultipleStatementAlignment error with const DEFAULT - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3333 : Squiz.Objects.ObjectInstantiation: null coalesce operators are not recognized as assignment - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3340 : Ensure interface and trait names are always tokenized as T_STRING - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3342 : PSR12/Squiz/PEAR standards all error on promoted properties with docblocks - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3345 : IF statement with no braces and double catch turned into syntax error by auto-fixer - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3352 : PSR2.ControlStructures.SwitchDeclaration can remove comments on the same line as the case statement while fixing - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3357 : Generic.Functions.OpeningFunctionBraceBsdAllman removes return type when additional lines are present - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3362 : Generic.WhiteSpace.ScopeIndent false positive for arrow functions inside arrays - - Fixed bug #3384 : Squiz.Commenting.FileComment.SpacingAfterComment false positive on empty file - - Fixed bug #3394 : Fix PHP 8.1 auto_detect_line_endings deprecation notice - - Fixed bug #3400 : PHP 8.1: prevent deprecation notices about missing return types - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3424 : PHPCS fails when using PHP 8 Constructor property promotion with attributes - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3425 : PHP 8.1 | Runner::processChildProcs(): fix passing null to non-nullable bug - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3445 : Nullable parameter after attribute incorrectly tokenized as ternary operator - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.6.0 - 3.6.0 - - - stable - stable - - 2021-04-09 - BSD License - - - Added support for PHP 8.0 union types - -- A new T_TYPE_UNION token is available to represent the pipe character - -- File::getMethodParameters(), getMethodProperties(), and getMemberProperties() will now return union types - -- Thanks to Juliette Reinders Folmer for the patch - - Added support for PHP 8.0 named function call arguments - -- A new T_PARAM_NAME token is available to represent the label with the name of the function argument in it - -- Thanks to Juliette Reinders Folmer for the patch - - Added support for PHP 8.0 attributes - -- The PHP-supplied T_ATTRIBUTE token marks the start of an attribute - -- A new T_ATTRIBUTE_END token is available to mark the end of an attribute - -- New attribute_owner and attribute_closer indexes are available in the tokens array for all tokens inside an attribute - -- Tokenizing of attributes has been backfilled for older PHP versions - -- The following sniffs have been updated to support attributes: - --- PEAR.Commenting.ClassComment - --- PEAR.Commenting.FileComment - --- PSR1.Files.SideEffects - --- PSR12.Files.FileHeader - --- Squiz.Commenting.ClassComment - --- Squiz.Commenting.FileComment - --- Squiz.WhiteSpace.FunctionSpacing - ---- Thanks to Vadim Borodavko for the patch - -- Thanks to Alessandro Chitolina for the patch - - Added support for PHP 8.0 dereferencing of text strings with interpolated variables - -- Thanks to Juliette Reinders Folmer for the patch - - Added support for PHP 8.0 match expressions - -- Match expressions are now tokenised with parenthesis and scope openers and closers - --- Sniffs can listen for the T_MATCH token to process match expressions - --- Note that the case and default statements inside match expressions do not have scopes set - -- A new T_MATCH_ARROW token is available to represent the arrows in match expressions - -- A new T_MATCH_DEFAULT token is available to represent the default keyword in match expressions - -- All tokenizing of match expressions has been backfilled for older PHP versions - -- The following sniffs have been updated to support match expressions: - --- Generic.CodeAnalysis.AssignmentInCondition - --- Generic.CodeAnalysis.EmptyPHPStatement - ---- Thanks to Vadim Borodavko for the patch - --- Generic.CodeAnalysis.EmptyStatement - --- Generic.PHP.LowerCaseKeyword - --- PEAR.ControlStructures.ControlSignature - --- PSR12.ControlStructures.BooleanOperatorPlacement - --- Squiz.Commenting.LongConditionClosingComment - --- Squiz.Commenting.PostStatementComment - --- Squiz.ControlStructures.LowercaseDeclaration - --- Squiz.ControlStructures.ControlSignature - --- Squiz.Formatting.OperatorBracket - --- Squiz.PHP.DisallowMultipleAssignments - --- Squiz.Objects.ObjectInstantiation - --- Squiz.WhiteSpace.ControlStructureSpacing - -- Thanks to Juliette Reinders Folmer for the patch - - The value of the T_FN_ARROW token has changed from "T_FN_ARROW" to "PHPCS_T_FN_ARROW" to avoid package conflicts - -- This will have no impact on custom sniffs unless they are specifically looking at the value of the T_FN_ARROW constant - -- If sniffs are just using constant to find arrow functions, they will continue to work without modification - -- Thanks to Juliette Reinders Folmer for the patch - - File::findStartOfStatement() now works correctly when passed the last token in a statement - - File::getMethodParameters() now supports PHP 8.0 constructor property promotion - -- Returned method params now include a "property_visibility" and "visibility_token" index if property promotion is detected - -- Thanks to Juliette Reinders Folmer for the patch - - File::getMethodProperties() now includes a "return_type_end_token" index in the return value - -- This indicates the last token in the return type, which is helpful when checking union types - -- Thanks to Juliette Reinders Folmer for the patch - - Include patterns are now ignored when processing STDIN - -- Previously, checks using include patterns were excluded when processing STDIN when no file path was provided via --stdin-path - -- Now, all include and exclude rules are ignored when no file path is provided, allowing all checks to run - -- If you want include and exclude rules enforced when checking STDIN, use --stdin-path to set the file path - -- Thanks to Juliette Reinders Folmer for the patch - - Spaces are now correctly escaped in the paths to external on Windows - -- Thanks to Juliette Reinders Folmer for the patch - - Added Generic.NamingConventions.AbstractClassNamePrefix to enforce that class names are prefixed with "Abstract" - -- Thanks to Anna Borzenko for the contribution - - Added Generic.NamingConventions.InterfaceNameSuffix to enforce that interface names are suffixed with "Interface" - -- Thanks to Anna Borzenko for the contribution - - Added Generic.NamingConventions.TraitNameSuffix to enforce that trait names are suffixed with "Trait" - -- Thanks to Anna Borzenko for the contribution - - Generic.CodeAnalysis.UnusedFunctionParameter can now be configured to ignore variable usage for specific type hints - -- This allows you to suppress warnings for some variables that are not required, but leave warnings for others - -- Set the ignoreTypeHints array property to a list of type hints to ignore - -- Thanks to Petr Bugyík for the patch - - Generic.Formatting.MultipleStatementAlignment can now align statements at the start of the assignment token - -- Previously, the sniff enforced that the values were aligned, even if this meant the assignment tokens were not - -- Now, the sniff can enforce that the assignment tokens are aligned, even if this means the values are not - -- Set the "alignAtEnd" sniff property to "false" to align the assignment tokens - -- The default remains at "true", so the assigned values are aligned - -- Thanks to John P. Bloch for the patch - - Generic.PHP.LowerCaseType now supports checking of typed properties - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.PHP.LowerCaseType now supports checking of union types - -- Thanks to Juliette Reinders Folmer for the patch - - PEAR.Commenting.FunctionComment and Squiz.Commenting.FunctionComment sniffs can now ignore private and protected methods - -- Set the "minimumVisibility" sniff property to "protected" to ignore private methods - -- Set the "minimumVisibility" sniff property to "public" to ignore both private and protected methods - -- The default remains at "private", so all methods are checked - -- Thanks to Vincent Langlet for the patch - - PEAR.Commenting.FunctionComment and Squiz.Commenting.FunctionComment sniffs can now ignore return tags in any method - -- Previously, only __construct and __destruct were ignored - -- Set the list of method names to ignore in the "specialMethods" sniff property - -- The default remains at "__construct" and "__destruct" only - -- Thanks to Vincent Langlet for the patch - - PSR2.ControlStructures.SwitchDeclaration now supports nested switch statements where every branch terminates - -- Previously, if a CASE only contained a SWITCH and no direct terminating statement, a fall-through error was displayed - -- Now, the error is surpressed if every branch of the SWITCH has a terminating statement - -- Thanks to Vincent Langlet for the patch - - The PSR2.Methods.FunctionCallSignature.SpaceBeforeCloseBracket error message is now reported on the closing parenthesis token - -- Previously, the error was being reported on the function keyword, leading to confusing line numbers in the error report - - Squiz.Commenting.FunctionComment is now able to ignore function comments that are only inheritdoc statements - -- Set the skipIfInheritdoc sniff property to "true" to skip checking function comments if the content is only {@inhertidoc} - -- The default remains at "false", so these comments will continue to report errors - -- Thanks to Jess Myrbo for the patch - - Squiz.Commenting.FunctionComment now supports the PHP 8 mixed type - -- Thanks to Vadim Borodavko for the patch - - Squiz.PHP.NonExecutableCode now has improved handling of syntax errors - -- Thanks to Thiemo Kreuz for the patch - - Squiz.WhiteSpace.ScopeKeywordSpacing now checks spacing when using PHP 8.0 constructor property promotion - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed an issue that could occurr when checking files on network drives, such as with WSL2 on Windows 10 - -- This works around a long-standing PHP bug with is_readable() - -- Thanks to Michael S for the patch - - Fixed a number of false positives in the Squiz.PHP.DisallowMultipleAssignments sniff - -- Sniff no longer errors for default value assignments in arrow functions - -- Sniff no longer errors for assignments on first line of closure - -- Sniff no longer errors for assignments after a goto label - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #2913 : Generic.WhiteSpace.ScopeIndent false positive when opening and closing tag on same line inside conditional - - Fixed bug #2992 : Enabling caching using a ruleset produces invalid cache files when using --sniffs and --exclude CLI args - - Fixed bug #3003 : Squiz.Formatting.OperatorBracket autofix incorrect when assignment used with null coalescing operator - - Fixed bug #3145 : Autoloading of sniff fails when multiple classes declared in same file - - Fixed bug #3157 : PSR2.ControlStructures.SwitchDeclaration.BreakIndent false positive when case keyword is not indented - - Fixed bug #3163 : Undefined index error with pre-commit hook using husky on PHP 7.4 - -- Thanks to Ismo Vuorinen for the patch - - Fixed bug #3165 : Squiz.PHP.DisallowComparisonAssignment false positive when comparison inside closure - - Fixed bug #3167 : Generic.WhiteSpace.ScopeIndent false positive when using PHP 8.0 constructor property promotion - - Fixed bug #3170 : Squiz.WhiteSpace.OperatorSpacing false positive when using negation with string concat - -- This also fixes the same issue in the PSR12.Operators.OperatorSpacing sniff - - Fixed bug #3177 : Incorrect tokenization of GOTO statements in mixed PHP/HTML files - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3184 : PSR2.Namespace.NamespaceDeclaration false positive on namespace operator - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3188 : Squiz.WhiteSpace.ScopeKeywordSpacing false positive for static return type - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3192 : findStartOfStatement doesn't work correctly inside switch - -- Thanks to Vincent Langlet for the patch - - Fixed bug #3195 : Generic.WhiteSpace.ScopeIndent confusing message when combination of tabs and spaces found - - Fixed bug #3197 : Squiz.NamingConventions.ValidVariableName does not use correct error code for all member vars - - Fixed bug #3219 : Generic.Formatting.MultipleStatementAlignment false positive for empty anonymous classes and closures - - Fixed bug #3258 : Squiz.Formatting.OperatorBracket duplicate error messages for unary minus - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3273 : Squiz.Functions.FunctionDeclarationArgumentSpacing reports line break as 0 spaces between parenthesis - - Fixed bug #3277 : Nullable static return typehint causes whitespace error - - Fixed bug #3284 : Unused parameter false positive when using array index in arrow function - - - - - 3.5.8 - 3.5.8 - - - stable - stable - - 2020-10-23 - BSD License - - - Reverted a change to the way include/exclude patterns are processed for STDIN content - -- This change is not backwards compatible and will be re-introduced in version 3.6.0 - - - - - 3.5.7 - 3.5.7 - - - stable - stable - - 2020-10-23 - BSD License - - - The PHP 8.0 T_NULLSAFE_OBJECT_OPERATOR token has been made available for older versions - -- Existing sniffs that check for T_OBJECT_OPERATOR have been modified to apply the same rules for the nullsafe object operator - -- Thanks to Juliette Reinders Folmer for the patch - - The new method of PHP 8.0 tokenizing for namespaced names has been reverted to the pre 8.0 method - -- This maintains backwards compatibility for existing sniffs on PHP 8.0 - -- This change will be removed in PHPCS 4.0 as the PHP 8.0 tokenizing method will be backported for pre 8.0 versions - -- Thanks to Juliette Reinders Folmer for the patch - - Added support for changes to the way PHP 8.0 tokenizes hash comments - -- The existing PHP 5-7 behaviour has been replicated for version 8, so no sniff changes are required - -- Thanks to Juliette Reinders Folmer for the patch - - The autoloader has been changed to fix sniff class name detection issues that may occur when running on PHP 7.4+ - -- Thanks to Eloy Lafuente for the patch - - Running the unit tests now includes warnings in the found and fixable error code counts - -- Thanks to Juliette Reinders Folmer for the patch - - PSR12.ControlStructures.BooleanOperatorPlacement.FoundMixed error message is now more accurate when using the allowOnly setting - -- Thanks to Vincent Langlet for the patch - - PSR12.Functions.NullableTypeDeclaration now supports the PHP8 static return type - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed Squiz.Formatting.OperatorBracket false positive when exiting with a negative number - - Fixed Squiz.PHP.DisallowComparisonAssignment false positive for methods called on an object - - Fixed bug #2882 : Generic.Arrays.ArrayIndent can request close brace indent to be less than the statement indent level - - Fixed bug #2883 : Generic.WhiteSpace.ScopeIndent.Incorrect issue after NOWDOC - - Fixed bug #2975 : Undefined offset in PSR12.Functions.ReturnTypeDeclaration when checking function return type inside ternary - - Fixed bug #2988 : Undefined offset in Squiz.Strings.ConcatenationSpacing during live coding - -- Thanks to Thiemo Kreuz for the patch - - Fixed bug #2989 : Incorrect auto-fixing in Generic.ControlStructures.InlineControlStructure during live coding - -- Thanks to Thiemo Kreuz for the patch - - Fixed bug #3007 : Directory exclude pattern improperly excludes directories with names that start the same - -- Thanks to Steve Talbot for the patch - - Fixed bug #3043 : Squiz.WhiteSpace.OperatorSpacing false positive for negation in arrow function - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3049 : Incorrect error with arrow function and parameter passed as reference - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3053 : PSR2 incorrect fix when multiple use statements on same line do not have whitespace between them - - Fixed bug #3058 : Progress gets unaligned when 100% happens at the end of the available dots - - Fixed bug #3059 : Squiz.Arrays.ArrayDeclaration false positive when using type casting - -- Thanks to Sergei Morozov for the patch - - Fixed bug #3060 : Squiz.Arrays.ArrayDeclaration false positive for static functions - -- Thanks to Sergei Morozov for the patch - - Fixed bug #3065 : Should not fix Squiz.Arrays.ArrayDeclaration.SpaceBeforeComma if comment between element and comma - -- Thanks to Sergei Morozov for the patch - - Fixed bug #3066 : No support for namespace operator used in type declarations - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3075 : PSR12.ControlStructures.BooleanOperatorPlacement false positive when operator is the only content on line - - Fixed bug #3099 : Squiz.WhiteSpace.OperatorSpacing false positive when exiting with negative number - -- Thanks to Sergei Morozov for the patch - - Fixed bug #3102 : PSR12.Squiz.OperatorSpacing false positive for default values of arrow functions - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #3124 : PSR-12 not reporting error for empty lines with only whitespace - - Fixed bug #3135 : Ignore annotations are broken on PHP 8.0 - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.5.6 - 3.5.6 - - - stable - stable - - 2020-08-10 - BSD License - - - Added support for PHP 8.0 magic constant dereferencing - -- Thanks to Juliette Reinders Folmer for the patch - - Added support for changes to the way PHP 8.0 tokenizes comments - -- The existing PHP 5-7 behaviour has been replicated for version 8, so no sniff changes are required - -- Thanks to Juliette Reinders Folmer for the patch - - File::getMethodProperties() now detects the PHP 8.0 static return type - -- Thanks to Juliette Reinders Folmer for the patch - - The PHP 8.0 static return type is now supported for arrow functions - -- Thanks to Juliette Reinders Folmer for the patch - - The cache is no longer used if the list of loaded PHP extensions changes - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.NamingConventions.CamelCapsFunctionName no longer reports __serialize and __unserialize as invalid names - -- Thanks to Filip Š for the patch - - PEAR.NamingConventions.ValidFunctionName no longer reports __serialize and __unserialize as invalid names - -- Thanks to Filip Š for the patch - - Squiz.Scope.StaticThisUsage now detects usage of $this inside closures and arrow Functions - -- Thanks to Michał Bundyra for the patch - - Fixed bug #2877 : PEAR.Functions.FunctionCallSignature false positive for array of functions - -- Thanks to Vincent Langlet for the patch - - Fixed bug #2888 : PSR12.Files.FileHeader blank line error with multiple namespaces in one file - - Fixed bug #2926 : phpcs hangs when using arrow functions that return heredoc - - Fixed bug #2943 : Redundant semicolon added to a file when fixing PSR2.Files.ClosingTag.NotAllowed - - Fixed bug #2967 : Markdown generator does not output headings correctly - -- Thanks to Petr Bugyík for the patch - - Fixed bug #2977 : File::isReference() does not detect return by reference for closures - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2994 : Generic.Formatting.DisallowMultipleStatements false positive for FOR loop with no body - - Fixed bug #3033 : Error generated during tokenizing of goto statements on PHP 8 - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.5.5 - 3.5.5 - - - stable - stable - - 2020-04-17 - BSD License - - - The T_FN backfill now works more reliably so T_FN tokens only ever represent real arrow functions - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed an issue where including sniffs using paths containing multiple dots would silently fail - - Generic.CodeAnalysis.EmptyPHPStatement now detects empty statements at the start of control structures - - Error wording in PEAR.Functions.FunctionCallSignature now always uses "parenthesis" instead of sometimes using "bracket" - -- Thanks to Vincent Langlet for the patch - - Fixed bug #2787 : Squiz.PHP.DisallowMultipleAssignments not ignoring typed property declarations - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2810 : PHPCBF fails to fix file with empty statement at start on control structure - - Fixed bug #2812 : Squiz.Arrays.ArrayDeclaration not detecting some arrays with multiple arguments on the same line - -- Thanks to Jakub Chábek for the patch - - Fixed bug #2826 : Generic.WhiteSpace.ArbitraryParenthesesSpacing doesn't detect issues for statements directly after a control structure - -- Thanks to Vincent Langlet for the patch - - Fixed bug #2848 : PSR12.Files.FileHeader false positive for file with mixed PHP and HTML and no file header - - Fixed bug #2849 : Generic.WhiteSpace.ScopeIndent false positive with arrow function inside array - - Fixed bug #2850 : Generic.PHP.LowerCaseKeyword complains __HALT_COMPILER is uppercase - - Fixed bug #2853 : Undefined variable error when using Info report - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2865 : Double arrow tokenized as T_STRING when placed after function named "fn" - - Fixed bug #2867 : Incorrect scope matching when arrow function used inside IF condition - - Fixed bug #2868 : phpcs:ignore annotation doesnt work inside a docblock - - Fixed bug #2878 : PSR12.Files.FileHeader conflicts with Generic.Files.LineEndings - - Fixed bug #2895 : PSR2.Methods.FunctionCallSignature.MultipleArguments false positive with arrow function argument - - - - - 3.5.4 - 3.5.4 - - - stable - stable - - 2020-01-31 - BSD License - - - The PHP 7.4 numeric separator backfill now works correctly for more float formats - -- Thanks to Juliette Reinders Folmer for the patch - - The PHP 7.4 numeric separator backfill is no longer run on PHP version 7.4.0 or greater - - File::getCondition() now accepts a 3rd argument that allows for the closest matching token to be returned - -- By default, it continues to return the first matched token found from the top of the file - - Fixed detection of array return types for arrow functions - - Added Generic.PHP.DisallowRequestSuperglobal to ban the use of the $_REQUEST superglobal - -- Thanks to Morerice for the contribution - - Generic.ControlStructures.InlineControlStructure no longer shows errors for WHILE and FOR statements without a body - -- Previously it required these to have curly braces, but there were no statements to enclose in them - -- Thanks to Juliette Reinders Folmer for the patch - - PSR12.ControlStructures.BooleanOperatorPlacement can now be configured to enforce a specific operator position - -- By default, the sniff ensures that operators are all at the begining or end of lines, but not a mix of both - -- Set the allowOnly property to "first" to enforce all boolean operators to be at the start of a line - -- Set the allowOnly property to "last" to enforce all boolean operators to be at the end of a line - -- Thanks to Vincent Langlet for the patch - - PSR12.Files.ImportStatement now auto-fixes import statements by removing the leading slash - -- Thanks to Michał Bundyra for the patch - - Squiz.ControlStructures.ForLoopDeclaration now has a setting to ignore newline characters - -- Default remains FALSE, so newlines are not allowed within FOR definitions - -- Override the "ignoreNewlines" setting in a ruleset.xml file to change - - Squiz.PHP.InnerFunctions now handles multiple nested anon classes correctly - - Fixed bug #2497 : Sniff properties not set when referencing a sniff using relative paths or non-native slashes - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2657 : Squiz.WhiteSpace.FunctionSpacing can remove spaces between comment and first/last method during auto-fixing - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2688 : Case statements not tokenized correctly when switch is contained within ternary - - Fixed bug #2698 : PHPCS throws errors determining auto report width when shell_exec is disabled - -- Thanks to Matthew Peveler for the patch - - Fixed bug #2730 : PSR12.ControlStructures.ControlStructureSpacing does not ignore comments between conditions - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2732 : PSR12.Files.FileHeader misidentifies file header in mixed content file - - Fixed bug #2745 : AbstractArraySniff wrong indices when mixed coalesce and ternary values - -- Thanks to Michał Bundyra for the patch - - Fixed bug #2748 : Wrong end of statement for fn closures - -- Thanks to Michał Bundyra for the patch - - Fixed bug #2751 : Autoload relative paths first to avoid confusion with files from the global include path - -- Thanks to Klaus Purer for the patch - - Fixed bug #2763 : PSR12 standard reports errors for multi-line FOR definitions - - Fixed bug #2768 : Generic.Files.LineLength false positive for non-breakable strings at exactly the soft limit - -- Thanks to Alex Miles for the patch - - Fixed bug #2773 : PSR2.Methods.FunctionCallSignature false positive when arrow function has array return type - - Fixed bug #2790 : PSR12.Traits.UseDeclaration ignores block comments - -- Thanks to Vincent Langlet for the patch - - Fixed bug #2791 : PSR12.Functions.NullableTypeDeclaration false positive when ternary operator used with instanceof - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2802 : Can't specify a report file path using the tilde shortcut - - Fixed bug #2804 : PHP4-style typed properties not tokenized correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2805 : Undefined Offset notice during live coding of arrow functions - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2843 : Tokenizer does not support alternative syntax for declare statements - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.5.3 - 3.5.3 - - - stable - stable - - 2019-12-04 - BSD License - - - The PHP 7.4 T_FN token has been made available for older versions - -- T_FN represents the fn string used for arrow functions - -- The double arrow becomes the scope opener, and uses a new T_FN_ARROW token type - -- The token after the statement (normally a semicolon) becomes the scope closer - -- The token is also associated with the opening and closing parenthesis of the statement - -- Any functions named "fn" will cause have a T_FN token for the function name, but have no scope information - -- Thanks to Michał Bundyra for the help with this change - - PHP 7.4 numeric separators are now tokenized in the same way when using older PHP versions - -- Previously, a number like 1_000 would tokenize as T_LNUMBER (1), T_STRING (_000) - -- Now, the number tokenizes as T_LNUMBER (1_000) - -- Sniff developers should consider how numbers with underscores impact their custom sniffs - - The PHPCS file cache now takes file permissions into account - -- The cache is now invalidated for a file when its permissions are changed - - File::getMethodParameters() now supports arrow functions - - File::getMethodProperties() now supports arrow functions - - Added Fixer::changeCodeBlockIndent() to change the indent of a code block while auto-fixing - -- Can be used to either increase or decrease the indent - -- Useful when moving the start position of something like a closure, where you want the content to also move - - Added Generic.Files.ExecutableFile sniff - -- Ensures that files are not executable - -- Thanks to Matthew Peveler for the contribution - - Generic.CodeAnalysis.EmptyPhpStatement now reports unnecessary semicolons after control structure closing braces - -- Thanks to Vincent Langlet for the patch - - Generic.PHP.LowerCaseKeyword now enforces that the "fn" keyword is lowercase - -- Thanks to Michał Bundyra for the patch - - Generic.WhiteSpace.ScopeIndent now supports static arrow functions - - PEAR.Functions.FunctionCallSignature now adjusts the indent of function argument contents during auto-fixing - -- Previously, only the first line of an argument was changed, leading to inconsistent indents - -- This change also applies to PSR2.Methods.FunctionCallSignature - - PSR2.ControlStructures.ControlStructureSpacing now checks whitespace before the closing parenthesis of multi-line control structures - -- Previously, it incorrectly applied the whitespace check for single-line definitions only - - PSR12.Functions.ReturnTypeDeclaration now checks the return type of arrow functions - -- Thanks to Michał Bundyra for the patch - - PSR12.Traits.UseDeclaration now ensures all trait import statements are grouped together - -- Previously, the trait import section of the class ended when the first non-import statement was found - -- Checking now continues throughout the class to ensure all statements are grouped together - -- This also ensures that empty lines are not requested after an import statement that isn't the last one - - Squiz.Functions.LowercaseFunctionKeywords now enforces that the "fn" keyword is lowercase - -- Thanks to Michał Bundyra for the patch - - Fixed bug #2586 : Generic.WhiteSpace.ScopeIndent false positives when indenting open tags at a non tab-stop - - Fixed bug #2638 : Squiz.CSS.DuplicateClassDefinitionSniff sees comments as part of the class name - -- Thanks to Raphael Horber for the patch - - Fixed bug #2640 : Squiz.WhiteSpace.OperatorSpacing false positives for some negation operators - -- Thanks to Jakub Chábek and Juliette Reinders Folmer for the patch - - Fixed bug #2674 : Squiz.Functions.FunctionDeclarationArgumentSpacing prints wrong argument name in error message - - Fixed bug #2676 : PSR12.Files.FileHeader locks up when file ends with multiple inline comments - - Fixed bug #2678 : PSR12.Classes.AnonClassDeclaration incorrectly enforcing that closing brace be on a line by itself - - Fixed bug #2685 : File::getMethodParameters() setting typeHintEndToken for vars with no type hint - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2694 : AbstractArraySniff produces invalid indices when using ternary operator - -- Thanks to Michał Bundyra for the patch - - Fixed bug #2702 : Generic.WhiteSpace.ScopeIndent false positive when using ternary operator with short arrays - - - - - 3.5.2 - 3.5.2 - - - stable - stable - - 2019-10-28 - BSD License - - - Generic.ControlStructures.DisallowYodaConditions now returns less false positives - -- False positives were being returned for array comparisions, or when performing some function calls - - Squiz.WhiteSpace.SemicolonSpacing.Incorrect error message now escapes newlines and tabs - -- Provides a clearer error message as whitespace is now visible - -- Also allows for better output for report types such as CSV and XML - - The error message for PSR12.Files.FileHeader.SpacingAfterBlock has been made clearer - -- It now uses the wording from the published PSR-12 standard to indicate that blocks must be separated by a blank line - -- Thanks to Craig Duncan for the patch - - Fixed bug #2654 : Incorrect indentation for arguments of multiline function calls - - Fixed bug #2656 : Squiz.WhiteSpace.MemberVarSpacing removes comments before first member var during auto fixing - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2663 : Generic.NamingConventions.ConstructorName complains about old constructor in interfaces - - Fixed bug #2664 : PSR12.Files.OpenTag incorrectly identifies PHP file with only an opening tag - - Fixed bug #2665 : PSR12.Files.ImportStatement should not apply to traits - - Fixed bug #2673 : PSR12.Traits.UseDeclaration does not allow comments or blank lines between use statements - - - - - 3.5.1 - 3.5.1 - - - stable - stable - - 2019-10-17 - BSD License - - - Very very verbose diff report output has slightly changed to improve readability - -- Output is printed when running PHPCS with the --report=diff and -vvv command line arguments - -- Fully qualified class names have been replaced with sniff codes - -- Tokens being changed now display the line number they are on - - PSR2, PSR12, and PEAR standards now correctly check for blank lines at the start of function calls - -- This check has been missing from these standards, but has now been implemented - -- When using the PEAR standard, the error code is PEAR.Functions.FunctionCallSignature.FirstArgumentPosition - -- When using PSR2 or PSR12, the error code is PSR2.Methods.FunctionCallSignature.FirstArgumentPosition - - PSR12.ControlStructures.BooleanOperatorPlacement no longer complains when multiple expression appears on the same line - -- Previously, boolean operators were enforce to appear at the start or end of lines only - -- Boolean operators can now appear in the middle of the line - - PSR12.Files.FileHeader no longer ignores comments preceding a use, namespace, or declare statement - - PSR12.Files.FileHeader now allows a hashbang line at the top of the file - - Fixed bug #2506 : PSR2 standard can't auto fix multi-line function call inside a string concat statement - - Fixed bug #2530 : PEAR.Commenting.FunctionComment does not support intersection types in comments - - Fixed bug #2615 : Constant visibility false positive on non-class constants - - Fixed bug #2616 : PSR12.Files.FileHeader false positive when file only contains docblock - - Fixed bug #2619 : PSR12.Files.FileHeader locks up when inline comment is the last content in a file - - Fixed bug #2621 : PSR12.Classes.AnonClassDeclaration.CloseBraceSameLine false positive for anon class passed as function argument - -- Thanks to Martins Sipenko for the patch - - Fixed bug #2623 : PSR12.ControlStructures.ControlStructureSpacing not ignoring indentation inside multi-line string arguments - - Fixed bug #2624 : PSR12.Traits.UseDeclaration doesnt apply the correct indent during auto fixing - - Fixed bug #2626 : PSR12.Files.FileHeader detects @var annotations as file docblocks - - Fixed bug #2628 : PSR12.Traits.UseDeclaration does not allow comments above a USE declaration - - Fixed bug #2632 : Incorrect indentation of lines starting with "static" inside closures - - Fixed bug #2641 : PSR12.Functions.NullableTypeDeclaration false positive when using new static() - - - - - 3.5.0 - 3.5.0 - - - stable - stable - - 2019-09-27 - BSD License - - - The included PSR12 standard is now complete and ready to use - -- Check your code using PSR-12 by running PHPCS with --standard=PSR12 - - Added support for PHP 7.4 typed properties - -- The nullable operator is now tokenized as T_NULLABLE inside property types, as it is elsewhere - -- To get the type of a member var, use the File::getMemberProperties() method, which now contains a "type" array index - --- This contains the type of the member var, or a blank string if not specified - --- If the type is nullable, the return type will contain the leading ? - --- If a type is specified, the position of the first token in the type will be set in a "type_token" array index - --- If a type is specified, the position of the last token in the type will be set in a "type_end_token" array index - --- If the type is nullable, a "nullable_type" array index will also be set to TRUE - --- If the type contains namespace information, it will be cleaned of whitespace and comments in the return value - - The PSR1 standard now correctly bans alternate PHP tags - -- Previously, it only banned short open tags and not the pre-7.0 alternate tags - - Added support for only checking files that have been locally staged in a git repo - -- Use --filter=gitstaged to check these files - -- You still need to give PHPCS a list of files or directories in which to apply the filter - -- Thanks to Juliette Reinders Folmer for the contribution - - JSON reports now end with a newline character - - The phpcs.xsd schema now validates phpcs-only and phpcbf-only attributes correctly - -- Thanks to Juliette Reinders Folmer for the patch - - The tokenizer now correctly identifies inline control structures in more cases - - All helper methods inside the File class now throw RuntimeException instead of TokenizerException - -- Some tokenizer methods were also throwing RuntimeExpection but now correctly throw TokenizerException - -- Thanks to Juliette Reinders Folmer for the patch - - The File::getMethodParameters() method now returns more information, and supports closure USE groups - -- If a type hint is specified, the position of the last token in the hint will be set in a "type_hint_end_token" array index - -- If a default is specified, the position of the first token in the default value will be set in a "default_token" array index - -- If a default is specified, the position of the equals sign will be set in a "default_equal_token" array index - -- If the param is not the last, the position of the comma will be set in a "comma_token" array index - -- If the param is passed by reference, the position of the reference operator will be set in a "reference_token" array index - -- If the param is variable length, the position of the variadic operator will be set in a "variadic_token" array index - - The T_LIST token and it's opening and closing parentheses now contain references to each other in the tokens array - -- Uses the same parenthesis_opener/closer/owner indexes as other tokens - -- Thanks to Juliette Reinders Folmer for the patch - - The T_ANON_CLASS token and it's opening and closing parentheses now contain references to each other in the tokens array - -- Uses the same parenthesis_opener/closer/owner indexes as other tokens - -- Only applicable if the anon class is passing arguments to the constructor - -- Thanks to Juliette Reinders Folmer for the patch - - The PHP 7.4 T_BAD_CHARACTER token has been made available for older versions - -- Allows you to safely look for this token, but it will not appear unless checking with PHP 7.4+ - - Metrics are now available for Squiz.WhiteSpace.FunctionSpacing - -- Use the "info" report to see blank lines before/after functions - -- Thanks to Juliette Reinders Folmer for the patch - - Metrics are now available for Squiz.WhiteSpace.MemberVarSpacing - -- Use the "info" report to see blank lines before member vars - -- Thanks to Juliette Reinders Folmer for the patch - - Added Generic.ControlStructures.DisallowYodaConditions sniff - -- Ban the use of Yoda conditions - -- Thanks to Mponos George for the contribution - - Added Generic.PHP.RequireStrictTypes sniff - -- Enforce the use of a strict types declaration in PHP files - - Added Generic.WhiteSpace.SpreadOperatorSpacingAfter sniff - -- Checks whitespace between the spread operator and the variable/function call it applies to - -- Thanks to Juliette Reinders Folmer for the contribution - - Added PSR12.Classes.AnonClassDeclaration sniff - -- Enforces the formatting of anonymous classes - - Added PSR12.Classes.ClosingBrace sniff - -- Enforces that closing braces of classes/interfaces/traits/functions are not followed by a comment or statement - - Added PSR12.ControlStructures.BooleanOperatorPlacement sniff - -- Enforces that boolean operators between conditions are consistently at the start or end of the line - - Added PSR12.ControlStructures.ControlStructureSpacing sniff - -- Enforces that spacing and indents are correct inside control structure parenthesis - - Added PSR12.Files.DeclareStatement sniff - -- Enforces the formatting of declare statements within a file - - Added PSR12.Files.FileHeader sniff - -- Enforces the order and formatting of file header blocks - - Added PSR12.Files.ImportStatement sniff - -- Enforces the formatting of import statements within a file - - Added PSR12.Files.OpenTag sniff - -- Enforces that the open tag is on a line by itself when used at the start of a php-only file - - Added PSR12.Functions.ReturnTypeDeclaration sniff - -- Enforces the formatting of return type declarations in functions and closures - - Added PSR12.Properties.ConstantVisibility sniff - -- Enforces that constants must have their visibility defined - -- Uses a warning instead of an error due to this conditionally requiring the project to support PHP 7.1+ - - Added PSR12.Traits.UseDeclaration sniff - -- Enforces the formatting of trait import statements within a class - - Generic.Files.LineLength ignoreComments property now ignores comments at the end of a line - -- Previously, this property was incorrectly causing the sniff to ignore any line that ended with a comment - -- Now, the trailing comment is not included in the line length, but the rest of the line is still checked - - Generic.Files.LineLength now only ignores unwrappable comments when the comment is on a line by itself - -- Previously, a short unwrappable comment at the end of the line would have the sniff ignore the entire line - - Generic.Functions.FunctionCallArgumentSpacing no longer checks spacing around assignment operators inside function calls - -- Use the Squiz.WhiteSpace.OperatorSpacing sniff to enforce spacing around assignment operators - --- Note that this sniff checks spacing around all assignment operators, not just inside function calls - -- The Generic.Functions.FunctionCallArgumentSpacing.NoSpaceBeforeEquals error has been removed - --- use Squiz.WhiteSpace.OperatorSpacing.NoSpaceBefore instead - -- The Generic.Functions.FunctionCallArgumentSpacing.NoSpaceAfterEquals error has been removed - --- use Squiz.WhiteSpace.OperatorSpacing.NoSpaceAfter instead - -- This also changes the PEAR/PSR2/PSR12 standards so they no longer check assignment operators inside function calls - --- They were previously checking these operators when they should not have - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.WhiteSpace.ScopeIndent no longer performs exact indents checking for chained method calls - -- Other sniffs can be used to enforce chained method call indent rules - -- Thanks to Pieter Frenssen for the patch - - PEAR.WhiteSpace.ObjectOperatorIndent now supports multi-level chained statements - -- When enabled, chained calls must be indented 1 level more or less than the previous line - -- Set the new "multilevel" setting to TRUE in a ruleset.xml file to enable this behaviour - -- Thanks to Marcos Passos for the patch - - PSR2.ControlStructures.ControlStructureSpacing now allows whitespace after the opening parenthesis if followed by a comment - -- Thanks to Michał Bundyra for the patch - - PSR2.Classes.PropertyDeclaration now enforces a single space after a property type keyword - -- The PSR2 standard itself excludes this new check as it is not defined in the written standard - -- Using the PSR12 standard will enforce this check - - Squiz.Commenting.BlockComment no longer requires blank line before comment if it's the first content after the PHP open tag - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Functions.FunctionDeclarationArgumentSpacing now has more accurate error messages - -- This includes renaming the SpaceAfterDefault error code to SpaceAfterEquals, which reflects the real error - - Squiz.Functions.FunctionDeclarationArgumentSpacing now checks for no space after a reference operator - -- If you don't want this new behaviour, exclude the SpacingAfterReference error message in a ruleset.xml file - - Squiz.Functions.FunctionDeclarationArgumentSpacing now checks for no space after a variadic operator - -- If you don't want this new behaviour, exclude the SpacingAfterVariadic error message in a ruleset.xml file - - Squiz.Functions.MultiLineFunctionDeclaration now has improved fixing for the FirstParamSpacing and UseFirstParamSpacing errors - - Squiz.Operators.IncrementDecrementUsage now suggests pre-increment of variables instead of post-increment - -- This change does not enforce pre-increment over post-increment; only the suggestion has changed - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.PHP.DisallowMultipleAssignments now has a second error code for when assignments are found inside control structure conditions - -- The new error code is Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure - -- All other multiple assignment cases use the existing error code Squiz.PHP.DisallowMultipleAssignments.Found - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.FunctionSpacing now applies beforeFirst and afterLast spacing rules to nested functions - -- Previously, these rules only applied to the first and last function in a class, interface, or trait - -- These rules now apply to functions nested in any statement block, including other functions and conditions - - Squiz.WhiteSpace.OperatorSpacing now has improved handling of parse errors - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.OperatorSpacing now checks spacing around the instanceof operator - -- Thanks to Jakub Chábek for the patch - - Squiz.WhiteSpace.OperatorSpacing can now enforce a single space before assignment operators - -- Previously, the sniff this spacing as multiple assignment operators are sometimes aligned - -- Now, you can set the ignoreSpacingBeforeAssignments sniff property to FALSE to enable checking - -- Default remains TRUE, so spacing before assignments is not checked by default - -- Thanks to Jakub Chábek for the patch - - Fixed bug #2391 : Sniff-specific ignore rules inside rulesets are filtering out too many files - -- Thanks to Juliette Reinders Folmer and Willington Vega for the patch - - Fixed bug #2478 : FunctionCommentThrowTag.WrongNumber when exception is thrown once but built conditionally - - Fixed bug #2479 : Generic.WhiteSpace.ScopeIndent error when using array destructing with exact indent checking - - Fixed bug #2498 : Squiz.Arrays.ArrayDeclaration.MultiLineNotAllowed autofix breaks heredoc - - Fixed bug #2502 : Generic.WhiteSpace.ScopeIndent false positives with nested switch indentation and case fall-through - - Fixed bug #2504 : Generic.WhiteSpace.ScopeIndent false positives with nested arrays and nowdoc string - - Fixed bug #2511 : PSR2 standard not checking if closing paren of single-line function declaration is on new line - - Fixed bug #2512 : Squiz.PHP.NonExecutableCode does not support alternate SWITCH control structure - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2522 : Text generator throws error when code sample line is too long - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2526 : XML report format has bad syntax on Windows - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2529 : Generic.Formatting.MultipleStatementAlignment wrong error for assign in string concat - - Fixed bug #2534 : Unresolvable installed_paths can lead to open_basedir errors - -- Thanks to Oliver Nowak for the patch - - Fixed bug #2541 : Text doc generator does not allow for multi-line rule explanations - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2549 : Searching for a phpcs.xml file can throw warnings due to open_basedir restrictions - -- Thanks to Matthew Peveler for the patch - - Fixed bug #2558 : PHP 7.4 throwing offset syntax with curly braces is deprecated message - -- Thanks to Matthew Peveler for the patch - - Fixed bug #2561 : PHP 7.4 compatibility fix / implode argument order - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2562 : Inline WHILE triggers SpaceBeforeSemicolon incorrectly - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2565 : Generic.ControlStructures.InlineControlStructure confused by mixed short/long tags - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2566 : Author tag email validation doesn't support all TLDs - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2575 : Custom error messages don't have data replaced when cache is enabled - - Fixed bug #2601 : Squiz.WhiteSpace.FunctionSpacing incorrect fix when spacing is 0 - - Fixed bug #2608 : PSR2 throws errors for use statements when multiple namespaces are defined in a file - - - - - 3.4.2 - 3.4.2 - - - stable - stable - - 2019-04-11 - BSD License - - - Squiz.Arrays.ArrayDeclaration now has improved handling of syntax errors - - Fixed an issue where the PCRE JIT on PHP 7.3 caused PHPCS to die when using the parallel option - -- PHPCS now disables the PCRE JIT before running - - Fixed bug #2368 : MySource.PHP.AjaxNullComparison throws error when first function has no doc comment - - Fixed bug #2414 : Indention false positive in switch/case/if combination - - Fixed bug #2423 : Squiz.Formatting.OperatorBracket.MissingBrackets error with static - - Fixed bug #2450 : Indentation false positive when closure containing nested IF conditions used as function argument - - Fixed bug #2452 : LowercasePHPFunctions sniff failing on "new \File()" - - Fixed bug #2453 : Squiz.CSS.SemicolonSpacingSniff false positive when style name proceeded by an asterisk - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2464 : Fixer conflict between Generic.WhiteSpace.ScopeIndent and Squiz.WhiteSpace.ScopeClosingBrace when class indented 1 space - - Fixed bug #2465 : Excluding a sniff by path is not working - - Fixed bug #2467 : PHP open/close tags inside CSS files are replaced with internal PHPCS token strings when auto fixing - - - - - 3.4.1 - 3.4.1 - - - stable - stable - - 2019-03-19 - BSD License - - - The PEAR installable version of PHPCS was missing some files, which have been re-included in this release - -- The code report was not previously available for PEAR installs - -- The Generic.Formatting.SpaceBeforeCast sniff was not previously available for PEAR installs - -- The Generic.WhiteSpace.LanguageConstructSpacing sniff was not previously available for PEAR installs - -- Thanks to Juliette Reinders Folmer for the patch - - - PHPCS will now refuse to run if any of the required PHP extensions are not loaded - -- Previously, PHPCS only relied on requirements being checked by PEAR and Composer - -- Thanks to Juliette Reinders Folmer for the patch - - Ruleset XML parsing errors are now displayed in a readable format so they are easier to correct - -- Thanks to Juliette Reinders Folmer for the patch - - The PSR2 standard no longer throws duplicate errors for spacing around FOR loop parentheses - -- Thanks to Juliette Reinders Folmer for the patch - - T_PHPCS_SET tokens now contain sniffCode, sniffProperty, and sniffPropertyValue indexes - -- Sniffs can use this information instead of having to parse the token content manually - - Added more guard code for syntax errors to various CSS sniffs - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Commenting.DocComment error messages now contain the name of the comment tag that caused the error - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.ControlStructures.InlineControlStructure now handles syntax errors correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Debug.JSHint now longer requires rhino and can be run directly from the npm install - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Files.LineEndings no longer adds superfluous new line at the end of JS and CSS files - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Formatting.DisallowMultipleStatements no longer tries fix lines containing phpcs:ignore statements - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Functions.FunctionCallArgumentSpacing now has improved performance and anonymous class support - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.WhiteSpace.ScopeIndent now respects changes to the "exact" property using phpcs:set mid-way through a file - -- This allows you change the "exact" rule for only some parts of a file - - Generic.WhiteSpace.ScopeIndent now disables exact indent checking inside all arrays - -- Previously, this was only done when using long array syntax, but it now works for short array syntax as well - - PEAR.Classes.ClassDeclaration now has improved handling of PHPCS annotations and tab indents - - PSR12.Classes.ClassInstantiation has changed it's error code from MissingParenthesis to MissingParentheses - - PSR12.Keywords.ShortFormTypeKeywords now ignores all spacing inside type casts during both checking and fixing - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Classes.LowercaseClassKeywords now examines the class keyword for anonymous classes - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.ControlStructures.ControlSignature now has improved handling of parse errors - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.PostStatementComment fixer no longer adds a blank line at the start of a JS file that begins with a comment - -- Fixes a conflict between this sniff and the Squiz.WhiteSpace.SuperfluousWhitespace sniff - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.PostStatementComment now ignores comments inside control structure conditions, such as FOR loops - -- Fixes a conflict between this sniff and the Squiz.ControlStructures.ForLoopDeclaration sniff - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.FunctionCommentThrowTag now has improved support for unknown exception types and namespaces - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.ControlStructures.ForLoopDeclaration has improved whitespace, closure, and empty expression support - -- The SpacingAfterSecondNoThird error code has been removed as part of these fixes - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.CSS.ClassDefinitionOpeningBraceSpace now handles comments and indentation correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.CSS.ClassDefinitionClosingBrace now handles comments, indentation, and multiple statements on the same line correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.CSS.Opacity now handles comments correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.CSS.SemicolonSpacing now handles comments and syntax errors correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.NamingConventions.ValidVariableName now supports variables inside anonymous classes correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.PHP.LowercasePHPFunctions now handles use statements, namespaces, and comments correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.FunctionSpacing now fixes function spacing correctly when a function is the first content in a file - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.SuperfluousWhitespace no longer throws errors for spacing between functions and properties in anon classes - -- Thanks to Juliette Reinders Folmer for the patch - - Zend.Files.ClosingTag no longer adds a semi-colon during fixing of a file that only contains a comment - -- Thanks to Juliette Reinders Folmer for the patch - - Zend.NamingConventions.ValidVariableName now supports variables inside anonymous classes correctly - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2298 : PSR2.Classes.ClassDeclaration allows extended class on new line - -- Thanks to Michał Bundyra for the patch - - Fixed bug #2337 : Generic.WhiteSpace.ScopeIndent incorrect error when multi-line function call starts on same line as open tag - - Fixed bug #2348 : Cache not invalidated when changing a ruleset included by another - - Fixed bug #2376 : Using __halt_compiler() breaks Generic.PHP.ForbiddenFunctions unless it's last in the function list - -- Thanks to Sijun Zhu for the patch - - Fixed bug #2393 : The gitmodified filter will infinitely loop when encountering deleted file paths - -- Thanks to Lucas Manzke for the patch - - Fixed bug #2396 : Generic.WhiteSpace.ScopeIndent incorrect error when multi-line IF condition mixed with HTML - - Fixed bug #2431 : Use function/const not tokenized as T_STRING when preceded by comment - - - - - 3.4.0 - 3.4.0 - - - stable - stable - - 2018-12-20 - BSD License - - - The Generic.Formatting.NoSpaceAfterCast sniff has been deprecated and will be removed in version 4 - -- The functionality of this sniff is now available in the Generic.Formatting.SpaceAfterCast sniff - --- Include the Generic.Formatting.SpaceAfterCast sniff and set the "spacing" property to "0" - -- As soon as possible, replace all instances of the old sniff code with the new sniff code and property setting - --- The existing sniff will continue to work until version 4 has been released - - - Rule include patterns in a ruleset.xml file are now evaluated as OR instead of AND - -- Previously, a file had to match every include pattern and no exclude patterns to be included - -- Now, a file must match at least one include pattern and no exclude patterns to be included - -- This is a bug fix as include patterns are already documented to work this way - - New token T_BITWISE_NOT added for the bitwise not operator - -- This token was previously tokenized as T_NONE - -- Any sniffs specifically looking for T_NONE tokens with a tilde as the contents must now also look for T_BITWISE_NOT - -- Sniffs can continue looking for T_NONE as well as T_BITWISE_NOT to support older PHP_CodeSniffer versions - - All types of binary casting are now tokenized as T_BINARY_CAST - -- Previously, the 'b' in 'b"some string with $var"' would be a T_BINARY_CAST, but only when the string contained a var - -- This change ensures the 'b' is always tokenized as T_BINARY_CAST - -- This change also converts '(binary)' from T_STRING_CAST to T_BINARY_CAST - -- Thanks to Juliette Reinders Folmer for the help with this patch - - Array properties set inside a ruleset.xml file can now extend a previous value instead of always overwriting it - -- e.g., if you include a ruleset that defines forbidden functions, can you now add to that list instead of having to redefine it - -- To use this feature, add extends="true" to the property tag - --- e.g., property name="forbiddenFunctionNames" type="array" extend="true" - -- Thanks to Michael Moravec for the patch - - If $XDG_CACHE_HOME is set and points to a valid directory, it will be used for caching instead of the system temp directory - - PHPCBF now disables parallel running if you are passing content on STDIN - -- Stops an error from being shown after the fixed output is printed - - The progress report now shows files with tokenizer errors as skipped (S) instead of a warning (W) - -- The tokenizer error is still displayed in reports as normal - -- Thanks to Juliette Reinders Folmer for the patch - - The Squiz standard now ensures there is no space between an increment/decrement operator and its variable - - The File::getMethodProperties() method now includes a has_body array index in the return value - -- FALSE if the method has no body (as with abstract and interface methods) or TRUE otherwise - -- Thanks to Chris Wilkinson for the patch - - The File::getTokensAsString() method now throws an exception if the $start param is invalid - -- If the $length param is invalid, an empty string will be returned - -- Stops an infinite loop when the function is passed invalid data - -- Thanks to Juliette Reinders Folmer for the patch - - Added new Generic.CodeAnalysis.EmptyPHPStatement sniff - -- Warns when it finds empty PHP open/close tag combinations or superfluous semicolons - -- Thanks to Juliette Reinders Folmer for the contribution - - Added new Generic.Formatting.SpaceBeforeCast sniff - -- Ensures there is exactly 1 space before a type cast, unless the cast statement is indented or multi-line - -- Thanks to Juliette Reinders Folmer for the contribution - - Added new Generic.VersionControl.GitMergeConflict sniff - -- Detects merge conflict artifacts left in files - -- Thanks to Juliette Reinders Folmer for the contribution - - Added Generic.WhiteSpace.IncrementDecrementSpacing sniff - -- Ensures there is no space between the operator and the variable it applies to - -- Thanks to Juliette Reinders Folmer for the contribution - - Added PSR12.Functions.NullableTypeDeclaration sniff - -- Ensures there is no space after the question mark in a nullable type declaration - -- Thanks to Timo Schinkel for the contribution - - A number of sniffs have improved support for methods in anonymous classes - -- These sniffs would often throw the same error twice for functions in nested classes - -- Error messages have also been changed to be less confusing - -- The full list of affected sniffs is: - --- Generic.NamingConventions.CamelCapsFunctionName - --- PEAR.NamingConventions.ValidFunctionName - --- PSR1.Methods.CamelCapsMethodName - --- PSR2.Methods.MethodDeclaration - --- Squiz.Scope.MethodScope - --- Squiz.Scope.StaticThisUsage - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.CodeAnalysis.UnusedFunctionParameter now only skips functions with empty bodies when the class implements an interface - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.CodeAnalysis.UnusedFunctionParameter now has additional error codes to indicate where unused params were found - -- The new error code prefixes are: - --- FoundInExtendedClass: when the class extends another - --- FoundInImplementedInterface: when the class implements an interface - --- Found: used in all other cases, including closures - -- The new error code suffixes are: - --- BeforeLastUsed: the unused param was positioned before the last used param in the function signature - --- AfterLastUsed: the unused param was positioned after the last used param in the function signature - -- This makes the new error code list for this sniff: - --- Found - --- FoundBeforeLastUsed - --- FoundAfterLastUsed - --- FoundInExtendedClass - --- FoundInExtendedClassBeforeLastUsed - --- FoundInExtendedClassAfterLastUsed - --- FoundInImplementedInterface - --- FoundInImplementedInterfaceBeforeLastUsed - --- FoundInImplementedInterfaceAfterLastUsed - -- These errors code make it easier for specific cases to be ignored or promoted using a ruleset.xml file - -- Thanks to Juliette Reinders Folmer for the contribution - - Generic.Classes.DuplicateClassName now inspects traits for duplicate names as well as classes and interfaces - -- Thanks to Chris Wilkinson for the patch - - Generic.Files.InlineHTML now ignores a BOM at the start of the file - -- Thanks to Chris Wilkinson for the patch - - Generic.PHP.CharacterBeforePHPOpeningTag now ignores a BOM at the start of the file - -- Thanks to Chris Wilkinson for the patch - - Generic.Formatting.SpaceAfterCast now has a setting to specify how many spaces are required after a type cast - -- Default remains 1 - -- Override the "spacing" setting in a ruleset.xml file to change - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Formatting.SpaceAfterCast now has a setting to ignore newline characters after a type cast - -- Default remains FALSE, so newlines are not allowed - -- Override the "ignoreNewlines" setting in a ruleset.xml file to change - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Formatting.SpaceAfterNot now has a setting to specify how many spaces are required after a NOT operator - -- Default remains 1 - -- Override the "spacing" setting in a ruleset.xml file to change - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Formatting.SpaceAfterNot now has a setting to ignore newline characters after the NOT operator - -- Default remains FALSE, so newlines are not allowed - -- Override the "ignoreNewlines" setting in a ruleset.xml file to change - -- Thanks to Juliette Reinders Folmer for the patch - - PEAR.Functions.FunctionDeclaration now checks spacing before the opening parenthesis of functions with no body - -- Thanks to Chris Wilkinson for the patch - - PEAR.Functions.FunctionDeclaration now enforces no space before the semicolon in functions with no body - -- Thanks to Chris Wilkinson for the patch - - PSR2.Classes.PropertyDeclaration now checks the order of property modifier keywords - -- This is a rule that is documented in PSR-2 but was not enforced by the included PSR2 standard until now - -- This sniff is also able to fix the order of the modifier keywords if they are incorrect - -- Thanks to Juliette Reinders Folmer for the patch - - PSR2.Methods.MethodDeclaration now checks method declarations inside traits - -- Thanks to Chris Wilkinson for the patch - - Squiz.Commenting.InlineComment now has better detection of comment block boundaries - - Squiz.Classes.ClassFileName now checks that a trait name matches the filename - -- Thanks to Chris Wilkinson for the patch - - Squiz.Classes.SelfMemberReference now supports scoped declarations and anonymous classes - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Classes.SelfMemberReference now fixes multiple errors at once, increasing fixer performance - -- Thanks to Gabriel Ostrolucký for the patch - - Squiz.Functions.LowercaseFunctionKeywords now checks abstract and final prefixes, and auto-fixes errors - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Objects.ObjectMemberComma.Missing has been renamed to Squiz.Objects.ObjectMemberComma.Found - -- The error is thrown when the comma is found but not required, so the error code was incorrect - -- If you are referencing the old error code in a ruleset XML file, please use the new code instead - -- If you wish to maintain backwards compatibility, you can provide rules for both the old and new codes - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.ObjectOperatorSpacing is now more tolerant of parse errors - - Squiz.WhiteSpace.ObjectOperatorSpacing now fixes errors more efficiently - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2109 : Generic.Functions.CallTimePassByReference false positive for bitwise and used in function argument - - Fixed bug #2165 : Conflict between Squiz.Arrays.ArrayDeclaration and ScopeIndent sniffs when heredoc used in array - - Fixed bug #2167 : Generic.WhiteSpace.ScopeIndent shows invalid error when scope opener indented inside inline HTML - - Fixed bug #2178 : Generic.NamingConventions.ConstructorName matches methods in anon classes with same name as containing class - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2190 : PEAR.Functions.FunctionCallSignature incorrect error when encountering trailing PHPCS annotation - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2194 : Generic.Whitespace.LanguageConstructSpacing should not be checking namespace operators - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2202 : Squiz.WhiteSpace.OperatorSpacing throws error for negative index when using curly braces for string access - -- Same issue fixed in Squiz.Formatting.OperatorBracket - -- Thanks to Andreas Buchenrieder for the patch - - Fixed bug #2210 : Generic.NamingConventions.CamelCapsFunctionName not ignoring SoapClient __getCookies() method - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2211 : PSR2.Methods.MethodDeclaration gets confused over comments between modifier keywords - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2212 : FUNCTION and CONST in use groups being tokenised as T_FUNCTION and T_CONST - -- Thanks to Chris Wilkinson for the patch - - Fixed bug #2214 : File::getMemberProperties() is recognizing method params as properties - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2236 : Memory info measurement unit is Mb but probably should be MB - - Fixed bug #2246 : CSS tokenizer does not tokenize class names correctly when they contain the string NEW - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2278 : Squiz.Operators.ComparisonOperatorUsage false positive when inline IF contained in parentheses - -- Thanks to Arnout Boks for the patch - - Fixed bug #2284 : Squiz.Functions.FunctionDeclarationArgumentSpacing removing type hint during fixing - -- Thanks to Michał Bundyra for the patch - - Fixed bug #2297 : Anonymous class not tokenized correctly when used as argument to another anon class - -- Thanks to Michał Bundyra for the patch - - - - - 2.9.2 - 2.9.2 - - - stable - stable - - 2018-11-08 - BSD License - - - PHPCS should now run under PHP 7.3 without deprecation warnings - -- Thanks to Nick Wilde for the patch - - Fixed bug #1496 : Squiz.Strings.DoubleQuoteUsage not unescaping dollar sign when fixing - -- Thanks to Michał Bundyra for the patch - - Fixed bug #1549 : Squiz.PHP.EmbeddedPhp fixer conflict with // comment before PHP close tag - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1890 : Incorrect Squiz.WhiteSpace.ControlStructureSpacing.NoLineAfterClose error between catch and finally statements - - - - - 3.3.2 - 3.3.2 - - - stable - stable - - 2018-09-24 - BSD License - - - Fixed a problem where the report cache was not being cleared when the sniffs inside a standard were updated - - The info report (--report=info) now has improved formatting for metrics that span multiple lines - -- Thanks to Juliette Reinders Folmer for the patch - - The unit test runner now skips .bak files when looking for test cases - -- Thanks to Juliette Reinders Folmer for the patch - - The Squiz standard now ensures underscores are not used to indicate visibility of private members vars and methods - -- Previously, this standard enforced the use of underscores - - Generic.PHP.NoSilencedErrors error messages now contain a code snippet to show the context of the error - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Arrays.ArrayDeclaration no longer reports errors for a comma on a line new after a here/nowdoc - -- Also stops a parse error being generated when auto-fixing - -- The SpaceBeforeComma error message has been changed to only have one data value instead of two - - Squiz.Commenting.FunctionComment no longer errors when trying to fix indents of multi-line param comments - - Squiz.Formatting.OperatorBracket now correctly fixes statements that contain strings - - Squiz.PHP.CommentedOutCode now ignores more @-style annotations and includes better comment block detection - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed a problem where referencing a relative file path in a ruleset XML file could add unnecessary sniff exclusions - -- This didn't actually exclude anything, but caused verbose output to list strange exclusion rules - - Fixed bug #2110 : Squiz.WhiteSpace.FunctionSpacing is removing indents from the start of functions when fixing - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2115 : Squiz.Commenting.VariableComment not checking var types when the @var line contains a comment - - Fixed bug #2120 : Tokenizer fails to match T_INLINE_ELSE when used after function call containing closure - - Fixed bug #2121 : Squiz.PHP.DisallowMultipleAssignments false positive in while loop conditions - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2127 : File::findExtendedClassName() doesn't support nested classes - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2138 : Tokenizer detects wrong token for php ::class feature with spaces - - Fixed bug #2143 : PSR2.Namespaces.UseDeclaration does not properly fix "use function" and "use const" statements - -- Thanks to Chris Wilkinson for the patch - - Fixed bug #2144 : Squiz.Arrays.ArrayDeclaration does incorrect align calculation in array with cyrillic keys - - Fixed bug #2146 : Zend.Files.ClosingTag removes closing tag from end of file without inserting a semicolon - - Fixed bug #2151 : XML schema not updated with the new array property syntax - - - - - 3.3.1 - 3.3.1 - - - stable - stable - - 2018-07-27 - BSD License - - - Support for HHVM has been dropped due to recent unfixed bugs and HHVM refocus on Hack only - -- Thanks to Walt Sorensen and Juliette Reinders Folmer for helping to remove all HHVM exceptions from the core - - - The full report (the default report) now has improved word wrapping for multi-line messages and sniff codes - -- Thanks to Juliette Reinders Folmer for the patch - - The summary report now sorts files based on their directory location instead of just a basic string sort - -- Thanks to Juliette Reinders Folmer for the patch - - The source report now orders error codes by name when they have the same number of errors - -- Thanks to Juliette Reinders Folmer for the patch - - The junit report no longer generates validation errors with the Jenkins xUnit plugin - -- Thanks to Nikolay Geo for the patch - - Generic.Commenting.DocComment no longer generates the SpacingBeforeTags error if tags are the first content in the docblock - -- The sniff will still generate a MissingShort error if there is no short comment - -- This allows the MissingShort error to be suppressed in a ruleset to make short descriptions optional - - Generic.Functions.FunctionCallArgumentSpacing now properly fixes multi-line function calls with leading commas - -- Previously, newlines between function arguments would be removed - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.PHP.Syntax will now use PHP_BINARY instead of trying to discover the executable path - -- This ensures that the sniff will always syntax check files using the PHP version that PHPCS is running under - -- Setting the php_path config var will still override this value as normal - -- Thanks to Willem Stuursma-Ruwen for the patch - - PSR2.Namespaces.UseDeclaration now supports commas at the end of group use declarations - -- Also improves checking and fixing for use statements containing parse errors - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Arrays.ArrayDeclaration no longer removes the array opening brace while fixing - -- This could occur when the opening brace was on a new line and the first array key directly followed - -- This change also stops the KeyNotAligned error message being incorrectly reported in these cases - - Squiz.Arrays.ArrayDeclaration no longer tries to change multi-line arrays to single line when they contain comments - -- Fixes a conflict between this sniff and some indentation sniffs - - Squiz.Classes.ClassDeclaration no longer enforces spacing rules when a class is followed by a function - -- Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff - - The Squiz.Classes.ValidClassName.NotCamelCaps message now references PascalCase instead of CamelCase - -- The "CamelCase class name" metric produced by the sniff has been changed to "PascalCase class name" - -- This reflects the fact that the class name check is actually a Pascal Case check and not really Camel Case - -- Thanks to Tom H Anderson for the patch - - Squiz.Commenting.InlineComment no longer enforces spacing rules when an inline comment is followed by a docblock - -- Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff - - Squiz.WhiteSpace.OperatorSpacing no longer tries to fix operator spacing if the next content is a comment on a new line - -- Fixes a conflict between this sniff and the Squiz.Commenting.PostStatementComment sniff - -- Also stops PHPCS annotations from being moved to a different line, potentially changing their meaning - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.FunctionSpacing no longer checks spacing of functions at the top of an embedded PHP block - -- Fixes a conflict between this sniff and the Squiz.PHP.EmbeddedPHP sniff - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.MemberVarSpacing no longer checks spacing before member vars that come directly after methods - -- Fixes a conflict between this sniff and the Squiz.WhiteSpace.FunctionSpacing sniff - - Squiz.WhiteSpace.SuperfluousWhitespace now recognizes unicode whitespace at the start and end of a file - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2029 : Squiz.Scope.MemberVarScope throws fatal error when a property is found in an interface - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2047 : PSR12.Classes.ClassInstantiation false positive when instantiating class from array index - - Fixed bug #2048 : GenericFormatting.MultipleStatementAlignment false positive when assigning values inside an array - - Fixed bug #2053 : PSR12.Classes.ClassInstantiation incorrectly fix when using member vars and some variable formats - - Fixed bug #2065 : Generic.ControlStructures.InlineControlStructure fixing fails when inline control structure contains closure - - Fixed bug #2072 : Squiz.Arrays.ArrayDeclaration throws NoComma error when array value is a shorthand IF statement - - Fixed bug #2082 : File with "defined() or define()" syntax triggers PSR1.Files.SideEffects.FoundWithSymbols - - Fixed bug #2095 : PSR2.Namespaces.NamespaceDeclaration does not handle namespaces defined over multiple lines - - - - - 3.3.0 - 3.3.0 - - - stable - stable - - 2018-06-07 - BSD License - - - The Squiz.WhiteSpace.LanguageConstructSpacing sniff has been deprecated and will be removed in version 4 - -- The sniff has been moved to the Generic standard, with a new code of Generic.WhiteSpace.LanguageConstructSpacing - -- As soon as possible, replace all instances of the old sniff code with the new sniff code in your ruleset.xml files - --- The existing Squiz sniff will continue to work until version 4 has been released - -- The new Generic sniff now also checks many more language constructs to enforce additional spacing rules - --- Thanks to Mponos George for the contribution - - - The current method for setting array properties in ruleset files has been deprecated and will be removed in version 4 - -- Currently, setting an array value uses the string syntax "print=>echo,create_function=>null" - -- Now, individual array elements are specified using a new "element" tag with "key" and "value" attributes - --- For example, element key="print" value="echo" - -- Thanks to Michał Bundyra for the patch - - - The T_ARRAY_HINT token has been deprecated and will be removed in version 4 - -- The token was used to ensure array type hints were not tokenized as T_ARRAY, but no other type hints were given a special token - -- Array type hints now use the standard T_STRING token instead - -- Sniffs referencing this token type will continue to run without error until version 4, but will not find any T_ARRAY_HINT tokens - - - The T_RETURN_TYPE token has been deprecated and will be removed in version 4 - -- The token was used to ensure array/self/parent/callable return types were tokenized consistently - -- For namespaced return types, only the last part of the string (the class name) was tokenized as T_RETURN_TYPE - -- This was not consistent and so return types are now left using their original token types so they are not skipped by sniffs - --- The exception are array return types, which are tokenized as T_STRING instead of T_ARRAY, as they are for type hints - -- Sniffs referencing this token type will continue to run without error until version 4, but will not find any T_RETUTN_TYPE tokens - -- To get the return type of a function, use the File::getMethodProperties() method, which now contains a "return_type" array index - --- This contains the return type of the function or closer, or a blank string if not specified - --- If the return type is nullable, the return type will contain the leading ? - ---- A nullable_return_type array index in the return value will also be set to true - --- If the return type contains namespace information, it will be cleaned of whitespace and comments - ---- To access the original return value string, use the main tokens array - - - This release contains an incomplete version of the PSR-12 coding standard - -- Errors found using this standard should be valid, but it will miss a lot of violations until it is complete - -- If you'd like to test and help, you can use the standard by running PHPCS with --standard=PSR12 - - - Config values set using --runtime-set now override any config values set in rulesets or the CodeSniffer.conf file - - You can now apply include-pattern rules to individual message codes in a ruleset like you can with exclude-pattern rules - -- Previously, include-pattern rules only applied to entire sniffs - -- If a message code has both include and exclude patterns, the exclude patterns will be ignored - - Using PHPCS annotations to selectively re-enable sniffs is now more flexible - -- Previously, you could only re-enable a sniff/category/standard using the exact same code that was disabled - -- Now, you can disable a standard and only re-enable a specific category or sniff - -- Or, you can disable a specific sniff and have it re-enable when you re-enable the category or standard - - The value of array sniff properties can now be set using phpcs:set annotations - -- e.g., phpcs:set Standard.Category.SniffName property[] key=>value,key2=>value2 - -- Thanks to Michał Bundyra for the patch - - PHPCS annotations now remain as T_PHPCS_* tokens instead of reverting to comment tokens when --ignore-annotations is used - -- This stops sniffs (especially commenting sniffs) from generating a large number of false errors when ignoring - -- Any custom sniffs that are using the T_PHPCS_* tokens to detect annotations may need to be changed to ignore them - --- Check $phpcsFile->config->annotations to see if annotations are enabled and ignore when false - - You can now use fully or partially qualified class names for custom reports instead of absolute file paths - -- To support this, you must specify an autoload file in your ruleset.xml file and use it to register an autoloader - -- Your autoloader will need to load your custom report class when requested - -- Thanks to Juliette Reinders Folmer for the patch - - The JSON report format now does escaping in error source codes as well as error messages - -- Thanks to Martin Vasel for the patch - - Invalid installed_paths values are now ignored instead of causing a fatal error - - Improved testability of custom rulesets by allowing the installed standards to be overridden - -- Thanks to Timo Schinkel for the patch - - The key used for caching PHPCS runs now includes all set config values - -- This fixes a problem where changing config values (e.g., via --runtime-set) used an incorrect cache file - - The "Function opening brace placement" metric has been separated into function and closure metrics in the info report - -- Closures are no longer included in the "Function opening brace placement" metric - -- A new "Closure opening brace placement" metric now shows information for closures - - Multi-line T_YIELD_FROM statements are now replicated properly for older PHP versions - - The PSR2 standard no longer produces 2 error messages when the AS keyword in a foreach loop is not lowercase - - Specifying a path to a non-existent dir when using the --report-[reportType]=/path/to/report CLI option no longer throws an exception - -- This now prints a readable error message, as it does when using --report-file - - The File::getMethodParamaters() method now includes a type_hint_token array index in the return value - -- Provides the position in the token stack of the first token in the type hint - - The File::getMethodProperties() method now includes a return_type_token array index in the return value - -- Provides the position in the token stack of the first token in the return type - - The File::getTokensAsString() method can now optionally return original (non tab-replaced) content - -- Thanks to Juliette Reinders Folmer for the patch - - Removed Squiz.PHP.DisallowObEndFlush from the Squiz standard - -- If you use this sniff and want to continue banning ob_end_flush(), use Generic.PHP.ForbiddenFunctions instead - -- You will need to set the forbiddenFunctions property in your ruleset.xml file - - Removed Squiz.PHP.ForbiddenFunctions from the Squiz standard - -- Replaced by using the forbiddenFunctions property of Generic.PHP.ForbiddenFunctions in the Squiz ruleset.xml - -- Functionality of the Squiz standard remains the same, but the error codes are now different - -- Previously, Squiz.PHP.ForbiddenFunctions.Found and Squiz.PHP.ForbiddenFunctions.FoundWithAlternative - -- Now, Generic.PHP.ForbiddenFunctions.Found and Generic.PHP.ForbiddenFunctions.FoundWithAlternative - - Added new Generic.PHP.LowerCaseType sniff - -- Ensures PHP types used for type hints, return types, and type casting are lowercase - -- Thanks to Juliette Reinders Folmer for the contribution - - Added new Generic.WhiteSpace.ArbitraryParenthesesSpacing sniff - -- Generates an error for whitespace inside parenthesis that don't belong to a function call/declaration or control structure - -- Generates a warning for any empty parenthesis found - -- Allows the required spacing to be set using the spacing sniff property (default is 0) - -- Allows newlines to be used by setting the ignoreNewlines sniff property (default is false) - -- Thanks to Juliette Reinders Folmer for the contribution - - Added new PSR12.Classes.ClassInstantiation sniff - -- Ensures parenthesis are used when instantiating a new class - - Added new PSR12.Keywords.ShortFormTypeKeywords sniff - -- Ensures the short form of PHP types is used when type casting - - Added new PSR12.Namespaces.CompundNamespaceDepth sniff - -- Ensures compound namespace use statements have a max depth of 2 levels - -- The max depth can be changed by setting the 'maxDepth' sniff property in a ruleset.xml file - - Added new PSR12.Operators.OperatorSpacing sniff - -- Ensures operators are preceded and followed by at least 1 space - - Improved core support for grouped property declarations - -- Also improves support in Squiz.WhiteSpace.ScopeKeywordSpacing and Squiz.WhiteSpace.MemberVarSpacing - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Commenting.DocComment now produces a NonParamGroup error when tags are mixed in with the @param tag group - -- It would previously throw either a NonParamGroup or ParamGroup error depending on the order of tags - -- This change allows the NonParamGroup error to be suppressed in a ruleset to allow the @param group to contain other tags - -- Thanks to Phil Davis for the patch - - Generic.Commenting.DocComment now continues checks param tags even if the doc comment short description is missing - -- This change allows the MissingShort error to be suppressed in a ruleset without all other errors being suppressed as well - -- Thanks to Phil Davis for the patch - - Generic.CodeAnalysis.AssignmentInCondition now reports a different error code for assignments found in WHILE conditions - -- The return value of a function call is often assigned in a WHILE condition, so this change makes it easier to exclude these cases - -- The new code for this error message is Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition - -- The error code for all other cases remains as Generic.CodeAnalysis.AssignmentInCondition.Found - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Functions.OpeningFunctionBraceBsdAllman now longer leaves trailing whitespace when moving the opening brace during fixing - -- Also applies to fixes made by PEAR.Functions.FunctionDeclaration and Squiz.Functions.MultiLineFunctionDeclaration - - Generic.WhiteSpace.ScopeIndent now does a better job of fixing the indent of multi-line comments - - Generic.WhiteSpace.ScopeIndent now does a better job of fixing the indent of PHP open and close tags - - PEAR.Commenting.FunctionComment now report a different error code for param comment lines with too much padding - -- Previously, any lines of a param comment that don't start at the exact comment position got the same error code - -- Now, only comment lines with too little padding use ParamCommentAlignment as they are clearly mistakes - -- Comment lines with too much padding may be using precision alignment as now use ParamCommentAlignmentExceeded - -- This allows for excessive padding to be excluded from a ruleset while continuing to enforce a minimum padding - - PEAR.WhiteSpace.ObjectOperatorIndent now checks the indent of more chained operators - -- Previously, it only checked chains beginning with a variable - -- Now, it checks chains beginning with function calls, static class names, etc - - Squiz.Arrays.ArrayDeclaration now continues checking array formatting even if the key indent is not correct - -- Allows for using different array indent rules while still checking/fixing double arrow and value alignment - - Squiz.Commenting.BlockComment has improved support for tab-indented comments - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.BlockComment auto fixing no longer breaks when two block comments follow each other - -- Also stopped single-line block comments from being auto fixed when they are embedded in other code - -- Also fixed as issue found when PHPCS annotations were used inside a block comment - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.BlockComment.LastLineIndent is now able to be fixed with phpcbf - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.BlockComment now aligns star-prefixed lines under the opening tag while fixing, instead of indenting them - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.FunctionComment.IncorrectTypeHint message no longer contains cut-off suggested type hints - - Squiz.Commenting.InlineComment now uses a new error code for inline comments at the end of a function - -- Previously, all inline comments followed by a blank line threw a Squiz.Commenting.InlineComment.SpacingAfter error - -- Now, inline comments at the end of a function will instead throw Squiz.Commenting.InlineComment.SpacingAfterAtFunctionEnd - -- If you previously excluded SpacingAfter, add an exclusion for SpacingAfterAtFunctionEnd to your ruleset as well - -- If you previously only included SpacingAfter, consider including SpacingAfterAtFunctionEnd as well - -- The Squiz standard now excludes SpacingAfterAtFunctionEnd as the blank line is checked elsewhere - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.ControlStructures.ControlSignature now errors when a comment follows the closing brace of an earlier body - -- Applies to catch, finally, else, elseif, and do/while structures - -- The included PSR2 standard now enforces this rule - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Formatting.OperatorBracket.MissingBrackets message has been changed to remove the word "arithmetic" - -- The sniff checks more than just arithmetic operators, so the message is now clearer - - Sniffs.Operators.ComparisonOperatorUsage now detects more cases of implicit true comparisons - -- It could previously be confused by comparisons used as function arguments - - Squiz.PHP.CommentedOutCode now ignores simple @-style annotation comments so they are not flagged as commented out code - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.PHP.CommentedOutCode now ignores a greater number of short comments so they are not flagged as commented out code - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.PHP.DisallowComparisonAssignment no longer errors when using the null coalescing operator - -- Given this operator is used almost exclusively to assign values, it didn't make sense to generate an error - - Squiz.WhiteSpacing.FunctionSpacing now has a property to specify how many blank lines should be before the first class method - -- Only applies when a method is the first code block in a class (i.e., there are no member vars before it) - -- Override the 'spacingBeforeFirst' property in a ruleset.xml file to change - -- If not set, the sniff will use whatever value is set for the existing 'spacing' property - - Squiz.WhiteSpacing.FunctionSpacing now has a property to specify how many blank lines should be after the last class method - -- Only applies when a method is the last code block in a class (i.e., there are no member vars after it) - -- Override the 'spacingAfterLast' property in a ruleset.xml file to change - -- If not set, the sniff will use whatever value is set for the existing 'spacing' property - - Fixed bug #1863 : File::findEndOfStatement() not working when passed a scope opener - - Fixed bug #1876 : PSR2.Namespaces.UseDeclaration not giving error for use statements before the namespace declaration - -- Adds a new PSR2.Namespaces.UseDeclaration.UseBeforeNamespace error message - - Fixed bug #1881 : Generic.Arrays.ArrayIndent is indenting sub-arrays incorrectly when comma not used after the last value - - Fixed bug #1882 : Conditional with missing braces confused by indirect variables - - Fixed bug #1915 : JS tokenizer fails to tokenize regular expression proceeded by boolean not operator - - Fixed bug #1920 : Directory exclude pattern improperly excludes files with names that start the same - -- Thanks to Jeff Puckett for the patch - - Fixed bug #1922 : Equal sign alignment check broken when list syntax used before assignment operator - - Fixed bug #1925 : Generic.Formatting.MultipleStatementAlignment skipping assignments within closures - - Fixed bug #1931 : Generic opening brace placement sniffs do not correctly support function return types - - Fixed bug #1932 : Generic.ControlStructures.InlineControlStructure fixer moves new PHPCS annotations - - Fixed bug #1938 : Generic opening brace placement sniffs incorrectly move PHPCS annotations - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1939 : phpcs:set annotations do not cause the line they are on to be ignored - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1949 : Squiz.PHP.DisallowMultipleAssignments false positive when using namespaces with static assignments - - Fixed bug #1959 : SquizMultiLineFunctionDeclaration error when param has trailing comment - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1963 : Squiz.Scope.MemberVarScope does not work for multiline member declaration - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1971 : Short array list syntax not correctly tokenized if short array is the first content in a file - - Fixed bug #1979 : Tokenizer does not change heredoc to nowdoc token if the start tag contains spaces - - Fixed bug #1982 : Squiz.Arrays.ArrayDeclaration fixer sometimes puts a comma in front of the last array value - - Fixed bug #1993 : PSR1/PSR2 not reporting or fixing short open tags - - Fixed bug #1996 : Custom report paths don't work on case-sensitive filesystems - - Fixed bug #2006 : Squiz.Functions.FunctionDeclarationArgumentSpacing fixer removes comment between parens when no args - -- The SpacingAfterOpenHint error message has been removed - --- It is replaced by the the existing SpacingAfterOpen message - -- The error message format for the SpacingAfterOpen and SpacingBeforeClose messages has been changed - --- These used to contain 3 pieces of data, but now only contain 2 - -- If you have customised the error messages of this sniff, please review your ruleset after upgrading - - Fixed bug #2018 : Generic.Formatting.MultipleStatementAlignment does see PHP close tag as end of statement block - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #2027 : PEAR.NamingConventions.ValidFunctionName error when function name includes double underscore - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.2.3 - 3.2.3 - - - stable - stable - - 2018-02-21 - BSD License - - - The new phpcs: comment syntax can now be prefixed with an at symbol ( @phpcs: ) - -- This restores the behaviour of the previous syntax where these comments are ignored by doc generators - - The current PHP version ID is now used to generate cache files - -- This ensures that only cache files generated by the current PHP version are selected - -- This change fixes caching issues when using sniffs that produce errors based on the current PHP version - - A new Tokens::$phpcsCommentTokens array is now available for sniff developers to detect phpcs: comment syntax - -- Thanks to Juliette Reinders Folmer for the patch - - The PEAR.Commenting.FunctionComment.Missing error message now includes the name of the function - -- Thanks to Yorman Arias for the patch - - The PEAR.Commenting.ClassComment.Missing and Squiz.Commenting.ClassComment.Missing error messages now include the name of the class - -- Thanks to Yorman Arias for the patch - - PEAR.Functions.FunctionCallSignature now only forces alignment at a specific tab stop while fixing - -- It was enforcing this during checking, but this meant invalid errors if the OpeningIndent message was being muted - -- This fixes incorrect errors when using the PSR2 standard with some code blocks - - Generic.Files.LineLength now ignores lines that only contain phpcs: annotation comments - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Formatting.MultipleStatementAlignment now skips over arrays containing comments - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.PHP.Syntax now forces display_errors to ON when linting - -- Thanks to Raúl Arellano for the patch - - PSR2.Namespaces.UseDeclaration has improved syntax error handling and closure detection - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.PHP.CommentedOutCode now has improved comment block detection for improved accuracy - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.PHP.NonExecutableCode could fatal error while fixing file with syntax error - - Squiz.PHP.NonExecutableCode now detects unreachable code after a goto statement - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.LanguageConstructSpacing has improved syntax error handling while fixing - -- Thanks to Juliette Reinders Folmer for the patch - - Improved phpcs: annotation syntax handling for a number of sniffs - -- Thanks to Juliette Reinders Folmer for the patch - - Improved auto-fixing of files with incomplete comment blocks for various commenting sniffs - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed test suite compatibility with PHPUnit 7 - - Fixed bug #1793 : PSR2 forcing exact indent for function call opening statements - - Fixed bug #1803 : Squiz.WhiteSpace.ScopeKeywordSpacing removes member var name while fixing if no space after scope keyword - - Fixed bug #1817 : Blank line not enforced after control structure if comment on same line as closing brace - - Fixed bug #1827 : A phpcs:enable comment is not tokenized correctly if it is outside a phpcs:disable block - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1828 : Squiz.WhiteSpace.SuperfluousWhiteSpace ignoreBlankLines property ignores whitespace after single line comments - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1840 : When a comment has too many asterisks, phpcbf gives FAILED TO FIX error - - Fixed bug #1867 : Cant use phpcs:ignore where the next line is HTML - - Fixed bug #1870 : Invalid warning in multiple assignments alignment with closure or anon class - - Fixed bug #1890 : Incorrect Squiz.WhiteSpace.ControlStructureSpacing.NoLineAfterClose error between catch and finally statements - - Fixed bug #1891 : Comment on last USE statement causes false positive for PSR2.Namespaces.UseDeclaration.SpaceAfterLastUse - -- Thanks to Matt Coleman, Daniel Hensby, and Juliette Reinders Folmer for the patch - - Fixed bug #1901 : Fixed PHPCS annotations in multi-line tab-indented comments + not ignoring whole line for phpcs:set - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.2.2 - 3.2.2 - - - stable - stable - - 2017-12-20 - BSD License - - - Disabled STDIN detection on Windows - -- This fixes a problem with IDE plugins (e.g., PHPStorm) hanging on Windows - - - - - 3.2.1 - 3.2.1 - - - stable - stable - - 2017-12-18 - BSD License - - - Fixed problems with some scripts and plugins waiting for STDIN - -- This was a notable problem with IDE plugins (e.g., PHPStorm) and build systems - - Empty diffs are no longer followed by a newline character (request #1781) - - Generic.Functions.OpeningFunctionBraceKernighanRitchie no longer complains when the open brace is followed by a close tag - -- This makes the sniff more useful when used in templates - -- Thanks to Joseph Zidell for the patch - - Fixed bug #1782 : Incorrect detection of operator in ternary + anonymous function - - - - - 3.2.0 - 3.2.0 - - - stable - stable - - 2017-12-13 - BSD License - - - This release deprecates the @codingStandards comment syntax used for sending commands to PHP_CodeSniffer - -- The existing syntax will continue to work in all version 3 releases, but will be removed in version 4 - -- The comment formats have been replaced by a shorter syntax: - --- @codingStandardsIgnoreFile becomes phpcs:ignoreFile - --- @codingStandardsIgnoreStart becomes phpcs:disable - --- @codingStandardsIgnoreEnd becomes phpcs:enable - --- @codingStandardsIgnoreLine becomes phpcs:ignore - --- @codingStandardsChangeSetting becomes phpcs:set - -- The new syntax allows for additional developer comments to be added after a -- separator - --- This is useful for describing why a code block is being ignored, or why a setting is being changed - --- E.g., phpcs:disable -- This code block must be left as-is. - -- Comments using the new syntax are assigned new comment token types to allow them to be detected: - --- phpcs:ignoreFile has the token T_PHPCS_IGNORE_FILE - --- phpcs:disable has the token T_PHPCS_DISABLE - --- phpcs:enable has the token T_PHPCS_ENABLE - --- phpcs:ignore has the token T_PHPCS_IGNORE - --- phpcs:set has the token T_PHPCS_SET - - - The phpcs:disable and phpcs:ignore comments can now selectively ignore specific sniffs (request #604) - -- E.g., phpcs:disable Generic.Commenting.Todo.Found for a specific message - -- E.g., phpcs:disable Generic.Commenting.Todo for a whole sniff - -- E.g., phpcs:disable Generic.Commenting for a whole category of sniffs - -- E.g., phpcs:disable Generic for a whole standard - -- Multiple sniff codes can be specified by comma separating them - --- E.g., phpcs:disable Generic.Commenting.Todo,PSR1.Files - - @codingStandardsIgnoreLine comments now only ignore the following line if they are on a line by themselves - -- If they are at the end of an existing line, they will only ignore the line they are on - -- Stops some lines from accidentally being ignored - -- Same rule applies for the new phpcs:ignore comment syntax - - PSR1.Files.SideEffects now respects the new phpcs:disable comment syntax - -- The sniff will no longer check any code that is between phpcs:disable and phpcs:enable comments - -- The sniff does not support phpcs:ignore; you must wrap code structures with disable/enable comments - -- Previously, there was no way to have this sniff ignore parts of a file - - Fixed a problem where PHPCS would sometimes hang waiting for STDIN, or read incomplete versions of large files - -- Thanks to Arne Jørgensen for the patch - - Array properties specified in ruleset files now have their keys and values trimmed - -- This saves having to do this in individual sniffs and stops errors introduced by whitespace in rulesets - -- Thanks to Juliette Reinders Folmer for the patch - - Added phpcs.xsd to allow validation of ruleset XML files - -- Thanks to Renaat De Muynck for the contribution - - File paths specified using --stdin-path can now point to fake file locations (request #1488) - -- Previously, STDIN files using fake file paths were excluded from checking - - Setting an empty basepath (--basepath=) on the CLI will now clear a basepath set directly in a ruleset - -- Thanks to Xaver Loppenstedt for the patch - - Ignore patterns are now checked on symlink target paths instead of symlink source paths - -- Restores previous behaviour of this feature - - Metrics were being double counted when multiple sniffs were recording the same metric - - Added support for bash process substitution - -- Thanks to Scott Dutton for the contribution - - Files included in the cache file code hash are now sorted to aid in cache file reuse across servers - - Windows BAT files can now be used outside a PEAR install - -- You must have the path to PHP set in your PATH environment variable - -- Thanks to Joris Debonnet for the patch - - The JS unsigned right shift assignment operator is now properly classified as an assignment operator - -- Thanks to Juliette Reinders Folmer for the patch - - The AbstractVariableSniff abstract sniff now supports anonymous classes and nested functions - -- Also fixes an issue with Squiz.Scope.MemberVarScope where member vars of anonymous classes were not being checked - - Added AbstractArraySniff to make it easier to create sniffs that check array formatting - -- Allows for checking of single and multi line arrays easily - -- Provides a parsed structure of the array including positions of keys, values, and double arrows - - Added Generic.Arrays.ArrayIndent to enforce a single tab stop indent for array keys in multi-line arrays - -- Also ensures the close brace is on a new line and indented to the same level as the original statement - -- Allows for the indent size to be set using an "indent" property of the sniff - - Added Generic.PHP.DiscourageGoto to warn about the use of the GOTO language construct - -- Thanks to Juliette Reinders Folmer for the contribution - - Generic.Debug.ClosureLinter was not running the gjslint command - -- Thanks to Michał Bundyra for the patch - - Generic.WhiteSpace.DisallowSpaceIndent now fixes space indents in multi-line block comments - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.WhiteSpace.DisallowSpaceIndent now fixes mixed space/tab indents more accurately - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.WhiteSpace.DisallowTabIndent now fixes tab indents in multi-line block comments - -- Thanks to Juliette Reinders Folmer for the patch - - PEAR.Functions.FunctionDeclaration no longer errors when a function declaration is the first content in a JS file - -- Thanks to Juliette Reinders Folmer for the patch - - PEAR.Functions.FunctionCallSignature now requires the function name to be indented to an exact tab stop - -- If the function name is not the start of the statement, the opening statement must be indented correctly instead - -- Added a new fixable error code PEAR.Functions.FunctionCallSignature.OpeningIndent for this error - - Squiz.Functions.FunctionDeclarationArgumentSpacing is no longer confused about comments in function declarations - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.PHP.NonExecutableCode error messages now indicate which line the code block ending is on - -- Makes it easier to identify where the code block exited or returned - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.FunctionComment now supports nullable type hints - - Squiz.Commenting.FunctionCommentThrowTag no longer assigns throw tags inside anon classes to the enclosing function - - Squiz.WhiteSpace.SemicolonSpacing now ignores semicolons used for empty statements inside FOR conditions - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.ControlStructures.ControlSignature now allows configuring the number of spaces before the colon in alternative syntax - -- Override the 'requiredSpacesBeforeColon' setting in a ruleset.xml file to change - -- Default remains at 1 - -- Thanks to Nikola Kovacs for the patch - - The Squiz standard now ensures array keys are indented 4 spaces from the main statement - -- Previously, this standard aligned keys 1 space from the start of the array keyword - - The Squiz standard now ensures array end braces are aligned with the main statement - -- Previously, this standard aligned the close brace with the start of the array keyword - - The standard for PHP_CodeSniffer itself now enforces short array syntax - - The standard for PHP_CodeSniffer itself now uses the Generic.Arrays/ArrayIndent sniff rules - - Improved fixer conflicts and syntax error handling for a number of sniffs - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1462 : Error processing cyrillic strings in Tokenizer - - Fixed bug #1573 : Squiz.WhiteSpace.LanguageConstructSpacing does not properly check for tabs and newlines - -- Thanks to Michał Bundyra for the patch - - Fixed bug #1590 : InlineControlStructure CBF issue while adding braces to an if thats returning a nested function - - Fixed bug #1718 : Unclosed strings at EOF sometimes tokenized as T_WHITESPACE by the JS tokenizer - - Fixed bug #1731 : Directory exclusions do not work as expected when a single file name is passed to phpcs - - Fixed bug #1737 : Squiz.CSS.EmptyStyleDefinition sees comment as style definition and fails to report error - - Fixed bug #1746 : Very large reports can sometimes become garbled when using the parallel option - - Fixed bug #1747 : Squiz.Scope.StaticThisUsage incorrectly looking inside closures - - Fixed bug #1757 : Unknown type hint "object" in Squiz.Commenting.FunctionComment - - Fixed bug #1758 : PHPCS gets stuck creating file list when processing circular symlinks - - Fixed bug #1761 : Generic.WhiteSpace.ScopeIndent error on multi-line function call with static closure argument - - Fixed bug #1762 : Generic.WhiteSpace.Disallow[Space/Tab]Indent not inspecting content before open tag - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1769 : Custom "define" function triggers a warning about declaring new symbols - - Fixed bug #1776 : Squiz.Scope.StaticThisUsage incorrectly looking inside anon classes - - Fixed bug #1777 : Generic.WhiteSpace.ScopeIndent incorrect indent errors when self called function proceeded by comment - - - - - 3.1.1 - 3.1.1 - - - stable - stable - - 2017-10-17 - BSD License - - - Restored preference of non-dist files over dist files for phpcs.xml and phpcs.xml.dist - -- The order that the files are searched is now: .phpcs.xml, phpcs.xml, .phpcs.xml.dist, phpcs.xml.dist - -- Thanks to Juliette Reinders Folmer for the patch - - Progress output now correctly shows skipped files - - Progress output now shows 100% when the file list has finished processing (request #1697) - - Stopped some IDEs complaining about testing class aliases - -- Thanks to Vytautas Stankus for the patch - - Squiz.Commenting.InlineComment incorrectly identified comment blocks in some cases, muting some errors - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1512 : PEAR.Functions.FunctionCallSignature enforces spaces when no arguments if required spaces is not 0 - - Fixed bug #1522 : Squiz Arrays.ArrayDeclaration and Strings.ConcatenationSpacing fixers causing parse errors with here/ nowdocs - - Fixed bug #1570 : Squiz.Arrays.ArrayDeclaration fixer removes comments between array keyword and open parentheses - - Fixed bug #1604 : File::isReference has problems with some bitwise operators and class property references - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1645 : Squiz.Commenting.InlineComment will fail to fix comments at the end of the file - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1656 : Using the --sniffs argument has a problem with case sensitivity - - Fixed bug #1657 : Uninitialized string offset: 0 when sniffing CSS - - Fixed bug #1669 : Temporary expression proceeded by curly brace is detected as function call - - Fixed bug #1681 : Huge arrays are super slow to scan with Squiz.Arrays.ArrayDeclaration sniff - - Fixed bug #1694 : Squiz.Arrays.ArrayBracketSpacing is removing some comments during fixing - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1702 : Generic.WhiteSpaceDisallowSpaceIndent fixer bug when line only contains superfluous whitespace - - - - - 3.1.0 - 3.1.0 - - - stable - stable - - 2017-09-20 - BSD License - - - This release includes a change to support newer versions of PHPUnit (versions 4, 5, and 6 are now supported) - -- The custom PHP_CodeSniffer test runner now requires a bootstrap file - -- Developers with custom standards using the PHP_CodeSniffer test runner will need to do one of the following: - --- run your unit tests from the PHP_CodeSniffer root dir so the bootstrap file is included - --- specify the PHP_CodeSniffer bootstrap file on the command line: phpunit --bootstrap=/path/to/phpcs/tests/bootstrap.php - --- require the PHP_CodeSniffer bootstrap file from your own bootstrap file - -- If you don't run PHP_CodeSniffer unit tests, this change will not affect you - -- Thanks to Juliette Reinders Folmer for the patch - - - A phpcs.xml or phpcs.xml.dist file now takes precedence over the default_standard config setting - -- Thanks to Björn Fischer for the patch - - Both phpcs.xml and phpcs.xml.dist files can now be prefixed with a dot (request #1566) - -- The order that the files are searched is: .phpcs.xml, .phpcs.xml.dist, phpcs.xml, phpcs.xml.dist - - The autoloader will now search for files during unit tests runs from the same locations as during normal phpcs runs - -- Allows for easier unit testing of custom standards that use helper classes or custom namespaces - - Include patterns for sniffs now use OR logic instead of AND logic - -- Previously, a file had to be in each of the include patterns to be processed by a sniff - -- Now, a file has to only be in at least one of the patterns - -- This change reflects the original intention of the feature - - PHPCS will now follow symlinks under the list of checked directories - -- This previously only worked if you specified the path to a symlink on the command line - - Output from --config-show, --config-set, and --config-delete now includes the path to the loaded config file - - PHPCS now cleanly exits if its config file is not readable - -- Previously, a combination of PHP notices and PHPCS errors would be generated - - Comment tokens that start with /** are now always tokenized as docblocks - -- Thanks to Michał Bundyra for the patch - - The PHP-supplied T_YIELD and T_YIELD_FROM token have been replicated for older PHP versions - -- Thanks to Michał Bundyra for the patch - - Added new Generic.CodeAnalysis.AssignmentInCondition sniff to warn about variable assignments inside conditions - -- Thanks to Juliette Reinders Folmer for the contribution - - Added Generic.Files.OneObjectStructurePerFile sniff to ensure there is a single class/interface/trait per file - -- Thanks to Mponos George for the contribution - - Function call sniffs now check variable function names and self/static object creation - -- Specific sniffs are Generic.Functions.FunctionCallArgumentSpacing, PEAR.Functions.FunctionCallSignature, and PSR2.Methods.FunctionCallSignature - -- Thanks to Michał Bundyra for the patch - - Generic.Files.LineLength can now be configured to ignore all comment lines, no matter their length - -- Set the ignoreComments property to TRUE (default is FALSE) in your ruleset.xml file to enable this - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.PHP.LowerCaseKeyword now checks self, parent, yield, yield from, and closure (function) keywords - -- Thanks to Michał Bundyra for the patch - - PEAR.Functions.FunctionDeclaration now removes a blank line if it creates one by moving the curly brace during fixing - - Squiz.Commenting.FunctionCommentThrowTag now supports PHP 7.1 multi catch exceptions - - Squiz.Formatting.OperatorBracket no longer throws errors for PHP 7.1 multi catch exceptions - - Squiz.Commenting.LongConditionClosingComment now supports finally statements - - Squiz.Formatting.OperatorBracket now correctly fixes pipe separated flags - - Squiz.Formatting.OperatorBracket now correctly fixes statements containing short array syntax - - Squiz.PHP.EmbeddedPhp now properly fixes cases where the only content in an embedded PHP block is a comment - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.ControlStructureSpacing now ignores comments when checking blank lines at the top of control structures - - Squiz.WhiteSpace.ObjectOperatorSpacing now detects and fixes spaces around double colons - -- Thanks to Julius Šmatavičius for the patch - - Squiz.WhiteSpace.MemberVarSpacing can now be configured to check any number of blank lines between member vars - -- Set the spacing property (default is 1) in your ruleset.xml file to set the spacing - - Squiz.WhiteSpace.MemberVarSpacing can now be configured to check a different number of blank lines before the first member var - -- Set the spacingBeforeFirst property (default is 1) in your ruleset.xml file to set the spacing - - Added a new PHP_CodeSniffer\Util\Tokens::$ooScopeTokens static member var for quickly checking object scope - -- Includes T_CLASS, T_ANON_CLASS, T_INTERFACE, and T_TRAIT - -- Thanks to Juliette Reinders Folmer for the patch - - PHP_CodeSniffer\Files\File::findExtendedClassName() now supports extended interfaces - -- Thanks to Martin Hujer for the patch - - Fixed bug #1550 : Squiz.Commenting.FunctionComment false positive when function contains closure - - Fixed bug #1577 : Generic.InlineControlStructureSniff breaks with a comment between body and condition in do while loops - - Fixed bug #1581 : Sniffs not loaded when one-standard directories are being registered in installed_paths - - Fixed bug #1591 : Autoloader failing to load arbitrary files when installed_paths only set via a custom ruleset - - Fixed bug #1605 : Squiz.WhiteSpace.OperatorSpacing false positive on unary minus after comment - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1615 : Uncaught RuntimeException when phpcbf fails to fix files - - Fixed bug #1637 : Generic.WhiteSpaceScopeIndent closure argument indenting incorrect with multi-line strings - - Fixed bug #1638 : Squiz.WhiteSpace.ScopeClosingBrace closure argument indenting incorrect with multi-line strings - - Fixed bug #1640 : Squiz.Strings.DoubleQuoteUsage replaces tabs with spaces when fixing - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.0.2 - 3.0.2 - - - stable - stable - - 2017-07-18 - BSD License - - - Fixed a problem where the source report was not printing the correct number of errors found - - Fixed a problem where the --cache=/path/to/cachefile CLI argument was not working - - The code report now gracefully handles tokenizer exceptions - - The phpcs and phpcbf scripts and now the only places that exit() in the code - -- This allows for easier usage of core PHPCS functions from external scripts - -- If you are calling Runner::runPHPCS() or Runner::runPHPCBF() directly, you will get back the full range of exit codes - -- If not, catch the new DeepExitException to get the error message ($e->getMessage()) and exit code ($e->getCode()); - - NOWDOC tokens are now considered conditions, just as HEREDOC tokens are - -- This makes it easier to find the start and end of a NOWDOC from any token within it - -- Thanks to Michał Bundyra for the patch - - Custom autoloaders are now only included once in case multiple standards are using the same one - -- Thanks to Juliette Reinders Folmer for the patch - - Improved tokenizing of fallthrough CASE and DEFAULT statements that share a closing statement and use curly braces - - Improved the error message when Squiz.ControlStructures.ControlSignature detects a newline after the closing parenthesis - - Fixed bug #1465 : Generic.WhiteSpace.ScopeIndent reports incorrect errors when indenting double arrows in short arrays - - Fixed bug #1478 : Indentation in fallthrough CASE that contains a closure - - Fixed bug #1497 : Fatal error if composer prepend-autoloader is set to false - -- Thanks to Kunal Mehta for the patch - - Fixed bug #1503 : Alternative control structure syntax not always recognized as scoped - - Fixed bug #1523 : Fatal error when using the --suffix argument - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1526 : Use of basepath setting can stop PHPCBF being able to write fixed files - - Fixed bug #1530 : Generic.WhiteSpace.ScopeIndent can increase indent too much for lines within code blocks - - Fixed bug #1547 : Wrong token type for backslash in use function - -- Thanks to Michał Bundyra for the patch - - Fixed bug #1549 : Squiz.PHP.EmbeddedPhp fixer conflict with // comment before PHP close tag - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1560 : Squiz.Commenting.FunctionComment fatal error when fixing additional param comment lines that have no indent - - - - - 3.0.1 - 3.0.1 - - - stable - stable - - 2017-06-14 - BSD License - - - This release contains a fix for a security advisory related to the improper handling of a shell command - -- A properly crafted filename would allow for arbitrary code execution when using the --filter=gitmodified command line option - -- All version 3 users are encouraged to upgrade to this version, especially if you are checking 3rd-party code - --- e.g., you run PHPCS over libraries that you did not write - --- e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories - --- e.g., you allow external tool paths to be set by user-defined values - -- If you are unable to upgrade but you check 3rd-party code, ensure you are not using the Git modified filter - -- This advisory does not affect PHP_CodeSniffer version 2. - -- Thanks to Sergei Morozov for the report and patch - - - Arguments on the command line now override or merge with those specified in a ruleset.xml file in all cases - - PHPCS now stops looking for a phpcs.xml file as soon as one is found, favoring the closest one to the current dir - - Added missing help text for the --stdin-path CLI option to --help - - Re-added missing help text for the --file-list and --bootstrap CLI options to --help - - Runner::runPHPCS() and Runner::runPHPCBF() now return an exit code instead of exiting directly (request #1484) - - The Squiz standard now enforces short array syntax by default - - The autoloader is now working correctly with classes created with class_alias() - - The autoloader will now search for files inside all directories in the installed_paths config var - -- This allows autoloading of files inside included custom coding standards without manually requiring them - - You can now specify a namespace for a custom coding standard, used by the autoloader to load non-sniff helper files - -- Also used by the autoloader to help other standards directly include sniffs for your standard - -- Set the value to the namespace prefix you are using for sniff files (everything up to \Sniffs\) - -- e.g., if your namespace format is MyProject\CS\Standard\Sniffs\Category set the namespace to MyProject\CS\Standard - -- If omitted, the namespace is assumed to be the same as the directory name containing the ruleset.xml file - -- The namespace is set in the ruleset tag of the ruleset.xml file - -- e.g., ruleset name="My Coding Standard" namespace="MyProject\CS\Standard" - - Rulesets can now specify custom autoloaders using the new autoload tag - -- Autoloaders are included while the ruleset is being processed and before any custom sniffs are included - -- Allows for very custom autoloading of helper classes well before the boostrap files are included - - The PEAR standard now includes Squiz.Commenting.DocCommentAlignment - -- It previously broke comments onto multiple lines, but didn't align them - - Fixed a problem where excluding a message from a custom standard's own sniff would exclude the whole sniff - -- This caused some PSR2 errors to be under-reported - - Fixed bug #1442 : T_NULLABLE detection not working for nullable parameters and return type hints in some cases - - Fixed bug #1447 : Running the unit tests with a phpunit config file breaks the test suite - -- Unknown arguments were not being handled correctly, but are now stored in $config->unknown - - Fixed bug #1449 : Generic.Classes.OpeningBraceSameLine doesn't detect comment before opening brace - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1450 : Coding standard located under an installed_path with the same directory name throws an error - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1451 : Sniff exclusions/restrictions dont work with custom sniffs unless they use the PHP_CodeSniffer NS - - Fixed bug #1454 : Squiz.WhiteSpace.OperatorSpacing is not checking spacing on either side of a short ternary operator - -- Thanks to Mponos George for the patch - - Fixed bug #1495 : Setting an invalid installed path breaks all commands - - Fixed bug #1496 : Squiz.Strings.DoubleQuoteUsage not unescaping dollar sign when fixing - -- Thanks to Michał Bundyra for the patch - - Fixed bug #1501 : Interactive mode is broken - - Fixed bug #1504 : PSR2.Namespaces.UseDeclaration hangs fixing use statement with no trailing code - - - - - 2.9.1 - 2.9.1 - - - stable - stable - - 2017-05-22 - BSD License - - - Fixed bug #1442 : T_NULLABLE detection not working for nullable parameters and return type hints in some cases - - Fixed bug #1448 : Generic.Classes.OpeningBraceSameLine doesn't detect comment before opening brace - -- Thanks to Juliette Reinders Folmer for the patch - - - - - 3.0.0 - 3.0.0 - - - stable - stable - - 2017-05-04 - BSD License - - - Added an --ignore-annotations command line argument to ignore all @codingStandards annotations in code comments (request #811) - -- This allows you to force errors to be shown that would otherwise be ignored by code comments - -- Also stop files being able to change sniff properties mid way through processing - - An error is now reported if no sniffs were registered to be run (request #1129) - - The autoloader will now search for files inside the directory of any loaded coding standard - -- This allows autoloading of any file inside a custom coding standard without manually requiring them - -- Ensure your namespace begins with your coding standard's directory name and follows PSR-4 - -- e.g., StandardName\Sniffs\CategoryName\AbstractHelper or StandardName\Helpers\StringSniffHelper - - Fixed an error where STDIN was sometimes not checked when using the --parallel CLI option - - The is_closure index has been removed from the return value of File::getMethodProperties() - -- This value was always false because T_FUNCTION tokens are never closures - -- Closures have a token type of T_CLOSURE - - The File::isAnonymousFunction() method has been removed - -- This function always returned false because it only accepted T_FUNCTION tokens, which are never closures - -- Closures have a token type of T_CLOSURE - - Includes all changes from the 2.9.0 release - - Fixed bug #834 : PSR2.ControlStructures.SwitchDeclaration does not handle if branches with returns - -- Thanks to Fabian Wiget for the patch - - - - - 3.0.0RC4 - 3.0.0RC4 - - - beta - beta - - 2017-03-02 - BSD License - - - This release contains a fix for a security advisory related to the improper handling of shell commands - -- Uses of shell_exec() and exec() were not escaping filenames and configuration settings in most cases - -- A properly crafted filename or configuration option would allow for arbitrary code execution when using some features - -- All users are encouraged to upgrade to this version, especially if you are checking 3rd-party code - --- e.g., you run PHPCS over libraries that you did not write - --- e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories - --- e.g., you allow external tool paths to be set by user-defined values - -- If you are unable to upgrade but you check 3rd-party code, ensure you are not using the following features: - --- The diff report - --- The notify-send report - --- The Generic.PHP.Syntax sniff - --- The Generic.Debug.CSSLint sniff - --- The Generic.Debug.ClosureLinter sniff - --- The Generic.Debug.JSHint sniff - --- The Squiz.Debug.JSLint sniff - --- The Squiz.Debug.JavaScriptLint sniff - --- The Zend.Debug.CodeAnalyzer sniff - -- Thanks to Klaus Purer for the report - - - The indent property of PEAR.Classes.ClassDeclaration has been removed - -- Instead of calculating the indent of the brace, it just ensures the brace is aligned with the class keyword - -- Other sniffs can be used to ensure the class itself is indented correctly - - Invalid exclude rules inside a ruleset.xml file are now ignored instead of potentially causing out of memory errors - -- Using the -vv command line argument now also shows the invalid exclude rule as XML - - Includes all changes from the 2.8.1 release - - Fixed bug #1333 : The new autoloader breaks some frameworks with custom autoloaders - - Fixed bug #1334 : Undefined offset when explaining standard with custom sniffs - - - - - 3.0.0RC3 - 3.0.0RC3 - - - beta - beta - - 2017-02-02 - BSD License - - - Added support for ES6 class declarations - -- Previously, these class were tokenized as JS objects but are now tokenized as normal T_CLASS structures - - Added support for ES6 method declarations, where the "function" keyword is not used - -- Previously, these methods were tokenized as JS objects (fixes bug #1251) - -- The name of the ES6 method is now assigned the T_FUNCTION keyword and treated like a normal function - -- Custom sniffs that support JS and listen for T_FUNCTION tokens can't assume the token represents the word "function" - -- Check the contents of the token first, or use $phpcsFile->getDeclarationName($stackPtr) if you just want its name - -- There is no change for custom sniffs that only check PHP code - - PHPCBF exit codes have been changed so they are now more useful (request #1270) - -- Exit code 0 is now used to indicate that no fixable errors were found, and so nothing was fixed - -- Exit code 1 is now used to indicate that all fixable errors were fixed correctly - -- Exit code 2 is now used to indicate that PHPCBF failed to fix some of the fixable errors it found - -- Exit code 3 is now used for general script execution errors - - Added PEAR.Commenting.FileComment.ParamCommentAlignment to check alignment of multi-line param comments - - Includes all changes from the 2.8.0 release - - Fixed an issue where excluding a file using a @codingStandardsIgnoreFile comment would produce errors - -- For PHPCS, it would show empty files being processed - -- For PHPCBF, it would produce a PHP error - - Fixed bug #1233 : Can't set config data inside ruleset.xml file - - Fixed bug #1241 : CodeSniffer.conf not working with 3.x PHAR file - - - - - 3.0.0RC2 - 3.0.0RC2 - - - beta - beta - - 2016-11-30 - BSD License - - - Fixed an undefined var name error that could be produced while running PHPCBF - - Made the Runner class easier to use with wrapper scripts - - Full usage information is no longer printed when a usage error is encountered (request #1186) - -- Makes it a lot easier to find and read the error message that was printed - - Includes all changes from the 2.7.1 release - - Fixed bug #1167 : 3.0.0RC1 PHAR does not work with PEAR standard - - Fixed bug #1208 : Excluding files doesn't work when using STDIN with a filename specified - - - - - 3.0.0RC1 - 3.0.0RC1 - - - beta - beta - - 2016-09-02 - BSD License - - - Progress output now shows E and W in green when a file has fixable errors or warnings - -- Only supported if colors are enabled - - PHPCBF no longer produces verbose output by default (request #699) - -- Use the -v command line argument to show verbose fixing output - -- Use the -q command line argument to disable verbose information if enabled by default - - PHPBF now prints a summary report after fixing files - -- Report shows files that were fixed, how many errors were fixed, and how many remain - - PHPCBF now supports the -p command line argument to print progress information - -- Prints a green F for files where fixes occurred - -- Prints a red E for files that could not be fixed due to an error - -- Use the -q command line argument to disable progress information if enabled by default - - Running unit tests using --verbose no longer throws errors - - Fixed shell error appearing on some systems when trying to find executable paths - - Includes all changes from the 2.7.0 release - - - - - 3.0.0a1 - 3.0.0a1 - - - alpha - alpha - - 2016-07-20 - BSD License - - - Min PHP version increased from 5.1.2 to 5.4.0 - - Added optional caching of results between runs (request #530) - -- Enable the cache by using the --cache command line argument - -- If you want the cache file written somewhere specific, use --cache=/path/to/cacheFile - -- Use the command "phpcs --config-set cache true" to turn caching on by default - -- Use the --no-cache command line argument to disable caching if it is being turned on automatically - - Add support for checking file in parallel (request #421) - -- Tell PHPCS how many files to check at once using the --parallel command line argument - -- To check 100 files at once, using --parallel=100 - -- To disable parallel checking if it is being turned on automatically, use --parallel=1 - -- Requires PHP to be compiled with the PCNTL package - - The default encoding has been changed from iso-8859-1 to utf-8 (request #760) - -- The --encoding command line argument still works, but you no longer have to set it to process files as utf-8 - -- If encoding is being set to utf-8 in a ruleset or on the CLI, it can be safely removed - -- If the iconv PHP extension is not installed, standard non-multibyte aware functions will be used - - Added a new "code" report type to show a code snippet for each error (request #419) - -- The line containing the error is printed, along with 2 lines above and below it to show context - -- The location of the errors is underlined in the code snippet if you also use --colors - -- Use --report=code to generate this report - - Added support for custom filtering of the file list - -- Developers can write their own filter classes to perform custom filtering of the list before the run starts - -- Use the command line arg --filter=/path/to/filter.php to specify a filter to use - -- Extend \PHP_CodeSniffer\Filters\Filter to also support the core PHPCS extension and path filtering - -- Extend \PHP_CodeSniffer\Filters\ExactMatch to get the core filtering and the ability to use blacklists and whitelists - -- The included \PHP_CodeSniffer\Filters\GitModified filter is a good example of an ExactMatch filter - - Added support for only checking files that have been locally modified or added in a git repo - -- Use --filter=gitmodified to check these files - -- You still need to give PHPCS a list of files or directories in which to check - - Added automatic discovery of executable paths (request #571) - -- Thanks to Sergey Morozov for the patch - - You must now pass "-" on the command line to have PHPCS wait for STDIN - -- E.g., phpcs --standard=PSR2 - - -- You can still pipe content via STDIN as normal as PHPCS will see this and process it - -- But without the "-", PHPCS will throw an error if no content or files are passed to it - - All PHP errors generated by sniffs are caught, re-thrown as exceptions, and reported in the standard error reports - -- This should stop bugs inside sniffs causing infinite loops - -- Also stops invalid reports being produced as errors don't print to the screen directly - - Sniff codes are no longer optional - -- If a sniff throws and error or a warning, it must specify an internal code for that message - - The installed_paths config setting can now point directly to a standard - -- Previously, it had to always point to the directory in which the standard lives - - Multiple reports can now be specified using the --report command line argument - -- Report types are separated by commas - -- E.g., --report=full,summary,info - -- Previously, you had to use one argument for each report such as --report=full --report=summary --report=info - - You can now set the severity, message type, and exclude patterns for and entire sniff, category, or standard - -- Previously, this was only available for a single message - - You can now include a single sniff code in a ruleset instead of having to include an entire sniff - -- Including a sniff code will automatically exclude all other messages from that sniff - -- If the sniff is already included by an imported standard, set the sniff severity to 0 and include the specific message you want - - PHPCBF no longer uses patch - -- Files are now always overwritten - -- The --no-patch option has been removed - - Added a --basepath option to strip a directory from the front of file paths in output (request #470) - -- The basepath is absolute or relative to the current directory - -- E.g., to output paths relative to current dir in reports, use --basepath=. - - Ignore rules are now checked when using STDIN (request #733) - - Added an include-pattern tag to rulesets to include a sniff for specific files and folders only (request #656) - -- This is the exact opposite of the exclude-pattern tag - -- This option is only usable within sniffs, not globally like exclude-patterns are - - Added a new -m option to stop error messages from being recorded, which saves a lot of memory - -- PHPCBF always uses this setting to reduce memory as it never outputs error messages - -- Setting the $recordErrors member var inside custom report classes is no longer supported (use -m instead) - - Exit code 2 is now used to indicate fixable errors were found (request #930) - -- Exit code 3 is now used for general script execution errors - -- Exit code 1 is used to indicate that coding standard errors were found, but none are fixable - -- Exit code 0 is unchanged and continues to mean no coding standard errors found - - The included PHPCS standard has been removed - -- All rules are now found inside the phpcs.xml.dist file - -- Running "phpcs" without any arguments from a git clone will use this ruleset - - The included SVN pre-commit hook has been removed - -- Hooks for version control systems will no longer be maintained within the PHPCS project - - - - - 2.9.0 - 2.9.0 - - - stable - stable - - 2017-05-04 - BSD License - - - Added Generic.Debug.ESLint sniff to run ESLint over JS files and report errors - -- Set eslint path using: phpcs --config-set eslint_path /path/to/eslint - -- Thanks to Ryan McCue for the contribution - - T_POW is now properly considered an arithmetic operator, and will be checked as such - -- Thanks to Juliette Reinders Folmer for the patch - - T_SPACESHIP and T_COALESCE are now properly considered comparison operators, and will be checked as such - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.PHP.DisallowShortOpenTag now warns about possible short open tags even when short_open_tag is set to OFF - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.WhiteSpace.DisallowTabIndent now finds and fixes improper use of spaces anywhere inside the line indent - -- Previously, only the first part of the indent was used to determine the indent type - -- Thanks to Juliette Reinders Folmer for the patch - - PEAR.Commenting.ClassComment now supports checking of traits as well as classes and interfaces - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.FunctionCommentThrowTag now supports re-throwing exceptions (request #946) - -- Thanks to Samuel Levy for the patch - - Squiz.PHP.DisallowMultipleAssignments now ignores PHP4-style member var assignments - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.FunctionSpacing now ignores spacing above functions when they are preceded by inline comments - -- Stops conflicts between this sniff and comment spacing sniffs - - Squiz.WhiteSpace.OperatorSpacing no longer checks the equal sign in declare statements - -- Thanks to Juliette Reinders Folmer for the patch - - Added missing error codes for a couple of sniffs so they can now be customised as normal - - Fixed bug #1266 : PEAR.WhiteSpace.ScopeClosingBrace can throw an error while fixing mixed PHP/HTML - - Fixed bug #1364 : Yield From values are not recognised as returned values in Squiz FunctionComment sniff - - Fixed bug #1373 : Error in tab expansion results in white-space of incorrect size - -- Thanks to Mark Clements for the patch - - Fixed bug #1381 : Tokenizer: dereferencing incorrectly identified as short array - - Fixed bug #1387 : Squiz.ControlStructures.ControlSignature does not handle alt syntax when checking space after closing brace - - Fixed bug #1392 : Scope indent calculated incorrectly when using array destructuring - - Fixed bug #1394 : integer type hints appearing as TypeHintMissing instead of ScalarTypeHintMissing - -- PHP 7 type hints were also being shown when run under PHP 5 in some cases - - Fixed bug #1405 : Squiz.WhiteSpace.ScopeClosingBrace fails to fix closing brace within indented PHP tags - - Fixed bug #1421 : Ternaries used in constant scalar expression for param default misidentified by tokenizer - - Fixed bug #1431 : PHPCBF can't fix short open tags when they are not followed by a space - -- Thanks to Gonçalo Queirós for the patch - - Fixed bug #1432 : PHPCBF can make invalid fixes to inline JS control structures that make use of JS objects - - - - - 2.8.1 - 2.8.1 - - - stable - stable - - 2017-03-02 - BSD License - - - This release contains a fix for a security advisory related to the improper handling of shell commands - -- Uses of shell_exec() and exec() were not escaping filenames and configuration settings in most cases - -- A properly crafted filename or configuration option would allow for arbitrary code execution when using some features - -- All users are encouraged to upgrade to this version, especially if you are checking 3rd-party code - --- e.g., you run PHPCS over libraries that you did not write - --- e.g., you provide a web service that runs PHPCS over user-uploaded files or 3rd-party repositories - --- e.g., you allow external tool paths to be set by user-defined values - -- If you are unable to upgrade but you check 3rd-party code, ensure you are not using the following features: - --- The diff report - --- The notify-send report - --- The Generic.PHP.Syntax sniff - --- The Generic.Debug.CSSLint sniff - --- The Generic.Debug.ClosureLinter sniff - --- The Generic.Debug.JSHint sniff - --- The Squiz.Debug.JSLint sniff - --- The Squiz.Debug.JavaScriptLint sniff - --- The Zend.Debug.CodeAnalyzer sniff - -- Thanks to Klaus Purer for the report - - - - The PHP-supplied T_COALESCE_EQUAL token has been replicated for PHP versions before 7.2 - - PEAR.Functions.FunctionDeclaration now reports an error for blank lines found inside a function declaration - - PEAR.Functions.FunctionDeclaration no longer reports indent errors for blank lines in a function declaration - - Squiz.Functions.MultiLineFunctionDeclaration no longer reports errors for blank lines in a function declaration - -- It would previously report that only one argument is allowed per line - - Squiz.Commenting.FunctionComment now corrects multi-line param comment padding more accurately - - Squiz.Commenting.FunctionComment now properly fixes pipe-separated param types - - Squiz.Commenting.FunctionComment now works correctly when function return types also contain a comment - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.ControlStructures.InlineIfDeclaration now supports the elvis operator - -- As this is not a real PHP operator, it enforces no spaces between ? and : when the THEN statement is empty - - Squiz.ControlStructures.InlineIfDeclaration is now able to fix the spacing errors it reports - - Fixed bug #1340 : STDIN file contents not being populated in some cases - -- Thanks to David Biňovec for the patch - - Fixed bug #1344 : PEAR.Functions.FunctionCallSignatureSniff throws error for blank comment lines - - Fixed bug #1347 : PSR2.Methods.FunctionCallSignature strips some comments during fixing - -- Thanks to Algirdas Gurevicius for the patch - - Fixed bug #1349 : Squiz.Strings.DoubleQuoteUsage.NotRequired message is badly formatted when string contains a CR newline char - -- Thanks to Algirdas Gurevicius for the patch - - Fixed bug #1350 : Invalid Squiz.Formatting.OperatorBracket error when using namespaces - - Fixed bug #1369 : Empty line in multi-line function declaration cause infinite loop - - - - - 2.8.0 - 2.8.0 - - - stable - stable - - 2017-02-02 - BSD License - - - The Internal.NoCodeFound error is no longer generated for content sourced from STDIN - -- This should stop some Git hooks generating errors because PHPCS is trying to process the refs passed on STDIN - - Squiz.Commenting.DocCommentAlignment now checks comments on class properties defined using the VAR keyword - -- Thanks to Klaus Purer for the patch - - The getMethodParameters() method now recognises "self" as a valid type hint - -- The return array now contains a new "content" index containing the raw content of the param definition - -- Thanks to Juliette Reinders Folmer for the patch - - The getMethodParameters() method now supports nullable types - -- The return array now contains a new "nullable_type" index set to true or false for each method param - -- Thanks to Juliette Reinders Folmer for the patch - - The getMethodParameters() method now supports closures - -- Thanks to Juliette Reinders Folmer for the patch - - Added more guard code for JS files with syntax errors (request #1271 and request #1272) - - Added more guard code for CSS files with syntax errors (request #1304) - - PEAR.Commenting.FunctionComment fixers now correctly handle multi-line param comments - - AbstractVariableSniff now supports anonymous classes - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.NamingConventions.ConstructorName and PEAR.NamingConventions.ValidVariable now support anonymous classes - - Generic.NamingConventions.CamelCapsFunctionName and PEAR.NamingConventions.ValidFunctionName now support anonymous classes - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.CodeAnalysis.UnusedFunctionParameter and PEAR.Functions.ValidDefaultValue now support closures - -- Thanks to Juliette Reinders Folmer for the patch - - PEAR.NamingConventions.ValidClassName and Squiz.Classes.ValidClassName now support traits - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.Functions.FunctionCallArgumentSpacing now supports closures other PHP-provided functions - -- Thanks to Algirdas Gurevicius for the patch - - Fixed an error where a nullable type character was detected as an inline then token - -- A new T_NULLABLE token has been added to represent the ? nullable type character - -- Thanks to Jaroslav Hanslík for the patch - - Squiz.WhiteSpace.SemicolonSpacing no longer removes comments while fixing the placement of semicolons - -- Thanks to Algirdas Gurevicius for the patch - - Fixed bug #1230 : JS tokeniser incorrectly tokenises bitwise shifts as comparison - -- Thanks to Ryan McCue for the patch - - Fixed bug #1237 : Uninitialized string offset in PHP Tokenizer on PHP 5.2 - - Fixed bug #1239 : Warning when static method name is 'default' - - Fixed bug #1240 : False positive for function names starting with triple underscore - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1245 : SELF is not recognised as T_SELF token in: return new self - - Fixed bug #1246 : A mix of USE statements with and without braces can cause the tokenizer to mismatch brace tokens - -- Thanks to Michał Bundyra for the patch - - Fixed bug #1249 : GitBlame report requires a .git directory - - Fixed bug #1252 : Squiz.Strings.ConcatenationSpacing fix creates syntax error when joining a number to a string - - Fixed bug #1253 : Generic.ControlStructures.InlineControlStructure fix creates syntax error fixing if-try/catch - - Fixed bug #1255 : Inconsistent indentation check results when ELSE on new line - - Fixed bug #1257 : Double dash in CSS class name can lead to "Named colours are forbidden" false positives - - Fixed bug #1260 : Syntax errors not being shown when error_prepend_string is set - -- Thanks to Juliette Reinders Folmer for the patch - - Fixed bug #1264 : Array return type hint is sometimes detected as T_ARRAY_HINT instead of T_RETURN_TYPE - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #1265 : ES6 arrow function raises unexpected operator spacing errors - - Fixed bug #1267 : Fixer incorrectly handles filepaths with repeated dir names - -- Thanks to Sergey Ovchinnikov for the patch - - Fixed bug #1276 : Commenting.FunctionComment.InvalidReturnVoid conditional issue with anonymous classes - - Fixed bug #1277 : Squiz.PHP.DisallowMultipleAssignments.Found error when var assignment is on the same line as an open tag - - Fixed bug #1284 : Squiz.Arrays.ArrayBracketSpacing.SpaceBeforeBracket false positive match for short list syntax - - - - - 2.7.1 - 2.7.1 - - - stable - stable - - 2016-11-30 - BSD License - - - Squiz.ControlStructures.ControlSignature.SpaceAfterCloseParenthesis fix now removes unnecessary whitespace - - Squiz.Formatting.OperatorBracket no longer errors for negative array indexes used within a function call - - Squiz.PHP.EmbeddedPhp no longer expects a semicolon after statements that are only opening a scope - - Fixed a problem where the content of T_DOC_COMMENT_CLOSE_TAG tokens could sometimes be (boolean) false - - Developers of custom standards with custom test runners can now have their standards ignored by the built-in test runner - -- Set the value of an environment variable called PHPCS_IGNORE_TESTS with a comma separated list of your standard names - -- Thanks to Juliette Reinders Folmer for the patch - - The unit test runner now loads the test sniff outside of the standard's ruleset so that exclude rules do not get applied - -- This may have caused problems when testing custom sniffs inside custom standards - -- Also makes the unit tests runs a little faster - - The SVN pre-commit hook now works correctly when installed via composer - -- Thanks to Sergey for the patch - - Fixed bug #1135 : PEAR.ControlStructures.MultiLineCondition.CloseBracketNewLine not detected if preceded by multiline function call - - Fixed bug #1138 : PEAR.ControlStructures.MultiLineCondition.Alignment not detected if closing brace is first token on line - - Fixed bug #1141 : Sniffs that check EOF newlines don't detect newlines properly when the last token is a doc block - - Fixed bug #1150 : Squiz.Strings.EchoedStrings does not properly fix bracketed statements - - Fixed bug #1156 : Generic.Formatting.DisallowMultipleStatements errors when multiple short echo tags are used on the same line - -- Thanks to Nikola Kovacs for the patch - - Fixed bug #1161 : Absolute report path is treated like a relative path if it also exists within the current directory - - Fixed bug #1170 : Javascript regular expression literal not recognized after comparison operator - - Fixed bug #1180 : Class constant named FUNCTION is incorrectly tokenized - - Fixed bug #1181 : Squiz.Operators.IncrementDecrementUsage.NoBrackets false positive when incrementing properties - -- Thanks to Jürgen Henge-Ernst for the patch - - Fixed bug #1188 : Generic.WhiteSpace.ScopeIndent issues with inline HTML and multi-line function signatures - - Fixed bug #1190 : phpcbf on if/else with trailing comment generates erroneous code - - Fixed bug #1191 : Javascript sniffer fails with function called "Function" - - Fixed bug #1203 : Inconsistent behavior of PHP_CodeSniffer_File::findEndOfStatement - - Fixed bug #1218 : CASE conditions using class constants named NAMESPACE/INTERFACE/TRAIT etc are incorrectly tokenized - - Fixed bug #1221 : Indented function call with multiple closure arguments can cause scope indent error - - Fixed bug #1224 : PHPCBF fails to fix code with heredoc/nowdoc as first argument to a function - - - - - 2.7.0 - 2.7.0 - - - stable - stable - - 2016-09-02 - BSD License - - - Added --file-list command line argument to allow a list of files and directories to be specified in an external file - -- Useful is you have a generated list of files to check that would be too long for the command line - -- File and directory paths are listed one per line - -- Usage is: phpcs --file-list=/path/to/file-list ... - -- Thanks to Blotzu for the patch - - Values set using @codingStandardsChangeSetting comments can now contain spaces - - Sniff unit tests can now specify a list of test files instead of letting the runner pick them (request #1078) - -- Useful if a sniff needs to exclude files based on the environment, or is checking filenames - -- Override the new getTestFiles() method to specify your own list of test files - - Generic.Functions.OpeningFunctionBraceKernighanRitchie now ignores spacing for function return types - -- The sniff code Generic.Functions.OpeningFunctionBraceKernighanRitchie.SpaceAfterBracket has been removed - -- Replaced by Generic.Functions.OpeningFunctionBraceKernighanRitchie.SpaceBeforeBrace - -- The new error message is slightly clearer as it indicates that a single space is needed before the brace - - Squiz.Commenting.LongConditionClosingComment now allows for the length of a code block to be configured - -- Set the lineLimit property (default is 20) in your ruleset.xml file to set the code block length - -- When the code block length is reached, the sniff will enforce a closing comment after the closing brace - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.Commenting.LongConditionClosingComment now allows for the end comment format to be configured - -- Set the commentFormat property (default is "//end %s") in your ruleset.xml file to set the format - -- The placeholder %s will be replaced with the type of condition opener, e.g., "//end foreach" - -- Thanks to Juliette Reinders Folmer for the patch - - Generic.PHPForbiddenFunctions now allows forbidden functions to have mixed case - -- Previously, it would only do a strtolower comparison - -- Error message now shows what case was found in the code and what the correct case should be - -- Thanks to Juliette Reinders Folmer for the patch - - Added Generic.Classes.OpeningBraceSameLine to ensure opening brace of class/interface/trait is on the same line as the declaration - -- Thanks to Juliette Reinders Folmer for the patch - - Added Generic.PHP.BacktickOperator to ban the use of the backtick operator for running shell commands - -- Thanks to Juliette Reinders Folmer for the patch - - Added Generic.PHP.DisallowAlternativePHPTags to ban the use of alternate PHP tags - -- Thanks to Juliette Reinders Folmer for the patch - - Squiz.WhiteSpace.LanguageConstructSpacing no longer checks for spaces if parenthesis are being used (request #1062) - -- Makes this sniff more compatible with those that check parenthesis spacing of function calls - - Squiz.WhiteSpace.ObjectOperatorSpacing now has a setting to ignore newline characters around object operators - -- Default remains FALSE, so newlines are not allowed - -- Override the "ignoreNewlines" setting in a ruleset.xml file to change - -- Thanks to Alex Howansky for the patch - - Squiz.Scope.MethodScope now sniffs traits as well as classes and interfaces - -- Thanks to Jesse Donat for the patch - - PHPCBF is now able to fix Squiz.SelfMemberReference.IncorrectCase errors - -- Thanks to Nikola Kovacs for the patch - - PHPCBF is now able to fix Squiz.Commenting.VariableComment.IncorrectVarType - -- Thanks to Walt Sorensen for the patch - - PHPCBF is now able to fix Generic.PHP.DisallowShortOpenTag - -- Thanks to Juliette Reinders Folmer for the patch - - Improved the formatting of the end brace when auto fixing InlineControlStructure errors (request #1121) - - Generic.Functions.OpeningFunctionBraceKernighanRitchie.BraceOnNewLine fix no longer leaves blank line after brace (request #1085) - - Generic UpperCaseConstantNameSniff now allows lowercase namespaces in constant definitions - -- Thanks to Daniel Schniepp for the patch - - Squiz DoubleQuoteUsageSniff is now more tolerant of syntax errors caused by mismatched string tokens - - A few sniffs that produce errors based on the current PHP version can now be told to run using a specific PHP version - -- Set the php_version config var using --config-set, --runtime-set, or in a ruleset to specify a specific PHP version - -- The format of the PHP version is the same as the PHP_VERSION_ID constant (e.g., 50403 for version 5.4.3) - -- Supported sniffs are Generic.PHP.DisallowAlternativePHPTags, PSR1.Classes.ClassDeclaration, Squiz.Commenting.FunctionComment - -- Thanks to Finlay Beaton for the patch - - Fixed bug #985 : Duplicate class definition detection generates false-positives in media queries - -- Thanks to Raphael Horber for the patch - - Fixed bug #1014 : Squiz VariableCommentSniff doesn't always detect a missing comment - - Fixed bug #1066 : Undefined index: quiet in CLI.php during unit test run with -v command line arg - - Fixed bug #1072 : Squiz.SelfMemberReference.NotUsed not detected if leading namespace separator is used - - Fixed bug #1089 : Rulesets cannot be loaded if the path contains urlencoded characters - - Fixed bug #1091 : PEAR and Squiz FunctionComment sniffs throw errors for some invalid @param line formats - - Fixed bug #1092 : PEAR.Functions.ValidDefaultValue should not flag type hinted methods with a NULL default argument - - Fixed bug #1095 : Generic LineEndings sniff replaces tabs with spaces with --tab-width is set - - Fixed bug #1096 : Squiz FunctionDeclarationArgumentSpacing gives incorrect error/fix when variadic operator is followed by a space - - Fixed bug #1099 : Group use declarations are incorrectly fixed by the PSR2 standard - -- Thanks to Jason McCreary for the patch - - Fixed bug #1101 : Incorrect indent errors when breaking out of PHP inside an IF statement - - Fixed bug #1102 : Squiz.Formatting.OperatorBracket.MissingBrackets faulty bracketing fix - - Fixed bug #1109 : Wrong scope indent reported in anonymous class - - Fixed bug #1112 : File docblock not recognized when require_once follows it - - Fixed bug #1120 : InlineControlStructureSniff does not handle auto-fixing for control structures that make function calls - - Fixed bug #1124 : Squiz.Operators.ComparisonOperatorUsage does not detect bracketed conditions for inline IF statements - -- Thanks to Raphael Horber for the patch - - - - - 2.6.2 - 2.6.2 - - - stable - stable - - 2016-07-14 - BSD License - - - Added a new --exclude CLI argument to exclude a list of sniffs from checking and fixing (request #904) - -- Accepts the same sniff codes as the --sniffs command line argument, but provides the opposite functionality - - Added a new -q command line argument to disable progress and verbose information from being printed (request #969) - -- Useful if a coding standard hard-codes progress or verbose output but you want PHPCS to be quiet - -- Use the command "phpcs --config-set quiet true" to turn quiet mode on by default - - Generic LineLength sniff no longer errors for comments that cannot be broken out onto a new line (request #766) - -- A typical case is a comment that contains a very long URL - -- The comment is ignored if putting the URL on a indented new comment line would be longer than the allowed length - - Settings extensions in a ruleset no longer causes PHP notices during unit testing - -- Thanks to Klaus Purer for the patch - - Version control reports now show which errors are fixable if you are showing sources - - Added a new sniff to enforce a single space after a NOT operator (request #1051) - -- Include in a ruleset using the code Generic.Formatting.SpaceAfterNot - - The Squiz.Commenting.BlockComment sniff now supports tabs for indenting comment lines (request #1056) - - Fixed bug #790 : Incorrect missing @throws error in methods that use closures - - Fixed bug #908 : PSR2 standard is not checking that closing brace is on line following the body - - Fixed bug #945 : Incorrect indent behavior using deep-nested function and arrays - - Fixed bug #961 : Two anonymous functions passed as function/method arguments cause indentation false positive - - Fixed bug #1005 : Using global composer vendor autoload breaks PHP lowercase built-in function sniff - -- Thanks to Michael Butler for the patch - - Fixed bug #1007 : Squiz Unreachable code detection is not working properly with a closure inside a case - - Fixed bug #1023 : PSR2.Classes.ClassDeclaration fails if class extends base class and "implements" is on trailing line - - Fixed bug #1026 : Arrays in comma delimited class properties cause ScopeIndent to increase indent - - Fixed bug #1028 : Squiz ArrayDeclaration incorrectly fixes multi-line array where end bracket is not on a new line - - Fixed bug #1034 : Squiz FunctionDeclarationArgumentSpacing gives incorrect error when first arg is a variadic - - Fixed bug #1036 : Adjacent assignments aligned analysis statement wrong - - Fixed bug #1049 : Version control reports can show notices when the report width is very small - - Fixed bug #21050 : PEAR MultiLineCondition sniff suppresses errors on last condition line - - - - - 2.6.1 - 2.6.1 - - - stable - stable - - 2016-05-31 - BSD License - - - The PHP-supplied T_COALESCE token has been replicated for PHP versions before 7.0 - - Function return types of self, parent and callable are now tokenized as T_RETURN_TYPE - -- Thanks to Jaroslav Hanslík for the patch - - The default_standard config setting now allows multiple standards to be listed, like on the command line - -- Thanks to Michael Mayer for the patch - - Installations done via composer now only include the composer autoloader for PHP 5.3.2+ (request #942) - - Added a rollbackChangeset() method to the Fixer class to purposely rollback the active changeset - - Fixed bug #940 : Auto-fixing issue encountered with inconsistent use of braces - - Fixed bug #943 : Squiz.PHP.InnerFunctions.NotAllowed reported in anonymous classes - - Fixed bug #944 : PHP warning when running the latest phar - - Fixed bug #951 : InlineIfDeclaration: invalid error produced with UTF-8 string - - Fixed bug #957 : Operator spacing sniff errors when plus is used as part of a number - -- Thanks to Klaus Purer for the patch - - Fixed bug #959 : Call-time pass-by-reference false positive if there is a square bracket before the ampersand - -- Thanks to Konstantin Leboev for the patch - - Fixed bug #962 : Null coalescing operator (??) not detected as a token - -- Thanks to Joel Posti for the patch - - Fixed bug #973 : Anonymous class declaration and PSR1.Files.SideEffects.FoundWithSymbols - - Fixed bug #974 : Error when file ends with "function" - - Fixed bug #979 : Anonymous function with return type hint is not refactored as expected - - Fixed bug #983 : Squiz.WhiteSpace.MemberVarSpacing.AfterComment fails to fix error when comment is not a docblock - - Fixed bug #1010 : Squiz NonExecutableCode sniff does not detect boolean OR - -- Thanks to Derek Henderson for the patch - - Fixed bug #1015 : The Squiz.Commenting.FunctionComment sniff doesn't allow description in @return tag - -- Thanks to Alexander Obuhovich for the patch - - Fixed bug #1022 : Duplicate spaces after opening bracket error with PSR2 standard - - Fixed bug #1025 : Syntax error in JS file can cause undefined index for parenthesis_closer - - - - - 2.6.0 - 2.6.0 - - - stable - stable - - 2016-04-04 - BSD License - - - Paths used when setting CLI arguments inside ruleset.xml files are now relative to the ruleset location (request #847) - -- This change only applies to paths within ARG tags, used to set CLI arguments - -- Previously, the paths were relative to the directory PHPCS was being run from - -- Absolute paths are still allowed and work the same way they always have - -- This change allows ruleset.xml files to be more portable - - Content passed via STDIN will now be processed even if files are specified on the command line or in a ruleset - - When passing content via STDIN, you can now specify the file path to use on the command line (request #934) - -- This allows sniffs that check file paths to work correctly - -- This is the same functionality provided by the phpcs_input_file line, except it is available on the command line - - Files processed with custom tokenizers will no longer be skipped if they appear minified (request #877) - -- If the custom tokenizer wants minified files skipped, it can set a $skipMinified member var to TRUE - -- See the included JS and CSS tokenizers for an example - - Config vars set in ruleset.xml files are now processed earlier, allowing them to be used during sniff registration - -- Among other things, this allows the installed_paths config var to be set in ruleset.xml files - -- Thanks to Pieter Frenssen for the patch - - Improved detection of regular expressions in the JS tokenizer - - Generic PHP Syntax sniff now uses PHP_BINARY (if available) to determine the path to PHP if no other path is available - -- You can still manually set php_path to use a specific binary for testing - -- Thanks to Andrew Berry for the patch - - The PHP-supplied T_POW_EQUAL token has been replicated for PHP versions before 5.6 - - Added support for PHP7 use group declarations (request #878) - -- New tokens T_OPEN_USE_GROUP and T_CLOSE_USE_GROUP are assigned to the open and close curly braces - - Generic ScopeIndent sniff now reports errors for every line that needs the indent changed (request #903) - -- Previously, it ignored lines that were indented correctly in the context of their block - -- This change produces more technically accurate error messages, but is much more verbose - - The PSR2 and Squiz standards now allow multi-line default values in function declarations (request #542) - -- Previously, these would automatically make the function a multi-line declaration - - Squiz InlineCommentSniff now allows docblocks on require(_once) and include(_once) statements - -- Thanks to Gary Jones for the patch - - Squiz and PEAR Class and File sniffs no longer assume the first comment in a file is always a file comment - -- phpDocumentor assigns the comment to the file only if it is not followed by a structural element - -- These sniffs now follow this same rule - - Squiz ClassCommentSniff no longer checks for blank lines before class comments - -- Removes the error Squiz.Commenting.ClassComment.SpaceBefore - - Renamed Squiz.CSS.Opacity.SpacingAfterPoint to Squiz.CSS.Opacity.DecimalPrecision - -- Please update your ruleset if you are referencing this error code directly - - Fixed PHP tokenizer problem that caused an infinite loop when checking a comment with specific content - - Generic Disallow Space and Tab indent sniffs now detect and fix indents inside embedded HTML chunks (request #882) - - Squiz CSS IndentationSniff no longer assumes the class opening brace is at the end of a line - - Squiz FunctionCommentThrowTagSniff now ignores non-docblock comments - - Squiz ComparisonOperatorUsageSniff now allows conditions like while(true) - - PEAR FunctionCallSignatureSniff (and the Squiz and PSR2 sniffs that use it) now correctly check the first argument - -- Further fix for bug #698 - - Fixed bug #791 : codingStandardsChangeSetting settings not working with namespaces - - Fixed bug #872 : Incorrect detection of blank lines between CSS class names - - Fixed bug #879 : Generic InlineControlStructureSniff can create parse error when case/if/elseif/else have mixed brace and braceless definitions - - Fixed bug #883 : PSR2 is not checking for blank lines at the start and end of control structures - - Fixed bug #884 : Incorrect indentation notice for anonymous classes - - Fixed bug #887 : Using curly braces for a shared CASE/DEFAULT statement can generate an error in PSR2 SwitchDeclaration - - Fixed bug #889 : Closure inside catch/else/elseif causes indentation error - - Fixed bug #890 : Function call inside returned short array value can cause indentation error inside CASE statements - - Fixed bug #897 : Generic.Functions.CallTimePassByReference.NotAllowed false positive when short array syntax - - Fixed bug #900 : Squiz.Functions.FunctionDeclarationArgumentSpacing bug when no space between type hint and argument - - Fixed bug #902 : T_OR_EQUAL and T_POW_EQUAL are not seen as assignment tokens - - Fixed bug #910 : Unrecognized "extends" and indentation on anonymous classes - - Fixed bug #915 : JS Tokenizer generates errors when processing some decimals - - Fixed bug #928 : Endless loop when sniffing a PHP file with a git merge conflict inside a function - - Fixed bug #937 : Shebang can cause PSR1 SideEffects warning - -- Thanks to Clay Loveless for the patch - - Fixed bug #938 : CallTimePassByReferenceSniff ignores functions with return value - - - - - 2.5.1 - 2.5.1 - - - stable - stable - - 2016-01-20 - BSD License - - - The PHP-supplied T_SPACESHIP token has been replicated for PHP versions before 7.0 - - T_SPACESHIP is now correctly identified as an operator - -- Thanks to Alexander Obuhovich for the patch - - Generic LowerCaseKeyword now ensures array type hints are lowercase as well - -- Thanks to Mathieu Rochette for the patch - - Squiz ComparisonOperatorUsageSniff no longer hangs on JS FOR loops that don't use semicolons - - PHP_CodesSniffer now includes the composer autoload.php file, if there is one - -- Thanks to Klaus Purer for the patch - - Added error Squiz.Commenting.FunctionComment.ScalarTypeHintMissing for PHP7 only (request #858) - -- These errors were previously reported as Squiz.Commenting.FunctionComment.TypeHintMissing on PHP7 - -- Disable this error message in a ruleset.xml file if your code needs to run on both PHP5 and PHP7 - - The PHP 5.6 __debugInfo magic method no longer produces naming convention errors - -- Thanks to Michael Nowack for the patch - - PEAR and Squiz FunctionComment sniffs now support variadic functions (request #841) - - Fixed bug #622 : Wrong detection of Squiz.CSS.DuplicateStyleDefinition with media queries - - Fixed bug #752 : The missing exception error is reported in first found DocBlock - - Fixed bug #794 : PSR2 MultiLineFunctionDeclaration forbids comments after opening parenthesis of a multiline call - - Fixed bug #820 : PEAR/PSR2 FunctionCallSignature sniffs suggest wrong indent when there are multiple arguments on a line - - Fixed bug #822 : Ruleset hard-coded file paths are not used if not running from the same directory as the ruleset - - Fixed bug #825 : FunctionCallArgumentSpacing sniff complains about more than one space before comment in multi-line function call - - Fixed bug #828 : Null classname is tokenized as T_NULL instead of T_STRING - - Fixed bug #829 : Short array argument not fixed correctly when multiple function arguments are on the same line - - Fixed bug #831 : PHPCS freezes in an infinite loop under Windows if no standard is passed - - Fixed bug #832 : Tokenizer does not support context sensitive parsing - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #835 : PEAR.Functions.FunctionCallSignature broken when closure uses return types - - Fixed bug #838 : CSS indentation fixer changes color codes - -- Thanks to Klaus Purer for the patch - - Fixed bug #839 : "__()" method is marked as not camel caps - -- Thanks to Tim Bezhashvyly for the patch - - Fixed bug #852 : Generic.Commenting.DocComment not finding errors when long description is omitted - - Fixed bug #854 : Return typehints in interfaces are not reported as T_RETURN_TYPE - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #855 : Capital letter detection for multibyte strings doesn't work correctly - - Fixed bug #857 : PSR2.ControlStructure.SwitchDeclaration shouldn't check indent of curly brace closers - - Fixed bug #859 : Switch statement indention issue when returning function call with closure - - Fixed bug #861 : Single-line arrays and function calls can generate incorrect indentation errors - - Fixed bug #867 : Squiz.Strings.DoubleQuoteUsage broken for some escape codes - -- Thanks to Jack Blower for the help with the fix - - Fixed bug #21005 : Incorrect indent detection when multiple properties are initialized to arrays - - Fixed bug #21010 : Incorrect missing colon detection in CSS when first style is not on new line - - Fixed bug #21011 : Incorrect error message text when newline found after opening brace - - - - - 2.5.0 - 2.5.0 - - - stable - stable - - 2015-12-11 - BSD License - - - PHPCS will now look for a phpcs.xml file in parent directories as well as the current directory (request #626) - - PHPCS will now use a phpcs.xml file even if files are specified on the command line - -- This file is still only used if no standard is specified on the command line - - Added support for a phpcs.xml.dist file (request #583) - -- If both a phpcs.xml and phpcs.xml.dist file are present, the phpcs.xml file will be used - - Added support for setting PHP ini values in ruleset.xml files (request #560) - -- Setting the value of the new ini tags to name="memory_limit" value="32M" is the same as -d memory_limit=32M - - Added support for one or more bootstrap files to be run before processing begins - -- Use the --bootstrap=file,file,file command line argument to include bootstrap files - -- Useful if you want to override some of the high-level settings of PHPCS or PHPCBF - -- Thanks to John Maguire for the patch - - Added additional verbose output for CSS tokenizing - - Squiz ComparisonOperatorUsageSniff now checks FOR, WHILE and DO-WHILE statements - -- Thanks to Arnout Boks for the patch - - Fixed bug #660 : Syntax checks can fail on Windows with PHP5.6 - - Fixed bug #784 : $this->trait is seen as a T_TRAIT token - - Fixed bug #786 : Switch indent issue with short array notation - - Fixed bug #787 : SpacingAfterDefaultBreak confused by multi-line statements - - Fixed bug #797 : Parsing CSS url() value breaks further parsing - - Fixed bug #805 : Squiz.Commenting.FunctionComment.InvalidTypeHint on Scalar types on PHP7 - - Fixed bug #807 : Cannot fix line endings when open PHP tag is not on the first line - - Fixed bug #808 : JS tokeniser incorrectly setting some function and class names to control structure tokens - - Fixed bug #809 : PHPCBF can break a require_once statement with a space before the open parenthesis - - Fixed bug #813 : PEAR FunctionCallSignature checks wrong indent when first token on line is part of a multi-line string - - - - - 2.4.0 - 2.4.0 - - - stable - stable - - 2015-11-24 - BSD License - - - Added support for PHP 7 anonymous classes - -- Anonymous classes are now tokenized as T_ANON_CLASS and ignored by normal class sniffs - - Added support for PHP 7 function return type declarations - -- Return types are now tokenized as T_RETURN_TYPE - - Fixed tokenizing of the XOR operator, which was incorrectly identified as a power operator (bug #765) - -- The T_POWER token has been removed and replaced by the T_BITWISE_XOR token - -- The PHP-supplied T_POW token has been replicated for PHP versions before 5.6 - - Traits are now tokenized in PHP versions before 5.4 to make testing easier - - Improved regular expression detection in JS files - - PEAR FunctionCallSignatureSniff now properly detects indents in more mixed HTML/PHP code blocks - - Full report now properly indents lines when newlines are found inside error messages - - Generating documentation without specifying a standard now uses the default standard instead - -- Thanks to Ken Guest for the patch - - Generic InlineControlStructureSniff now supports braceless do/while loops in JS - -- Thanks to Pieter Frenssen for the patch - - Added more guard code for function declarations with syntax errors - -- Thanks to Yun Young-jin for the patch - - Added more guard code for foreach declarations with syntax errors - -- Thanks to Johan de Ruijter for the patch - - Added more guard code for class declarations with syntax errors - - Squiz ArrayDeclarationSniff now has guard code for arrays with syntax errors - - Generic InlineControlStructureSniff now correctly fixes ELSEIF statements - - Fixed bug #601 : Expected type hint int[]; found array in Squiz FunctionCommentSniff - -- Thanks to Scato Eggen for the patch - - Fixed bug #625 : Consider working around T_HASHBANG in HHVM 3.5.x and 3.6.x - -- Thanks to Kunal Mehta for the patch - - Fixed bug #692 : Comment tokenizer can break when using mbstring function overloading - - Fixed bug #694 : Long sniff codes can cause PHP warnings in source report when showing error codes - - Fixed bug #698 : PSR2.Methods.FunctionCallSignature.Indent forces exact indent of ternary operator parameters - - Fixed bug #704 : ScopeIndent can fail when an opening parenthesis is on a line by itself - - Fixed bug #707 : Squiz MethodScopeSniff doesn't handle nested functions - - Fixed bug #709 : Squiz.Sniffs.Whitespace.ScopeClosingBraceSniff marking indented endif in mixed inline HTML blocks - - Fixed bug #711 : Sniffing from STDIN shows Generic.Files.LowercasedFilename.NotFound error - - Fixed bug #714 : Fixes suppression of errors using docblocks - -- Thanks to Andrzej Karmazyn for the patch - - Fixed bug #716 : JSON report is invalid when messages contain newlines or tabs - -- Thanks to Pieter Frenssen for the patch - - Fixed bug #723 : ScopeIndent can fail when multiple array closers are on the same line - - Fixed bug #730 : ScopeIndent can fail when a short array opening square bracket is on a line by itself - - Fixed bug #732 : PHP Notice if @package name is made up of all invalid characters - -- Adds new error code PEAR.Commenting.FileComment.InvalidPackageValue - - Fixed bug #748 : Auto fix for Squiz.Commenting.BlockComment.WrongEnd is incorrect - -- Thanks to J.D. Grimes for the patch - - Fixed bug #753 : PSR2 standard shouldn't require space after USE block when next code is a closing tag - - Fixed bug #768 : PEAR FunctionCallSignature sniff forbids comments after opening parenthesis of a multiline call - - Fixed bug #769 : Incorrect detection of variable reference operator when used with short array syntax - -- Thanks to Klaus Purer for the patch - - Fixed bug #772 : Syntax error when using PHPCBF on alternative style foreach loops - - Fixed bug #773 : Syntax error when stripping trailing PHP close tag and previous statement has no semicolon - - Fixed bug #778 : PHPCBF creates invalid PHP for inline FOREACH containing multiple control structures - - Fixed bug #781 : Incorrect checking for PHP7 return types on multi-line function declarations - - Fixed bug #782 : Conditional function declarations cause fixing conflicts in Squiz standard - -- Squiz.ControlStructures.ControlSignature no longer enforces a single newline after open brace - -- Squiz.WhiteSpace.ControlStructureSpacing can be used to check spacing at the start/end of control structures - - - - - 2.3.4 - 2.3.4 - - - stable - stable - - 2015-09-09 - BSD License - - - JSON report format now includes the fixable status for each error message and the total number of fixable errors - - Added more guard code for function declarations with syntax errors - - Added tokenizer support for the PHP declare construct - -- Thanks to Andy Blyler for the patch - - Generic UnnecessaryStringConcatSniff can now allow strings concatenated over multiple lines - -- Set the allowMultiline property to TRUE (default is FALSE) in your ruleset.xml file to enable this - -- By default, concat used only for getting around line length limits still generates an error - -- Thanks to Stefan Lenselink for the contribution - - Invalid byte sequences no longer throw iconv_strlen() errors (request #639) - -- Thanks to Willem Stuursma for the patch - - Generic TodoSniff and FixmeSniff are now better at processing strings with invalid characters - - PEAR FunctionCallSignatureSniff now ignores indentation of inline HTML content - - Squiz ControlSignatureSniff now supports control structures with only inline HTML content - - Fixed bug #636 : Some class names cause CSS tokenizer to hang - - Fixed bug #638 : VCS blame reports output error content from the blame commands for files not under VC - - Fixed bug #642 : Method params incorrectly detected when default value uses short array syntax - -- Thanks to Josh Davis for the patch - - Fixed bug #644 : PEAR ScopeClosingBrace sniff does not work with mixed HTML/PHP - - Fixed bug #645 : FunctionSignature and ScopeIndent sniffs don't detect indents correctly when PHP open tag is not on a line by itself - - Fixed bug #648 : Namespace not tokenized correctly when followed by multiple use statements - - Fixed bug #654 : Comments affect indent check for BSDAllman brace style - - Fixed bug #658 : Squiz.Functions.FunctionDeclarationSpacing error for multi-line declarations with required spaces greater than zero - -- Thanks to J.D. Grimes for the patch - - Fixed bug #663 : No space after class name generates: Class name "" is not in camel caps format - - Fixed bug #667 : Scope indent check can go into infinite loop due to some parse errors - - Fixed bug #670 : Endless loop in PSR1 SideEffects sniffer if no semicolon after last statement - -- Thanks to Thomas Jarosch for the patch - - Fixed bug #672 : Call-time pass-by-reference false positive - - Fixed bug #683 : Comments are incorrectly reported by PSR2.ControlStructures.SwitchDeclaration sniff - - Fixed bug #687 : ScopeIndent does not check indent correctly for method prefixes like public and abstract - - Fixed bug #689 : False error on some comments after class closing brace - - - - - 2.3.3 - 2.3.3 - - - stable - stable - - 2015-06-24 - BSD License - - - Improved the performance of the CSS tokenizer, especially on very large CSS files (thousands of lines) - -- Thanks to Klaus Purer for the patch - - Defined tokens for lower PHP versions are now phpcs-specific strings instead of ints - -- Stops conflict with other projects, like PHP_CodeCoverage - - Added more guard code for syntax errors to various sniffs - - Improved support for older HHVM versions - -- Thanks to Kunal Mehta for the patch - - Squiz ValidLogicalOperatorsSniff now ignores XOR as type casting is different when using the ^ operator (request #567) - - Squiz CommentedOutCodeSniff is now better at ignoring URLs inside comments - - Squiz ControlSignatureSniff is now better at checking embedded PHP code - - Squiz ScopeClosingBraceSniff is now better at checking embedded PHP code - - Fixed bug #584 : Squiz.Arrays.ArrayDeclaration sniff gives incorrect NoComma error for multiline string values - - Fixed bug #589 : PEAR.Functions.FunctionCallSignature sniff not checking all function calls - - Fixed bug #592 : USE statement tokenising can sometimes result in mismatched scopes - - Fixed bug #594 : Tokenizer issue on closure that returns by reference - - Fixed bug #595 : Colons in CSS selectors within media queries throw false positives - -- Thanks to Klaus Purer for the patch - - Fixed bug #598 : PHPCBF can break function/use closure brace placement - - Fixed bug #603 : Squiz ControlSignatureSniff hard-codes opener type while fixing - - Fixed bug #605 : Auto report-width specified in ruleset.xml ignored - - Fixed bug #611 : Invalid numeric literal on CSS files under PHP7 - - Fixed bug #612 : Multi-file diff generating incorrectly if files do not end with EOL char - - Fixed bug #615 : Squiz OperatorBracketSniff incorrectly reports and fixes operations using self:: - - Fixed bug #616 : Squiz DisallowComparisonAssignmentSniff inconsistent errors with inline IF statements - - Fixed bug #617 : Space after switch keyword in PSR-2 is not being enforced - - Fixed bug #621 : PSR2 SwitchDeclaration sniff doesn't detect, or correctly fix, case body on same line as statement - - - - - 2.3.2 - 2.3.2 - - - stable - stable - - 2015-04-29 - BSD License - - - The error message for PSR2.ControlStructures.SwitchDeclaration.WrongOpenercase is now clearer (request #579) - - Fixed bug #545 : Long list of CASE statements can cause tokenizer to reach a depth limit - - Fixed bug #565 : Squiz.WhiteSpace.OperatorSpacing reports negative number in short array - -- Thanks to Vašek Purchart for the patch - -- Same fix also applied to Squiz.Formatting.OperatorBracket - - Fixed bug #569 : Generic ScopeIndentSniff throws PHP notices in JS files - - Fixed bug #570 : Phar class fatals in PHP less than 5.3 - - - - - 2.3.1 - 2.3.1 - - - stable - stable - - 2015-04-23 - BSD License - - - PHPCS can now exit with 0 even if errors are found - -- Set the ignore_errors_on_exit config variable to 1 to set this behaviour - -- Use with the ignore_warnings_on_exit config variable to never return a non-zero exit code - - Added Generic DisallowLongArraySyntaxSniff to enforce the use of the PHP short array syntax (request #483) - -- Thanks to Xaver Loppenstedt for helping with tests - - Added Generic DisallowShortArraySyntaxSniff to ban the use of the PHP short array syntax (request #483) - -- Thanks to Xaver Loppenstedt for helping with tests - - Generic ScopeIndentSniff no longer does exact checking for content inside parenthesis (request #528) - -- Only applies to custom coding standards that set the "exact" flag to TRUE - - Squiz ConcatenationSpacingSniff now has a setting to ignore newline characters around operators (request #511) - -- Default remains FALSE, so newlines are not allowed - -- Override the "ignoreNewlines" setting in a ruleset.xml file to change - - Squiz InlineCommentSniff no longer checks the last char of a comment if the first char is not a letter (request #505) - - The Squiz standard has increased the max padding for statement alignment from 12 to 20 - - Fixed bug #479 : Yielded values are not recognised as returned values in Squiz FunctionComment sniff - - Fixed bug #512 : Endless loop whilst parsing mixture of control structure styles - - Fixed bug #515 : Spaces in JS block incorrectly flagged as indentation error - - Fixed bug #523 : Generic ScopeIndent errors for IF in FINALLY - - Fixed bug #527 : Closure inside IF statement is not tokenized correctly - - Fixed bug #529 : Squiz.Strings.EchoedStrings gives false positive when echo'ing using an inline condition - - Fixed bug #537 : Using --config-set is breaking phpcs.phar - - Fixed bug #543 : SWITCH with closure in condition generates inline control structure error - - Fixed bug #551 : Multiple catch blocks not checked in Squiz.ControlStructures.ControlSignature sniff - - Fixed bug #554 : ScopeIndentSniff causes errors when encountering an unmatched parenthesis - - Fixed bug #558 : PHPCBF adds brace for ELSE IF split over multiple lines - - Fixed bug #564 : Generic MultipleStatementAlignment sniff reports incorrect errors for multiple assignments on a single line - - - - - 2.3.0 - 2.3.0 - - - stable - stable - - 2015-03-04 - BSD License - - - The existence of the main config file is now cached to reduce is_file() calls when it doesn't exist (request #486) - - Abstract classes inside the Sniffs directory are now ignored even if they are named [Name]Sniff.php (request #476) - -- Thanks to David Vernet for the patch - - PEAR and Squiz FileComment sniffs no longer have @ in their error codes - -- e.g., PEAR.Commenting.FileComment.Duplicate@categoryTag becomes PEAR.Commenting.FileComment.DuplicateCategoryTag - -- e.g., Squiz.Commenting.FileComment.Missing@categoryTag becomes Squiz.Commenting.FileComment.MissingCategoryTag - - PEAR MultiLineConditionSniff now allows comment lines inside multi-line IF statement conditions - -- Thanks to Klaus Purer for the patch - - Generic ForbiddenFunctionsSniff now supports setting null replacements in ruleset files (request #263) - - Generic opening function brace sniffs now support checking of closures - -- Set the checkClosures property to TRUE (default is FALSE) in your ruleset.xml file to enable this - -- Can also set the checkFunctions property to FALSE (default is TRUE) in your ruleset.xml file to only check closures - -- Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff - - Generic OpeningFunctionBraceKernighanRitchieSniff can now fix all the errors it finds - - Generic OpeningFunctionBraceKernighanRitchieSniff now allows empty functions with braces next to each other - - Generic OpeningFunctionBraceBsdAllmanSniff now allows empty functions with braces next to each other - - Improved auto report width for the "full" report - - Improved conflict detection during auto fixing - - Generic ScopeIndentSniff is no longer confused by empty closures - - Squiz ControlSignatureSniff now always ignores comments (fixes bug #490) - -- Include the Squiz.Commenting.PostStatementComment sniff in your ruleset.xml to ban these comments again - - Squiz OperatorSpacingSniff no longer throws errors for code in the form ($foo || -1 === $bar) - - Fixed errors tokenizing T_ELSEIF tokens on HHVM 3.5 - - Squiz ArrayDeclarationSniff is no longer tricked by comments after array values - - PEAR IncludingFileSniff no longer produces invalid code when removing parenthesis from require/include statements - - Fixed bug #415 : The @codingStandardsIgnoreStart has no effect during fixing - - Fixed bug #432 : Properties of custom sniffs cannot be configured - - Fixed bug #453 : PSR2 standard does not allow closing tag for mixed PHP/HTML files - - Fixed bug #457 : FunctionCallSignature sniffs do not support here/nowdoc syntax and can cause syntax error when fixing - - Fixed bug #466 : PropertyLabelSpacing JS fixer issue when there is no space after colon - - Fixed bug #473 : Writing a report for an empty folder to existing file includes the existing contents - - Fixed bug #485 : PHP notice in Squiz.Commenting.FunctionComment when checking malformed @throws comment - - Fixed bug #491 : Generic InlineControlStructureSniff can correct with missing semicolon - -- Thanks to Jesse Donat for the patch - - Fixed bug #492 : Use statements don't increase the scope indent - - Fixed bug #493 : PSR1_Sniffs_Methods_CamelCapsMethodNameSniff false positives for some magic method detection - -- Thanks to Andreas Möller for the patch - - Fixed bug #496 : Closures in PSR2 are not checked for a space after the function keyword - - Fixed bug #497 : Generic InlineControlStructureSniff does not support alternative SWITCH syntax - - Fixed bug #500 : Functions not supported as values in Squiz ArrayDeclaration sniff - - Fixed bug #501 : ScopeClosingBrace and ScopeIndent conflict with closures used as array values - -- Generic ScopeIndentSniff may now report fewer errors for closures, but perform the same fixes - - Fixed bug #502 : PSR1 SideEffectsSniff sees declare() statements as side effects - - - - - 2.2.0 - 2.2.0 - - - stable - stable - - 2015-01-22 - BSD License - - - Added (hopefully) tastefully used colors to report and progress output for the phpcs command - -- Use the --colors command line argument to use colors in output - -- Use the command "phpcs --config-set colors true" to turn colors on by default - -- Use the --no-colors command line argument to turn colors off when the config value is set - - Added support for using the full terminal width for report output - -- Use the --report-width=auto command line argument to auto-size the reports - -- Use the command "phpcs --config-set report_width auto" to use auto-sizing by default - - Reports will now size to fit inside the report width setting instead of always using padding to fill the space - - If no files or standards are specified, PHPCS will now look for a phpcs.xml file in the current directory - -- This file has the same format as a standard ruleset.xml file - -- The phpcs.xml file should specify (at least) files to process and a standard/sniffs to use - -- Useful for running the phpcs and phpcbf commands without any arguments at the top of a repository - - Default file paths can now be specified in a ruleset.xml file using the "file" tag - -- File paths are only processed if no files were specified on the command line - - Extensions specified on the CLI are now merged with those set in ruleset.xml files - -- Previously, the ruleset.xml file setting replaced the CLI setting completely - - Squiz coding standard now requires lowercase PHP constants (true, false and null) - -- Removed Squiz.NamingConventions.ConstantCase sniff as the rule is now consistent across PHP and JS files - - Squiz FunctionOpeningBraceSpaceSniff no longer does additional checks for JS functions - -- PHP and JS functions and closures are now treated the same way - - Squiz MultiLineFunctionDeclarationSniff now supports JS files - - Interactive mode no longer breaks if you also specify a report type on the command line - - PEAR InlineCommentSniff now fixes the Perl-style comments that it finds (request #375) - - PSR2 standard no longer fixes the placement of docblock open tags as comments are excluded from this standard - - PSR2 standard now sets a default tab width of 4 spaces - - Generic DocCommentSniff now only disallows lowercase letters at the start of a long/short comment (request #377) - -- All non-letter characters are now allowed, including markdown special characters and numbers - - Generic DisallowMultipleStatementsSniff now allows multiple open/close tags on the same line (request #423) - - Generic CharacterBeforePHPOpeningTagSniff now only checks the first PHP tag it finds (request #423) - - Generic CharacterBeforePHPOpeningTagSniff now allows a shebang line at the start of the file (request #20481) - - Generic InlineHTMLUnitTest now allows a shebang line at the start of the file (request #20481) - - PEAR ObjectOperatorIndentSniff now only checks object operators at the start of a line - - PEAR FileComment and ClassComment sniffs no longer have @ in their error codes - -- E.g., PEAR.Commenting.FileComment.Missing@categoryTag becomes PEAR.Commenting.FileComment.MissingCategoryTag - -- Thanks to Grzegorz Rygielski for the patch - - Squiz ControlStructureSpacingSniff no longer enforces a blank line before CATCH statements - - Squiz FunctionCommentSniff now fixes the return type in the @return tag (request #392) - - Squiz BlockCommentSniff now only disallows lowercase letters at the start of the comment - - Squiz InlineCommentSniff now only disallows lowercase letters at the start of the comment - - Squiz OperatorSpacingSniff now has a setting to ignore newline characters around operators (request #348) - -- Default remains FALSE, so newlines are not allowed - -- Override the "ignoreNewlines" setting in a ruleset.xml file to change - - PSR2 ControlStructureSpacingSniff now checks for, and fixes, newlines after the opening parenthesis - - Added a markdown document generator (--generator=markdown to use) - -- Thanks to Stefano Kowalke for the contribution - - Fixed bug #379 : Squiz.Arrays.ArrayDeclaration.NoCommaAfterLast incorrectly detects comments - - Fixed bug #382 : JS tokenizer incorrect for inline conditionally created immediately invoked anon function - - Fixed bug #383 : Squiz.Arrays.ArrayDeclaration.ValueNoNewline incorrectly detects nested arrays - - Fixed bug #386 : Undefined offset in Squiz.FunctionComment sniff when param has no comment - - Fixed bug #390 : Indentation of non-control structures isn't adjusted when containing structure is fixed - - Fixed bug #400 : InlineControlStructureSniff fails to fix when statement has no semicolon - - Fixed bug #401 : PHPCBF no-patch option shows an error when there are no fixable violations in a file - - Fixed bug #405 : The "Squiz.WhiteSpace.FunctionSpacing" sniff removes class "}" during fixing - - Fixed bug #407 : PEAR.ControlStructures.MultiLineCondition doesn't account for comments at the end of lines - - Fixed bug #410 : The "Squiz.WhiteSpace.MemberVarSpacing" not respecting "var" - - Fixed bug #411 : Generic.WhiteSpace.ScopeIndent.Incorrect - false positive with multiple arrays in argument list - - Fixed bug #412 : PSR2 multi-line detection doesn't work for inline IF and string concats - - Fixed bug #414 : Squiz.WhiteSpace.MemberVarSpacing - inconsistent checking of member vars with comment - - Fixed bug #433 : Wrong detection of Squiz.Arrays.ArrayDeclaration.KeyNotAligned when key contains space - - Fixed bug #434 : False positive for spacing around "=>" in inline array within foreach - - Fixed bug #452 : Ruleset exclude-pattern for specific sniff code ignored when using CLI --ignore option - - Fixed bug #20482 : Scope indent sniff can get into infinite loop when processing a parse error - - - - - 2.1.0 - 2.1.0 - - - stable - stable - - 2014-12-18 - BSD License - - - Time and memory output is now shown if progress information is also shown (request #335) - - A tilde can now be used to reference a user's home directory in a path to a standard (request #353) - - Added PHP_CodeSniffer_File::findStartOfStatement() to find the first non-whitespace token in a statement - -- Possible alternative for code using PHP_CodeSniffer_File::findPrevious() with the local flag set - - Added PHP_CodeSniffer_File::findEndOfStatement() to find the last non-whitespace token in a statement - -- Possible alternative for code using PHP_CodeSniffer_File::findNext() with the local flag set - - Generic opening function brace sniffs now ensure the opening brace is the last content on the line - -- Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff - -- Also enforced in PEAR FunctionDeclarationSniff and Squiz MultiLineFunctionDeclarationSniff - - Generic DisallowTabIndentSniff now replaces tabs everywhere it finds them, except in strings and here/now docs - - Generic EmptyStatementSniff error codes now contain the type of empty statement detected (request #314) - -- All messages generated by this sniff are now errors (empty CATCH was previously a warning) - -- Message code Generic.CodeAnalysis.EmptyStatement.NotAllowed has been removed - -- Message code Generic.CodeAnalysis.EmptyStatement.NotAllowedWarning has been removed - -- New message codes have the format Generic.CodeAnalysis.EmptyStatement.Detected[TYPE] - -- Example code is Generic.CodeAnalysis.EmptyStatement.DetectedCATCH - -- You can now use a custom ruleset to change messages to warnings and to exclude them - - PEAR and Squiz FunctionCommentSniffs no longer ban @return tags for constructors and destructors - -- Removed message PEAR.Commenting.FunctionComment.ReturnNotRequired - -- Removed message Squiz.Commenting.FunctionComment.ReturnNotRequired - -- Change initiated by request #324 and request #369 - - Squiz EmptyStatementSniff has been removed - -- Squiz standard now includes Generic EmptyStatementSniff and turns off the empty CATCH error - - Squiz ControlSignatureSniff fixes now retain comments between the closing parenthesis and open brace - - Squiz SuperfluousWhitespaceSniff now checks for extra blank lines inside closures - -- Thanks to Sertan Danis for the patch - - Squiz ArrayDeclarationSniff now skips function calls while checking multi-line arrays - - Fixed bug #337 : False positive with anonymous functions in Generic_Sniffs_WhiteSpace_ScopeIndentSniff - - Fixed bug #339 : reformatting brace location can result in broken code - - Fixed bug #342 : Nested ternary operators not tokenized correctly - - Fixed bug #345 : Javascript regex not tokenized when inside array - - Fixed bug #346 : PHP path can't be determined in some cases in "phpcs.bat" (on Windows XP) - - Fixed bug #358 : False positives for Generic_Sniffs_WhiteSpace_ScopeIndentSniff - - Fixed bug #361 : Sniff-specific exclude patterns don't work for Windows - - Fixed bug #364 : Don't interpret "use function" as declaration - - Fixed bug #366 : phpcbf with PSR2 errors on control structure alternative syntax - - Fixed bug #367 : Nested Anonymous Functions Causing False Negative - - Fixed bug #371 : Shorthand binary cast causes tokenizer errors - -- New token T_BINARY_CAST added for the b"string" cast format (the 'b' is the T_BINARY_CAST token) - - Fixed bug #372 : phpcbf parse problem, wrong brace placement for inline IF - - Fixed bug #373 : Double quote usage fix removing too many double quotes - - Fixed bug #20196 : 1.5.2 breaks scope_closer position - - - - - 2.0.0 - 2.0.0 - - - stable - stable - - 2014-12-05 - BSD License - - - JS tokenizer now sets functions as T_CLOSUREs if the function is anonymous - - JS tokenizer now sets all objects to T_OBJECT - -- Object end braces are set to a new token T_CLOSE_OBJECT - -- T_OBJECT tokens no longer act like scopes; i.e., they have no condition/opener/closer - -- T_PROPERTY tokens no longer act like scopes; i.e., they have no condition/opener/closer - -- T_OBJECT tokens have a bracket_closer instead, which can be used to find the ending - -- T_CLOSE_OBJECT tokens have a bracket_opener - - Improved regular expression detection in the JS tokenizer - - You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment - -- When the comment is found, the comment line and the following line will be ignored - -- Thanks to Andy Bulford for the contribution - - PHPCBF now prints output when it is changing into directories - - Improved conflict detection during auto fixing - - The -vvv command line argument will now output the current file content for each loop during fixing - - Generic ScopeIndentSniff now checks that open/close PHP tags are aligned to the correct column - - PEAR FunctionCallSignatureSniff now checks indent of closing parenthesis even if it is not on a line by itself - - PEAR FunctionCallSignatureSniff now supports JS files - - PEAR MultiLineConditionSniff now supports JS files - - Squiz DocCommentAlignmentSniff now supports JS files - - Fixed a problem correcting the closing brace line in Squiz ArrayDeclarationSniff - - Fixed a problem auto-fixing the Squiz.WhiteSpace.FunctionClosingBraceSpace.SpacingBeforeNestedClose error - - Squiz EmbeddedPhpSniff no longer reports incorrect alignment of tags when they are not on new lines - - Squiz EmbeddedPhpSniff now aligns open tags correctly when moving them onto a new line - - Improved fixing of arrays with multiple values in Squiz ArrayDeclarationSniff - - Improved detection of function comments in Squiz FunctionCommentSpacingSniff - - Improved fixing of lines after cases statements in Squiz SwitchDeclarationSniff - - Fixed bug #311 : Suppression of function prototype breaks checking of lines within function - - Fixed bug #320 : Code sniffer indentation issue - - Fixed bug #333 : Nested ternary operators causing problems - - - - - 2.0.0RC4 - 2.0.0RC4 - - - beta - beta - - 2014-11-07 - BSD License - - - JS tokenizer now detects xor statements correctly - - Improved detection of properties and objects in the JS tokenizer - - Generic ScopeIndentSniff can now fix indents using tabs instead of spaces - -- Set the tabIndent property to TRUE in your ruleset.xml file to enable this - -- It is important to also set a tab-width setting, either in the ruleset or on the command line, for accuracy - - Generic ScopeIndentSniff now checks and auto-fixes JS files - - Generic DisallowSpaceIndentSniff is now able to replace space indents with tab indents during fixing - - Support for phpcs-only and phpcbf-only attributes has been added to all ruleset.xml elements - -- Allows parts of the ruleset to only apply when using a specific tool - -- Useful for doing things like excluding indent fixes but still reporting indent errors - - Unit tests can now set command line arguments during a test run - -- Override getCliValues() and pass an array of CLI arguments for each file being tested - - File-wide sniff properties can now be set using T_INLINE_HTML content during unit test runs - -- Sniffs that start checking at the open tag can only, normally, have properties set using a ruleset - - Generic ConstructorNameSniff no longer errors for PHP4 style constructors when __construct() is present - -- Thanks to Thibaud Fabre for the patch - - Generic DocCommentSniff now checks that the end comment tag is on a new line - - Generic MultipleStatementAlignmentSniff no longer skips assignments for closures - - Squiz DocCommentAlignment sniff now has better checking for single line doc block - - Running unit tests with the -v CLI argument no longer generates PHP errors - - Fixed bug #295 : ScopeIndentSniff hangs when processing nested closures - - Fixed bug #298 : False positive in ScopeIndentSniff when anonymous functions are used with method chaining - - Fixed bug #302 : Fixing code in Squiz InlineComment sniff can remove some comment text - - Fixed bug #303 : Open and close tag on same line can cause a PHP notice checking scope indent - - Fixed bug #306 : File containing only a namespace declaration raises undefined index notice - - Fixed bug #307 : Conditional breaks in case statements get incorrect indentations - - Fixed bug #308 : Squiz InlineIfDeclarationSniff fails on ternary operators inside closure - - Fixed bug #310 : Variadics not recognized by tokenizer - - - - - 2.0.0RC3 - 2.0.0RC3 - - - beta - beta - - 2014-10-16 - BSD License - - - Improved default output for PHPCBF and removed the options to print verbose and progress output - - If a .fixed file is supplied for a unit test file, the auto fixes will be checked against it during testing - -- See Generic ScopeIndentUnitTest.inc and ScopeIndentUnitTest.inc.fixed for an example - - Fixer token replacement methods now return TRUE if the change was accepted and FALSE if rejected - - The --config-show command now pretty-prints the config values - -- Thanks to Ken Guest for the patch - - Setting and removing config values now catches exceptions if the config file is not writable - -- Thanks to Ken Guest for the patch - - Setting and removing config values now prints a message to confirm the action and show old values - - Generic ScopeIndentSniff has been completely rewritten to improve fixing and embedded PHP detection - - Generic DisallowTabIndent and DisallowSpaceIndent sniffs now detect indents at the start of block comments - - Generic DisallowTabIndent and DisallowSpaceIndent sniffs now detect indents inside multi-line strings - - Generic DisallowTabIndentSniff now replaces tabs inside doc block comments - - Squiz ControlStructureSpacingSniff error codes have been corrected; they were reversed - - Squiz EmbeddedPhpSniff now checks open and close tag indents and fixes some errors - - Squiz FileCommentSniff no longer throws incorrect blank line before comment errors in JS files - - Squiz ClassDeclarationSniff now has better checking for blank lines after a closing brace - - Removed error Squiz.Classes.ClassDeclaration.NoNewlineAfterCloseBrace (request #285) - -- Already handled by Squiz.Classes.ClassDeclaration.CloseBraceSameLine - - Fixed bug #280 : The --config-show option generates error when there is no config file - - - - - 2.0.0RC2 - 2.0.0RC2 - - - beta - beta - - 2014-09-26 - BSD License - - - Minified JS and CSS files are now detected and skipped (fixes bug #252 and bug #19899) - -- A warning will be added to the file so it can be found in the report and ignored in the future - - Fixed incorrect length of JS object operator tokens - - PHP tokenizer no longer converts class/function names to special tokens types - -- Class/function names such as parent and true would become special tokens such as T_PARENT and T_TRUE - - PHPCS can now exit with 0 if only warnings were found (request #262) - -- Set the ignore_warnings_on_exit config variable to 1 to set this behaviour - -- Default remains at exiting with 0 only if no errors and no warnings were found - -- Also changes return value of PHP_CodeSniffer_Reporting::printReport() - - Rulesets can now set associative array properties - -- property name="[property]" type="array" value="foo=>bar,baz=>qux" - - Generic ForbiddenFunctionsSniff now has a public property called forbiddenFunctions (request #263) - -- Override the property in a ruleset.xml file to define forbidden functions and their replacements - -- A replacement of NULL indicates that no replacement is available - -- e.g., value="delete=>unset,print=>echo,create_function=>null" - -- Custom sniffs overriding this one will need to change the visibility of their member var - - Improved closure support in Generic ScopeIndentSniff - - Improved indented PHP tag support in Generic ScopeIndentSniff - - Improved fixing of mixed line indents in Generic ScopeIndentSniff - - Added conflict detection to the file fixer - -- If 2 sniffs look to be conflicting, one change will be ignored to allow a fix to occur - - Generic CamelCapsFunctionNameSniff now ignores a single leading underscore - -- Thanks to Alex Slobodiskiy for the patch - - Standards can now be located within hidden directories (further fix for bug #20323) - -- Thanks to Klaus Purer for the patch - - Sniff ignore patterns now replace Win dir separators like file ignore patterns already did - - Exclude patterns now use backtick delimiters, allowing all special characters to work correctly again - -- Thanks to Jeremy Edgell for the patch - - Errors converted to warnings in a ruleset (and vice versa) now retain their fixable status - -- Thanks to Alexander Obuhovich for the patch - - Squiz ConcatenationSpacingSniff now has a setting to specify how many spaces there should around concat operators - -- Default remains at 0 - -- Override the "spacing" setting in a ruleset.xml file to change - - Added auto-fixes for Squiz InlineCommentSniff - - Generic DocCommentSniff now correctly fixes additional blank lines at the end of a comment - - Squiz OperatorBracketSniff now correctly fixes operations that include arrays - - Zend ClosingTagSniff fix now correctly leaves closing tags when followed by HTML - - Added Generic SyntaxSniff to check for syntax errors in PHP files - -- Thanks to Blaine Schmeisser for the contribution - - Added Generic OneTraitPerFileSniff to check that only one trait is defined in each file - -- Thanks to Alexander Obuhovich for the contribution - - Squiz DiscouragedFunctionsSniff now warns about var_dump() - - PEAR ValidFunctionNameSniff no longer throws an error for _() - - Squiz and PEAR FunctionCommentSniffs now support _() - - Generic DisallowTabIndentSniff now checks for, and fixes, mixed indents again - - Generic UpperCaseConstantSniff and LowerCaseConstantSniff now ignore function names - - Fixed bug #243 : Missing DocBlock not detected - - Fixed bug #248 : FunctionCommentSniff expects ampersand on param name - - Fixed bug #265 : False positives with type hints in ForbiddenFunctionsSniff - - Fixed bug #20373 : Inline comment sniff tab handling way - - Fixed bug #20377 : Error when trying to execute phpcs with report=json - - Fixed bug #20378 : Report appended to existing file if no errors found in run - - Fixed bug #20381 : Invalid "Comment closer must be on a new line" - -- Thanks to Brad Kent for the patch - - Fixed bug #20402 : SVN pre-commit hook fails due to unknown argument error - - - - - 2.0.0RC1 - 2.0.0RC1 - - - beta - beta - - 2014-08-06 - BSD License - - - PHPCBF will now fix incorrect newline characters in a file - - PHPCBF now exists cleanly when there are no errors to fix - - Added phpcbf.bat file for Windows - - Verbose option no longer errors when using a phar file with a space in the path - - Fixed a reporting error when using HHVM - -- Thanks to Martins Sipenko for the patch - - addFixableError() and addFixableWarning() now only return true if the fixer is enabled - -- Saves checking ($phpcsFile->fixer->enabled === true) before every fix - - Added addErrorOnLine() and addWarningOnLine() to add a non-fixable violation to a line at column 1 - -- Useful if you are generating errors using an external tool or parser and only know line numbers - -- Thanks to Ondřej Mirtes for the patch - - CSS tokenizer now identifies embedded PHP code using the new T_EMBEDDED_PHP token type - -- The entire string of PHP is contained in a single token - - PHP tokenizer contains better detection of short array syntax - - Unit test runner now also test any standards installed under the installed_paths config var - - Exclude patterns now use {} delimiters, allowing the | special character to work correctly again - - The filtering component of the --extensions argument is now ignored again when passing filenames - -- Can still be used to specify a custom tokenizer for each extension when passing filenames - -- If no tokenizer is specified, default values will be used for common file extensions - - Diff report now produces relative paths on Windows, where possible (further fix for bug #20234) - - If a token's content has been modified by the tab-width setting, it will now have an orig_content in the tokens array - - Generic DisallowSpaceIndent and DisallowTabIndent sniffs now check original indent content even when tab-width is set - -- Previously, setting --tab-width would force both to check the indent as spaces - - Fixed a problem where PHPCBF could replace tabs with too many spaces when changing indents - - Fixed a problem that could occur with line numbers when using HHVM to check files with Windows newline characters - - Removed use of sys_get_temp_dir() as this is not supported by the min PHP version - - Squiz ArrayDeclarationSniff now supports short array syntax - - Squiz ControlSignatureSniff no longer uses the Abstract Pattern sniff - -- If you are extending this sniff, you'll need to rewrite your code - -- The rewrite allows this sniff to fix all control structure formatting issues it finds - - The installed_paths config var now accepts relative paths - -- The paths are relative to the PHP_CodeSniffer install directory - -- Thanks to Weston Ruter for the patch - - Generic ScopeIndentSniff now accounts for different open tag indents - - PEAR FunctionDeclarationSniff now ignores short arrays when checking indent - -- Thanks to Daniel Tschinder for the patch - - PSR2 FunctionCallSignatureSniff now treats multi-line strings as a single-line argument, like arrays and closures - -- Thanks to Dawid Nowak for the patch - - PSR2 UseDeclarationSniff now checks for a single space after the USE keyword - - Generic ForbiddenFunctionsSniff now detects calls to functions in the global namespace - -- Thanks to Ole Martin Handeland for the patch - - Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore namespaces beginning with TRUE/FALSE/NULL - -- Thanks to Renan Gonçalves for the patch - - Squiz InlineCommentSniff no longer requires a blank line after post-statement comments (request #20299) - - Squiz SelfMemberReferenceSniff now works correctly with namespaces - - Squiz FunctionCommentSniff is now more relaxed when checking namespaced type hints - - Tab characters are now encoded in abstract pattern errors messages - -- Thanks to Blaine Schmeisser for the patch - - Invalid sniff codes passed to --sniffs now show a friendly error message (request #20313) - - Generic LineLengthSniff now shows a warning if the iconv module is disabled (request #20314) - - Source report no longer shows errors if category or sniff names ends in an uppercase error - -- Thanks to Jonathan Marcil for the patch - - Fixed bug #20261 : phpcbf has an endless fixing loop - - Fixed bug #20268 : Incorrect documentation titles in PEAR documentation - - Fixed bug #20296 : new array notion in function comma check fails - - Fixed bug #20297 : phar does not work when renamed it to phpcs - - Fixed bug #20307 : PHP_CodeSniffer_Standards_AbstractVariableSniff analyze traits - - Fixed bug #20308 : Squiz.ValidVariableNameSniff - wrong variable usage - - Fixed bug #20309 : Use "member variable" term in sniff "processMemberVar" method - - Fixed bug #20310 : PSR2 does not check for space after function name - - Fixed bug #20322 : Display rules set to type=error even when suppressing warnings - - Fixed bug #20323 : PHPCS tries to load sniffs from hidden directories - - Fixed bug #20346 : Fixer endless loop with Squiz.CSS sniffs - - Fixed bug #20355 : No sniffs are registered with PHAR on Windows - - - - - 2.0.0a2 - 2.0.0a2 - - - alpha - alpha - - 2014-05-01 - BSD License - - - Added report type --report=info to show information about the checked code to make building a standard easier - -- Checks a number of things, such as what line length you use, and spacing are brackets, but not everything - -- Still highly experimental - - Generic LineLengthSniff now shows warnings for long lines referring to licence and VCS information - -- It previously ignored these lines, but at the expense of performance - - Generic DisallowTabIndent and DisallowSpaceIndent sniffs no longer error when detecting mixed indent types - -- Only the first type of indent found on a line (space or indent) is considered - - Lots of little performance improvements that can add up to a substantial saving over large code bases - -- Added a "length" array index to tokens so you don't need to call strlen() of them, or deal with encoding - -- Can now use isset() to find tokens inside the PHP_CodeSniffer_Tokens static vars instead of in_array() - - Custom reports can now specify a $recordErrors member var; this previously only worked for built-in reports - -- When set to FALSE, error messages will not be recorded and only totals will be returned - -- This can save significant memory while processing a large code base - - Removed dependence on PHP_Timer - - PHP tokenizer now supports DEFAULT statements opened with a T_SEMICOLON - - The Squiz and PHPCS standards have increased the max padding for statement alignment from 8 to 12 - - Squiz EchoedStringsSniff now supports statements without a semicolon, such as PHP embedded in HTML - - Squiz DoubleQuoteUsageSniff now properly replaces escaped double quotes when fixing a doubled quoted string - - Improved detection of nested IF statements that use the alternate IF/ENDIF syntax - - PSR1 CamelCapsMethodNameSniff now ignores magic methods - -- Thanks to Eser Ozvataf for the patch - - PSR1 SideEffectsSniff now ignores methods named define() - - PSR1 and PEAR ClassDeclarationSniffs now support traits (request #20208) - - PSR2 ControlStructureSpacingSniff now allows newlines before/after parentheses - -- Thanks to Maurus Cuelenaere for the patch - - PSR2 ControlStructureSpacingSniff now checks TRY and CATCH statements - - Squiz SuperfluousWhitespaceSniff now detects whitespace at the end of block comment lines - -- Thanks to Klaus Purer for the patch - - Squiz LowercasePHPFunctionsSniff no longer reports errors for namespaced functions - -- Thanks to Max Galbusera for the patch - - Squiz SwitchDeclarationSniff now allows exit() as a breaking statement for case/default - - Squiz ValidVariableNameSniff and Zend ValidVariableNameSniff now ignore additional PHP reserved vars - -- Thanks to Mikuláš Dítě and Adrian Crepaz for the patch - - Sniff code Squiz.WhiteSpace.MemberVarSpacing.After changed to Squiz.WhiteSpace.MemberVarSpacing.Incorrect (request #20241) - - Fixed bug #20200 : Invalid JSON produced with specific error message - - Fixed bug #20204 : Ruleset exclude checks are case sensitive - - Fixed bug #20213 : Invalid error, Inline IF must be declared on single line - - Fixed bug #20225 : array_merge() that takes more than one line generates error - - Fixed bug #20230 : Squiz ControlStructureSpacing sniff assumes specific condition formatting - - Fixed bug #20234 : phpcbf patch command absolute paths - - Fixed bug #20240 : Squiz block comment sniff fails when newline present - - Fixed bug #20247 : The Squiz.WhiteSpace.ControlStructureSpacing sniff and do-while - -- Thanks to Alexander Obuhovich for the patch - - Fixed bug #20248 : The Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff sniff and empty scope - - Fixed bug #20252 : Unitialized string offset when package name starts with underscore - - - - - 2.0.0a1 - 2.0.0a1 - - - alpha - alpha - - 2014-02-05 - BSD License - - - Added the phpcbf script to automatically fix many errors found by the phpcs script - - Added report type --report=diff to show suggested changes to fix coding standard violations - - The --report argument now allows for custom reports to be used - -- Use the full path to your custom report class as the report name - - The --extensions argument is now respected when passing filenames; not just with directories - - The --extensions argument now allows you to specify the tokenizer for each extension - -- e.g., --extensions=module/php,es/js - - Command line arguments can now be set in ruleset files - -- e.g., arg name="report" value="summary" (print summary report; same as --report=summary) - -- e.g., arg value="sp" (print source and progress information; same as -sp) - -- The -vvv, --sniffs, --standard and -l command line arguments cannot be set in this way - - Sniff process() methods can not optionally return a token to ignore up to - -- If returned, the sniff will not be executed again until the passed token is reached in the file - -- Useful if you are looking for tokens like T_OPEN_TAG but only want to process the first one - - Removed the comment parser classes and replaced it with a simple comment tokenizer - -- T_DOC_COMMENT tokens are now tokenized into T_DOC_COMMENT_* tokens so they can be used more easily - -- This change requires a significant rewrite of sniffs that use the comment parser - -- This change requires minor changes to sniffs that listen for T_DOC_COMMENT tokens directly - - Added Generic DocCommentSniff to check generic doc block formatting - -- Removed doc block formatting checks from PEAR ClassCommentSniff - -- Removed doc block formatting checks from PEAR FileCommentSniff - -- Removed doc block formatting checks from PEAR FunctionCommentSniff - -- Removed doc block formatting checks from Squiz ClassCommentSniff - -- Removed doc block formatting checks from Squiz FileCommentSniff - -- Removed doc block formatting checks from Squiz FunctionCommentSniff - -- Removed doc block formatting checks from Squiz VariableCommentSniff - - Squiz DocCommentAlignmentSniff has had its error codes changed - -- NoSpaceBeforeTag becomes NoSpaceAfterStar - -- SpaceBeforeTag becomes SpaceAfterStar - -- SpaceBeforeAsterisk becomes SpaceBeforeStar - - Generic MultipleStatementAlignment now aligns assignments within a block so they fit within their max padding setting - -- The sniff previously requested the padding as 1 space if max padding was exceeded - -- It now aligns the assignment with surrounding assignments if it can - -- Removed property ignoreMultiline as multi-line assignments are now handled correctly and should not be ignored - - Squiz FunctionClosingBraceSpaceSniff now requires a blank line before the brace in all cases except function args - - Added error Squiz.Commenting.ClassComment.SpacingAfter to ensure there are no blank lines after a class comment - - Added error Squiz.WhiteSpace.MemberVarSpacing.AfterComment to ensure there are no blank lines after a member var comment - -- Fixes have also been corrected to not strip the member var comment or indent under some circumstances - -- Thanks to Mark Scherer for help with this fix - - Added error Squiz.Commenting.FunctionCommentThrowTag.Missing to ensure a throw is documented - - Removed error Squiz.Commenting.FunctionCommentThrowTag.WrongType - - Content passed via STDIN can now specify the filename to use so that sniffs can run the correct filename checks - -- Ensure the first line of the content is: phpcs_input_file: /path/to/file - - Squiz coding standard now enforces no closing PHP tag at the end of a pure PHP file - - Squiz coding standard now enforces a single newline character at the end of the file - - Squiz ClassDeclarationSniff no longer checks for a PHP ending tag after a class definition - - Squiz ControlStructureSpacingSniff now checks TRY and CATCH statements as well - - Removed MySource ChannelExceptionSniff - - - - - 1.5.6 - 1.5.6 - - - stable - stable - - 2014-12-05 - BSD License - - - JS tokenizer now detects xor statements correctly - - The --config-show command now pretty-prints the config values - -- Thanks to Ken Guest for the patch - - Setting and removing config values now catches exceptions if the config file is not writable - -- Thanks to Ken Guest for the patch - - Setting and removing config values now prints a message to confirm the action and show old values - - You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment - -- When the comment is found, the comment line and the following line will be ignored - -- Thanks to Andy Bulford for the contribution - - Generic ConstructorNameSniff no longer errors for PHP4 style constructors when __construct() is present - -- Thanks to Thibaud Fabre for the patch - - Fixed bug #280 : The --config-show option generates error when there is no config file - - Fixed bug #306 : File containing only a namespace declaration raises undefined index notice - - Fixed bug #308 : Squiz InlineIfDeclarationSniff fails on ternary operators inside closure - - Fixed bug #310 : Variadics not recognized by tokenizer - - Fixed bug #311 : Suppression of function prototype breaks checking of lines within function - - - - - 1.5.5 - 1.5.5 - - - stable - stable - - 2014-09-25 - BSD License - - - PHP tokenizer no longer converts class/function names to special tokens types - -- Class/function names such as parent and true would become special tokens such as T_PARENT and T_TRUE - - Improved closure support in Generic ScopeIndentSniff - - Improved indented PHP tag support in Generic ScopeIndentSniff - - Generic CamelCapsFunctionNameSniff now ignores a single leading underscore - -- Thanks to Alex Slobodiskiy for the patch - - Standards can now be located within hidden directories (further fix for bug #20323) - -- Thanks to Klaus Purer for the patch - - Added Generic SyntaxSniff to check for syntax errors in PHP files - -- Thanks to Blaine Schmeisser for the contribution - - Squiz DiscouragedFunctionsSniff now warns about var_dump() - - PEAR ValidFunctionNameSniff no longer throws an error for _() - - Squiz and PEAR FunctionCommentSnif now support _() - - Generic UpperCaseConstantSniff and LowerCaseConstantSniff now ignore function names - - Fixed bug #248 : FunctionCommentSniff expects ampersand on param name - - Fixed bug #265 : False positives with type hints in ForbiddenFunctionsSniff - - Fixed bug #20373 : Inline comment sniff tab handling way - - Fixed bug #20378 : Report appended to existing file if no errors found in run - - Fixed bug #20381 : Invalid "Comment closer must be on a new line" - -- Thanks to Brad Kent for the patch - - Fixed bug #20386 : Squiz.Commenting.ClassComment.SpacingBefore thrown if first block comment - - - - - 1.5.4 - 1.5.4 - - - stable - stable - - 2014-08-06 - BSD License - - - Removed use of sys_get_temp_dir() as this is not supported by the min PHP version - - The installed_paths config var now accepts relative paths - -- The paths are relative to the PHP_CodeSniffer install directory - -- Thanks to Weston Ruter for the patch - - Generic ScopeIndentSniff now accounts for different open tag indents - - PEAR FunctionDeclarationSniff now ignores short arrays when checking indent - -- Thanks to Daniel Tschinder for the patch - - PSR2 FunctionCallSignatureSniff now treats multi-line strings as a single-line argument, like arrays and closures - -- Thanks to Dawid Nowak for the patch - - Generic ForbiddenFunctionsSniff now detects calls to functions in the global namespace - -- Thanks to Ole Martin Handeland for the patch - - Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore namespaces beginning with TRUE/FALSE/NULL - -- Thanks to Renan Gonçalves for the patch - - Squiz InlineCommentSniff no longer requires a blank line after post-statement comments (request #20299) - - Squiz SelfMemberReferenceSniff now works correctly with namespaces - - Tab characters are now encoded in abstract pattern errors messages - -- Thanks to Blaine Schmeisser for the patch - - Invalid sniff codes passed to --sniffs now show a friendly error message (request #20313) - - Generic LineLengthSniff now shows a warning if the iconv module is disabled (request #20314) - - Source report no longer shows errors if category or sniff names ends in an uppercase error - -- Thanks to Jonathan Marcil for the patch - - Fixed bug #20268 : Incorrect documentation titles in PEAR documentation - - Fixed bug #20296 : new array notion in function comma check fails - - Fixed bug #20307 : PHP_CodeSniffer_Standards_AbstractVariableSniff analyze traits - - Fixed bug #20308 : Squiz.ValidVariableNameSniff - wrong variable usage - - Fixed bug #20309 : Use "member variable" term in sniff "processMemberVar" method - - Fixed bug #20310 : PSR2 does not check for space after function name - - Fixed bug #20322 : Display rules set to type=error even when suppressing warnings - - Fixed bug #20323 : PHPCS tries to load sniffs from hidden directories - - - - - 1.5.3 - 1.5.3 - - - stable - stable - - 2014-05-01 - BSD License - - - Improved detection of nested IF statements that use the alternate IF/ENDIF syntax - - PHP tokenizer now supports DEFAULT statements opened with a T_SEMICOLON - - PSR1 CamelCapsMethodNameSniff now ignores magic methods - -- Thanks to Eser Ozvataf for the patch - - PSR1 SideEffectsSniff now ignores methods named define() - - PSR1 and PEAR ClassDeclarationSniffs now support traits (request #20208) - - PSR2 ControlStructureSpacingSniff now allows newlines before/after parentheses - -- Thanks to Maurus Cuelenaere for the patch - - Squiz LowercasePHPFunctionsSniff no longer reports errors for namespaced functions - -- Thanks to Max Galbusera for the patch - - Squiz SwitchDeclarationSniff now allows exit() as a breaking statement for case/default - - Squiz ValidVariableNameSniff and Zend ValidVariableNameSniff now ignore additional PHP reserved vars - -- Thanks to Mikuláš Dítě and Adrian Crepaz for the patch - - Sniff code Squiz.WhiteSpace.MemberVarSpacing.After changed to Squiz.WhiteSpace.MemberVarSpacing.Incorrect (request #20241) - - Fixed bug #20200 : Invalid JSON produced with specific error message - - Fixed bug #20204 : Ruleset exclude checks are case sensitive - - Fixed bug #20213 : Invalid error, Inline IF must be declared on single line - - Fixed bug #20225 : array_merge() that takes more than one line generates error - - Fixed bug #20230 : Squiz ControlStructureSpacing sniff assumes specific condition formatting - - Fixed bug #20240 : Squiz block comment sniff fails when newline present - - Fixed bug #20247 : The Squiz.WhiteSpace.ControlStructureSpacing sniff and do-while - -- Thanks to Alexander Obuhovich for the patch - - Fixed bug #20248 : The Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff sniff and empty scope - - Fixed bug #20252 : Uninitialized string offset when package name starts with underscore - - - - - 1.5.2 - 1.5.2 - - - stable - stable - - 2014-02-05 - BSD License - - - Improved support for the PHP 5.5. classname::class syntax - -- PSR2 SwitchDeclarationSniff no longer throws errors when this syntax is used in CASE conditions - - Improved support for negative checks of instanceOf in Squiz ComparisonOperatorUsageSniff - -- Thanks to Martin Winkel for the patch - - Generic FunctionCallArgumentSpacingSniff now longer complains about space before comma when using here/nowdocs - -- Thanks to Richard van Velzen for the patch - - Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore class constants - -- Thanks to Kristopher Wilson for the patch - - PEAR FunctionCallSignatureSniff now has settings to specify how many spaces should appear before/after parentheses - -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - -- Default remains at 0 for both - -- Thanks to Astinus Eberhard for the patch - - PSR2 ControlStructureSpacingSniff now has settings to specify how many spaces should appear before/after parentheses - -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - -- Default remains at 0 for both - -- Thanks to Astinus Eberhard for the patch - - Squiz ForEachLoopDeclarationSniff now has settings to specify how many spaces should appear before/after parentheses - -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - -- Default remains at 0 for both - -- Thanks to Astinus Eberhard for the patch - - Squiz ForLoopDeclarationSniff now has settings to specify how many spaces should appear before/after parentheses - -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - -- Default remains at 0 for both - -- Thanks to Astinus Eberhard for the patch - - Squiz FunctionDeclarationArgumentSpacingSniff now has settings to specify how many spaces should appear before/after parentheses - -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change - -- Default remains at 0 for both - -- Thanks to Astinus Eberhard for the patch - - Removed UnusedFunctionParameter, CyclomaticComplexity and NestingLevel from the Squiz standard - - Generic FixmeSniff and TodoSniff now work correctly with accented characters - - Fixed bug #20145 : Custom ruleset preferences directory over installed standard - - Fixed bug #20147 : phpcs-svn-pre-commit - no more default error report - - Fixed bug #20151 : Problem handling "if(): ... else: ... endif;" syntax - - Fixed bug #20190 : Invalid regex in Squiz_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff - - - - - 1.5.1 - 1.5.1 - - - stable - stable - - 2013-12-12 - BSD License - - - Config values can now be set at runtime using the command line argument [--runtime-set key value] - -- Runtime values are the same as config values, but are not written to the main config file - -- Thanks to Wim Godden for the patch - - Config values can now be set in ruleset files - -- e.g., config name="zend_ca_path" value="/path/to/ZendCodeAnalyzer" - -- Can not be used to set config values that override command line values, such as show_warnings - -- Thanks to Jonathan Marcil for helping with the patch - - Added a new installed_paths config value to allow for the setting of directories that contain standards - -- By default, standards have to be installed into the CodeSniffer/Standards directory to be considered installed - -- New config value allows a list of paths to be set in addition to this internal path - -- Installed standards appear when using the -i arg, and can be referenced in rulesets using only their name - -- Set paths by running: phpcs --config-set installed_paths /path/one,/path/two,... - - PSR2 ClassDeclarationSniff now allows a list of extended interfaces to be split across multiple lines - - Squiz DoubleQuoteUsageSniff now allows \b in double quoted strings - - Generic ForbiddenFunctionsSniff now ignores object creation - -- This is a further fix for bug #20100 : incorrect Function mysql() has been deprecated report - - Fixed bug #20136 : Squiz_Sniffs_WhiteSpace_ScopeKeywordSpacingSniff and Traits - - Fixed bug #20138 : Protected property underscore and camel caps issue (in trait with Zend) - -- Thanks to Gaetan Rousseau for the patch - - Fixed bug #20139 : No report file generated on success - - - - - 1.5.0 - 1.5.0 - - - stable - stable - - 2013-11-28 - BSD License - - - Doc generation is now working again for installed standards - -- Includes a fix for limiting the docs to specific sniffs - - Generic ScopeIndentSniff now allows for ignored tokens to be set via ruleset.xml files - -- E.g., to ignore comments, override a property using: - -- name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT" - - PSR2 standard now ignores comments when checking indentation rules - - Generic UpperCaseConstantNameSniff no longer reports errors where constants are used (request #20090) - -- It still reports errors where constants are defined - - Individual messages can now be excluded in ruleset.xml files using the exclude tag (request #20091) - -- Setting message severity to 0 continues to be supported - - Squiz OperatorSpacingSniff no longer throws errors for the ?: short ternary operator - -- Thanks to Antoine Musso for the patch - - Comment parser now supports non-English characters when splitting comment lines into words - -- Thanks to Nik Sun for the patch - - Exit statements are now recognised as valid closers for CASE and DEFAULT blocks - -- Thanks to Maksim Kochkin for the patch - - PHP_CodeSniffer_CLI::process() can now be passed an incomplete array of CLI values - -- Missing values will be set to the CLI defaults - -- Thanks to Maksim Kochkin for the patch - - Fixed bug #20093 : Bug with ternary operator token - - Fixed bug #20097 : CLI.php throws error in php 5.2 - - Fixed bug #20100 : incorrect Function mysql() has been deprecated report - - Fixed bug #20119 : PHP warning: invalid argument to str_repeat() in SVN blame report with -s - - Fixed bug #20123 : PSR2 complains about an empty second statement in for-loop - - Fixed bug #20131 : PHP errors in svnblame report, if there are files not under version control - - Fixed bug #20133 : Allow "HG: hg_id" as value for @version tag - - - - - 1.5.0RC4 - 1.5.0RC4 - - - beta - beta - - 2013-09-26 - BSD License - - - You can now restrict violations to individual sniff codes using the --sniffs command line argument - -- Previously, this only restricted violations to an entire sniff and not individual messages - -- If you have scripts calling PHP_CodeSniffer::process() or creating PHP_CodeSniffer_File objects, you must update your code - -- The array of restrictions passed to PHP_CodeSniffer::process() must now be an array of sniff codes instead of class names - -- The PHP_CodeSniffer_File::__construct() method now requires an array of restrictions to be passed - - Doc generation is now working again - - Progress information now shows the percentage complete at the end of each line - - Added report type --report=junit to show the error list in a JUnit compatible format - -- Thanks to Oleg Lobach for the contribution - - Added support for the PHP 5.4 callable type hint - - Fixed problem where some file content could be ignored when checking STDIN - - Version information is now printed when installed via composer or run from a Git clone (request #20050) - - Added Squiz DisallowBooleanStatementSniff to ban boolean operators outside of control structure conditions - - The CSS tokenizer is now more reliable when encountering 'list' and 'break' strings - - Coding standard ignore comments can now appear instead doc blocks as well as inline comments - -- Thanks to Stuart Langley for the patch - - Generic LineLengthSniff now ignores SVN URL and Head URL comments - -- Thanks to Karl DeBisschop for the patch - - PEAR MultiLineConditionSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Szabolcs Sulik for the patch - - PEAR MultiLineAssignmentSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Szabolcs Sulik for the patch - - PEAR FunctionDeclarationSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Szabolcs Sulik for the patch - - Squiz SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Szabolcs Sulik for the patch - - Squiz CSS IndentationSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Hugo Fonseca for the patch - - Squiz and MySource File and Function comment sniffs now allow all tags and don't require a particular licence - - Squiz standard now allows lines to be 120 characters long before warning; up from 85 - - Squiz LowercaseStyleDefinitionSniff no longer throws errors for class names in nested style definitions - - Squiz ClassFileNameSniff no longer throws errors when checking STDIN - - Squiz CSS sniffs no longer generate errors for IE filters - - Squiz CSS IndentationSniff no longer sees comments as blank lines - - Squiz LogicalOperatorSpacingSniff now ignores whitespace at the end of a line - - Squiz.Scope.MethodScope.Missing error message now mentions 'visibility' instead of 'scope modifier' - -- Thanks to Renat Akhmedyanov for the patch - - Added support for the PSR2 multi-line arguments errata - - The PSR2 standard no longer throws errors for additional spacing after a type hint - - PSR UseDeclarationSniff no longer throws errors for USE statements inside TRAITs - - Fixed cases where code was incorrectly assigned the T_GOTO_LABEL token when used in a complex CASE condition - - Fixed bug #20026 : Check for multi-line arrays that should be single-line is slightly wrong - -- Adds new error message for single-line arrays that end with a comma - - Fixed bug #20029 : ForbiddenFunction sniff incorrectly recognizes methods in USE clauses - - Fixed bug #20043 : Mis-interpretation of Foo::class - - Fixed bug #20044 : PSR1 camelCase check does not ignore leading underscores - - Fixed bug #20045 : Errors about indentation for closures with multi-line 'use' in functions - - Fixed bug #20051 : Undefined index: scope_opener / scope_closer - -- Thanks to Anthon Pang for the patch - - - - - 1.5.0RC3 - 1.5.0RC3 - - - beta - beta - - 2013-07-25 - BSD License - - - Added report type --report=json to show the error list and total counts for all checked files - -- Thanks to Jeffrey Fisher for the contribution - - PHP_CodeSniffer::isCamelCaps now allows for acronyms at the start of a string if the strict flag is FALSE - -- acronyms are defined as at least 2 uppercase characters in a row - -- e.g., the following is now valid camel caps with strict set to FALSE: XMLParser - - The PHP tokenizer now tokenizes goto labels as T_GOTO_LABEL instead of T_STRING followed by T_COLON - - The JS tokenizer now has support for the T_THROW token - - Symlinked directories inside CodeSniffer/Standards and in ruleset.xml files are now supported - -- Only available since PHP 5.2.11 and 5.3.1 - -- Thanks to Maik Penz for the patch - - The JS tokenizer now correctly identifies T_INLINE_ELSE tokens instead of leaving them as T_COLON - -- Thanks to Arnout Boks for the patch - - Explaining a standard (phpcs -e) that uses namespaces now works correctly - - Restricting a check to specific sniffs (phpcs --sniffs=...) now works correctly with namespaced sniffs - -- Thanks to Maik Penz for the patch - - Docs added for the entire Generic standard, and many sniffs from other standards are now documented as well - -- Thanks to Spencer Rinehart for the contribution - - Clearer error message for when the sniff class name does not match the directory structure - - Generated HTML docs now correctly show the open PHP tag in code comparison blocks - - Added Generic InlineHTMLSniff to ensure a file only contains PHP code - - Added Squiz ShorthandSizeSniff to check that CSS sizes are using shorthand notation only when 1 or 2 values are used - - Added Squiz ForbiddenStylesSniff to ban the use of some deprecated browser-specific styles - - Added Squiz NamedColoursSniff to ban the use of colour names - - PSR2 standard no longer enforces no whitespace between the closing parenthesis of a function call and the semicolon - - PSR2 ClassDeclarationSniff now ignores empty classes when checking the end brace position - - PSR2 SwitchDeclarationSniff no longer reports errors for empty lines between CASE statements - - PEAR ObjectOperatorIndentSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the indent setting in a ruleset.xml file to change - -- Thanks to Andrey Mindubaev for the patch - - Squiz FileExtensionSniff now supports traits - -- Thanks to Lucas Green for the patch - - Squiz ArrayDeclarationSniff no longer reports errors for no comma at the end of a line that contains a function call - - Squiz SwitchDeclarationSniff now supports T_CONTINUE and T_THROW as valid case/default breaking statements - - Squiz CommentedOutCodeSniff is now better at ignoring commented out HTML, XML and regular expressions - - Squiz DisallowComparisonAssignmentSniff no longer throws errors for the third expression in a FOR statement - - Squiz ColourDefinitionSniff no longer throws errors for some CSS class names - - Squiz ControlStructureSpacingSniff now supports all types of CASE/DEFAULT breaking statements - - Generic CallTimePassByReferenceSniff now reports errors for functions called using a variable - -- Thanks to Maik Penz for the patch - - Generic ConstructorNameSniff no longer throws a notice for abstract constructors inside abstract classes - -- Thanks to Spencer Rinehart for the patch - - Squiz ComparisonOperatorUsageSniff now checks inside elseif statements - -- Thanks to Arnout Boks for the patch - - Squiz OperatorSpacingSniff now reports errors for no spacing around inline then and else tokens - -- Thanks to Arnout Boks for the patch - - Fixed bug #19811 : Comments not ignored in all cases in AbstractPatternSniff - -- Thanks to Erik Wiffin for the patch - - Fixed bug #19892 : ELSE with no braces causes incorrect SWITCH break statement indentation error - - Fixed bug #19897 : Indenting warnings in templates not consistent - - Fixed bug #19908 : PEAR MultiLineCondition Does Not Apply elseif - - Fixed bug #19930 : option --report-file generate an empty file - - Fixed bug #19935 : notify-send reports do not vanish in gnome-shell - -- Thanks to Christian Weiske for the patch - - Fixed bug #19944 : docblock squiz sniff "return void" trips over return in lambda function - - Fixed bug #19953 : PSR2 - Spaces before interface name for abstract class - - Fixed bug #19956 : phpcs warns for Type Hint missing Resource - - Fixed bug #19957 : Does not understand trait method aliasing - - Fixed bug #19968 : Permission denied on excluded directory - - Fixed bug #19969 : Sniffs with namespace not recognized in reports - - Fixed bug #19997 : Class names incorrectly detected as constants - - - - - 1.5.0RC2 - 1.5.0RC2 - - - beta - beta - - 2013-04-04 - BSD License - - - Ruleset processing has been rewritten to be more predictable - -- Provides much better support for relative paths inside ruleset files - -- May mean that sniffs that were previously ignored are now being included when importing external rulesets - -- Ruleset processing output can be seen by using the -vv command line argument - -- Internal sniff registering functions have all changed, so please review custom scripts - - You can now pass multiple coding standards on the command line, comma separated (request #19144) - -- Works with built-in or custom standards and rulesets, or a mix of both - - You can now exclude directories or whole standards in a ruleset XML file (request #19731) - -- e.g., exclude "Generic.Commenting" or just "Generic" - -- You can also pass in a path to a directory instead, if you know it - - Added Generic LowerCaseKeywordSniff to ensure all PHP keywords are defined in lowercase - -- The PSR2 and Squiz standards now use this sniff - - Added Generic SAPIUsageSniff to ensure the PHP_SAPI constant is used instead of php_sapi_name() (request #19863) - - Squiz FunctionSpacingSniff now has a setting to specify how many lines there should between functions (request #19843) - -- Default remains at 2 - -- Override the "spacing" setting in a ruleset.xml file to change - - Squiz LowercasePHPFunctionSniff no longer throws errors for the limited set of PHP keywords it was checking - -- Add a rule for Generic.PHP.LowerCaseKeyword to your ruleset to replicate this functionality - - Added support for the PHP 5.4 T_CALLABLE token so it can be used in lower PHP versions - - Generic EndFileNoNewlineSniff now supports checking of CSS and JS files - - PSR2 SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the indent setting in a ruleset.xml file to change - -- Thanks to Asher Snyder for the patch - - Generic ScopeIndentSniff now has a setting to specify a list of tokens that should be ignored - -- The first token on the line is checked and the whole line is ignored if the token is in the array - -- Thanks to Eloy Lafuente for the patch - - Squiz LowercaseClassKeywordsSniff now checks for the TRAIT keyword - -- Thanks to Anthon Pang for the patch - - If you create your own PHP_CodeSniffer object, PHPCS will no longer exit when an unknown argument is found - -- This allows you to create wrapper scripts for PHPCS more easily - - PSR2 MethodDeclarationSniff no longer generates a notice for methods named "_" - -- Thanks to Bart S for the patch - - Squiz BlockCommentSniff no longer reports that a blank line between a scope closer and block comment is invalid - - Generic DuplicateClassNameSniff no longer reports an invalid error if multiple PHP open tags exist in a file - - Generic DuplicateClassNameSniff no longer reports duplicate errors if multiple PHP open tags exist in a file - - Fixed bug #19819 : Freeze with syntax error in use statement - - Fixed bug #19820 : Wrong message level in Generic_Sniffs_CodeAnalysis_EmptyStatementSniff - - Fixed bug #19859 : CodeSniffer::setIgnorePatterns API changed - - Fixed bug #19871 : findExtendedClassName doesn't return FQCN on namespaced classes - - Fixed bug #19879 : bitwise and operator interpreted as reference by value - - - - - 1.5.0RC1 - 1.5.0RC1 - - - beta - beta - - 2013-02-08 - BSD License - - - Reports have been completely rewritten to consume far less memory - -- Each report is incrementally written to the file system during a run and then printed out when the run ends - -- There is no longer a need to keep the list of errors and warnings in memory during a run - - Multi-file sniff support has been removed because they are too memory intensive - -- If you have a custom multi-file sniff, you can convert it into a standard sniff quite easily - -- See CodeSniffer/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php for an example - - - - - 1.4.8 - 1.4.8 - - - stable - stable - - 2013-11-26 - BSD License - - - Generic ScopeIndentSniff now allows for ignored tokens to be set via ruleset.xml files - -- E.g., to ignore comments, override a property using: - -- name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT" - - PSR2 standard now ignores comments when checking indentation rules - - Squiz OperatorSpacingSniff no longer throws errors for the ?: short ternary operator - -- Thanks to Antoine Musso for the patch - - Comment parser now supports non-English characters when splitting comment lines into words - -- Thanks to Nik Sun for the patch - - Exit statements are now recognised as valid closers for CASE and DEFAULT blocks - -- Thanks to Maksim Kochkin for the patch - - PHP_CodeSniffer_CLI::process() can now be passed an incomplete array of CLI values - -- Missing values will be set to the CLI defaults - -- Thanks to Maksim Kochkin for the patch - - Fixed bug #20097 : CLI.php throws error in php 5.2 - - Fixed bug #20100 : incorrect Function mysql() has been deprecated report - - Fixed bug #20119 : PHP warning: invalid argument to str_repeat() in SVN blame report with -s - - Fixed bug #20123 : PSR2 complains about an empty second statement in for-loop - - Fixed bug #20131 : PHP errors in svnblame report, if there are files not under version control - - Fixed bug #20133 : Allow "HG: hg_id" as value for @version tag - - - - - 1.4.7 - 1.4.7 - - - stable - stable - - 2013-09-26 - BSD License - - - Added report type --report=junit to show the error list in a JUnit compatible format - -- Thanks to Oleg Lobach for the contribution - - Added support for the PHP 5.4 callable type hint - - Fixed problem where some file content could be ignored when checking STDIN - - Version information is now printed when installed via composer or run from a Git clone (request #20050) - - The CSS tokenizer is now more reliable when encountering 'list' and 'break' strings - - Coding standard ignore comments can now appear instead doc blocks as well as inline comments - -- Thanks to Stuart Langley for the patch - - Generic LineLengthSniff now ignores SVN URL and Head URL comments - -- Thanks to Karl DeBisschop for the patch - - PEAR MultiLineConditionSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Szabolcs Sulik for the patch - - PEAR MultiLineAssignmentSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Szabolcs Sulik for the patch - - PEAR FunctionDeclarationSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Szabolcs Sulik for the patch - - Squiz SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Szabolcs Sulik for the patch - - Squiz CSS IndentationSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change - -- Thanks to Hugo Fonseca for the patch - - Squiz and MySource File and Function comment sniffs now allow all tags and don't require a particular licence - - Squiz LowercaseStyleDefinitionSniff no longer throws errors for class names in nested style definitions - - Squiz ClassFileNameSniff no longer throws errors when checking STDIN - - Squiz CSS sniffs no longer generate errors for IE filters - - Squiz CSS IndentationSniff no longer sees comments as blank lines - - Squiz LogicalOperatorSpacingSniff now ignores whitespace at the end of a line - - Squiz.Scope.MethodScope.Missing error message now mentions 'visibility' instead of 'scope modifier' - -- Thanks to Renat Akhmedyanov for the patch - - Added support for the PSR2 multi-line arguments errata - - The PSR2 standard no longer throws errors for additional spacing after a type hint - - PSR UseDeclarationSniff no longer throws errors for USE statements inside TRAITs - - Fixed bug #20026 : Check for multi-line arrays that should be single-line is slightly wrong - -- Adds new error message for single-line arrays that end with a comma - - Fixed bug #20029 : ForbiddenFunction sniff incorrectly recognizes methods in USE clauses - - Fixed bug #20043 : Mis-interpretation of Foo::class - - Fixed bug #20044 : PSR1 camelCase check does not ignore leading underscores - - Fixed bug #20045 : Errors about indentation for closures with multi-line 'use' in functions - - - - - 1.4.6 - 1.4.6 - - - stable - stable - - 2013-07-25 - BSD License - - - Added report type --report=json to show the error list and total counts for all checked files - -- Thanks to Jeffrey Fisher for the contribution - - The JS tokenizer now has support for the T_THROW token - - Symlinked directories inside CodeSniffer/Standards and in ruleset.xml files are now supported - -- Only available since PHP 5.2.11 and 5.3.1 - -- Thanks to Maik Penz for the patch - - The JS tokenizer now correctly identifies T_INLINE_ELSE tokens instead of leaving them as T_COLON - -- Thanks to Arnout Boks for the patch - - Explaining a standard (phpcs -e) that uses namespaces now works correctly - - Restricting a check to specific sniffs (phpcs --sniffs=...) now works correctly with namespaced sniffs - -- Thanks to Maik Penz for the patch - - Docs added for the entire Generic standard, and many sniffs from other standards are now documented as well - -- Thanks to Spencer Rinehart for the contribution - - Clearer error message for when the sniff class name does not match the directory structure - - Generated HTML docs now correctly show the open PHP tag in code comparison blocks - - Added Generic InlineHTMLSniff to ensure a file only contains PHP code - - Added Squiz ShorthandSizeSniff to check that CSS sizes are using shorthand notation only when 1 or 2 values are used - - Added Squiz ForbiddenStylesSniff to ban the use of some deprecated browser-specific styles - - Added Squiz NamedColoursSniff to ban the use of colour names - - PSR2 standard no longer enforces no whitespace between the closing parenthesis of a function call and the semicolon - - PSR2 ClassDeclarationSniff now ignores empty classes when checking the end brace position - - PSR2 SwitchDeclarationSniff no longer reports errors for empty lines between CASE statements - - PEAR ObjectOperatorIndentSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the indent setting in a ruleset.xml file to change - -- Thanks to Andrey Mindubaev for the patch - - Squiz FileExtensionSniff now supports traits - -- Thanks to Lucas Green for the patch - - Squiz ArrayDeclarationSniff no longer reports errors for no comma at the end of a line that contains a function call - - Squiz SwitchDeclarationSniff now supports T_CONTINUE and T_THROW as valid case/default breaking statements - - Squiz CommentedOutCodeSniff is now better at ignoring commented out HTML, XML and regular expressions - - Squiz DisallowComparisonAssignmentSniff no longer throws errors for the third expression in a FOR statement - - Squiz ColourDefinitionSniff no longer throws errors for some CSS class names - - Squiz ControlStructureSpacingSniff now supports all types of CASE/DEFAULT breaking statements - - Generic CallTimePassByReferenceSniff now reports errors for functions called using a variable - -- Thanks to Maik Penz for the patch - - Generic ConstructorNameSniff no longer throws a notice for abstract constructors inside abstract classes - -- Thanks to Spencer Rinehart for the patch - - Squiz ComparisonOperatorUsageSniff now checks inside elseif statements - -- Thanks to Arnout Boks for the patch - - Squiz OperatorSpacingSniff now reports errors for no spacing around inline then and else tokens - -- Thanks to Arnout Boks for the patch - - Fixed bug #19811 : Comments not ignored in all cases in AbstractPatternSniff - -- Thanks to Erik Wiffin for the patch - - Fixed bug #19892 : ELSE with no braces causes incorrect SWITCH break statement indentation error - - Fixed bug #19897 : Indenting warnings in templates not consistent - - Fixed bug #19908 : PEAR MultiLineCondition Does Not Apply elseif - - Fixed bug #19913 : Running phpcs in interactive mode causes warnings - -- Thanks to Harald Franndorfer for the patch - - Fixed bug #19935 : notify-send reports do not vanish in gnome-shell - -- Thanks to Christian Weiske for the patch - - Fixed bug #19944 : docblock squiz sniff "return void" trips over return in lambda function - - Fixed bug #19953 : PSR2 - Spaces before interface name for abstract class - - Fixed bug #19956 : phpcs warns for Type Hint missing Resource - - Fixed bug #19957 : Does not understand trait method aliasing - - Fixed bug #19968 : Permission denied on excluded directory - - Fixed bug #19969 : Sniffs with namespace not recognized in reports - - Fixed bug #19997 : Class names incorrectly detected as constants - - - - - 1.4.5 - 1.4.5 - - - stable - stable - - 2013-04-04 - BSD License - - - Added Generic LowerCaseKeywordSniff to ensure all PHP keywords are defined in lowercase - -- The PSR2 and Squiz standards now use this sniff - - Added Generic SAPIUsageSniff to ensure the PHP_SAPI constant is used instead of php_sapi_name() (request #19863) - - Squiz FunctionSpacingSniff now has a setting to specify how many lines there should between functions (request #19843) - -- Default remains at 2 - -- Override the "spacing" setting in a ruleset.xml file to change - - Squiz LowercasePHPFunctionSniff no longer throws errors for the limited set of PHP keywords it was checking - -- Add a rule for Generic.PHP.LowerCaseKeyword to your ruleset to replicate this functionality - - Added support for the PHP 5.4 T_CALLABLE token so it can be used in lower PHP versions - - Generic EndFileNoNewlineSniff now supports checking of CSS and JS files - - PSR2 SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented - -- Default remains at 4; override the indent setting in a ruleset.xml file to change - -- Thanks to Asher Snyder for the patch - - Generic ScopeIndentSniff now has a setting to specify a list of tokens that should be ignored - -- The first token on the line is checked and the whole line is ignored if the token is in the array - -- Thanks to Eloy Lafuente for the patch - - Squiz LowercaseClassKeywordsSniff now checks for the TRAIT keyword - -- Thanks to Anthon Pang for the patch - - If you create your own PHP_CodeSniffer object, PHPCS will no longer exit when an unknown argument is found - -- This allows you to create wrapper scripts for PHPCS more easily - - PSR2 MethodDeclarationSniff no longer generates a notice for methods named "_" - -- Thanks to Bart S for the patch - - Squiz BlockCommentSniff no longer reports that a blank line between a scope closer and block comment is invalid - - Generic DuplicateClassNameSniff no longer reports an invalid error if multiple PHP open tags exist in a file - - Generic DuplicateClassNameSniff no longer reports duplicate errors if multiple PHP open tags exist in a file - - Fixed bug #19819 : Freeze with syntax error in use statement - - Fixed bug #19820 : Wrong message level in Generic_Sniffs_CodeAnalysis_EmptyStatementSniff - - Fixed bug #19859 : CodeSniffer::setIgnorePatterns API changed - - Fixed bug #19871 : findExtendedClassName doesn't return FQCN on namespaced classes - - Fixed bug #19879 : bitwise and operator interpreted as reference by value - - - - - 1.4.4 - 1.4.4 - - - stable - stable - - 2013-02-07 - BSD License - - - Ignored lines no longer cause the summary report to show incorrect error and warning counts - -- Thanks to Bert Van Hauwaert for the patch - - Added Generic CSSLintSniff to run CSSLint over a CSS file and report warnings - -- Set full command to run CSSLint using phpcs --config-set csslint_path /path/to/csslint - -- Thanks to Roman Levishchenko for the contribution - - Added PSR2 ControlStructureSpacingSniff to ensure there are no spaces before and after parenthesis in control structures - -- Fixes bug #19732 : PSR2: some control structures errors not reported - - Squiz commenting sniffs now support non-English characters when checking for capital letters - -- Thanks to Roman Levishchenko for the patch - - Generic EndFileNewlineSniff now supports JS and CSS files - -- Thanks to Denis Ryabkov for the patch - - PSR1 SideEffectsSniff no longer reports constant declarations as side effects - - Notifysend report now supports notify-send versions before 0.7.3 - -- Thanks to Ken Guest for the patch - - PEAR and Squiz FunctionCommentSniffs no longer report errors for misaligned argument comments when they are blank - -- Thanks to Thomas Peterson for the patch - - Squiz FunctionDeclarationArgumentSpacingSniff now works correctly for equalsSpacing values greater than 0 - -- Thanks to Klaus Purer for the patch - - Squiz SuperfluousWhitespaceSniff no longer throws errors for CSS files with no newline at the end - - Squiz SuperfluousWhitespaceSniff now allows a single newline at the end of JS and CSS files - - Fixed bug #19755 : Token of T_CLASS type has no scope_opener and scope_closer keys - - Fixed bug #19759 : Squiz.PHP.NonExecutableCode fails for return function()... - - Fixed bug #19763 : Use statements for traits not recognised correctly for PSR2 code style - - Fixed bug #19764 : Instead of for traits throws uppercase constant name errors - - Fixed bug #19772 : PSR2_Sniffs_Namespaces_UseDeclarationSniff does not properly recognize last use - - Fixed bug #19775 : False positive in NonExecutableCode sniff when not using curly braces - - Fixed bug #19782 : Invalid found size functions in loop when using object operator - - Fixed bug #19799 : config folder is not created automatically - - Fixed bug #19804 : JS Tokenizer wrong /**/ parsing - - - - - 1.4.3 - 1.4.3 - - - stable - stable - - 2012-12-04 - BSD License - - - Added support for the PHP 5.5 T_FINALLY token to detect try/catch/finally statements - - Added empty CodeSniffer.conf to enable config settings for Composer installs - - Added Generic EndFileNoNewlineSniff to ensure there is no newline at the end of a file - - Autoloader can now load PSR-0 compliant classes - -- Thanks to Maik Penz for the patch - - Squiz NonExecutableCodeSniff no longer throws error for multi-line RETURNs inside CASE statements - -- Thanks to Marc Ypes for the patch - - Squiz OperatorSpacingSniff no longer reports errors for negative numbers inside inline THEN statements - -- Thanks to Klaus Purer for the patch - - Squiz OperatorSpacingSniff no longer reports errors for the assignment of operations involving negative numbers - - Squiz SelfMemberReferenceSniff can no longer get into an infinite loop when checking a static call with a namespace - -- Thanks to Andy Grunwald for the patch - - Fixed bug #19699 : Generic.Files.LineLength giving false positives when tab-width is used - - Fixed bug #19726 : Wrong number of spaces expected after instanceof static - - Fixed bug #19727 : PSR2: no error reported when using } elseif { - - - - - 1.4.2 - 1.4.2 - - - stable - stable - - 2012-11-09 - BSD License - - - PHP_CodeSniffer can now be installed using Composer - -- Require squizlabs/php_codesniffer in your composer.json file - -- Thanks to Rob Bast, Stephen Rees-Carter, Stefano Kowalke and Ivan Habunek for help with this - - Squiz BlockCommentSniff and InlineCommentSniff no longer report errors for trait block comments - - Squiz SelfMemberReferenceSniff now supports namespaces - -- Thanks to Andy Grunwald for the patch - - Squiz FileCommentSniff now uses tag names inside the error codes for many messages - -- This allows you to exclude specific missing, out of order etc., tags - - Squiz SuperfluousWhitespaceSniff now has an option to ignore blank lines - -- This will stop errors being reported for lines that contain only whitespace - -- Set the ignoreBlankLines property to TRUE in your ruleset.xml file to enable this - - PSR2 no longer reports errors for whitespace at the end of blank lines - - Fixed gitblame report not working on Windows - -- Thanks to Rogerio Prado de Jesus - - Fixed an incorrect error in Squiz OperatorSpacingSniff for default values inside a closure definition - - Fixed bug #19691 : SubversionPropertiesSniff fails to find missing properties - -- Thanks to Kevin Winahradsky for the patch - - Fixed bug #19692 : DisallowMultipleAssignments is triggered by a closure - - Fixed bug #19693 : exclude-patterns no longer work on specific messages - - Fixed bug #19694 : Squiz.PHP.LowercasePHPFunctions incorrectly matches return by ref functions - - - - - 1.4.1 - 1.4.1 - - - stable - stable - - 2012-11-02 - BSD License - - - All ignore patterns have been reverted to being checked against the absolute path of a file - -- Patterns can be specified to be relative in a ruleset.xml file, but nowhere else - -- e.g., [exclude-pattern type="relative"]^tests/*[/exclude-pattern] (with angle brackets, not square brackets) - - Added support for PHP tokenizing of T_INLINE_ELSE colons, so this token type is now available - -- Custom sniffs that rely on looking for T_COLON tokens inside inline if statements must be changed to use the new token - -- Fixes bug #19666 : PSR1.Files.SideEffects throws a notice Undefined index: scope_closer - - Messages can now be changed from errors to warnings (and vice versa) inside ruleset.xml files - -- As you would with "message" and "severity", specify a "type" tag under a "rule" tag and set the value to "error" or "warning" - - PHP_CodeSniffer will now generate a warning on files that it detects have mixed line endings - -- This warning has the code Internal.LineEndings.Mixed and can be overridden in a ruleset.xml file - -- Thanks to Vit Brunner for help with this - - Sniffs inside PHP 5.3 namespaces are now supported, along with the existing underscore-style emulated namespaces - -- For example: namespace MyStandard\Sniffs\Arrays; class ArrayDeclarationSniff implements \PHP_CodeSniffer_Sniff { ... - -- Thanks to Till Klampaeckel for the patch - - Generic DuplicateClassNameSniff is no longer a multi-file sniff, so it won't max out your memory - -- Multi-file sniff support should be considered deprecated as standard sniffs can now do the same thing - - Added Generic DisallowSpaceIndent to check that files are indented using tabs - - Added Generic OneClassPerFileSniff to check that only one class is defined in each file - -- Thanks to Andy Grunwald for the contribution - - Added Generic OneInterfacePerFileSniff to check that only one interface is defined in each file - -- Thanks to Andy Grunwald for the contribution - - Added Generic LowercasedFilenameSniff to check that filenames are lowercase - -- Thanks to Andy Grunwald for the contribution - - Added Generic ClosingPHPTagSniff to check that each open PHP tag has a corresponding close tag - -- Thanks to Andy Grunwald for the contribution - - Added Generic CharacterBeforePHPOpeningTagSniff to check that the open PHP tag is the first content in a file - -- Thanks to Andy Grunwald for the contribution - - Fixed incorrect errors in Squiz OperatorBracketSniff and OperatorSpacingSniff for negative numbers in CASE statements - -- Thanks to Arnout Boks for the patch - - Generic CamelCapsFunctionNameSniff no longer enforces exact case matching for PHP magic methods - - Generic CamelCapsFunctionNameSniff no longer throws errors for overridden SOAPClient methods prefixed with double underscores - -- Thanks to Dorian Villet for the patch - - PEAR ValidFunctionNameSniff now supports traits - - PSR1 ClassDeclarationSniff no longer throws an error for non-namespaced code if PHP version is less than 5.3.0 - - Fixed bug #19616 : Nested switches cause false error in PSR2 - - Fixed bug #19629 : PSR2 error for inline comments on multi-line argument lists - - Fixed bug #19644 : Alternative syntax, e.g. if/endif triggers Inline Control Structure error - - Fixed bug #19655 : Closures reporting as multi-line when they are not - - Fixed bug #19675 : Improper indent of nested anonymous function bodies in a call - - Fixed bug #19685 : PSR2 catch-22 with empty third statement in for loop - - Fixed bug #19687 : Anonymous functions inside arrays marked as indented incorrectly in PSR2 - - - - - 1.4.0 - 1.4.0 - - - stable - stable - - 2012-09-26 - BSD License - - - Added PSR1 and PSR2 coding standards that can be used to check your code against these guidelines - - PHP 5.4 short array syntax is now detected and tokens are assigned to the open and close characters - -- New tokens are T_OPEN_SHORT_ARRAY and T_CLOSE_SHORT_ARRAY as PHP does not define its own - - Added the ability to explain a coding standard by listing the sniffs that it includes - -- The sniff list includes all imported and native sniffs - -- Explain a standard by using the -e and --standard=[standard] command line arguments - -- E.g., phpcs -e --standard=Squiz - -- Thanks to Ben Selby for the idea - - Added report to show results using notify-send - -- Use --report=notifysend to generate the report - -- Thanks to Christian Weiske for the contribution - - The JS tokenizer now recognises RETURN as a valid closer for CASE and DEFAULT inside switch statements - - AbstractPatternSniff now sets the ignoreComments option using a public var rather than through the constructor - -- This allows the setting to be overwritten in ruleset.xml files - -- Old method remains for backwards compatibility - - Generic LowerCaseConstantSniff and UpperCaseConstantSniff no longer report errors on classes named True, False or Null - - PEAR ValidFunctionNameSniff no longer enforces exact case matching for PHP magic methods - - Squiz SwitchDeclarationSniff now allows RETURN statements to close a CASE or DEFAULT statement - - Squiz BlockCommentSniff now correctly reports an error for blank lines before blocks at the start of a control structure - - Fixed a PHP notice generated when loading custom array settings from a ruleset.xml file - - Fixed bug #17908 : CodeSniffer does not recognise optional @params - -- Thanks to Pete Walker for the patch - - Fixed bug #19538 : Function indentation code sniffer checks inside short arrays - - Fixed bug #19565 : Non-Executable Code Sniff Broken for Case Statements with both return and break - - Fixed bug #19612 : Invalid @package suggestion - - - - - 1.3.6 - 1.3.6 - - - stable - stable - - 2012-08-08 - BSD License - - - Memory usage has been dramatically reduced when using the summary report - -- Reduced memory is only available when displaying a single summary report to the screen - -- PHP_CodeSniffer will not generate any messages in this case, storing only error counts instead - -- Impact is most notable with very high error and warning counts - - Significantly improved the performance of Squiz NonExecutableCodeSniff - - Ignore patterns now check the relative path of a file based on the dir being checked - -- Allows ignore patterns to become more generic as the path to the code is no longer included when checking - -- Thanks to Kristof Coomans for the patch - - Sniff settings can now be changed by specifying a special comment format inside a file - -- e.g., // @codingStandardsChangeSetting PEAR.Functions.FunctionCallSignature allowMultipleArguments false - -- If you change a setting, don't forget to change it back - - Added Generic EndFileNewlineSniff to ensure PHP files end with a newline character - - PEAR FunctionCallSignatureSniff now includes a setting to force one argument per line in multi-line calls - -- Set allowMultipleArguments to false - - Squiz standard now enforces one argument per line in multi-line function calls - - Squiz FunctionDeclarationArgumentSpacingSniff now supports closures - - Squiz OperatorSpacingSniff no longer throws an error for negative values inside an inline THEN statement - -- Thanks to Klaus Purer for the patch - - Squiz FunctionCommentSniff now throws an error for not closing a comment with */ - -- Thanks to Klaus Purer for the patch - - Summary report no longer shows two lines of PHP_Timer output when showing sources - - Fixed undefined variable error in PEAR FunctionCallSignatureSniff for lines with no indent - - Fixed bug #19502 : Generic.Files.LineEndingsSniff fails if no new-lines in file - - Fixed bug #19508 : switch+return: Closing brace indented incorrectly - - Fixed bug #19532 : The PSR-2 standard don't recognize Null in class names - - Fixed bug #19546 : Error thrown for __call() method in traits - - - - - 1.3.5 - 1.3.5 - - - stable - stable - - 2012-07-12 - BSD License - - - Added Generic CamelCapsFunctionNameSniff to just check if function and method names use camel caps - -- Does not allow underscore prefixes for private/protected methods - -- Defaults to strict checking, where two uppercase characters can not be next to each other - -- Strict checking can be disabled in a ruleset.xml file - - Squiz FunctionDeclarationArgumentSpacing now has a setting to specify how many spaces should surround equals signs - -- Default remains at 0 - -- Override the equalsSpacing setting in a ruleset.xml file to change - - Squiz ClassDeclarationSniff now throws errors for > 1 space before extends/implements class name with ns separator - - Squiz standard now warns about deprecated functions using Generic DeprecatedFunctionsSniff - - PEAR FunctionDeclarationSniff now reports an error for multiple spaces after the FUNCTION keyword and around USE - - PEAR FunctionDeclarationSniff now supports closures - - Squiz MultiLineFunctionDeclarationSniff now supports closures - - Exclude rules written for Unix systems will now work correctly on Windows - -- Thanks to Walter Tamboer for the patch - - The PHP tokenizer now recognises T_RETURN as a valid closer for T_CASE and T_DEFAULT inside switch statements - - Fixed duplicate message codes in Generic OpeningFunctionBraceKernighanRitchieSniff - - Fixed bug #18651 : PHPunit Test cases for custom standards are not working on Windows - - Fixed bug #19416 : Shorthand arrays cause bracket spacing errors - - Fixed bug #19421 : phpcs doesn't recognize ${x} as equivalent to $x - - Fixed bug #19428 : PHPCS Report "hgblame" doesn't support windows paths - -- Thanks to Justin Rovang for the patch - - Fixed bug #19448 : Problem with detecting remote standards - - Fixed bug #19463 : Anonymous functions incorrectly being flagged by NonExecutableCodeSniff - - Fixed bug #19469 : PHP_CodeSniffer_File::getMemberProperties() sets wrong scope - - Fixed bug #19471 : phpcs on Windows, when using Zend standard, doesn't catch problems - -- Thanks to Ivan Habunek for the patch - - Fixed bug #19478 : Incorrect indent detection in PEAR standard - -- Thanks to Shane Auckland for the patch - - Fixed bug #19483 : Blame Reports fail with space in directory name - - - - - 1.3.4 - 1.3.4 - - - stable - stable - - 2012-05-17 - BSD License - - - Added missing package.xml entries for new Generic FixmeSniff - -- Thanks to Jaroslav Hanslík for the patch - - Expected indents for PEAR ScopeClosingBraceSniff and FunctionCallSignatureSniff can now be set in ruleset files - -- Both sniffs use a variable called "indent" - -- Thanks to Thomas Despoix for the patch - - Standards designed to be installed in the PHPCS Standards dir will now work outside this dir as well - -- In particular, allows the Drupal CS to work without needing to symlink it into the PHPCS install - -- Thanks to Peter Philipp for the patch - - Rule references for standards, directories and specific sniffs can now be relative in ruleset.xml files - -- For example: ref="../MyStandard/Sniffs/Commenting/DisallowHashCommentsSniff.php" - - Symlinked standards now work correctly, allowing aliasing of installed standards (request #19417) - -- Thanks to Tom Klingenberg for the patch - - Squiz ObjectInstantiationSniff now allows objects to be returned without assigning them to a variable - - Added Squiz.Commenting.FileComment.MissingShort error message for file comments that only contains tags - -- Also stops undefined index errors being generated for these comments - - Debug option -vv now shows tokenizer status for CSS files - - Added support for new gjslint error formats - -- Thanks to Meck for the patch - - Generic ScopeIndentSniff now allows comment indents to not be exact even if the exact flag is set - -- The start of the comment is still checked for exact indentation as normal - - Fixed an issue in AbstractPatternSniff where comments were not being ignored in some cases - - Fixed an issue in Zend ClosingTagSniff where the closing tag was not always being detected correctly - -- Thanks to Jonathan Robson for the patch - - Fixed an issue in Generic FunctionCallArgumentSpacingSniff where closures could cause incorrect errors - - Fixed an issue in Generic UpperCaseConstantNameSniff where errors were incorrectly reported on goto statements - -- Thanks to Tom Klingenberg for the patch - - PEAR FileCommentSniff and ClassCommentSniff now support author emails with a single character in the local part - -- E.g., a@me.com - -- Thanks to Denis Shapkin for the patch - - Fixed bug #19290 : Generic indent sniffer fails for anonymous functions - - Fixed bug #19324 : Setting show_warnings configuration option does not work - - Fixed bug #19354 : Not recognizing references passed to method - - Fixed bug #19361 : CSS tokenizer generates errors when PHP embedded in CSS file - - Fixed bug #19374 : HEREDOC/NOWDOC Indentation problems - - Fixed bug #19381 : traits and indentations in traits are not handled properly - - Fixed bug #19394 : Notice in NonExecutableCodeSniff - - Fixed bug #19402 : Syntax error when executing phpcs on Windows with parens in PHP path - -- Thanks to Tom Klingenberg for the patch - - Fixed bug #19411 : magic method error on __construct() - -- The fix required a rewrite of AbstractScopeSniff, so please test any sniffs that extend this class - - Fixed bug #19412 : Incorrect error about assigning objects to variables when inside inline IF - - Fixed bug #19413 : php_cs thinks I haven't used a parameter when I have - - Fixed bug #19414 : php_cs seems to not track variables correctly in heredocs - - - - - 1.3.3 - 1.3.3 - - - stable - stable - - 2012-02-17 - BSD License - - - Added new Generic FixmeSniff that shows error messages for all FIXME comments left in your code - -- Thanks to Sam Graham for the contribution - - The maxPercentage setting in the Squiz CommentedOutCodeSniff can now be overridden in a ruleset.xml file - -- Thanks to Volker Dusch for the patch - - The Checkstyle and XML reports now use XMLWriter - -- Only change in output is that empty file tags are no longer produced for files with no violations - -- Thanks to Sebastian Bergmann for the patch - - Added PHP_CodeSniffer_Tokens::$bracketTokens to give sniff writers fast access to open and close bracket tokens - - Fixed an issue in AbstractPatternSniff where EOL tokens were not being correctly checked in some cases - - PHP_CodeSniffer_File::getTokensAsString() now detects incorrect length value (request #19313) - - Fixed bug #19114 : CodeSniffer checks extension even for single file - - Fixed bug #19171 : Show sniff codes option is ignored by some report types - -- Thanks to Dominic Scheirlinck for the patch - - Fixed bug #19188 : Lots of PHP Notices when analyzing the Symfony framework - -- First issue was list-style.. lines in CSS files not properly adjusting open/close bracket positions - -- Second issue was notices caused by bug #19137 - - Fixed bug #19208 : UpperCaseConstantName reports class members - -- Was also a problem with LowerCaseConstantName as well - - Fixed bug #19256 : T_DOC_COMMENT in CSS files breaks ClassDefinitionNameSpacingSniff - -- Thanks to Klaus Purer for the patch - - Fixed bug #19264 : Squiz.PHP.NonExecutableCode does not handle RETURN in CASE without BREAK - - Fixed bug #19270 : DuplicateClassName does not handle namespaces correctly - - Fixed bug #19283 : CSS @media rules cause false positives - -- Thanks to Klaus Purer for the patch - - - - - 1.3.2 - 1.3.2 - - - stable - stable - - 2011-12-01 - BSD License - - - Added Generic JSHintSniff to run jshint.js over a JS file and report warnings - -- Set jshint path using phpcs --config-set jshint_path /path/to/jshint-rhino.js - -- Set rhino path using phpcs --config-set rhino_path /path/to/rhino - -- Thanks to Alexander Weiß for the contribution - - Nowdocs are now tokenized using PHP_CodeSniffer specific T_NOWDOC tokens for easier identification - - Generic UpperCaseConstantNameSniff no longer throws errors for namespaces - -- Thanks to Jaroslav Hanslík for the patch - - Squiz NonExecutableCodeSniff now detects code after thrown exceptions - -- Thanks to Jaroslav Hanslík for the patch - - Squiz OperatorSpacingSniff now ignores references - -- Thanks to Jaroslav Hanslík for the patch - - Squiz FunctionCommentSniff now reports a missing function comment if it finds a standard code comment instead - - Squiz FunctionCommentThrownTagSniff no longer reports errors if it can't find a function comment - - Fixed unit tests not running under Windows - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #18964 : "$stackPtr must be of type T_VARIABLE" on heredocs and nowdocs - - Fixed bug #18973 : phpcs is looking for variables in a nowdoc - - Fixed bug #18974 : Blank line causes "Multi-line function call not indented correctly" - -- Adds new error message to ban empty lines in multi-line function calls - - Fixed bug #18975 : "Closing parenthesis must be on a line by itself" also causes indentation error - - - - - 1.3.1 - 1.3.1 - - - stable - stable - - 2011-11-03 - BSD License - - - All report file command line arguments now work with relative paths (request #17240) - - The extensions command line argument now supports multi-part file extensions (request #17227) - - Added report type --report=hgblame to show number of errors/warnings committed by authors in a Mercurial repository - -- Has the same functionality as the svnblame report - -- Thanks to Ben Selby for the patch - - Added T_BACKTICK token type to make detection of backticks easier (request #18799) - - Added pattern matching support to Generic ForbiddenFunctionsSniff - -- If you are extending it and overriding register() or addError() you will need to review your sniff - - Namespaces are now recognised as scope openers, although they do not require braces (request #18043) - - Added new ByteOrderMarkSniff to Generic standard (request #18194) - -- Throws an error if a byte order mark is found in any PHP file - -- Thanks to Piotr Karas for the contribution - - PHP_Timer output is no longer included in reports when being written to a file (request #18252) - -- Also now shown for all report types if nothing is being printed to the screen - - Generic DeprecatedFunctionSniff now reports functions as deprecated and not simply forbidden (request #18288) - - PHPCS now accepts file contents from STDIN (request #18447) - -- Example usage: cat temp.php | phpcs [options] -OR- phpcs [options] < temp.php - -- Not every sniff will work correctly due to the lack of a valid file path - - PHP_CodeSniffer_Exception no longer extends PEAR_Exception (request #18483) - -- PEAR_Exception added a requirement that PEAR had to be installed - -- PHP_CodeSniffer is not used as a library, so unlikely to have any impact - - PEAR FileCommentSniff now allows GIT IDs in the version tag (request #14874) - - AbstractVariableSniff now supports heredocs - -- Also includes some variable detection fixes - -- Thanks to Sam Graham for the patch - - Squiz FileCommentSniff now enforces rule that package names cannot start with the word Squiz - - MySource AssignThisSniff now allows "this" to be assigned to the private var _self - - Fixed issue in Squiz FileCommentSniff where suggested package name was the same as the incorrect package name - - Fixed some issues with Squiz ArrayDeclarationSniff when using function calls in array values - - Fixed doc generation so it actually works again - -- Also now works when being run from an SVN checkout as well as when installed as a PEAR package - -- Should fix bug #18949 : Call to private method from static - - PEAR ClassDeclaration sniff now supports indentation checks when using the alternate namespace syntax - -- PEAR.Classes.ClassDeclaration.SpaceBeforeBrace message now contains 2 variables instead of 1 - -- Sniff allows overriding of the default indent level, which is set to 4 - -- Fixes bug #18933 : Alternative namespace declaration syntax confuses scope sniffs - - Fixed bug #18465 : "self::" does not work in lambda functions - -- Also corrects conversion of T_FUNCTION tokens to T_CLOSURE, which was not fixing token condition arrays - - Fixed bug #18543 : CSS Tokenizer deletes too many # - - Fixed bug #18624 : @throws namespace problem - -- Thanks to Gavin Davies for the patch - - Fixed bug #18628 : Generic.Files.LineLength gives incorrect results with Windows line-endings - - Fixed bug #18633 : CSS Tokenizer doesn't replace T_LIST tokens inside some styles - - Fixed bug #18657 : anonymous functions wrongly indented - - Fixed bug #18670 : UpperCaseConstantNameSniff fails on dynamic retrieval of class constant - - Fixed bug #18709 : Code sniffer sniffs file if even if it's in --ignore - -- Thanks to Artem Lopata for the patch - - Fixed bug #18762 : Incorrect handling of define and constant in UpperCaseConstantNameSniff - -- Thanks to Thomas Baker for the patch - - Fixed bug #18769 : CSS Tokenizer doesn't replace T_BREAK tokens inside some styles - - Fixed bug #18835 : Unreachable errors of inline returns of closure functions - -- Thanks to Patrick Schmidt for the patch - - Fixed bug #18839 : Fix miscount of warnings in AbstractSniffUnitTest.php - -- Thanks to Sam Graham for the patch - - Fixed bug #18844 : Generic_Sniffs_CodeAnalysis_UnusedFunctionParameterSniff with empty body - -- Thanks to Dmitri Medvedev for the patch - - Fixed bug #18847 : Running Squiz_Sniffs_Classes_ClassDeclarationSniff results in PHP notice - - Fixed bug #18868 : jslint+rhino: errors/warnings not detected - -- Thanks to Christian Weiske for the patch - - Fixed bug #18879 : phpcs-svn-pre-commit requires escapeshellarg - -- Thanks to Bjorn Katuin for the patch - - Fixed bug #18951 : weird behaviour with closures and multi-line use () params - - - - - 1.3.0 - 1.3.0 - - - stable - stable - - 2011-03-17 - BSD License - - - Add a new token T_CLOSURE that replaces T_FUNCTION if the function keyword is anonymous - - Many Squiz sniffs no longer report errors when checking closures; they are now ignored - - Fixed some error messages in PEAR MultiLineConditionSniff that were not using placeholders for message data - - AbstractVariableSniff now correctly finds variable names wrapped with curly braces inside double quoted strings - - PEAR FunctionDeclarationSniff now ignores arrays in argument default values when checking multi-line declarations - - Fixed bug #18200 : Using custom named ruleset file as standard no longer works - - Fixed bug #18196 : PEAR MultiLineCondition.SpaceBeforeOpenBrace not consistent with newline chars - - Fixed bug #18204 : FunctionCommentThrowTag picks wrong exception type when throwing function call - - Fixed bug #18222 : Add __invoke method to PEAR standard - - Fixed bug #18235 : Invalid error generation in Squiz.Commenting.FunctionCommentThrowTag - - Fixed bug #18250 : --standard with relative path skips Standards' "implicit" sniffs - - Fixed bug #18274 : Multi-line IF and function call indent rules conflict - - Fixed bug #18282 : Squiz doesn't handle final keyword before function comments - -- Thanks to Dave Perrett for the patch - - Fixed bug #18336 : Function isUnderscoreName gives php notices - - - - - 1.3.0RC2 - 1.3.0RC2 - - - beta - beta - - 2011-01-14 - BSD License - - - You can now print multiple reports for each run and print each to the screen or a file (request #12434) - -- Format is --report-[report][=file] (e.g., --report-xml=out.xml) - -- Printing to screen is done by leaving [file] empty (e.g., --report-xml) - -- Multiple reports can be specified in this way (e.g., --report-summary --report-xml=out.xml) - -- The standard --report and --report-file command line arguments are unchanged - - Added -d command line argument to set php.ini settings while running (request #17244) - -- Usage is: phpcs -d memory_limit=32M -d ... - -- Thanks to Ben Selby for the patch - - Added -p command line argument to show progress during a run - -- Dot means pass, E means errors found, W means only warnings found and S means skipped file - -- Particularly good for runs where you are checking more than 100 files - -- Enable by default with --config-set show_progress 1 - -- Will not print anything if you are already printing verbose output - -- This has caused a big change in the way PHP_CodeSniffer processes files (API changes around processing) - - You can now add exclude rules for individual sniffs or error messages (request #17903) - -- Only available when using a ruleset.xml file to specify rules - -- Uses the same exclude-pattern tags as normal but allows them inside rule tags - - Using the -vvv option will now print a list of sniffs executed for each file and how long they took to process - - Added Generic ClosureLinterSniff to run Google's gjslint over your JS files - - The XML and CSV reports now include the severity of the error (request #18165) - -- The Severity column in the CSV report has been renamed to Type, and a new Severity column added for this - - Fixed issue with Squiz FunctionCommentSniff reporting incorrect type hint when default value uses namespace - -- Thanks to Anti Veeranna for the patch - - Generic FileLengthSniff now uses iconv_strlen to check line length if an encoding is specified (request #14237) - - Generic UnnecessaryStringConcatSniff now allows strings to be combined to form a PHP open or close tag - - Squiz SwitchDeclarationSniff no longer reports indentation errors for BREAK statements inside IF conditions - - Interactive mode now always prints the full error report (ignores command line) - - Improved regular expression detection in JavaScript files - -- Added new T_TYPEOF token that can be used to target the typeof JS operator - -- Fixes bug #17611 : Regular expression tokens not recognised - - Squiz ScopeIndentSniff removed - -- Squiz standard no longer requires additional indents between ob_* methods - -- Also removed Squiz OutputBufferingIndentSniff that was checking the same thing - - PHP_CodeSniffer_File::getMemberProperties() performance improved significantly - -- Improves performance of Squiz ValidVariableNameSniff significantly - - Squiz OperatorSpacingSniff performance improved significantly - - Squiz NonExecutableCodeSniff performance improved significantly - -- Will throw duplicate errors in some cases now, but these should be rare - - MySource IncludeSystemSniff performance improved significantly - - MySource JoinStringsSniff no longer reports an error when using join() on a named JS array - - Warnings are now reported for each file when they cannot be opened instead of stopping the script - -- Hide warnings with the -n command line argument - -- Can override the warnings using the code Internal.DetectLineEndings - - Fixed bug #17693 : issue with pre-commit hook script with filenames that start with v - - Fixed bug #17860 : isReference function fails with references in array - -- Thanks to Lincoln Maskey for the patch - - Fixed bug #17902 : Cannot run tests when tests are symlinked into tests dir - -- Thanks to Matt Button for the patch - - Fixed bug #17928 : Improve error message for Generic_Sniffs_PHP_UpperCaseConstantSniff - -- Thanks to Stefano Kowalke for the patch - - Fixed bug #18039 : JS Tokenizer crash when ] is last character in file - - Fixed bug #18047 : Incorrect handling of namespace aliases as constants - -- Thanks to Dmitri Medvedev for the patch - - Fixed bug #18072 : Impossible to exclude path from processing when symlinked - - Fixed bug #18073 : Squiz.PHP.NonExecutableCode fault - - Fixed bug #18117 : PEAR coding standard: Method constructor not sniffed as a function - - Fixed bug #18135 : Generic FunctionCallArgumentSpacingSniff reports function declaration errors - - Fixed bug #18140 : Generic scope indent in exact mode: strange expected/found values for switch - - Fixed bug #18145 : Sniffs are not loaded for custom ruleset file - -- Thanks to Scott McCammon for the patch - - Fixed bug #18152 : While and do-while with AbstractPatternSniff - - Fixed bug #18191 : Squiz.PHP.LowercasePHPFunctions does not work with new Date() - - Fixed bug #18193 : CodeSniffer doesn't reconize CR (\r) line endings - - - - - 1.3.0RC1 - 1.3.0RC1 - - - beta - beta - - 2010-09-03 - BSD License - - - Added exclude pattern support to ruleset.xml file so you can specify ignore patterns in a standard (request #17683) - -- Use new exclude-pattern tags to include the ignore rules into your ruleset.xml file - -- See CodeSniffer/Standards/PHPCS/ruleset.xml for an example - - Added new --encoding command line argument to specify the encoding of the files being checked - -- When set to utf-8, stops the XML-based reports from double-encoding - -- When set to something else, helps the XML-based reports encode to utf-8 - -- Default value is iso-8859-1 but can be changed with --config-set encoding [value] - - The report is no longer printed to screen when using the --report-file command line option (request #17467) - -- If you want to print it to screen as well, use the -v command line argument - - The SVN and GIT blame reports now also show percentage of reported errors per author (request #17606) - -- Thanks to Ben Selby for the patch - - Updated the SVN pre-commit hook to work with the new severity levels feature - - Generic SubversionPropertiesSniff now allows properties to have NULL values (request #17682) - -- A null value indicates that the property should exist but the value should not be checked - - Generic UpperCaseConstantName Sniff now longer complains about the PHPUnit_MAIN_METHOD constant (request #17798) - - Squiz FileComment sniff now checks JS files as well as PHP files - - Squiz FunctionCommentSniff now supports namespaces in type hints - - Fixed a problem in Squiz OutputBufferingIndentSniff where block comments were reported as not indented - - Fixed bug #17092 : Problems with utf8_encode and htmlspecialchars with non-ascii chars - -- Use the new --encoding=utf-8 command line argument if your files are utf-8 encoded - - Fixed bug #17629 : PHP_CodeSniffer_Tokens::$booleanOperators missing T_LOGICAL_XOR - -- Thanks to Matthew Turland for the patch - - Fixed bug #17699 : Fatal error generating code coverage with PHPUnit 5.3.0RC1 - - Fixed bug #17718 : Namespace 'use' statement: used global class name is recognized as constant - - Fixed bug #17734 : Generic SubversionPropertiesSniff complains on non SVN files - - Fixed bug #17742 : EmbeddedPhpSniff reacts negatively to file without closing php tag - - Fixed bug #17823 : Notice: Please no longer include PHPUnit/Framework.php - - - - - 1.3.0a1 - 1.3.0a1 - - - alpha - alpha - - 2010-07-15 - BSD License - - - All CodingStandard.php files have been replaced by ruleset.xml files - -- Custom standards will need to be converted over to this new format to continue working - - You can specify a path to your own custom ruleset.xml file by using the --standard command line arg - -- e.g., phpcs --standard=/path/to/my/ruleset.xml - - Added a new report type --report=gitblame to show how many errors and warnings were committed by each author - -- Has the same functionality as the svnblame report - -- Thanks to Ben Selby for the patch - - A new token type T_DOLLAR has been added to allow you to sniff for variable variables (feature request #17095) - -- Thanks to Ian Young for the patch - - JS tokenizer now supports T_POWER (^) and T_MOD_EQUAL (%=) tokens (feature request #17441) - - If you have PHP_Timer installed, you'll now get a time/memory summary at the end of a script run - -- Only happens when printing reports that are designed to be read on the command line - - Added Generic DeprecatedFunctionsSniff to warn about the use of deprecated functions (feature request #16694) - -- Thanks to Sebastian Bergmann for the patch - - Added Squiz LogicalOperatorSniff to ensure that logical operators are surrounded by single spaces - - Added MySource ChannelExceptionSniff to ensure action files only throw ChannelException - - Added new method getClassProperties() for sniffs to use to determine if a class is abstract and/or final - -- Thanks to Christian Kaps for the patch - - Generic UpperCaseConstantSniff no longer throws errors about namespaces - -- Thanks to Christian Kaps for the patch - - Squiz OperatorBracketSniff now correctly checks value assignments in arrays - - Squiz LongConditionClosingCommentSniff now requires a comment for long CASE statements that use curly braces - - Squiz LongConditionClosingCommentSniff now requires an exact comment match on the brace - - MySource IncludeSystemSniff now ignores DOMDocument usage - - MySource IncludeSystemSniff no longer requires inclusion of systems that are being implemented - - Removed found and expected messages from Squiz ConcatenationSpacingSniff because they were messy and not helpful - - Fixed a problem where Generic CodeAnalysisSniff could show warnings if checking multi-line strings - - Fixed error messages in Squiz ArrayDeclarationSniff reporting incorrect number of found and expected spaces - - Fixed bug #17048 : False positive in Squiz_WhiteSpace_ScopeKeywordSpacingSniff - - Fixed bug #17054 : phpcs more strict than PEAR CS regarding function parameter spacing - - Fixed bug #17096 : Notice: Undefined index: scope_condition in ScopeClosingBraceSniff.php - -- Moved PEAR.Functions.FunctionCallArgumentSpacing to Generic.Functions.FunctionCallArgumentSpacing - - Fixed bug #17144 : Deprecated: Function eregi() is deprecated - - Fixed bug #17236 : PHP Warning due to token_get_all() in DoubleQuoteUsageSniff - - Fixed bug #17243 : Alternate Switch Syntax causes endless loop of Notices in SwitchDeclaration - - Fixed bug #17313 : Bug with switch case structure - - Fixed bug #17331 : Possible parse error: interfaces may not include member vars - - Fixed bug #17337 : CSS tokenizer fails on quotes urls - - Fixed bug #17420 : Uncaught exception when comment before function brace - - Fixed bug #17503 : closures formatting is not supported - - - - - 1.2.2 - 1.2.2 - - - stable - stable - - 2010-01-27 - BSD License - - - The core PHP_CodeSniffer_File methods now understand the concept of closures (feature request #16866) - -- Thanks to Christian Kaps for the sample code - - Sniffs can now specify violation codes for each error and warning they add - -- Future versions will allow you to override messages and severities using these codes - -- Specifying a code is optional, but will be required if you wish to support overriding - - All reports have been broken into separate classes - -- Command line usage and report output remains the same - -- Thanks to Gabriele Santini for the patch - - Added an interactive mode that can be enabled using the -a command line argument - -- Scans files and stops when it finds a file with errors - -- Waits for user input to recheck the file (hopefully you fixed the errors) or skip the file - -- Useful for very large code bases where full rechecks take a while - - The reports now show the correct number of errors and warnings found - - The isCamelCaps method now allows numbers in class names - - The JS tokenizer now correctly identifies boolean and bitwise AND and OR tokens - - The JS tokenizer now correctly identifies regular expressions used in conditions - - PEAR ValidFunctionNameSniff now ignores closures - - Squiz standard now uses the PEAR setting of 85 chars for LineLengthSniff - - Squiz ControlStructureSpacingSniff now ensure there are no spaces around parentheses - - Squiz LongConditionClosingCommentSniff now checks for comments at the end of try/catch statements - - Squiz LongConditionClosingCommentSniff now checks validity of comments for short structures if they exist - - Squiz IncrementDecrementUsageSniff now has better checking to ensure it only looks at simple variable assignments - - Squiz PostStatementCommentSniff no longer throws errors for end function comments - - Squiz InlineCommentSniff no longer throws errors for end function comments - - Squiz OperatorBracketSniff now allows simple arithmetic operations in SWITCH conditions - - Squiz ValidFunctionNameSniff now ignores closures - - Squiz MethodScopeSniff now ignores closures - - Squiz ClosingDeclarationCommentSniff now ignores closures - - Squiz GlobalFunctionSniff now ignores closures - - Squiz DisallowComparisonAssignmentSniff now ignores the assigning of arrays - - Squiz DisallowObjectStringIndexSniff now allows indexes that contain dots and reserved words - - Squiz standard now throws nesting level and cyclomatic complexity errors at much higher levels - - Squiz CommentedOutCodeSniff now ignores common comment framing characters - - Squiz ClassCommentSniff now ensures the open comment tag is the only content on the first line - - Squiz FileCommentSniff now ensures the open comment tag is the only content on the first line - - Squiz FunctionCommentSniff now ensures the open comment tag is the only content on the first line - - Squiz VariableCommentSniff now ensures the open comment tag is the only content on the first line - - Squiz NonExecutableCodeSniff now warns about empty return statements that are not required - - Removed ForbiddenStylesSniff from Squiz standard - -- It is now in in the MySource standard as BrowserSpecificStylesSniff - -- New BrowserSpecificStylesSniff ignores files with browser-specific suffixes - - MySource IncludeSystemSniff no longer throws errors when extending the Exception class - - MySource IncludeSystemSniff no longer throws errors for the abstract widget class - - MySource IncludeSystemSniff and UnusedSystemSniff now allow includes inside IF statements - - MySource IncludeSystemSniff no longer throws errors for included widgets inside methods - - MySource GetRequestDataSniff now throws errors for using $_FILES - - MySource CreateWidgetTypeCallbackSniff now allows return statements in nested functions - - MySource DisallowSelfActionsSniff now ignores abstract classes - - Fixed a problem with the SVN pre-commit hook for PHP versions without vertical whitespace regex support - - Fixed bug #16740 : False positives for heredoc strings and unused parameter sniff - - Fixed bug #16794 : ValidLogicalOperatorsSniff doesn't report operators not in lowercase - - Fixed bug #16804 : Report filename is shortened too much - - Fixed bug #16821 : Bug in Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #16836 : Notice raised when using semicolon to open case - - Fixed bug #16855 : Generic standard sniffs incorrectly for define() method - - Fixed bug #16865 : Two bugs in Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #16902 : Inline If Declaration bug - - Fixed bug #16960 : False positive for late static binding in Squiz/ScopeKeywordSpacingSniff - -- Thanks to Jakub Tománek for the patch - - Fixed bug #16976 : The phpcs attempts to process symbolic links that don't resolve to files - - Fixed bug #17017 : Including one file in the files sniffed alters errors reported for another file - - - - - 1.2.1 - 1.2.1 - - - stable - stable - - 2009-11-17 - BSD License - - - Added a new report type --report=svnblame to show how many errors and warnings were committed by each author - -- Also shows the percentage of their code that are errors and warnings - -- Requires you to have the SVN command in your path - -- Make sure SVN is storing usernames and passwords (if required) or you will need to enter them for each file - -- You can also use the -s command line argument to see the different types of errors authors are committing - -- You can use the -v command line argument to see all authors, even if they have no errors or warnings - - Added a new command line argument --report-width to allow you to set the column width of screen reports - -- Reports wont accept values less than 70 or else they get too small - -- Can also be set via a config var: phpcs --config-set report_width 100 - - You can now get PHP_CodeSniffer to ignore a whole file by adding @codingStandardsIgnoreFile in the content - -- If you put it in the first two lines the file wont even be tokenized, so it will be much quicker - - Reports now print their file lists in alphabetical order - - PEAR FunctionDeclarationSniff now reports error for incorrect closing bracket placement in multi-line definitions - - Added Generic CallTimePassByReferenceSniff to prohibit the passing of variables into functions by reference - -- Thanks to Florian Grandel for the contribution - - Added Squiz DisallowComparisonAssignmentSniff to ban the assignment of comparison values to a variable - - Added Squiz DuplicateStyleDefinitionSniff to check for duplicate CSS styles in a single class block - - Squiz ArrayDeclarationSniff no longer checks the case of array indexes because that is not its job - - Squiz PostStatementCommentSniff now allows end comments for class member functions - - Squiz InlineCommentSniff now supports the checking of JS files - - MySource CreateWidgetTypeCallbackSniff now allows the callback to be passed to another function - - MySource CreateWidgetTypeCallbackSniff now correctly ignores callbacks used inside conditions - - Generic MultipleStatementAlignmentSniff now enforces a single space before equals sign if max padding is reached - - Fixed a problem in the JS tokenizer where regular expressions containing \// were not converted correctly - - Fixed a problem tokenizing CSS files where multiple ID targets on a line would look like comments - - Fixed a problem tokenizing CSS files where class names containing a colon looked like style definitions - - Fixed a problem tokenizing CSS files when style statements had empty url() calls - - Fixed a problem tokenizing CSS colours with the letter E in first half of the code - - Squiz ColonSpacingSniff now ensures it is only checking style definitions in CSS files and not class names - - Squiz DisallowComparisonAssignmentSniff no longer reports errors when assigning the return value of a function - - CSS tokenizer now correctly supports multi-line comments - - When only the case of var names differ for function comments, the error now indicates the case is different - - Fixed an issue with Generic UnnecessaryStringConcatSniff where it incorrectly suggested removing a concat - - Fixed bug #16530 : ScopeIndentSniff reports false positive - - Fixed bug #16533 : Duplicate errors and warnings - - Fixed bug #16563 : Check file extensions problem in phpcs-svn-pre-commit - -- Thanks to Kaijung Chen for the patch - - Fixed bug #16592 : Object operator indentation incorrect when first operator is on a new line - - Fixed bug #16641 : Notice output - - Fixed bug #16682 : Squiz_Sniffs_Strings_DoubleQuoteUsageSniff reports string "\0" as invalid - - Fixed bug #16683 : Typing error in PHP_CodeSniffer_CommentParser_AbstractParser - - Fixed bug #16684 : Bug in Squiz_Sniffs_PHP_NonExecutableCodeSniff - - Fixed bug #16692 : Spaces in paths in Squiz_Sniffs_Debug_JavaScriptLintSniff - -- Thanks to Jaroslav Hanslík for the patch - - Fixed bug #16696 : Spelling error in MultiLineConditionSniff - - Fixed bug #16697 : MultiLineConditionSniff incorrect result with inline IF - - Fixed bug #16698 : Notice in JavaScript Tokenizer - - Fixed bug #16736 : Multi-files sniffs aren't processed when FILE is a single directory - -- Thanks to Alexey Shein for the patch - - Fixed bug #16792 : Bug in Generic_Sniffs_PHP_ForbiddenFunctionsSniff - - - - - 1.2.0 - 1.2.0 - - - stable - stable - - 2009-08-17 - BSD License - - - Installed standards are now favoured over custom standards when using the cmd line arg with relative paths - - Unit tests now use a lot less memory while running - - Squiz standard now uses Generic EmptyStatementSniff but throws errors instead of warnings - - Squiz standard now uses Generic UnusedFunctionParameterSniff - - Removed unused ValidArrayIndexNameSniff from the Squiz standard - - Fixed bug #16424 : SubversionPropertiesSniff print PHP Warning - - Fixed bug #16450 : Constant PHP_CODESNIFFER_VERBOSITY already defined (unit tests) - - Fixed bug #16453 : function declaration long line splitted error - - Fixed bug #16482 : phpcs-svn-pre-commit ignores extensions parameter - - - - - 1.2.0RC3 - 1.2.0RC3 - - - beta - beta - - 2009-07-07 - BSD License - - - You can now use @codingStandardsIgnoreStart and @...End comments to suppress messages (feature request #14002) - - A warning is now included for files without any code when short_open_tag is set to Off (feature request #12952) - - You can now use relative paths to your custom standards with the --standard cmd line arg (feature request #14967) - - You can now override magic methods and functions in PEAR ValidFunctionNameSniff (feature request #15830) - - MySource IncludeSystemSniff now recognises widget action classes - - MySource IncludeSystemSniff now knows about unit test classes and changes rules accordingly - - - - - 1.2.0RC2 - 1.2.0RC2 - - - beta - beta - - 2009-05-25 - BSD License - - - Test suite can now be run using the full path to AllTests.php (feature request #16179) - - Fixed bug #15980 : PHP_CodeSniffer change php current directory - -- Thanks to Dolly Aswin Harahap for the patch - - Fixed bug #16001 : Notice triggered - - Fixed bug #16054 : phpcs-svn-pre-commit not showing any errors - - Fixed bug #16071 : Fatal error: Uncaught PHP_CodeSniffer_Exception - - Fixed bug #16170 : Undefined Offset -1 in MultiLineConditionSniff.php on line 68 - - Fixed bug #16175 : Bug in Squiz-IncrementDecrementUsageSniff - - - - - 1.2.0RC1 - 1.2.0RC1 - - - beta - beta - - 2009-03-09 - BSD License - - - Reports that are output to a file now include a trailing newline at the end of the file - - Fixed sniff names not shown in -vvv token processing output - - Added Generic SubversionPropertiesSniff to check that specific svn props are set for files - -- Thanks to Jack Bates for the contribution - - The PHP version check can now be overridden in classes that extend PEAR FileCommentSniff - -- Thanks to Helgi Þormar Þorbjörnsson for the suggestion - - Added Generic ConstructorNameSniff to check for PHP4 constructor name usage - -- Thanks to Leif Wickland for the contribution - - Squiz standard now supports multi-line function and condition sniffs from PEAR standard - - Squiz standard now uses Generic ConstructorNameSniff - - Added MySource GetRequestDataSniff to ensure REQUEST, GET and POST are not accessed directly - - Squiz OperatorBracketSniff now allows square brackets in simple unbracketed operations - - Fixed the incorrect tokenizing of multi-line block comments in CSS files - - Fixed bug #15383 : Uncaught PHP_CodeSniffer_Exception - - Fixed bug #15408 : An unexpected exception has been caught: Undefined offset: 2 - - Fixed bug #15519 : Uncaught PHP_CodeSniffer_Exception - - Fixed bug #15624 : Pre-commit hook fails with PHP errors - - Fixed bug #15661 : Uncaught PHP_CodeSniffer_Exception - - Fixed bug #15722 : "declare(encoding = 'utf-8');" leads to "Missing file doc comment" - - Fixed bug #15910 : Object operator indention not calculated correctly - - - - - 1.2.0a1 - 1.2.0a1 - - - alpha - alpha - - 2008-12-18 - BSD License - - - PHP_CodeSniffer now has a CSS tokenizer for checking CSS files - - Added support for a new multi-file sniff that sniffs all processed files at once - - Added new output format --report=emacs to output errors using the emacs standard compile output format - -- Thanks to Len Trigg for the contribution - - Reports can now be written to a file using the --report-file command line argument (feature request #14953) - -- The report is also written to screen when using this argument - - The CheckStyle, CSV and XML reports now include a source for each error and warning (feature request #13242) - -- A new report type --report=source can be used to show you the most common errors in your files - - Added new command line argument -s to show error sources in all reports - - Added new command line argument --sniffs to specify a list of sniffs to restrict checking to - -- Uses the sniff source codes that are optionally displayed in reports - - Changed the max width of error lines from 80 to 79 chars to stop blank lines in the default windows cmd window - - PHP_CodeSniffer now has a token for an asperand (@ symbol) so sniffs can listen for them - -- Thanks to Andy Brockhurst for the patch - - Added Generic DuplicateClassNameSniff that will warn if the same class name is used in multiple files - -- Not currently used by any standard; more of a multi-file sniff sample than anything useful - - Added Generic NoSilencedErrorsSniff that warns if PHP errors are being silenced using the @ symbol - -- Thanks to Andy Brockhurst for the contribution - - Added Generic UnnecessaryStringConcatSniff that checks for two strings being concatenated - - Added PEAR FunctionDeclarationSniff to enforce the new multi-line function declaration PEAR standard - - Added PEAR MultiLineAssignmentSniff to enforce the correct indentation of multi-line assignments - - Added PEAR MultiLineConditionSniff to enforce the new multi-line condition PEAR standard - - Added PEAR ObjectOperatorIndentSniff to enforce the new chained function call PEAR standard - - Added MySource DisallowSelfActionSniff to ban the use of self::method() calls in Action classes - - Added MySource DebugCodeSniff to ban the use of Debug::method() calls - - Added MySource CreateWidgetTypeCallback sniff to check callback usage in widget type create methods - - Added Squiz DisallowObjectStringIndexSniff that forces object dot notation in JavaScript files - -- Thanks to Sertan Danis for the contribution - - Added Squiz DiscouragedFunctionsSniff to warn when using debug functions - - Added Squiz PropertyLabelSniff to check whitespace around colons in JS property and label declarations - - Added Squiz DuplicatePropertySniff to check for duplicate property names in JS classes - - Added Squiz ColonSpacingSniff to check for spacing around colons in CSS style definitions - - Added Squiz SemicolonSpacingSniff to check for spacing around semicolons in CSS style definitions - - Added Squiz IndentationSniff to check for correct indentation of CSS files - - Added Squiz ColourDefinitionSniff to check that CSS colours are defined in uppercase and using shorthand - - Added Squiz EmptyStyleDefinitionSniff to check for CSS style definitions without content - - Added Squiz EmptyClassDefinitionSniff to check for CSS class definitions without content - - Added Squiz ClassDefinitionOpeningBraceSpaceSniff to check for spaces around opening brace of CSS class definitions - - Added Squiz ClassDefinitionClosingBraceSpaceSniff to check for a single blank line after CSS class definitions - - Added Squiz ClassDefinitionNameSpacingSniff to check for a blank lines inside CSS class definition names - - Added Squiz DisallowMultipleStyleDefinitionsSniff to check for multiple style definitions on a single line - - Added Squiz DuplicateClassDefinitionSniff to check for duplicate CSS class blocks that can be merged - - Added Squiz ForbiddenStylesSniff to check for usage of browser specific styles - - Added Squiz OpacitySniff to check for incorrect opacity values in CSS - - Added Squiz LowercaseStyleDefinitionSniff to check for styles that are not defined in lowercase - - Added Squiz MissingColonSniff to check for style definitions where the colon has been forgotten - - Added Squiz MultiLineFunctionDeclarationSniff to check that multi-line declarations contain one param per line - - Added Squiz JSLintSniff to check for JS errors using the jslint.js script through Rhino - -- Set jslint path using phpcs --config-set jslint_path /path/to/jslint.js - -- Set rhino path using phpcs --config-set rhino_path /path/to/rhino - - Added Generic TodoSniff that warns about comments that contain the word TODO - - Removed MultipleStatementAlignmentSniff from the PEAR standard as alignment is now optional - - Generic ForbiddenFunctionsSniff now has protected member var to specify if it should use errors or warnings - - Generic MultipleStatementAlignmentSniff now has correct error message if assignment is on a new line - - Generic MultipleStatementAlignmentSniff now has protected member var to allow it to ignore multi-line assignments - - Generic LineEndingsSniff now supports checking of JS files - - Generic LineEndingsSniff now supports checking of CSS files - - Generic DisallowTabIndentSniff now supports checking of CSS files - - Squiz DoubleQuoteUsageSniff now bans the use of variables in double quoted strings in favour of concatenation - - Squiz SuperfluousWhitespaceSniff now supports checking of JS files - - Squiz SuperfluousWhitespaceSniff now supports checking of CSS files - - Squiz DisallowInlineIfSniff now supports checking of JS files - - Squiz SemicolonSpacingSniff now supports checking of JS files - - Squiz PostStatementCommentSniff now supports checking of JS files - - Squiz FunctionOpeningBraceSpacingSniff now supports checking of JS files - - Squiz FunctionClosingBraceSpacingSniff now supports checking of JS files - -- Empty JS functions must have their opening and closing braces next to each other - - Squiz ControlStructureSpacingSniff now supports checking of JS files - - Squiz LongConditionClosingCommentSniff now supports checking of JS files - - Squiz OperatorSpacingSniff now supports checking of JS files - - Squiz SwitchDeclarationSniff now supports checking of JS files - - Squiz CommentedOutCodeSniff now supports checking of CSS files - - Squiz DisallowSizeFunctionsInLoopsSniff now supports checking of JS files for the use of object.length - - Squiz DisallowSizeFunctionsInLoopsSniff no longer complains about size functions outside of the FOR condition - - Squiz ControlStructureSpacingSniff now bans blank lines at the end of a control structure - - Squiz ForLoopDeclarationSniff no longer throws errors for JS FOR loops without semicolons - - Squiz MultipleStatementAlignmentSniff no longer throws errors if a statement would take more than 8 spaces to align - - Squiz standard now uses Generic TodoSniff - - Squiz standard now uses Generic UnnecessaryStringConcatSniff - - Squiz standard now uses PEAR MultiLineAssignmentSniff - - Squiz standard now uses PEAR MultiLineConditionSniff - - Zend standard now uses OpeningFunctionBraceBsdAllmanSniff (feature request #14647) - - MySource JoinStringsSniff now bans the use of inline array joins and suggests the + operator - - Fixed incorrect errors that can be generated from abstract scope sniffs when moving to a new file - - Core tokenizer now matches orphaned curly braces in the same way as square brackets - - Whitespace tokens at the end of JS files are now added to the token stack - - JavaScript tokenizer now identifies properties and labels as new token types - - JavaScript tokenizer now identifies object definitions as a new token type and matches curly braces for them - - JavaScript tokenizer now identifies DIV_EQUAL and MUL_EQUAL tokens - - Improved regular expression detection in the JavaScript tokenizer - - Improve AbstractPatternSniff support so it can listen for any token type, not just weighted tokens - - Fixed Squiz DoubleQuoteUsageSniff so it works correctly with short_open_tag=Off - - Fixed bug #14409 : Output of warnings to log file - - Fixed bug #14520 : Notice: Undefined offset: 1 in /usr/share/php/PHP/CodeSniffer/File.php on line - - Fixed bug #14637 : Call to processUnknownArguments() misses second parameter $pos - -- Thanks to Peter Buri for the patch - - Fixed bug #14889 : Lack of clarity: licence or license - - Fixed bug #15008 : Nested Parentheses in Control Structure Sniffs - - Fixed bug #15091 : pre-commit hook attempts to sniff folders - -- Thanks to Bruce Weirdan for the patch - - Fixed bug #15124 : AbstractParser.php uses deprecated split() function - -- Thanks to Sebastian Bergmann for the patch - - Fixed bug #15188 : PHPCS vs HEREDOC strings - - Fixed bug #15231 : Notice: Uninitialized string offset: 0 in FileCommentSniff.php on line 555 - - Fixed bug #15336 : Notice: Undefined offset: 2 in /usr/share/php/PHP/CodeSniffer/File.php on line - - - - - 1.1.0 - 1.1.0 - - - stable - stable - - 2008-07-14 - BSD License - - - PEAR FileCommentSniff now allows tag orders to be overridden in child classes - -- Thanks to Jeff Hodsdon for the patch - - Added Generic DisallowMultipleStatementsSniff to ensure there is only one statement per line - - Squiz standard now uses DisallowMultipleStatementsSniff - - Fixed error in Zend ValidVariableNameSniff when checking vars in form: $class->{$var} - - Fixed bug #14077 : Fatal error: Uncaught PHP_CodeSniffer_Exception: $stackPtr is not a class member - - Fixed bug #14168 : Global Function -> Static Method and __autoload() - - Fixed bug #14238 : Line length not checked at last line of a file - - Fixed bug #14249 : wrong detection of scope_opener - - Fixed bug #14250 : ArrayDeclarationSniff emit warnings at malformed array - - Fixed bug #14251 : --extensions option doesn't work - - - - - 1.1.0RC3 - 1.1.0RC3 - - - beta - beta - - 2008-07-03 - BSD License - - - PEAR FileCommentSniff now allows tag orders to be overridden in child classes - -- Thanks to Jeff Hodsdon for the patch - - Added Generic DisallowMultipleStatementsSniff to ensure there is only one statement per line - - Squiz standard now uses DisallowMultipleStatementsSniff - - Fixed error in Zend ValidVariableNameSniff when checking vars in form: $class->{$var} - - Fixed bug #14077 : Fatal error: Uncaught PHP_CodeSniffer_Exception: $stackPtr is not a class member - - Fixed bug #14168 : Global Function -> Static Method and __autoload() - - Fixed bug #14238 : Line length not checked at last line of a file - - Fixed bug #14249 : wrong detection of scope_opener - - Fixed bug #14250 : ArrayDeclarationSniff emit warnings at malformed array - - Fixed bug #14251 : --extensions option doesn't work - - - - - 1.1.0RC2 - 1.1.0RC2 - - - beta - beta - - 2008-06-13 - BSD License - - - Permission denied errors now stop script execution but still display current errors (feature request #14076) - - Added Squiz ValidArrayIndexNameSniff to ensure array indexes do not use camel case - - Squiz ArrayDeclarationSniff now ensures arrays are not declared with camel case index values - - PEAR ValidVariableNameSniff now alerts about a possible parse error for member vars inside an interface - - Fixed bug #13921 : js parsing fails for comments on last line of file - - Fixed bug #13922 : crash in case of malformed (but tokenized) php file - -- PEAR and Squiz ClassDeclarationSniff now throw warnings for possible parse errors - -- Squiz ValidClassNameSniff now throws warning for possible parse errors - -- Squiz ClosingDeclarationCommentSniff now throws additional warnings for parse errors - - - - - 1.1.0RC1 - 1.1.0RC1 - - - beta - beta - - 2008-05-13 - BSD License - - - Added support for multiple tokenizers so PHP_CodeSniffer can check more than just PHP files - -- PHP_CodeSniffer now has a JS tokenizer for checking JavaScript files - -- Sniffs need to be updated to work with additional tokenizers, or new sniffs written for them - - phpcs now exits with status 2 if the tokenizer extension has been disabled (feature request #13269) - - Added scripts/phpcs-svn-pre-commit that can be used as an SVN pre-commit hook - -- Also reworked the way the phpcs script works to make it easier to wrap it with other functionality - -- Thanks to Jack Bates for the contribution - - Fixed error in phpcs error message when a supplied file does not exist - - Fixed a cosmetic error in AbstractPatternSniff where the "found" string was missing some content - - Added sniffs that implement part of the PMD rule catalog to the Generic standard - -- Thanks to Manuel Pichler for the contribution of all these sniffs. - - Squiz FunctionCommentThrowTagSniff no longer throws errors for function that only throw variables - - Generic ScopeIndentSniff now has private member to enforce exact indent matching - - Replaced Squiz DisallowCountInLoopsSniff with Squiz DisallowSizeFunctionsInLoopsSniff - -- Thanks to Jan Miczaika for the sniff - - Squiz BlockCommentSniff now checks inline doc block comments - - Squiz InlineCommentSniff now checks inline doc block comments - - Squiz BlockCommentSniff now checks for no blank line before first comment in a function - - Squiz DocCommentAlignmentSniff now ignores inline doc block comments - - Squiz ControlStructureSpacingSniff now ensures no blank lines at the start of control structures - - Squiz ControlStructureSpacingSniff now ensures no blank lines between control structure closing braces - - Squiz IncrementDecrementUsageSniff now ensures inc/dec ops are bracketed in string concats - - Squiz IncrementDecrementUsageSniff now ensures inc/dec ops are not used in arithmetic operations - - Squiz FunctionCommentSniff no longer throws errors if return value is mixed but function returns void somewhere - - Squiz OperatorBracketSniff no allows function call brackets to count as operator brackets - - Squiz DoubleQuoteUsageSniff now supports \x \f and \v (feature request #13365) - - Squiz ComparisonOperatorUsageSniff now supports JS files - - Squiz ControlSignatureSniff now supports JS files - - Squiz ForLoopDeclarationSniff now supports JS files - - Squiz OperatorBracketSniff now supports JS files - - Squiz InlineControlStructureSniff now supports JS files - - Generic LowerCaseConstantSniff now supports JS files - - Generic DisallowTabIndentSniff now supports JS files - - Generic MultipleStatementAlignmentSniff now supports JS files - - Added Squiz ObjectMemberCommaSniff to ensure the last member of a JS object is not followed by a comma - - Added Squiz ConstantCaseSniff to ensure the PHP constants are uppercase and JS lowercase - - Added Squiz JavaScriptLintSniff to check JS files with JSL - -- Set path using phpcs --config-set jsl_path /path/to/jsl - - Added MySource FirebugConsoleSniff to ban the use of "console" for JS variable and function names - - Added MySource JoinStringsSniff to enforce the use of join() to concatenate JS strings - - Added MySource AssignThisSniff to ensure this is only assigned to a var called self - - Added MySource DisallowNewWidgetSniff to ban manual creation of widget objects - - Removed warning shown in Zend CodeAnalyzerSniff when the ZCA path is not set - - Fixed error in Squiz ValidVariableNameSniff when checking vars in the form $obj->$var - - Fixed error in Squiz DisallowMultipleAssignmentsSniff when checking vars in the form $obj->$var - - Fixed error in Squiz InlineCommentSniff where comments for class constants were seen as inline - - Fixed error in Squiz BlockCommentSniff where comments for class constants were not ignored - - Fixed error in Squiz OperatorBracketSniff where negative numbers were ignored during comparisons - - Fixed error in Squiz FunctionSpacingSniff where functions after member vars reported incorrect spacing - - Fixed bug #13062 : Interface comments aren't handled in PEAR standard - -- Thanks to Manuel Pichler for the path - - Fixed bug #13119 : php minimum requirement need to be fix - - Fixed bug #13156 : Bug in Squiz_Sniffs_PHP_NonExecutableCodeSniff - - Fixed bug #13158 : Strange behaviour in AbstractPatternSniff - - Fixed bug #13169 : Undefined variables - - Fixed bug #13178 : Catch exception in File.php - - Fixed bug #13254 : Notices output in checkstyle report causes XML issues - - Fixed bug #13446 : crash with src of phpMyAdmin - -- Thanks to Manuel Pichler for the path - - - - - 1.1.0a1 - 1.1.0a1 - - - alpha - alpha - - 2008-04-21 - BSD License - - - Fixed error in PEAR ValidClassNameSniff when checking class names with double underscores - - Moved Squiz InlineControlStructureSniff into Generic standard - - PEAR standard now throws warnings for inline control structures - - Squiz OutputBufferingIndentSniff now ignores the indentation of inline HTML - - MySource IncludeSystemSniff now ignores usage of ZipArchive - - Removed "function" from error messages for Generic function brace sniffs (feature request #13820) - - Generic UpperCaseConstantSniff no longer throws errors for declare(ticks = ...) - -- Thanks to Josh Snyder for the patch - - Squiz ClosingDeclarationCommentSniff and AbstractVariableSniff now throw warnings for possible parse errors - - Fixed bug #13827 : AbstractVariableSniff throws "undefined index" - - Fixed bug #13846 : Bug in Squiz.NonExecutableCodeSniff - - Fixed bug #13849 : infinite loop in PHP_CodeSniffer_File::findNext() - - - - - 1.0.1 - 1.0.1 - - - stable - stable - - 2008-02-04 - BSD License - - - Squiz ArrayDeclarationSniff now throws error if the array keyword is followed by a space - - Squiz ArrayDeclarationSniff now throws error for empty multi-line arrays - - Squiz ArrayDeclarationSniff now throws error for multi-line arrays with a single value - - Squiz DocCommentAlignmentSniff now checks for a single space before tags inside docblocks - - Squiz ForbiddenFunctionsSniff now disallows is_null() to force use of (=== NULL) instead - - Squiz VariableCommentSniff now continues throwing errors after the first one is found - - Squiz SuperfluousWhitespaceSniff now throws errors for multiple blank lines inside functions - - MySource IncludedSystemSniff now checks extended class names - - MySource UnusedSystemSniff now checks extended and implemented class names - - MySource IncludedSystemSniff now supports includeWidget() - - MySource UnusedSystemSniff now supports includeWidget() - - Added PEAR ValidVariableNameSniff to check that only private member vars are prefixed with an underscore - - Added Squiz DisallowCountInLoopsSniff to check for the use of count() in FOR and WHILE loop conditions - - Added MySource UnusedSystemSniff to check for included classes that are never used - - Fixed a problem that caused the parentheses map to sometimes contain incorrect values - - Fixed bug #12767 : Cant run phpcs from dir with PEAR subdir - - Fixed bug #12773 : Reserved variables are not detected in strings - -- Thanks to Wilfried Loche for the patch - - Fixed bug #12832 : Tab to space conversion does not work - - Fixed bug #12888 : extra space indentation = Notice: Uninitialized string offset... - - Fixed bug #12909 : Default generateDocs function does not work under linux - -- Thanks to Paul Smith for the patch - - Fixed bug #12957 : PHP 5.3 magic method __callStatic - -- Thanks to Manuel Pichler for the patch - - - - - 1.0.0 - 1.0.0 - - - stable - stable - - 2007-12-21 - BSD License - - - You can now specify the full path to a coding standard on the command line (feature request #11886) - -- This allows you to use standards that are stored outside of PHP_CodeSniffer's own Standard dir - -- You can also specify full paths in the CodingStandard.php include and exclude methods - -- Classes, dirs and files need to be names as if the standard was part of PHP_CodeSniffer - -- Thanks to Dirk Thomas for the doc generator patch and testing - - Modified the scope map to keep checking after 3 lines for some tokens (feature request #12561) - -- Those tokens that must have an opener (like T_CLASS) now keep looking until EOF - -- Other tokens (like T_FUNCTION) still stop after 3 lines for performance - - You can now escape commas in ignore patterns so they can be matched in file names - -- Thanks to Carsten Wiedmann for the patch - - Config data is now cached in a global var so the file system is not hit so often - -- You can also set config data temporarily for the script if you are using your own external script - -- Pass TRUE as the third argument to PHP_CodeSniffer::setConfigData() - - PEAR ClassDeclarationSniff no longer throws errors for multi-line class declarations - - Squiz ClassDeclarationSniff now ensures there is one blank line after a class closing brace - - Squiz ClassDeclarationSniff now throws errors for a missing end PHP tag after the end class tag - - Squiz IncrementDecrementUsageSniff no longer throws errors when -= and += are being used with vars - - Squiz SwitchDeclarationSniff now throws errors for switch statements that do not contain a case statement - -- Thanks to Sertan Danis for the patch - - MySource IncludeSystemSniff no longer throws errors for the Util package - - Fixed bug #12621 : "space after AS" check is wrong - -- Thanks to Satoshi Oikawa for the patch - - Fixed bug #12645 : error message is wrong - -- Thanks to Renoiv for the patch - - Fixed bug #12651 : Increment/Decrement Operators Usage at -1 - - - - - 1.0.0RC3 - 1.0.0RC3 - - - beta - beta - - 2007-11-30 - BSD License - - - Added new command line argument --tab-width that will convert tabs to spaces before testing - -- This allows you to use the existing sniffs that check for spaces even when you use tabs - -- Can also be set via a config var: phpcs --config-set tab_width 4 - -- A value of zero (the default) tells PHP_CodeSniffer not to replace tabs with spaces - - You can now change the default report format from "full" to something else - -- Run: phpcs --config-set report_format [format] - - Improved performance by optimising the way the scope map is created during tokenising - - Added new Squiz DisallowInlineIfSniff to disallow the usage of inline IF statements - - Fixed incorrect errors being thrown for nested switches in Squiz SwitchDeclarationSniff - - PEAR FunctionCommentSniff no longer complains about missing comments for @throws tags - - PEAR FunctionCommentSniff now throws error for missing exception class name for @throws tags - - PHP_CodeSniffer_File::isReference() now correctly returns for functions that return references - - Generic LineLengthSniff no longer warns about @version lines with CVS or SVN id tags - - Generic LineLengthSniff no longer warns about @license lines with long URLs - - Squiz FunctionCommentThrowTagSniff no longer complains about throwing variables - - Squiz ComparisonOperatorUsageSniff no longer throws incorrect errors for inline IF statements - - Squiz DisallowMultipleAssignmentsSniff no longer throws errors for assignments in inline IF statements - - Fixed bug #12455 : CodeSniffer treats content inside heredoc as PHP code - - Fixed bug #12471 : Checkstyle report is broken - - Fixed bug #12476 : PHP4 destructors are reported as error - - Fixed bug #12513 : Checkstyle XML messages need to be utf8_encode()d - -- Thanks to Sebastian Bergmann for the patch. - - Fixed bug #12517 : getNewlineAfter() and dos files - - - - - 1.0.0RC2 - 1.0.0RC2 - - - beta - beta - - 2007-11-14 - BSD License - - - Added a new Checkstyle report format - -- Like the current XML format but modified to look like Checkstyle output - -- Thanks to Manuel Pichler for helping get the format correct - - You can now hide warnings by default - -- Run: phpcs --config-set show_warnings 0 - -- If warnings are hidden by default, use the new -w command line argument to override - - Added new command line argument --config-delete to delete a config value and revert to the default - - Improved overall performance by optimising tokenising and next/prev methods (feature request #12421) - -- Thanks to Christian Weiske for the patch - - Added FunctionCallSignatureSniff to Squiz standard - - Added @subpackage support to file and class comment sniffs in PEAR standard (feature request #12382) - -- Thanks to Carsten Wiedmann for the patch - - An error is now displayed if you use a PHP version less than 5.1.0 (feature request #12380) - -- Thanks to Carsten Wiedmann for the patch - - phpcs now exits with status 2 if it receives invalid input (feature request #12380) - -- This is distinct from status 1, which indicates errors or warnings were found - - Added new Squiz LanguageConstructSpacingSniff to throw errors for additional whitespace after echo etc. - - Removed Squiz ValidInterfaceNameSniff - - PEAR FunctionCommentSniff no longer complains about unknown tags - - Fixed incorrect errors about missing function comments in PEAR FunctionCommentSniff - - Fixed incorrect function docblock detection in Squiz FunctionCommentSniff - - Fixed incorrect errors for list() in Squiz DisallowMultipleAssignmentsSniff - - Errors no longer thrown if control structure is followed by a CASE's BREAK in Squiz ControlStructureSpacingSniff - - Fixed bug #12368 : Autoloader cannot be found due to include_path override - -- Thanks to Richard Quadling for the patch - - Fixed bug #12378 : equal sign alignments problem with while() - - - - - 1.0.0RC1 - 1.0.0RC1 - - - beta - beta - - 2007-11-01 - BSD License - - - Main phpcs script can now be run from a CVS checkout without installing the package - - Added a new CSV report format - -- Header row indicates what position each element is in - -- Always use the header row to determine positions rather than assuming the format, as it may change - - XML and CSV report formats now contain information about which column the error occurred at - -- Useful if you want to highlight the token that caused the error in a custom application - - Square bracket tokens now have bracket_opener and bracket_closer set - - Added new Squiz SemicolonSpacingSniff to throw errors if whitespace is found before a semicolon - - Added new Squiz ArrayBracketSpacingSniff to throw errors if whitespace is found around square brackets - - Added new Squiz ObjectOperatorSpacingSniff to throw errors if whitespace is found around object operators - - Added new Squiz DisallowMultipleAssignmentsSniff to throw errors if multiple assignments are on the same line - - Added new Squiz ScopeKeywordSpacingSniff to throw errors if there is not a single space after a scope modifier - - Added new Squiz ObjectInstantiationSniff to throw errors if new objects are not assigned to a variable - - Added new Squiz FunctionDuplicateArgumentSniff to throw errors if argument is declared multiple times in a function - - Added new Squiz FunctionOpeningBraceSpaceSniff to ensure there are no blank lines after a function open brace - - Added new Squiz CommentedOutCodeSniff to warn about comments that looks like they are commented out code blocks - - Added CyclomaticComplexitySniff to Squiz standard - - Added NestingLevelSniff to Squiz standard - - Squiz ForbiddenFunctionsSniff now recommends echo() instead of print() - - Squiz ValidLogicalOperatorsSniff now recommends ^ instead of xor - - Squiz SwitchDeclarationSniff now contains more checks - -- A single space is required after the case keyword - -- No space is allowed before the colon in a case or default statement - -- All switch statements now require a default case - -- Default case must contain a break statement - -- Empty default case must contain a comment describing why the default is ignored - -- Empty case statements are not allowed - -- Case and default statements must not be followed by a blank line - -- Break statements must be followed by a blank line or the closing brace - -- There must be no blank line before a break statement - - Squiz standard is now using the PEAR IncludingFileSniff - - PEAR ClassCommentSniff no longer complains about unknown tags - - PEAR FileCommentSniff no longer complains about unknown tags - - PEAR FileCommentSniff now accepts multiple @copyright tags - - Squiz BlockCommentSniff now checks that comment starts with a capital letter - - Squiz InlineCommentSniff now has better checking to ensure comment starts with a capital letter - - Squiz ClassCommentSniff now checks that short and long comments start with a capital letter - - Squiz FunctionCommentSniff now checks that short, long and param comments start with a capital letter - - Squiz VariableCommentSniff now checks that short and long comments start with a capital letter - - Fixed error with multi-token array indexes in Squiz ArrayDeclarationSniff - - Fixed error with checking shorthand IF statements without a semicolon in Squiz InlineIfDeclarationSniff - - Fixed error where constants used as default values in function declarations were seen as type hints - - Fixed bug #12316 : PEAR is no longer the default standard - - Fixed bug #12321 : wrong detection of missing function docblock - - - - - 0.9.0 - 0.9.0 - - - beta - beta - - 2007-09-24 - BSD License - - - Added a config system for setting config data across phpcs runs - - You can now change the default coding standard from PEAR to something else - -- Run: phpcs --config-set default_standard [standard] - - Added new Zend coding standard to check code against the Zend Framework standards - -- The complete standard is not yet implemented - -- Specify --standard=Zend to use - -- Thanks to Johann-Peter Hartmann for the contribution of some sniffs - -- Thanks to Holger Kral for the Code Analyzer sniff - - - - - 0.8.0 - 0.8.0 - - - beta - beta - - 2007-08-08 - BSD License - - - Added new XML report format; --report=xml (feature request #11535) - -- Thanks to Brett Bieber for the patch - - Added new command line argument --ignore to specify a list of files to skip (feature request #11556) - - Added PHPCS and MySource coding standards into the core install - - Scope map no longer gets confused by curly braces that act as string offsets - - Removed CodeSniffer/SniffException.php as it is no longer used - - Unit tests can now be run directly from a CVS checkout - - Made private vars and functions protected in PHP_CodeSniffer class so this package can be overridden - - Added new Metrics category to Generic coding standard - -- Contains Cyclomatic Complexity and Nesting Level sniffs - -- Thanks to Johann-Peter Hartmann for the contribution - - Added new Generic DisallowTabIndentSniff to throw errors if tabs are used for indentation (feature request #11738) - -- PEAR and Squiz standards use this new sniff to throw more specific indentation errors - - Generic MultipleStatementAlignmentSniff has new private var to set a padding size limit (feature request #11555) - - Generic MultipleStatementAlignmentSniff can now handle assignments that span multiple lines (feature request #11561) - - Generic LineLengthSniff now has a max line length after which errors are thrown instead of warnings - -- BC BREAK: Override the protected member var absoluteLineLimit and set it to zero in custom LineLength sniffs - -- Thanks to Johann-Peter Hartmann for the contribution - - Comment sniff errors about incorrect tag orders are now more descriptive (feature request #11693) - - Fixed bug #11473 : Invalid CamelCaps name when numbers used in names - - - - - 0.7.0 - 0.7.0 - - - beta - beta - - 2007-07-02 - BSD License - - - BC BREAK: EOL character is now auto-detected and used instead of hard-coded \n - -- Pattern sniffs must now specify "EOL" instead of "\n" or "\r\n" to use auto-detection - -- Please use $phpcsFile->eolChar to check for newlines instead of hard-coding "\n" or "\r\n" - -- Comment parser classes now require you to pass $phpcsFile as an additional argument - - BC BREAK: Included and excluded sniffs now require .php extension - -- Please update your coding standard classes and add ".php" to all sniff entries - -- See CodeSniffer/Standards/PEAR/PEARCodingStandard.php for an example - - - Fixed error where including a directory of sniffs in a coding standard class did not work - - Coding standard classes can now specify a list of sniffs to exclude as well as include (feature request #11056) - - Two uppercase characters can now be placed side-by-side in class names in Squiz ValidClassNameSniff - - SVN tags now allowed in PEAR file doc blocks (feature request #11038) - -- Thanks to Torsten Roehr for the patch - - Private methods in commenting sniffs and comment parser are now protected (feature request #11087) - - Added Generic LineEndingsSniff to check the EOL character of a file - - PEAR standard now only throws one error per file for incorrect line endings (eg. /r/n) - - Command line arg -v now shows number of registered sniffs - - Command line arg -vvv now shows list of registered sniffs - - Squiz ControlStructureSpacingSniff no longer throws errors if the control structure is at the end of the script - - Squiz FunctionCommentSniff now throws error for "return void" if function has return statement - - Squiz FunctionCommentSniff now throws error for functions that return void but specify something else - - Squiz ValidVariableNameSniff now allows multiple uppercase letters in a row - - Squiz ForEachLoopDeclarationSniff now throws error for AS keyword not being lowercase - - Squiz SwitchDeclarationSniff now throws errors for CASE/DEFAULT/BREAK keywords not being lowercase - - Squiz ArrayDeclarationSniff now handles multi-token array values when checking alignment - - Squiz standard now enforces a space after cast tokens - - Generic MultipleStatementAlignmentSniff no longer gets confused by assignments inside FOR conditions - - Generic MultipleStatementAlignmentSniff no longer gets confused by the use of list() - - Added Generic SpaceAfterCastSniff to ensure there is a single space after a cast token - - Added Generic NoSpaceAfterCastSniff to ensure there is no whitespace after a cast token - - Added PEAR ClassDeclarationSniff to ensure the opening brace of a class is on the line after the keyword - - Added Squiz ScopeClosingBraceSniff to ensure closing braces are aligned correctly - - Added Squiz EvalSniff to discourage the use of eval() - - Added Squiz LowercaseDeclarationSniff to ensure all declaration keywords are lowercase - - Added Squiz LowercaseClassKeywordsSniff to ensure all class declaration keywords are lowercase - - Added Squiz LowercaseFunctionKeywordsSniff to ensure all function declaration keywords are lowercase - - Added Squiz LowercasePHPFunctionsSniff to ensure all calls to inbuilt PHP functions are lowercase - - Added Squiz CastSpacingSniff to ensure cast statements dont contain whitespace - - Errors no longer thrown when checking 0 length files with verbosity on - - Fixed bug #11105 : getIncludedSniffs() not working anymore - -- Thanks to Blair Robertson for the patch - - Fixed bug #11120 : Uninitialized string offset in AbstractParser.php on line 200 - - - - - 0.6.0 - 0.6.0 - - - beta - beta - - 2007-05-15 - BSD License - - - The number of errors and warnings found is now shown for each file while checking the file if verbosity is enabled - - Now using PHP_EOL instead of hard-coded \n so output looks good on Windows (feature request #10761) - - Thanks to Carsten Wiedmann for the patch. - - phpcs now exits with status 0 (no errors) or 1 (errors found) (feature request #10348) - - Added new -l command line argument to stop recursion into directories (feature request #10979) - - Fixed variable name error causing incorrect error message in Squiz ValidVariableNameSniff - - Fixed bug #10757 : Error in ControlSignatureSniff - - Fixed bugs #10751, #10777 : Sniffer class paths handled incorrectly in Windows - - Thanks to Carsten Wiedmann for the patch. - - Fixed bug #10961 : Error "Last parameter comment requires a blank newline after it" thrown - - Fixed bug #10983 : phpcs outputs notices when checking invalid PHP - - Fixed bug #10980 : Incorrect warnings for equals sign - - - - - 0.5.0 - 0.5.0 - - - beta - beta - - 2007-04-17 - BSD License - - - BC BREAK: Coding standards now require a class to be added so PHP_CodeSniffer can get information from them - - Please read the end user docs for info about the new class required for all coding standards - - - Coding standards can now include sniffs from other standards, or whole standards, without writing new sniff files - - PHP_CodeSniffer_File::isReference() now correctly returns for references in function declarations - - PHP_CodeSniffer_File::isReference() now returns false if you don't pass it a T_BITWISE_AND token - - PHP_CodeSniffer_File now stores the absolute path to the file so sniffs can check file locations correctly - - Fixed undefined index error in AbstractVariableSniff for variables inside an interface function definition - - Added MemberVarSpacingSniff to Squiz standard to enforce one-line spacing between member vars - - Add FunctionCommentThrowTagSniff to Squiz standard to check that @throws tags are correct - - Fixed problems caused by references and type hints in Squiz FunctionDeclarationArgumentSpacingSniff - - Fixed problems with errors not being thrown for some misaligned @param comments in Squiz FunctionCommentSniff - - Fixed badly spaced comma error being thrown for "extends" class in Squiz ClassDeclarationSniff - - Errors no longer thrown for class method names in Generic ForbiddenFunctionsSniff - - Errors no longer thrown for type hints in front of references in Generic UpperCaseConstantNameSniff - - Errors no longer thrown for correctly indented buffered lines in Squiz ScopeIndexSniff - - Errors no longer thrown for user-defined functions named as forbidden functions in Generic ForbiddenFunctionsSniff - - Errors no longer thrown on __autoload functions in PEAR ValidFunctionNameSniff - - Errors now thrown for __autoload methods in PEAR ValidFunctionNameSniff - - Errors now thrown if constructors or destructors have @return tags in Squiz FunctionCommentSniff - - Errors now thrown if @throws tags dont start with a capital and end with a full stop in Squiz FunctionCommentSniff - - Errors now thrown for invalid @var tag values in Squiz VariableCommentSniff - - Errors now thrown for missing doc comment in Squiz VariableCommentSniff - - Errors now thrown for unspaced operators in FOR loop declarations in Squiz OperatorSpacingSniff - - Errors now thrown for using ob_get_clean/flush functions to end buffers in Squiz OutputBufferingIndentSniff - - Errors now thrown for all missing member variable comments in Squiz VariableCommentSniff - - - - - 0.4.0 - 0.4.0 - - - beta - beta - - 2007-02-19 - BSD License - - - Standard name specified with --standard command line argument is no longer case sensitive - - Long error and warning messages are now wrapped to 80 characters in the full error report (thanks Endre Czirbesz) - - Shortened a lot of error and warning messages so they don't take up so much room - - Squiz FunctionCommentSniff now checks that param comments start with a capital letter and end with a full stop - - Squiz FunctionSpacingSniff now reports incorrect lines below function on closing brace, not function keyword - - Squiz FileCommentSniff now checks that there are no blank lines between the open PHP tag and the comment - - PHP_CodeSniffer_File::isReference() now returns correctly when checking refs on right side of => - - Fixed incorrect error with switch closing brace in Squiz SwitchDeclarationSniff - - Fixed missing error when multiple statements are not aligned correctly with object operators - - Fixed incorrect errors for some PHP special variables in Squiz ValidVariableNameSniff - - Fixed incorrect errors for arrays that only contain other arrays in Squiz ArrayDeclarationSniff - - Fixed bug #9844 : throw new Exception(\n accidentally reported as error but it ain't - - - - - 0.3.0 - 0.3.0 - - - beta - beta - - 2007-01-11 - BSD License - - - Updated package.xml to version 2 - - Specifying coding standard on command line is now optional, even if you have multiple standards installed - - PHP_CodeSniffer uses the PEAR coding standard by default if no standard is specified - - New command line option, --extensions, to specify a comma separated list of file extensions to check - - Converted all unit tests to PHPUnit 3 format - - Added new coding standard, Squiz, that can be used as an alternative to PEAR - - also contains more examples of sniffs - - some may be moved into the Generic coding standard if required - - Added MultipleStatementAlignmentSniff to Generic standard - - Added ScopeIndentSniff to Generic standard - - Added ForbiddenFunctionsSniff to Generic standard - - Added FileCommentSniff to PEAR standard - - Added ClassCommentSniff to PEAR standard - - Added FunctionCommentSniff to PEAR standard - - Change MultipleStatementSniff to MultipleStatementAlignmentSniff in PEAR standard - - Replaced Methods directory with Functions directory in Generic and PEAR standards - - also renamed some of the sniffs in those directories - - Updated file, class and method comments for all files - - Fixed bug #9274 : nested_parenthesis element not set for open and close parenthesis tokens - - Fixed bug #9411 : too few pattern characters cause incorrect error report - - - - - 0.2.1 - 0.2.1 - - - alpha - alpha - - 2006-11-09 - BSD License - - - Fixed bug #9274 : nested_parenthesis element not set for open and close parenthesis tokens - - - - - 0.2.0 - 0.2.0 - - - alpha - alpha - - 2006-10-13 - BSD License - - - Added a generic standards package that will contain generic sniffs to be used in specific coding standards - - thanks to Frederic Poeydomenge for the idea - - Changed PEAR standard to use generic sniffs where available - - Added LowerCaseConstantSniff to Generic standard - - Added UpperCaseConstantSniff to Generic standard - - Added DisallowShortOpenTagSniff to Generic standard - - Added LineLengthSniff to Generic standard - - Added UpperCaseConstantNameSniff to Generic standard - - Added OpeningMethodBraceBsdAllmanSniff to Generic standard (contrib by Frederic Poeydomenge) - - Added OpeningMethodBraceKernighanRitchieSniff to Generic standard (contrib by Frederic Poeydomenge) - - Added framework for core PHP_CodeSniffer unit tests - - Added unit test for PHP_CodeSniffer:isCamelCaps method - - ScopeClosingBraceSniff now checks indentation of BREAK statements - - Added new command line arg (-vv) to show developer debug output - - Fixed some coding standard errors - - Fixed bug #8834 : Massive memory consumption - - Fixed bug #8836 : path case issues in package.xml - - Fixed bug #8843 : confusion on nested switch() - - Fixed bug #8841 : comments taken as whitespace - - Fixed bug #8884 : another problem with nested switch() statements - - - - - 0.1.1 - 0.1.1 - - - alpha - alpha - - 2006-09-25 - BSD License - - - Added unit tests for all PEAR sniffs - - Exception class now extends from PEAR_Exception - - Fixed summary report so files without errors but with warnings are not shown when warnings are hidden - - - - - 0.1.0 - 0.1.0 - - - alpha - alpha - - 2006-09-19 - BSD License - - - Reorganised package contents to conform to PEAR standards - - Changed version numbering to conform to PEAR standards - - Removed duplicate require_once() of Exception.php from CodeSniffer.php - - - - - 0.0.5 - 0.0.5 - - - alpha - alpha - - 2006-09-18 - BSD License - - - Fixed .bat file for situation where php.ini cannot be found so include_path is not set - - - - - 0.0.4 - 0.0.4 - - - alpha - alpha - - 2006-08-28 - BSD License - - - Added .bat file for easier running of PHP_CodeSniffer on Windows - - Sniff that checks method names now works for PHP4 style code where there is no scope keyword - - Sniff that checks method names now works for PHP4 style constructors - - Sniff that checks method names no longer incorrectly reports error with magic methods - - Sniff that checks method names now reports errors with non-magic methods prefixed with __ - - Sniff that checks for constant names no longer incorrectly reports errors with heredoc strings - - Sniff that checks for constant names no longer incorrectly reports errors with created objects - - Sniff that checks indentation no longer incorrectly reports errors with heredoc strings - - Sniff that checks indentation now correctly reports errors with improperly indented multi-line strings - - Sniff that checks function declarations now checks for spaces before and after an equals sign for default values - - Sniff that checks function declarations no longer incorrectly reports errors with multi-line declarations - - Sniff that checks included code no longer incorrectly reports errors when return value is used conditionally - - Sniff that checks opening brace of function no longer incorrectly reports errors with multi-line declarations - - Sniff that checks spacing after commas in function calls no longer reports too many errors for some code - - Sniff that checks control structure declarations now gives more descriptive error message - - - - - 0.0.3 - 0.0.3 - - - alpha - alpha - - 2006-08-22 - BSD License - - - Added sniff to check for invalid class and interface names - - Added sniff to check for invalid function and method names - - Added sniff to warn if line is greater than 85 characters - - Added sniff to check that function calls are in the correct format - - Fixed error where comments were not allowed on the same line as a control structure declaration - - Added command line arg to print current version (--version) - - - - - 0.0.2 - 0.0.2 - - - alpha - alpha - - 2006-07-25 - BSD License - - - Removed the including of checked files to stop errors caused by parsing them - - Removed the use of reflection so checked files do not have to be included - - Memory usage has been greatly reduced - - Much faster tokenising and checking times - - Reworked the PEAR coding standard sniffs (much faster now) - - Fix some bugs with the PEAR scope indentation standard - - Better checking for installed coding standards - - Can now accept multiple files and dirs on the command line - - Added an option to list installed coding standards - - Added an option to print a summary report (number of errors and warnings shown for each file) - - Added an option to hide warnings from reports - - Added an option to print verbose output (so you know what is going on) - - Reordered command line args to put switches first (although order is not enforced) - - Switches can now be specified together (eg. php -nv) as well as separately (phpcs -n -v) - - - - - 0.0.1 - 0.0.1 - - - alpha - alpha - - 2006-07-19 - BSD License - Initial preview release. - - - diff --git a/scripts/ValidatePEAR/ValidatePEARPackageXML.php b/scripts/ValidatePEAR/ValidatePEARPackageXML.php deleted file mode 100644 index 5c1d2d1f0f..0000000000 --- a/scripts/ValidatePEAR/ValidatePEARPackageXML.php +++ /dev/null @@ -1,363 +0,0 @@ - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -use PHP_CodeSniffer\Tests\FileList; - -/** - * Validate the PHP_CodeSniffer PEAR package.xml file. - */ -class ValidatePEARPackageXML -{ - - /** - * The root directory of the project. - * - * @var string - */ - protected $projectRoot = ''; - - /** - * The contents of the package.xml file. - * - * @var \SimpleXMLElement - */ - protected $packageXML; - - /** - * List of all files in the repo. - * - * @var array - */ - protected $allFiles = []; - - /** - * Valid file roles. - * - * @var array - * - * @link https://pear.php.net/manual/en/developers.packagedef.intro.php#developers.packagedef.roles - */ - private $validRoles = [ - 'data' => true, - 'doc' => true, - 'ext' => true, - 'extsrc' => true, - 'php' => true, - 'script' => true, - 'src' => true, - 'test' => true, - ]; - - /** - * Files encountered in the package.xml tag. - * - * @var array - */ - private $listedContents = []; - - - /** - * Constructor. - */ - public function __construct() - { - $this->projectRoot = dirname(dirname(__DIR__)).'/'; - $this->packageXML = simplexml_load_file($this->projectRoot.'package.xml'); - - $allFiles = (new FileList($this->projectRoot, $this->projectRoot))->getList(); - $this->allFiles = array_flip($allFiles); - - }//end __construct() - - - /** - * Validate the file listings in the package.xml file. - * - * @return void - */ - public function validate() - { - $exitCode = 0; - if ($this->checkContents() !== true) { - $exitCode = 1; - } - - if ($this->checkPHPRelease() !== true) { - $exitCode = 1; - } - - exit($exitCode); - - }//end validate() - - - /** - * Validate the file listings in the tag. - * - * @return bool - */ - protected function checkContents() - { - echo PHP_EOL.'Checking Contents tag'.PHP_EOL; - echo '====================='.PHP_EOL; - - $valid = true; - - /* - * - Check that every file that is mentioned in the `` tag exists in the repo. - * - Check that the "role" value is valid. - * - Check that the "baseinstalldir" value is valid. - */ - - $valid = $this->walkDirTag($this->packageXML->contents); - if ($valid === true) { - echo "Existing listings in the Contents tag are valid.".PHP_EOL; - } - - /* - * Verify that all files in the `src` and the `tests` directories are listed in the `` tag. - */ - - $srcFiles = (new FileList( - $this->projectRoot.'src/', - $this->projectRoot, - '`\.(css|fixed|inc|js|php|xml)$`Di' - ))->getList(); - $testsFiles = (new FileList( - $this->projectRoot.'tests/', - $this->projectRoot, - '`\.(css|inc|js|php|xml)$`Di' - ))->getList(); - $files = array_merge($srcFiles, $testsFiles); - - foreach ($files as $file) { - if (isset($this->listedContents[$file]) === true) { - continue; - } - - echo "- File '{$file}' is missing from Contents tag.".PHP_EOL; - $valid = false; - } - - if ($valid === true) { - echo "No missing files in the Contents tag.".PHP_EOL; - } - - return $valid; - - }//end checkContents() - - - /** - * Validate all child tags within a tag. - * - * @param \SimpleXMLElement $tag The current XML tag to examine. - * @param string $currentDirectory The complete relative path to the - * directory being examined. - * - * @return bool - */ - protected function walkDirTag($tag, $currentDirectory='') - { - $valid = true; - $name = (string) $tag['name']; - if ($name !== '/' && empty($name) === false) { - $currentDirectory .= $name.'/'; - } - - $children = $tag->children(); - foreach ($children as $key => $value) { - if ($key === 'dir') { - if ($this->walkDirTag($value, $currentDirectory) === false) { - $valid = false; - } - } - - if ($key === 'file') { - if ($this->checkFileTag($value, $currentDirectory) === false) { - $valid = false; - } - } - } - - return $valid; - - }//end walkDirTag() - - - /** - * Validate the information within a tag. - * - * @param \SimpleXMLElement $tag The current XML tag to examine. - * @param string $currentDirectory The complete relative path to the - * directory being examined. - * - * @return bool - */ - protected function checkFileTag($tag, $currentDirectory='') - { - $valid = true; - $attributes = $tag->attributes(); - $baseinstalldir = (string) $attributes['baseinstalldir']; - $name = $currentDirectory.(string) $attributes['name']; - $role = (string) $attributes['role']; - - $this->listedContents[$name] = true; - - if (empty($name) === true) { - echo "- Name attribute missing.".PHP_EOL; - $valid = false; - } else { - if (isset($this->allFiles[$name]) === false) { - echo "- File '{$name}' does not exist.".PHP_EOL; - $valid = false; - } - - if (empty($role) === true) { - echo "- Role attribute missing for file '{$name}'.".PHP_EOL; - $valid = false; - } else { - if (isset($this->validRoles[$role]) === false) { - echo "- Role for file '{$name}' is invalid.".PHP_EOL; - $valid = false; - } else { - // Limited validation of the "role" tags. - if ((strpos($name, 'tests/') === 0 || strpos($name, 'Test.') !== false) && $role !== 'test') { - echo "- Test files should have the role 'test'. Found: '$role' for file '{$name}'.".PHP_EOL; - $valid = false; - } else if (strpos($name, 'tests/') !== 0 - && (strpos($name, 'Standard.xml') !== false || strpos($name, 'Sniff.php') !== false) - && $role !== 'php' - ) { - echo "- Sniff files, including sniff documentation files should have the role 'php'. Found: '$role' for file '{$name}'.".PHP_EOL; - $valid = false; - } - } - - if (empty($baseinstalldir) === true) { - if ($role !== 'script' && strpos($name, 'tests/') !== 0) { - echo "- Baseinstalldir attribute missing for file '{$name}'.".PHP_EOL; - $valid = false; - } - } else { - if ($role === 'script' || strpos($name, 'tests/') === 0) { - echo "- Baseinstalldir for file '{$name}' should be empty.".PHP_EOL; - $valid = false; - } - - if ($role !== 'script' && $baseinstalldir !== 'PHP/CodeSniffer') { - echo "- Baseinstalldir for file '{$name}' is invalid.".PHP_EOL; - $valid = false; - } - } - }//end if - }//end if - - return $valid; - - }//end checkFileTag() - - - /** - * Validate the file listings in the tags. - * - * @return bool True if the info in the "phprelease" tags is valid. False otherwise. - */ - protected function checkPHPRelease() - { - echo PHP_EOL.'Checking PHPRelease tags'.PHP_EOL; - echo '========================'.PHP_EOL; - - $valid = true; - $listedFiles = []; - $releaseTags = 1; - - /* - * - Check that every file that is mentioned in the `` tags exists in the repo. - * - Check that the "as" value is valid. - */ - - foreach ($this->packageXML->phprelease as $release) { - foreach ($release->filelist->install as $install) { - $attributes = $install->attributes(); - $name = (string) $attributes['name']; - $as = (string) $attributes['as']; - - $listedFiles[$releaseTags][$name] = $as; - - if (empty($as) === true || empty($name) === true) { - continue; - } - - if (isset($this->allFiles[$name]) === false) { - echo "- File '{$name}' does not exist.".PHP_EOL; - $valid = false; - } - - // Rest of the checks only apply to the test files. - if (strpos($name, 'tests/') !== 0) { - continue; - } - - // Check validity of the tags for files in the tests root directory. - if (preg_match('`^tests/([^/]+\.php)$`', $name, $matches) === 1 - && ($as === $name || $as === $matches[1]) - ) { - continue; - } - - // Check validity of the tags for files in the tests root subdirectories. - if (preg_match('`^tests/.+\.(php|inc|js|css|xml)$`', $name) === 1 - && $as === str_replace('tests/', 'CodeSniffer/', $name) - ) { - continue; - } - - echo "- Invalid 'as' attribute '{$as}' for test file '{$name}'.".PHP_EOL; - $valid = false; - }//end foreach - - ++$releaseTags; - }//end foreach - - if ($valid === true) { - echo "Existing PHPRelease tags are valid.".PHP_EOL; - } - - /* - * Verify that all files in the `tests` directory are listed in both `` tags. - */ - - $testFiles = (new FileList($this->projectRoot.'tests/', $this->projectRoot, '`\.(inc|php|js|css|xml)$`Di'))->getList(); - - foreach ($testFiles as $file) { - foreach ($listedFiles as $key => $listed) { - if (isset($listed[$file]) === true) { - continue; - } - - echo "- File '{$file}' is missing from PHPRelease tag [{$key}] .".PHP_EOL; - $valid = false; - } - } - - if ($valid === true) { - echo "No missing PHPRelease tags.".PHP_EOL; - } - - return $valid; - - }//end checkPHPRelease() - - -}//end class diff --git a/scripts/validate-pear-package.php b/scripts/validate-pear-package.php deleted file mode 100644 index 1d373f25f9..0000000000 --- a/scripts/validate-pear-package.php +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env php - - * @copyright 2019 Juliette Reinders Folmer. All rights reserved. - * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence - */ - -require_once dirname(__DIR__).'/tests/FileList.php'; -require_once __DIR__.'/ValidatePEAR/ValidatePEARPackageXML.php'; - -$validate = new ValidatePEARPackageXML(); -$validate->validate(); diff --git a/src/Config.php b/src/Config.php index ffad6cb8f1..aba5450327 100644 --- a/src/Config.php +++ b/src/Config.php @@ -1581,13 +1581,6 @@ public static function setConfigData($key, $value, $temp=false) $configFile = dirname($path).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; } else { $configFile = dirname(__DIR__).DIRECTORY_SEPARATOR.'CodeSniffer.conf'; - if (is_file($configFile) === false - && strpos('@data_dir@', '@data_dir') === false - ) { - // If data_dir was replaced, this is a PEAR install and we can - // use the PEAR data dir to store the conf file. - $configFile = '@data_dir@/PHP_CodeSniffer/CodeSniffer.conf'; - } } if (is_file($configFile) === true diff --git a/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.php b/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.php index 3aae0bab07..e94b5d47ce 100644 --- a/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.php +++ b/src/Standards/Generic/Tests/Files/ExecutableFileUnitTest.php @@ -22,10 +22,8 @@ class ExecutableFileUnitTest extends AbstractSniffUnitTest */ protected function shouldSkipTest() { - // PEAR doesn't preserve the executable flag, so skip - // tests when running in a PEAR install. - // Also skip on Windows which doesn't have the concept of executable files. - return ($GLOBALS['PHP_CODESNIFFER_PEAR'] || stripos(PHP_OS, 'WIN') === 0); + // Skip on Windows which doesn't have the concept of executable files. + return (stripos(PHP_OS, 'WIN') === 0); }//end shouldSkipTest() diff --git a/tests/AllTests.php b/tests/AllTests.php index cb22aabf1b..5ee125f437 100644 --- a/tests/AllTests.php +++ b/tests/AllTests.php @@ -9,14 +9,8 @@ namespace PHP_CodeSniffer\Tests; -if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === false) { - include_once 'Core/AllTests.php'; - include_once 'Standards/AllSniffs.php'; -} else { - include_once 'CodeSniffer/Core/AllTests.php'; - include_once 'CodeSniffer/Standards/AllSniffs.php'; - include_once 'FileList.php'; -} +require_once 'Core/AllTests.php'; +require_once 'Standards/AllSniffs.php'; // PHPUnit 7 made the TestSuite run() method incompatible with // older PHPUnit versions due to return type hints, so maintain diff --git a/tests/Core/Filters/Filter/AcceptTest.php b/tests/Core/Filters/Filter/AcceptTest.php index 84c4487abc..83affe9bc1 100644 --- a/tests/Core/Filters/Filter/AcceptTest.php +++ b/tests/Core/Filters/Filter/AcceptTest.php @@ -33,23 +33,6 @@ class AcceptTest extends TestCase protected static $ruleset; - /** - * Initialize the test. - * - * @return void - */ - public function setUp() - { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - - }//end setUp() - - /** * Initialize the config and ruleset objects based on the `AcceptTest.xml` ruleset file. * @@ -57,11 +40,6 @@ public function setUp() */ public static function setUpBeforeClass() { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // This test will be skipped. - return; - } - $standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; self::$config = new Config(["--standard=$standard", "--ignore=*/somethingelse/*"]); self::$ruleset = new Ruleset(self::$config); diff --git a/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php b/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php index 079934a6b5..a41c856882 100644 --- a/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php +++ b/tests/Core/Ruleset/RuleInclusionAbsoluteLinuxTest.php @@ -45,13 +45,6 @@ class RuleInclusionAbsoluteLinuxTest extends TestCase */ public function setUp() { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - $this->standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; $repoRootDir = dirname(dirname(dirname(__DIR__))); diff --git a/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php b/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php index 633b729306..b7c4410a06 100644 --- a/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php +++ b/tests/Core/Ruleset/RuleInclusionAbsoluteWindowsTest.php @@ -49,13 +49,6 @@ public function setUp() $this->markTestSkipped('Windows specific test'); } - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - $this->standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; $repoRootDir = dirname(dirname(dirname(__DIR__))); diff --git a/tests/Core/Ruleset/RuleInclusionTest.php b/tests/Core/Ruleset/RuleInclusionTest.php index 6772d54c76..b74c54d394 100644 --- a/tests/Core/Ruleset/RuleInclusionTest.php +++ b/tests/Core/Ruleset/RuleInclusionTest.php @@ -38,23 +38,6 @@ class RuleInclusionTest extends TestCase private static $contents = ''; - /** - * Initialize the test. - * - * @return void - */ - public function setUp() - { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - - }//end setUp() - - /** * Initialize the config and ruleset objects based on the `RuleInclusionTest.xml` ruleset file. * @@ -62,11 +45,6 @@ public function setUp() */ public static function setUpBeforeClass() { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // This test will be skipped. - return; - } - $standard = __DIR__.'/'.basename(__FILE__, '.php').'.xml'; self::$standard = $standard; diff --git a/tests/Core/Ruleset/SetSniffPropertyTest.php b/tests/Core/Ruleset/SetSniffPropertyTest.php index 5add67b1e4..5f5b882103 100644 --- a/tests/Core/Ruleset/SetSniffPropertyTest.php +++ b/tests/Core/Ruleset/SetSniffPropertyTest.php @@ -22,23 +22,6 @@ class SetSniffPropertyTest extends TestCase { - /** - * Initialize the test. - * - * @return void - */ - public function setUp() - { - if ($GLOBALS['PHP_CODESNIFFER_PEAR'] === true) { - // PEAR installs test and sniff files into different locations - // so these tests will not pass as they directly reference files - // by relative location. - $this->markTestSkipped('Test cannot run from a PEAR install'); - } - - }//end setUp() - - /** * Test that setting a property via the ruleset works in all situations which allow for it. * diff --git a/tests/Standards/AllSniffs.php b/tests/Standards/AllSniffs.php index ced988e920..e355d90dab 100644 --- a/tests/Standards/AllSniffs.php +++ b/tests/Standards/AllSniffs.php @@ -61,20 +61,11 @@ public static function suite() foreach ($installedStandards as $standard => $details) { Autoload::addSearchPath($details['path'], $details['namespace']); - // If the test is running PEAR installed, the built-in standards - // are split into different directories; one for the sniffs and - // a different file system location for tests. - if ($isInstalled === true && is_dir(dirname($details['path']).DIRECTORY_SEPARATOR.'Generic') === true) { - $testPath = realpath(__DIR__.'/../../src/Standards/'.$standard); - } else { - $testPath = $details['path']; - } - if (in_array($standard, $ignoreTestsForStandards, true) === true) { continue; } - $testsDir = $testPath.DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR; + $testsDir = $details['path'].DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR; if (is_dir($testsDir) === false) { // No tests for this standard. continue; diff --git a/tests/bootstrap.php b/tests/bootstrap.php index e8020a06fc..8d91b156f7 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -44,13 +44,6 @@ class_alias('PHPUnit_TextUI_TestRunner', 'PHPUnit'.'\TextUI\TestRunner'); class_alias('PHPUnit_Framework_TestResult', 'PHPUnit'.'\Framework\TestResult'); } -// Determine whether this is a PEAR install or not. -$GLOBALS['PHP_CODESNIFFER_PEAR'] = false; - -if (is_file(__DIR__.'/../autoload.php') === false) { - $GLOBALS['PHP_CODESNIFFER_PEAR'] = true; -} - /** * A global util function to help print unit test fixing data.