This is an automated email from the ASF dual-hosted git repository.

junichi11 pushed a commit to branch php-nb21-features
in repository https://gitbox.apache.org/repos/asf/netbeans.git

commit b0a98ffdffee5b331c39c91188a2a327b3e10dbb
Author: Junichi Yamamoto <junich...@apache.org>
AuthorDate: Mon Oct 16 11:57:08 2023 +0900

    PHP 8.2 Support: Disjunctive Normal Form Types (Part 8)
    
    - https://github.com/apache/netbeans/issues/4725
    - https://wiki.php.net/rfc/dnf_types
    - Fix the formatter(Prevent adding `WHITESPACE_BEFORE_METHOD_DEC_PAREN` 
twice)
    ```php
    // e.g. the following case has "(("
    function example((X&Y)|Z $param): void {}
    ```
    - Add a unit test
---
 .../modules/php/editor/indent/FormatVisitor.java   |   5 +-
 .../testfiles/formatting/php82/dnfTypes_01.php     | 190 ++++++++++++++
 .../formatting/php82/dnfTypes_01.php.formatted     | 281 +++++++++++++++++++++
 .../php/editor/indent/PHPFormatterTest.java        |   5 +
 4 files changed, 480 insertions(+), 1 deletion(-)

diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/indent/FormatVisitor.java 
b/php/php.editor/src/org/netbeans/modules/php/editor/indent/FormatVisitor.java
index c03939e031..2913ec7a66 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/indent/FormatVisitor.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/indent/FormatVisitor.java
@@ -1465,13 +1465,16 @@ public class FormatVisitor extends DefaultVisitor {
         scan(node.getAttributes());
         scan(node.getFunctionName());
 
+        // e.g. function paramHasDNFType((X&Y)|Z $test): void {}
+        boolean addedOpenParen = false;
         // #270903 add indent
         while (ts.moveNext() && (ts.token().id() == PHPTokenId.WHITESPACE
                 || isComment(ts.token())
-                || isOpenParen(ts.token()))) {
+                || (isOpenParen(ts.token()) && !addedOpenParen))) {
             addFormatToken(formatTokens);
             if (isOpenParen(ts.token())) {
                 formatTokens.add(new FormatToken.IndentToken(ts.offset() + 
ts.token().length(), options.continualIndentSize));
+                addedOpenParen = true;
             }
         }
         ts.movePrevious();
