You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@netbeans.apache.org by "troizet (via GitHub)" <gi...@apache.org> on 2025/07/23 16:49:03 UTC

[PR] Changed the way interface methods and abstract methods are parsed [netbeans]

troizet opened a new pull request, #8673:
URL: https://github.com/apache/netbeans/pull/8673

   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
   <?php
   
   abstract class ClassExample
   {
   
       abstract public function test(): int;
   }
   ```
   Before:
   
   https://github.com/user-attachments/assets/3da62022-c51f-4def-b66d-60cc1e24ed1e
   
   After:
   
   https://github.com/user-attachments/assets/d41f518d-f005-4aae-b522-9ec3563da830
   
   
   
   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
   <?php
   
   interface InterfaceExample
   {
   
       public function test();
   }
   ```
   
   Before:
   <img width="479" height="227" alt="interface_method_before" src="https://github.com/user-attachments/assets/b6c2df54-2a83-4f6b-a450-a394007b373a" />
   
   After:
   <img width="600" height="196" alt="interface_method_after" src="https://github.com/user-attachments/assets/0dd63503-1994-46f5-824b-8033f2077cc6" />
   
   
   https://github.com/user-attachments/assets/a443821f-2b4f-496d-8e14-d2b8494a88c3
   
   
   
   
   
   
   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`.
   https://github.com/apache/netbeans/blob/53e88660baa36f81497808b11aa39f4efc072c26/php/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpCommentGenerator.java#L227-L246
   
   Due to an improperly defined scope, the analysis to determine whether the method has a return type is blocked.
   https://github.com/apache/netbeans/blob/53e88660baa36f81497808b11aa39f4efc072c26/php/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpCommentGenerator.java#L273-L278
   
   https://github.com/apache/netbeans/blob/53e88660baa36f81497808b11aa39f4efc072c26/php/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpCommentGenerator.java#L439-L449
   
   As a result, the method for retrieving the method's return type is not called.
   https://github.com/apache/netbeans/blob/53e88660baa36f81497808b11aa39f4efc072c26/php/php.editor/src/org/netbeans/modules/php/editor/typinghooks/PhpCommentGenerator.java#L115-L117
   
   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**
   
   <details open>
   <summary>Click to collapse/expand PR instructions</summary>
   
   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](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=240884239#PRsandYouAreviewerGuide-PRtriggeredCIJobs(conditionalCIpipeline)), did the right tests run? When did they run?
   2. [ ] Is this PR [squashed](https://cwiki.apache.org/confluence/display/NETBEANS/git%3A+squash+and+merge)?
   3. [ ] Are author name / email address correct? Are [co-authors](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors#creating-co-authored-commits-on-the-command-line) correctly listed? Do the commit messages need updates?
   3. [ ] 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](https://cwiki.apache.org/confluence/display/NETBEANS/Pull+requests+for+delivery). ([full wiki article](https://cwiki.apache.org/confluence/display/NETBEANS/PRs+and+You+-+A+reviewer+Guide))
   
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

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


Re: [PR] Changed the way interface methods and abstract methods are parsed [netbeans]

Posted by "troizet (via GitHub)" <gi...@apache.org>.
troizet commented on code in PR #8673:
URL: https://github.com/apache/netbeans/pull/8673#discussion_r2256244722


##########
php/php.editor/src/org/netbeans/modules/php/editor/verification/IncorrectNonAbstractMethodHintError.java:
##########
@@ -107,17 +111,26 @@ private void addHint(ASTNode node, String description, List<Hint> hints, List<Hi
     //~ Inner classes
     private static final class CheckVisitor extends DefaultVisitor {
 
+        private final Model model;
+
         private final Set<MethodDeclaration> incorrectNonAbstractMethods = new HashSet<>();
 
+        public CheckVisitor(Model model) {
+            super();
+            this.model = model;
+        }
+
         @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);

Review Comment:
   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.
   https://github.com/apache/netbeans/blob/51789f035849212c4b0803eefb7adba41108fad3/php/php.editor/src/org/netbeans/modules/php/editor/verification/AbstractClassInstantiationHintError.java#L71-L120
   I will do performance measurements later. Thank you!



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

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


Re: [PR] Changed the way interface methods and abstract methods are parsed [netbeans]

Posted by "tmysik (via GitHub)" <gi...@apache.org>.
tmysik commented on code in PR #8673:
URL: https://github.com/apache/netbeans/pull/8673#discussion_r2251986071


##########
php/php.editor/src/org/netbeans/modules/php/editor/verification/IncorrectNonAbstractMethodHintError.java:
##########
@@ -107,17 +111,26 @@ private void addHint(ASTNode node, String description, List<Hint> hints, List<Hi
     //~ Inner classes
     private static final class CheckVisitor extends DefaultVisitor {
 
+        private final Model model;
+
         private final Set<MethodDeclaration> incorrectNonAbstractMethods = new HashSet<>();
 
+        public CheckVisitor(Model model) {
+            super();
+            this.model = model;
+        }
+
         @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);

Review Comment:
   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.
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

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


Re: [PR] Changed the way interface methods and abstract methods are parsed [netbeans]

Posted by "troizet (via GitHub)" <gi...@apache.org>.
troizet commented on code in PR #8673:
URL: https://github.com/apache/netbeans/pull/8673#discussion_r2264786552


##########
php/php.editor/src/org/netbeans/modules/php/editor/verification/IncorrectNonAbstractMethodHintError.java:
##########
@@ -107,17 +111,26 @@ private void addHint(ASTNode node, String description, List<Hint> hints, List<Hi
     //~ Inner classes
     private static final class CheckVisitor extends DefaultVisitor {
 
+        private final Model model;
+
         private final Set<MethodDeclaration> incorrectNonAbstractMethods = new HashSet<>();
 
+        public CheckVisitor(Model model) {
+            super();
+            this.model = model;
+        }
+
         @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);

Review Comment:
   Used this code for measurements
   
   ```java
           @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
   
   
   
   <details>
     <summary>Attempt 1</summary>
   
   ```
   
   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
   
   ```
   
   </details>
   
   <details>
     <summary>Attempt 2</summary>
   
   ```
   
   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
   
   ```
   
   </details>
   
   
   <details>
     <summary>Attempt 3</summary>
   
   
   ```
   
   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
   
   ```
   
   </details>



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

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


Re: [PR] Changed the way interface methods and abstract methods are parsed [netbeans]

Posted by "tmysik (via GitHub)" <gi...@apache.org>.
tmysik commented on code in PR #8673:
URL: https://github.com/apache/netbeans/pull/8673#discussion_r2264797639


##########
php/php.editor/src/org/netbeans/modules/php/editor/verification/IncorrectNonAbstractMethodHintError.java:
##########
@@ -107,17 +111,26 @@ private void addHint(ASTNode node, String description, List<Hint> hints, List<Hi
     //~ Inner classes
     private static final class CheckVisitor extends DefaultVisitor {
 
+        private final Model model;
+
         private final Set<MethodDeclaration> incorrectNonAbstractMethods = new HashSet<>();
 
+        public CheckVisitor(Model model) {
+            super();
+            this.model = model;
+        }
+
         @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);

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



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

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