diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceResolveRunner.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceResolveRunner.java index fdd9b1129fc4..539b5fdb9fee 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceResolveRunner.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceResolveRunner.java @@ -166,16 +166,17 @@ public class GrReferenceResolveRunner { ? ((PsiDisjunctionType)originalQualifierType).getLeastUpperBound() : originalQualifierType; - if (qualifierType instanceof GrTraitType) { - return processTraitType((GrTraitType)qualifierType, state); - } - else if (qualifierType instanceof PsiIntersectionType) { + if (qualifierType instanceof PsiIntersectionType) { for (PsiType conjunct : ((PsiIntersectionType)qualifierType).getConjuncts()) { if (!processQualifierType(conjunct, state)) return false; } return true; } + if (qualifierType instanceof GrTraitType) { + return processTraitType((GrTraitType)qualifierType, state); + } + if (qualifierType instanceof PsiClassType) { PsiClassType.ClassResolveResult qualifierResult = ((PsiClassType)qualifierType).resolveGenerics(); PsiClass qualifierClass = qualifierResult.getElement(); @@ -204,6 +205,9 @@ public class GrReferenceResolveRunner { return true; } + /** + * Process trait type conjuncts in reversed order because last applied trait matters. + */ private boolean processTraitType(@NotNull GrTraitType traitType, @NotNull ResolveState state) { final PsiType[] conjuncts = traitType.getConjuncts(); for (int i = conjuncts.length - 1; i >= 0; i--) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/CompleteReferenceExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/CompleteReferenceExpression.java index 3878f65b556a..28a56930d044 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/CompleteReferenceExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/CompleteReferenceExpression.java @@ -300,17 +300,18 @@ public class CompleteReferenceExpression { } getVariantsFromQualifierType(TypesUtil.getJavaLangObject(qualifier), project); } - else if (qualifierType instanceof GrTraitType) { - PsiType[] conjuncts = ((GrTraitType)qualifierType).getConjuncts(); - for (int i = conjuncts.length - 1; i >= 0; i--) { - getVariantsFromQualifierType(conjuncts[i], project); - } - } else if (qualifierType instanceof PsiIntersectionType) { for (PsiType conjunct : ((PsiIntersectionType)qualifierType).getConjuncts()) { getVariantsFromQualifierType(conjunct, project); } } + else if (qualifierType instanceof GrTraitType) { + // Process trait type conjuncts in reversed order because last applied trait matters. + PsiType[] conjuncts = ((GrTraitType)qualifierType).getConjuncts(); + for (int i = conjuncts.length - 1; i >= 0; i--) { + getVariantsFromQualifierType(conjuncts[i], project); + } + } else { getVariantsFromQualifierType(qualifierType, project); if (qualifier instanceof GrReferenceExpression && !PsiUtil.isSuperReference(qualifier) && !PsiUtil.isInstanceThisRef(qualifier)) {