completion should insert qualified names in javadoc according to the code style settings (IDEA-111023)

This commit is contained in:
peter
2013-08-22 18:19:33 +02:00
parent 3182137dba
commit a3b7858035
5 changed files with 66 additions and 27 deletions
@@ -24,7 +24,9 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.filters.FilterPositionUtil;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.javadoc.PsiDocTag;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
@@ -39,8 +41,6 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
@Override
public void handleInsert(final InsertionContext context, final JavaPsiClassReferenceElement item) {
final char c = context.getCompletionChar();
int offset = context.getTailOffset() - 1;
final PsiFile file = context.getFile();
if (PsiTreeUtil.findElementOfClassAtOffset(file, offset, PsiImportStatementBase.class, false) != null) {
@@ -57,6 +57,7 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
final Project project = context.getProject();
final Editor editor = context.getEditor();
final char c = context.getCompletionChar();
if (c == '#') {
context.setLaterRunnable(new Runnable() {
@Override
@@ -68,6 +69,12 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
AutoPopupController.getInstance(context.getProject()).autoPopupMemberLookup(context.getEditor(), null);
}
if (PsiTreeUtil.getParentOfType(position, PsiDocComment.class, false) != null &&
CodeStyleSettingsManager.getSettings(project).USE_FQ_CLASS_NAMES_IN_JAVADOC) {
AllClassesGetter.INSERT_FQN.handleInsert(context, item);
return;
}
if (position != null) {
PsiElement parent = position.getParent();
if (parent instanceof PsiJavaCodeReferenceElement) {
@@ -68,7 +68,7 @@ public class JavaDocCompletionContributor extends CompletionContributor {
public JavaDocCompletionContributor() {
extend(CompletionType.BASIC, PsiJavaPatterns.psiElement(JavaDocTokenType.DOC_TAG_NAME), new TagChooser());
extend(CompletionType.BASIC, PsiJavaPatterns.psiElement().inside(PsiDocTagValue.class), new CompletionProvider<CompletionParameters>() {
extend(CompletionType.BASIC, PsiJavaPatterns.psiElement().inside(PsiDocComment.class), new CompletionProvider<CompletionParameters>() {
@Override
protected void addCompletions(@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) {
final PsiElement position = parameters.getPosition();
@@ -85,12 +85,7 @@ public class JavaDocCompletionContributor extends CompletionContributor {
for (final CompletionElement _item : processor.getResults()) {
final Object element = _item.getElement();
LookupItem item = element instanceof PsiMethod ? new JavaMethodCallElement((PsiMethod)element) {
@Override
public void handleInsert(InsertionContext context) {
new MethodSignatureInsertHandler().handleInsert(context, this);
}
} : (LookupItem)LookupItemUtil.objectToLookupItem(element);
LookupItem item = createLookupItem(element);
if (onlyConstants) {
Object o = item.getObject();
if (!(o instanceof PsiField)) continue;
@@ -109,6 +104,24 @@ public class JavaDocCompletionContributor extends CompletionContributor {
JavaCompletionContributor.addAllClasses(parameters, result, new InheritorsHolder(position, result));
}
}
private LookupItem createLookupItem(final Object element) {
if (element instanceof PsiMethod) {
return new JavaMethodCallElement((PsiMethod)element) {
@Override
public void handleInsert(InsertionContext context) {
new MethodSignatureInsertHandler().handleInsert(context, this);
}
};
}
if (element instanceof PsiClass) {
JavaPsiClassReferenceElement classElement = new JavaPsiClassReferenceElement((PsiClass)element);
classElement.setInsertHandler(JavaClassNameInsertHandler.JAVA_CLASS_INSERT_HANDLER);
return classElement;
}
return (LookupItem)LookupItemUtil.objectToLookupItem(element);
}
});
}
@@ -0,0 +1,9 @@
import java.io.*;
/**
* {@link FileInputStr<caret>}
*/
class Foo {
}
@@ -0,0 +1,9 @@
import java.io.*;
/**
* {@link java.io.FileInputStream<caret>}
*/
class Foo {
}
@@ -21,6 +21,12 @@ import org.jetbrains.annotations.NotNull
*/
public class JavadocCompletionTest extends LightFixtureCompletionTestCase {
@Override
protected void tearDown() throws Exception {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = true
super.tearDown()
}
@Override
protected String getBasePath() {
return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/completion/javadoc/";
@@ -155,12 +161,7 @@ public class JavadocCompletionTest extends LightFixtureCompletionTestCase {
public void testShortenClassName() throws Throwable {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = false;
try {
doTest();
}
finally {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = true;
}
doTest();
}
public void testMethodBeforeSharp() throws Throwable {
@@ -171,12 +172,18 @@ public class JavadocCompletionTest extends LightFixtureCompletionTestCase {
doTest();
}
public void testShortenClassReference() throws Throwable { doTest(); }
public void testShortenClassReference() throws Throwable {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = false
doTest()
}
public void testQualifiedClassReference() throws Throwable {
configureByFile(getTestName(false) + ".java");
myFixture.complete(CompletionType.BASIC, 2);
checkResultByFile(getTestName(false) + "_after.java");
}
public void testQualifiedImportedClassReference() throws Throwable { doTest() }
public void testThrowsNonImported() throws Throwable {
configureByFile(getTestName(false) + ".java");
myFixture.complete(CompletionType.BASIC, 2);
@@ -269,10 +276,9 @@ class Impl extends Bar implements Foo {}
public void testShortenMethodParameterTypes() {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = false
try {
myFixture.addClass("package foo; public class Foo {}")
myFixture.addClass("package bar; public class Bar {}")
myFixture.configureByText "a.java", '''
myFixture.addClass("package foo; public class Foo {}")
myFixture.addClass("package bar; public class Bar {}")
myFixture.configureByText "a.java", '''
import foo.*;
import bar.*;
@@ -281,13 +287,8 @@ import bar.*;
*/
class Goo { void goo(Foo foo, Bar bar) {} }
'''
myFixture.completeBasic()
assert myFixture.editor.document.text.contains('@link #goo(Foo, Bar)')
}
finally {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = true
}
myFixture.completeBasic()
assert myFixture.editor.document.text.contains('@link #goo(Foo, Bar)')
}
public void testCustomReferenceProvider() throws Exception {