@Override
  public PsiType getType() {
    //15.26.1 left side must be variable/array access probably wrapped in parenthesis, otherwise it's an invalid expression
    //because assignment expression itself is not a poly expression, its type may be calculated at any time
    //thus it's important to ensure that type of left side is not calculated for invalid expression, e.g. bar() = ""
    PsiExpression lExpression = PsiUtil.deparenthesizeExpression(getLExpression());
    if (lExpression instanceof PsiReferenceExpression || lExpression instanceof PsiArrayAccessExpression) {
      PsiType type = lExpression.getType();
      if (type == null || type == PsiTypes.nullType()) {
        PsiExpression rExpression = getRExpression();
        if (rExpression != null && !PsiPolyExpressionUtil.isPolyExpression(rExpression)) {
          return rExpression.getType();
        }
      }
      return type;
    }
    return null;
  }
@Override
  public PsiType getType()