@Override
 public Object visitFunction(Function fcn) {
   if (fcn.isSketchHarness()
       || fcn.getSpecification() != null
       || specFcns.contains(fcn.getName())
       || !fcn.isStatic()) {
     return fcn;
   } else {
     this.parametersToInout = new TypedHashSet<String>();
     this.inputParameters = new Vector<String>();
     for (Parameter param : fcn.getParams()) {
       if (!param.isParameterOutput()) {
         this.inputParameters.add(param.getName());
       }
     }
     super.visitFunction(fcn);
     if (parametersToInout.isEmpty()) {
       return fcn;
     } else {
       Vector<Parameter> newParams = new Vector<Parameter>();
       for (Parameter param : fcn.getParams()) {
         if (parametersToInout.contains(param.getName())) {
           newParams.add(new Parameter(param, param.getType(), param.getName(), Parameter.REF));
         } else {
           newParams.add(param);
         }
       }
       return fcn.creator().params(newParams).create();
     }
   }
 }
 public Object visitStmtAssign(StmtAssign stmt) {
   if (stmt.getLHS() instanceof ExprArrayRange) {
     ExprArrayRange v = (ExprArrayRange) stmt.getLHS();
     if (v.getBase() instanceof ExprVar) {
       ExprVar v2 = (ExprVar) (v.getBase());
       if (inputParameters.contains(v2.getName())) {
         parametersToInout.add(v2.getName());
       }
     }
   }
   return stmt;
 }