Skip to content

Commit

Permalink
Console command 'del *' does not delete SYSTEM_VARS
Browse files Browse the repository at this point in the history
  • Loading branch information
mattirn committed Jan 17, 2020
1 parent c279d61 commit af2d980
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 20 deletions.
12 changes: 11 additions & 1 deletion builtins/src/main/java/org/jline/builtins/ConsoleEngineImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,17 @@ public Object engines(Builtins.CommandInput input) {
}

public Object show(Builtins.CommandInput input) {
return engine.get();
final String[] usage = {
"show - list console variables",
"Usage: show [VARIABLE]",
" -? --help Displays command help",
};
Options opt = Options.compile(usage).parse(input.args());
if (opt.isSet("help")) {
exception = new HelpException(opt.usage());
return null;
}
return engine.find(input.args().length > 0 ? input.args()[0] : null);
}

public Object del(Builtins.CommandInput input) {
Expand Down
50 changes: 32 additions & 18 deletions groovy/src/main/java/org/jline/script/GroovyEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
* @author <a href="mailto:matti.rintanikkola@gmail.com">Matti Rinta-Nikkola</a>
*/
public class GroovyEngine implements ScriptEngine {
private static final String REGEX_SYSTEM_VAR = "[A-Z]{1}[A-Z_]*";
private GroovyShell shell;
private Binding sharedData;
private Map<String,String> imports = new HashMap<String,String>();
Expand All @@ -53,8 +54,16 @@ public Object get(String name) {

@SuppressWarnings("unchecked")
@Override
public Map<String,Object> get() {
return sharedData.getVariables();
public Map<String,Object> find(String name) {
Map<String, Object> out = new HashMap<>();
if (name == null) {
out = sharedData.getVariables();
} else {
for (String v : internalFind(name)) {
out.put(v, get(v));
}
}
return out;
}

@Override
Expand Down Expand Up @@ -110,6 +119,19 @@ public List<String> getExtensions() {
}

@SuppressWarnings("unchecked")
private List<String> internalFind(String var) {
List<String> out = new ArrayList<>();
if(!var.contains(".") && var.contains("*")) {
var = var.replaceAll("\\*", ".*");
}
for (String v : (Set<String>)sharedData.getVariables().keySet()) {
if (v.matches(var)) {
out.add(v);
}
}
return out;
}

private void del(String var) {
if (var == null) {
return;
Expand All @@ -119,16 +141,8 @@ private void del(String var) {
} else if (sharedData.hasVariable(var)) {
sharedData.getVariables().remove(var);
} else if (!var.contains(".") && var.contains("*")) {
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)) {
for (String v : internalFind(var)){
if (sharedData.hasVariable(v) && !v.equals("_") && !v.matches(REGEX_SYSTEM_VAR)) {
sharedData.getVariables().remove(v);
}
}
Expand Down Expand Up @@ -165,29 +179,29 @@ public List<AttributedString> highlight(Map<String, Object> options, Object obj)
throw new IllegalArgumentException("Bad style option: " + style);
} else {
try {
out = formatInternal(options, obj);
out = internalHighlight(options, obj);
} catch (Exception e) {
out = formatInternal(options, Utils.convert(obj));
out = internalHighlight(options, Utils.convert(obj));
}
}
return out;
}

@SuppressWarnings("unchecked")
private List<AttributedString> formatInternal(Map<String, Object> options, Object obj) {
private List<AttributedString> internalHighlight(Map<String, Object> options, Object obj) {
List<AttributedString> out = new ArrayList<>();
int width = (int)options.getOrDefault("width", Integer.MAX_VALUE);
if (obj == null) {
// do nothing
} else if (obj instanceof Map) {
out = formatMap((Map<String, Object>)obj, width);
out = highlightMap((Map<String, Object>)obj, width);
} else if (obj instanceof Collection<?>) {
Collection<?> collection = (Collection<?>)obj;
if (!collection.isEmpty()) {
if (collection.size() == 1) {
Object elem = collection.iterator().next();
if (elem instanceof Map) {
out = formatMap((Map<String, Object>)elem, width);
out = highlightMap((Map<String, Object>)elem, width);
} else {
out.add(new AttributedString(Utils.toString(obj)));
}
Expand Down Expand Up @@ -284,7 +298,7 @@ private void toTabStops(List<Integer> columns) {
}
}

private List<AttributedString> formatMap(Map<String, Object> map, int width) {
private List<AttributedString> highlightMap(Map<String, Object> map, int width) {
List<AttributedString> out = new ArrayList<>();
int max = map.keySet().stream().map(String::length).max(Integer::compareTo).get();
for (Map.Entry<String, Object> entry : map.entrySet()) {
Expand Down
11 changes: 10 additions & 1 deletion reader/src/main/java/org/jline/reader/ScriptEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@

import org.jline.utils.AttributedString;

/**
* Manage scriptEngine variables, statements and script execution.
*
* @author <a href="mailto:matti.rintanikkola@gmail.com">Matti Rinta-Nikkola</a>
*/
public interface ScriptEngine {

String getEngineName();
Expand All @@ -28,7 +33,11 @@ public interface ScriptEngine {

Object get(String name);

Map<String,Object> get();
default Map<String,Object> find() {
return find(null);
}

Map<String,Object> find(String name);

void del(String... vars);

Expand Down

0 comments on commit af2d980

Please sign in to comment.