public Object visitExprNew(ExprNew expNew) {

      Type nt = (Type) expNew.getTypeToConstruct().accept(this);
      StructDef ts = null;
      {
        assert nt instanceof TypeStructRef;
        ts = TypeInferenceForStars.this.nres.getStruct(((TypeStructRef) nt).getName());
      }

      boolean changed = false;
      List<ExprNamedParam> enl = new ArrayList<ExprNamedParam>(expNew.getParams().size());
      for (ExprNamedParam en : expNew.getParams()) {
        Expression old = en.getExpr();
        Type oldType = type;
        if (expNew.isHole()) {
          type = getFieldsMap(ts).get(en.getName());
        } else {
          type = ts.getFieldTypMap().get(en.getName());
        }
        StructDef cur = ts;
        while (type == null) {
          cur = nres.getStruct(cur.getParentName());
          type = cur.getFieldTypMap().get(en.getName());
        }
        Expression rhs = doExpression(old);
        if (rhs != old) {
          enl.add(new ExprNamedParam(en, en.getName(), rhs));
          changed = true;
        } else {
          enl.add(en);
        }
        type = oldType;
      }

      if (nt != expNew.getTypeToConstruct() || changed) {
        if (!changed) {
          enl = expNew.getParams();
        }
        if (expNew.isHole()) {
          return new ExprNew(expNew, nt, enl, false, expNew.getStar());
        } else {
          return new ExprNew(expNew, nt, enl, false);
        }
      } else {
        return expNew;
      }
    }