From a3b7858035f8e5794535f56752e07643a2a51835 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 22 Aug 2013 18:16:43 +0200 Subject: [PATCH] completion should insert qualified names in javadoc according to the code style settings (IDEA-111023) --- .../JavaClassNameInsertHandler.java | 11 +++++- .../JavaDocCompletionContributor.java | 27 ++++++++++---- .../QualifiedImportedClassReference.java | 9 +++++ ...QualifiedImportedClassReference_after.java | 9 +++++ .../completion/JavadocCompletionTest.groovy | 37 ++++++++++--------- 5 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/javadoc/QualifiedImportedClassReference.java create mode 100644 java/java-tests/testData/codeInsight/completion/javadoc/QualifiedImportedClassReference_after.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java index 067a4258b148..d80b6b590c98 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -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() { + extend(CompletionType.BASIC, PsiJavaPatterns.psiElement().inside(PsiDocComment.class), new CompletionProvider() { @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); + } }); } diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedImportedClassReference.java b/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedImportedClassReference.java new file mode 100644 index 000000000000..b99b8be7b692 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedImportedClassReference.java @@ -0,0 +1,9 @@ +import java.io.*; + +/** + * {@link FileInputStr} + */ + +class Foo { + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedImportedClassReference_after.java b/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedImportedClassReference_after.java new file mode 100644 index 000000000000..537f3cf9ad6b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedImportedClassReference_after.java @@ -0,0 +1,9 @@ +import java.io.*; + +/** + * {@link java.io.FileInputStream} + */ + +class Foo { + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.groovy index 07465e7f4daa..2a1aef8aae38 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.groovy @@ -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 {