diff --git 
a/php/php.editor/test/unit/data/testfiles/formatting/php82/dnfTypes_01.php 
b/php/php.editor/test/unit/data/testfiles/formatting/php82/dnfTypes_01.php
new file mode 100644
index 0000000000..7fa34460fa
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/formatting/php82/dnfTypes_01.php
@@ -0,0 +1,190 @@
+<?php
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+class ClassX {
+const IMPLICIT_X_CONSTANT = "implicit constant";
+public const PUBLIC_X_CONSTANT = "public constant";
+private const PRIVATE_X_CONSTANT = "private constant";
+protected const PROTECTED_X_CONSTANT = "protected constant";
+    public (ClassY   &   ClassZ)   |   ClassX $publicXField;
+private (ClassX&ClassZ)|(ClassY&ClassZ)|ClassX $privateXField;
+protected ClassX|(ClassY&ClassZ)|    ClassY     $protectedXField;
+public static      (ClassY&ClassZ)|ClassX $publicStaticXField;
+private static (ClassY&ClassZ)|ClassY $privateStaticXField;
+protected static (ClassY&ClassZ)   |      ClassX|ClassY $protectedStaticXField;
+
+public function publicXMethod((ClassY&ClassZ)|ClassX $param1): 
ClassX|(ClassY&ClassZ) {}
+ private function privateMXethod(ClassZ|(ClassY&ClassZ)|ClassX $param1 = 
null): (ClassY&ClassZ)|ClassX {}
+       protected function protectedXMethod(  (ClassY & ClassZ)   |(ClassX   
&ClassZ) $param1): (ClassY&ClassZ)|(ClassX&ClassZ) {}
+public static function publicStaticXMethod(ClassX | (ClassY & ClassZ) $param1, 
int $param2): (ClassY&ClassZ)|ClassX {}
+     private static function privateStaticXMethod(int $param1, 
(ClassX&ClassY)|ClassZ $param2): ClassX|(ClassY&ClassZ){}
+protected static function   protectedStaticXMethod(ClassX|null $param1, 
(ClassX&ClassZ)|null $param2 = null): (ClassY&ClassZ)|ClassX {}
+}
+
+class ClassY {
+const IMPLICIT_Y_CONSTANT = "implicit constant";
+public const PUBLIC_Y_CONSTANT = "public constant";
+private const PRIVATE_Y_CONSTANT = "private constant";
+            protected const PROTECTED_Y_CONSTANT = "protected constant";
+public (ClassY&ClassZ)|    ClassX $publicYField;
+          private (ClassX&ClassZ)|(ClassY&ClassZ)|ClassX $privateYField;
+protected ClassX|(ClassY&ClassZ)|ClassY $protectedYField;
+public static (ClassY&     ClassZ)|ClassX $publicStaticYField;
+private static (    ClassY&ClassZ)|ClassY $privateStaticYField;
+protected static (ClassY&ClassZ)|ClassX|ClassY $protectedStaticYField;
+
+public function publicYMethod((ClassY&ClassZ)|   ClassX $param1, 
(ClassY&ClassZ)|ClassX|(ClassX&ClassZ) $param2): ClassX|(ClassY&ClassZ) {}
+private function privateYMethod(ClassX $param1, (ClassY&ClassZ)   |null 
$param2): (ClassY&ClassZ)|ClassX {}
+protected function protectedYMethod((ClassY&ClassZ)|   ClassX $param1, 
ClassY|(ClassX&ClassZ&ClassY) $param2): (ClassY&ClassZ)|(ClassX&ClassZ) {}
+public static function publicStaticYMethod(null|(ClassY&ClassZ)|   ClassX 
$param1): (ClassY&ClassZ)|ClassX {}
+private static function privateStaticYMethod(    (ClassY&ClassZ)|ClassX|ClassY 
$param): ClassX|(ClassY&ClassZ){}
+protected static function protectedStaticYMethod(      
(ClassY&ClassZ)|(ClassX&ClassZ) $param1): (ClassY&ClassZ)|ClassX {}
+}
+
+class ClassZ {
+const IMPLICIT_Z_CONSTANT = "implicit constant";
+public const PUBLIC_Z_CONSTANT = "public constant";
+private const PRIVATE_Z_CONSTANT = "private constant";
+protected const PROTECTED_Z_CONSTANT = "protected constant";
+public (ClassY&ClassZ)|ClassX $publicZField;
+private (ClassX&ClassZ)|(ClassY&ClassZ)|ClassX $privateZField;
+protected ClassX|(ClassY&ClassZ)|ClassY $protectedZField;
+public static (ClassY&ClassZ)|ClassX $publicStaticZField;
+private static (ClassY&ClassZ)|ClassY $privateStaticZField;
+protected static (ClassY&ClassZ)|ClassX|ClassY $protectedStaticZField;
+
+public function publicZMethod(
+        ClassX|(ClassY&ClassZ)|ClassY $param1
+        ): ClassX|(ClassY&ClassZ)|ClassY {}
+private function privateZMethod(): (ClassY&ClassZ)|ClassX {}
+protected function protectedZMethod(ClassX $param = null): 
(ClassY&ClassZ)|(ClassX&ClassZ) {}
+public static function publicStaticZMethod(ClassX&ClassY $param): 
(ClassX&ClassZ)|(ClassY&ClassZ)|ClassX {}
+private static function privateStaticZMethod(ClassX|null $param): 
ClassX|(ClassY&ClassZ){}
+protected static function protectedStaticZMethod(
+        int $param,
+        ClassX|ClassY $param2
+        ): (ClassY&ClassZ)|ClassX {}
+}
+
+trait TestTrait {
+  const IMPLICIT_TRAIT_CONSTANT = "implicit constant";
+  public const PUBLIC_TRAIT_CONSTANT = "public constant";
+  private const PRIVATE_TRAIT_CONSTANT = "private constant";
+  protected const PROTECTED_TRAIT_CONSTANT = "protected constant";
+  public (ClassX&ClassY)|ClassY $publicTraitField;
+  private (ClassX&ClassY)|(ClassY&ClassZ) $privateTraitField;
+  protected ClassY|(ClassX&ClassY) $protectedTraitField;
+  public static ClassY|(ClassX&ClassY)|ClassX $publicStaticTraitField;
+  private static (ClassX&ClassZ)|ClassY $privateStaticTraitField;
+  protected static (ClassX&ClassY&ClassZ)|ClassX $protectedStaticTraitField;
+
+  public function publicTraitMethod(?ClassX $param): (ClassX&ClassY)|ClassZ {}
+  private function privateTraitMethod((ClassX&ClassY)| ClassZ $param):  
(ClassX&ClassY)|ClassZ {}
+  protected function protectedTraitMethod(string $param1, 
(ClassX&ClassY)|(ClassX&ClassZ) $param2): (ClassX&ClassY)|ClassZ {}
+  public static function publicStaticTraitMethod(): 
(ClassX&ClassY)|(ClassX&ClassY&ClassZ) {}
+  private static function 
privateStaticTraitMethod(ClassX|(ClassX&ClassY)|ClassZ $param1, 
ClassX|(ClassX&ClassY)|ClassZ $param2):  ClassX|(ClassX&ClassY)|ClassZ {}
+  protected static function protectedStaticTraitMethod(string|int $param = 1): 
ClassZ|(ClassX&ClassY) {}
+}
+
+function testFunctionReturnType(): (ClassX&ClassY)|ClassZ {
+}
+
+interface TestInterface {
+
+    public function paramType(ClassX|(ClassY&ClassZ) $test): void;
+    public function returnType(): ClassX|(ClassY&ClassZ);
+
+}
+
+/**
+ * @method ClassX|(ClassX&ClassZ) methodTag() Description
+ * @property (ClassX&ClassY)|ClassY $propertyTag Description
+ */
+class TestClass implements TestInterface {
+use TestTrait;
+/**
+ * @var ClassX|(ClassX&ClassY)
+ */
+public $publicPhpdocField;
+public (ClassX&ClassZ)|(ClassY&ClassZ) $publicFiled;
+private ClassX|(ClassY&ClassZ) $privateFiled;
+protected ClassZ|ClassX|(ClassY&ClassZ) $protectedFiled;
+/**
+ * @var (ClassX&ClassY)|ClassZ
+ */
+public static $publicPhpdocStaticField;
+public static (ClassX&ClassZ)|ClassZ $publicStaticField;
+private static ClassZ|(ClassZ&ClassY) $privateStaticField;
+protected static (ClassX&ClassZ)|ClassZ $protectedStaticField;
+
+public function __construct(
+        public ClassZ|(ClassZ&ClassY) $publicPromotedFiled,
+        private null|(ClassZ&ClassX) $privatePromotedFiled,
+        protected ClassZ|(ClassZ&ClassY)|ClassX $protectedPromotedFiled,
+) {
+}
+
+public function paramType(ClassX|(ClassY&ClassZ) $param1): void {
+}
+
+/**
+ * @return (ClassX&ClassZ)|(ClassX&ClassY) Description
+ */
+public function phpdocReturnType() {
+}
+
+public function returnType(): ClassX|(ClassY&ClassZ) {
+}
+
+public static function publicStaticMethod(): (ClassX&ClassZ)|(ClassX&ClassY) {
+}
+
+}
+
+/** @var (ClassX&ClassY)|null $vardoc1 */
+$vardoc1->publicXField;
+/** @var ClassZ|(ClassX&ClassY)|null $vardoc2 */
+$vardoc2->publicXField;
+/** @var ClassZ|(ClassX&ClassY)|(ClassX&ClassZ) $vardoc3 */
+$vardoc3->publicXField;
+
+/* @var $vardoc4 (ClassX&ClassY)|null */
+$vardoc4->publicXField;
+/* @var $vardoc5 ClassZ|(ClassX&ClassY)|null */
+$vardoc5->publicXField;
+/* @var $vardoc6 ClassZ|(ClassX&ClassY)|(ClassX&ClassZ) */
+$vardoc6->publicXField;
+
+$closure = function((X&Y&Z)|Y $test1, X|(X&Z)|(Y&Z) $test2): void {};
+$closure = function(int $test): (X&Y&Z)|(X&Z) {};
+
+$arrow = fn((X&Y)|(Y&Z) $test) => $test;
+$arrow = fn((X&Y)|(Y&Z) $test): (X&Y)|(Y&Z)|(X&Z) => $test;
+
+$anon = new class($test) {
+ private (ClassX&ClassY)|ClassZ $property;
+
+ public function __construct((ClassX&ClassY)|ClassZ $property)
+        {
+            $this->property = $property;
+    }
+    
+    public function test((ClassX&ClassY)|null $param): 
(ClassX&ClassY)|(ClassY&ClassZ) {
+    }
+};
diff --git 
a/php/php.editor/test/unit/data/testfiles/formatting/php82/dnfTypes_01.php.formatted
 
