-
Notifications
You must be signed in to change notification settings - Fork 901
PHP: Changed the way interface methods and abstract methods are parsed #8673
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
PHP: Changed the way interface methods and abstract methods are parsed #8673
Conversation
- 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
@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); |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
Lines 71 to 120 in 51789f0
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!
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this 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!
What was done in this PR:
Interface method can not contain body
is now displayed instead of a syntax errorASTPHP5ParserTest
andSanitizeSourceTest
IncorrectNonAbstractMethodIntError
,InitializeFieldSuggestion
,ModifiersCheckHintError
,UnusedVariableHint
PhpCommentGenerator
andModifiersCheckHintError
Fixed generation of the return type in phpDoc comments for abstract methods with an explicitly specified return type:
Example:
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:
Before:

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 ofMethodScope
.netbeans/php/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpCommentGenerator.java
Lines 227 to 246 in 53e8866
Due to an improperly defined scope, the analysis to determine whether the method has a return type is blocked.
netbeans/php/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpCommentGenerator.java
Lines 273 to 278 in 53e8866
netbeans/php/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpCommentGenerator.java
Lines 439 to 449 in 53e8866
As a result, the method for retrieving the method's return type is not called.
netbeans/php/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpCommentGenerator.java
Lines 115 to 117 in 53e8866
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 -
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:
If this PR targets the delivery branch: don't merge. (full wiki article)