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

tmysik pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new fbeb749  [NETBEANS-1861] Recognize @method static for documenting 
static methods
     new 2b03727  Merge pull request #1466 from 
junichi11/netbeans-1861-static-magic-method
fbeb749 is described below

commit fbeb74908a0946562f7b7db5152eefbf773f88d1
Author: Junichi Yamamoto <junich...@apache.org>
AuthorDate: Tue Aug 20 12:49:48 2019 +0900

    [NETBEANS-1861] Recognize @method static for documenting static methods
    
    Example:
    ```
    /**
     * Example class.
     *
     * @method testVoid(Test $test)  test comment
     * @method int testType(Test $test)  test comment
     * @method static staticTestVoid(Test $test) test comment
     * @method static int staticTestType(Test $param1, $param2)  test comment
     * @method static ?int staticTestNullable(?string $param, int $param2) test 
comment
     * @method static ?Example getDefault() Description
     */
    class Example {
    
        public function test() {
            self::staticTestVoid($test);
            self::staticTestType($param1, $param2);
            self::staticTestNullable($param1, $param2);
            self::getDefault();
        }
    
    }
    ```
    
    - Fix DeclarationFinderImpl and PHPDocCommentParser
    - Fix MarkOccurences and GoToDeclaration features
    - Add unit tests for CC, MarkOccurences, GoToDeclaration, Navigator, 
CommentExtractor, ASTPHP5Parser, and PHPDocCommentParser
---
 php/php.editor/nbproject/project.properties        |   2 +-
 .../php/editor/csl/DeclarationFinderImpl.java      |  32 +++++--
 .../php/editor/model/impl/OccurenceBuilder.java    |   8 +-
 .../php/editor/model/nodes/ASTNodeInfoUtils.java   |  40 +++++++++
 .../model/nodes/MagicMethodDeclarationInfo.java    |  17 +++-
 .../php/editor/parser/PHPDocCommentParser.java     |  18 +++-
 .../editor/parser/astnodes/PHPDocMethodTag.java    |  31 +++++++
 .../csl/NavigatorTest/structure/magicMethods.pass  |   9 ++
 .../ASTPHP5ParserTest/parser/magicMethod01.pass    |   4 +-
 .../ASTPHP5ParserTest/parser/magicMethod02.pass    |   4 +-
 .../ASTPHP5ParserTest/parser/magicMethod03.pass    |   4 +-
 .../ASTPHP5ParserTest/parser/magicMethod04.pass    |   4 +-
 .../ASTPHP5ParserTest/parser/magicMethod05.pass    |   4 +-
 .../ASTPHP5ParserTest/parser/magicMethod06.pass    |   4 +-
 .../ASTPHP5ParserTest/parser/magicMethod07.pass    |   4 +-
 .../parser/magicMethodStatic01.pass                |  66 ++++++++++++++
 .../parser/magicMethodStatic02.pass                |  66 ++++++++++++++
 .../parser/magicMethodStatic03.pass                |  66 ++++++++++++++
 ...magicMethod04.pass => magicMethodStatic04.pass} |  50 +++++------
 .../parser/magicMethodStatic05.pass                |  82 +++++++++++++++++
 .../parser/magicMethodStatic06.pass                |  84 +++++++++++++++++
 .../parser/magicMethodStatic07.pass                | 100 +++++++++++++++++++++
 .../parser/PHPDocCommentParserTest/Method01.pass   |  22 +++++
 .../parser/PHPDocCommentParserTest/Method02.pass   |  21 +++++
 .../parser/PHPDocCommentParserTest/Method03.pass   |  22 +++++
 .../PHPDocCommentParserTest/MethodStatic01.pass    |  22 +++++
 .../PHPDocCommentParserTest/MethodStatic02.pass    |  21 +++++
 .../PHPDocCommentParserTest/MethodStatic03.pass    |  22 +++++
 .../testfiles/completion/lib/nb1861/nb1861_01.php  |  42 +++++++++
 ...861_01.php.testMagicMethodStatic_01a.completion |   8 ++
 ...861_01.php.testMagicMethodStatic_01b.completion |   8 ++
 .../testfiles/completion/lib/nb1861/nb1861_02.php  |  40 +++++++++
 ...861_02.php.testMagicMethodStatic_02a.completion |   8 ++
 ...861_02.php.testMagicMethodStatic_02b.completion |   8 ++
 .../gotodeclaration/testNb1861/testNb1861.php      |  49 ++++++++++
 .../markoccurences/testNb1861/testNb1861.php       |  49 ++++++++++
 .../data/testfiles/parser/magicMethodStatic01.php  |  26 ++++++
 .../data/testfiles/parser/magicMethodStatic02.php  |  26 ++++++
 .../data/testfiles/parser/magicMethodStatic03.php  |  26 ++++++
 .../data/testfiles/parser/magicMethodStatic04.php  |  26 ++++++
 .../data/testfiles/parser/magicMethodStatic05.php  |  26 ++++++
 .../data/testfiles/parser/magicMethodStatic06.php  |  26 ++++++
 .../data/testfiles/parser/magicMethodStatic07.php  |  26 ++++++
 .../unit/data/testfiles/structure/magicMethods.php |  40 +++++++++
 .../testNb1861.php.testNb1861_01a.occurrences      |   3 +
 .../testNb1861.php.testNb1861_01b.occurrences      |   3 +
 .../testNb1861.php.testNb1861_01c.occurrences      |   3 +
 .../testNb1861.php.testNb1861_02a.occurrences      |   3 +
 .../testNb1861.php.testNb1861_02b.occurrences      |   3 +
 .../testNb1861.php.testNb1861_02c.occurrences      |   3 +
 .../testNb1861.php.testNb1861_03a.occurrences      |   3 +
 .../testNb1861.php.testNb1861_03b.occurrences      |   3 +
 .../testNb1861.php.testNb1861_03c.occurrences      |   3 +
 .../testNb1861.php.testNb1861_04a.occurrences      |   3 +
 .../testNb1861.php.testNb1861_04b.occurrences      |   3 +
 .../testNb1861.php.testNb1861_04c.occurrences      |   3 +
 .../completion/PHPCodeCompletionNb1861Test.java    |  65 ++++++++++++++
 .../php/editor/csl/GotoDeclarationNb1861Test.java  |  61 +++++++++++++
 .../modules/php/editor/csl/NavigatorTest.java      |   4 +
 .../csl/OccurrencesFinderImplNb1861Test.java       |  76 ++++++++++++++++
 .../php/editor/parser/ASTPHP5ParserTest.java       |  29 ++++++
 .../php/editor/parser/PHPDocCommentParserTest.java |  30 +++++++
 .../modules/php/editor/parser/PrintASTVisitor.java |   2 +-
 .../parser/astnodes/CommentExtractorTest.java      |  24 +++++
 64 files changed, 1533 insertions(+), 57 deletions(-)

diff --git a/php/php.editor/nbproject/project.properties 
b/php/php.editor/nbproject/project.properties
index 534068c..73eb725 100644
--- a/php/php.editor/nbproject/project.properties
+++ b/php/php.editor/nbproject/project.properties
@@ -20,7 +20,7 @@ build.compiler=extJavac
 nbjavac.ignore.missing.enclosing=**/CUP$ASTPHP5Parser$actions.class
 javac.compilerargs=-J-Xmx512m
 nbm.needs.restart=true
