diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ClassTagName.java b/java/java-tests/testData/codeInsight/completion/javadoc/ClassTagName.java new file mode 100644 index 000000000000..abc2e7dac3a4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ClassTagName.java @@ -0,0 +1,5 @@ +/** + * @ + */ + +class C{} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/Exception0.java b/java/java-tests/testData/codeInsight/completion/javadoc/Exception0.java new file mode 100644 index 000000000000..2ac46bd7fd8f --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/Exception0.java @@ -0,0 +1,6 @@ +class Test { + /** + * @ + */ + public void foo() throws Exception {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/Exception1.java b/java/java-tests/testData/codeInsight/completion/javadoc/Exception1.java new file mode 100644 index 000000000000..588cdfbb8479 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/Exception1.java @@ -0,0 +1,6 @@ +class Test { + /** + * @exception + */ + public void foo() throws Exception {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/Exception2.java b/java/java-tests/testData/codeInsight/completion/javadoc/Exception2.java new file mode 100644 index 000000000000..6e9971bd6b45 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/Exception2.java @@ -0,0 +1,6 @@ +class Test { + /** + * @exception + */ + public void foo() throws java.io.IOException, IllegalStateException {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/FieldTagName.java b/java/java-tests/testData/codeInsight/completion/javadoc/FieldTagName.java new file mode 100644 index 000000000000..fb7675a915a7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/FieldTagName.java @@ -0,0 +1,7 @@ +class C{ + + /** + * @ + */ + private int myField; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/FinishWithSharp.java b/java/java-tests/testData/codeInsight/completion/javadoc/FinishWithSharp.java new file mode 100644 index 000000000000..6d3a00974295 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/FinishWithSharp.java @@ -0,0 +1,13 @@ +/** + * Some text {@link Fub + */ + +class C{} + + +class Fubar { + void foo(); + void bar(); +} + +class Fubar2 {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/FinishWithSharp_after.java b/java/java-tests/testData/codeInsight/completion/javadoc/FinishWithSharp_after.java new file mode 100644 index 000000000000..4fdf43e093de --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/FinishWithSharp_after.java @@ -0,0 +1,13 @@ +/** + * Some text {@link Fubar# + */ + +class C{} + + +class Fubar { + void foo(); + void bar(); +} + +class Fubar2 {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/IDEADEV10620-after.java b/java/java-tests/testData/codeInsight/completion/javadoc/IDEADEV10620-after.java new file mode 100644 index 000000000000..5700ef639975 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/IDEADEV10620-after.java @@ -0,0 +1,7 @@ +/** + * @see #foo(Object) + */ +class Test1 { + public void foo(T bar) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/IDEADEV10620.java b/java/java-tests/testData/codeInsight/completion/javadoc/IDEADEV10620.java new file mode 100644 index 000000000000..b85fee876920 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/IDEADEV10620.java @@ -0,0 +1,7 @@ +/** + * @see #fo + */ +class Test1 { + public void foo(T bar) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/InlineReference.java b/java/java-tests/testData/codeInsight/completion/javadoc/InlineReference.java new file mode 100644 index 000000000000..705d068ed567 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/InlineReference.java @@ -0,0 +1,4 @@ +/** + * {@link java.} + */ +class A{} diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/InlineTagName.java b/java/java-tests/testData/codeInsight/completion/javadoc/InlineTagName.java new file mode 100644 index 000000000000..aa5d7371e56d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/InlineTagName.java @@ -0,0 +1,5 @@ +/** + * Some text {@ + */ + +class C{} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/MethodBeforeSharp.java b/java/java-tests/testData/codeInsight/completion/javadoc/MethodBeforeSharp.java new file mode 100644 index 000000000000..f0c1259efcb1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/MethodBeforeSharp.java @@ -0,0 +1,7 @@ +/** + * Some text {@link Fubar#fo# + */ + +class Fubar { + void foo(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/MethodBeforeSharp_after.java b/java/java-tests/testData/codeInsight/completion/javadoc/MethodBeforeSharp_after.java new file mode 100644 index 000000000000..a1513a1a7cf7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/MethodBeforeSharp_after.java @@ -0,0 +1,7 @@ +/** + * Some text {@link Fubar#foo()} # + */ + +class Fubar { + void foo(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/MethodTagName0.java b/java/java-tests/testData/codeInsight/completion/javadoc/MethodTagName0.java new file mode 100644 index 000000000000..dba8a7986c50 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/MethodTagName0.java @@ -0,0 +1,7 @@ +class C{ + + /** + * @ + */ + private int foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/MethodTagName1.java b/java/java-tests/testData/codeInsight/completion/javadoc/MethodTagName1.java new file mode 100644 index 000000000000..fb1cef2901c6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/MethodTagName1.java @@ -0,0 +1,7 @@ +class C{ + + /** + * @s + */ + private int foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue0.java b/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue0.java new file mode 100644 index 000000000000..db56f594a2c3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue0.java @@ -0,0 +1,7 @@ +class C{ + + /** + * @param + */ + private int foo(int a, char b, String c) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue1.java b/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue1.java new file mode 100644 index 000000000000..7d0f058dea8e --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue1.java @@ -0,0 +1,7 @@ +class C{ + + /** + * @param a + */ + private int foo(int a1, char a2, String a3) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue2.java b/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue2.java new file mode 100644 index 000000000000..fb32c578e601 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ParamValue2.java @@ -0,0 +1,9 @@ +class C{ + + /** + * @param a1 + * @param a + * @param a4 + */ + private int foo(int a1, char a2, String a3, boolean a4) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedClassReference.java b/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedClassReference.java new file mode 100644 index 000000000000..ae89665634a9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedClassReference.java @@ -0,0 +1,7 @@ +/** + * {@link FileInputStr} + */ + +class Foo { + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedClassReference_after.java b/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedClassReference_after.java new file mode 100644 index 000000000000..2617e1dadce7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/QualifiedClassReference_after.java @@ -0,0 +1,7 @@ +/** + * {@link java.io.FileInputStream} + */ + +class Foo { + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ReferenceProvider.java b/java/java-tests/testData/codeInsight/completion/javadoc/ReferenceProvider.java new file mode 100644 index 000000000000..8b2abf5af9d3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ReferenceProvider.java @@ -0,0 +1,4 @@ +/** + * @custom + */ +class A{} diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/See0.java b/java/java-tests/testData/codeInsight/completion/javadoc/See0.java new file mode 100644 index 000000000000..4620bfcac672 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/See0.java @@ -0,0 +1,7 @@ +class C{ + + /** + * @see # + */ + private int foo(int a, char b, String c) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/See1.java b/java/java-tests/testData/codeInsight/completion/javadoc/See1.java new file mode 100644 index 000000000000..3ff4c483f89b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/See1.java @@ -0,0 +1,7 @@ +class C{ + + /** + * @see #n + */ + private int foo(int a, char b, String c) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/See2.java b/java/java-tests/testData/codeInsight/completion/javadoc/See2.java new file mode 100644 index 000000000000..f8eed0a74d49 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/See2.java @@ -0,0 +1,9 @@ +class C{ + + /** + * @see #n + * + * @since + */ + private int foo(int a, char b, String c) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/See3.java b/java/java-tests/testData/codeInsight/completion/javadoc/See3.java new file mode 100644 index 000000000000..d0f05428ea1e --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/See3.java @@ -0,0 +1,10 @@ +class C{ + private int myField; + + /** + * @see # + * + * @since + */ + private int foo(int a, char b, String c) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/See4.java b/java/java-tests/testData/codeInsight/completion/javadoc/See4.java new file mode 100644 index 000000000000..36ae28656324 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/See4.java @@ -0,0 +1,13 @@ +class C{ + private int myField; + + /** + * @see + * + * @since + */ + private int foo(int a, char b, String c) {} + + class A{} + class B{} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/See5.java b/java/java-tests/testData/codeInsight/completion/javadoc/See5.java new file mode 100644 index 000000000000..211b366ae631 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/See5.java @@ -0,0 +1,9 @@ +class C{ + /** + * @see A# + */ + private int myField; + + class A{ private String myName; private int foo(int a, char b, String c) {} } + class B{} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/See6.java b/java/java-tests/testData/codeInsight/completion/javadoc/See6.java new file mode 100644 index 000000000000..c3b012be8a46 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/See6.java @@ -0,0 +1,11 @@ +class C{ + /** + * @see #perform( + */ + private int myField; + + public void perform() {} + public void perform(int a) {} + public void perform(int a, String b) {} + public void perform(String b) {} +} diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/See6After.java b/java/java-tests/testData/codeInsight/completion/javadoc/See6After.java new file mode 100644 index 000000000000..fe9a26e3891c --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/See6After.java @@ -0,0 +1,11 @@ +class C{ + /** + * @see #perform(int, String) + */ + private int myField; + + public void perform() {} + public void perform(int a) {} + public void perform(int a, String b) {} + public void perform(String b) {} +} diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassName.java b/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassName.java new file mode 100644 index 000000000000..c883ec463d16 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassName.java @@ -0,0 +1,7 @@ +package foo; + +/** + * Some text {@link Fub + */ +class Fubar { +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassName_after.java b/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassName_after.java new file mode 100644 index 000000000000..f364c62b6d04 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassName_after.java @@ -0,0 +1,7 @@ +package foo; + +/** + * Some text {@link Fubar + */ +class Fubar { +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassReference.java b/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassReference.java new file mode 100644 index 000000000000..b99b8be7b692 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassReference.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/ShortenClassReference_after.java b/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassReference_after.java new file mode 100644 index 000000000000..31b15cf7fb4c --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ShortenClassReference_after.java @@ -0,0 +1,9 @@ +import java.io.*; + +/** + * {@link FileInputStream} + */ + +class Foo { + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ThrowsNonImported.java b/java/java-tests/testData/codeInsight/completion/javadoc/ThrowsNonImported.java new file mode 100644 index 000000000000..921e384be1c2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ThrowsNonImported.java @@ -0,0 +1,7 @@ +/** + * @throws NoSEleEx + */ + +class Foo { + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/javadoc/ThrowsNonImported_after.java b/java/java-tests/testData/codeInsight/completion/javadoc/ThrowsNonImported_after.java new file mode 100644 index 000000000000..1f1a0c2dca94 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/javadoc/ThrowsNonImported_after.java @@ -0,0 +1,7 @@ +/** + * @throws java.util.NoSuchElementException + */ + +class Foo { + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.java new file mode 100644 index 000000000000..7aed97b25e6c --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.java @@ -0,0 +1,232 @@ +package com.intellij.codeInsight.completion; + +import com.intellij.JavaTestUtil; +import com.intellij.codeInsight.CodeInsightSettings; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInspection.javaDoc.JavaDocLocalInspection; +import com.intellij.lang.StdLanguages; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceBase; +import com.intellij.psi.PsiReferenceProvider; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.impl.source.resolve.reference.PsiReferenceRegistrarImpl; +import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry; +import com.intellij.psi.javadoc.PsiDocTag; +import com.intellij.util.ObjectUtils; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; + + +/** + * @author mike + */ +public class JavadocCompletionTest extends LightFixtureCompletionTestCase { + + @Override + protected String getBasePath() { + return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/completion/javadoc/"; + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(new JavaDocLocalInspection()); + } + + public void testNamesInClass() throws Exception { + configureByFile("ClassTagName.java"); + assertStringItems("author", "deprecated", "param", "see", "serial", "since", "version"); + } + + public void testNamesInField() throws Exception { + configureByFile("FieldTagName.java"); + assertStringItems("deprecated", "see", "serial", "serialField", "since"); + } + + public void testNamesInMethod0() throws Exception { + configureByFile("MethodTagName0.java"); + assertStringItems("deprecated", "exception", "param", "return", "see", "serialData", "since", "throws"); + } + + public void testNamesInMethod1() throws Exception { + configureByFile("MethodTagName1.java"); + assertStringItems("see", "serialData", "since"); + } + + public void testParamValueCompletion() throws Exception { + configureByFile("ParamValue0.java"); + assertStringItems("a", "b", "c"); + } + + public void testParamValueWithPrefixCompletion() throws Exception { + configureByFile("ParamValue1.java"); + assertStringItems("a1", "a2", "a3"); + } + + public void testDescribedParameters() throws Exception { + configureByFile("ParamValue2.java"); + assertStringItems("a2", "a3"); + } + + public void testSee0() throws Exception { + configureByFile("See0.java"); + assertStringItems("foo", "clone", "equals", "finalize", "getClass", "hashCode", "notify", "notifyAll", "Object", "registerNatives", "toString", "wait", "wait", "wait"); + } + + public void testSee1() throws Exception { + configureByFile("See1.java"); + assertStringItems("notify", "notifyAll"); + } + + public void testSee2() throws Exception { + configureByFile("See2.java"); + assertStringItems("notify", "notifyAll"); + } + + public void testSee3() throws Exception { + configureByFile("See3.java"); + + assertTrue(getLookupElementStrings().containsAll(Arrays.asList("foo", "myField"))); + } + + @NotNull + private List getLookupElementStrings() { + return ObjectUtils.assertNotNull(myFixture.getLookupElementStrings()); + } + + public void testSee4() throws Exception { + configureByFile("See4.java"); + + assertTrue(getLookupElementStrings().containsAll(Arrays.asList("A", "B", "C"))); + } + + public void testSee5() throws Exception { + configureByFile("See5.java"); + + assertTrue(getLookupElementStrings().containsAll(Arrays.asList("foo", "myName"))); + } + + public void testIDEADEV10620() throws Exception { + configureByFile("IDEADEV10620.java"); + + checkResultByFile("IDEADEV10620-after.java"); + } + + public void testException0() throws Exception { + configureByFile("Exception0.java"); + assertStringItems("deprecated", "exception", "param", "see", "serialData", "since", "throws"); + } + + public void testException1() throws Exception { + configureByFile("Exception1.java"); + assertTrue(myItems.length > 18); + } + + public void testException2() throws Exception { + myFixture.configureByFile("Exception2.java"); + myFixture.complete(CompletionType.SMART); + assertStringItems("IllegalStateException", "IOException"); + } + + public void testInlineLookup() throws Exception { + configureByFile("InlineTagName.java"); + assertStringItems("code", "docRoot", "inheritDoc", "link", "linkplain", "literal", "value"); + } + + public void testFinishWithSharp() throws Throwable { + boolean old = CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_CODE_COMPLETION; + CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_CODE_COMPLETION = false; + try { + checkFinishWithSharp(CompletionType.BASIC); + } + finally { + CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_CODE_COMPLETION = old; + } + } + + public void testFinishWithSharpClassName() throws Throwable { + checkFinishWithSharp(CompletionType.CLASS_NAME); + } + + private void checkFinishWithSharp(CompletionType completionType) throws Exception { + myFixture.configureByFile("FinishWithSharp.java"); + myFixture.complete(completionType); + type('#'); + checkResultByFile("FinishWithSharp_after.java"); + final List items = getLookup().getItems(); + assertEquals("bar", items.get(0).getLookupString()); + assertEquals("foo", items.get(1).getLookupString()); + } + + 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; + } + } + + public void testMethodBeforeSharp() throws Throwable { + doTest(); + } + + public void testShortenClassReference() throws Throwable { doTest(); } + public void testQualifiedClassReference() throws Throwable { + configureByFile(getTestName(false) + ".java"); + myFixture.complete(CompletionType.BASIC, 2); + checkResultByFile(getTestName(false) + "_after.java"); + } + public void testThrowsNonImported() throws Throwable { + configureByFile(getTestName(false) + ".java"); + myFixture.complete(CompletionType.BASIC, 2); + checkResultByFile(getTestName(false) + "_after.java"); + } + + private void doTest() throws Exception { + configureByFile(getTestName(false) + ".java"); + checkResultByFile(getTestName(false) + "_after.java"); + } + + public void testInlinePackageReferenceCompletion() throws Exception { + configureByFile("InlineReference.java"); + assertTrue(getLookupElementStrings().containsAll(Arrays.asList("io", "lang", "util"))); + } + + public void testCustomReferenceProvider() throws Exception { + PsiReferenceRegistrarImpl registrar = + (PsiReferenceRegistrarImpl) ReferenceProvidersRegistry.getInstance().getRegistrar(StdLanguages.JAVA); + PsiReferenceProvider provider = new PsiReferenceProvider() { + @Override + @NotNull + public PsiReference[] getReferencesByElement(@NotNull final PsiElement element, @NotNull final ProcessingContext context) { + return new PsiReference[]{new PsiReferenceBase(element) { + + @Override + public PsiElement resolve() { + return element; + } + + @Override + @NotNull + public Object[] getVariants() { + return new Object[]{"1", "2", "3"}; + } + }}; + } + }; + try { + registrar.registerReferenceProvider(PsiDocTag.class, provider); + configureByFile("ReferenceProvider.java"); + assertStringItems("1", "2", "3"); + } + finally { + registrar.unregisterReferenceProvider(PsiDocTag.class, provider); + } + } +}