b/php/php.editor/test/unit/data/testfiles/formatting/php82/dnfTypes_01.php.formatted
new file mode 100644
index 0000000000..933d833d0e
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/formatting/php82/dnfTypes_01.php.formatted
@@ -0,0 +1,281 @@
+<?php
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+class ClassX {
+
+    const IMPLICIT_X_CONSTANT = "implicit constant";
+    public const PUBLIC_X_CONSTANT = "public constant";
+    private const PRIVATE_X_CONSTANT = "private constant";
+    protected const PROTECTED_X_CONSTANT = "protected constant";
+
+    public (ClassY&ClassZ)|ClassX $publicXField;
+    private (ClassX&ClassZ)|(ClassY&ClassZ)|ClassX $privateXField;
+    protected ClassX|(ClassY&ClassZ)|ClassY $protectedXField;
+    public static (ClassY&ClassZ)|ClassX $publicStaticXField;
+    private static (ClassY&ClassZ)|ClassY $privateStaticXField;
+    protected static (ClassY&ClassZ)|ClassX|ClassY $protectedStaticXField;
+
+    public function publicXMethod((ClassY&ClassZ)|ClassX $param1): 
ClassX|(ClassY&ClassZ) {
+        
+    }
+
+    private function privateMXethod(ClassZ|(ClassY&ClassZ)|ClassX $param1 = 
null): (ClassY&ClassZ)|ClassX {
+        
+    }
+
+    protected function protectedXMethod((ClassY&ClassZ)|(ClassX&ClassZ) 
$param1): (ClassY&ClassZ)|(ClassX&ClassZ) {
+        
+    }
+
+    public static function publicStaticXMethod(ClassX|(ClassY&ClassZ) $param1, 
int $param2): (ClassY&ClassZ)|ClassX {
+        
+    }
+
+    private static function privateStaticXMethod(int $param1, 
(ClassX&ClassY)|ClassZ $param2): ClassX|(ClassY&ClassZ) {
+        
+    }
+
+    protected static function protectedStaticXMethod(ClassX|null $param1, 
(ClassX&ClassZ)|null $param2 = null): (ClassY&ClassZ)|ClassX {
+        
+    }
+}
+
+class ClassY {
+
+    const IMPLICIT_Y_CONSTANT = "implicit constant";
+    public const PUBLIC_Y_CONSTANT = "public constant";
+    private const PRIVATE_Y_CONSTANT = "private constant";
+    protected const PROTECTED_Y_CONSTANT = "protected constant";
+
+    public (ClassY&ClassZ)|ClassX $publicYField;
+    private (ClassX&ClassZ)|(ClassY&ClassZ)|ClassX $privateYField;
+    protected ClassX|(ClassY&ClassZ)|ClassY $protectedYField;
+    public static (ClassY&ClassZ)|ClassX $publicStaticYField;
+    private static ( ClassY&ClassZ)|ClassY $privateStaticYField;
+    protected static (ClassY&ClassZ)|ClassX|ClassY $protectedStaticYField;
+
+    public function publicYMethod((ClassY&ClassZ)|ClassX $param1, 
(ClassY&ClassZ)|ClassX|(ClassX&ClassZ) $param2): ClassX|(ClassY&ClassZ) {
+        
+    }
+
+    private function privateYMethod(ClassX $param1, (ClassY&ClassZ)|null 
$param2): (ClassY&ClassZ)|ClassX {
+        
+    }
+
+    protected function protectedYMethod((ClassY&ClassZ)|ClassX $param1, 
ClassY|(ClassX&ClassZ&ClassY) $param2): (ClassY&ClassZ)|(ClassX&ClassZ) {
+        
+    }
+
+    public static function publicStaticYMethod(null|(ClassY&ClassZ)|ClassX 
$param1): (ClassY&ClassZ)|ClassX {
+        
+    }
+
+    private static function privateStaticYMethod((ClassY&ClassZ)|ClassX|ClassY 
$param): ClassX|(ClassY&ClassZ) {
+        
+    }
+
+    protected static function 
protectedStaticYMethod((ClassY&ClassZ)|(ClassX&ClassZ) $param1): 
(ClassY&ClassZ)|ClassX {
+        
+    }
+}
+
+class ClassZ {
+
+    const IMPLICIT_Z_CONSTANT = "implicit constant";
+    public const PUBLIC_Z_CONSTANT = "public constant";
+    private const PRIVATE_Z_CONSTANT = "private constant";
+    protected const PROTECTED_Z_CONSTANT = "protected constant";
+
+    public (ClassY&ClassZ)|ClassX $publicZField;
+    private (ClassX&ClassZ)|(ClassY&ClassZ)|ClassX $privateZField;
+    protected ClassX|(ClassY&ClassZ)|ClassY $protectedZField;
+    public static (ClassY&ClassZ)|ClassX $publicStaticZField;
+    private static (ClassY&ClassZ)|ClassY $privateStaticZField;
+    protected static (ClassY&ClassZ)|ClassX|ClassY $protectedStaticZField;
+
+    public function publicZMethod(
+            ClassX|(ClassY&ClassZ)|ClassY $param1
+    ): ClassX|(ClassY&ClassZ)|ClassY {
+        
+    }
+
+    private function privateZMethod(): (ClassY&ClassZ)|ClassX {
+        
+    }
+
+    protected function protectedZMethod(ClassX $param = null): 
(ClassY&ClassZ)|(ClassX&ClassZ) {
+        
+    }
+
+    public static function publicStaticZMethod(ClassX&ClassY $param): 
(ClassX&ClassZ)|(ClassY&ClassZ)|ClassX {
+        
+    }
+
+    private static function privateStaticZMethod(ClassX|null $param): 
ClassX|(ClassY&ClassZ) {
+        
+    }
+
+    protected static function protectedStaticZMethod(
+            int $param,
+            ClassX|ClassY $param2
+    ): (ClassY&ClassZ)|ClassX {
+        
+    }
+}
+
+trait TestTrait {
+
+    const IMPLICIT_TRAIT_CONSTANT = "implicit constant";
+    public const PUBLIC_TRAIT_CONSTANT = "public constant";
+    private const PRIVATE_TRAIT_CONSTANT = "private constant";
+    protected const PROTECTED_TRAIT_CONSTANT = "protected constant";
+
+    public (ClassX&ClassY)|ClassY $publicTraitField;
+    private (ClassX&ClassY)|(ClassY&ClassZ) $privateTraitField;
+    protected ClassY|(ClassX&ClassY) $protectedTraitField;
+    public static ClassY|(ClassX&ClassY)|ClassX $publicStaticTraitField;
+    private static (ClassX&ClassZ)|ClassY $privateStaticTraitField;
+    protected static (ClassX&ClassY&ClassZ)|ClassX $protectedStaticTraitField;
+
+    public function publicTraitMethod(?ClassX $param): (ClassX&ClassY)|ClassZ {
+        
+    }
+
+    private function privateTraitMethod((ClassX&ClassY)|ClassZ $param): 
(ClassX&ClassY)|ClassZ {
+        
+    }
+
+    protected function protectedTraitMethod(string $param1, 
(ClassX&ClassY)|(ClassX&ClassZ) $param2): (ClassX&ClassY)|ClassZ {
+        
+    }
+
+    public static function publicStaticTraitMethod(): 
(ClassX&ClassY)|(ClassX&ClassY&ClassZ) {
+        
+    }
+
+    private static function 
privateStaticTraitMethod(ClassX|(ClassX&ClassY)|ClassZ $param1, 
ClassX|(ClassX&ClassY)|ClassZ $param2): ClassX|(ClassX&ClassY)|ClassZ {
+        
+    }
+
+    protected static function protectedStaticTraitMethod(string|int $param = 
1): ClassZ|(ClassX&ClassY) {
+        
+    }
+}
+
+function testFunctionReturnType(): (ClassX&ClassY)|ClassZ {
+    
+}
+
+interface TestInterface {
+
+    public function paramType(ClassX|(ClassY&ClassZ) $test): void;
+
+    public function returnType(): ClassX|(ClassY&ClassZ);
+}
+
+/**
+ * @method ClassX|(ClassX&ClassZ) methodTag() Description
+ * @property (ClassX&ClassY)|ClassY $propertyTag Description
+ */
+class TestClass implements TestInterface {
+
+    use TestTrait;
+
+    /**
+     * @var ClassX|(ClassX&ClassY)
+     */
+    public $publicPhpdocField;
+    public (ClassX&ClassZ)|(ClassY&ClassZ) $publicFiled;
+    private ClassX|(ClassY&ClassZ) $privateFiled;
+    protected ClassZ|ClassX|(ClassY&ClassZ) $protectedFiled;
+
+    /**
+     * @var (ClassX&ClassY)|ClassZ
+     */
+    public static $publicPhpdocStaticField;
+    public static (ClassX&ClassZ)|ClassZ $publicStaticField;
+    private static ClassZ|(ClassZ&ClassY) $privateStaticField;
+    protected static (ClassX&ClassZ)|ClassZ $protectedStaticField;
+
+    public function __construct(
+            public ClassZ|(ClassZ&ClassY) $publicPromotedFiled,
+            private null|(ClassZ&ClassX) $privatePromotedFiled,
+            protected ClassZ|(ClassZ&ClassY)|ClassX $protectedPromotedFiled,
+    ) {
+        
+    }
+
+    public function paramType(ClassX|(ClassY&ClassZ) $param1): void {
+        
+    }
+
+    /**
+     * @return (ClassX&ClassZ)|(ClassX&ClassY) Description
+     */
+    public function phpdocReturnType() {
+        
+    }
+
+    public function returnType(): ClassX|(ClassY&ClassZ) {
+        
+    }
+
+    public static function publicStaticMethod(): 
(ClassX&ClassZ)|(ClassX&ClassY) {
+        
+    }
+}
+
+/** @var (ClassX&ClassY)|null $vardoc1 */
+$vardoc1->publicXField;
+/** @var ClassZ|(ClassX&ClassY)|null $vardoc2 */
+$vardoc2->publicXField;
+/** @var ClassZ|(ClassX&ClassY)|(ClassX&ClassZ) $vardoc3 */
+$vardoc3->publicXField;
+
+/* @var $vardoc4 (ClassX&ClassY)|null */
+$vardoc4->publicXField;
+/* @var $vardoc5 ClassZ|(ClassX&ClassY)|null */
+$vardoc5->publicXField;
+/* @var $vardoc6 ClassZ|(ClassX&ClassY)|(ClassX&ClassZ) */
+$vardoc6->publicXField;
+
+$closure = function ((X&Y&Z)|Y $test1, X|(X&Z)|(Y&Z) $test2): void {
+    
+};
+$closure = function (int $test): (X&Y&Z)|(X&Z) {
+    
+};
+
+$arrow = fn((X&Y)|(Y&Z) $test) => $test;
+$arrow = fn((X&Y)|(Y&Z) $test): (X&Y)|(Y&Z)|(X&Z) => $test;
+
+$anon = new class($test) {
+
+    private (ClassX&ClassY)|ClassZ $property;
+
+    public function __construct((ClassX&ClassY)|ClassZ $property) {
+        $this->property = $property;
+    }
+
+    public function test((ClassX&ClassY)|null $param): 
(ClassX&ClassY)|(ClassY&ClassZ) {
+        
+    }
+};
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/indent/PHPFormatterTest.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/indent/PHPFormatterTest.java
index 6feeccc9e8..b39411588f 100644
--- 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/indent/PHPFormatterTest.java
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/indent/PHPFormatterTest.java
@@ -1099,4 +1099,9 @@ public class PHPFormatterTest extends 
PHPFormatterTestBase {
         HashMap<String, Object> options = new 
HashMap<>(FmtOptions.getDefaults());
         
reformatFileContents("testfiles/formatting/php82/readonlyClasses_01b.php", 
options);
     }
+
+    public void testDNFTypes_01() throws Exception {
+        HashMap<String, Object> options = new 
HashMap<>(FmtOptions.getDefaults());
+        reformatFileContents("testfiles/formatting/php82/dnfTypes_01.php", 
options);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to