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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2b0b934ed8 #4447 - Fix missing code folding blocks in java editor for 
conditions, loops and try/catch
2b0b934ed8 is described below

commit 2b0b934ed8d5f777119db145a3b91c03f917ddb2
Author: Chris <[email protected]>
AuthorDate: Fri Jul 29 16:18:34 2022 +0200

    #4447 - Fix missing code folding blocks in java editor for conditions, 
loops and try/catch
    
    The motivation about this was to implement those missing folding blocks in 
java editor. This was just implemented for imports, classes, inner classes, 
methods but not for stuff inside methods like if/else if/else, try/catch and 
loops because all of them are treated like code blocks.
    
    Also introducing code-block fold type for specific code parts and separate 
from method fold type for customization. Add missing implementation of new 
method for method folding and add method folding to deprecated Java Editor lib 
as requested. Map the code block to the method block for deprecated Java Editor 
Lib
---
 .../editor/base/fold/JavaElementFoldVisitor.java   | 25 +++++++++++++++++++---
 .../netbeans/editor/ext/java/JavaFoldManager.java  | 10 +++++++--
 .../java/editor/fold/JavaElementFoldManager.java   | 11 +++++++++-
 .../java/editor/fold/JavaFoldTypeProvider.java     |  1 +
 .../server/protocol/TextDocumentServiceImpl.java   |  7 +++++-
 5 files changed, 47 insertions(+), 7 deletions(-)

diff --git 
a/java/java.editor.base/src/org/netbeans/modules/java/editor/base/fold/JavaElementFoldVisitor.java
 
b/java/java.editor.base/src/org/netbeans/modules/java/editor/base/fold/JavaElementFoldVisitor.java
index d4f2d583c3..44fb59754c 100644
--- 
a/java/java.editor.base/src/org/netbeans/modules/java/editor/base/fold/JavaElementFoldVisitor.java
+++ 
b/java/java.editor.base/src/org/netbeans/modules/java/editor/base/fold/JavaElementFoldVisitor.java
@@ -32,6 +32,7 @@ import com.sun.source.tree.ImportTree;
 import com.sun.source.tree.MemberSelectTree;
 import com.sun.source.tree.MethodTree;
 import com.sun.source.tree.Tree;
+import com.sun.source.tree.Tree.Kind;
 import com.sun.source.tree.VariableTree;
 import com.sun.source.util.SourcePositions;
 import com.sun.source.util.TreePath;
@@ -170,8 +171,24 @@ public final class JavaElementFoldVisitor<T> extends 
CancellableTreePathScanner<
 
     @Override
     public Object visitMethod(MethodTree node, Object p) {
-        super.visitMethod(node, p);
-        handleTree((int)sp.getStartPosition(cu, node), node.getBody(), node, 
false);
+        super.visitMethod(node, Boolean.TRUE);
+
+        try {
+            if (p == Boolean.TRUE) {
+                int start = Utilities.findBodyStart(info, node, cu, sp, doc);
+                int end   = (int)sp.getEndPosition(cu, node);
+
+                if (start != (-1) && start < end) {
+                    addFold(creator.createMethodFold(start, end), 
(int)sp.getStartPosition(cu, node));
+                  }
+            }
+
+            handleJavadoc(node);
+        } catch (BadLocationException | ConcurrentModificationException e) {
+            //the document probably changed, stop
+            stopped = true;
+        }
+
         return null;
     }
 
@@ -213,7 +230,8 @@ public final class JavaElementFoldVisitor<T> extends 
CancellableTreePathScanner<
         //check static/dynamic initializer:
         TreePath path = getCurrentPath();
 
-        if 
(TreeUtilities.CLASS_TREE_KINDS.contains(path.getParentPath().getLeaf().getKind()))
 {
+        if 
(TreeUtilities.CLASS_TREE_KINDS.contains(path.getParentPath().getLeaf().getKind())
 ||
+            !Kind.METHOD.equals(path.getParentPath().getLeaf().getKind())) {
             handleTree(node, null, false);
         }
 
@@ -308,6 +326,7 @@ public final class JavaElementFoldVisitor<T> extends 
CancellableTreePathScanner<
 
         T createImportsFold(int start, int end);
         T createInnerClassFold(int start, int end);
+        T createMethodFold(int start, int end);
         T createCodeBlockFold(int start, int end);
         T createJavadocFold(int start, int end);
         T createInitialCommentFold(int start, int end);
diff --git 
a/java/java.editor.lib/src/org/netbeans/editor/ext/java/JavaFoldManager.java 
b/java/java.editor.lib/src/org/netbeans/editor/ext/java/JavaFoldManager.java
index fec70aac9d..4143b13717 100644
--- a/java/java.editor.lib/src/org/netbeans/editor/ext/java/JavaFoldManager.java
+++ b/java/java.editor.lib/src/org/netbeans/editor/ext/java/JavaFoldManager.java
@@ -42,7 +42,9 @@ public abstract class JavaFoldManager implements FoldManager {
     
     public static final FoldType JAVADOC_FOLD_TYPE = 
JavaElementFoldManager.JAVADOC_FOLD_TYPE;
 
-    public static final FoldType CODE_BLOCK_FOLD_TYPE = 
JavaElementFoldManager.CODE_BLOCK_FOLD_TYPE;
+    public static final FoldType CODE_BLOCK_FOLD_TYPE = 
JavaElementFoldManager.METHOD_BLOCK_FOLD_TYPE;
+
+    public static final FoldType METHOD_BLOCK_FOLD_TYPE = 
JavaElementFoldManager.METHOD_BLOCK_FOLD_TYPE;
     
     public static final FoldType INNERCLASS_TYPE = 
JavaElementFoldManager.INNERCLASS_TYPE;
     
@@ -68,7 +70,11 @@ public abstract class JavaFoldManager implements FoldManager 
{
 
     @Deprecated
     public static final FoldTemplate CODE_BLOCK_FOLD_TEMPLATE
-        = new FoldTemplate(CODE_BLOCK_FOLD_TYPE, CODE_BLOCK_FOLD_DESCRIPTION, 
1, 1);
+            = new FoldTemplate(CODE_BLOCK_FOLD_TYPE, 
CODE_BLOCK_FOLD_DESCRIPTION, 1, 1);
+
+    @Deprecated
+    public static final FoldTemplate METHOD_BLOCK_FOLD_TEMPLATE
+            = new FoldTemplate(METHOD_BLOCK_FOLD_TYPE, 
CODE_BLOCK_FOLD_DESCRIPTION, 1, 1);
 
     @Deprecated
     public static final FoldTemplate INNER_CLASS_FOLD_TEMPLATE
diff --git 
a/java/java.editor/src/org/netbeans/modules/java/editor/fold/JavaElementFoldManager.java
 
b/java/java.editor/src/org/netbeans/modules/java/editor/fold/JavaElementFoldManager.java
index 08a7f4c539..53ba9dfebb 100644
--- 
a/java/java.editor/src/org/netbeans/modules/java/editor/fold/JavaElementFoldManager.java
+++ 
b/java/java.editor/src/org/netbeans/modules/java/editor/fold/JavaElementFoldManager.java
@@ -76,7 +76,11 @@ public class JavaElementFoldManager implements FoldManager {
             new org.netbeans.api.editor.fold.FoldTemplate(3, 2, "/**...*/")); 
// NOI18N
 
     @NbBundle.Messages("FoldType_Methods=Methods")
-    public static final FoldType CODE_BLOCK_FOLD_TYPE = 
FoldType.MEMBER.derive("method", Bundle.FoldType_Methods(), 
+    public static final FoldType METHOD_BLOCK_FOLD_TYPE = 
FoldType.MEMBER.derive("method", Bundle.FoldType_Methods(), 
+            new org.netbeans.api.editor.fold.FoldTemplate(1, 1, "{...}")); // 
NOI18N
+
+    @NbBundle.Messages("FoldType_CodeBlocks=Code Blocks")
+    public static final FoldType CODE_BLOCK_FOLD_TYPE = 
FoldType.CODE_BLOCK.derive("code-block", Bundle.FoldType_CodeBlocks(), 
             new org.netbeans.api.editor.fold.FoldTemplate(1, 1, "{...}")); // 
NOI18N
     
     @NbBundle.Messages("FoldType_InnerClasses=Inner Classes")
@@ -273,6 +277,11 @@ public class JavaElementFoldManager implements FoldManager 
{
                     return FoldInfo.range(start, end, INNERCLASS_TYPE);
                 }
 
+                @Override
+                public FoldInfo createMethodFold(int start, int end) {
+                    return FoldInfo.range(start, end, METHOD_BLOCK_FOLD_TYPE);
+                }
+
                 @Override
                 public FoldInfo createCodeBlockFold(int start, int end) {
                     return FoldInfo.range(start, end, CODE_BLOCK_FOLD_TYPE);
diff --git 
a/java/java.editor/src/org/netbeans/modules/java/editor/fold/JavaFoldTypeProvider.java
 
b/java/java.editor/src/org/netbeans/modules/java/editor/fold/JavaFoldTypeProvider.java
index afc0c37b6e..36ddddd1e5 100644
--- 
a/java/java.editor/src/org/netbeans/modules/java/editor/fold/JavaFoldTypeProvider.java
+++ 
b/java/java.editor/src/org/netbeans/modules/java/editor/fold/JavaFoldTypeProvider.java
@@ -37,6 +37,7 @@ public class JavaFoldTypeProvider implements FoldTypeProvider 
{
     public JavaFoldTypeProvider() {
         types.add(JavaElementFoldManager.CODE_BLOCK_FOLD_TYPE);
         types.add(JavaElementFoldManager.INNERCLASS_TYPE);
+        types.add(JavaElementFoldManager.METHOD_BLOCK_FOLD_TYPE);
         types.add(JavaElementFoldManager.IMPORTS_FOLD_TYPE);
         types.add(JavaElementFoldManager.JAVADOC_FOLD_TYPE);
         types.add(JavaElementFoldManager.INITIAL_COMMENT_FOLD_TYPE);
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
index ba2f9db63c..b268541495 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
@@ -1510,11 +1510,16 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                     public FoldingRange createInnerClassFold(int start, int 
end) {
                         return createFold(start, end, FoldingRangeKind.Region);
                     }
-
+                    
                     @Override
                     public FoldingRange createCodeBlockFold(int start, int 
end) {
                         return createFold(start, end, FoldingRangeKind.Region);
                     }
+                    
+                    @Override
+                    public FoldingRange createMethodFold(int start, int end) {
+                        return createFold(start, end, FoldingRangeKind.Region);
+                    }
 
                     @Override
                     public FoldingRange createJavadocFold(int start, int end) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

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

Reply via email to