package org.xmlsh.sh.core;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.EnumSet;
import org.xmlsh.core.CoreException;
import org.xmlsh.core.EvalEnv;
import org.xmlsh.core.EvalFlag;
import org.xmlsh.core.XVariableExpr;
import org.xmlsh.sh.grammar.Token;
import org.xmlsh.sh.shell.ParseResult;
import org.xmlsh.sh.shell.Shell;
import org.xmlsh.util.Util;
/*
* Variable Expansion detected at parser time
*
* ${ [#|!] varname [ '[' index ']' ] [ ':' expr }
*
*/
public class VarExpansion extends Word {
private final static EnumSet<EvalFlag> _indMskFlags = EnumSet.of(
EvalFlag.EXPAND_VAR, EvalFlag.PARSE_QUOTES, EvalFlag.JOIN_VALUES,
EvalFlag.OMIT_NULL);
private String mPrefix; // "#" | "!"
private String mVarname;
private Word mIndex;
private Word mField;
// Single token expansion
public VarExpansion(Token t, String simplevar) {
super(t);
mVarname = simplevar;
}
public VarExpansion(Token t, String prefix, String var, Word ind,
Word field) {
super(t);
mPrefix = prefix;
mVarname = var;
mIndex = ind;
mField = field;
}
@Override
public void print(PrintWriter out) {
out.print("${");
if(mPrefix != null)
out.print(mPrefix);
out.print(mVarname);
if(mIndex != null) {
out.print("[");
mIndex.print(out);
out.print("]");
}
if(mField != null) {
out.print(":");
mField.print(out);
}
out.print("}");
}
@Override
protected ParseResult expandToResult(Shell shell, EvalEnv env,
ParseResult result) throws IOException, CoreException {
String ind = mIndex != null ? mIndex.expandString(shell, indEnv(env))
: null;
String field = mField != null ? mField.expandString(shell, env) : null;
XVariableExpr expr = new XVariableExpr(mPrefix, mVarname, ind, field);
return EvalUtils.evalVarToResult(shell, expr, env, env.asCharAttrs(),
result);
}
private EvalEnv indEnv(EvalEnv env) {
return env.withFlagsMasked(_indMskFlags);
}
@Override
public boolean isEmpty() {
return Util.isEmpty(mVarname);
}
@Override
String getSimpleName() {
return mVarname;
}
}