package org.rascalmpl.eclipse.repl;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.rascalmpl.eclipse.Activator;
import org.rascalmpl.eclipse.util.ProjectConfig;
import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.ideservices.BasicIDEServices;
import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.ideservices.IDEServices;
import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.repl.CommandExecutor;
import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.repl.CompiledRascalREPL;
import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.repl.debug.DebugREPLFrameObserver;
import org.rascalmpl.library.util.PathConfig;
import org.rascalmpl.repl.BaseRascalREPL;
import org.rascalmpl.values.ValueFactoryFactory;
import io.usethesource.vallang.IValueFactory;
import jline.Terminal;
import jline.TerminalFactory;
public class CompiledRascalTerminalConnector extends RascalTerminalConnector {
private final IValueFactory vf = ValueFactoryFactory.getValueFactory();
@Override
protected BaseRascalREPL constructREPL(ITerminalControl control, REPLPipedInputStream stdIn, OutputStream stdInUI, Terminal tm) throws IOException, URISyntaxException {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject ipr;
if (root == null || project == null || (ipr = root.getProject(project)) == null) {
Activator.log("No project selected to configure console for", new NullPointerException());
return null;
}
return new CompiledRascalREPL(new ProjectConfig(vf).getPathConfig(ipr), stdIn, control.getRemoteToTerminalOutputStream(), true, true, getHistoryFile(), tm, new BasicIDEServices(new PrintWriter(System.err))) {
@Override
protected CommandExecutor constructCommandExecutor(PathConfig pcfg, PrintWriter stdout, PrintWriter stderr, IDEServices ideServices) throws IOException ,org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.NoSuchRascalFunction ,URISyntaxException {
CommandExecutor exec = new CommandExecutor(pcfg, stdout, stderr, ideServices, null);
exec.setDebugObserver(new DebugREPLFrameObserver(new ProjectConfig(vf).getPathConfig(ipr), reader.getInput(), control.getRemoteToTerminalOutputStream(), true, true, getHistoryFile(), TerminalFactory.get(), new EclipseIDEServices()));
setMeasureCommandTime(true);
return exec;
}
@Override
public void queueCommand(String command) {
super.queueCommand(command);
try {
// let's flush it
stdInUI.write(new byte[]{(byte)ctrl('K'),(byte)ctrl('U'),(byte)'\n'});
}
catch (IOException e) {
}
}
};
}
@Override
public String getSettingsSummary() {
return project != null ? "Compiled Rascal Terminal [project: " + project + "]" : "Compiled Rascal Terminal [no project]";
}
}