-spec.version.base=1.83.0
+spec.version.base=1.84.0
 release.external/predefined_vars-1.0.zip=docs/predefined_vars.zip
 sigtest.gen.fail.on.error=false
 
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java
index 336f689..c3f0527 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/csl/DeclarationFinderImpl.java
@@ -234,7 +234,7 @@ public class DeclarationFinderImpl implements 
DeclarationFinder {
     private static class ReferenceSpanFinder {
 
         private static final int RECURSION_LIMIT = 100;
-        // e.g.  @var VarType $variable 
+        // e.g.  @var VarType $variable
         private static final Pattern INLINE_PHP_VAR_COMMENT_PATTERN = 
Pattern.compile("^[ \t]*@var[ \t]+.+[ \t]+\\$.+$"); // NOI18N
         private static final Logger LOGGER = 
Logger.getLogger(DeclarationFinderImpl.class.getName());
 
@@ -317,19 +317,20 @@ public class DeclarationFinderImpl implements 
DeclarationFinder {
                                 if (node != null) {
                                     return 
node.getRange().containsInclusive(caretOffset) ? node.getRange() : 
OffsetRange.NONE;
                                 }
+                                if (typeTag instanceof PHPDocMethodTag) {
+                                    OffsetRange magicMethodRange = 
getMagicMethodRange((PHPDocMethodTag) typeTag, caretOffset);
+                                    if (magicMethodRange != OffsetRange.NONE) {
+                                        return magicMethodRange;
+                                    }
+                                }
                             }
                         } else {
                             List<PHPDocTag> tags = docBlock.getTags();
                             for (PHPDocTag phpDocTag : tags) {
                                 if (phpDocTag instanceof PHPDocMethodTag) {
-                                    PHPDocMethodTag methodTag = 
(PHPDocMethodTag) phpDocTag;
-                                    MagicMethodDeclarationInfo methodInfo = 
MagicMethodDeclarationInfo.create(methodTag);
-                                    if (methodInfo != null) {
-                                        if 
(methodInfo.getRange().containsInclusive(caretOffset)) {
-                                            return methodInfo.getRange();
-                                        } else if 
(methodInfo.getTypeRange().containsInclusive(caretOffset)) {
-                                            return methodInfo.getTypeRange();
-                                        }
+                                    OffsetRange magicMethodRange = 
getMagicMethodRange((PHPDocMethodTag) phpDocTag, caretOffset);
+                                    if (magicMethodRange != OffsetRange.NONE) {
+                                        return magicMethodRange;
                                     }
                                 }
                             }
@@ -356,6 +357,19 @@ public class DeclarationFinderImpl implements 
DeclarationFinder {
             return OffsetRange.NONE;
         }
 
+        private OffsetRange getMagicMethodRange(PHPDocMethodTag methodTag, 
final int caretOffset) {
+            OffsetRange offsetRange = OffsetRange.NONE;
+            MagicMethodDeclarationInfo methodInfo = 
MagicMethodDeclarationInfo.create(methodTag);
+            if (methodInfo != null) {
+                if (methodInfo.getRange().containsInclusive(caretOffset)) {
+                    offsetRange = methodInfo.getRange();
+                } else if 
(methodInfo.getTypeRange().containsInclusive(caretOffset)) {
+                    offsetRange = methodInfo.getTypeRange();
+                }
+            }
+            return offsetRange;
+        }
+
         @CheckForNull
         private OffsetRange getVarCommentOffsetRange(TokenSequence<PHPTokenId> 
ts, String text, int caretOffset) {
             final String dollaredVar = "@var"; // NOI18N
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java
index 781365c..4d7cc51 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/OccurenceBuilder.java
@@ -72,6 +72,7 @@ import org.netbeans.modules.php.editor.model.VariableName;
 import org.netbeans.modules.php.editor.model.VariableScope;
 import org.netbeans.modules.php.editor.model.nodes.ASTNodeInfo;
 import org.netbeans.modules.php.editor.model.nodes.ASTNodeInfo.Kind;
+import org.netbeans.modules.php.editor.model.nodes.ASTNodeInfoUtils;
 import 
org.netbeans.modules.php.editor.model.nodes.ClassConstantDeclarationInfo;
 import org.netbeans.modules.php.editor.model.nodes.ClassDeclarationInfo;
 import org.netbeans.modules.php.editor.model.nodes.ConstantDeclarationInfo;
@@ -100,6 +101,7 @@ import 
org.netbeans.modules.php.editor.parser.astnodes.InterfaceDeclaration;
 import org.netbeans.modules.php.editor.parser.astnodes.MethodDeclaration;
 import org.netbeans.modules.php.editor.parser.astnodes.MethodInvocation;
 import org.netbeans.modules.php.editor.parser.astnodes.NamespaceName;
+import org.netbeans.modules.php.editor.parser.astnodes.PHPDocMethodTag;
 import org.netbeans.modules.php.editor.parser.astnodes.PHPDocTypeTag;
 import org.netbeans.modules.php.editor.parser.astnodes.Scalar;
 import org.netbeans.modules.php.editor.parser.astnodes.SingleFieldDeclaration;
@@ -460,7 +462,7 @@ class OccurenceBuilder {
 
     void prepare(final MagicMethodDeclarationInfo node, MethodScope scope) {
         if (canBePrepared(node.getOriginalNode(), scope)) {
-            if (node.getKind().equals(Kind.METHOD)) {
+            if (ASTNodeInfoUtils.isMethod(node.getKind())) {
                 magicMethodDeclarations.put(node, scope);
             }
         }
@@ -998,6 +1000,7 @@ class OccurenceBuilder {
                     buildMethodInvocations(elementInfo, fileScope, 
Accuracy.UNIQUE, occurences);
                 }
                 buildMethodDeclarations(elementInfo, fileScope, occurences);
+                buildMagicMethodDeclarations(elementInfo, fileScope, 
cachedOccurences);
             }
         }
     }
@@ -2461,7 +2464,8 @@ class OccurenceBuilder {
                 } else {
                     if (getScope().getInScope() instanceof TypeScope) {
                         if (originalNode instanceof MethodDeclaration
-                                || originalNode instanceof 
SingleFieldDeclaration) {
+                                || originalNode instanceof 
SingleFieldDeclaration
+                                || originalNode instanceof PHPDocMethodTag) { 
// NETBEANS-1861
                             return ((TypeScope) 
getScope().getInScope()).getFullyQualifiedName();
                         }
                     }
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/nodes/ASTNodeInfoUtils.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/nodes/ASTNodeInfoUtils.java
new file mode 100644
index 0000000..8872a76
--- /dev/null
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/nodes/ASTNodeInfoUtils.java
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+package org.netbeans.modules.php.editor.model.nodes;
+
+import org.netbeans.modules.php.editor.model.nodes.ASTNodeInfo.Kind;
+import static 
org.netbeans.modules.php.editor.model.nodes.ASTNodeInfo.Kind.METHOD;
+import static 
org.netbeans.modules.php.editor.model.nodes.ASTNodeInfo.Kind.STATIC_METHOD;
+
+public final class ASTNodeInfoUtils {
+
+    private ASTNodeInfoUtils() {
+    }
+
+    /**
+     * Check whether the kind is METHOD or STATIC_METHOD.
+     *
+     * @param kind the kind
+     * @return {@code true} if this is METHOD or STATIC_METHOD, {@code false}
+     * otherwise
+     */
+    public static boolean isMethod(Kind kind) {
+        return kind == METHOD || kind == STATIC_METHOD;
+    }
+}
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/nodes/MagicMethodDeclarationInfo.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/nodes/MagicMethodDeclarationInfo.java
index aaa6d04..31e3c90 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/model/nodes/MagicMethodDeclarationInfo.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/model/nodes/MagicMethodDeclarationInfo.java
@@ -20,6 +20,7 @@
 package org.netbeans.modules.php.editor.model.nodes;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
@@ -51,10 +52,21 @@ public class MagicMethodDeclarationInfo extends 
ASTNodeInfo<PHPDocMethodTag> {
     private String methodName;
     private int offset;
     private int typeOffset;
+    private final boolean isStatic;
 
     MagicMethodDeclarationInfo(PHPDocMethodTag node) {
         super(node);
+        // @method int get(Type $object) message
+        // @method static int staticGet(Type $object) message
         String[] parts = node.getValue().trim().split("\\s+", 3); //NOI18N
+        isStatic = parts.length >= 1 && parts[0].equals("static"); // NOI18N 
NETBEANS-1861
+        // the method is already checked whether it is static when 
PHPDocMethodTag is created
+        // So, they should be the same result
+        // see: PHPDocCommentParser.createTag()
+        assert isStatic == node.isStatic() : "PHPDocMethodTag static: " + 
node.isStatic(); // NOI18N
+        if (isStatic) {
+            parts = Arrays.copyOfRange(parts, 1, parts.length);
+        }
         if (parts.length == 1 || (parts.length > 0 && 
parts[0].trim().indexOf("(") > 0)) { //NOI18N
             // expect that the type is void
             returnType = Type.VOID;
@@ -137,7 +149,7 @@ public class MagicMethodDeclarationInfo extends 
ASTNodeInfo<PHPDocMethodTag> {
 
     @Override
     public Kind getKind() {
-        return Kind.METHOD;
+        return isStatic ? Kind.STATIC_METHOD : Kind.METHOD;
     }
 
     @Override
@@ -168,6 +180,7 @@ public class MagicMethodDeclarationInfo extends 
ASTNodeInfo<PHPDocMethodTag> {
     }
 
     public PhpModifiers getAccessModifiers() {
-        return PhpModifiers.fromBitMask(PhpModifiers.PUBLIC);
+        int modifiers = isStatic ? (PhpModifiers.PUBLIC | PhpModifiers.STATIC) 
: PhpModifiers.PUBLIC;
+        return PhpModifiers.fromBitMask(modifiers);
     }
 }
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java
index 758e83e..f55574e 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java
@@ -29,6 +29,7 @@ import java.util.regex.Pattern;
 import org.netbeans.modules.csl.api.OffsetRange;
 import org.netbeans.modules.php.api.annotation.PhpAnnotations;
 import org.netbeans.modules.php.api.util.StringUtils;
+import org.netbeans.modules.php.editor.model.impl.Type;
 import org.netbeans.modules.php.editor.parser.astnodes.PHPDocBlock;
 import org.netbeans.modules.php.editor.parser.astnodes.PHPDocMethodTag;
 import org.netbeans.modules.php.editor.parser.astnodes.PHPDocNode;
@@ -221,13 +222,14 @@ public class PHPDocCommentParser {
             } else if (type.equals(PHPDocTag.Type.METHOD)) {
                 String name = getMethodName(description);
                 if (name != null) {
+                    boolean isStatic = 
description.trim().startsWith("static"); // NOI18N
                     int startOfVariable = findStartOfDocNode(originalComment, 
originalCommentStart, name, start);
                     if (startOfVariable != -1) {
                         PHPDocNode methodNode = new 
PHPDocNode(startOfVariable, startOfVariable + name.length(), name);
                         int startOfDescription = 
findStartOfDocNode(originalComment, originalCommentStart, description, start);
                         if (startOfDescription != -1) {
                             List<PHPDocVarTypeTag> params = 
findMethodParams(description, startOfDescription);
-                            return new PHPDocMethodTag(start, end, type, 
docTypes, methodNode, params, description);
+                            return new PHPDocMethodTag(start, end, type, 
docTypes, methodNode, params, description, isStatic);
                         }
                     }
                 }
@@ -287,6 +289,9 @@ public class PHPDocCommentParser {
 
     private List<String> getTypes(String description, boolean isReturnTag) {
         String[] tokens = description.trim().split("[ ]+"); //NOI18N
+        if (tokens.length > 0 && tokens[0].equals("static")) { // NOI18N
+            tokens = Arrays.copyOfRange(tokens, 1, tokens.length);
+        }
         ArrayList<String> types = new ArrayList<>();
         if (tokens.length > 0 && (isReturnTag || !tokens[0].startsWith("$"))) 
{ //NOI18N
             if (tokens[0].indexOf('|') > -1) {
@@ -294,6 +299,11 @@ public class PHPDocCommentParser {
                 for (String ttoken : ttokens) {
                     types.add(ttoken.trim());
                 }
+            } else if (tokens[0].indexOf('(') > 0) {
+                // e.g. @method getSomething(int $i)
+                // NOTE: add void type but it is not shown as a return type in 
doc popup
+                // because it doesn't exist
+                types.add(Type.VOID);
             } else {
                 types.add(tokens[0].trim());
             }
@@ -326,7 +336,11 @@ public class PHPDocCommentParser {
         } else {
             // probably defined without () after the name
             // then we expect that the name is after the first space
-            String[] tokens = description.trim().split("[ \n\t]+"); //NOI18N
+            String desc = description.trim();
+            if (desc.startsWith("static ")) { // NOI18N
+                desc = desc.substring("static ".length()); // NOI18N
+            }
+            String[] tokens = desc.trim().split("[ \n\t]+"); //NOI18N
             if (tokens.length > 1) {
                 name = tokens[1];
             }
diff --git 
a/php/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPDocMethodTag.java
 
b/php/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPDocMethodTag.java
index ed9d4c5..f1e0f47 100644
--- 
a/php/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPDocMethodTag.java
+++ 
b/php/php.editor/src/org/netbeans/modules/php/editor/parser/astnodes/PHPDocMethodTag.java
@@ -29,13 +29,44 @@ public class PHPDocMethodTag extends PHPDocTypeTag {
 
     private final List<PHPDocVarTypeTag> params;
     private final PHPDocNode name;
+    private final boolean isStatic;
 
     public PHPDocMethodTag(int start, int end, AnnotationParsedLine kind,
             List<PHPDocTypeNode> returnTypes, PHPDocNode methodName,
             List<PHPDocVarTypeTag> parameters, String documentation) {
+        this(start, end, kind, returnTypes, methodName, parameters, 
documentation, false);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param start start offset
+     * @param end end offset
+     * @param kind parsed annotation line
+     * @param returnTypes return types
+     * @param methodName method name
+     * @param parameters parameters
+     * @param documentation documentation
+     * @param isStatic static flag
+     * @since 1.84.0
+     */
+    public PHPDocMethodTag(int start, int end, AnnotationParsedLine kind,
+            List<PHPDocTypeNode> returnTypes, PHPDocNode methodName,
+            List<PHPDocVarTypeTag> parameters, String documentation, boolean 
isStatic) {
         super(start, end, kind, documentation, returnTypes);
         this.params = parameters;
         this.name = methodName;
+        this.isStatic = isStatic;
+    }
+
+    /**
+     * Check whethere the method is static.
+     *
+     * @return {@code true} if the method is static, {@code false} otherwise
+     * @since 1.84.0
+     */
+    public boolean isStatic() {
+        return isStatic;
     }
 
     public PHPDocNode getMethodName() {
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorTest/structure/magicMethods.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorTest/structure/magicMethods.pass
new file mode 100644
index 0000000..47efe0c
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorTest/structure/magicMethods.pass
@@ -0,0 +1,9 @@
+|-Example [1215, 1317] : ESCAPED{Example}
+|--testVoid [852, 860] : ESCAPED{testVoid}ESCAPED{(}<font 
color="#999999">ESCAPED{Test}ESCAPED{ }</font>ESCAPED{$test}ESCAPED{)}<font 
color="#999999">:ESCAPED{void}</font>
+|--testType [902, 910] : ESCAPED{testType}ESCAPED{(}<font 
color="#999999">ESCAPED{Test}ESCAPED{ }</font>ESCAPED{$test}ESCAPED{)}<font 
color="#999999">:ESCAPED{int}</font>
+|--staticTestVoid [955, 969] : ESCAPED{staticTestVoid}ESCAPED{(}<font 
color="#999999">ESCAPED{Test}ESCAPED{ }</font>ESCAPED{$test}ESCAPED{)}<font 
color="#999999">:ESCAPED{void}</font>
+|--staticTestType [1017, 1031] : ESCAPED{staticTestType}ESCAPED{(}<font 
color="#999999">ESCAPED{Test}ESCAPED{ }</font>ESCAPED{$param1}ESCAPED{, 
}ESCAPED{$param2}ESCAPED{)}<font color="#999999">:ESCAPED{int}</font>
+|--staticTestNullable [1092, 1110] : 
ESCAPED{staticTestNullable}ESCAPED{(}<font 
color="#999999">ESCAPED{?}ESCAPED{string}ESCAPED{ 
}</font>ESCAPED{$param}ESCAPED{, }<font color="#999999">ESCAPED{int}ESCAPED{ 
}</font>ESCAPED{$param2}ESCAPED{)}<font 
color="#999999">:ESCAPED{?}ESCAPED{int}</font>
+|--getDefault [1180, 1190] : ESCAPED{getDefault}ESCAPED{(}ESCAPED{)}<font 
color="#999999">:ESCAPED{?}ESCAPED{\Example}</font>
+|--test [1246, 1260] : ESCAPED{test}ESCAPED{(}ESCAPED{)}
+|--staticTest [1289, 1314] : ESCAPED{staticTest}ESCAPED{(}ESCAPED{)}<font 
color="#999999">:ESCAPED{int}</font>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod01.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod01.pass
index 10b1022..4c68b3a 100644
--- 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod01.pass
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod01.pass
@@ -23,7 +23,7 @@
         <Comments>
             <PHPDocBlock start='10' end='31'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='27' kind='method'>
+                    <PHPDocMethodTag start='14' end='27' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
@@ -37,7 +37,7 @@
             </PHPDocBlock>
             <PHPDocBlock start='10' end='31'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='27' kind='method'>
+                    <PHPDocMethodTag start='14' end='27' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod02.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod02.pass
index b241137..e1721bf 100644
--- 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod02.pass
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod02.pass
@@ -23,7 +23,7 @@
         <Comments>
             <PHPDocBlock start='10' end='33'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='29' kind='method'>
+                    <PHPDocMethodTag start='14' end='29' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
@@ -37,7 +37,7 @@
             </PHPDocBlock>
             <PHPDocBlock start='10' end='33'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='29' kind='method'>
+                    <PHPDocMethodTag start='14' end='29' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod03.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod03.pass
index c3bb5a4..1fdf9a5 100644
--- 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod03.pass
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod03.pass
@@ -23,7 +23,7 @@
         <Comments>
             <PHPDocBlock start='10' end='50'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='46' kind='method'>
+                    <PHPDocMethodTag start='14' end='46' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
@@ -37,7 +37,7 @@
             </PHPDocBlock>
             <PHPDocBlock start='10' end='50'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='46' kind='method'>
+                    <PHPDocMethodTag start='14' end='46' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod04.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod04.pass
index 140bbaa..11ba3c7 100644
--- 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod04.pass
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod04.pass
@@ -23,7 +23,7 @@
         <Comments>
             <PHPDocBlock start='10' end='57'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='53' kind='method'>
+                    <PHPDocMethodTag start='14' end='53' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
@@ -44,7 +44,7 @@
             </PHPDocBlock>
             <PHPDocBlock start='10' end='57'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='53' kind='method'>
+                    <PHPDocMethodTag start='14' end='53' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod05.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod05.pass
index e5285a8..11ae3e1 100644
--- 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod05.pass
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod05.pass
@@ -23,7 +23,7 @@
         <Comments>
             <PHPDocBlock start='10' end='64'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='60' kind='method'>
+                    <PHPDocMethodTag start='14' end='60' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
@@ -45,7 +45,7 @@
             </PHPDocBlock>
             <PHPDocBlock start='10' end='64'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='60' kind='method'>
+                    <PHPDocMethodTag start='14' end='60' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod06.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod06.pass
index 59f28e5..db71656 100644
--- 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod06.pass
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod06.pass
@@ -23,7 +23,7 @@
         <Comments>
             <PHPDocBlock start='10' end='66'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='62' kind='method'>
+                    <PHPDocMethodTag start='14' end='62' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
@@ -46,7 +46,7 @@
             </PHPDocBlock>
             <PHPDocBlock start='10' end='66'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='62' kind='method'>
+                    <PHPDocMethodTag start='14' end='62' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod07.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod07.pass
index f93cf22..58e56c5 100644
--- 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod07.pass
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod07.pass
@@ -23,7 +23,7 @@
         <Comments>
             <PHPDocBlock start='10' end='78'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='74' kind='method'>
+                    <PHPDocMethodTag start='14' end='74' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
@@ -54,7 +54,7 @@
             </PHPDocBlock>
             <PHPDocBlock start='10' end='78'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='74' kind='method'>
+                    <PHPDocMethodTag start='14' end='74' kind='method' 
isStatic='false'>
                         <Name>
                             <PHPDocNode start='24' end='26' value='m1'/>
                         </Name>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic01.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic01.pass
new file mode 100644
index 0000000..7e0a68e
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic01.pass
@@ -0,0 +1,66 @@
+<testresult testFile='magicMethodStatic01.php'>
+    <scanner>
+        <token id='T_CLASS' start='847' end='852'>
+            <text>class</text>
+        </token>
+        <token id='T_STRING' start='853' end='854'>
+            <text>A</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='855' end='856'>
+            <text>{</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='862' end='863'>
+            <text>}</text>
+        </token>
+        <token id='EOF' start='864' end='864'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='864'>
+        <Comments>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='846'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='842' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='846'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='842' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+        </Comments>
+        <Statements>
+            <ClassDeclaration start='847' end='863' modifier='NONE'>
+                <ClassName>
+                    <Identifier start='853' end='854' name='A'/>
+                </ClassName>
+                <SuperClassName>
+                </SuperClassName>
+                <Interfaces>
+                </Interfaces>
+                <Block start='855' end='863' isCurly='true'>
+                </Block>
+            </ClassDeclaration>
+        </Statements>
+    </Program>
+</testresult>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic02.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic02.pass
new file mode 100644
index 0000000..a903d1d
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic02.pass
@@ -0,0 +1,66 @@
+<testresult testFile='magicMethodStatic02.php'>
+    <scanner>
+        <token id='T_CLASS' start='849' end='854'>
+            <text>class</text>
+        </token>
+        <token id='T_STRING' start='855' end='856'>
+            <text>A</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='857' end='858'>
+            <text>{</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='864' end='865'>
+            <text>}</text>
+        </token>
+        <token id='EOF' start='866' end='866'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='866'>
+        <Comments>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='848'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='844' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='848'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='844' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+        </Comments>
+        <Statements>
+            <ClassDeclaration start='849' end='865' modifier='NONE'>
+                <ClassName>
+                    <Identifier start='855' end='856' name='A'/>
+                </ClassName>
+                <SuperClassName>
+                </SuperClassName>
+                <Interfaces>
+                </Interfaces>
+                <Block start='857' end='865' isCurly='true'>
+                </Block>
+            </ClassDeclaration>
+        </Statements>
+    </Program>
+</testresult>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic03.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic03.pass
new file mode 100644
index 0000000..e498a2e
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic03.pass
@@ -0,0 +1,66 @@
+<testresult testFile='magicMethodStatic03.php'>
+    <scanner>
+        <token id='T_CLASS' start='866' end='871'>
+            <text>class</text>
+        </token>
+        <token id='T_STRING' start='872' end='873'>
+            <text>A</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='874' end='875'>
+            <text>{</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='881' end='882'>
+            <text>}</text>
+        </token>
+        <token id='EOF' start='883' end='883'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='883'>
+        <Comments>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='865'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='861' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='865'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='861' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+        </Comments>
+        <Statements>
+            <ClassDeclaration start='866' end='882' modifier='NONE'>
+                <ClassName>
+                    <Identifier start='872' end='873' name='A'/>
+                </ClassName>
+                <SuperClassName>
+                </SuperClassName>
+                <Interfaces>
+                </Interfaces>
+                <Block start='874' end='882' isCurly='true'>
+                </Block>
+            </ClassDeclaration>
+        </Statements>
+    </Program>
+</testresult>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod04.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic04.pass
similarity index 51%
copy from 
php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod04.pass
copy to 
php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic04.pass
index 140bbaa..44bcaf6 100644
--- 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethod04.pass
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic04.pass
@@ -1,39 +1,37 @@
-<testresult testFile='magicMethod04.php'>
+<testresult testFile='magicMethodStatic04.php'>
     <scanner>
-        <token id='T_CLASS' start='58' end='63'>
+        <token id='T_CLASS' start='873' end='878'>
             <text>class</text>
         </token>
-        <token id='T_STRING' start='64' end='65'>
+        <token id='T_STRING' start='879' end='880'>
             <text>A</text>
         </token>
-        <token id='T_CURLY_OPEN' start='66' end='67'>
+        <token id='T_CURLY_OPEN' start='881' end='882'>
             <text>{</text>
         </token>
-        <token id='T_CURLY_CLOSE' start='73' end='74'>
+        <token id='T_CURLY_CLOSE' start='888' end='889'>
             <text>}</text>
         </token>
-        <token id='T_SEMICOLON' start='75' end='78'>
-            <text>?&gt;\n</text>
-        </token>
-        <token id='EOF' start='78' end='78'>
+        <token id='EOF' start='890' end='890'>
             <text></text>
         </token>
     </scanner>
-    <Program start='0' end='77'>
+    <Program start='0' end='890'>
         <Comments>
-            <PHPDocBlock start='10' end='57'>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='872'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='53' kind='method'>
+                    <PHPDocMethodTag start='822' end='868' kind='method' 
isStatic='true'>
                         <Name>
-                            <PHPDocNode start='24' end='26' value='m1'/>
+                            <PHPDocNode start='839' end='841' value='m1'/>
                         </Name>
                         <Return Types>
-                            <PHPDocTypeNode start='22' end='23' value='A' 
isArray='false'/>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
                         </Return Types>
                         <Parameters>
-                            <PHPDocVarTypeTag start='27' end='34' kind='param'>
+                            <PHPDocVarTypeTag start='842' end='849' 
kind='param'>
                                 <Variable>
-                                    <PHPDocNode start='27' end='34' 
value='$param1'/>
+                                    <PHPDocNode start='842' end='849' 
value='$param1'/>
                                 </Variable>
                                 <Types>
                                 </Types>
@@ -42,19 +40,20 @@
                     </PHPDocMethodTag>
                 </Tags>
             </PHPDocBlock>
-            <PHPDocBlock start='10' end='57'>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='872'>
                 <Tags>
-                    <PHPDocMethodTag start='14' end='53' kind='method'>
+                    <PHPDocMethodTag start='822' end='868' kind='method' 
isStatic='true'>
                         <Name>
-                            <PHPDocNode start='24' end='26' value='m1'/>
+                            <PHPDocNode start='839' end='841' value='m1'/>
                         </Name>
                         <Return Types>
-                            <PHPDocTypeNode start='22' end='23' value='A' 
isArray='false'/>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
                         </Return Types>
                         <Parameters>
-                            <PHPDocVarTypeTag start='27' end='34' kind='param'>
+                            <PHPDocVarTypeTag start='842' end='849' 
kind='param'>
                                 <Variable>
-                                    <PHPDocNode start='27' end='34' 
value='$param1'/>
+                                    <PHPDocNode start='842' end='849' 
value='$param1'/>
                                 </Variable>
                                 <Types>
                                 </Types>
@@ -65,18 +64,17 @@
             </PHPDocBlock>
         </Comments>
         <Statements>
-            <ClassDeclaration start='58' end='74' modifier='NONE'>
+            <ClassDeclaration start='873' end='889' modifier='NONE'>
                 <ClassName>
-                    <Identifier start='64' end='65' name='A'/>
+                    <Identifier start='879' end='880' name='A'/>
                 </ClassName>
                 <SuperClassName>
                 </SuperClassName>
                 <Interfaces>
                 </Interfaces>
-                <Block start='66' end='74' isCurly='true'>
+                <Block start='881' end='889' isCurly='true'>
                 </Block>
             </ClassDeclaration>
-            <EmptyStatement start='75' end='77'/>
         </Statements>
     </Program>
 </testresult>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic05.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic05.pass
new file mode 100644
index 0000000..c05e7ab
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic05.pass
@@ -0,0 +1,82 @@
+<testresult testFile='magicMethodStatic05.php'>
+    <scanner>
+        <token id='T_CLASS' start='880' end='885'>
+            <text>class</text>
+        </token>
+        <token id='T_STRING' start='886' end='887'>
+            <text>A</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='888' end='889'>
+            <text>{</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='895' end='896'>
+            <text>}</text>
+        </token>
+        <token id='EOF' start='897' end='897'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='897'>
+        <Comments>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='879'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='875' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                            <PHPDocVarTypeTag start='842' end='856' 
kind='param'>
+                                <Variable>
+                                    <PHPDocNode start='849' end='856' 
value='$param1'/>
+                                </Variable>
+                                <Types>
+                                    <PHPDocTypeNode start='842' end='848' 
value='string' isArray='false'/>
+                                </Types>
+                            </PHPDocVarTypeTag>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='879'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='875' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                            <PHPDocVarTypeTag start='842' end='856' 
kind='param'>
+                                <Variable>
+                                    <PHPDocNode start='849' end='856' 
value='$param1'/>
+                                </Variable>
+                                <Types>
+                                    <PHPDocTypeNode start='842' end='848' 
value='string' isArray='false'/>
+                                </Types>
+                            </PHPDocVarTypeTag>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+        </Comments>
+        <Statements>
+            <ClassDeclaration start='880' end='896' modifier='NONE'>
+                <ClassName>
+                    <Identifier start='886' end='887' name='A'/>
+                </ClassName>
+                <SuperClassName>
+                </SuperClassName>
+                <Interfaces>
+                </Interfaces>
+                <Block start='888' end='896' isCurly='true'>
+                </Block>
+            </ClassDeclaration>
+        </Statements>
+    </Program>
+</testresult>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic06.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic06.pass
new file mode 100644
index 0000000..8efa341
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic06.pass
@@ -0,0 +1,84 @@
+<testresult testFile='magicMethodStatic06.php'>
+    <scanner>
+        <token id='T_CLASS' start='882' end='887'>
+            <text>class</text>
+        </token>
+        <token id='T_STRING' start='888' end='889'>
+            <text>A</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='890' end='891'>
+            <text>{</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='897' end='898'>
+            <text>}</text>
+        </token>
+        <token id='EOF' start='899' end='899'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='899'>
+        <Comments>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='881'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='877' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                            <PHPDocVarTypeTag start='842' end='858' 
kind='param'>
+                                <Variable>
+                                    <PHPDocNode start='851' end='858' 
value='$param1'/>
+                                </Variable>
+                                <Types>
+                                    <PHPDocTypeNode start='842' end='848' 
value='string' isArray='false'/>
+                                    <PHPDocTypeNode start='849' end='850' 
value='A' isArray='false'/>
+                                </Types>
+                            </PHPDocVarTypeTag>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='881'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='877' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                            <PHPDocVarTypeTag start='842' end='858' 
kind='param'>
+                                <Variable>
+                                    <PHPDocNode start='851' end='858' 
value='$param1'/>
+                                </Variable>
+                                <Types>
+                                    <PHPDocTypeNode start='842' end='848' 
value='string' isArray='false'/>
+                                    <PHPDocTypeNode start='849' end='850' 
value='A' isArray='false'/>
+                                </Types>
+                            </PHPDocVarTypeTag>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+        </Comments>
+        <Statements>
+            <ClassDeclaration start='882' end='898' modifier='NONE'>
+                <ClassName>
+                    <Identifier start='888' end='889' name='A'/>
+                </ClassName>
+                <SuperClassName>
+                </SuperClassName>
+                <Interfaces>
+                </Interfaces>
+                <Block start='890' end='898' isCurly='true'>
+                </Block>
+            </ClassDeclaration>
+        </Statements>
+    </Program>
+</testresult>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic07.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic07.pass
new file mode 100644
index 0000000..ce3d19c
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest/parser/magicMethodStatic07.pass
@@ -0,0 +1,100 @@
+<testresult testFile='magicMethodStatic07.php'>
+    <scanner>
+        <token id='T_CLASS' start='894' end='899'>
+            <text>class</text>
+        </token>
+        <token id='T_STRING' start='900' end='901'>
+            <text>A</text>
+        </token>
+        <token id='T_CURLY_OPEN' start='902' end='903'>
+            <text>{</text>
+        </token>
+        <token id='T_CURLY_CLOSE' start='909' end='910'>
+            <text>}</text>
+        </token>
+        <token id='EOF' start='911' end='911'>
+            <text></text>
+        </token>
+    </scanner>
+    <Program start='0' end='911'>
+        <Comments>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='893'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='889' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                            <PHPDocVarTypeTag start='847' end='863' 
kind='param'>
+                                <Variable>
+                                    <PHPDocNode start='856' end='863' 
value='$param1'/>
+                                </Variable>
+                                <Types>
+                                    <PHPDocTypeNode start='847' end='853' 
value='string' isArray='false'/>
+                                    <PHPDocTypeNode start='854' end='855' 
value='A' isArray='false'/>
+                                </Types>
+                            </PHPDocVarTypeTag>
+                            <PHPDocVarTypeTag start='864' end='870' 
kind='param'>
+                                <Variable>
+                                    <PHPDocNode start='867' end='870' 
value='$p2'/>
+                                </Variable>
+                                <Types>
+                                    <PHPDocTypeNode start='865' end='866' 
value='A' isArray='false'/>
+                                </Types>
+                            </PHPDocVarTypeTag>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+            <Comment start='6' end='813' commentType='multiLine'/>
+            <PHPDocBlock start='818' end='893'>
+                <Tags>
+                    <PHPDocMethodTag start='822' end='889' kind='method' 
isStatic='true'>
+                        <Name>
+                            <PHPDocNode start='839' end='841' value='m1'/>
+                        </Name>
+                        <Return Types>
+                            <PHPDocTypeNode start='837' end='838' value='A' 
isArray='false'/>
+                        </Return Types>
+                        <Parameters>
+                            <PHPDocVarTypeTag start='847' end='863' 
kind='param'>
+                                <Variable>
+                                    <PHPDocNode start='856' end='863' 
value='$param1'/>
+                                </Variable>
+                                <Types>
+                                    <PHPDocTypeNode start='847' end='853' 
value='string' isArray='false'/>
+                                    <PHPDocTypeNode start='854' end='855' 
value='A' isArray='false'/>
+                                </Types>
+                            </PHPDocVarTypeTag>
+                            <PHPDocVarTypeTag start='864' end='870' 
kind='param'>
+                                <Variable>
+                                    <PHPDocNode start='867' end='870' 
value='$p2'/>
+                                </Variable>
+                                <Types>
+                                    <PHPDocTypeNode start='865' end='866' 
value='A' isArray='false'/>
+                                </Types>
+                            </PHPDocVarTypeTag>
+                        </Parameters>
+                    </PHPDocMethodTag>
+                </Tags>
+            </PHPDocBlock>
+        </Comments>
+        <Statements>
+            <ClassDeclaration start='894' end='910' modifier='NONE'>
+                <ClassName>
+                    <Identifier start='900' end='901' name='A'/>
+                </ClassName>
+                <SuperClassName>
+                </SuperClassName>
+                <Interfaces>
+                </Interfaces>
+                <Block start='902' end='910' isCurly='true'>
+                </Block>
+            </ClassDeclaration>
+        </Statements>
+    </Program>
+</testresult>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method01.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method01.pass
new file mode 100644
index 0000000..91c49c3
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method01.pass
@@ -0,0 +1,22 @@
+<PHPDocBlock start='3' end='42'>
+    <Tags>
+        <PHPDocMethodTag start='3' end='45' kind='method' isStatic='false'>
+            <Name>
+                <PHPDocNode start='18' end='21' value='get'/>
+            </Name>
+            <Return Types>
+                <PHPDocTypeNode start='14' end='17' value='int' 
isArray='false'/>
+            </Return Types>
+            <Parameters>
+                <PHPDocVarTypeTag start='22' end='28' kind='param'>
+                    <Variable>
+                        <PHPDocNode start='26' end='28' value='$i'/>
+                    </Variable>
+                    <Types>
+                        <PHPDocTypeNode start='22' end='25' value='int' 
isArray='false'/>
+                    </Types>
+                </PHPDocVarTypeTag>
+            </Parameters>
+        </PHPDocMethodTag>
+    </Tags>
+</PHPDocBlock>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method02.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method02.pass
new file mode 100644
index 0000000..2e5bfb8
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method02.pass
@@ -0,0 +1,21 @@
+<PHPDocBlock start='3' end='38'>
+    <Tags>
+        <PHPDocMethodTag start='3' end='41' kind='method' isStatic='false'>
+            <Name>
+                <PHPDocNode start='14' end='17' value='get'/>
+            </Name>
+            <Return Types>
+            </Return Types>
+            <Parameters>
+                <PHPDocVarTypeTag start='18' end='24' kind='param'>
+                    <Variable>
+                        <PHPDocNode start='22' end='24' value='$i'/>
+                    </Variable>
+                    <Types>
+                        <PHPDocTypeNode start='18' end='21' value='int' 
isArray='false'/>
+                    </Types>
+                </PHPDocVarTypeTag>
+            </Parameters>
+        </PHPDocMethodTag>
+    </Tags>
+</PHPDocBlock>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method03.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method03.pass
new file mode 100644
index 0000000..ef84f21
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/Method03.pass
@@ -0,0 +1,22 @@
+<PHPDocBlock start='3' end='44'>
+    <Tags>
+        <PHPDocMethodTag start='3' end='47' kind='method' isStatic='false'>
+            <Name>
+                <PHPDocNode start='19' end='22' value='get'/>
+            </Name>
+            <Return Types>
+                <PHPDocTypeNode start='14' end='18' value='?int' 
isArray='false'/>
+            </Return Types>
+            <Parameters>
+                <PHPDocVarTypeTag start='23' end='30' kind='param'>
+                    <Variable>
+                        <PHPDocNode start='28' end='30' value='$i'/>
+                    </Variable>
+                    <Types>
+                        <PHPDocTypeNode start='23' end='27' value='?int' 
isArray='false'/>
+                    </Types>
+                </PHPDocVarTypeTag>
+            </Parameters>
+        </PHPDocMethodTag>
+    </Tags>
+</PHPDocBlock>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic01.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic01.pass
new file mode 100644
index 0000000..fdbb2e3
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic01.pass
@@ -0,0 +1,22 @@
+<PHPDocBlock start='3' end='49'>
+    <Tags>
+        <PHPDocMethodTag start='3' end='52' kind='method' isStatic='true'>
+            <Name>
+                <PHPDocNode start='25' end='28' value='get'/>
+            </Name>
+            <Return Types>
+                <PHPDocTypeNode start='21' end='24' value='int' 
isArray='false'/>
+            </Return Types>
+            <Parameters>
+                <PHPDocVarTypeTag start='29' end='35' kind='param'>
+                    <Variable>
+                        <PHPDocNode start='33' end='35' value='$i'/>
+                    </Variable>
+                    <Types>
+                        <PHPDocTypeNode start='29' end='32' value='int' 
isArray='false'/>
+                    </Types>
+                </PHPDocVarTypeTag>
+            </Parameters>
+        </PHPDocMethodTag>
+    </Tags>
+</PHPDocBlock>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic02.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic02.pass
new file mode 100644
index 0000000..ac30499
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic02.pass
@@ -0,0 +1,21 @@
+<PHPDocBlock start='3' end='45'>
+    <Tags>
+        <PHPDocMethodTag start='3' end='48' kind='method' isStatic='true'>
+            <Name>
+                <PHPDocNode start='21' end='24' value='get'/>
+            </Name>
+            <Return Types>
+            </Return Types>
+            <Parameters>
+                <PHPDocVarTypeTag start='25' end='31' kind='param'>
+                    <Variable>
+                        <PHPDocNode start='29' end='31' value='$i'/>
+                    </Variable>
+                    <Types>
+                        <PHPDocTypeNode start='25' end='28' value='int' 
isArray='false'/>
+                    </Types>
+                </PHPDocVarTypeTag>
+            </Parameters>
+        </PHPDocMethodTag>
+    </Tags>
+</PHPDocBlock>
diff --git 
a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic03.pass
 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic03.pass
new file mode 100644
index 0000000..c2def1d
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/MethodStatic03.pass
@@ -0,0 +1,22 @@
+<PHPDocBlock start='3' end='51'>
+    <Tags>
+        <PHPDocMethodTag start='3' end='54' kind='method' isStatic='true'>
+            <Name>
+                <PHPDocNode start='26' end='29' value='get'/>
+            </Name>
+            <Return Types>
+                <PHPDocTypeNode start='21' end='25' value='?int' 
isArray='false'/>
+            </Return Types>
+            <Parameters>
+                <PHPDocVarTypeTag start='30' end='37' kind='param'>
+                    <Variable>
+                        <PHPDocNode start='35' end='37' value='$i'/>
+                    </Variable>
+                    <Types>
+                        <PHPDocTypeNode start='30' end='34' value='?int' 
isArray='false'/>
+                    </Types>
+                </PHPDocVarTypeTag>
+            </Parameters>
+        </PHPDocMethodTag>
+    </Tags>
+</PHPDocBlock>
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php
new file mode 100644
index 0000000..ccf4d56
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php
@@ -0,0 +1,42 @@
+<?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.
+ */
+
+/**
+ * Example class.
+ *
+ * @method testVoid(Test $test)  test comment
+ * @method int testType(Test $test)  test comment
+ * @method static staticTestVoid(Test $test) test comment
+ * @method static int staticTestType(Test $param1, $param2)  test comment
+ * @method static ?int staticTestNullable(?string $param, int $param2) test 
comment
+ */
+class Example {
+
+    public function test() {
+        self::
+    }
+
+    public static function staticTest(): int {
+    }
+
+}
+
+Example::
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php.testMagicMethodStatic_01a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php.testMagicMethodStatic_01a.completion
new file mode 100644
index 0000000..33b6df4
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php.testMagicMethodStatic_01a.completion
@@ -0,0 +1,8 @@
+Code completion result for source line:
+self::|
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     staticTest()                    [STATIC]   Example
+METHOD     staticTestNullable(?string $pa  [STATIC]   Example
+METHOD     staticTestType(Test $param1, $  [STATIC]   Example
+METHOD     staticTestVoid(Test $test)      [STATIC]   Example
+CONSTANT   class \Example                  [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php.testMagicMethodStatic_01b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php.testMagicMethodStatic_01b.completion
new file mode 100644
index 0000000..ac81eee
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_01.php.testMagicMethodStatic_01b.completion
@@ -0,0 +1,8 @@
+Code completion result for source line:
+Example::|
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     staticTest()                    [STATIC]   Example
+METHOD     staticTestNullable(?string $pa  [STATIC]   Example
+METHOD     staticTestType(Test $param1, $  [STATIC]   Example
+METHOD     staticTestVoid(Test $test)      [STATIC]   Example
+CONSTANT   class \Example                  [PUBLIC]   Magic Constant
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php
new file mode 100644
index 0000000..dbb62a4
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php
@@ -0,0 +1,40 @@
+<?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.
+ */
+
+/**
+ * Example class.
+ *
+ * @method testVoid(Test $test)  test comment
+ * @method int testType(Test $test)  test comment
+ * @method static ?Example getDefault() Description
+ */
+class Example {
+
+    public function test() {
+        self::getDefault()->
+    }
+
+    public static function staticTest(): int {
+    }
+
+}
+
+Example::getDefault()->
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php.testMagicMethodStatic_02a.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php.testMagicMethodStatic_02a.completion
new file mode 100644
index 0000000..4c73a06
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php.testMagicMethodStatic_02a.completion
@@ -0,0 +1,8 @@
+Code completion result for source line:
+self::getDefault()->|
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     getDefault()                    [STATIC]   Example
+METHOD     staticTest()                    [STATIC]   Example
+METHOD     test()                          [PUBLIC]   Example
+METHOD     testType(Test $test)            [PUBLIC]   Example
+METHOD     testVoid(Test $test)            [PUBLIC]   Example
diff --git 
a/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php.testMagicMethodStatic_02b.completion
 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php.testMagicMethodStatic_02b.completion
new file mode 100644
index 0000000..9a23c75
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/completion/lib/nb1861/nb1861_02.php.testMagicMethodStatic_02b.completion
@@ -0,0 +1,8 @@
+Code completion result for source line:
+Example::getDefault()->|
+(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true)
+METHOD     getDefault()                    [STATIC]   Example
+METHOD     staticTest()                    [STATIC]   Example
+METHOD     test()                          [PUBLIC]   Example
+METHOD     testType(Test $test)            [PUBLIC]   Example
+METHOD     testVoid(Test $test)            [PUBLIC]   Example
diff --git 
a/php/php.editor/test/unit/data/testfiles/gotodeclaration/testNb1861/testNb1861.php
 
b/php/php.editor/test/unit/data/testfiles/gotodeclaration/testNb1861/testNb1861.php
new file mode 100644
index 0000000..fa4f1a4
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/gotodeclaration/testNb1861/testNb1861.php
@@ -0,0 +1,49 @@
+<?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.
+ */
+
+/**
+ * Example class.
+ *
+ * @method testVoid(Test $test)  test comment
+ * @method int testType(Test $test)  test comment
+ * @method static staticTestVoid(Test $test) test comment
+ * @method static int staticTestType(Test $param1, $param2)  test comment
+ * @method static ?int staticTestNullable(?string $param, int $param2) test 
comment
+ * @method static ?Example getDefault() Description
+ */
+class Example {
+
+    public function test() {
+        self::staticTestVoid($test);
+        self::staticTestType($param1, $param2);
+        self::staticTestNullable($param1, $param2);
+        self::getDefault();
+    }
+
+    public static function staticTest(): int {
+    }
+
+}
+
+Example::staticTestVoid($test);
+Example::staticTestType($param1, $param2);
+Example::staticTestNullable($param1, $param2);
+Example::getDefault();
diff --git 
a/php/php.editor/test/unit/data/testfiles/markoccurences/testNb1861/testNb1861.php
 
b/php/php.editor/test/unit/data/testfiles/markoccurences/testNb1861/testNb1861.php
new file mode 100644
index 0000000..fa4f1a4
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/markoccurences/testNb1861/testNb1861.php
@@ -0,0 +1,49 @@
+<?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.
+ */
+
+/**
+ * Example class.
+ *
+ * @method testVoid(Test $test)  test comment
+ * @method int testType(Test $test)  test comment
+ * @method static staticTestVoid(Test $test) test comment
+ * @method static int staticTestType(Test $param1, $param2)  test comment
+ * @method static ?int staticTestNullable(?string $param, int $param2) test 
comment
+ * @method static ?Example getDefault() Description
+ */
+class Example {
+
+    public function test() {
+        self::staticTestVoid($test);
+        self::staticTestType($param1, $param2);
+        self::staticTestNullable($param1, $param2);
+        self::getDefault();
+    }
+
+    public static function staticTest(): int {
+    }
+
+}
+
+Example::staticTestVoid($test);
+Example::staticTestType($param1, $param2);
+Example::staticTestNullable($param1, $param2);
+Example::getDefault();
diff --git 
a/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic01.php 
b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic01.php
new file mode 100644
index 0000000..eb6e3f0
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic01.php
@@ -0,0 +1,26 @@
+<?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.
+ */
+
+/**
+ * @method static A m1 
+ */
+class A {
+    
+}
diff --git 
a/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic02.php 
b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic02.php
new file mode 100644
index 0000000..1d9e4e8
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic02.php
@@ -0,0 +1,26 @@
+<?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.
+ */
+
+/**
+ * @method static A m1() 
+ */
+class A {
+    
+}
diff --git 
a/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic03.php 
b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic03.php
new file mode 100644
index 0000000..04715dc
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic03.php
@@ -0,0 +1,26 @@
+<?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.
+ */
+
+/**
+ * @method static A m1() small description
+ */
+class A {
+    
+}
diff --git 
a/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic04.php 
b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic04.php
new file mode 100644
index 0000000..2874f96
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic04.php
@@ -0,0 +1,26 @@
+<?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.
+ */
+
+/**
+ * @method static A m1($param1) small description
+ */
+class A {
+    
+}
diff --git 
a/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic05.php 
b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic05.php
new file mode 100644
index 0000000..1424b91
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic05.php
@@ -0,0 +1,26 @@
+<?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.
+ */
+
+/**
+ * @method static A m1(string $param1) small description
+ */
+class A {
+    
+}
diff --git 
a/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic06.php 
b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic06.php
new file mode 100644
index 0000000..10a027c
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic06.php
@@ -0,0 +1,26 @@
+<?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.
+ */
+
+/**
+ * @method static A m1(string|A $param1) small description
+ */
+class A {
+    
+}
diff --git 
a/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic07.php 
b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic07.php
new file mode 100644
index 0000000..c38a325
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/parser/magicMethodStatic07.php
@@ -0,0 +1,26 @@
+<?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.
+ */
+
+/**
+ * @method static A m1() m1(string|A $param1, A $p2) small description
+ */
+class A {
+    
+}
diff --git a/php/php.editor/test/unit/data/testfiles/structure/magicMethods.php 
b/php/php.editor/test/unit/data/testfiles/structure/magicMethods.php
new file mode 100644
index 0000000..5104a39
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/structure/magicMethods.php
@@ -0,0 +1,40 @@
+<?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.
+ */
+
+/**
+ * Example class.
+ *
+ * @method testVoid(Test $test)  test comment
+ * @method int testType(Test $test)  test comment
+ * @method static staticTestVoid(Test $test) test comment
+ * @method static int staticTestType(Test $param1, $param2)  test comment
+ * @method static ?int staticTestNullable(?string $param, int $param2) test 
comment
+ * @method static ?Example getDefault() Description
+ */
+class Example {
+
+    public function test() {
+    }
+
+    public static function staticTest(): int {
+    }
+
+}
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01a.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01a.occurrences
new file mode 100644
index 0000000..5ce8605
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01a.occurrences
@@ -0,0 +1,3 @@
+ * @method static ^|>MARK_OCCURRENCES:staticTestVoid<|(Test $test) test comment
+        self::|>MARK_OCCURRENCES:staticTestVoid<|($test);
+Example::|>MARK_OCCURRENCES:staticTestVoid<|($test);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01b.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01b.occurrences
new file mode 100644
index 0000000..37c0160
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01b.occurrences
@@ -0,0 +1,3 @@
+ * @method static |>MARK_OCCURRENCES:staticTestVoid<|(Test $test) test comment
+        self::|>MARK_OCCURRENCES:staticTes^tVoid<|($test);
+Example::|>MARK_OCCURRENCES:staticTestVoid<|($test);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01c.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01c.occurrences
new file mode 100644
index 0000000..bcb7a90
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_01c.occurrences
@@ -0,0 +1,3 @@
+ * @method static |>MARK_OCCURRENCES:staticTestVoid<|(Test $test) test comment
+        self::|>MARK_OCCURRENCES:staticTestVoid<|($test);
+Example::|>MARK_OCCURRENCES:staticTestVoi^d<|($test);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02a.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02a.occurrences
new file mode 100644
index 0000000..5bb237b
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02a.occurrences
@@ -0,0 +1,3 @@
+ * @method static int |>MARK_OCCURRENCES:staticTestT^ype<|(Test $param1, 
$param2)  test comment
+        self::|>MARK_OCCURRENCES:staticTestType<|($param1, $param2);
+Example::|>MARK_OCCURRENCES:staticTestType<|($param1, $param2);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02b.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02b.occurrences
new file mode 100644
index 0000000..a217033
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02b.occurrences
@@ -0,0 +1,3 @@
+ * @method static int |>MARK_OCCURRENCES:staticTestType<|(Test $param1, 
$param2)  test comment
+        self::|>MARK_OCCURRENCES:staticT^estType<|($param1, $param2);
+Example::|>MARK_OCCURRENCES:staticTestType<|($param1, $param2);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02c.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02c.occurrences
new file mode 100644
index 0000000..ec49689
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_02c.occurrences
@@ -0,0 +1,3 @@
+ * @method static int |>MARK_OCCURRENCES:staticTestType<|(Test $param1, 
$param2)  test comment
+        self::|>MARK_OCCURRENCES:staticTestType<|($param1, $param2);
+Example::|>MARK_OCCURRENCES:staticTe^stType<|($param1, $param2);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03a.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03a.occurrences
new file mode 100644
index 0000000..e7f0c00
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03a.occurrences
@@ -0,0 +1,3 @@
+ * @method static ?int |>MARK_OCCURRENCES:stat^icTestNullable<|(?string 
$param, int $param2) test comment
+        self::|>MARK_OCCURRENCES:staticTestNullable<|($param1, $param2);
+Example::|>MARK_OCCURRENCES:staticTestNullable<|($param1, $param2);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03b.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03b.occurrences
new file mode 100644
index 0000000..5be9157
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03b.occurrences
@@ -0,0 +1,3 @@
+ * @method static ?int |>MARK_OCCURRENCES:staticTestNullable<|(?string $param, 
int $param2) test comment
+        self::|>MARK_OCCURRENCES:staticTestNu^llable<|($param1, $param2);
+Example::|>MARK_OCCURRENCES:staticTestNullable<|($param1, $param2);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03c.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03c.occurrences
new file mode 100644
index 0000000..05edee4
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_03c.occurrences
@@ -0,0 +1,3 @@
+ * @method static ?int |>MARK_OCCURRENCES:staticTestNullable<|(?string $param, 
int $param2) test comment
+        self::|>MARK_OCCURRENCES:staticTestNullable<|($param1, $param2);
+Example::|>MARK_OCCURRENCES:staticTe^stNullable<|($param1, $param2);
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04a.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04a.occurrences
new file mode 100644
index 0000000..316f316
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04a.occurrences
@@ -0,0 +1,3 @@
+ * @method static ?Example |>MARK_OCCURRENCES:g^etDefault<|() Description
+        self::|>MARK_OCCURRENCES:getDefault<|();
+Example::|>MARK_OCCURRENCES:getDefault<|();
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04b.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04b.occurrences
new file mode 100644
index 0000000..266cd25
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04b.occurrences
@@ -0,0 +1,3 @@
+ * @method static ?Example |>MARK_OCCURRENCES:getDefault<|() Description
+        self::|>MARK_OCCURRENCES:get^Default<|();
+Example::|>MARK_OCCURRENCES:getDefault<|();
diff --git 
a/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04c.occurrences
 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04c.occurrences
new file mode 100644
index 0000000..7a9334f
--- /dev/null
+++ 
b/php/php.editor/test/unit/data/testfiles/testNb1861.php.testNb1861_04c.occurrences
@@ -0,0 +1,3 @@
+ * @method static ?Example |>MARK_OCCURRENCES:getDefault<|() Description
+        self::|>MARK_OCCURRENCES:getDefault<|();
+Example::^|>MARK_OCCURRENCES:getDefault<|();
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionNb1861Test.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionNb1861Test.java
new file mode 100644
index 0000000..6d970fe
--- /dev/null
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionNb1861Test.java
@@ -0,0 +1,65 @@
+/*
+ * 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.
+ */
+package org.netbeans.modules.php.editor.completion;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Map;
+import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.modules.php.project.api.PhpSourcePath;
+import org.netbeans.spi.java.classpath.support.ClassPathSupport;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+
+
+public class PHPCodeCompletionNb1861Test extends PHPCodeCompletionTestBase {
+
+    public PHPCodeCompletionNb1861Test(String testName) {
+        super(testName);
+    }
+
+    public void testMagicMethodStatic_01a() throws Exception {
+        checkCompletion("testfiles/completion/lib/nb1861/nb1861_01.php", 
"self::^", false);
+    }
+
+    public void testMagicMethodStatic_01b() throws Exception {
+        checkCompletion("testfiles/completion/lib/nb1861/nb1861_01.php", 
"Example::^", false);
+    }
+
+    public void testMagicMethodStatic_02a() throws Exception {
+        // return type
+        checkCompletion("testfiles/completion/lib/nb1861/nb1861_02.php", 
"self::getDefault()->^", false);
+    }
+
+    public void testMagicMethodStatic_02b() throws Exception {
+        // return type
+        checkCompletion("testfiles/completion/lib/nb1861/nb1861_02.php", 
"Example::getDefault()->^", false);
+    }
+
+    @Override
+    protected Map<String, ClassPath> createClassPathsForTest() {
+        return Collections.singletonMap(
+            PhpSourcePath.SOURCE_CP,
+            ClassPathSupport.createClassPath(new FileObject[] {
+                FileUtil.toFileObject(new File(getDataDir(), 
"/testfiles/completion/lib/nb1861"))
+            })
+        );
+    }
+
+}
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationNb1861Test.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationNb1861Test.java
new file mode 100644
index 0000000..6bd6fad
--- /dev/null
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/GotoDeclarationNb1861Test.java
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+package org.netbeans.modules.php.editor.csl;
+
+
+public class GotoDeclarationNb1861Test extends GotoDeclarationTestBase {
+
+    public GotoDeclarationNb1861Test(String testName) {
+        super(testName);
+    }
+
+    // Magic methods (@method)
+    public void testNb1861_01a() throws Exception {
+        checkDeclaration(getTestPath(), "        
self::staticTestV^oid($test);", " * @method static ^staticTestVoid(Test $test) 
test comment");
+    }
+
+    public void testNb1861_01b() throws Exception {
+        checkDeclaration(getTestPath(), "Example::static^TestVoid($test);", " 
* @method static ^staticTestVoid(Test $test) test comment");
+    }
+
+    public void testNb1861_02a() throws Exception {
+        checkDeclaration(getTestPath(), "        
self::staticTestTy^pe($param1, $param2);", " * @method static int 
^staticTestType(Test $param1, $param2)  test comment");
+    }
+
+    public void testNb1861_02b() throws Exception {
+        checkDeclaration(getTestPath(), "Example::^staticTestType($param1, 
$param2);", " * @method static int ^staticTestType(Test $param1, $param2)  test 
comment");
+    }
+
+    public void testNb1861_03a() throws Exception {
+        checkDeclaration(getTestPath(), "        
self::st^aticTestNullable($param1, $param2);", " * @method static ?int 
^staticTestNullable(?string $param, int $param2) test comment");
+    }
+
+    public void testNb1861_03b() throws Exception {
+        checkDeclaration(getTestPath(), "Example::staticTe^stNullable($param1, 
$param2);", " * @method static ?int ^staticTestNullable(?string $param, int 
$param2) test comment");
+    }
+
+    public void testNb1861_04a() throws Exception {
+        checkDeclaration(getTestPath(), "        self::ge^tDefault();", " * 
@method static ?Example ^getDefault() Description");
+    }
+
+    public void testNb1861_04b() throws Exception {
+        checkDeclaration(getTestPath(), "Example::getDe^fault();", " * @method 
static ?Example ^getDefault() Description");
+    }
+
+}
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorTest.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorTest.java
index 763e999..fc71d88 100644
--- 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorTest.java
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorTest.java
@@ -105,4 +105,8 @@ public class NavigatorTest extends PhpNavigatorTestBase{
         performTest("structure/nullableTypes_02");
     }
 
+    public void testMagicMethods_01() throws Exception {
+        performTest("structure/magicMethods");
+    }
+
 }
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplNb1861Test.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplNb1861Test.java
new file mode 100644
index 0000000..36b3575
--- /dev/null
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/OccurrencesFinderImplNb1861Test.java
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ */
+package org.netbeans.modules.php.editor.csl;
+
+
+public class OccurrencesFinderImplNb1861Test extends 
OccurrencesFinderImplTestBase {
+
+    public OccurrencesFinderImplNb1861Test(String testName) {
+        super(testName);
+    }
+
+    public void testNb1861_01a() throws Exception {
+        checkOccurrences(getTestPath(), " * @method static 
^staticTestVoid(Test $test) test comment", true);
+    }
+
+    public void testNb1861_01b() throws Exception {
+        checkOccurrences(getTestPath(), "        
self::staticTes^tVoid($test);", true);
+    }
+
+    public void testNb1861_01c() throws Exception {
+        checkOccurrences(getTestPath(), "Example::staticTestVoi^d($test);", 
true);
+    }
+
+    public void testNb1861_02a() throws Exception {
+        checkOccurrences(getTestPath(), " * @method static int 
staticTestT^ype(Test $param1, $param2)  test comment", true);
+    }
+
+    public void testNb1861_02b() throws Exception {
+        checkOccurrences(getTestPath(), "        
self::staticT^estType($param1, $param2);", true);
+    }
+
+    public void testNb1861_02c() throws Exception {
+        checkOccurrences(getTestPath(), "Example::staticTe^stType($param1, 
$param2);", true);
+    }
+
+    public void testNb1861_03a() throws Exception {
+        checkOccurrences(getTestPath(), " * @method static ?int 
stat^icTestNullable(?string $param, int $param2) test comment", true);
+    }
+
+    public void testNb1861_03b() throws Exception {
+        checkOccurrences(getTestPath(), "        
self::staticTestNu^llable($param1, $param2);", true);
+    }
+
+    public void testNb1861_03c() throws Exception {
+        checkOccurrences(getTestPath(), "Example::staticTe^stNullable($param1, 
$param2);", true);
+    }
+
+    public void testNb1861_04a() throws Exception {
+        checkOccurrences(getTestPath(), " * @method static ?Example 
g^etDefault() Description", true);
+    }
+
+    public void testNb1861_04b() throws Exception {
+        checkOccurrences(getTestPath(), "        self::get^Default();", true);
+    }
+
+    public void testNb1861_04c() throws Exception {
+        checkOccurrences(getTestPath(), "Example::^getDefault();", true);
+    }
+
+}
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest.java
index 569d636..2dab38d 100644
--- 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest.java
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/ASTPHP5ParserTest.java
@@ -310,6 +310,35 @@ public class ASTPHP5ParserTest extends ParserTestBase {
         performTest("parser/magicMethod07");
     }
 
+    // NETBEANS-1861
+    public void testMagicMethodStatic01() throws Exception {
+        performTest("parser/magicMethodStatic01");
+    }
+
+    public void testMagicMethodStatic02() throws Exception {
+        performTest("parser/magicMethodStatic02");
+    }
+
+    public void testMagicMethodStatic03() throws Exception {
+        performTest("parser/magicMethodStatic03");
+    }
+
+    public void testMagicMethodStatic04() throws Exception {
+        performTest("parser/magicMethodStatic04");
+    }
+
+    public void testMagicMethodStatic05() throws Exception {
+        performTest("parser/magicMethodStatic05");
+    }
+
+    public void testMagicMethodStatic06() throws Exception {
+        performTest("parser/magicMethodStatic06");
+    }
+
+    public void testMagicMethodStatic07() throws Exception {
+        performTest("parser/magicMethodStatic07");
+    }
+
     public void testTraits_01() throws Exception {
         performTest("parser/traits_01");
     }
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest.java
index bbf61e6..7124691 100644
--- 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest.java
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest.java
@@ -355,6 +355,36 @@ public class PHPDocCommentParserTest extends PHPTestBase {
         perform(comment, "testIssue257953");
     }
 
+    public void testMethod01() throws Exception {
+        String comment = " * @method int get(int $i) message foo bar";
+        perform(comment, "Method01");
+    }
+
+    public void testMethod02() throws Exception {
+        String comment = " * @method get(int $i) message foo bar";
+        perform(comment, "Method02");
+    }
+
+    public void testMethod03() throws Exception {
+        String comment = " * @method ?int get(?int $i) message foo bar";
+        perform(comment, "Method03");
+    }
+
+    public void testMethodStatic01() throws Exception {
+        String comment = " * @method static int get(int $i) message foo bar";
+        perform(comment, "MethodStatic01");
+    }
+
+    public void testMethodStatic02() throws Exception {
+        String comment = " * @method static get(int $i) message foo bar";
+        perform(comment, "MethodStatic02");
+    }
+
+    public void testMethodStatic03() throws Exception {
+        String comment = " * @method static ?int get(?int $i) message foo bar";
+        perform(comment, "MethodStatic03");
+    }
+
     public void perform(String comment, String filename) throws Exception {
         PHPDocCommentParser parser = new PHPDocCommentParser();
         PHPDocBlock block = parser.parse(0, comment.length(), comment);
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PrintASTVisitor.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PrintASTVisitor.java
index 2c2eab4..205b911 100644
--- 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PrintASTVisitor.java
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PrintASTVisitor.java
@@ -876,7 +876,7 @@ public class PrintASTVisitor implements Visitor {
     @Override
     public void visit(PHPDocMethodTag node) {
         XMLPrintNode printNode = new XMLPrintNode(node, "PHPDocMethodTag",
-                new String[] {"kind", node.getKind().getName()});
+                new String[] {"kind", node.getKind().getName(), "isStatic", 
node.isStatic() ? "true" : "false"});
         printNode.addChild("Name", node.getMethodName());
         printNode.addChildrenGroup("Return Types", node.getTypes());
         printNode.addChildrenGroup("Parameters", node.getParameters());
diff --git 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/astnodes/CommentExtractorTest.java
 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/astnodes/CommentExtractorTest.java
index 43771ce..cc727c0 100644
--- 
a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/astnodes/CommentExtractorTest.java
+++ 
b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/astnodes/CommentExtractorTest.java
@@ -58,4 +58,28 @@ public class CommentExtractorTest extends PHPTestBase {
         assertEquals(description, documentation);
     }
 
+    // NETBEANS-1861
+    public void testStaticNoDescription() throws Exception {
+        PHPDocNode methodName = new PHPDocNode(1, 2, "where");
+        PHPDocMethodTag methodTag = new PHPDocMethodTag(1, 2, 
PHPDocTag.Type.METHOD, null, methodName, null, "@method static DibiConnection 
where($cond)");
+        String documentation = methodTag.getDocumentation();
+        assertEquals("", documentation);
+    }
+
+    public void testStaticExistingDescription() throws Exception {
+        PHPDocNode methodName = new PHPDocNode(1, 2, "where");
+        final String description = "My description.";
+        PHPDocMethodTag methodTag = new PHPDocMethodTag(1, 2, 
PHPDocTag.Type.METHOD, null, methodName, null, "@method static DibiConnection 
where($cond) " + description);
+        String documentation = methodTag.getDocumentation();
+        assertEquals(description, documentation);
+    }
+
+    public void testStaticExistingDescriptionWithMoreDeclarations() throws 
Exception {
+        PHPDocNode methodName = new PHPDocNode(1, 2, "where");
+        final String description = "My description.";
+        PHPDocMethodTag methodTag = new PHPDocMethodTag(1, 2, 
PHPDocTag.Type.METHOD, null, methodName, null, "@method static DibiConnection 
where() where($cond) " + description);
+        String documentation = methodTag.getDocumentation();
+        assertEquals(description, documentation);
+    }
+
 }


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