Skip to content

Conversation

troizet
Copy link
Collaborator

@troizet troizet commented Jul 23, 2025

What was done in this PR:

  • Changed the way interface methods and abstract methods are parsed
  • Fixed generation of the return type in phpDoc comments for abstract methods with an explicitly specified return type
  • For an interface method with a body, a hint Interface method can not contain body is now displayed instead of a syntax error
  • Fixed tests ASTPHP5ParserTest and SanitizeSourceTest
  • Fixed hints: IncorrectNonAbstractMethodIntError, InitializeFieldSuggestion, ModifiersCheckHintError, UnusedVariableHint
  • Added new tests for PhpCommentGenerator and ModifiersCheckHintError

Fixed generation of the return type in phpDoc comments for abstract methods with an explicitly specified return type:
Example:

<?php

abstract class ClassExample
{

    abstract public function test(): int;
}

Before:

before.mp4

After:

after.mp4

For an interface method with a body, a hint Interface method can not contain body is now displayed instead of a syntax error:
Example:

<?php

interface InterfaceExample
{

    public function test();
}

Before:
interface_method_before

After:
interface_method_after

interface_method_after_2.mp4

While working on tests for pull request #8340, I noticed that for an abstract method with an explicit return type, the return type is not generated in the phpDoc comment. I also noticed that for an interface method with an explicit return type, the correct phpDoc comment is generated.
The reason for the difference in return type generation between abstract methods and interface methods in phpDoc comments lay in the parsing process. For abstract methods, an empty body block was not identified during parsing, unlike for interface methods.
And because of this, the Scope of the method was incorrectly determined for the abstract method: ClassScope was determined instead of MethodScope.

public ScannerImpl(ParserResult info, FunctionDeclaration decl) {
if (info instanceof PHPParseResult) {
PHPParseResult parseResult = (PHPParseResult) info;
Model model = parseResult.getModel();
final VariableScope variableScope = model.getVariableScope(decl.getEndOffset() - 1);
NamespaceScope namespaceScope = ModelUtils.getNamespaceScope(model.getFileScope(), decl.getEndOffset() - 1);
if (namespaceScope != null) {
declaredUses = namespaceScope.getAllDeclaredSingleUses();
}
if (variableScope instanceof FunctionScope) {
fnc = (FunctionScope) variableScope;
declaredVariables.addAll(fnc.getDeclaredVariables());
} else {
fnc = null;
}
} else {
fnc = null;
}
this.decl = decl;
}

Due to an improperly defined scope, the analysis to determine whether the method has a return type is blocked.

@Override
public void scan(ASTNode node) {
if (fnc != null) {
super.scan(node);
}
}

@Override
public void visit(FunctionDeclaration node) {
if (node == decl) {
// functions and methods can have a return type declaration since PHP7.0
Expression type = node.getReturnType();
if (type != null) {
hasReturn = true;
}
super.visit(node);
}
}

As a result, the method for retrieving the method's return type is not called.

if (i.hasReturn) {
generateDocEntry(doc, toAdd, "@return", indent, null, i.getReturnType()); // NOI18N
}

I decided to bring the parsing of the abstract method and the interface method to a single form. As a result, the issue with phpDoc comment return type generation was resolved, the syntax error for interface methods with a body was eliminated,
and the 'Interface method cannot contain body' hint began functioning correctly.


^Add meaningful description above

Click to collapse/expand PR instructions

By opening a pull request you confirm that, unless explicitly stated otherwise, the changes -

  • are all your own work, and you have the right to contribute them.
  • are contributed solely under the terms and conditions of the Apache License 2.0 (see section 5 of the license for more information).

Please make sure (eg. git log) that all commits have a valid name and email address for you in the Author field.

If you're a first time contributor, see the Contributing guidelines for more information.

If you're a committer, please label the PR before pressing "Create pull request" so that the right test jobs can run.

PR approval and merge checklist:

  1. Was this PR correctly labeled, did the right tests run? When did they run?
  2. Is this PR squashed?
  3. Are author name / email address correct? Are co-authors correctly listed? Do the commit messages need updates?
  4. Does the PR title and description still fit after the Nth iteration? Is the description sufficient to appear in the release notes?

If this PR targets the delivery branch: don't merge. (full wiki article)

