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 71d008672cad41afc4fdc36920349683f16859c4
Author: Junichi Yamamoto <junich...@apache.org>
AuthorDate: Thu Oct 12 11:53:17 2023 +0900

    PHP 8.2 Support: Disjunctive Normal Form Types (Part 5)
    
    - https://github.com/apache/netbeans/issues/4725
    - https://wiki.php.net/rfc/dnf_types
    - Fix code completion for return, field, `@method`, `@property`, and `@var` 
DNF types
    - Fix the lexer to recognize DNF types of vardoc (`/** @var X|(Y&Z) $var 
*/`)
    - Add unit tests
---
 .../org/netbeans/modules/php/editor/CodeUtils.java |   2 +-
 .../php/editor/api/elements/FieldElement.java      |   1 +
 .../php/editor/completion/PHPCompletionItem.java   |   4 +
 .../php/editor/elements/FieldElementImpl.java      |  32 ++-
 .../php/editor/model/impl/FieldElementImpl.java    |   2 +-
 .../php/editor/model/impl/FunctionScopeImpl.java   |   4 +-
 .../modules/php/editor/model/impl/Type.java        |  26 +-
 .../modules/php/editor/parser/ASTPHP5Scanner.java  | 316 ++++++++++++---------
 .../php/editor/parser/PHPVarCommentParser.java     |   3 +-
 .../completion/lib/php82/testDNFTypes/dnfTypes.php | 215 ++++++++++++++
 ...nfTypes.php.testDNFTypes_FieldType01.completion |  12 +
 ...fTypes.php.testDNFTypes_FieldType02a.completion |  12 +
 ...fTypes.php.testDNFTypes_FieldType02b.completion |   5 +
 ...nfTypes.php.testDNFTypes_FieldType03.completion |  18 ++
 ...nfTypes.php.testDNFTypes_FieldType04.completion |   9 +
 ...nfTypes.php.testDNFTypes_FieldType05.completion |  13 +
 ...nfTypes.php.testDNFTypes_FieldType06.completion |   9 +
 ...nfTypes.php.testDNFTypes_FieldType07.completion |   9 +
 ...nfTypes.php.testDNFTypes_FieldType08.completion |   9 +
 ...nfTypes.php.testDNFTypes_FieldType09.completion |  13 +
 ...fTypes.php.testDNFTypes_FieldType10a.completion |   9 +
 ...fTypes.php.testDNFTypes_FieldType10b.completion |   4 +
 ...nfTypes.php.testDNFTypes_FieldType11.completion |  18 ++
 ...nfTypes.php.testDNFTypes_FieldType12.completion |  12 +
 ...nfTypes.php.testDNFTypes_FieldType13.completion |   9 +
 ...hp.testDNFTypes_FunctionReturnType01.completion |  12 +
 ...hp.testDNFTypes_FunctionReturnType02.completion |  18 ++
 ...hp.testDNFTypes_FunctionReturnType03.completion |  12 +
 ...p.testDNFTypes_FunctionReturnType04a.completion |  18 ++
 ...p.testDNFTypes_FunctionReturnType04b.completion |   4 +
 ....php.testDNFTypes_MethodReturnType01.completion |  12 +
 ...php.testDNFTypes_MethodReturnType02a.completion |  12 +
 ...php.testDNFTypes_MethodReturnType02b.completion |   5 +
 ....php.testDNFTypes_MethodReturnType03.completion |   9 +
 ....php.testDNFTypes_MethodReturnType04.completion |  12 +
 ....php.testDNFTypes_MethodReturnType05.completion |   9 +
 ....php.testDNFTypes_MethodReturnType06.completion |  12 +
 ....php.testDNFTypes_MethodReturnType07.completion |  18 ++
 ....php.testDNFTypes_MethodReturnType08.completion |  18 ++
 ...php.testDNFTypes_MethodReturnType09a.completion |  12 +
 ...php.testDNFTypes_MethodReturnType09b.completion |   4 +
 ....php.testDNFTypes_MethodReturnType10.completion |  18 ++
 ....php.testDNFTypes_MethodReturnType11.completion |   9 +
 ....php.testDNFTypes_MethodReturnType12.completion |  18 ++
 ...php.testDNFTypes_MethodReturnType13a.completion |  18 ++
 ...php.testDNFTypes_MethodReturnType13b.completion |   4 +
 ....php.testDNFTypes_MethodReturnType14.completion |  12 +
 ....php.testDNFTypes_MethodReturnType15.completion |  12 +
 ....php.testDNFTypes_MethodReturnType16.completion |  18 ++
 ....php.testDNFTypes_MethodReturnType17.completion |  12 +
 ....php.testDNFTypes_MethodReturnType18.completion |  12 +
 ...Types.php.testDNFTypes_VarDocType01a.completion |   9 +
 ...Types.php.testDNFTypes_VarDocType01b.completion |  13 +
 ...Types.php.testDNFTypes_VarDocType02a.completion |  12 +
 ...Types.php.testDNFTypes_VarDocType02b.completion |  18 ++
 ...Types.php.testDNFTypes_VarDocType03a.completion |  12 +
 ...Types.php.testDNFTypes_VarDocType03b.completion |  18 ++
 ...Types.php.testDNFTypes_VarDocType04a.completion |   9 +
 ...Types.php.testDNFTypes_VarDocType04b.completion |  13 +
 ...Types.php.testDNFTypes_VarDocType05a.completion |  12 +
 ...Types.php.testDNFTypes_VarDocType05b.completion |  18 ++
 ...Types.php.testDNFTypes_VarDocType06a.completion |  12 +
 ...Types.php.testDNFTypes_VarDocType06b.completion |  18 ++
 .../editor/completion/PHP82CodeCompletionTest.java | 212 ++++++++++++++
 .../modules/php/editor/model/impl/TypeTest.java    | 101 +++++++
 php/php.editor/tools/ASTPHP5Scanner.flex           |   4 +-
 66 files changed, 1411 insertions(+), 156 deletions(-)

diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java 
b/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java
index 746fecc67a..fb2c27caaa 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java
@@ -90,7 +90,7 @@ public final class CodeUtils {
     public static final String ELLIPSIS = "..."; // NOI18N
 
     public static final Pattern WHITE_SPACES_PATTERN = 
Pattern.compile("\\s+"); // NOI18N
-    public static final Pattern SPLIT_TYPES_PATTERN = 
Pattern.compile("[()|&]"); // NOI18N
+    public static final Pattern SPLIT_TYPES_PATTERN = 
Pattern.compile("[()|&]+"); // NOI18N
 
     private static final Logger LOGGER = 
Logger.getLogger(CodeUtils.class.getName());
 
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/api/elements/FieldElement.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/api/elements/FieldElement.java
index dbc7537a39..41c37908e5 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/api/elements/FieldElement.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/api/elements/FieldElement.java
@@ -30,4 +30,5 @@ public interface FieldElement extends TypedInstanceElement, 
TypeMemberElement {
     boolean isAnnotation();
     boolean isUnionType();
     boolean isIntersectionType();
+    String getDeclaredType();
 }
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCompletionItem.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCompletionItem.java
index 4315df71ff..53d7847960 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCompletionItem.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCompletionItem.java
@@ -981,6 +981,10 @@ public abstract class PHPCompletionItem implements 
CompletionProposal {
 
         @Override
         protected String getTypeName() {
+            String declaredType = getField().getDeclaredType();
+            if (declaredType != null) {
+                return StringUtils.truncate(declaredType, 0, 
TYPE_NAME_MAX_LENGTH, CodeUtils.ELLIPSIS);
+            }
             Set<TypeResolver> types = getField().getInstanceTypes();
             List<String> typeNames = new ArrayList<>();
             for (TypeResolver type : types) {
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/elements/FieldElementImpl.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/elements/FieldElementImpl.java
index 490ccd25c5..fcff05d62a 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/elements/FieldElementImpl.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/elements/FieldElementImpl.java
@@ -22,6 +22,8 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import org.netbeans.api.annotations.common.CheckForNull;
+import org.netbeans.api.annotations.common.NullAllowed;
 import org.netbeans.modules.parsing.spi.indexing.support.IndexResult;
 import org.netbeans.modules.php.api.editor.PhpType;
 import org.netbeans.modules.php.editor.api.ElementQuery;
@@ -55,6 +57,8 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
     private final Set<TypeResolver> instanceFQTypes;
     private final boolean isAnnotation;
     private final Type.Kind typeKind;
+    @NullAllowed
+    private final String declaredType;
 
     private FieldElementImpl(
             final TypeElement enclosingType,
@@ -67,7 +71,8 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
             final Set<TypeResolver> instanceFQTypes,
             final boolean isDeprecated,
             final boolean isAnnotation,
-            Type.Kind typeKind
+            Type.Kind typeKind,
+            String declaredType
     ) {
         super(FieldElementImpl.getName(fieldName, true), 
enclosingType.getName(), fileUrl, offset, elementQuery, isDeprecated);
         this.modifiers = PhpModifiers.fromBitMask(flags);
@@ -76,6 +81,7 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
         this.instanceFQTypes = instanceFQTypes;
         this.isAnnotation = isAnnotation;
         this.typeKind = typeKind;
+        this.declaredType = declaredType;
     }
 
     public static Set<FieldElement> fromSignature(final TypeElement type,
@@ -105,7 +111,7 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
         if (matchesQuery(query, signParser)) {
             retval = new FieldElementImpl(type, signParser.getFieldName(),
                     signParser.getOffset(), signParser.getFlags(), 
signParser.getFileUrl(),
-                    indexScopeQuery, signParser.getTypes(), 
signParser.getFQTypes(), signParser.isDeprecated(), signParser.isAnnotation(), 
signParser.getTypeKind());
+                    indexScopeQuery, signParser.getTypes(), 
signParser.getFQTypes(), signParser.isDeprecated(), signParser.isAnnotation(), 
signParser.getTypeKind(), signParser.getDeclaredType());
 
         }
         return retval;
@@ -122,7 +128,7 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
             Set<TypeResolver> types = fieldType != null ? 
TypeResolverImpl.parseTypes(fieldType) : null;
             retval.add(new FieldElementImpl(type, info.getName(), 
info.getRange().getStart(),
                     info.getAccessModifiers().toFlags(), 
fileQuery.getURL().toString(), fileQuery,
-                    types, types, 
VariousUtils.isDeprecatedFromPHPDoc(fileQuery.getResult().getProgram(), node), 
false, Type.Kind.fromTypes(fieldType)));
+                    types, types, 
VariousUtils.isDeprecatedFromPHPDoc(fileQuery.getResult().getProgram(), node), 
false, Type.Kind.fromTypes(fieldType), info.getFieldType()));
         }
         return retval;
     }
@@ -145,7 +151,8 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
                 resolvers,
                 
VariousUtils.isDeprecatedFromPHPDoc(fileQuery.getResult().getProgram(), node),
                 false,
-                Type.Kind.NORMAL
+                Type.Kind.NORMAL,
+                null
         );
     }
 
@@ -158,7 +165,7 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
                 ? Collections.<TypeResolver>singleton(new 
TypeResolverImpl(fldType.getFullyQualifiedName(), false))
                 : Collections.<TypeResolver>emptySet();
         FieldElementImpl retval = new FieldElementImpl(type, field.getName(), 
field.getOffset(),
-                PhpModifiers.NO_FLAGS, null, elementQuery, typeResolvers, 
typeResolvers, false, false, Type.Kind.NORMAL);
+                PhpModifiers.NO_FLAGS, null, elementQuery, typeResolvers, 
typeResolvers, false, false, Type.Kind.NORMAL, null);
         retval.setFileObject(field.getFile());
         return retval;
     }
@@ -225,6 +232,11 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
         return typeKind == Type.Kind.INTERSECTION;
     }
 
+    @Override
+    public String getDeclaredType() {
+        return declaredType;
+    }
+
     private void checkSignature(StringBuilder sb) {
         boolean checkEnabled = false;
         assert checkEnabled = true;
@@ -309,6 +321,16 @@ public final class FieldElementImpl extends PhpElementImpl 
implements FieldEleme
             return signature.integer(3);
         }
 
+        @CheckForNull
+        String getDeclaredType() {
+            return signature.string(4).isEmpty() ? null : signature.string(4);
+        }
+
+        @CheckForNull
+        String getDeclaredFQType() {
+            return signature.string(5).isEmpty() ? null : signature.string(5);
+        }
+
         Set<TypeResolver> getTypes() {
             return TypeResolverImpl.parseTypes(signature.string(4));
         }
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FieldElementImpl.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FieldElementImpl.java
index e3d68b1494..a3f132b483 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FieldElementImpl.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FieldElementImpl.java
@@ -161,7 +161,7 @@ class FieldElementImpl extends ScopeImpl implements 
FieldElement {
     public Collection<? extends TypeScope> getDefaultTypes() {
         Collection<TypeScope> typeScopes = new HashSet<>();
         if (defaultFQType != null && defaultFQType.length() > 0) {
-            String[] allTypeNames = defaultFQType.split("\\&|\\|"); // NOI18N
+            String[] allTypeNames = Type.splitTypes(defaultFQType);
             for (String typeName : allTypeNames) {
                 String modifiedTypeName = typeName;
                 if (typeName.indexOf("[") != -1) {
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FunctionScopeImpl.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FunctionScopeImpl.java
index 70e1bfdb98..51bead55cd 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FunctionScopeImpl.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FunctionScopeImpl.java
@@ -278,7 +278,7 @@ class FunctionScopeImpl extends ScopeImpl implements 
FunctionScope, VariableName
         // NETBEANS-5062
         Scope inScope = getInScope();
         Set<TypeScope> cTypes = new HashSet<>();
-        List<String> typeNames = StringUtils.explode(types, 
Type.getTypeSeparator(isReturnIntersectionType));
+        List<String> typeNames = Arrays.asList(Type.splitTypes(types));
         if (typeNames.contains(Type.STATIC)
                 && inScope instanceof TypeScope) {
             TypeScope typeScope = (TypeScope) inScope;
@@ -318,7 +318,7 @@ class FunctionScopeImpl extends ScopeImpl implements 
FunctionScope, VariableName
     private ReturnTypesDescriptor getReturnTypesDescriptor(String types, 
boolean resolveSemiTypes, Collection<? extends TypeScope> callerTypes) {
         ReturnTypesDescriptor result = ReturnTypesDescriptor.NONE;
         if (StringUtils.hasText(types)) {
-            final String[] typeNames = types.split(isReturnIntersectionType ? 
TYPE_SEPARATOR_INTERSECTION_REGEXP : TYPE_SEPARATOR_REGEXP);
+            final String[] typeNames = Type.splitTypes(types);
             Collection<TypeScope> retval = new HashSet<>();
             for (int i = 0; i < typeNames.length; i++) {
                 String typeName = typeNames[i];
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/Type.java 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/Type.java
index e7bbcc949d..3fb5f48e9c 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/Type.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/Type.java
@@ -21,9 +21,9 @@ package org.netbeans.modules.php.editor.model.impl;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.regex.Pattern;
 import org.netbeans.api.annotations.common.NullAllowed;
 import org.netbeans.modules.php.api.util.StringUtils;
+import org.netbeans.modules.php.editor.CodeUtils;
 
 /**
  *
@@ -121,13 +121,13 @@ public final class Type {
         }
         return retval;
     }
-    
+
     public static boolean isPrimitiveAlias(String typeName) {
         boolean retval = false;
         if (BOOLEAN.equals(typeName)) {
             retval = true;
         }
-        return retval;        
+        return retval;
     }
 
     public static boolean isArray(String typeName) {
@@ -237,4 +237,24 @@ public final class Type {
     public static String getTypeSeparator(boolean isIntersection) {
         return isIntersection ? SEPARATOR_INTERSECTION : SEPARATOR;
     }
+
+    /**
+     * Get all types from the declared type.
+     *
+     * @param declaredType the declared type. can be {@code null} e.g. (X&Y)|Z
+     * @return all type names, if it's a nullable type, the type name with 
nullable type prefix("?")
+     */
+    public static String[] splitTypes(@NullAllowed String declaredType) {
+        if (!StringUtils.hasText(declaredType)) {
+            return new String[0];
+        }
+        String type = declaredType.trim();
+        if (type.startsWith("(")) { // NOI18N
+            type = type.substring(1);
+        }
+        if (type.endsWith(")")) { // NOI18N
+            type = type.substring(0, type.length() - 1);
+        }
+        return CodeUtils.SPLIT_TYPES_PATTERN.split(type.replace(" ", "")); // 
NOI18N
+    }
 }
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java 
b/php/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java
index 86ec1eaa90..fcf45a8ff4 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.3 on 2023/06/19 14:22 */
+/* The following code was generated by JFlex 1.4.3 on 2023/10/12 11:50 */
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -35,7 +35,7 @@ import org.netbeans.modules.web.common.api.ByteStack;
 /**
  * This class is a scanner generated by
  * <a href="http://www.jflex.de/";>JFlex</a> 1.4.3
- * on 2023/06/19 14:22 from the specification file
+ * on 2023/10/12 11:50 from the specification file
  * 
<tt>/home/junichi11/NetBeansProjects/netbeans/php/php.editor/tools/ASTPHP5Scanner.flex</tt>
  */
 public class ASTPHP5Scanner implements Scanner {
@@ -156,7 +156,7 @@ public class ASTPHP5Scanner implements Scanner {
     "\7\15\1\0\7\15\1\0\7\15\1\0\7\15\1\0\7\15\120\0"+
     "\1\15\u01d5\0\2\15\52\0\5\15\5\0\2\15\4\0\126\15\6\0"+
     "\3\15\1\0\132\15\1\0\4\15\5\0\52\15\2\0\136\15\21\0"+
-    "\33\15\65\0\20\15\u0200\0\u19b6\15\112\0\u51eb\15\25\0\u048d\15\103\0"+
+    "\33\15\65\0\20\15\u0200\0\u19b6\15\112\0\u51f0\15\20\0\u048d\15\103\0"+
     "\56\15\2\0\u010d\15\3\0\20\15\12\20\2\15\24\0\57\15\20\0"+
     "\37\15\2\0\106\15\61\0\11\15\2\0\147\15\2\0\44\15\1\0"+
     "\10\15\77\0\13\15\1\0\3\15\1\0\4\15\1\0\27\15\35\0"+
@@ -235,15 +235,15 @@ public class ASTPHP5Scanner implements Scanner {
     "\1\305\1\4\1\306\1\307\1\310\1\4\1\0\1\4"+
     "\1\311\1\312\5\0\1\313\2\4\1\314\4\4\1\315"+
     "\2\0\1\316\1\4\1\317\2\4\1\320\1\4\1\0"+
-    "\1\321\6\0\2\4\1\322\1\4\1\323\1\324\2\0"+
-    "\1\4\1\325\1\326\1\0\1\4\1\327\10\0\3\4"+
-    "\2\0\1\4\1\330\1\4\6\0\1\331\2\4\1\332"+
-    "\1\0\1\333\1\334\2\0\1\335\1\0\1\336\1\4"+
-    "\6\0\1\4\2\0\1\337\1\0\1\4\7\0\1\340"+
+    "\1\321\7\0\2\4\1\322\1\4\1\323\1\324\2\0"+
+    "\1\4\1\325\1\326\1\0\1\4\1\327\12\0\3\4"+
+    "\2\0\1\4\1\330\1\4\12\0\1\331\2\4\1\332"+
+    "\1\0\1\333\1\334\4\0\1\335\4\0\1\336\1\4"+
+    "\11\0\1\4\2\0\1\337\2\0\1\4\7\0\1\340"+
     "\7\0\1\77\1\0";
 
   private static int [] zzUnpackAction() {
-    int [] result = new int[842];
+    int [] result = new int[858];
     int offset = 0;
     offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
     return result;
@@ -363,20 +363,22 @@ public class ASTPHP5Scanner implements Scanner {
     "\0\u9664\0\u96aa\0\u087a\0\u96f0\0\u9736\0\u087a\0\u977c\0\u97c2"+
     "\0\u9808\0\u984e\0\u087a\0\u9894\0\u98da\0\u087a\0\u9920\0\u087a"+
     "\0\u9966\0\u99ac\0\u99f2\0\u9a38\0\u9a7e\0\u087a\0\u9ac4\0\u9b0a"+
-    "\0\u9b50\0\u9b96\0\u9bdc\0\u9c22\0\u9c68\0\u9cae\0\u087a\0\u9cf4"+
-    "\0\u087a\0\u087a\0\u9d3a\0\u9d80\0\u9dc6\0\u087a\0\u087a\0\u9e0c"+
-    "\0\u9e52\0\u0578\0\u9e98\0\u9ede\0\u9f24\0\u9f6a\0\u9fb0\0\u9ff6"+
+    "\0\u9b50\0\u9b96\0\u9bdc\0\u9c22\0\u9c68\0\u9cae\0\u9cf4\0\u087a"+
+    "\0\u9d3a\0\u087a\0\u087a\0\u9d80\0\u9dc6\0\u9e0c\0\u087a\0\u087a"+
+    "\0\u9e52\0\u9e98\0\u0578\0\u9ede\0\u9f24\0\u9f6a\0\u9fb0\0\u9ff6"+
     "\0\ua03c\0\ua082\0\ua0c8\0\ua10e\0\ua154\0\ua19a\0\ua1e0\0\ua226"+
     "\0\ua26c\0\ua2b2\0\ua2f8\0\ua33e\0\ua384\0\ua3ca\0\ua410\0\ua456"+
-    "\0\u087a\0\ua49c\0\ua4e2\0\u0578\0\ua528\0\u087a\0\u087a\0\ua56e"+
-    "\0\ua5b4\0\u0578\0\ua5fa\0\u087a\0\ua640\0\ua686\0\ua6cc\0\ua712"+
-    "\0\ua758\0\ua79e\0\ua7e4\0\ua82a\0\ua870\0\ua8b6\0\ua6cc\0\ua8fc"+
-    "\0\ua942\0\ua988\0\ua9ce\0\uaa14\0\uaa5a\0\uaaa0\0\uaae6\0\uab2c"+
-    "\0\u0578\0\uab72\0\uabb8\0\uabfe\0\uac44\0\uac8a\0\uacd0\0\uad16"+
-    "\0\u0578\0\uad5c";
+    "\0\ua49c\0\ua4e2\0\ua528\0\ua56e\0\ua5b4\0\ua5fa\0\ua640\0\u087a"+
+    "\0\ua686\0\ua6cc\0\u0578\0\ua712\0\u087a\0\u087a\0\ua758\0\ua79e"+
+    "\0\ua7e4\0\ua82a\0\u0578\0\ua870\0\ua8b6\0\ua8fc\0\ua942\0\u087a"+
+    "\0\ua988\0\ua9ce\0\uaa14\0\uaa5a\0\uaaa0\0\uaae6\0\uab2c\0\uab72"+
+    "\0\uabb8\0\uabfe\0\uac44\0\uac8a\0\uacd0\0\uaa14\0\uad16\0\uad5c"+
+    "\0\uada2\0\uade8\0\uae2e\0\uae74\0\uaeba\0\uaf00\0\uaf46\0\uaf8c"+
+    "\0\u0578\0\uafd2\0\ub018\0\ub05e\0\ub0a4\0\ub0ea\0\ub130\0\ub176"+
+    "\0\u0578\0\ub1bc";
 
   private static int [] zzUnpackRowMap() {
-    int [] result = new int[842];
+    int [] result = new int[858];
     int offset = 0;
     offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
     return result;
@@ -1342,133 +1344,165 @@ public class ASTPHP5Scanner implements Scanner {
     "\23\0\3\u02de\32\0\1\346\30\0\1\u02f7\1\0\1\u02f7"+
     "\2\0\3\u02f7\1\0\1\u02f7\1\0\3\u02f7\1\0\1\u02f8"+
     "\3\u02df\6\0\11\u02f7\2\0\10\u02f7\2\0\1\u02f9\1\0"+
-    "\1\u02f7\2\0\2\u02f7\15\0\1\u02f7\2\0\2\u02e0\1\0"+
-    "\1\u02e0\1\0\13\u02e0\1\0\3\u02fa\6\0\11\u02e0\1\0"+
-    "\1\u02fb\10\u02e0\4\0\1\u02e0\2\0\2\u02e0\15\0\1\u02e0"+
-    "\3\0\1\u02e0\1\0\1\u02e0\2\0\3\u02e0\1\0\1\u02e0"+
-    "\1\0\3\u02e0\13\0\11\u02e0\2\0\10\u02e0\4\0\1\u02e0"+
-    "\2\0\2\u02e0\15\0\1\u02e0\11\0\1\u02fc\76\0\2\40"+
-    "\1\0\1\40\1\0\13\40\1\237\11\0\4\40\1\u02fd"+
-    "\4\40\2\0\10\40\4\0\1\40\2\0\2\40\15\0"+
-    "\1\40\2\0\2\40\1\0\1\40\1\0\13\40\1\237"+
-    "\11\0\6\40\1\u02fe\2\40\2\0\10\40\4\0\1\40"+
-    "\2\0\2\40\15\0\1\40\2\0\1\40\1\u02ff\1\0"+
-    "\1\40\1\0\13\40\1\237\11\0\11\40\2\0\10\40"+
-    "\4\0\1\40\2\0\2\40\15\0\1\40\2\0\2\40"+
-    "\1\0\1\40\1\0\13\40\1\237\11\0\11\40\2\0"+
-    "\2\40\1\u0300\5\40\4\0\1\40\2\0\2\40\15\0"+
-    "\1\40\2\0\2\40\1\0\1\u0301\1\0\13\40\1\237"+
-    "\11\0\11\40\2\0\10\40\4\0\1\40\2\0\2\40"+
+    "\1\u02f7\1\u02fa\1\0\2\u02f7\15\0\1\u02f7\2\0\2\u02e0"+
+    "\1\0\1\u02e0\1\0\13\u02e0\1\0\3\u02fb\6\0\11\u02e0"+
+    "\1\0\1\u02fc\10\u02e0\4\0\1\u02e0\2\0\2\u02e0\15\0"+
+    "\1\u02e0\3\0\1\u02e0\1\0\1\u02e0\2\0\3\u02e0\1\0"+
+    "\1\u02e0\1\0\3\u02e0\13\0\11\u02e0\2\0\10\u02e0\4\0"+
+    "\1\u02e0\2\0\2\u02e0\15\0\1\u02e0\11\0\1\u02fd\76\0"+
+    "\2\40\1\0\1\40\1\0\13\40\1\237\11\0\4\40"+
+    "\1\u02fe\4\40\2\0\10\40\4\0\1\40\2\0\2\40"+
     "\15\0\1\40\2\0\2\40\1\0\1\40\1\0\13\40"+
-    "\1\237\11\0\11\40\2\0\3\40\1\u0302\4\40\4\0"+
-    "\1\40\2\0\2\40\15\0\1\40\40\0\1\u0303\52\0"+
-    "\1\u0304\102\0\2\40\1\0\1\40\1\0\13\40\1\237"+
-    "\11\0\4\40\1\u0305\4\40\2\0\10\40\4\0\1\40"+
-    "\2\0\2\40\15\0\1\40\2\0\2\40\1\0\1\40"+
-    "\1\0\13\40\1\237\11\0\3\40\1\u0306\5\40\2\0"+
+    "\1\237\11\0\6\40\1\u02ff\2\40\2\0\10\40\4\0"+
+    "\1\40\2\0\2\40\15\0\1\40\2\0\1\40\1\u0300"+
+    "\1\0\1\40\1\0\13\40\1\237\11\0\11\40\2\0"+
     "\10\40\4\0\1\40\2\0\2\40\15\0\1\40\2\0"+
-    "\2\40\1\0\1\40\1\0\13\40\1\237\11\0\7\40"+
-    "\1\u0307\1\40\2\0\10\40\4\0\1\40\2\0\2\40"+
-    "\15\0\1\u0307\2\0\2\40\1\0\1\40\1\0\13\40"+
-    "\1\u0308\11\0\11\40\2\0\10\40\4\0\1\40\2\0"+
+    "\2\40\1\0\1\40\1\0\13\40\1\237\11\0\11\40"+
+    "\2\0\2\40\1\u0301\5\40\4\0\1\40\2\0\2\40"+
+    "\15\0\1\40\2\0\2\40\1\0\1\u0302\1\0\13\40"+
+    "\1\237\11\0\11\40\2\0\10\40\4\0\1\40\2\0"+
     "\2\40\15\0\1\40\2\0\2\40\1\0\1\40\1\0"+
-    "\13\40\1\237\11\0\4\40\1\u0309\4\40\2\0\10\40"+
-    "\4\0\1\40\2\0\2\40\15\0\1\40\51\0\1\u030a"+
-    "\36\0\2\u02f7\1\0\1\u02f7\1\0\13\u02f7\1\u02f8\3\u030b"+
-    "\6\0\11\u02f7\1\0\1\u030c\10\u02f7\4\0\1\u02f7\2\0"+
-    "\2\u02f7\6\0\1\u02f9\6\0\1\u02f7\3\0\1\u02f7\1\0"+
-    "\1\u02f7\2\0\3\u02f7\1\0\1\u02f7\1\0\3\u02f7\13\0"+
-    "\11\u02f7\2\0\10\u02f7\4\0\1\u02f7\2\0\2\u02f7\15\0"+
+    "\13\40\1\237\11\0\11\40\2\0\3\40\1\u0303\4\40"+
+    "\4\0\1\40\2\0\2\40\15\0\1\40\40\0\1\u0304"+
+    "\52\0\1\u0305\102\0\2\40\1\0\1\40\1\0\13\40"+
+    "\1\237\11\0\4\40\1\u0306\4\40\2\0\10\40\4\0"+
+    "\1\40\2\0\2\40\15\0\1\40\2\0\2\40\1\0"+
+    "\1\40\1\0\13\40\1\237\11\0\3\40\1\u0307\5\40"+
+    "\2\0\10\40\4\0\1\40\2\0\2\40\15\0\1\40"+
+    "\2\0\2\40\1\0\1\40\1\0\13\40\1\237\11\0"+
+    "\7\40\1\u0308\1\40\2\0\10\40\4\0\1\40\2\0"+
+    "\2\40\15\0\1\u0308\2\0\2\40\1\0\1\40\1\0"+
+    "\13\40\1\u0309\11\0\11\40\2\0\10\40\4\0\1\40"+
+    "\2\0\2\40\15\0\1\40\2\0\2\40\1\0\1\40"+
+    "\1\0\13\40\1\237\11\0\4\40\1\u030a\4\40\2\0"+
+    "\10\40\4\0\1\40\2\0\2\40\15\0\1\40\51\0"+
+    "\1\u030b\36\0\2\u02f7\1\0\1\u02f7\1\0\13\u02f7\1\u02f8"+
+    "\3\u030c\6\0\11\u02f7\1\0\1\u030d\10\u02f7\4\0\1\u02f7"+
+    "\2\0\2\u02f7\5\0\2\u030e\6\0\1\u02f7\3\0\1\u02f7"+
+    "\1\0\1\u02f7\2\0\3\u02f7\1\0\1\u02f7\1\0\3\u02f7"+
+    "\13\0\11\u02f7\2\0\10\u02f7\4\0\1\u02f7\2\0\2\u02f7"+
+    "\15\0\1\u02f7\3\0\1\u02f7\1\0\1\u02f7\2\0\3\u02f7"+
+    "\1\0\1\u02f7\1\0\3\u02f7\1\0\1\u02f8\11\0\11\u02f7"+
+    "\2\0\10\u02f7\4\0\1\u02f7\1\u02fa\1\0\2\u02f7\15\0"+
     "\1\u02f7\3\0\1\u02f7\1\0\1\u02f7\2\0\3\u02f7\1\0"+
     "\1\u02f7\1\0\3\u02f7\1\0\1\u02f8\11\0\11\u02f7\2\0"+
     "\10\u02f7\4\0\1\u02f7\2\0\2\u02f7\15\0\1\u02f7\3\0"+
-    "\1\u030d\1\0\1\u030d\2\0\3\u030d\1\0\1\u030d\1\0"+
-    "\3\u030d\1\0\1\u030e\3\u02fa\6\0\11\u030d\2\0\10\u030d"+
-    "\2\0\1\u030f\1\0\1\u030d\2\0\2\u030d\15\0\1\u030d"+
-    "\3\0\1\u0310\1\0\1\u0310\2\0\3\u0310\1\0\1\u0310"+
-    "\1\0\3\u0310\6\0\1\u02fb\4\0\11\u0310\2\0\10\u0310"+
-    "\4\0\1\u0310\2\0\2\u0310\11\0\1\u0311\3\0\1\u0310"+
-    "\1\u02fb\37\0\1\u0312\47\0\1\40\1\u0313\1\0\1\40"+
-    "\1\0\13\40\1\237\11\0\11\40\2\0\10\40\4\0"+
-    "\1\40\2\0\2\40\15\0\1\40\2\0\2\40\1\0"+
-    "\1\u0314\1\0\13\40\1\237\11\0\11\40\2\0\10\40"+
+    "\1\u030f\1\0\1\u030f\2\0\3\u030f\1\0\1\u030f\1\0"+
+    "\3\u030f\1\0\1\u0310\3\u02fb\6\0\11\u030f\2\0\10\u030f"+
+    "\2\0\1\u0311\1\0\1\u030f\1\u0312\1\0\2\u030f\15\0"+
+    "\1\u030f\3\0\1\u0313\1\0\1\u0313\2\0\3\u0313\1\0"+
+    "\1\u0313\1\0\3\u0313\6\0\1\u02fc\4\0\11\u0313\2\0"+
+    "\10\u0313\4\0\1\u0313\2\0\2\u0313\11\0\1\u0314\3\0"+
+    "\1\u0313\1\u02fc\37\0\1\u0315\47\0\1\40\1\u0316\1\0"+
+    "\1\40\1\0\13\40\1\237\11\0\11\40\2\0\10\40"+
     "\4\0\1\40\2\0\2\40\15\0\1\40\2\0\2\40"+
-    "\1\0\1\40\1\0\13\40\1\237\11\0\11\40\2\0"+
-    "\7\40\1\u0315\4\0\1\40\2\0\2\40\15\0\1\40"+
-    "\36\0\1\u0316\120\0\1\u0317\36\0\2\40\1\0\1\40"+
-    "\1\0\13\40\1\237\11\0\6\40\1\u0318\2\40\2\0"+
-    "\10\40\4\0\1\40\2\0\2\40\15\0\1\40\3\0"+
-    "\1\u0319\1\0\1\u0319\2\0\3\u0319\1\0\1\u0319\1\0"+
-    "\3\u0319\13\0\11\u0319\2\0\10\u0319\4\0\1\u0319\2\0"+
-    "\2\u0319\15\0\1\u0319\2\0\2\40\1\0\1\40\1\0"+
-    "\13\40\1\237\11\0\6\40\1\u031a\2\40\2\0\10\40"+
-    "\4\0\1\40\2\0\2\40\15\0\1\40\23\0\3\u030b"+
-    "\1\u031b\160\0\1\u031c\6\0\2\u030d\1\0\1\u030d\1\0"+
-    "\13\u030d\1\u030e\3\u031d\6\0\11\u030d\1\0\1\u031e\10\u030d"+
-    "\4\0\1\u030d\2\0\2\u030d\2\0\1\u031f\3\0\1\u030f"+
-    "\6\0\1\u030d\3\0\1\u030d\1\0\1\u030d\2\0\3\u030d"+
-    "\1\0\1\u030d\1\0\3\u030d\13\0\11\u030d\2\0\10\u030d"+
-    "\4\0\1\u030d\2\0\2\u030d\15\0\1\u030d\3\0\1\u030d"+
-    "\1\0\1\u030d\2\0\3\u030d\1\0\1\u030d\1\0\3\u030d"+
-    "\1\0\1\u030e\11\0\11\u030d\2\0\10\u030d\4\0\1\u030d"+
-    "\2\0\2\u030d\15\0\1\u030d\2\0\2\u0310\1\0\1\u0310"+
-    "\1\0\13\u0310\5\0\1\u02fb\4\0\11\u0310\2\0\10\u0310"+
-    "\4\0\1\u0310\2\0\2\u0310\11\0\1\u0311\3\0\1\u0310"+
-    "\1\u02fb\22\0\3\u02fa\20\0\1\u02fb\114\0\1\u0320\32\0"+
-    "\1\40\1\u0321\1\0\1\40\1\0\13\40\1\237\11\0"+
-    "\11\40\2\0\10\40\4\0\1\40\2\0\2\40\15\0"+
-    "\1\40\2\0\1\40\1\u0322\1\0\1\40\1\0\13\40"+
-    "\1\237\11\0\11\40\2\0\10\40\4\0\1\40\2\0"+
-    "\2\40\15\0\1\40\2\0\2\40\1\0\1\40\1\0"+
-    "\13\40\1\237\11\0\1\u0323\10\40\2\0\10\40\4\0"+
-    "\1\40\2\0\2\40\15\0\1\40\43\0\1\u0324\41\0"+
-    "\1\u0324\5\0\1\u0325\102\0\2\40\1\0\1\u0326\1\0"+
-    "\13\40\1\237\11\0\11\40\2\0\10\40\4\0\1\40"+
-    "\2\0\2\40\15\0\1\40\2\0\2\u0319\1\0\1\u0319"+
-    "\1\0\13\u0319\1\u0308\11\0\11\u0319\2\0\10\u0319\4\0"+
-    "\1\u0319\2\0\2\u0319\15\0\1\u0319\2\0\2\40\1\0"+
-    "\1\u0327\1\0\13\40\1\237\11\0\11\40\2\0\10\40"+
-    "\4\0\1\40\2\0\2\40\15\0\1\40\3\0\1\u0328"+
-    "\1\0\1\u0328\2\0\3\u0328\1\0\1\u0328\1\0\3\u0328"+
-    "\13\0\11\u0328\2\0\10\u0328\4\0\1\u0328\2\0\2\u0328"+
-    "\15\0\1\u0328\23\0\3\u030b\20\0\1\u030c\27\0\1\u02f9"+
-    "\32\0\3\u031d\44\0\1\u031f\114\0\1\u0329\77\0\1\u032a"+
-    "\53\0\1\u032b\46\0\1\40\1\u032c\1\0\1\40\1\0"+
-    "\13\40\1\237\11\0\11\40\2\0\10\40\4\0\1\40"+
-    "\2\0\2\40\15\0\1\40\2\0\2\40\1\0\1\40"+
-    "\1\0\13\40\1\237\11\0\11\40\2\0\1\40\1\u032d"+
-    "\6\40\4\0\1\40\2\0\2\40\15\0\1\40\40\0"+
-    "\1\u032e\46\0\1\u032f\2\u0328\1\u032f\1\u0328\1\u032f\13\u0328"+
-    "\1\u032f\3\u0330\6\u032f\11\u0328\1\u032f\1\u0331\10\u0328\4\u032f"+
-    "\1\u0328\2\u032f\2\u0328\2\u032f\1\u0332\12\u032f\1\u0328\1\u032f"+
-    "\22\0\3\u031d\20\0\1\u031e\23\0\1\u031f\3\0\1\u030f"+
-    "\20\0\1\u0333\76\0\2\40\1\0\1\u0334\1\0\13\40"+
+    "\1\0\1\u0317\1\0\13\40\1\237\11\0\11\40\2\0"+
+    "\10\40\4\0\1\40\2\0\2\40\15\0\1\40\2\0"+
+    "\2\40\1\0\1\40\1\0\13\40\1\237\11\0\11\40"+
+    "\2\0\7\40\1\u0318\4\0\1\40\2\0\2\40\15\0"+
+    "\1\40\36\0\1\u0319\120\0\1\u031a\36\0\2\40\1\0"+
+    "\1\40\1\0\13\40\1\237\11\0\6\40\1\u031b\2\40"+
+    "\2\0\10\40\4\0\1\40\2\0\2\40\15\0\1\40"+
+    "\3\0\1\u031c\1\0\1\u031c\2\0\3\u031c\1\0\1\u031c"+
+    "\1\0\3\u031c\13\0\11\u031c\2\0\10\u031c\4\0\1\u031c"+
+    "\2\0\2\u031c\15\0\1\u031c\2\0\2\40\1\0\1\40"+
+    "\1\0\13\40\1\237\11\0\6\40\1\u031d\2\40\2\0"+
+    "\10\40\4\0\1\40\2\0\2\40\15\0\1\40\23\0"+
+    "\3\u030c\1\u031e\160\0\1\u031f\7\0\1\u0320\1\0\1\u0320"+
+    "\2\0\3\u0320\1\0\1\u0320\1\0\3\u0320\1\0\1\u0321"+
+    "\11\0\11\u0320\2\0\10\u0320\4\0\1\u0320\1\u0322\1\0"+
+    "\2\u0320\15\0\1\u0320\2\0\2\u030f\1\0\1\u030f\1\0"+
+    "\13\u030f\1\u0310\3\u0323\6\0\11\u030f\1\0\1\u0324\10\u030f"+
+    "\4\0\1\u030f\2\0\2\u030f\2\0\1\u0325\2\0\2\u0326"+
+    "\6\0\1\u030f\3\0\1\u030f\1\0\1\u030f\2\0\3\u030f"+
+    "\1\0\1\u030f\1\0\3\u030f\13\0\11\u030f\2\0\10\u030f"+
+    "\4\0\1\u030f\2\0\2\u030f\15\0\1\u030f\3\0\1\u030f"+
+    "\1\0\1\u030f\2\0\3\u030f\1\0\1\u030f\1\0\3\u030f"+
+    "\1\0\1\u0310\11\0\11\u030f\2\0\10\u030f\4\0\1\u030f"+
+    "\1\u0312\1\0\2\u030f\15\0\1\u030f\3\0\1\u030f\1\0"+
+    "\1\u030f\2\0\3\u030f\1\0\1\u030f\1\0\3\u030f\1\0"+
+    "\1\u0310\11\0\11\u030f\2\0\10\u030f\4\0\1\u030f\2\0"+
+    "\2\u030f\15\0\1\u030f\2\0\2\u0313\1\0\1\u0313\1\0"+
+    "\13\u0313\5\0\1\u02fc\4\0\11\u0313\2\0\10\u0313\4\0"+
+    "\1\u0313\2\0\2\u0313\11\0\1\u0314\3\0\1\u0313\1\u02fc"+
+    "\22\0\3\u02fb\20\0\1\u02fc\114\0\1\u0327\32\0\1\40"+
+    "\1\u0328\1\0\1\40\1\0\13\40\1\237\11\0\11\40"+
+    "\2\0\10\40\4\0\1\40\2\0\2\40\15\0\1\40"+
+    "\2\0\1\40\1\u0329\1\0\1\40\1\0\13\40\1\237"+
+    "\11\0\11\40\2\0\10\40\4\0\1\40\2\0\2\40"+
+    "\15\0\1\40\2\0\2\40\1\0\1\40\1\0\13\40"+
+    "\1\237\11\0\1\u032a\10\40\2\0\10\40\4\0\1\40"+
+    "\2\0\2\40\15\0\1\40\43\0\1\u032b\41\0\1\u032b"+
+    "\5\0\1\u032c\102\0\2\40\1\0\1\u032d\1\0\13\40"+
     "\1\237\11\0\11\40\2\0\10\40\4\0\1\40\2\0"+
-    "\2\40\15\0\1\40\35\0\1\u0316\51\0\22\u032f\1\0"+
-    "\1\u032f\1\0\44\u032f\1\u0332\36\u032f\3\u0330\44\u032f\1\u0332"+
-    "\16\u032f\1\u0335\1\u032f\1\u0335\2\u032f\3\u0335\1\u032f\1\u0335"+
-    "\1\u032f\3\u0335\2\u032f\1\0\1\u032f\1\0\1\u032f\1\u0331"+
-    "\4\u032f\11\u0335\2\u032f\10\u0335\4\u032f\1\u0335\2\u032f\2\u0335"+
-    "\2\u032f\1\u0332\6\u032f\1\u0336\3\u032f\1\u0335\1\u0331\22\u032f"+
-    "\1\0\1\u032f\1\0\44\u032f\1\u0332\1\u0337\13\u032f\54\0"+
-    "\1\u0338\32\0\2\40\1\0\1\40\1\0\13\40\1\237"+
-    "\11\0\10\40\1\u0339\2\0\10\40\4\0\1\40\2\0"+
-    "\2\40\15\0\1\40\1\0\1\u032f\2\u0335\1\u032f\1\u0335"+
-    "\1\u032f\13\u0335\1\u032f\1\0\1\u032f\1\0\1\u032f\1\u0331"+
-    "\4\u032f\11\u0335\2\u032f\10\u0335\4\u032f\1\u0335\2\u032f\2\u0335"+
-    "\2\u032f\1\u0332\6\u032f\1\u0336\3\u032f\1\u0335\1\u0331\22\u032f"+
-    "\3\u0330\20\u032f\1\u0331\23\u032f\1\u0332\14\u032f\4\0\1\u033a"+
+    "\2\40\15\0\1\40\2\0\2\u031c\1\0\1\u031c\1\0"+
+    "\13\u031c\1\u0309\11\0\11\u031c\2\0\10\u031c\4\0\1\u031c"+
+    "\2\0\2\u031c\15\0\1\u031c\2\0\2\40\1\0\1\u032e"+
+    "\1\0\13\40\1\237\11\0\11\40\2\0\10\40\4\0"+
+    "\1\40\2\0\2\40\15\0\1\40\3\0\1\u032f\1\0"+
+    "\1\u032f\2\0\3\u032f\1\0\1\u032f\1\0\3\u032f\13\0"+
+    "\11\u032f\2\0\10\u032f\4\0\1\u032f\2\0\2\u032f\15\0"+
+    "\1\u032f\23\0\3\u030c\20\0\1\u030d\26\0\2\u030e\11\0"+
+    "\2\u0320\1\0\1\u0320\1\0\13\u0320\1\u0321\3\u030c\6\0"+
+    "\11\u0320\1\0\1\u0330\10\u0320\4\0\1\u0320\1\0\1\u0331"+
+    "\2\u0320\5\0\2\u030e\6\0\1\u0320\3\0\1\u0320\1\0"+
+    "\1\u0320\2\0\3\u0320\1\0\1\u0320\1\0\3\u0320\13\0"+
+    "\11\u0320\2\0\10\u0320\4\0\1\u0320\2\0\2\u0320\15\0"+
+    "\1\u0320\3\0\1\u0320\1\0\1\u0320\2\0\3\u0320\1\0"+
+    "\1\u0320\1\0\3\u0320\1\0\1\u0321\11\0\11\u0320\2\0"+
+    "\10\u0320\4\0\1\u0320\2\0\2\u0320\15\0\1\u0320\23\0"+
+    "\3\u0323\44\0\1\u0325\114\0\1\u0332\77\0\1\u0333\15\0"+
+    "\1\u0334\1\0\1\u0334\2\0\3\u0334\1\0\1\u0334\1\0"+
+    "\3\u0334\1\0\1\u0335\11\0\11\u0334\2\0\10\u0334\4\0"+
+    "\1\u0334\1\u0336\1\0\2\u0334\15\0\1\u0334\41\0\1\u0337"+
+    "\46\0\1\40\1\u0338\1\0\1\40\1\0\13\40\1\237"+
+    "\11\0\11\40\2\0\10\40\4\0\1\40\2\0\2\40"+
+    "\15\0\1\40\2\0\2\40\1\0\1\40\1\0\13\40"+
+    "\1\237\11\0\11\40\2\0\1\40\1\u0339\6\40\4\0"+
+    "\1\40\2\0\2\40\15\0\1\40\40\0\1\u033a\46\0"+
+    "\1\u033b\2\u032f\1\u033b\1\u032f\1\u033b\13\u032f\1\u033b\3\u033c"+
+    "\6\u033b\11\u032f\1\u033b\1\u033d\10\u032f\4\u033b\1\u032f\2\u033b"+
+    "\2\u032f\2\u033b\1\u033e\12\u033b\1\u032f\1\u033b\100\0\1\u033f"+
+    "\27\0\3\u030c\47\0\2\u030e\32\0\3\u0323\20\0\1\u0324"+
+    "\23\0\1\u0325\2\0\2\u0326\11\0\2\u0334\1\0\1\u0334"+
+    "\1\0\13\u0334\1\u0335\3\u0323\6\0\11\u0334\1\0\1\u0340"+
+    "\10\u0334\4\0\1\u0334\1\0\1\u0341\2\u0334\2\0\1\u0325"+
+    "\2\0\2\u0326\6\0\1\u0334\3\0\1\u0334\1\0\1\u0334"+
+    "\2\0\3\u0334\1\0\1\u0334\1\0\3\u0334\13\0\11\u0334"+
+    "\2\0\10\u0334\4\0\1\u0334\2\0\2\u0334\15\0\1\u0334"+
+    "\3\0\1\u0334\1\0\1\u0334\2\0\3\u0334\1\0\1\u0334"+
+    "\1\0\3\u0334\1\0\1\u0335\11\0\11\u0334\2\0\10\u0334"+
+    "\4\0\1\u0334\2\0\2\u0334\15\0\1\u0334\11\0\1\u0342"+
+    "\76\0\2\40\1\0\1\u0343\1\0\13\40\1\237\11\0"+
+    "\11\40\2\0\10\40\4\0\1\40\2\0\2\40\15\0"+
+    "\1\40\35\0\1\u0319\51\0\22\u033b\1\0\1\u033b\1\0"+
+    "\44\u033b\1\u033e\36\u033b\3\u033c\44\u033b\1\u033e\16\u033b\1\u0344"+
+    "\1\u033b\1\u0344\2\u033b\3\u0344\1\u033b\1\u0344\1\u033b\3\u0344"+
+    "\2\u033b\1\0\1\u033b\1\0\1\u033b\1\u033d\4\u033b\11\u0344"+
+    "\2\u033b\10\u0344\4\u033b\1\u0344\2\u033b\2\u0344\2\u033b\1\u033e"+
+    "\6\u033b\1\u0345\3\u033b\1\u0344\1\u033d\22\u033b\1\0\1\u033b"+
+    "\1\0\44\u033b\1\u033e\1\u0346\13\u033b\22\0\3\u030c\20\0"+
+    "\1\u0330\16\0\1\u0331\7\0\2\u030e\110\0\1\u0347\27\0"+
+    "\3\u0323\44\0\1\u0325\2\0\2\u0326\64\0\1\u0348\32\0"+
+    "\2\40\1\0\1\40\1\0\13\40\1\237\11\0\10\40"+
+    "\1\u0349\2\0\10\40\4\0\1\40\2\0\2\40\15\0"+
+    "\1\40\1\0\1\u033b\2\u0344\1\u033b\1\u0344\1\u033b\13\u0344"+
+    "\1\u033b\1\0\1\u033b\1\0\1\u033b\1\u033d\4\u033b\11\u0344"+
+    "\2\u033b\10\u0344\4\u033b\1\u0344\2\u033b\2\u0344\2\u033b\1\u033e"+
+    "\6\u033b\1\u0345\3\u033b\1\u0344\1\u033d\22\u033b\3\u033c\20\u033b"+
+    "\1\u033d\23\u033b\1\u033e\14\u033b\22\0\3\u0323\20\0\1\u0340"+
+    "\16\0\1\u0341\4\0\1\u0325\2\0\2\u0326\14\0\1\u034a"+
     "\102\0\2\40\1\0\1\40\1\0\13\40\1\237\11\0"+
-    "\11\40\2\0\10\40\4\0\1\40\1\u033b\1\0\2\40"+
-    "\15\0\1\40\23\0\3\u033a\5\0\1\u033c\137\0\1\u033d"+
-    "\43\0\3\u033c\1\0\1\u033e\26\0\1\u033f\27\0\1\u0340"+
-    "\31\0\1\u0341\131\0\1\u0342\101\0\1\u0343\111\0\1\u0344"+
-    "\101\0\1\u0345\111\0\1\u0346\101\0\1\u0347\111\0\1\u0348"+
-    "\52\0\3\u0346\32\0\1\u0349\103\0\1\u034a\56\0\1\u0346"+
-    "\164\0\1\u0346";
+    "\11\40\2\0\10\40\4\0\1\40\1\u034b\1\0\2\40"+
+    "\15\0\1\40\23\0\3\u034a\5\0\1\u034c\137\0\1\u034d"+
+    "\43\0\3\u034c\1\0\1\u034e\26\0\1\u034f\27\0\1\u0350"+
+    "\31\0\1\u0351\131\0\1\u0352\101\0\1\u0353\111\0\1\u0354"+
+    "\101\0\1\u0355\111\0\1\u0356\101\0\1\u0357\111\0\1\u0358"+
+    "\52\0\3\u0356\32\0\1\u0359\103\0\1\u035a\56\0\1\u0356"+
+    "\164\0\1\u0356";
 
   private static int [] zzUnpackTrans() {
-    int [] result = new int[44450];
+    int [] result = new int[45570];
     int offset = 0;
     offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
     return result;
@@ -1530,14 +1564,14 @@ public class ASTPHP5Scanner implements Scanner {
     "\1\11\6\0\1\11\6\0\16\1\2\0\20\1\1\0"+
     "\2\1\1\11\4\0\2\11\1\1\4\0\14\1\2\0"+
     "\14\1\1\0\1\1\2\11\5\0\11\1\2\0\7\1"+
-    "\1\0\1\1\6\0\6\1\2\0\3\1\1\0\1\1"+
-    "\1\11\10\0\3\1\2\0\3\1\6\0\3\1\1\11"+
-    "\1\0\2\1\2\0\1\11\1\0\2\1\6\0\1\1"+
-    "\2\0\1\1\1\0\1\1\7\0\1\11\7\0\1\11"+
+    "\1\0\1\1\7\0\6\1\2\0\3\1\1\0\1\1"+
+    "\1\11\12\0\3\1\2\0\3\1\12\0\3\1\1\11"+
+    "\1\0\2\1\4\0\1\11\4\0\2\1\11\0\1\1"+
+    "\2\0\1\1\2\0\1\1\7\0\1\11\7\0\1\11"+
     "\1\0";
 
   private static int [] zzUnpackAttribute() {
-    int [] result = new int[842];
+    int [] result = new int[858];
     int offset = 0;
     offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
     return result;
@@ -3454,7 +3488,7 @@ public class ASTPHP5Scanner implements Scanner {
         return createSymbol(ASTPHP5Symbols.EOF);
     }
             }
-            case 843: break;
+            case 859: break;
             default:
               {     return createSymbol(ASTPHP5Symbols.EOF);
  }
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java
index 3ed38005b0..185a09f070 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPVarCommentParser.java
@@ -20,6 +20,7 @@
 package org.netbeans.modules.php.editor.parser;
 
 import java.util.ArrayList;
+import org.netbeans.modules.php.editor.model.impl.Type;
 import org.netbeans.modules.php.editor.parser.astnodes.PHPDocNode;
 import org.netbeans.modules.php.editor.parser.astnodes.PHPDocStaticAccessType;
 import org.netbeans.modules.php.editor.parser.astnodes.PHPDocTag;
@@ -60,7 +61,7 @@ public class PHPVarCommentParser {
             if (isExpectedPartsLength(isPHPDoc, parts)
                     && parts[variableIndex].charAt(0) == '$') { //NOI18N
                 //counting types
-                String[] types = parts[typeIndex].split("[|]"); //NOI18N
+                String[] types = Type.splitTypes(parts[typeIndex]);
                 int typePosition = startOffset + 
comment.indexOf(parts[typeIndex]);
                 ArrayList<PHPDocTypeNode> typeNodes = new ArrayList<>();
                 for (String type: types) {
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php
new file mode 100644
index 0000000000..fb7feb5048
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php
@@ -0,0 +1,215 @@
+<?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(): ClassX|(ClassY&ClassZ) {}
+    private function privateXMethod(): (ClassY&ClassZ)|ClassX {}
+    protected function protectedXMethod(): (ClassY&ClassZ)|(ClassX&ClassZ) {}
+    public static function publicStaticXMethod(): (ClassY&ClassZ)|ClassX {}
+    private static function privateStaticXMethod(): ClassX|(ClassY&ClassZ){}
+    protected static function protectedStaticXMethod(): (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(): ClassX|(ClassY&ClassX) {}
+    private function privateYMethod(): (ClassY&ClassZ)|ClassX {}
+    protected function protectedYMethod(): (ClassY&ClassZ)|(ClassX&ClassZ) {}
+    public static function publicStaticYMethod(): (ClassY&ClassZ)|ClassX {}
+    private static function privateStaticYMethod(): ClassX|(ClassY&ClassZ){}
+    protected static function protectedStaticYMethod(): (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 {}
+    private function privateZMethod(): (ClassY&ClassZ)|ClassX {}
+    protected function protectedZMethod(): (ClassY&ClassZ)|(ClassX&ClassZ) {}
+    public static function publicStaticZMethod(): 
(ClassX&ClassZ)|(ClassY&ClassZ)|ClassX {}
+    private static function privateStaticZMethod(): ClassX|(ClassY&ClassZ){}
+    protected static function protectedStaticZMethod(): (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&ClassY)|ClassZ {}
+    private function privateTraitMethod(): ClassZ|(ClassX&ClassY)|null {}
+    protected function protectedTraitMethod(): (ClassX&ClassY)|ClassZ {}
+    public static function publicStaticTraitMethod(): 
(ClassX&ClassY)|(ClassX&ClassY&ClassZ) {}
+    private static function privateStaticTraitMethod():  
ClassX|(ClassX&ClassY)|ClassZ {}
+    protected static function protectedStaticTraitMethod(): 
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) {
+    }
+
+    public function test(): void {
+        // method return types
+        $this->returnType()->publicXField; // ClassX|(ClassY&ClassZ)
+        $this->returnType()->publicXMethod()->publicYField; // 
ClassX|(ClassY&ClassZ)
+        $this->returnType()?->publicYMethod()?->publicXField; // 
ClassX|(ClassY&ClassX)
+        $this->privateTraitMethod()->publicXField; // 
ClassZ|(ClassX&ClassY)|null
+        $this->protectedTraitMethod()->publicYMethod()->publicXField; // 
ClassX|(ClassY&ClassX)
+        $this->phpdocReturnType()->publicXField; // 
(ClassX&ClassZ)|(ClassX&ClassY)
+        $this->returnType()::IMPLICIT_X_CONSTANT; // ClassX|(ClassY&ClassZ)
+        $this->returnType()::publicStaticXMethod()::$publicStaticXField; // 
(ClassY&ClassZ)|ClassX
+        $this->returnType()::publicStaticXMethod()->publicXField; // 
(ClassY&ClassZ)|ClassX
+        $this->privateTraitMethod()::publicStaticXMethod(); // 
ClassZ|(ClassX&ClassY)|null
+        $this->methodTag()->publicXMethod(); // ClassX|(ClassX&ClassZ)
+        self::publicStaticMethod()::IMPLICIT_X_CONSTANT; // 
(ClassX&ClassZ)|(ClassX&ClassY)
+        
self::publicStaticMethod()::publicStaticXMethod()::publicStaticYMethod(); // 
(ClassY&ClassZ)|ClassX
+        self::publicStaticMethod()::publicStaticXMethod()->publicXMethod(); // 
(ClassY&ClassZ)|ClassX
+        static::publicStaticMethod()->publicZMethod(); // 
(ClassX&ClassZ)|(ClassX&ClassY)
+        static::publicStaticMethod()->publicZMethod()::$publicStaticXField; // 
ClassX|(ClassY&ClassZ)|ClassY
+        static::publicStaticMethod()->publicZMethod()->publicYMethod(); // 
ClassX|(ClassY&ClassZ)|ClassY
+        static::publicStaticTraitMethod()->publicXMethod()->publicXField; // 
ClassX|(ClassY&ClassZ)
+        // field types
+        $this->privateFiled->publicXMethod(); // ClassX|(ClassY&ClassZ)
+        $this->publicFiled->publicXMethod()->publicYField; // 
ClassX|(ClassY&ClassZ)
+        $this->protectedFiled::PUBLIC_Z_CONSTANT; // 
ClassZ|ClassX|(ClassY&ClassZ)
+        $this->publicPhpdocField->publicXMethod(); // ClassX|(ClassX&ClassY)
+        $this->publicPhpdocField::$publicStaticXField; // 
ClassX|(ClassX&ClassY)
+        $this->protectedTraitField->publicXMethod(); // ClassY|(ClassX&ClassY)
+        $this->privatePromotedFiled->publicYMethod(); // null|(ClassZ&ClassX)
+        $this->propertyTag->publicYMethod(); // (ClassX&ClassY)|ClassY
+        static::$privateStaticField::IMPLICIT_Y_CONSTANT; // 
ClassZ|(ClassZ&ClassY)
+        static::$privateStaticField?->publicStaticZMethod(); // 
ClassZ|(ClassZ&ClassY)
+        self::$publicPhpdocStaticField::$publicStaticXField; // 
(ClassX&ClassY)|ClassZ
+        self::$publicPhpdocStaticField->publicZField; // (ClassX&ClassY)|ClassZ
+        self::$publicStaticTraitField->publicXMethod(); // 
ClassY|(ClassX&ClassY)|ClassX
+    }
+}
+
+testFunctionReturnType()->publicXField; // (ClassX&ClassY)|ClassZ
+testFunctionReturnType()::PUBLIC_X_CONSTANT; // (ClassX&ClassY)|ClassZ
+
+$testFunctionReturnType = testFunctionReturnType();
+$testFunctionReturnType->publicXMethod(); // (ClassX&ClassY)|ClassZ
+$testFunctionReturnType::IMPLICIT_Z_CONSTANT(); // (ClassX&ClassY)|ClassZ
+
+/** @var (ClassX&ClassY)|null $vardoc1 */
+$vardoc1->publicXField; // (ClassX&ClassY)|null
+$vardoc1::$publicStaticXField; // (ClassX&ClassY)|null
+/** @var ClassZ|(ClassX&ClassY)|null $vardoc2 */
+$vardoc2->publicXField; // ClassZ|(ClassX&ClassY)|null
+$vardoc2::$publicStaticXField; // ClassZ|(ClassX&ClassY)|null
+/** @var ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ) $vardoc3 */
+$vardoc3->publicXField; // ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ)
+$vardoc3::$publicStaticXField; // ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ)
+
+/* @var $vardoc4 (ClassX&ClassY)|null */
+$vardoc4->publicXField; // (ClassX&ClassY)|null
+$vardoc4::$publicStaticXField; // (ClassX&ClassY)|null
+/* @var $vardoc5 ClassZ|(ClassX&ClassY)|null */
+$vardoc5->publicXField; // ClassZ|(ClassX&ClassY)|null
+$vardoc5::$publicStaticXField; // ClassZ|(ClassX&ClassY)|null
+/* @var $vardoc6 ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ) */
+$vardoc6->publicXField; // ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ)
+$vardoc6::$publicStaticXField; // ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ)
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType01.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType01.completion
new file mode 100644
index 0000000000..4bf26c374e
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType01.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$this->privateFiled->|publicXMethod(); // ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType02a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType02a.completion
new file mode 100644
index 0000000000..c359cfc285
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType02a.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$this->publicFiled->publicXMethod()->|publicYField; // ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType02b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType02b.completion
new file mode 100644
index 0000000000..5a3fc4e6de
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType02b.completion
@@ -0,0 +1,5 @@
+Code completion result for source line:
+$this->publicFiled->publicXMethod()->publicY|Field; // ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType03.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType03.completion
new file mode 100644
index 0000000000..bdc7fcc4b7
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType03.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$this->protectedFiled::|PUBLIC_Z_CONSTANT; // ClassZ|ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType04.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType04.completion
new file mode 100644
index 0000000000..ea758c0dab
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType04.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$this->publicPhpdocField->|publicXMethod(); // ClassX|(ClassX&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType05.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType05.completion
new file mode 100644
index 0000000000..3e46b7f0dd
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType05.completion
@@ -0,0 +1,13 @@
+Code completion result for source line:
+$this->publicPhpdocField::|$publicStaticXField; // ClassX|(ClassX&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType06.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType06.completion
new file mode 100644
index 0000000000..83c0b4be4e
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType06.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$this->protectedTraitField->|publicXMethod(); // ClassY|(ClassX&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType07.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType07.completion
new file mode 100644
index 0000000000..13f946288a
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType07.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$this->privatePromotedFiled->|publicYMethod(); // null|(ClassZ&ClassX)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType08.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType08.completion
new file mode 100644
index 0000000000..a4b8132f7a
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType08.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$this->propertyTag->|publicYMethod(); // (ClassX&ClassY)|ClassY
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType09.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType09.completion
new file mode 100644
index 0000000000..62e2fb0e01
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType09.completion
@@ -0,0 +1,13 @@
+Code completion result for source line:
+static::$privateStaticField::|IMPLICIT_Y_CONSTANT; // ClassZ|(ClassZ&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType10a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType10a.completion
new file mode 100644
index 0000000000..d862c16ef6
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType10a.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+static::$privateStaticField?->|publicStaticZMethod(); // ClassZ|(ClassZ&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType10b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType10b.completion
new file mode 100644
index 0000000000..340b0efb04
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType10b.completion
@@ -0,0 +1,4 @@
+Code completion result for source line:
+static::$privateStaticField?->publicStaticZ|Method(); // ClassZ|(ClassZ&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType11.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType11.completion
new file mode 100644
index 0000000000..3dc96561cf
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType11.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+self::$publicPhpdocStaticField::|$publicStaticXField; // (ClassX&ClassY)|ClassZ
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType12.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType12.completion
new file mode 100644
index 0000000000..09a4091451
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType12.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+self::$publicPhpdocStaticField->|publicZField; // (ClassX&ClassY)|ClassZ
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType13.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType13.completion
new file mode 100644
index 0000000000..aa1ad3a6f4
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FieldType13.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+self::$publicStaticTraitField->|publicXMethod(); // 
ClassY|(ClassX&ClassY)|ClassX
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType01.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType01.completion
new file mode 100644
index 0000000000..e83c10f70f
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType01.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+testFunctionReturnType()->|publicXField; // (ClassX&ClassY)|ClassZ
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType02.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType02.completion
new file mode 100644
index 0000000000..e4cad00dd1
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType02.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+testFunctionReturnType()::|PUBLIC_X_CONSTANT; // (ClassX&ClassY)|ClassZ
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType03.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType03.completion
new file mode 100644
index 0000000000..b2ddef96a9
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType03.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$testFunctionReturnType->|publicXMethod(); // (ClassX&ClassY)|ClassZ
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType04a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType04a.completion
new file mode 100644
index 0000000000..47d825aa6b
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType04a.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$testFunctionReturnType::|IMPLICIT_Z_CONSTANT(); // (ClassX&ClassY)|ClassZ
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType04b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType04b.completion
new file mode 100644
index 0000000000..17eae8a03f
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_FunctionReturnType04b.completion
@@ -0,0 +1,4 @@
+Code completion result for source line:
+$testFunctionReturnType::IMPLICIT_Z_|CONSTANT(); // (ClassX&ClassY)|ClassZ
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType01.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType01.completion
new file mode 100644
index 0000000000..77604cc938
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType01.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$this->returnType()->|publicXField; // ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType02a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType02a.completion
new file mode 100644
index 0000000000..9d458314ee
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType02a.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$this->returnType()->publicXMethod()->|publicYField; // ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType02b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType02b.completion
new file mode 100644
index 0000000000..822d23bd42
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType02b.completion
@@ -0,0 +1,5 @@
+Code completion result for source line:
+$this->returnType()->publicXMethod()->publicY|Field; // ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType03.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType03.completion
new file mode 100644
index 0000000000..e2c2e8a1bf
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType03.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$this->returnType()?->publicYMethod()?->|publicXField; // 
ClassX|(ClassY&ClassX)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType04.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType04.completion
new file mode 100644
index 0000000000..30c07458a0
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType04.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$this->privateTraitMethod()->|publicXField; // ClassZ|(ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType05.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType05.completion
new file mode 100644
index 0000000000..02a5bd1408
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType05.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$this->protectedTraitMethod()->publicYMethod()->|publicXField; // 
ClassX|(ClassY&ClassX)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType06.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType06.completion
new file mode 100644
index 0000000000..e33d72546d
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType06.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$this->phpdocReturnType()->|publicXField; // (ClassX&ClassZ)|(ClassX&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType07.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType07.completion
new file mode 100644
index 0000000000..6ad5fced4f
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType07.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$this->returnType()::|IMPLICIT_X_CONSTANT; // ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType08.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType08.completion
new file mode 100644
index 0000000000..125b571a9c
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType08.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$this->returnType()::publicStaticXMethod()::|$publicStaticXField; // 
(ClassY&ClassZ)|ClassX
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType09a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType09a.completion
new file mode 100644
index 0000000000..669848745a
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType09a.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$this->returnType()::publicStaticXMethod()->|publicXField; // 
(ClassY&ClassZ)|ClassX
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType09b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType09b.completion
new file mode 100644
index 0000000000..d9b06a75f9
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType09b.completion
@@ -0,0 +1,4 @@
+Code completion result for source line:
+$this->returnType()::publicStaticXMethod()->publicXField|; // 
(ClassY&ClassZ)|ClassX
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType10.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType10.completion
new file mode 100644
index 0000000000..1f63e22306
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType10.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$this->privateTraitMethod()::|publicStaticXMethod(); // 
ClassZ|(ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType11.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType11.completion
new file mode 100644
index 0000000000..3e23caca0e
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType11.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$this->methodTag()->|publicXMethod(); // ClassX|(ClassX&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType12.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType12.completion
new file mode 100644
index 0000000000..7f27f9ee9f
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType12.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+self::publicStaticMethod()::|IMPLICIT_X_CONSTANT; // 
(ClassX&ClassZ)|(ClassX&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType13a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType13a.completion
new file mode 100644
index 0000000000..fa64616f50
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType13a.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+self::publicStaticMethod()::publicStaticXMethod()::|publicStaticYMethod(); // 
(ClassY&ClassZ)|ClassX
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType13b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType13b.completion
new file mode 100644
index 0000000000..a6278f66aa
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType13b.completion
@@ -0,0 +1,4 @@
+Code completion result for source line:
+self::publicStaticMethod()::publicStaticXMethod()::publicStaticYM|ethod(); // 
(ClassY&ClassZ)|ClassX
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType14.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType14.completion
new file mode 100644
index 0000000000..6648e11878
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType14.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+self::publicStaticMethod()::publicStaticXMethod()->|publicXMethod(); // 
(ClassY&ClassZ)|ClassX
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType15.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType15.completion
new file mode 100644
index 0000000000..06ec5a212d
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType15.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+static::publicStaticMethod()->|publicZMethod(); // 
(ClassX&ClassZ)|(ClassX&ClassY)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType16.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType16.completion
new file mode 100644
index 0000000000..8927f5bf55
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType16.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+static::publicStaticMethod()->publicZMethod()::|$publicStaticXField; // 
ClassX|(ClassY&ClassZ)|ClassY
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType17.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType17.completion
new file mode 100644
index 0000000000..b95fe4bd24
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType17.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+static::publicStaticMethod()->publicZMethod()->|publicYMethod(); // 
ClassX|(ClassY&ClassZ)|ClassY
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType18.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType18.completion
new file mode 100644
index 0000000000..086280c2d0
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_MethodReturnType18.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+static::publicStaticTraitMethod()->publicXMethod()->|publicXField; // 
ClassX|(ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType01a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType01a.completion
new file mode 100644
index 0000000000..ca1b755887
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType01a.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$vardoc1->|publicXField; // (ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType01b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType01b.completion
new file mode 100644
index 0000000000..b88839cbaf
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType01b.completion
@@ -0,0 +1,13 @@
+Code completion result for source line:
+$vardoc1::|$publicStaticXField; // (ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType02a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType02a.completion
new file mode 100644
index 0000000000..e9e3755ed4
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType02a.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$vardoc2->|publicXField; // ClassZ|(ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType02b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType02b.completion
new file mode 100644
index 0000000000..320d0e345c
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType02b.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$vardoc2::|$publicStaticXField; // ClassZ|(ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType03a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType03a.completion
new file mode 100644
index 0000000000..b89c65cfef
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType03a.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$vardoc3->|publicXField; // ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType03b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType03b.completion
new file mode 100644
index 0000000000..f4cdb23df0
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType03b.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$vardoc3::|$publicStaticXField; // 
ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType04a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType04a.completion
new file mode 100644
index 0000000000..8872b4d893
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType04a.completion
@@ -0,0 +1,9 @@
+Code completion result for source line:
+$vardoc4->|publicXField; // (ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType04b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType04b.completion
new file mode 100644
index 0000000000..80d5c66443
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType04b.completion
@@ -0,0 +1,13 @@
+Code completion result for source line:
+$vardoc4::|$publicStaticXField; // (ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType05a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType05a.completion
new file mode 100644
index 0000000000..d26ec9c2cb
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType05a.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$vardoc5->|publicXField; // ClassZ|(ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType05b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType05b.completion
new file mode 100644
index 0000000000..83272cb980
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType05b.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$vardoc5::|$publicStaticXField; // ClassZ|(ClassX&ClassY)|null
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType06a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType06a.completion
new file mode 100644
index 0000000000..442cde1e87
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType06a.completion
@@ -0,0 +1,12 @@
+Code completion result for source line:
+$vardoc6->|publicXField; // ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+METHOD     publicXMethod()                 [PUBLIC]   ClassX
+METHOD     publicYMethod()                 [PUBLIC]   ClassY
+METHOD     publicZMethod()                 [PUBLIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX publicX  [PUBLIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX publicY  [PUBLIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX publicZ  [PUBLIC]   ClassZ
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType06b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType06b.completion
new file mode 100644
index 0000000000..1411a47294
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/php82/testDNFTypes/dnfTypes.php.testDNFTypes_VarDocType06b.completion
@@ -0,0 +1,18 @@
+Code completion result for source line:
+$vardoc6::|$publicStaticXField; // 
ClassZ|(ClassX&ClassY)|(ClassX&ClassY&ClassZ)
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     publicStaticXMethod()           [STATIC]   ClassX
+METHOD     publicStaticYMethod()           [STATIC]   ClassY
+METHOD     publicStaticZMethod()           [STATIC]   ClassZ
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassX
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassY
+VARIABLE   (ClassY&ClassZ)|ClassX $public  [STATIC]   ClassZ
+CONSTANT   IMPLICIT_X_CONSTANT "implicit   [PUBLIC]   ClassX
+CONSTANT   IMPLICIT_Y_CONSTANT "implicit   [PUBLIC]   ClassY
+CONSTANT   IMPLICIT_Z_CONSTANT "implicit   [PUBLIC]   ClassZ
+CONSTANT   PUBLIC_X_CONSTANT "public cons  [PUBLIC]   ClassX
+CONSTANT   PUBLIC_Y_CONSTANT "public cons  [PUBLIC]   ClassY
+CONSTANT   PUBLIC_Z_CONSTANT "public cons  [PUBLIC]   ClassZ
+CONSTANT   class \ClassX                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassY                   [PUBLIC]   Magic Constant
+CONSTANT   class \ClassZ                   [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP82CodeCompletionTest.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP82CodeCompletionTest.java
index ba901e3cb0..40fd8def75 100644
--- 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP82CodeCompletionTest.java
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP82CodeCompletionTest.java
@@ -293,4 +293,216 @@ public class PHP82CodeCompletionTest extends 
PHPCodeCompletionTestBase {
         checkCompletion("constantsInTraits", "$c::^PUBLIC_TRAIT;");
     }
 
+    public void testDNFTypes_MethodReturnType01() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->returnType()->^publicXField;");
+    }
+
+    public void testDNFTypes_MethodReturnType02a() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->returnType()->publicXMethod()->^publicYField;");
+    }
+
+    public void testDNFTypes_MethodReturnType02b() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->returnType()->publicXMethod()->publicY^Field;");
+    }
+
+    public void testDNFTypes_MethodReturnType03() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->returnType()?->publicYMethod()?->^publicXField;");
+    }
+
+    public void testDNFTypes_MethodReturnType04() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->privateTraitMethod()->^publicXField;");
+    }
+
+    public void testDNFTypes_MethodReturnType05() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->protectedTraitMethod()->publicYMethod()->^publicXField;");
+    }
+
+    public void testDNFTypes_MethodReturnType06() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->phpdocReturnType()->^publicXField;");
+    }
+
+    public void testDNFTypes_MethodReturnType07() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->returnType()::^IMPLICIT_X_CONSTANT;");
+    }
+
+    public void testDNFTypes_MethodReturnType08() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->returnType()::publicStaticXMethod()::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_MethodReturnType09a() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->returnType()::publicStaticXMethod()->^publicXField;");
+    }
+
+    public void testDNFTypes_MethodReturnType09b() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->returnType()::publicStaticXMethod()->publicXField^;");
+    }
+
+    public void testDNFTypes_MethodReturnType10() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->privateTraitMethod()::^publicStaticXMethod();");
+    }
+
+    public void testDNFTypes_MethodReturnType11() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->methodTag()->^publicXMethod();");
+    }
+
+    public void testDNFTypes_MethodReturnType12() throws Exception {
+        checkCompletion("dnfTypes", "        
self::publicStaticMethod()::^IMPLICIT_X_CONSTANT;");
+    }
+
+    public void testDNFTypes_MethodReturnType13a() throws Exception {
+        checkCompletion("dnfTypes", "        
self::publicStaticMethod()::publicStaticXMethod()::^publicStaticYMethod();");
+    }
+
+    public void testDNFTypes_MethodReturnType13b() throws Exception {
+        checkCompletion("dnfTypes", "        
self::publicStaticMethod()::publicStaticXMethod()::publicStaticYM^ethod();");
+    }
+
+    public void testDNFTypes_MethodReturnType14() throws Exception {
+        checkCompletion("dnfTypes", "        
self::publicStaticMethod()::publicStaticXMethod()->^publicXMethod();");
+    }
+
+    public void testDNFTypes_MethodReturnType15() throws Exception {
+        checkCompletion("dnfTypes", "        
static::publicStaticMethod()->^publicZMethod();");
+    }
+
+    public void testDNFTypes_MethodReturnType16() throws Exception {
+        checkCompletion("dnfTypes", "        
static::publicStaticMethod()->publicZMethod()::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_MethodReturnType17() throws Exception {
+        checkCompletion("dnfTypes", "        
static::publicStaticMethod()->publicZMethod()->^publicYMethod();");
+    }
+
+    public void testDNFTypes_MethodReturnType18() throws Exception {
+        checkCompletion("dnfTypes", "        
static::publicStaticTraitMethod()->publicXMethod()->^publicXField;");
+    }
+
+    public void testDNFTypes_FieldType01() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->privateFiled->^publicXMethod();");
+    }
+
+    public void testDNFTypes_FieldType02a() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->publicFiled->publicXMethod()->^publicYField;");
+    }
+
+    public void testDNFTypes_FieldType02b() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->publicFiled->publicXMethod()->publicY^Field;");
+    }
+
+    public void testDNFTypes_FieldType03() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->protectedFiled::^PUBLIC_Z_CONSTANT;");
+    }
+
+    public void testDNFTypes_FieldType04() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->publicPhpdocField->^publicXMethod();");
+    }
+
+    public void testDNFTypes_FieldType05() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->publicPhpdocField::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_FieldType06() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->protectedTraitField->^publicXMethod();");
+    }
+
+    public void testDNFTypes_FieldType07() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->privatePromotedFiled->^publicYMethod();");
+    }
+
+    public void testDNFTypes_FieldType08() throws Exception {
+        checkCompletion("dnfTypes", "        
$this->propertyTag->^publicYMethod();");
+    }
+
+    public void testDNFTypes_FieldType09() throws Exception {
+        checkCompletion("dnfTypes", "        
static::$privateStaticField::^IMPLICIT_Y_CONSTANT;");
+    }
+
+    public void testDNFTypes_FieldType10a() throws Exception {
+        checkCompletion("dnfTypes", "        
static::$privateStaticField?->^publicStaticZMethod();");
+    }
+
+    public void testDNFTypes_FieldType10b() throws Exception {
+        checkCompletion("dnfTypes", "        
static::$privateStaticField?->publicStaticZ^Method();");
+    }
+
+    public void testDNFTypes_FieldType11() throws Exception {
+        checkCompletion("dnfTypes", "        
self::$publicPhpdocStaticField::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_FieldType12() throws Exception {
+        checkCompletion("dnfTypes", "        
self::$publicPhpdocStaticField->^publicZField;");
+    }
+
+    public void testDNFTypes_FieldType13() throws Exception {
+        checkCompletion("dnfTypes", "        
self::$publicStaticTraitField->^publicXMethod();");
+    }
+
+    public void testDNFTypes_FunctionReturnType01() throws Exception {
+        checkCompletion("dnfTypes", 
"testFunctionReturnType()->^publicXField;");
+    }
+
+    public void testDNFTypes_FunctionReturnType02() throws Exception {
+        checkCompletion("dnfTypes", 
"testFunctionReturnType()::^PUBLIC_X_CONSTANT;");
+    }
+
+    public void testDNFTypes_FunctionReturnType03() throws Exception {
+        checkCompletion("dnfTypes", 
"$testFunctionReturnType->^publicXMethod();");
+    }
+
+    public void testDNFTypes_FunctionReturnType04a() throws Exception {
+        checkCompletion("dnfTypes", 
"$testFunctionReturnType::^IMPLICIT_Z_CONSTANT();");
+    }
+
+    public void testDNFTypes_FunctionReturnType04b() throws Exception {
+        checkCompletion("dnfTypes", 
"$testFunctionReturnType::IMPLICIT_Z_^CONSTANT();");
+    }
+
+    public void testDNFTypes_VarDocType01a() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc1->^publicXField;");
+    }
+
+    public void testDNFTypes_VarDocType01b() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc1::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_VarDocType02a() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc2->^publicXField;");
+    }
+
+    public void testDNFTypes_VarDocType02b() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc2::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_VarDocType03a() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc3->^publicXField;");
+    }
+
+    public void testDNFTypes_VarDocType03b() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc3::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_VarDocType04a() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc4->^publicXField;");
+    }
+
+    public void testDNFTypes_VarDocType04b() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc4::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_VarDocType05a() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc5->^publicXField;");
+    }
+
+    public void testDNFTypes_VarDocType05b() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc5::^$publicStaticXField;");
+    }
+
+    public void testDNFTypes_VarDocType06a() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc6->^publicXField;");
+    }
+
+    public void testDNFTypes_VarDocType06b() throws Exception {
+        checkCompletion("dnfTypes", "$vardoc6::^$publicStaticXField;");
+    }
+
 }
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/model/impl/TypeTest.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/model/impl/TypeTest.java
index 1f7f5a4571..ae2c69d344 100644
--- 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/model/impl/TypeTest.java
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/model/impl/TypeTest.java
@@ -19,6 +19,8 @@
 
 package org.netbeans.modules.php.editor.model.impl;
 
+import static org.junit.Assert.assertArrayEquals;
+
 /**
  *
  * @author Ondrej Brejla <obre...@netbeans.org>
@@ -42,4 +44,103 @@ public class TypeTest extends ModelTestBase {
         assertFalse(Type.isArray("\\Foo\\Bar"));
     }
 
+    public void testSplitTypes_01() throws Exception {
+        String declaredTypes = "Foo";
+        assertArrayEquals(new String[]{"Foo"}, Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypes_02() throws Exception {
+        String declaredTypes = "\\Foo";
+        assertArrayEquals(new String[]{"\\Foo"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypes_03() throws Exception {
+        String declaredTypes = "  \\Foo\\Bar  ";
+        assertArrayEquals(new String[]{"\\Foo\\Bar"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesNullableType_01() throws Exception {
+        String declaredTypes = "?Foo";
+        assertArrayEquals(new String[]{"?Foo"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesNullableType_02() throws Exception {
+        String declaredTypes = "?\\Foo\\Bar";
+        assertArrayEquals(new String[]{"?\\Foo\\Bar"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesUnionType_01() throws Exception {
+        String declaredTypes = "string|int|null";
+        assertArrayEquals(new String[]{"string", "int", "null"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesUnionType_02() throws Exception {
+        String declaredTypes = "\\Foo\\Bar|\\Baz|null";
+        assertArrayEquals(new String[]{"\\Foo\\Bar", "\\Baz", "null"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesUnionType_03() throws Exception {
+        String declaredTypes = "\\Foo\\Bar   |  \\Baz | null";
+        assertArrayEquals(new String[]{"\\Foo\\Bar", "\\Baz", "null"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesIntersectionType_01() throws Exception {
+        String declaredTypes = "string&int&null";
+        assertArrayEquals(new String[]{"string", "int", "null"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesIntersectionType_02() throws Exception {
+        String declaredTypes = "\\Foo\\Bar&\\Baz&null";
+        assertArrayEquals(new String[]{"\\Foo\\Bar", "\\Baz", "null"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesIntersectionType_03() throws Exception {
+        String declaredTypes = "\\Foo\\Bar   &  \\Baz & null";
+        assertArrayEquals(new String[]{"\\Foo\\Bar", "\\Baz", "null"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_01() throws Exception {
+        String declaredTypes = "(X&Y)|Z";
+        assertArrayEquals(new String[]{"X", "Y", "Z"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_02() throws Exception {
+        String declaredTypes = "X|(Y&Z)";
+        assertArrayEquals(new String[]{"X", "Y", "Z"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_03() throws Exception {
+        String declaredTypes = "(X&Y)|(Y&Z)";
+        assertArrayEquals(new String[]{"X", "Y", "Y", "Z"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_04() throws Exception {
+        String declaredTypes = "X|(Y&Z)|Z";
+        assertArrayEquals(new String[]{"X", "Y", "Z", "Z"}, 
Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_05() throws Exception {
+        String declaredTypes = "(\\NS1\\Test1&\\NS2\\Test2)|\\Test3";
+        assertArrayEquals(new String[]{"\\NS1\\Test1", "\\NS2\\Test2", 
"\\Test3"}, Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_06() throws Exception {
+        String declaredTypes = "\\NS3\\Test3  |  (\\NS1\\Test1&\\NS2\\Test2)";
+        assertArrayEquals(new String[]{"\\NS3\\Test3","\\NS1\\Test1", 
"\\NS2\\Test2"}, Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_07() throws Exception {
+        String declaredTypes = "(\\NS3\\Test3&Test1)  |  
(\\NS1\\Test1&\\NS2\\Test2)";
+        assertArrayEquals(new String[]{"\\NS3\\Test3", "Test1", 
"\\NS1\\Test1", "\\NS2\\Test2"}, Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_08() throws Exception {
+        String declaredTypes = 
"(\\NS3\\Test3&Test1)|(\\NS1\\Test1&\\NS2\\Test2)";
+        assertArrayEquals(new String[]{"\\NS3\\Test3", "Test1", 
"\\NS1\\Test1", "\\NS2\\Test2"}, Type.splitTypes(declaredTypes));
+    }
+
+    public void testSplitTypesDNFType_09() throws Exception {
+        String declaredTypes = "  
(\\NS3\\Test3&Test1)|(\\NS1\\Test1&\\NS2\\Test2)  ";
+        assertArrayEquals(new String[]{"\\NS3\\Test3", "Test1", 
"\\NS1\\Test1", "\\NS2\\Test2"}, Type.splitTypes(declaredTypes));
+    }
 }
diff --git a/php/php.editor/tools/ASTPHP5Scanner.flex 
b/php/php.editor/tools/ASTPHP5Scanner.flex
index cba1092442..3d128d1d0c 100644
--- a/php/php.editor/tools/ASTPHP5Scanner.flex
+++ b/php/php.editor/tools/ASTPHP5Scanner.flex
@@ -1203,7 +1203,7 @@ 
NOWDOC_CHARS=({NEWLINE}*(([^a-zA-Z_\x7f-\xff\n\r][^\n\r]*)|({LABEL}[^a-zA-Z0-9_\
     }
 }
 
-<ST_IN_SCRIPTING>"/*"{WHITESPACE}*"@var"{WHITESPACE}("$"?){LABEL}("["({LABEL} 
| "\"" | 
"'")*"]")*{WHITESPACE}("?"?){QUALIFIED_LABEL}("[""]")*([|]{QUALIFIED_LABEL}("[""]")*)*{WHITESPACE}?"*/"
 {
+<ST_IN_SCRIPTING>"/*"{WHITESPACE}*"@var"{WHITESPACE}("$"?){LABEL}("["({LABEL} 
| "\"" | 
"'")*"]")*{WHITESPACE}("?"?)("("?){QUALIFIED_LABEL}("[""]")*([|&]("("?){QUALIFIED_LABEL}("[""]")*(")"?))*{WHITESPACE}?"*/"
 {
     comment = yytext();
     handleVarComment();
     // if we want to handle the var comment in  ast, then return the 
T_VAR_Comment symbol
@@ -1211,7 +1211,7 @@ 
NOWDOC_CHARS=({NEWLINE}*(([^a-zA-Z_\x7f-\xff\n\r][^\n\r]*)|({LABEL}[^a-zA-Z0-9_\
     //return createFullSymbol(ASTPHP5Symbols.T_VAR_COMMENT);
 }
 
-<ST_IN_SCRIPTING>"/**"{WHITESPACE}*"@var"{WHITESPACE}("?"?){QUALIFIED_LABEL}("[""]")*([|]{QUALIFIED_LABEL}("[""]")*)*{WHITESPACE}("$"){LABEL}("["({LABEL}
 | "\"" | "'")*"]")*{WHITESPACE}?[^\n\r]*"*/" {
+<ST_IN_SCRIPTING>"/**"{WHITESPACE}*"@var"{WHITESPACE}("?"?)("("?){QUALIFIED_LABEL}("[""]")*([|&]("("?){QUALIFIED_LABEL}("[""]")*(")"?))*{WHITESPACE}("$"){LABEL}("["({LABEL}
 | "\"" | "'")*"]")*{WHITESPACE}?[^\n\r]*"*/" {
     comment = yytext();
     handleVarComment();
 }


---------------------------------------------------------------------
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