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