Skip to content

Commit

Permalink
Commandline expansion inside code block
Browse files Browse the repository at this point in the history
  • Loading branch information
mattirn committed Jan 11, 2020
1 parent 1cc42a4 commit 47c0373
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,10 @@ static Completers.SystemCompleter compileCompleters(CommandRegistry ... commandR
Widgets.CmdDesc commandDescription(String command);

default Object execute(String command, String[] args) throws Exception {
throw new IllegalAccessError("Not implemented!");
throw new IllegalArgumentException("Not implemented!");
}

default Object invoke(String command, Object... args) throws Exception {
throw new IllegalArgumentException("Not implemented!");
}
}
4 changes: 1 addition & 3 deletions builtins/src/main/java/org/jline/builtins/ConsoleEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@

public interface ConsoleEngine extends CommandRegistry {

void setMasterRegistry(SystemRegistry masterRegistry);
void setSystemRegistry(SystemRegistry systemRegistry);

Object[] expandVariables(String[] args) throws Exception;

Object execute(ParsedLine parsedLine) throws Exception;

}
94 changes: 61 additions & 33 deletions builtins/src/main/java/org/jline/builtins/ConsoleEngineImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
*/
package org.jline.builtins;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
Expand Down Expand Up @@ -50,7 +52,7 @@ public enum Command {SHOW
private final Map<Command,CommandMethods> commandExecute = new HashMap<>();
private Map<Command,List<String>> commandInfo = new HashMap<>();
private Exception exception;
private SystemRegistry masterRegistry;
private SystemRegistry systemRegistry;
private String scriptExtension = "jline";
private Parser parser;

Expand All @@ -67,8 +69,8 @@ public ConsoleEngineImpl(ScriptEngine engine, Parser parser) {
commandExecute.put(Command.SHOW, new CommandMethods(this::show, this::defaultCompleter));
}

public void setMasterRegistry(SystemRegistry masterRegistry) {
this.masterRegistry = masterRegistry;
public void setSystemRegistry(SystemRegistry systemRegistry) {
this.systemRegistry = systemRegistry;
}

public ConsoleEngineImpl scriptExtension(String extension) {
Expand Down Expand Up @@ -147,14 +149,7 @@ public Widgets.CmdDesc commandDescription(String command) {
return null;
}

private List<String> slurp(String path) throws IOException{
List<String> out = new ArrayList<>();
byte[] encoded = Files.readAllBytes(Paths.get(path));
out.addAll(Arrays.asList(new String(encoded, StandardCharsets.UTF_8).split("\n|\n\r")));
return out;
}

public Object[] expandVariables(String[] args) throws Exception {
private Object[] expandVariables(String[] args) throws Exception {
Object[] out = new Object[args.length];
for (int i = 0; i < args.length; i++) {
if (args[i].startsWith("$")) {
Expand Down Expand Up @@ -182,6 +177,15 @@ private String expandName(String name) {
return out;
}

private boolean isCodeBlock(String line) {
return line.contains("\n") && line.trim().endsWith("}");
}

private boolean isCommandLine(String line) {
String command = Parser.getCommand(line);
return command.startsWith(":") && systemRegistry.hasCommand(command.substring(1));
}

private String quote(String var) {
if ((var.startsWith("\\\"") && var.endsWith("\\\""))
|| (var.startsWith("'") && var.endsWith("'"))) {
Expand All @@ -204,36 +208,59 @@ public Object execute(ParsedLine pl) throws Exception {
if(engine.getExtensions().contains(ext)) {
out = engine.execute(file, expandVariables(args));
} else if (scriptExtension.equals(ext)) {
List<String> commandsBuffer = slurp(cmd);
String line = "";
boolean done = false;
while (!commandsBuffer.isEmpty()) {
try {
line += commandsBuffer.remove(0);
parser.parse(line, line.length() + 1, ParseContext.ACCEPT_LINE);
for (int i = 0; i < args.length; i++) {
line = line.replaceAll("\\$\\d", args[i].startsWith("$") ? expandName(args[i]) : quote(args[i]));
}
masterRegistry.execute(parser.parse(line, 0, ParseContext.ACCEPT_LINE));
line = "";
} catch (EOFError e) {
if (commandsBuffer.isEmpty()) {
throw new IllegalArgumentException("Incompleted command: \n" + line);
String line = "";
engine.put("_systemRegistry", systemRegistry);
try(BufferedReader br = new BufferedReader(new FileReader(file))) {
for(String l; (l = br.readLine()) != null; ) {
try {
line += l;
parser.parse(line, line.length() + 1, ParseContext.ACCEPT_LINE);
done = true;
for (int i = 0; i < args.length; i++) {
line = line.replaceAll("\\$\\d", args[i].startsWith("$") ? expandName(args[i]) : quote(args[i]));
}
if (isCodeBlock(line)) {
StringBuilder sb = new StringBuilder();
for (String s: line.split("\n|\n\r")) {
if (isCommandLine(s)) {
List<String> ws = parser.parse(s, 0, ParseContext.COMPLETE).words();
int idx = ws.get(0).lastIndexOf(":");
if (idx > 0) {
sb.append(ws.get(0).substring(0, idx - 1));
}
sb.append("_systemRegistry.invoke('" + ws.get(0).substring(idx + 1) + "'");
for (int i = 1; i < ws.size(); i++) {
sb.append(", ");
sb.append(ws.get(i));
}
sb.append(")");
} else {
sb.append(s);
}
sb.append("\n");
}
line = sb.toString();
}
systemRegistry.execute(parser.parse(line, 0, ParseContext.COMPLETE));
line = "";
} catch (EOFError e) {
done = false;
line += "\n";
} catch (SyntaxError e) {
throw e;
} catch (Exception e) {
throw new IllegalArgumentException(e.getMessage());
}
line += "\n";
} catch (SyntaxError e) {
commandsBuffer.clear();
throw e;
} catch (Exception e) {
commandsBuffer.clear();
throw new IllegalArgumentException(e.getMessage());
}
if (!done) {
throw new IllegalArgumentException("Incompleted command: \n" + line);
}
}
} else {
throw new IllegalArgumentException("Command not found: " + cmd);
}
} else {
System.out.println(pl.line());
out = engine.execute(pl.line());
}
return out;
Expand Down Expand Up @@ -264,4 +291,5 @@ public Object del(Builtins.CommandInput input) {
private List<Completer> defaultCompleter(String command) {
return Arrays.asList(NullCompleter.INSTANCE);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public SystemRegistryImpl(CommandRegistry... commandRegistries) {
throw new IllegalArgumentException();
} else {
this.consoleId = i;
((ConsoleEngine) commandRegistries[i]).setMasterRegistry(this);
((ConsoleEngine) commandRegistries[i]).setSystemRegistry(this);
}
} else if (commandRegistries[i] instanceof SystemRegistry) {
throw new IllegalArgumentException();
Expand Down
5 changes: 3 additions & 2 deletions builtins/src/test/script/init.jline
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import org.jline.utils.*

println "Is Windows: " + OSUtils.IS_WINDOWS

array=[0,1,2,3,4,5,6,7]
array=[0,1]

array.each {
println it
:show
}

println $1
println $1
25 changes: 16 additions & 9 deletions groovy/src/main/java/org/jline/script/GroovyEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public Object execute(File script, Object[] args) throws Exception {

@Override
public Object execute(String statement) throws Exception {
Object out=null;
Object out = null;
if (statement.startsWith("import ")) {
shell.evaluate(statement);
String[] p = statement.split("\\s+", 2);
Expand All @@ -69,7 +69,7 @@ public Object execute(String statement) throws Exception {
e += entry.getValue()+"\n";
}
e += statement;
out=shell.evaluate(e);
out = shell.evaluate(e);
}
return out;
}
Expand All @@ -84,19 +84,25 @@ public List<String> getExtensions() {
return Arrays.asList("groovy");
}

private void del(String var){
if (var==null) {
private void del(String var) {
if (var == null) {
return;
}
if (imports.containsKey(var)) {
imports.remove(var);
} else if(sharedData.hasVariable(var)){
} else if (sharedData.hasVariable(var)) {
sharedData.getVariables().remove(var);
} else if (!var.contains(".") && var.contains("*")) {
var = var.replace("*", ".*");
Map<String,Object> vars = sharedData.getVariables();
for (String v : vars.keySet()){
if (v.matches(var) && sharedData.hasVariable(v)) {
var = var.replaceAll("\\*", ".*");
Map<String, Object> vars=sharedData.getVariables();
List<String> todel = new ArrayList<String>();
for (Map.Entry<String,Object> entry : vars.entrySet()){
if (!entry.getKey().equals("_") && entry.getKey().matches(var)) {
todel.add(entry.getKey());
}
}
for (String v : todel){
if (sharedData.hasVariable(v)) {
sharedData.getVariables().remove(v);
}
}
Expand All @@ -112,4 +118,5 @@ public void del(String... vars) {
del(s);
}
}

}

0 comments on commit 47c0373

Please sign in to comment.