PsiType (GroovyResolveResult result) { PsiElement resolved = result.getElement(); if (resolved instanceof GroovyProperty) { return ((GroovyProperty)resolved).getPropertyType(); } if (resolved == null && !"class".equals(getReferenceName())) { resolved = resolve(); } if (resolved instanceof PsiClass) { final PsiElementFactory factory = JavaPsiFacade.getInstance(getProject()).getElementFactory(); if (PsiUtil.isInstanceThisRef(this)) { final PsiClassType categoryType = GdkMethodUtil.getCategoryType((PsiClass)resolved); if (categoryType != null) { return categoryType; } else { return factory.createType((PsiClass)resolved); } } else if (PsiUtil.isSuperReference(this)) { PsiClass contextClass = PsiUtil.getContextClass(this); if (GrTraitUtil.isTrait(contextClass)) { PsiClassType[] extendsTypes = contextClass.getExtendsListTypes(); PsiClassType[] implementsTypes = contextClass.getImplementsListTypes(); PsiClassType[] superTypes = ArrayUtil.mergeArrays(implementsTypes, extendsTypes, PsiClassType.ARRAY_FACTORY); if (superTypes.length > 0) { return PsiIntersectionType.createIntersection(ArrayUtil.reverseArray(superTypes)); } } return factory.createType((PsiClass)resolved); } return TypesUtil.createJavaLangClassType(factory.createType((PsiClass)resolved), this); } if (resolved instanceof GrVariable) { return ((GrVariable)resolved).getDeclaredType(); } if (resolved instanceof PsiVariable) { return ((PsiVariable)resolved).getType(); } if (resolved instanceof PsiMethod method) { if (PropertyUtilBase.isSimplePropertySetter(method) && !method.getName().equals(getReferenceName())) { return method.getParameterList().getParameters()[0].getType(); } if (result instanceof GroovyMethodResult) { return getTypeFromCandidate((GroovyMethodResult)result, this); } return PsiUtil.getSmartReturnType(method); } if (resolved == null) { if ("class".equals(getReferenceName())) { final PsiType fromClassRef = getTypeFromClassRef(); if (fromClassRef != null) { return fromClassRef; } } final PsiType fromSpreadOperator = getTypeFromSpreadOperator(this); if (fromSpreadOperator != null) { return fromSpreadOperator; } } return null; }