diff --git a/WordPress/Sniffs/Arrays/ArrayDeclarationSpacingSniff.php b/WordPress/Sniffs/Arrays/ArrayDeclarationSpacingSniff.php index ae44ca523b..2e8b794e05 100644 --- a/WordPress/Sniffs/Arrays/ArrayDeclarationSpacingSniff.php +++ b/WordPress/Sniffs/Arrays/ArrayDeclarationSpacingSniff.php @@ -38,13 +38,25 @@ * `allow_single_item_single_line_associative_arrays` property. * @since 3.0.0 Removed various whitespace related checks and fixers in favor of the PHPCSExtra * `NormalizedArrays.Arrays.ArrayBraceSpacing` sniff. + * @since 3.4.0 The `allow_single_item_single_line_associative_arrays` property has been + * deprecated in favor of the new `allow_single_item_single_line_explicit_key_arrays` property. */ final class ArrayDeclarationSpacingSniff extends Sniff { + /** + * Whether to allow single item arrays with explicit keys to be single line. + * + * @since 3.4.0 + * + * @var bool Defaults to true. + */ + public $allow_single_item_single_line_explicit_key_arrays = true; + /** * Whether or not to allow single item arrays with explicit keys to be single line. * * @since 0.14.0 + * @deprecated 3.4.0 Use $allow_single_item_single_line_explicit_key_arrays instead. * * @var bool Defaults to true. */ @@ -114,10 +126,19 @@ public function process_token( $stackPtr ) { * @return void */ protected function process_single_line_array( $stackPtr, $opener, $closer ) { + // For now, if the new property has not been changed from its default value and the deprecated property has, use + // the deprecated property's value. + $allow_single_item = $this->allow_single_item_single_line_explicit_key_arrays; + if ( true === $allow_single_item + && false === $this->allow_single_item_single_line_associative_arrays + ) { + $allow_single_item = false; + } + $array_items = PassedParameters::getParameters( $this->phpcsFile, $stackPtr ); - if ( ( false === $this->allow_single_item_single_line_associative_arrays + if ( ( false === $allow_single_item && empty( $array_items ) ) - || ( true === $this->allow_single_item_single_line_associative_arrays + || ( true === $allow_single_item && \count( $array_items ) === 1 ) ) { return; @@ -138,7 +159,7 @@ protected function process_single_line_array( $stackPtr, $opener, $closer ) { return; } $error = 'When an array is declared with explicit keys, each value should start on %s.'; - if ( true === $this->allow_single_item_single_line_associative_arrays ) { + if ( true === $allow_single_item ) { $error = 'When a multi-item array is declared with explicit keys, each value should start on %s.'; } diff --git a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.1.inc b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.1.inc index fd47c0a3a9..5bd00f8acf 100644 --- a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.1.inc +++ b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.1.inc @@ -82,6 +82,15 @@ $bad = array( // Don't confuse list arrows with array arrows. $okay = array( $item1, list( 'key1' => $a, 'key2' => $b ) = $array, $item3 ); -// Live coding/parse error. -// This must be the last test in the file! -$ignore = array( $item1, 'key' => 'value', +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_explicit_key_arrays false + +$bad = array( 'key' => 'value' ); // Bad. +$bad = array( 'key1' => 'value1', 'key2' => 'value2' ); // Bad. + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_explicit_key_arrays true + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_associative_arrays null + +$ok = array( 'key' => 'value' ); // OK, invalid value for deprecated property should be ignored. + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_associative_arrays true diff --git a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.1.inc.fixed b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.1.inc.fixed index c0bddcc551..267427ae3b 100644 --- a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.1.inc.fixed +++ b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.1.inc.fixed @@ -135,6 +135,20 @@ $bad = array( // Don't confuse list arrows with array arrows. $okay = array( $item1, list( 'key1' => $a, 'key2' => $b ) = $array, $item3 ); -// Live coding/parse error. -// This must be the last test in the file! -$ignore = array( $item1, 'key' => 'value', +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_explicit_key_arrays false + +$bad = array( +'key' => 'value' +); // Bad. +$bad = array( +'key1' => 'value1', +'key2' => 'value2' +); // Bad. + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_explicit_key_arrays true + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_associative_arrays null + +$ok = array( 'key' => 'value' ); // OK, invalid value for deprecated property should be ignored. + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_associative_arrays true diff --git a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.2.inc b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.2.inc index 34ea62060f..da24a06279 100644 --- a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.2.inc +++ b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.2.inc @@ -107,3 +107,10 @@ $bad = [ // Don't confuse list arrows with array arrows. $okay = [ $item1, [ 'key1' => $a, 'key2' => $b ] = $array, $item3 ]; + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_explicit_key_arrays false + +$bad = [ 'key' => 'value' ]; // Bad. +$bad = [ 'key1' => 'value1', 'key2' => 'value2' ]; // Bad. + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_explicit_key_arrays true diff --git a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.2.inc.fixed b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.2.inc.fixed index c4b03f73cc..3480020aa9 100644 --- a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.2.inc.fixed +++ b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.2.inc.fixed @@ -163,3 +163,15 @@ $bad = [ // Don't confuse list arrows with array arrows. $okay = [ $item1, [ 'key1' => $a, 'key2' => $b ] = $array, $item3 ]; + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_explicit_key_arrays false + +$bad = [ +'key' => 'value' +]; // Bad. +$bad = [ +'key1' => 'value1', +'key2' => 'value2' +]; // Bad. + +// phpcs:set WordPress.Arrays.ArrayDeclarationSpacing allow_single_item_single_line_explicit_key_arrays true diff --git a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.3.inc b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.3.inc new file mode 100644 index 0000000000..184b1da687 --- /dev/null +++ b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.3.inc @@ -0,0 +1,8 @@ + 'value', diff --git a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.php b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.php index 9a289959e6..6a46292970 100644 --- a/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.php +++ b/WordPress/Tests/Arrays/ArrayDeclarationSpacingUnitTest.php @@ -51,29 +51,33 @@ public function getErrorList( $testFile = '' ) { 62 => 1, 63 => 1, 75 => 1, + 87 => 1, + 88 => 1, ); // Short arrays. case 'ArrayDeclarationSpacingUnitTest.2.inc': return array( - 9 => 4, - 13 => 2, - 15 => 1, - 19 => 1, - 22 => 1, - 25 => 1, - 44 => 1, - 45 => 1, - 48 => 1, - 49 => 1, - 52 => 2, - 54 => 1, - 57 => 1, - 58 => 1, - 62 => 1, - 63 => 1, - 75 => 1, - 97 => 1, + 9 => 4, + 13 => 2, + 15 => 1, + 19 => 1, + 22 => 1, + 25 => 1, + 44 => 1, + 45 => 1, + 48 => 1, + 49 => 1, + 52 => 2, + 54 => 1, + 57 => 1, + 58 => 1, + 62 => 1, + 63 => 1, + 75 => 1, + 97 => 1, + 113 => 1, + 114 => 1, ); default: