From 117a353cc6c6ae618225ec79182b42561de830de Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Tue, 26 Jan 2010 18:13:37 +0300 Subject: [PATCH] Context Info in Groovy --- .../documentation/GroovyDocumentationProvider.java | 56 ++++++++++++++++++++-- .../lang/psi/impl/synthetic/GroovyScriptClass.java | 8 +++- .../groovy/lang/formatter/EnterActionTest.java | 2 + .../groovy/testdata/groovy/enterAction/gdoc10.test | 10 ++++ .../groovy/testdata/groovy/enterAction/gdoc11.test | 9 ++++ .../groovy/testdata/groovy/enterAction/gdoc6.test | 1 + .../groovy/testdata/groovy/enterAction/gdoc7.test | 1 + 7 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/enterAction/gdoc10.test create mode 100644 plugins/groovy/testdata/groovy/enterAction/gdoc11.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java index 158e30bb39..4be79cfd4a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java @@ -15,15 +15,20 @@ */ package org.jetbrains.plugins.groovy.lang.documentation; +import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.editorActions.CodeDocumentationUtil; +import com.intellij.codeInsight.javadoc.JavaDocUtil; import com.intellij.lang.CodeDocumentationAwareCommenter; import com.intellij.lang.LanguageCommenters; import com.intellij.lang.documentation.CodeDocumentationProvider; +import com.intellij.lang.java.JavaDocumentationProvider; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.impl.source.javadoc.PsiDocParamRef; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.javadoc.PsiDocTag; +import com.intellij.psi.util.PsiFormatUtil; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NonNls; @@ -32,6 +37,7 @@ import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocComment; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GrDocCommentOwner; import org.jetbrains.plugins.groovy.lang.groovydoc.psi.impl.GrDocCommentUtil; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; @@ -53,7 +59,6 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider { @NonNls private static final String PARAM_TAG = "@param"; @NonNls private static final String RETURN_TAG = "@return"; @NonNls private static final String THROWS_TAG = "@throws"; - @NonNls public static final String HTML_EXTENSION = ".html"; @Nullable public String getQuickNavigateInfo(PsiElement element) { @@ -213,13 +218,54 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider { @Nullable public List getUrlFor(PsiElement element, PsiElement originalElement) { - return null; + return JavaDocumentationProvider.getExternalJavaDocUrl(element); } @Nullable public String generateDoc(PsiElement element, PsiElement originalElement) { - //todo - return null; + if (element instanceof GrReferenceExpression) { + return getMethodCandidateInfo((GrReferenceExpression)element); + } + + if (element instanceof GrGdkMethod) { + element = ((GrGdkMethod)element).getStaticMethod(); + } + + final GrDocComment doc = PsiTreeUtil.getParentOfType(originalElement, GrDocComment.class); + if (doc != null) { + element = GrDocCommentUtil.findDocOwner(doc); + } + + return JavaDocumentationProvider.generateExternalJavadoc(element); + } + + private static String getMethodCandidateInfo(GrReferenceExpression expr) { + final GroovyResolveResult[] candidates = expr.multiResolve(false); + final String text = expr.getText(); + if (candidates.length > 0) { + @NonNls final StringBuffer sb = new StringBuffer(); + for (final GroovyResolveResult candidate : candidates) { + final PsiElement element = candidate.getElement(); + if (!(element instanceof PsiMethod)) { + continue; + } + final String str = PsiFormatUtil.formatMethod((PsiMethod)element, candidate.getSubstitutor(), + PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_TYPE | PsiFormatUtil.SHOW_PARAMETERS, + PsiFormatUtil.SHOW_TYPE); + createElementLink(sb, element, str); + } + return CodeInsightBundle.message("javadoc.candiates", text, sb); + } + return CodeInsightBundle.message("javadoc.candidates.not.found", text); + } + + private static void createElementLink(@NonNls final StringBuffer sb, final PsiElement element, final String str) { + sb.append("  "); + sb.append(str); + sb.append(""); + sb.append("
"); } @Nullable @@ -229,7 +275,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider { @Nullable public PsiElement getDocumentationElementForLink(PsiManager psiManager, String link, PsiElement context) { - return null; + return JavaDocUtil.findReferenceTarget(psiManager, link, context); } public PsiComment findExistingDocComment(PsiComment contextElement) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GroovyScriptClass.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GroovyScriptClass.java index f678b14f02..2bfb2b289f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GroovyScriptClass.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GroovyScriptClass.java @@ -153,7 +153,13 @@ public class GroovyScriptClass extends LightElement implements GrMemberOwner, Sy @NotNull public PsiClass[] getSupers() { - return new PsiClass[]{getSuperClass()}; + final PsiClass superClass = getSuperClass(); + if (superClass != null) { + return new PsiClass[]{superClass}; + } + else { + return PsiClass.EMPTY_ARRAY; + } } @NotNull diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.java index fe5babab46..c09edd81c4 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.java @@ -56,6 +56,8 @@ public class EnterActionTest extends GroovyFormatterTestCase { public void testGdoc7() throws Throwable { doTest(); } public void testGdoc8() throws Throwable { doTest(); } public void testGdoc9() throws Throwable { doTest(); } + public void testGdoc10() throws Throwable { doTest(); } + public void testGdoc11() throws Throwable { doTest(); } public void testGRVY_953() throws Throwable { doTest(); } public void testGstring1() throws Throwable { doTest(); } public void testGstring10() throws Throwable { doTest(); } diff --git a/plugins/groovy/testdata/groovy/enterAction/gdoc10.test b/plugins/groovy/testdata/groovy/enterAction/gdoc10.test new file mode 100644 index 0000000000..d94133ca19 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/gdoc10.test @@ -0,0 +1,10 @@ +/** +def foo(int x, int y){} +----- +/** + * + * @param x + * @param y + * @return + */ +def foo(int x, int y){} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/gdoc11.test b/plugins/groovy/testdata/groovy/enterAction/gdoc11.test new file mode 100644 index 0000000000..018419abb4 --- /dev/null +++ b/plugins/groovy/testdata/groovy/enterAction/gdoc11.test @@ -0,0 +1,9 @@ +/** +void foo(int x, int y){} +----- +/** + * + * @param x + * @param y + */ +void foo(int x, int y){} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/gdoc6.test b/plugins/groovy/testdata/groovy/enterAction/gdoc6.test index 13440fd15a..75f346cccd 100644 --- a/plugins/groovy/testdata/groovy/enterAction/gdoc6.test +++ b/plugins/groovy/testdata/groovy/enterAction/gdoc6.test @@ -3,6 +3,7 @@ ----- /** * + * @return */ def foo() { } \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/enterAction/gdoc7.test b/plugins/groovy/testdata/groovy/enterAction/gdoc7.test index 5a082f0f96..93d1901b80 100644 --- a/plugins/groovy/testdata/groovy/enterAction/gdoc7.test +++ b/plugins/groovy/testdata/groovy/enterAction/gdoc7.test @@ -4,6 +4,7 @@ def foo() { ----- /** * + * @return */ def foo() { -- 2.11.4.GIT