org.snapscript.tree.StaticInvocationBuilder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of snap Show documentation
Show all versions of snap Show documentation
Dynamic scripting for the JVM
package org.snapscript.tree;
import java.util.concurrent.atomic.AtomicBoolean;
import org.snapscript.core.Context;
import org.snapscript.core.Execution;
import org.snapscript.core.InternalStateException;
import org.snapscript.core.Statement;
import org.snapscript.core.scope.Scope;
import org.snapscript.core.type.Type;
import org.snapscript.core.constraint.Constraint;
import org.snapscript.core.convert.ConstraintConverter;
import org.snapscript.core.convert.ConstraintMatcher;
import org.snapscript.core.function.Invocation;
import org.snapscript.core.function.InvocationBuilder;
import org.snapscript.core.function.Signature;
import org.snapscript.core.function.SignatureAligner;
import org.snapscript.core.module.Module;
import org.snapscript.core.result.Result;
import org.snapscript.tree.function.ParameterExtractor;
public class StaticInvocationBuilder implements InvocationBuilder {
private ParameterExtractor extractor;
private ResultConverter converter;
private SignatureAligner aligner;
private Constraint constraint;
private Statement statement;
private Execution execution;
private Execution compile;
public StaticInvocationBuilder(Signature signature, Execution compile, Statement statement, Constraint constraint) {
this.extractor = new ParameterExtractor(signature, true);
this.aligner = new SignatureAligner(signature);
this.constraint = constraint;
this.statement = statement;
this.compile = compile;
}
@Override
public void define(Scope scope) throws Exception {
Scope inner = scope.getStack();
extractor.define(inner); // count parameters
statement.define(scope);
}
@Override
public void compile(Scope scope) throws Exception {
if(execution != null) {
throw new InternalStateException("Function has already been compiled");
}
execution = statement.compile(scope, constraint);
}
@Override
public Invocation create(Scope scope) throws Exception {
if(converter == null) {
converter = build(scope);
}
return converter;
}
private ResultConverter build(Scope scope) throws Exception {
Module module = scope.getModule();
Context context = module.getContext();
ConstraintMatcher matcher = context.getMatcher();
return new ResultConverter(matcher, compile, execution);
}
private class ResultConverter implements Invocation