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; } }