boolean (PsiType from, PsiClassType to, PsiExpression context) { final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(to); final PsiClass threadLocalClass = resolveResult.getElement(); if (threadLocalClass != null) { final String typeQualifiedName = threadLocalClass.getQualifiedName(); if (!Comparing.strEqual(typeQualifiedName, ThreadLocal.class.getName())) { return false; } final PsiTypeParameter[] typeParameters = threadLocalClass.getTypeParameters(); if (typeParameters.length != 1) return !PsiUtil.isLanguageLevel5OrHigher(context); final PsiType toTypeParameterValue = resolveResult.getSubstitutor().substitute(typeParameters[0]); if (toTypeParameterValue != null) { if (from instanceof PsiPrimitiveType) { final PsiPrimitiveType unboxedInitialType = PsiPrimitiveType.getUnboxedType(toTypeParameterValue); if (unboxedInitialType != null) { return TypeConversionUtil.areTypesConvertible(from, unboxedInitialType); } } else { return TypeConversionUtil.isAssignable(toTypeParameterValue, from); } } return !PsiUtil.isLanguageLevel5OrHigher(context); } return false; }