From a0a298cbb427f1bb797ac9c2d97c3cb1fb601ea5 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 3 Aug 2010 21:42:51 +0100 Subject: [PATCH] groovy inner classes have $ in their names: stubs should respect that --- .../generator/GroovyToJavaGenerator.java | 55 +++++++++++++------ .../groovy/compiler/GroovyCompilerTest.groovy | 24 ++++++++ 2 files changed, 62 insertions(+), 17 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/generator/GroovyToJavaGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/generator/GroovyToJavaGenerator.java index fd11d3e49540..ea8362ec6f04 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/generator/GroovyToJavaGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/generator/GroovyToJavaGenerator.java @@ -38,6 +38,7 @@ import com.intellij.psi.util.MethodSignatureBackedByPsiMethod; import com.intellij.psi.util.MethodSignatureUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; import com.intellij.util.containers.CollectionFactory; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashSet; @@ -805,14 +806,7 @@ public class GroovyToJavaGenerator { } } - private static String getTypeText(@Nullable PsiType type, @Nullable PsiElement context, boolean allowVarargs) { - if (context != null && type instanceof PsiClassType) { - final String accessible = findAccessibleSuperClass(context, ((PsiClassType)type).resolve()); - if (accessible != null) { - return accessible; - } - } - + private static String getTypeText(@Nullable PsiType type, @Nullable final PsiElement context, boolean allowVarargs) { if (type instanceof PsiArrayType) { String componentText = getTypeText(((PsiArrayType)type).getComponentType(), context, false); if (allowVarargs && type instanceof PsiEllipsisType) { @@ -825,28 +819,55 @@ public class GroovyToJavaGenerator { return CommonClassNames.JAVA_LANG_OBJECT; } + if (type instanceof PsiClassType) { + final PsiClass raw = ((PsiClassType)type).resolve(); + if (raw != null) { + final String qname = getClassQualifiedName(raw, context); + if (qname != null) { + final PsiType[] parameters = ((PsiClassType)type).getParameters(); + if (parameters.length > 0) { + return qname + "<" + StringUtil.join(parameters, new Function() { + @Override + public String fun(PsiType type) { + return getTypeText(type, context, false); + } + }, ", ") + ">"; + } + return qname; + } + } + } + String canonicalText = type.getCanonicalText(); return canonicalText != null ? canonicalText : type.getPresentableText(); } @Nullable - private static String findAccessibleSuperClass(PsiElement context, @Nullable PsiClass initialClass) { - if (initialClass == null) { + private static String getClassQualifiedName(PsiClass psiClass, @Nullable PsiElement context) { + if (context != null) { + psiClass = findAccessibleSuperClass(context, psiClass); + } + if (psiClass == null) { return null; } + if (psiClass instanceof GrTypeDefinition) { + final PsiClass container = psiClass.getContainingClass(); + if (container != null) { + return getClassQualifiedName(container, null) + "$" + psiClass.getName(); + } + } + return psiClass.getQualifiedName(); + } + + @Nullable + private static PsiClass findAccessibleSuperClass(@NotNull PsiElement context, @NotNull PsiClass initialClass) { PsiClass curClass = initialClass; final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(context.getProject()).getResolveHelper(); while (curClass != null && !resolveHelper.isAccessible(curClass, context, null)) { curClass = curClass.getSuperClass(); } - if (curClass != null && !initialClass.isEquivalentTo(curClass)) { - final String qname = curClass.getQualifiedName(); - if (qname != null) { - return qname; - } - } - return null; + return curClass; } CharTrie myTrie = new CharTrie(); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy index f1a86ac96a56..f5582f33124b 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy @@ -348,5 +348,29 @@ class Foo extends Bar { assertEmpty make() } + public void testDollarGroovyInnerClassUsagesInStubs() throws Exception { + def javaFile = myFixture.addClass(""" + public class JavaClass { + public static class InnerJavaClass {} + } +""") + myFixture.addFileToProject("WithInner.groovy", """ +class WithInner { + static class Inner {} +} +""") + assertEmpty make() + + myFixture.addFileToProject("Usage.groovy", """ +class Usage { + def foo(WithInner.Inner i) {} + def foo(JavaClass.InnerJavaClass i) {} +} +""") + + touch(javaFile.containingFile.virtualFile) + assertEmpty make() + } + }