diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavadocTypedHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavadocTypedHandler.java index dfbdaa0a31ee..e8da3e2b6a48 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavadocTypedHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavadocTypedHandler.java @@ -49,10 +49,29 @@ public class JavadocTypedHandler extends TypedHandlerDelegate { @NotNull @Override public Result charTyped(char c, @NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) { - insertClosingTagIfNecessary(c, project, editor, file); + if (file instanceof PsiJavaFile && + (insertClosingTagIfNecessary(c, project, editor, file) || + adjustStartTagIndent(c, editor, file))) { + return Result.CONTINUE; + } return Result.CONTINUE; } + private static boolean adjustStartTagIndent(char c, @NotNull Editor editor, @NotNull PsiFile file) { + if (c == '@') { + final int offset = editor.getCaretModel().getOffset(); + PsiElement currElement = file.findElementAt(offset); + if (currElement instanceof PsiWhiteSpace) { + PsiElement prev = currElement.getPrevSibling(); + if (prev != null && prev.getNode().getElementType() == JavaDocTokenType.DOC_COMMENT_LEADING_ASTERISKS) { + editor.getDocument().replaceString(currElement.getTextRange().getStartOffset(), offset - 1, " "); + return true; + } + } + } + return false; + } + /** * Checks if it's necessary to insert closing tag on typed character. * @@ -63,7 +82,7 @@ public class JavadocTypedHandler extends TypedHandlerDelegate { * @return {@code true} if closing tag is inserted; {@code false} otherwise */ private static boolean insertClosingTagIfNecessary(char c, @NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) { - if (c != CLOSE_TAG_SYMBOL || !CodeInsightSettings.getInstance().JAVADOC_GENERATE_CLOSING_TAG || !(file instanceof PsiJavaFile)) { + if (c != CLOSE_TAG_SYMBOL || !CodeInsightSettings.getInstance().JAVADOC_GENERATE_CLOSING_TAG) { return false; } diff --git a/java/java-tests/testData/codeInsight/editorActions/javadocTypedHandler/docTagStart.java b/java/java-tests/testData/codeInsight/editorActions/javadocTypedHandler/docTagStart.java new file mode 100644 index 000000000000..9774efb94e87 --- /dev/null +++ b/java/java-tests/testData/codeInsight/editorActions/javadocTypedHandler/docTagStart.java @@ -0,0 +1,10 @@ +package com.company; + +public class Test { + /** + * @param a Description A + * @param b Description B + * + */ + void foo(int a, int b, int c) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/editorActions/javadocTypedHandler/docTagStart_after.java b/java/java-tests/testData/codeInsight/editorActions/javadocTypedHandler/docTagStart_after.java new file mode 100644 index 000000000000..6017ef890fad --- /dev/null +++ b/java/java-tests/testData/codeInsight/editorActions/javadocTypedHandler/docTagStart_after.java @@ -0,0 +1,10 @@ +package com.company; + +public class Test { + /** + * @param a Description A + * @param b Description B + * @ + */ + void foo(int a, int b, int c) {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/editorActions/JavadocTypedHandlerFunctionalTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/editorActions/JavadocTypedHandlerFunctionalTest.java index 89d1da77cb40..368cb7fcf4d3 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/editorActions/JavadocTypedHandlerFunctionalTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/editorActions/JavadocTypedHandlerFunctionalTest.java @@ -21,25 +21,29 @@ public class JavadocTypedHandlerFunctionalTest extends LightPlatformCodeInsightT private static final String BASE_PATH = "/codeInsight/editorActions/javadocTypedHandler/"; public void testEmptyTag() { - doTest(); + doTest('>'); } public void testComment() { - doTest(); + doTest('>'); } public void testCodeTag() { - doTest(); + doTest('>'); } public void testTypeParam() { - doTest(); + doTest('>'); } - private void doTest() { + public void testDocTagStart() { + doTest('@'); + } + + private void doTest(char typedChar) { String testName = getTestName(true); configureByFile(BASE_PATH + testName + ".java"); - type('>'); + type(typedChar); checkResultByFile(BASE_PATH + testName + "_after.java"); }