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

lkishalmi 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 ff3e087  [NETBEANS-3990] Sealed color and formatting (#2282)
ff3e087 is described below

commit ff3e087c6f1f10db21852df17e2fc3839747b72f
Author: Akshay-Gupta-Oracle 
<55184560+akshay-gupta-ora...@users.noreply.github.com>
AuthorDate: Wed Oct 7 18:57:50 2020 +0530

    [NETBEANS-3990] Sealed color and formatting (#2282)
    
    * [NETBEANS-3990] Sealed hint,color and formatting
    
    * [NETBEANS-3990] Sealed hint,color and formatting
    
    * [NETBEANS-3990] Sealed hint,color and formatting
    
    * [NETBEANS-3990] Sealed code coloring
    
    * [NETBEANS-3990] adding reformatting for sealed
    
    * [NETBEANS-3990] Sealed color and formatting
    
    * [NETBEANS-3990] Sealed hint,color and formatting
---
 .../editor/base/semantic/ColoringAttributes.java   |   1 -
 .../base/semantic/SemanticHighlighterBase.java     |  40 +++++++-
 .../java/editor/base/semantic/DetectorTest.java    |  41 ++++++++-
 .../netbeans/modules/java/source/TreeShims.java    |  14 +++
 .../modules/java/source/save/Reformatter.java      |  21 +++++
 .../modules/java/source/save/FormatingTest.java    | 102 ++++++++++++++++++++-
 6 files changed, 212 insertions(+), 7 deletions(-)

diff --git 
a/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/ColoringAttributes.java
 
b/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/ColoringAttributes.java
index 5681c09..f795eb3 100644
--- 
a/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/ColoringAttributes.java
+++ 
b/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/ColoringAttributes.java
@@ -30,7 +30,6 @@ import java.util.Set;
 public enum ColoringAttributes {
 
     UNUSED,
-
     ABSTRACT,
 
     FIELD,
diff --git 
a/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/SemanticHighlighterBase.java
 
b/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/SemanticHighlighterBase.java
index 8146d84..711cf3e 100644
--- 
a/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/SemanticHighlighterBase.java
+++ 
b/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/SemanticHighlighterBase.java
@@ -71,6 +71,7 @@ import 
org.netbeans.api.java.source.support.CancellableTreePathScanner;
 import org.netbeans.api.lexer.PartType;
 import org.netbeans.api.lexer.Token;
 import org.netbeans.api.lexer.TokenHierarchy;
+import org.netbeans.api.lexer.TokenUtilities;
 import org.netbeans.modules.java.editor.base.imports.UnusedImports;
 import 
org.netbeans.modules.java.editor.base.semantic.ColoringAttributes.Coloring;
 import 
org.netbeans.modules.java.editor.base.semantic.UnusedDetector.UnusedDescription;
@@ -367,7 +368,7 @@ public abstract class SemanticHighlighterBase extends 
JavaParserResultTask {
             }
             
             boolean accessModifier = false;
-            
+
             if (decl.getModifiers().contains(Modifier.PUBLIC)) {
                 c.add(ColoringAttributes.PUBLIC);
                 accessModifier = true;
@@ -920,7 +921,19 @@ public abstract class SemanticHighlighterBase extends 
JavaParserResultTask {
             }
             scan(tree.getExtendsClause(), null);
             scan(tree.getImplementsClause(), null);
-
+            try {
+                List<? extends Tree> permitList = TreeShims.getPermits(tree);
+                if (permitList != null && !permitList.isEmpty()) {
+                    tl.moveNext();
+                    Token t = firstIdentifierToken("permits");// NOI18N
+                    if (tl != null) {
+                        contextKeywords.add(t);
+                        scan(permitList, null);
+                    }
+                }
+            } catch (NullPointerException ex) {
+                //Do nothing
+            }
             ExecutableElement prevRecursionDetector = recursionDetector;
 
             recursionDetector = null;
@@ -1002,9 +1015,32 @@ public abstract class SemanticHighlighterBase extends 
JavaParserResultTask {
                 handlePossibleIdentifier(tp, true, 
info.getTrees().getElement(tp));
                 
tl.moveToOffset(sourcePositions.getEndPosition(getCurrentPath().getCompilationUnit(),
 TreeShims.getBindingPatternType(tree)));
                 firstIdentifier(tp, TreeShims.getBinding(tree).toString());
+            } else if (tree != null && tree.getKind().equals(Kind.MODIFIERS)) {
+               visitModifier(tree);
             }
             return super.scan(tree, p);
         }
+        
+        private void visitModifier(Tree tree) {
+            
tl.moveToOffset(sourcePositions.getStartPosition(info.getCompilationUnit(), 
tree));
+            Token t = null;
+            if (tree.toString().contains("non-sealed")) {// NOI18N
+                Token firstIdentifier = tl.firstIdentifier(getCurrentPath(), 
"non");// NOI18N
+                if (firstIdentifier != null) {
+                    contextKeywords.add(firstIdentifier);
+                }
+                tl.moveNext();
+                tl.moveNext();
+                if (TokenUtilities.textEquals(tl.currentToken().text(), 
"sealed")) {// NOI18N
+                    contextKeywords.add(tl.currentToken());
+                }
+            } else if (tree.toString().contains("sealed")) {// NOI18N
+                t = firstIdentifierToken("sealed"); //NOI18N
+                if (t != null) {
+                    contextKeywords.add(t);
+                }
+            }
+        }
 
         private int leadingIndent(String line) {
             int indent = 0;
diff --git 
a/java/java.editor.base/test/unit/src/org/netbeans/modules/java/editor/base/semantic/DetectorTest.java
 
b/java/java.editor.base/test/unit/src/org/netbeans/modules/java/editor/base/semantic/DetectorTest.java
index c34a3eb..6e8ba00 100644
--- 
a/java/java.editor.base/test/unit/src/org/netbeans/modules/java/editor/base/semantic/DetectorTest.java
+++ 
b/java/java.editor.base/test/unit/src/org/netbeans/modules/java/editor/base/semantic/DetectorTest.java
@@ -575,7 +575,46 @@ public class DetectorTest extends TestBase {
                     "[PUBLIC, RECORD_COMPONENT, DECLARATION], 4:40-4:41",
                     "[STATIC, PUBLIC, INTERFACE], 4:54-4:59");
     }
-
+    
+    public void testSealed() throws Exception {
+        try {
+            SourceVersion.valueOf("RELEASE_15"); //NOI18N
+        } catch (IllegalArgumentException ex) {
+            //OK, no RELEASE_14, skip tests
+            return;
+        }
+        enablePreview();
+        performTest("SealedTest",
+                "sealed class Test{}\n"
+                + "non-sealed class Child extends Test{}\n",
+                "[KEYWORD], 0:0-0:6",
+                "[PACKAGE_PRIVATE, CLASS, DECLARATION], 0:13-0:17",
+                "[KEYWORD], 1:0-1:3",
+                "[KEYWORD], 1:4-1:10",
+                "[PACKAGE_PRIVATE, CLASS, DECLARATION], 1:17-1:22",
+                "[PACKAGE_PRIVATE, CLASS], 1:31-1:35");
+    }
+
+    public void testSealed2() throws Exception {
+        try {
+            SourceVersion.valueOf("RELEASE_15"); //NOI18N
+        } catch (IllegalArgumentException ex) {
+            //OK, no RELEASE_14, skip tests
+            return;
+        }
+        enablePreview();
+        performTest("SealedTest",
+                "sealed class Test permits Child{}\n"
+                + "non-sealed class Child extends Test{}\n",
+                "[KEYWORD], 0:0-0:6",
+                "[PACKAGE_PRIVATE, CLASS, DECLARATION], 0:13-0:17",
+                "[KEYWORD], 0:18-0:25",
+                "[PACKAGE_PRIVATE, CLASS], 0:26-0:31",
+                "[KEYWORD], 1:0-1:3",
+                "[KEYWORD], 1:4-1:10",
+                "[PACKAGE_PRIVATE, CLASS, DECLARATION], 1:17-1:22",
+                "[PACKAGE_PRIVATE, CLASS], 1:31-1:35");
+    }
     public void testYield() throws Exception {
         enablePreview();
         performTest("YieldTest.java",
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/TreeShims.java 
b/java/java.source.base/src/org/netbeans/modules/java/source/TreeShims.java
index 88504aa..eb75dd0 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/TreeShims.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/TreeShims.java
@@ -20,6 +20,7 @@ package org.netbeans.modules.java.source;
 
 import com.sun.source.tree.BreakTree;
 import com.sun.source.tree.CaseTree;
+import com.sun.source.tree.ClassTree;
 import com.sun.source.tree.ExpressionTree;
 import com.sun.source.tree.InstanceOfTree;
 import com.sun.source.tree.SwitchTree;
@@ -148,6 +149,19 @@ public class TreeShims {
             throw TreeShims.<RuntimeException>throwAny(ex);
         }
     }
+    public static List<? extends Tree> getPermits(ClassTree node) {
+        List<? extends Tree> perms = null;
+        try {
+            Class classTree = Class.forName("com.sun.source.tree.ClassTree");
+            Method getPerms = classTree.getDeclaredMethod("getPermitsClause");
+            perms = (List<? extends Tree>) getPerms.invoke(node);
+        } catch (ClassNotFoundException | NoSuchMethodException ex) {
+            return null;
+        } catch (SecurityException | IllegalAccessException | 
IllegalArgumentException | InvocationTargetException ex) {
+            throw TreeShims.<RuntimeException>throwAny(ex);
+        }
+        return perms;
+    }
 
     public static ExpressionTree getYieldValue(Tree node) {
         if (!node.getKind().toString().equals(YIELD)) {
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java
index cf1f827..585485d 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java
@@ -48,6 +48,7 @@ import 
org.netbeans.api.java.source.support.ErrorAwareTreePathScanner;
 import org.netbeans.api.lexer.Token;
 import org.netbeans.api.lexer.TokenHierarchy;
 import org.netbeans.api.lexer.TokenSequence;
+import org.netbeans.api.lexer.TokenUtilities;
 import org.netbeans.modules.editor.indent.spi.Context;
 import org.netbeans.modules.editor.indent.spi.ExtraLock;
 import org.netbeans.modules.editor.indent.spi.ReformatTask;
@@ -954,6 +955,11 @@ public class Reformatter implements ReformatTask {
                         wrapToken(cs.wrapExtendsImplementsKeyword(), 1, id == 
INTERFACE ? EXTENDS : IMPLEMENTS);
                         wrapList(cs.wrapExtendsImplementsList(), 
cs.alignMultilineImplements(), true, COMMA, impls);
                     }
+                    List<? extends Tree> perms = TreeShims.getPermits(node);
+                    if (perms != null && !perms.isEmpty()) {
+                        wrapToken(cs.wrapExtendsImplementsKeyword(), 1, 
EXTENDS); 
+                        wrapList(cs.wrapExtendsImplementsList(), 
cs.alignMultilineImplements(), true, COMMA, perms);
+                    }
                 } finally {
                     continuationIndent = old;
                 }
@@ -3538,6 +3544,21 @@ public class Reformatter implements ReformatTask {
                             break;
                         }
                     }
+                    if (TokenUtilities.textEquals(tokens.token().text(), 
"sealed") || TokenUtilities.textEquals(tokens.token().text(), "permits")) {
+                        contains = true;
+                    }
+                    if (TokenUtilities.textEquals(tokens.token().text(), 
"non") && tokens.moveNext()) {
+                        if (TokenUtilities.textEquals(tokens.token().text(), 
"-") && tokens.moveNext()) {
+                            if 
(TokenUtilities.textEquals(tokens.token().text(), "sealed")) {// NOI18N
+                                contains = true;
+                            } else {
+                                tokens.movePrevious();
+                                tokens.movePrevious();
+                            }
+                        } else {
+                            tokens.movePrevious();
+                        }
+                    }
                 }
                 if (contains) {
                     String spaces = after == 1 //after line comment
diff --git 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java
 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java
index c2e7a68..ac199e2 100644
--- 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java
+++ 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java
@@ -5225,6 +5225,7 @@ public class FormatingTest extends NbTestCase {
                 + "}\n";
         reformat(doc, content, golden);
     }
+
     
     public void testRecord4() throws Exception {
         try {
@@ -5240,8 +5241,7 @@ public class FormatingTest extends NbTestCase {
         EditorCookie ec = (EditorCookie) 
testSourceDO.getCookie(EditorCookie.class);
         final Document doc = ec.openDocument();
         doc.putProperty(Language.class, JavaTokenId.language());
-        String content
-                = "package hierbas.del.litoral;\n\n"
+        String content = "package hierbas.del.litoral;\n\n"
                 + "public class Test {\n\n"
                 + "public record g3(@Override int a, @Override int b){}}";
         String golden
@@ -5252,7 +5252,103 @@ public class FormatingTest extends NbTestCase {
                 + "}\n";
         reformat(doc, content, golden);
     }
-   
+  
+    public void testSealed() throws Exception {
+        try {
+            SourceVersion.valueOf("RELEASE_15"); //NOI18N
+        } catch (IllegalArgumentException ex) {
+            //OK, no RELEASE_15, skip test
+            return;
+        }
+        testFile = new File(getWorkDir(), "Test.java");
+        TestUtilities.copyStringToFile(testFile, "");
+        FileObject testSourceFO = FileUtil.toFileObject(testFile);
+        DataObject testSourceDO = DataObject.find(testSourceFO);
+        EditorCookie ec = (EditorCookie) 
testSourceDO.getCookie(EditorCookie.class);
+        final Document doc = ec.openDocument();
+        doc.putProperty(Language.class, JavaTokenId.language());
+        String content = "sealed class x{}\n"
+                + "non-sealed class y extends x {}\n"
+                + "final class z extends x {}";
+
+        String golden
+                = "\nsealed class x {\n"
+                + "}\n"
+                + "\n"
+                + "non-sealed class y extends x {\n"
+                + "}\n"
+                + "\n"
+                + "final class z extends x {\n"
+                + "}\n";
+        reformat(doc, content, golden);
+    }
+
+    public void testSealed2() throws Exception {
+        try {
+            SourceVersion.valueOf("RELEASE_15"); //NOI18N
+        } catch (IllegalArgumentException ex) {
+            //OK, no RELEASE_15, skip test
+            return;
+        }
+        testFile = new File(getWorkDir(), "Test.java");
+        TestUtilities.copyStringToFile(testFile, "");
+        FileObject testSourceFO = FileUtil.toFileObject(testFile);
+        DataObject testSourceDO = DataObject.find(testSourceFO);
+        EditorCookie ec = (EditorCookie) 
testSourceDO.getCookie(EditorCookie.class);
+        final Document doc = ec.openDocument();
+        doc.putProperty(Language.class, JavaTokenId.language());
+        String content
+                = "sealed class x{}\n"
+                + "non-sealed class y extends x {}";
+
+        String golden
+                = "\nsealed class x {\n"
+                + "}\n"
+                + "\n"
+                + "non-sealed class y extends x {\n"
+                + "}\n";
+        reformat(doc, content, golden);
+    }
+
+    public void testSealed3() throws Exception {
+        try {
+            SourceVersion.valueOf("RELEASE_15"); //NOI18N
+        } catch (IllegalArgumentException ex) {
+            //OK, no RELEASE_15, skip test
+            return;
+        }
+        testFile = new File(getWorkDir(), "Test.java");
+        TestUtilities.copyStringToFile(testFile, "");
+        FileObject testSourceFO = FileUtil.toFileObject(testFile);
+        DataObject testSourceDO = DataObject.find(testSourceFO);
+        EditorCookie ec = (EditorCookie) 
testSourceDO.getCookie(EditorCookie.class);
+        final Document doc = ec.openDocument();
+        doc.putProperty(Language.class, JavaTokenId.language());
+        String content
+                = "sealed class x{}\n"
+                + "final class c1 extends x {}\n"
+                + "non-sealed class c2 extends x {}\n"
+                + "final class c3 extends x {}\n"
+                + "non-sealed class c4 extends x {}";
+
+        String golden
+                = "\nsealed class x {\n"
+                + "}\n"
+                + "\n"
+                + "final class c1 extends x {\n"
+                + "}\n"
+                + "\n"
+                + "non-sealed class c2 extends x {\n"
+                + "}\n"
+                + "\n"
+                + "final class c3 extends x {\n"
+                + "}\n"
+                + "\n"
+                + "non-sealed class c4 extends x {\n"
+                + "}\n";
+        reformat(doc, content, golden);
+    }
+  
     private void reformat(Document doc, String content, String golden) throws 
Exception {
         reformat(doc, content, golden, 0, content.length());
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

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

Reply via email to