public static boolean isAssignableWithoutConversions(@Nullable PsiType lType, @Nullable PsiType rType) {
    if (lType == null || rType == null) return false;

    if (rType == PsiTypes.nullType()) {
      return !(lType instanceof PsiPrimitiveType);
    }

    if (rType instanceof GrTraitType) {
      for (PsiType type : ((GrTraitType)rType).getConjuncts()) {
        if (isAssignableWithoutConversions(lType, type)) return true;
      }
      return false;
    }

    if (isClassType(rType, GroovyCommonClassNames.GROOVY_LANG_GSTRING) && lType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
      return true;
    }

    lType = optionalUnbox(lType);
    rType = optionalUnbox(rType);

    return TypeConversionUtil.isAssignable(lType, rType);
  }
public static boolean isAssignableWithoutConversions(@Nullable PsiType lType, @Nullable PsiType rType)