IDEA-148873 Quick Doc can't navigate to another member's doc via anchor link

This commit is contained in:
Dmitry Batrak
2015-12-07 20:41:41 +03:00
parent 2defa12259
commit 71c0deeae0
7 changed files with 48 additions and 13 deletions
@@ -24,6 +24,7 @@ import com.intellij.codeInsight.documentation.DocumentationManagerUtil;
import com.intellij.javadoc.JavadocGeneratorRunProfile;
import com.intellij.lang.ASTNode;
import com.intellij.lang.LangBundle;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdk;
@@ -328,24 +329,28 @@ public class JavaDocInfoGenerator {
}
if (targetElement == null) return null;
String rawFragment = null;
if (fragment != null && targetElement instanceof PsiClass) {
if (fragment.contains("-") || fragment.contains("(")) {
rawFragment = fragment;
fragment = null; // reference to a method
for (PsiMethod method : ((PsiClass)targetElement).getMethods()) {
Set<String> signatures = JavaDocumentationProvider.getHtmlMethodSignatures(method, true);
if (signatures.contains(fragment)) {
targetElement = method;
fragment = null;
break;
}
}
}
else {
for (PsiField field : ((PsiClass)targetElement).getFields()) {
if (fragment.equals(field.getName())) {
rawFragment = fragment;
fragment = null; // reference to a field
targetElement = field;
fragment = null;
break;
}
}
}
}
return DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL + JavaDocUtil.getReferenceText(targetElement.getProject(), targetElement) +
(rawFragment == null ? "" : ('#' + rawFragment)) +
(fragment == null ? "" : DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL_REF_SEPARATOR + fragment);
}
@@ -637,13 +637,7 @@ public class JavaDocumentationProvider extends DocumentationProviderEx implement
final boolean useJava8Format = PsiUtil.isLanguageLevel8OrHigher(method);
final Set<String> signatures = new LinkedHashSet<String>();
signatures.add(formatMethodSignature(method, true, useJava8Format));
signatures.add(formatMethodSignature(method, false, useJava8Format));
signatures.add(formatMethodSignature(method, true, !useJava8Format));
signatures.add(formatMethodSignature(method, false, !useJava8Format));
final Set<String> signatures = getHtmlMethodSignatures(method, useJava8Format);
for (String signature : signatures) {
for (String classUrl : classUrls) {
urls.add(classUrl + "#" + signature);
@@ -673,6 +667,16 @@ public class JavaDocumentationProvider extends DocumentationProviderEx implement
}
}
public static Set<String> getHtmlMethodSignatures(PsiMethod method, boolean java8FormatFirst) {
final Set<String> signatures = new LinkedHashSet<String>();
signatures.add(formatMethodSignature(method, true, java8FormatFirst));
signatures.add(formatMethodSignature(method, false, java8FormatFirst));
signatures.add(formatMethodSignature(method, true, !java8FormatFirst));
signatures.add(formatMethodSignature(method, false, !java8FormatFirst));
return signatures;
}
private static String formatMethodSignature(PsiMethod method, boolean raw, boolean java8Format) {
int options = PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS;
int parameterOptions = PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_FQ_CLASS_NAMES;
@@ -0,0 +1,22 @@
<HTML><base href="placeholder"><style type="text/css"> ul.inheritance {
margin:0;
padding:0;
}
ul.inheritance li {
display:inline;
list-style:none;
}
ul.inheritance li ul.inheritance {
margin-left:15px;
padding-left:15px;
padding-top:1px;
}
</style><a name="m1--">
<!-- -->
</a>
<h3><a href="psi_element://com.jetbrains.LinkBetweenMethods"><code>com.jetbrains.LinkBetweenMethods</code></a></h3>
<pre>public&nbsp;void&nbsp;m1()</pre>
<div class="block"><a href="psi_element://com.jetbrains.LinkBetweenMethods#m2()"><code>m2()</code></a></div>
</li>
</ul>
</HTML>
@@ -104,6 +104,10 @@ public class JavaExternalDocumentationTest extends PlatformTestCase {
public void testLinkToPackageSummaryWithReference() throws Exception {
doTest("class Foo implements com.jetbrains.<caret>SimpleInterface {}");
}
public void testLinkBetweenMethods() throws Exception {
doTest("class Foo {{ new com.jetbrains.LinkBetweenMethods().<caret>m1(); }}");
}
private void doTest(String text) throws Exception {
String actualText = getDocumentationText(text);