protected MixedModeFunction( String name, Iterable<String> parameters, int numMandatoryParameters, boolean onlyNamedArguments, Location location) { super(name); this.parameters = ImmutableList.copyOf(parameters); this.numMandatoryParameters = numMandatoryParameters; this.onlyNamedArguments = onlyNamedArguments; this.location = location; // Fake a signature from the above this.signature = FunctionSignature.WithValues.<Object, SkylarkType>create( FunctionSignature.of(numMandatoryParameters, this.parameters.toArray(new String[0]))); }
@Override void exec(Environment env) throws EvalException, InterruptedException { List<Expression> defaultExpressions = signature.getDefaultValues(); ArrayList<Object> defaultValues = null; ArrayList<SkylarkType> types = null; if (defaultExpressions != null) { defaultValues = new ArrayList<>(defaultExpressions.size()); for (Expression expr : defaultExpressions) { defaultValues.add(expr.eval(env)); } } env.update( ident.getName(), new UserDefinedFunction( ident, FunctionSignature.WithValues.<Object, SkylarkType>create( signature.getSignature(), defaultValues, types), statements, (SkylarkEnvironment) env)); }
/** Create a function using a signature without defaults */ public MixedModeFunction(String name, FunctionSignature signature) { this(name, FunctionSignature.WithValues.<Object, SkylarkType>create(signature), null); }