feat(javadoc-handler): basic typing assistance

GitOrigin-RevId: 500c7ede653a91d1ea67c85efc2248657c35ccab
This commit is contained in:
Mathias Boulay
2024-09-17 12:20:46 +02:00
committed by intellij-monorepo-bot
parent d6d13853e6
commit b7d5b6900c
7 changed files with 36 additions and 4 deletions

View File

@@ -3,6 +3,7 @@ package com.intellij.codeInsight.editorActions;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.editor.CaretModel;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -34,7 +35,7 @@ public abstract class AbstractBasicJavadocTypedHandler extends TypedHandlerDeleg
public Result charTyped(char c, @NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) {
if (isJavaFile(file)) {
if (!insertClosingTagIfNecessary(c, project, editor, file)) {
adjustStartTagIndent(c, editor, file);
adjustStartIndent(c, editor, file);
}
}
return Result.CONTINUE;
@@ -42,7 +43,7 @@ public abstract class AbstractBasicJavadocTypedHandler extends TypedHandlerDeleg
public abstract boolean isJavaFile(@Nullable PsiFile file);
private static void adjustStartTagIndent(char c, @NotNull Editor editor, @NotNull PsiFile file) {
private static void adjustStartIndent(char c, @NotNull Editor editor, @NotNull PsiFile file) {
if (c == '@') {
final int offset = editor.getCaretModel().getOffset();
PsiElement currElement = file.findElementAt(offset);
@@ -52,6 +53,21 @@ public abstract class AbstractBasicJavadocTypedHandler extends TypedHandlerDeleg
editor.getDocument().replaceString(currElement.getTextRange().getStartOffset(), offset - 1, " ");
}
}
return;
}
if (c == '/') {
// Insert a single space when adding the initial leading slashes
final CaretModel caretModel = editor.getCaretModel();
final int caretOffset = caretModel.getOffset();
PsiElement currElement = file.findElementAt(caretOffset - 1);
if (currElement instanceof PsiWhiteSpace) {
PsiElement prev = currElement.getPrevSibling();
if (prev != null && prev.getNode().getElementType() == JavaTokenType.END_OF_LINE_COMMENT && prev.getText().equals("//")) {
editor.getDocument().insertString(prev.getTextRange().getEndOffset() + 1, " ");
caretModel.moveToOffset(caretOffset + 1);
}
}
}
}

View File

@@ -31,7 +31,7 @@ public class JavaQuoteHandler extends SimpleTokenSetQuoteHandler implements Java
JavaTokenType.RBRACE));
public JavaQuoteHandler() {
super(TokenSet.orSet(BASIC_TEXT_LITERALS, TokenSet.create(JavaDocTokenType.DOC_TAG_VALUE_QUOTE)));
super(TokenSet.orSet(BASIC_TEXT_LITERALS, TokenSet.create(JavaDocTokenType.DOC_TAG_VALUE_QUOTE, JavaDocTokenType.DOC_INLINE_CODE_FENCE, JavaDocTokenType.DOC_CODE_FENCE)));
}
@Override

View File

@@ -24,7 +24,9 @@ public class JavaBraceMatcher implements PairedBraceMatcher {
new BracePair(JavaTokenType.LBRACE, JavaTokenType.RBRACE, true),
new BracePair(JavaTokenType.LBRACKET, JavaTokenType.RBRACKET, false),
new BracePair(JavaDocTokenType.DOC_INLINE_TAG_START, JavaDocTokenType.DOC_INLINE_TAG_END, false),
new BracePair(JavaTokenType.LT, JavaTokenType.GT, false)
new BracePair(JavaTokenType.LT, JavaTokenType.GT, false),
new BracePair(JavaDocTokenType.DOC_LBRACKET, JavaDocTokenType.DOC_RBRACKET, false),
new BracePair(JavaDocTokenType.DOC_LPAREN, JavaDocTokenType.DOC_RPAREN, false)
};
public JavaBraceMatcher() {
}

View File

@@ -28,6 +28,10 @@ public abstract class AbstractBasicJavadocTypedHandlerFunctionalTest extends Lig
doTest('@');
}
public void testStartMarkdownComment() {
doTest('/');
}
private void doTest(char typedChar) {
String testName = getTestName(true);
configureByFile(BASE_PATH + testName + ".java");

View File

@@ -0,0 +1,2 @@
//<caret>
public class A {}

View File

@@ -0,0 +1,2 @@
/// <caret>
public class A {}

View File

@@ -42,4 +42,10 @@ public class JavaQuoteTest extends AbstractBasicJavaQuoteTest {
doFileTest("/**\n* {@snippet <caret> :}\n*/\nclass A {\n}",
"/**\n* {@snippet '<caret>' :}\n*/\nclass A {\n}", '\'');
}
public void testJavadocMarkdownQuotes(){
doFileTest("/// <caret>", "/// [<caret>]", '[');
doFileTest("/// <caret>", "/// (<caret>)", '(');
doFileTest("/// <caret>", "/// `<caret>`", '`');
}
}