Browse Source

NullableTypeTransformer - constructor property promotion support

Grzegorz Korba 4 years ago
parent
commit
209f8986f6

+ 13 - 1
src/Tokenizer/Transformer/NullableTypeTransformer.php

@@ -55,7 +55,19 @@ final class NullableTypeTransformer extends AbstractTransformer
         $prevIndex = $tokens->getPrevMeaningfulToken($index);
         $prevToken = $tokens[$prevIndex];
 
-        if ($prevToken->equalsAny(['(', ',', [CT::T_TYPE_COLON], [T_PRIVATE], [T_PROTECTED], [T_PUBLIC], [T_VAR], [T_STATIC]])) {
+        if ($prevToken->equalsAny([
+            '(',
+            ',',
+            [CT::T_TYPE_COLON],
+            [CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC],
+            [CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED],
+            [CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE],
+            [T_PRIVATE],
+            [T_PROTECTED],
+            [T_PUBLIC],
+            [T_VAR],
+            [T_STATIC],
+        ])) {
             $tokens[$index] = new Token([CT::T_NULLABLE_TYPE, '?']);
         }
     }

+ 32 - 0
tests/Fixer/Operator/TernaryOperatorSpacesFixerTest.php

@@ -197,4 +197,36 @@ $a = ($b
             ],
         ];
     }
+
+    /**
+     * @param string      $expected
+     * @param null|string $input
+     *
+     * @dataProvider provideFix80Cases
+     * @requires PHP 8.0
+     */
+    public function testFix80($expected, $input = null)
+    {
+        $this->doTest($expected, $input);
+    }
+
+    public function provideFix80Cases()
+    {
+        return [
+            'nullable types in constructor property promotion' => [
+                '<?php
+
+class Foo
+{
+    public function __construct(
+        private ?string $foo = null,
+        protected ?string $bar = null,
+        public ?string $xyz = null,
+    ) {
+        /* ternary operator to make the file a candidate for fixing */ true ? 1 : 0;
+    }
+}',
+            ],
+        ];
+    }
 }

+ 40 - 0
tests/Tokenizer/Transformer/NullableTypeTransformerTest.php

@@ -135,4 +135,44 @@ final class NullableTypeTransformerTest extends AbstractTransformerTestCase
             ],
         ];
     }
+
+    /**
+     * @param string $source
+     *
+     * @dataProvider provideProcess80Cases
+     * @requires PHP 8.0
+     */
+    public function testProcess80($source, array $expectedTokens = [])
+    {
+        $this->doTest(
+            $source,
+            $expectedTokens,
+            [
+                CT::T_NULLABLE_TYPE,
+            ]
+        );
+    }
+
+    public function provideProcess80Cases()
+    {
+        return [
+            [
+                '<?php
+                    class Foo
+                    {
+                        public function __construct(
+                            private ?string $foo = null,
+                            protected ?string $bar = null,
+                            public ?string $xyz = null,
+                        ) {
+                        }
+                    }',
+                [
+                    17 => CT::T_NULLABLE_TYPE,
+                    29 => CT::T_NULLABLE_TYPE,
+                    41 => CT::T_NULLABLE_TYPE,
+                ],
+            ],
+        ];
+    }
 }