IDEA-131863 Plugin.xml extension documentation: show EP definition in addition to javadoc

This commit is contained in:
Yann Cébron
2014-10-27 20:44:16 +01:00
parent d253c4201d
commit 22d8d2996c
3 changed files with 73 additions and 60 deletions
@@ -15,13 +15,16 @@
*/
package org.jetbrains.idea.devkit.references.extensions;
import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator;
import com.intellij.lang.documentation.DocumentationProviderEx;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTypesUtil;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlToken;
@@ -45,15 +48,23 @@ public class ExtensionPointDocumentationProvider extends DocumentationProviderEx
final XmlFile epDeclarationFile = (XmlFile)extensionPoint.getXmlTag().getContainingFile();
final Module epModule = ModuleUtilCore.findModuleForFile(epDeclarationFile.getVirtualFile(), element.getProject());
final PsiClass epClass = getExtensionPointClass(extensionPoint);
final String epPrefix = extensionPoint.getNamePrefix();
return
(epModule == null ? "" : "[" + epModule.getName() + "]") +
(epPrefix == null ? "" : " " + epPrefix) +
"\n" +
"<b>" + extensionPoint.getEffectiveName() + "</b>" +
" [" + epDeclarationFile.getName() + "]\n" +
(epClass == null ? "<unknown>" : epClass.getQualifiedName());
final PsiClass epClass = getExtensionPointClass(extensionPoint);
StringBuilder epClassText = new StringBuilder();
if (epClass != null) {
JavaDocInfoGenerator.generateType(epClassText, PsiTypesUtil.getClassType(epClass), epClass, true);
}
else {
epClassText.append("<unknown>");
}
return (epModule == null ? "" : "[" + epModule.getName() + "]") +
(epPrefix == null ? "" : " " + epPrefix) +
"<br/>" +
"<b>" + extensionPoint.getEffectiveName() + "</b>" +
" [" + epDeclarationFile.getName() + "]<br/>" +
epClassText.toString();
}
@Override
@@ -63,7 +74,16 @@ public class ExtensionPointDocumentationProvider extends DocumentationProviderEx
final PsiClass epClass = getExtensionPointClass(extensionPoint);
if (epClass != null) {
return JavaDocumentationProvider.generateExternalJavadoc(epClass);
StringBuilder sb = new StringBuilder();
sb.append("<em>EP Definition</em><br/>");
final String quickInfo = StringUtil.notNullize(getQuickNavigateInfo(element, originalElement));
sb.append(quickInfo);
sb.append("<br/>");
sb.append("<br/>");
sb.append("<em>EP Implementation</em>");
sb.append(JavaDocumentationProvider.generateExternalJavadoc(epClass));
return sb.toString();
}
return null;
}
@@ -1,51 +0,0 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.devkit.references.extensions
import com.intellij.codeInsight.documentation.DocumentationManager
import com.intellij.lang.documentation.DocumentationProvider
import com.intellij.openapi.application.PluginPathManager
import com.intellij.pom.PomTargetPsiElement
import com.intellij.psi.PsiElement
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import com.intellij.util.ui.UIUtil
import com.intellij.util.xml.DomTarget
class ExtensionPointDocumentationProviderTest extends LightCodeInsightFixtureTestCase {
@Override
String getBasePath() {
return PluginPathManager.getPluginHomePathRelative("devkit") + "/testData/references/extensions"
}
void testExtensionPointDocumentation() {
myFixture.configureByFiles("extensionPointDocumentation.xml",
"bar/MyExtensionPoint.java")
PsiElement originalElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset())
PomTargetPsiElement pomTargetPsiElement = assertInstanceOf(myFixture.getElementAtCaret(), PomTargetPsiElement.class)
DomTarget domTarget = assertInstanceOf(pomTargetPsiElement.getTarget(), DomTarget.class)
PsiElement epPsiElement = domTarget.getNavigationElement()
DocumentationProvider provider = DocumentationManager.getProviderFromElement(epPsiElement)
String docBody = UIUtil.getHtmlBody(provider.generateDoc(epPsiElement, originalElement))
assertEquals("""<small><b>bar</b></small><PRE>public interface <b>MyExtensionPoint</b></PRE>
MyExtensionPoint JavaDoc.""", docBody)
assertEquals("""[$myModule.name] foo
<b>bar</b> [extensionPointDocumentation.xml]
bar.MyExtensionPoint""", provider.getQuickNavigateInfo(epPsiElement, originalElement))
}
}
@@ -0,0 +1,44 @@
package org.jetbrains.idea.devkit.references.extensions;
import com.intellij.codeInsight.documentation.DocumentationManager;
import com.intellij.lang.documentation.DocumentationProvider;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.pom.PomTargetPsiElement;
import com.intellij.psi.PsiElement;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import com.intellij.util.xml.DomTarget;
public class ExtensionPointDocumentationProviderTest extends LightCodeInsightFixtureTestCase {
@Override
public String getBasePath() {
return PluginPathManager.getPluginHomePathRelative("devkit") + "/testData/references/extensions";
}
public void testExtensionPointDocumentation() {
myFixture.configureByFiles("extensionPointDocumentation.xml", "bar/MyExtensionPoint.java");
PsiElement originalElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
PomTargetPsiElement pomTargetPsiElement = assertInstanceOf(myFixture.getElementAtCaret(), PomTargetPsiElement.class);
DomTarget domTarget = assertInstanceOf(pomTargetPsiElement.getTarget(), DomTarget.class);
PsiElement epPsiElement = domTarget.getNavigationElement();
DocumentationProvider provider = DocumentationManager.getProviderFromElement(epPsiElement);
String epDefinition = "[" + myModule.getName() + "] foo<br/>" +
"<b>bar</b> " +
"[extensionPointDocumentation.xml]<br/>" +
"<a href=\"psi_element://bar.MyExtensionPoint\"><code>MyExtensionPoint</code></a>";
assertEquals(epDefinition,
provider.getQuickNavigateInfo(epPsiElement, originalElement));
assertEquals("<em>EP Definition</em><br/>" +
epDefinition +
"<br/><br/>" +
"<em>EP Implementation</em>" +
"<html><head> <style type=\"text/css\"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head>" +
"<body><small><b>bar</b></small><PRE>public interface <b>MyExtensionPoint</b></PRE>\n" +
" MyExtensionPoint JavaDoc.</body></html>",
provider.generateDoc(epPsiElement, originalElement));
}
}