PsiType (@NotNull PsiParameter parameter, @NotNull PsiSubstitutor substitutor) { PsiType type = parameter.getType(); LOG.assertTrue(type.isValid()); if (parameter.isVarArgs()) { if (type instanceof PsiArrayType) { type = ((PsiArrayType)type).getComponentType(); } else { LOG.error("Vararg parameter with non-array type. Class=" + parameter.getClass() + "; type=" + parameter.getType()); } } PsiType parameterType = GenericsUtil.eliminateExtendsFinalWildcard(substitutor.substitute(type)); if (parameterType instanceof PsiCapturedWildcardType) { parameterType = ((PsiCapturedWildcardType)parameterType).getWildcard(); } if (parameterType instanceof PsiWildcardType) { final PsiType bound = ((PsiWildcardType)parameterType).getBound(); return bound != null ? bound : PsiType.getJavaLangObject(parameter.getManager(), GlobalSearchScope.allScope(parameter.getProject())); } return parameterType; }