From ccd4158ac90ca62f00e8217170a781dc4ac631df Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Tue, 17 Jun 2014 16:15:14 +0400 Subject: [PATCH] IDEA-125909 Groovy: trait methods accessed via 'super' are not resolved --- .../com/intellij/psi/PsiIntersectionType.java | 4 +- .../GrReferenceExpressionImpl.java | 19 +++-- .../lang/resolve/ResolveClassTest.groovy | 83 +++++++++++++++++++ .../lang/resolve/TypeInferenceTest.groovy | 8 +- 4 files changed, 103 insertions(+), 11 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/PsiIntersectionType.java b/java/java-psi-api/src/com/intellij/psi/PsiIntersectionType.java index 55a5e9d55260..d1a1d7299d15 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiIntersectionType.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiIntersectionType.java @@ -19,7 +19,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.Function; -import gnu.trove.THashSet; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -52,7 +52,7 @@ public class PsiIntersectionType extends PsiType.Stub { private static PsiType[] flattenAndRemoveDuplicates(PsiType[] conjuncts) { try { - Set flattened = flatten(conjuncts, new THashSet()); + Set flattened = flatten(conjuncts, ContainerUtil.newLinkedHashSet()); return flattened.toArray(createArray(flattened.size())); } catch (NoSuchElementException e) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java index 55ee36cc7bf7..4b8a032a5602 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java @@ -58,10 +58,7 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.*; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.literals.GrLiteralImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrBindingVariable; import org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.GrReferenceTypeEnhancer; -import org.jetbrains.plugins.groovy.lang.psi.util.GdkMethodUtil; -import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames; -import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils; -import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.*; import org.jetbrains.plugins.groovy.lang.resolve.ClosureMissingMethodContributor; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import org.jetbrains.plugins.groovy.lang.resolve.processors.*; @@ -604,7 +601,19 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpln() + } +} +''', PsiMethod).containingClass + + assertEquals("T1", clazz.qualifiedName) + } + + void testSuperInTrait2() { + def clazz = resolveByText(''' +trait T1 { + void on() { + println "T1" + } +} + +trait T2 { + void on() { + println "T2" + } +} + +trait LoggingHandler implements T1, T2 { + void on() { + super.on() + } +} +''', PsiMethod).containingClass + + assertEquals("T2", clazz.qualifiedName) + } + + void testSuperInTrait3() { + def clazz = resolveByText(''' +trait T1 { + void on() { + println "T1" + } +} + +trait LoggingHandler extends T1 { + void on() { + super.on() + } +} +''', PsiMethod).containingClass + + assertEquals("T1", clazz.qualifiedName) + } + + void testSuperInTrait4() { + def clazz = resolveByText(''' +trait T1 { + void on() { + println "T1" + } +} + +trait LoggingHandler implements T1 { + void on() { + super.on() + } +} +''', PsiMethod).containingClass + + assertEquals("T1", clazz.qualifiedName) + } private void doTest(String fileName = getTestName(false) + ".groovy") { resolve(fileName, PsiClass) } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.groovy index 40173b3ee230..92cb22802c6c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/TypeInferenceTest.groovy @@ -352,7 +352,7 @@ def foo(Integer a) { a.substring(2) } } -''', '[java.lang.String,java.lang.Integer]') +''', '[java.lang.Integer,java.lang.String]') } void testInferArgumentTypeFromMethod2() { @@ -363,7 +363,7 @@ def foo(Integer a) { bar(a) a.substring(2) } -''', '[java.lang.String,java.lang.Integer]') +''', '[java.lang.Integer,java.lang.String]') } void testInferArgumentTypeFromMethod3() { @@ -375,7 +375,7 @@ def foo(Integer a) { print a a.substring(2) } -''', '[java.lang.String,java.lang.Integer]') +''', '[java.lang.Integer,java.lang.String]') } void testInferArgumentTypeFromMethod4() { @@ -389,7 +389,7 @@ def foo(Integer a) { a.substring(2) } } -''', '[java.lang.String,java.lang.Integer]') +''', '[java.lang.Integer,java.lang.String]') } void testEmptyListOrListWithGenerics() {