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

joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git

commit e10a9f3c7b5126a486391b71a3df052c89c915bb
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed Dec 18 13:21:16 2024 -0800

    ASLinter: significantly optimize performance of looking for `@linter:on` 
and `@linter:off` comments
    
    (linting all of royale-asjs/frameworks/projects went from 10 minutes to 26 
seconds on my machine)
    
    A map is used to cache results for searching for a previous comment before 
the current one
---
 .../java/org/apache/royale/linter/ASLinter.java    | 42 ++++++++++++++--------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/linter/src/main/java/org/apache/royale/linter/ASLinter.java 
b/linter/src/main/java/org/apache/royale/linter/ASLinter.java
index 7fdd34c19..dce93f9f4 100644
--- a/linter/src/main/java/org/apache/royale/linter/ASLinter.java
+++ b/linter/src/main/java/org/apache/royale/linter/ASLinter.java
@@ -25,11 +25,13 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.EnumSet;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.royale.compiler.clients.problems.CompilerProblemCategorizer;
+import org.apache.royale.compiler.common.ISourceLocation;
 import org.apache.royale.compiler.internal.parsing.as.ASParser;
 import org.apache.royale.compiler.internal.parsing.as.ASToken;
 import org.apache.royale.compiler.internal.parsing.as.ASTokenTypes;
@@ -166,7 +168,7 @@ public class ASLinter extends BaseLinter {
 
                        IASToken[] allTokens = repairedTokensList.toArray(new 
IASToken[0]);
                        TokenQuery tokenQuery = new TokenQuery(allTokens);
-                       visitNode(node, tokenQuery, fileProblems);
+                       visitNode(node, tokenQuery, null, fileProblems);
                        boolean skipLinting = false;
                        for (LinterRule rule : settings.rules) {
                                Map<Integer, TokenVisitor> tokenHandlers = 
rule.getTokenVisitors();
@@ -199,9 +201,13 @@ public class ASLinter extends BaseLinter {
                }
        }
 
-       private void visitNode(IASNode node, TokenQuery tokenQuery, 
Collection<ICompilerProblem> problems) {
+       private void visitNode(IASNode node, TokenQuery tokenQuery, 
Map<IASToken, IASToken> lookupMap, Collection<ICompilerProblem> problems) {
+               if (lookupMap == null) {
+                       lookupMap = new HashMap<IASToken, IASToken>();
+               }
                ASTNodeID nodeID = node.getNodeID();
-               IASToken prevComment = tokenQuery.getCommentBefore(node);
+               IASToken firstComment = tokenQuery.getCommentBefore(node);
+               IASToken prevComment = firstComment;
                boolean linterOn = true;
                while (prevComment != null) {
                        String commentText = null;
@@ -210,20 +216,26 @@ public class ASLinter extends BaseLinter {
                        } else if (prevComment.getType() == 
ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT) {
                                commentText = prevComment.getText();
                                commentText = commentText.substring(2, 
commentText.length() - 2).trim();
-                       } else {
-                               // not the type of comment that we care about
-                               prevComment = 
tokenQuery.getCommentBefore(prevComment);
-                               continue;
                        }
-                       if (LINTER_TAG_ON.equals(commentText)) {
-                               linterOn = true;
-                               break;
+                       if (commentText != null) {
+                               if (LINTER_TAG_ON.equals(commentText)) {
+                                       linterOn = true;
+                                       break;
+                               }
+                               if (LINTER_TAG_OFF.equals(commentText)) {
+                                       linterOn = false;
+                                       break;
+                               }
                        }
-                       if (LINTER_TAG_OFF.equals(commentText)) {
-                               linterOn = false;
-                               break;
+                       if (lookupMap.containsKey(prevComment)) {
+                               prevComment = lookupMap.get(prevComment);
+                       } else {
+                               IASToken newPrevComment = 
tokenQuery.getCommentBefore(prevComment);
+                               lookupMap.put(prevComment, newPrevComment);
+                               // it's safe to skip comments that weren't 
linter tags
+                               lookupMap.put(firstComment, newPrevComment);
+                               prevComment = newPrevComment;
                        }
-                       prevComment = tokenQuery.getCommentBefore(prevComment);
                }
                if (linterOn) {
                        for (LinterRule rule : settings.rules) {
@@ -235,7 +247,7 @@ public class ASLinter extends BaseLinter {
                }
                for (int i = 0; i < node.getChildCount(); i++) {
                        IASNode child = node.getChild(i);
-                       visitNode(child, tokenQuery, problems);
+                       visitNode(child, tokenQuery, lookupMap, problems);
                }
        }
 

Reply via email to