diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java index 538d2bebd977..b5ef8265c087 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java @@ -35,6 +35,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.IncorrectOperationException; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; @@ -74,6 +75,7 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor { fixers.add(new MethodCallFixer()); fixers.add(new IfConditionFixer()); fixers.add(new ForStatementFixer()); + fixers.add(new TernaryColonFixer()); fixers.add(new WhileConditionFixer()); fixers.add(new CatchDeclarationFixer()); fixers.add(new SwitchExpressionFixer()); @@ -107,7 +109,7 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor { private static final Key SMART_ENTER_TIMESTAMP = Key.create("smartEnterOriginalTimestamp"); public static class TooManyAttemptsException extends Exception {} - + private final JavadocFixer myJavadocFixer = new JavadocFixer(); @Override @@ -286,31 +288,22 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor { } } - PsiElement statementAtCaret = PsiTreeUtil.getParentOfType(atCaret, - PsiStatement.class, - PsiCodeBlock.class, - PsiMember.class, - PsiAnnotation.class, - PsiComment.class, - PsiImportStatementBase.class, - PsiPackageStatement.class - ); - - if (statementAtCaret instanceof PsiBlockStatement) return null; - - if (statementAtCaret != null && statementAtCaret.getParent() instanceof PsiForStatement) { - if (!PsiTreeUtil.hasErrorElements(statementAtCaret)) { - statementAtCaret = statementAtCaret.getParent(); + for (PsiElement each : SyntaxTraverser.psiApi().parents(atCaret).skip(1)) { + if (each instanceof PsiMember || each instanceof PsiAnnotation || each instanceof PsiImportStatementBase || each instanceof PsiPackageStatement) { + return each; + } + if (each instanceof PsiCodeBlock || each instanceof PsiComment) { + return null; + } + if (each instanceof PsiStatement) { + return each.getParent() instanceof PsiForStatement && !PsiTreeUtil.hasErrorElements(each) ? each.getParent() : each; + } + if (each instanceof PsiConditionalExpression && PsiUtilCore.hasErrorElementChild(each)) { + return each; } } - return statementAtCaret instanceof PsiStatement || - statementAtCaret instanceof PsiMember || - statementAtCaret instanceof PsiAnnotation || - statementAtCaret instanceof PsiImportStatementBase || - statementAtCaret instanceof PsiPackageStatement - ? statementAtCaret - : null; + return null; } protected void moveCaretInsideBracesIfAny(@NotNull final Editor editor, @NotNull final PsiFile file) throws IncorrectOperationException { diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/TernaryColonFixer.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/TernaryColonFixer.java new file mode 100644 index 000000000000..49f745390341 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/TernaryColonFixer.java @@ -0,0 +1,30 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.codeInsight.editorActions.smartEnter; + +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.EditorModificationUtil; +import com.intellij.psi.JavaTokenType; +import com.intellij.psi.PsiConditionalExpression; +import com.intellij.psi.PsiElement; +import com.intellij.util.IncorrectOperationException; + +class TernaryColonFixer implements Fixer { + + @Override + public void apply(Editor editor, JavaSmartEnterProcessor processor, PsiElement psiElement) throws IncorrectOperationException { + if (!(psiElement instanceof PsiConditionalExpression)) { + return; + } + + PsiConditionalExpression ternary = (PsiConditionalExpression)psiElement; + if (ternary.getThenExpression() == null || ternary.getNode().findChildByType(JavaTokenType.COLON) != null) { + return; + } + + + editor.getCaretModel().moveToOffset(ternary.getTextRange().getEndOffset()); + EditorModificationUtil.insertStringAtCaret(editor, ": "); + processor.setSkipEnter(true); + } + +} diff --git a/java/java-tests/testData/codeInsight/completeStatement/AddTernaryColon.java b/java/java-tests/testData/codeInsight/completeStatement/AddTernaryColon.java new file mode 100644 index 000000000000..9e9ff3531cda --- /dev/null +++ b/java/java-tests/testData/codeInsight/completeStatement/AddTernaryColon.java @@ -0,0 +1,5 @@ +class Test { + Object f(Object result) { + return x == null ? null + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completeStatement/AddTernaryColon_after.java b/java/java-tests/testData/codeInsight/completeStatement/AddTernaryColon_after.java new file mode 100644 index 000000000000..ce1892e7cacd --- /dev/null +++ b/java/java-tests/testData/codeInsight/completeStatement/AddTernaryColon_after.java @@ -0,0 +1,5 @@ +class Test { + Object f(Object result) { + return x == null ? null : + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/CompleteStatementTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/CompleteStatementTest.java index bd15c0468d01..81ebd6dcfa74 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/CompleteStatementTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/CompleteStatementTest.java @@ -185,6 +185,7 @@ public class CompleteStatementTest extends EditorActionTestCase { public void testSemicolonAfterLambda() { doTest(); } public void testModuleInfo() { doTest(); } public void testDoubleFieldDeclaration() { doTest(); } + public void testAddTernaryColon() { doTest(); } private void doTestBracesNextLineStyle() { myJavaSettings.BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;