IJ-CR-137825 [java-typing] IDEA-354366 close braces after switch rule

- support multiline case rules

GitOrigin-RevId: 8c5dd5a3c4cb6b699c565ef39c2c29deacffc7e2
This commit is contained in:
Mikhail Pyltsin
2024-06-26 14:34:55 +00:00
committed by intellij-monorepo-bot
parent cfbeab579e
commit 42968dfc2f
14 changed files with 191 additions and 12 deletions
@@ -174,18 +174,8 @@ public abstract class AbstractBasicJavaTypedHandler extends TypedHandlerDelegate
if (CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET && afterArrowInCase(leaf) &&
iterator.getTokenType() != JavaTokenType.LBRACKET) {
ASTNode rule = BasicJavaAstTreeUtil.getParentOfType(leaf.getNode(), BASIC_SWITCH_LABELED_RULE);
if (rule != null) {
int firstOffset = editor.getCaretModel().getOffset();
editor.getDocument().insertString(firstOffset, "{\n");
editor.getCaretModel().moveToOffset(firstOffset + 1);
int secondOffset = rule.getTextRange().getEndOffset() + 2;
editor.getDocument().insertString(secondOffset, "\n}");
PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument());
CodeStyleManager.getInstance(project).adjustLineIndent(file, secondOffset + 1);
CodeStyleManager.getInstance(project).adjustLineIndent(file, firstOffset + 2);
return Result.STOP;
}
Result stop = processOpenBraceInOneLineCaseRule(project, editor, file, leaf);
if (stop != null) return stop;
}
if (BasicJavaAstTreeUtil.getParentOfType(leaf, BASIC_CODE_BLOCK, false, MEMBER_SET) != null &&
@@ -199,6 +189,51 @@ public abstract class AbstractBasicJavaTypedHandler extends TypedHandlerDelegate
return Result.CONTINUE;
}
private static @Nullable Result processOpenBraceInOneLineCaseRule(@NotNull Project project,
@NotNull Editor editor,
@NotNull PsiFile file,
@NotNull PsiElement leaf) {
ASTNode rule = BasicJavaAstTreeUtil.getParentOfType(leaf.getNode(), BASIC_SWITCH_LABELED_RULE);
if(rule != null) {
while (true) {
ASTNode next = rule.getTreeNext();
if (next.getElementType() == TokenType.WHITE_SPACE) {
next = next.getTreeNext();
}
if(BasicJavaAstTreeUtil.is(next, BASIC_THROW_STATEMENT) ||
BasicJavaAstTreeUtil.is(next, BASIC_EXPRESSION_STATEMENT)) {
rule = next;
continue;
}
break;
}
}
if (rule != null) {
int firstOffset = editor.getCaretModel().getOffset();
editor.getDocument().insertString(firstOffset, "{");
boolean hasFirstBreakLine = true;
int expectedIndex = firstOffset - leaf.getTextRange().getStartOffset();
if (expectedIndex >= 0 && expectedIndex < leaf.getText().length()) {
String text = leaf.getText().substring(expectedIndex);
if (!text.contains("\n") &&
!text.contains("\r")) {
hasFirstBreakLine = false;
editor.getDocument().insertString(firstOffset + 1, "\n");
}
}
editor.getCaretModel().moveToOffset(firstOffset + 1);
int secondOffset = rule.getTextRange().getEndOffset() + (hasFirstBreakLine ? 1 : 2);
editor.getDocument().insertString(secondOffset, "\n}");
PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument());
CodeStyleManager.getInstance(project).adjustLineIndent(file, secondOffset + 1);
if (!hasFirstBreakLine) {
CodeStyleManager.getInstance(project).adjustLineIndent(file, firstOffset + 2);
}
return Result.STOP;
}
return null;
}
private static boolean afterArrowInCase(@Nullable PsiElement leaf) {
if (leaf == null) return false;
PsiElement prevLeaf = PsiTreeUtil.prevVisibleLeaf(leaf);
@@ -180,6 +180,36 @@ public abstract class AbstractBasicJavaTypingTest extends BasePlatformTestCase {
doTest('{');
}
public void testCloseBracesAfterSwitchRuleNewLine() {
setLanguageLevel(LanguageLevel.JDK_21);
doTest('{');
}
public void testCloseBracesAfterSwitchRuleNewLine2() {
setLanguageLevel(LanguageLevel.JDK_21);
doTest('{');
}
public void testCloseBracesAfterSwitchRule2ThrowStatement() {
setLanguageLevel(LanguageLevel.JDK_21);
doTest('{');
}
public void testCloseBracesAfterSwitchRule2Expression() {
setLanguageLevel(LanguageLevel.JDK_21);
doTest('{');
}
public void testCloseBracesAfterSwitchRule3Expression() {
setLanguageLevel(LanguageLevel.JDK_21);
doTest('{');
}
public void testCloseBracesAfterSwitchRule3ExpressionOldLine() {
setLanguageLevel(LanguageLevel.JDK_21);
doTest('{');
}
protected void setLanguageLevel(@NotNull LanguageLevel level) {
IdeaTestUtil.setProjectLanguageLevel(getProject(), level, myFixture.getTestRootDisposable());
}
@@ -0,0 +1,10 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> {<caret>
System.out.println("1");
System.out.println("1");
}
}
}
}
@@ -0,0 +1,9 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> <caret>
System.out.println("1");
System.out.println("1");
}
}
}
@@ -0,0 +1,10 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> {<caret>
System.out.println("1");
throw new RuntimeException();
}
}
}
}
@@ -0,0 +1,9 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> <caret>
System.out.println("1");
throw new RuntimeException();
}
}
}
@@ -0,0 +1,11 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> {<caret>
System.out.println("1");
System.out.println("1");
System.out.println("1");
}
}
}
}
@@ -0,0 +1,9 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> <caret> System.out.println("1");
System.out.println("1");
System.out.println("1");
}
}
}
@@ -0,0 +1,11 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> {<caret>
System.out.println("1");
System.out.println("1");
System.out.println("1");
}
}
}
}
@@ -0,0 +1,10 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> <caret>
System.out.println("1");
System.out.println("1");
System.out.println("1");
}
}
}
@@ -0,0 +1,10 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object ->
{<caret>
System.out.println("1");
}
}
}
}
@@ -0,0 +1,8 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object ->
<caret> System.out.println("1");
}
}
}
@@ -0,0 +1,9 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> {<caret>
System.out.println("1");
}
}
}
}
@@ -0,0 +1,8 @@
class X {
public static void main(String[] args) {
switch (new Object()){
case Object object -> <caret>
System.out.println("1");
}
}
}