- Fixed generation of the return type in phpDoc comments for abstract methods with an explicitly specified return type
- For an interface method with a body, a hint "Interface method cannot contain body" is now displayed instead of a syntax error
- Fixed tests ASTPHP5ParserTest and SanitizeSourceTest
- Fixed hints: IncorrectNonAbstractMethodIntError, InitializeFieldSuggestion, ModifiersCheckHintError, UnusedVariableHint
- Added new tests for PhpCommentGenerator and ModifiersCheckHintError
@troizet troizet added the PHP [ci] enable extra PHP tests (php/php.editor) label Jul 23, 2025
@troizet troizet requested review from tmysik and junichi11 July 23, 2025 16:50
@Override
public void visit(MethodDeclaration node) {
if (CancelSupport.getDefault().isCancelled()) {
return;
}
if (!Modifier.isAbstract(node.getModifier())) {
FunctionDeclaration function = node.getFunction();
Block body = function.getBody();
if (body == null) {
final VariableScope variableScope = model.getVariableScope(function.getEndOffset() - 1);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure here - is calling of the model in visitors OK? I am sorry, I already forgot... could you please check the performance and validate that it is still OK? Thank you.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, there were thoughts that perhaps it is not worth doing this.
But, for example, in AbstractClassInstantiationHintError the model is also called in the visitor.

private final class CheckVisitor extends DefaultVisitor {
private final FileObject fileObject;
private final Index index;
private final List<Hint> hints = new ArrayList<>();
private final Model model;
private CheckVisitor(FileObject fileObject, Index index, Model model) {
this.fileObject = fileObject;
this.index = index;
this.model = model;
}
public List<Hint> getHints() {
return Collections.unmodifiableList(hints);
}
@Override
@Messages({
"# {0} - Class name",
"AbstractClassInstantiationDesc=Abstract class {0} can not be instantiated"
})
public void visit(ClassInstanceCreation node) {
if (CancelSupport.getDefault().isCancelled()
|| CodeUtils.isDollaredName(node.getClassName())) {
// GH-6119
// e.g.
// abstract class AbstractClass {}
// $a = new $abstractClass();
return;
}
ASTNodeInfo<ClassInstanceCreation> info = ASTNodeInfo.create(node);
int startOffset = node.getStartOffset();
VariableScope variableScope = model.getVariableScope(startOffset);
QualifiedName fullyQualifiedName = VariousUtils.getFullyQualifiedName(info.getQualifiedName(), startOffset, variableScope);
Set<ClassElement> classes = index.getClasses(NameKind.exact(fullyQualifiedName));
if (!classes.isEmpty()) {
ClassElement classElement = ModelUtils.getFirst(classes);
if (classElement != null && classElement.isAbstract()) {
OffsetRange offsetRange = new OffsetRange(startOffset, node.getEndOffset());
hints.add(new Hint(
AbstractClassInstantiationHintError.this,
Bundle.AbstractClassInstantiationDesc(classElement.getFullyQualifiedName().toString()),
fileObject,
offsetRange,
null,
500));
}
}
}
}

I will do performance measurements later. Thank you!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Used this code for measurements

        @Override
        public void visit(MethodDeclaration node) {
            if (CancelSupport.getDefault().isCancelled()) {
                return;
            }
            if (!Modifier.isAbstract(node.getModifier())) {
                long startTime = System.currentTimeMillis();

                FunctionDeclaration function = node.getFunction();
                final VariableScope variableScope = model.getVariableScope(function.getEndOffset() - 1);
                Scope inScope = variableScope.getInScope();
                boolean isInterface = inScope instanceof InterfaceScope;
                if (!isInterface && variableScope.getBlockRange().getLength() <= 1) {
                    incorrectNonAbstractMethods.add(node);
                }
                
                long time = System.currentTimeMillis() - startTime;
                System.out.println(String.format("visit MethodDeclaration node %d ms", time));
            }
        }

Measurements were taken using the example of Mpdf https://github.com/mpdf/mpdf/blob/development/src/Mpdf.php

Attempt 1

visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 9 ms
visit MethodDeclaration node 14 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 25 ms
visit MethodDeclaration node 25 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 34 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 21 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 14 ms
visit MethodDeclaration node 142 ms
visit MethodDeclaration node 30 ms
visit MethodDeclaration node 16 ms
visit MethodDeclaration node 30 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 45 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 68 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 18 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 20 ms
visit MethodDeclaration node 9 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 27 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 9 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 20 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 9 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 24 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 77 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 23 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 99 ms
visit MethodDeclaration node 15 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 53 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 32 ms
visit MethodDeclaration node 23 ms
visit MethodDeclaration node 34 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 40 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 19 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 110 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 19 ms
visit MethodDeclaration node 32 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 21 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 25 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 32 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 19 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 6 ms

Attempt 2

visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 52 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 39 ms
visit MethodDeclaration node 24 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 39 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 65 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 14 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 16 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 50 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 14 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 68 ms
visit MethodDeclaration node 9 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 28 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 16 ms
visit MethodDeclaration node 22 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 25 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 18 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 82 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 21 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 14 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 21 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 5 ms

Attempt 3

visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 8 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 33 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 52 ms
visit MethodDeclaration node 16 ms
visit MethodDeclaration node 9 ms
visit MethodDeclaration node 15 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 36 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 59 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 15 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 13 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 11 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 40 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 67 ms
visit MethodDeclaration node 9 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 28 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 20 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 23 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 17 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 88 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 13 ms
visit MethodDeclaration node 18 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 7 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 14 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 20 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 5 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 6 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 9 ms
visit MethodDeclaration node 12 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 10 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 3 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 4 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 2 ms
visit MethodDeclaration node 0 ms
visit MethodDeclaration node 1 ms
visit MethodDeclaration node 3 ms

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That seems OK to me, thank you for doing that.

Copy link
Member

@tmysik tmysik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Firstly - thank you for your time and these changes. Also, sorry for the delay in my review.

Overall, the PR looks good to me, I like the changes (please note the comment I added) but still, please, wait for @junichi11 and his review as he is the primary owner of the NetBeans PHP support, no doubts.

Thank you!

@troizet troizet changed the title Changed the way interface methods and abstract methods are parsed PHP: Changed the way interface methods and abstract methods are parsed Aug 13, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
PHP [ci] enable extra PHP tests (php/php.editor)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants