boolean (@NotNull PsiMethod method, @Nullable PsiType qualifierType, @Nullable PsiElement place, @Nullable PsiSubstitutor substitutor) { if (!method.hasModifierProperty(PsiModifier.STATIC)) return false; if (!method.hasModifierProperty(PsiModifier.PUBLIC)) return false; final PsiParameter[] parameters = method.getParameterList().getParameters(); if (parameters.length == 0) return false; if (qualifierType == null) return true; PsiType selfType = parameters[0].getType(); if (selfType instanceof PsiPrimitiveType) return false; if (substitutor != null) { selfType = substitutor.substitute(selfType); } if (PsiTypesUtil.classNameEquals(selfType, CommonClassNames.JAVA_LANG_CLASS) && place instanceof GrReferenceExpression && ((GrReferenceExpression)place).resolve() instanceof PsiClass) { // ClassType.categoryMethod() where categoryMethod(Class<> cl, ...) return TypesUtil.isAssignableByMethodCallConversion(selfType, TypesUtil.createJavaLangClassType(qualifierType, method), method); } return TypesUtil.isAssignableByMethodCallConversion(selfType, qualifierType, method); }