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/incubator-netbeans.git
The following commit(s) were added to refs/heads/master by this push: new f718d2a [NETBEANS-1780]:Fixed formatting issue in Switch Expression(JDK-12) (#1079) f718d2a is described below commit f718d2a1c20c511ecb2836be479f0aa7c14e92ac Author: Arunava Sinha <arunava.si...@oracle.com> AuthorDate: Wed Mar 6 20:25:28 2019 +0530 [NETBEANS-1780]:Fixed formatting issue in Switch Expression(JDK-12) (#1079) * [NETBEANS-1780]:Fixed formatting issue in Switch Expression(JDK-12) * [NETBEANS-1780]: Refactored code for formatting issue in Switch Expression(JDK-12) * [NETBEANS-1780]: Refactored code and added test-cases for formatting issue in Switch Expression/Switch Rule --- .../modules/java/source/save/Reformatter.java | 160 ++++++--- .../modules/java/source/save/FormatingTest.java | 381 +++++++++++++++++++++ 2 files changed, 491 insertions(+), 50 deletions(-) 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 6e25ab6..2bcf4b4 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 @@ -53,6 +53,7 @@ import org.netbeans.modules.editor.indent.spi.ExtraLock; import org.netbeans.modules.editor.indent.spi.ReformatTask; import org.netbeans.modules.java.source.JavaSourceAccessor; import org.netbeans.modules.java.source.NoJavacHelper; +import org.netbeans.modules.java.source.TreeShims; import org.netbeans.modules.java.source.parsing.FileObjects; import org.netbeans.modules.java.source.parsing.JavacParser; import org.netbeans.modules.parsing.api.Embedding; @@ -577,7 +578,7 @@ public class Reformatter implements ReformatTask { try { if (endPos < 0) return false; - Boolean ret = tokens.offset() <= endPos ? super.scan(tree, p) : null; + Boolean ret = tokens.offset() <= endPos ? (tree.getKind().toString().equals("SWITCH_EXPRESSION")) ? scanSwitchExpression(tree,p) : super.scan(tree, p) : null; //NOI18N return ret != null ? ret : true; } finally { @@ -2565,32 +2566,49 @@ public class Reformatter implements ReformatTask { @Override public Boolean visitSwitch(SwitchTree node, Void p) { + return handleSwitch(node, p); + } + + private Boolean scanSwitchExpression(Tree node, Void p) { + return handleSwitch(node,p); + } + + private boolean handleSwitch(Tree node, Void p) { accept(SWITCH); boolean oldContinuationIndent = continuationIndent; try { continuationIndent = true; spaces(cs.spaceBeforeSwitchParen() ? 1 : 0); - scan(node.getExpression(), p); + List<? extends ExpressionTree> exprTrees = TreeShims.getExpressions(node); + if (!exprTrees.isEmpty()) { + ExpressionTree expressionTree = exprTrees.get(0); + scan(expressionTree, p); + } } finally { continuationIndent = oldContinuationIndent; } CodeStyle.BracePlacement bracePlacement = cs.getOtherBracePlacement(); boolean spaceBeforeLeftBrace = cs.spaceBeforeSwitchLeftBrace(); - boolean indentCases = cs.indentCasesFromSwitch(); + boolean indentCases = cs.indentCasesFromSwitch() ; int old = lastIndent; int halfIndent = lastIndent; - switch(bracePlacement) { + if (node.getKind().toString().equals("SWITCH_EXPRESSION")) { + continuationIndent = false; + } + switch (bracePlacement) { case SAME_LINE: spaces(spaceBeforeLeftBrace ? 1 : 0, tokens.offset() < startOffset); accept(LBRACE); - if (indentCases) + if (indentCases) { indent = lastIndent + indentSize; + } break; case NEW_LINE: newline(); accept(LBRACE); - if (indentCases) + if (indentCases) { indent = lastIndent + indentSize; + } break; case NEW_LINE_HALF_INDENTED: int oldLast = lastIndent; @@ -2598,53 +2616,68 @@ public class Reformatter implements ReformatTask { halfIndent = indent; newline(); accept(LBRACE); - if (indentCases) + if (indentCases) { indent = oldLast + indentSize; - else + } else { indent = old; + } break; case NEW_LINE_INDENTED: indent = lastIndent + indentSize; halfIndent = indent; newline(); accept(LBRACE); - if (!indentCases) + if (!indentCases) { indent = old; + } break; } - for (CaseTree caseTree : node.getCases()) { - newline(); - scan(caseTree, p); + if (node.getKind().toString().equals("SWITCH_EXPRESSION")) { //NOI18N + old = indent; + indent = lastIndent + indentSize; } - newline(); - indent = halfIndent; - Diff diff = diffs.isEmpty() ? null : diffs.getFirst(); - if (diff != null && diff.end == tokens.offset()) { - if (diff.text != null) { - int idx = diff.text.lastIndexOf('\n'); //NOI18N - if (idx < 0) - diff.text = getIndent(); - else - diff.text = diff.text.substring(0, idx + 1) + getIndent(); - + List<? extends CaseTree> caseTrees = TreeShims.getCases(node); + try { + for (CaseTree caseTree : caseTrees) { + newline(); + scan(caseTree, p); } - String spaces = diff.text != null ? diff.text : getIndent(); - if (spaces.equals(fText.substring(diff.start, diff.end))) - diffs.removeFirst(); - } else if (tokens.movePrevious()) { - if (tokens.token().id() == WHITESPACE) { - String text = tokens.token().text().toString(); - int idx = text.lastIndexOf('\n'); //NOI18N - if (idx >= 0) { - text = text.substring(idx + 1); - String ind = getIndent(); - if (!ind.equals(text)) - addDiff(new Diff(tokens.offset() + idx + 1, tokens.offset() + tokens.token().length(), ind)); + + newline(); + indent = halfIndent; + Diff diff = diffs.isEmpty() ? null : diffs.getFirst(); + if (diff != null && diff.end == tokens.offset()) { + if (diff.text != null) { + int idx = diff.text.lastIndexOf('\n'); //NOI18N + if (idx < 0) { + diff.text = getIndent(); + } else { + diff.text = diff.text.substring(0, idx + 1) + getIndent(); + } + + } + String spaces = diff.text != null ? diff.text : getIndent(); + if (spaces.equals(fText.substring(diff.start, diff.end))) { + diffs.removeFirst(); + } + } else if (tokens.movePrevious()) { + if (tokens.token().id() == WHITESPACE) { + String text = tokens.token().text().toString(); + int idx = text.lastIndexOf('\n'); //NOI18N + if (idx >= 0) { + text = text.substring(idx + 1); + String ind = getIndent(); + if (!ind.equals(text)) { + addDiff(new Diff(tokens.offset() + idx + 1, tokens.offset() + tokens.token().length(), ind)); + } + } } + tokens.moveNext(); } - tokens.moveNext(); + } finally { + continuationIndent = oldContinuationIndent; } - accept(RBRACE); + accept(RBRACE); indent = lastIndent = old; return true; } @@ -2659,21 +2692,39 @@ public class Reformatter implements ReformatTask { } else { accept(DEFAULT); } + List<? extends StatementTree> statements = node.getStatements(); + Tree caseBody = null; + if(statements != null) accept(COLON); + else { + accept(ARROW); + caseBody = TreeShims.getBody(node); + if (caseBody instanceof StatementTree) + statements = Collections.singletonList((StatementTree) caseBody); + } int old = indent; indent = lastIndent + indentSize; boolean first = true; - for (StatementTree stat : node.getStatements()) { - if (first) { - if (stat.getKind() == Tree.Kind.BLOCK) { - indent = lastIndent; + if(statements != null) + { + for (StatementTree stat : statements) { + if (first) { + if (stat.getKind() == Tree.Kind.BLOCK) { + indent = lastIndent; + } + wrapStatement(cs.wrapCaseStatements(), CodeStyle.BracesGenerationStyle.LEAVE_ALONE, 1, stat); + } else { + newline(); + scan(stat, p); } - wrapStatement(cs.wrapCaseStatements(), CodeStyle.BracesGenerationStyle.LEAVE_ALONE, 1, stat); - } else { - newline(); - scan(stat, p); + first = false; } - first = false; + } + else if (caseBody != null) { + newline(); + scan(caseBody, p); + spaces(cs.spaceBeforeSemi() ? 1 : 0); + accept(SEMICOLON); } indent = old; return true; @@ -2681,11 +2732,17 @@ public class Reformatter implements ReformatTask { @Override public Boolean visitBreak(BreakTree node, Void p) { - accept(BREAK); - Name label = node.getLabel(); - if (label != null) { + JavaTokenId token = accept(BREAK); + ExpressionTree exprTree = TreeShims.getValue(node); + if (exprTree != null) { space(); - accept(IDENTIFIER, UNDERSCORE); + scan(exprTree, p); + } else { + Name label = node.getLabel(); + if (label != null) { + space(); + accept(IDENTIFIER, UNDERSCORE); + } } accept(SEMICOLON); return true; @@ -3133,6 +3190,9 @@ public class Reformatter implements ReformatTask { case SYNCHRONIZED: spaceWithinParens = cs.spaceWithinSynchronizedParens(); break; + case VARIABLE: + spaceWithinParens = cs.spaceWithinSwitchParens(); + break; default: spaceWithinParens = cs.spaceWithinParens(); if (cs.alignMultilineParenthesized()) { 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 cda1c9f..339c6b2 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 @@ -1950,6 +1950,387 @@ public class FormatingTest extends NbTestCase { reformat(doc, content, golden); preferences.putBoolean("indentCasesFromSwitch", true); } + public void testRuleSwitch() throws Exception { + testFile = new File(getWorkDir(), "Test.java"); + TestUtilities.copyStringToFile(testFile, + "package hierbas.del.litoral;\n\n" + + "public class Test {\n" + + " public void taragui(int i) {\n" + + " }\n" + + "}\n"); + 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()); + Preferences preferences = MimeLookup.getLookup(JavaTokenId.language().mimeType()).lookup(Preferences.class); + + String content = + "package hierbas.del.litoral;" + + "public class Test{" + + "public void taragui(int i){" + + "switch(i){" + + "case 0->" + + "System.out.println(i);" + + "default->" + + "System.out.println(\"DEFAULT\");" + + "}" + + "}" + + "}\n"; + + String golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " switch (i) {\n" + + " case 0->\n" + + " System.out.println(i);\n" + + " default->\n" + + " System.out.println(\"DEFAULT\");\n" + + " }\n" + + " }\n" + + "}\n"; + reformat(doc, content, golden); + + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " switch( i ){\n" + + " case 0->\n" + + " System.out.println(i);\n" + + " default->\n" + + " System.out.println(\"DEFAULT\");\n" + + " }\n" + + " }\n" + + "}\n"; + preferences.putBoolean("spaceBeforeSwitchParen", false); + preferences.putBoolean("spaceWithinSwitchParens", true); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", false); + reformat(doc, content, golden); + preferences.putBoolean("spaceBeforeSwitchParen", true); + preferences.putBoolean("spaceWithinSwitchParens", false); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", true); + + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " switch (i)\n" + + " {\n" + + " case 0->\n" + + " System.out.println(i);\n" + + " default->\n" + + " System.out.println(\"DEFAULT\");\n" + + " }\n" + + " }\n" + + "}\n"; + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.NEW_LINE.name()); + reformat(doc, content, golden); + + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " switch (i)\n" + + " {\n" + + " case 0->\n" + + " System.out.println(i);\n" + + " default->\n" + + " System.out.println(\"DEFAULT\");\n" + + " }\n" + + " }\n" + + "}\n"; + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.NEW_LINE_HALF_INDENTED.name()); + reformat(doc, content, golden); + + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " switch (i)\n" + + " {\n" + + " case 0->\n" + + " System.out.println(i);\n" + + " default->\n" + + " System.out.println(\"DEFAULT\");\n" + + " }\n" + + " }\n" + + "}\n"; + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.NEW_LINE_INDENTED.name()); + reformat(doc, content, golden); + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.SAME_LINE.name()); + + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " switch (i) {\n" + + " case 0->\n" + + " System.out.println(i);\n" + + " default->\n" + + " System.out.println(\"DEFAULT\");\n" + + " }\n" + + " }\n" + + "}\n"; + preferences.putBoolean("indentCasesFromSwitch", false); + reformat(doc, content, golden); + preferences.putBoolean("indentCasesFromSwitch", true); + } + public void testSwitchExpression() throws Exception { + testFile = new File(getWorkDir(), "Test.java"); + TestUtilities.copyStringToFile(testFile, + "package hierbas.del.litoral;\n\n" + + "public class Test {\n" + + " public void taragui(int i) {\n" + + " }\n" + + "}\n"); + 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()); + + Preferences preferences = MimeLookup.getLookup(JavaTokenId.language().mimeType()).lookup(Preferences.class); + + String content = + "package hierbas.del.litoral;" + + "public class Test{" + + "public void taragui(int i){" + + "int i = switch(i){" + + "case 0:" + + "{System.out.println(i);" + + "break 5;}" + + "default:" + + "{System.out.println(\"DEFAULT\");" + + "break 6;}" + + "}" + + "}" + + "}\n"; + + String golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " int i = switch (i) {\n" + + " case 0: {\n" + + " System.out.println(i);\n" + + " break 5;\n" + + " }\n" + + " default: {\n" + + " System.out.println(\"DEFAULT\");\n" + + " break 6;\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n"; + preferences.putBoolean("spaceBeforeSwitchParen", true); + preferences.putBoolean("spaceWithinSwitchParens", false); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", true); + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.SAME_LINE.name()); + reformat(doc, content, golden); + + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " int i = switch( i ){\n" + + " case 0: {\n" + + " System.out.println(i);\n" + + " break 5;\n" + + " }\n" + + " default: {\n" + + " System.out.println(\"DEFAULT\");\n" + + " break 6;\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n"; + + preferences.putBoolean("spaceBeforeSwitchParen", false); + preferences.putBoolean("spaceWithinSwitchParens", true); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", false); + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.SAME_LINE.name()); + reformat(doc, content, golden); + + preferences.putBoolean("spaceBeforeSwitchParen", true); + preferences.putBoolean("spaceWithinSwitchParens", false); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", true); + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.SAME_LINE.name()); + + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " int i = switch (i)\n" + + " {\n" + + " case 0:\n" + + " {\n" + + " System.out.println(i);\n" + + " break 5;\n" + + " }\n" + + " default:\n" + + " {\n" + + " System.out.println(\"DEFAULT\");\n" + + " break 6;\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n"; + preferences.putBoolean("spaceBeforeSwitchParen", true); + preferences.putBoolean("spaceWithinSwitchParens", false); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", false); + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.NEW_LINE_HALF_INDENTED.name()); + reformat(doc, content, golden); + + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " int i = switch (i)\n" + + " {\n" + + " case 0:\n" + + " {\n" + + " System.out.println(i);\n" + + " break 5;\n" + + " }\n" + + " default:\n" + + " {\n" + + " System.out.println(\"DEFAULT\");\n" + + " break 6;\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n"; + + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.NEW_LINE_INDENTED.name()); + reformat(doc, content, golden); + + preferences.putBoolean("spaceBeforeSwitchParen", true); + preferences.putBoolean("spaceWithinSwitchParens", false); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", true); + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.SAME_LINE.name()); + } + public void testSwitchExprWithRuleCase() throws Exception { + testFile = new File(getWorkDir(), "Test.java"); + TestUtilities.copyStringToFile(testFile, + "package hierbas.del.litoral;\n\n" + + "public class Test {\n" + + " public void taragui(int i) {\n" + + " }\n" + + "}\n"); + FileObject testSourceFO = FileUtil.toFileObject(testFile); + DataObject testSourceDO = DataObject.find(testSourceFO); + EditorCookie ec = (EditorCookie)testSourceDO.getCookie(EditorCookie.class); + final Document doc = ec.openDocument(); + Preferences preferences = MimeLookup.getLookup(JavaTokenId.language().mimeType()).lookup(Preferences.class); + String content = + "package hierbas.del.litoral;" + + "public class Test{" + + "public void taragui(int i){" + + "int i = switch(i){" + + "case 0->" + + "{System.out.println(i);" + + "break 5;}" + + "default->" + + "{System.out.println(\"DEFAULT\");" + + "break 6;}" + + "}" + + "}" + + "}\n"; + String golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " int i = switch( i )\n" + + " {\n" + + " case 0->\n" + + " {\n" + + " System.out.println(i);\n" + + " break 5;\n" + + " }\n" + + " default->\n" + + " {\n" + + " System.out.println(\"DEFAULT\");\n" + + " break 6;\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n"; + preferences.putBoolean("spaceBeforeSwitchParen", false); + preferences.putBoolean("spaceWithinSwitchParens", true); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", true); + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.NEW_LINE.name()); + reformat(doc, content, golden); + preferences.putBoolean("spaceBeforeSwitchParen", true); + preferences.putBoolean("spaceWithinSwitchParens", false); + preferences.putBoolean("spaceBeforeSwitchLeftBrace", true); + preferences.put("otherBracePlacement", CodeStyle.BracePlacement.SAME_LINE.name()); + content = + "package hierbas.del.litoral;" + + "public class Test{" + + "public void taragui(int i){" + + "Runnable r = switch(i){" + + "case 0-> new Runnable(){public void run(){}};" + + "default->" + + "{System.out.println(\"DEFAULT\");" + + "break new Runnable(){public void run(){}};}" + + "}" + + "}" + + "}\n"; + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public void taragui(int i) {\n" + + " Runnable r = switch (i) {\n" + + " case 0->\n" + + " new Runnable() {\n" + + " public void run() {\n" + + " }\n" + + " };\n" + + " default-> {\n" + + " System.out.println(\"DEFAULT\");\n" + + " break new Runnable() {\n" + + " public void run() {\n" + + " }\n" + + " };\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n"; + reformat(doc, content, golden); + content = + "package hierbas.del.litoral;" + + "public class Test{" + +"public int get(){ return 1; }" + + "public void taragui(int i){" + + "int i = switch(i){" + + "case 0-> get();" + + "default->" + + "{System.out.println(\"DEFAULT\");" + + "break get();}" + + "}" + + "}" + + "}\n"; + golden = + "package hierbas.del.litoral;\n\n" + + "public class Test {\n\n" + + " public int get() {\n" + + " return 1;\n" + + " }\n\n" + + " public void taragui(int i) {\n" + + " int i = switch (i) {\n" + + " case 0->\n" + + " get();\n" + + " default-> {\n" + + " System.out.println(\"DEFAULT\");\n" + + " break get();\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n"; + reformat(doc, content, golden); + } public void testDoWhile() throws Exception { testFile = new File(getWorkDir(), "Test.java"); --------------------------------------------------------------------- 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