use of stanhebben.zenscript.expression.partial.IPartialExpression in project ZenScript by CraftTweaker.
the class ParsedExpressionMap method compile.
@Override
public IPartialExpression compile(IEnvironmentMethod environment, ZenType predictedType) {
ZenType predictedKeyType = null;
ZenType predictedValueType = null;
ICastingRule castingRule = null;
ZenTypeAssociative mapType = ZenType.ANYMAP;
if (predictedType instanceof ZenTypeAssociative) {
ZenTypeAssociative inputType = (ZenTypeAssociative) predictedType;
predictedKeyType = inputType.getKeyType();
predictedValueType = inputType.getValueType();
mapType = inputType;
} else {
castingRule = ZenType.ANYMAP.getCastingRule(predictedType, environment);
if (castingRule != null) {
if (castingRule.getInputType() instanceof ZenTypeAssociative) {
ZenTypeAssociative inputType = (ZenTypeAssociative) castingRule.getInputType();
predictedKeyType = inputType.getKeyType();
predictedValueType = inputType.getValueType();
mapType = inputType;
} else {
environment.error(getPosition(), "Caster found for any[any] but its input is not an associative array");
}
}
}
Expression[] cKeys = new Expression[keys.size()];
Expression[] cValues = new Expression[values.size()];
for (int i = 0; i < keys.size(); i++) {
cKeys[i] = keys.get(i).compileKey(environment, predictedKeyType);
cValues[i] = values.get(i).compile(environment, predictedValueType).eval(environment);
}
Expression result = new ExpressionMap(getPosition(), cKeys, cValues, mapType);
if (castingRule != null) {
return new ExpressionAs(getPosition(), result, castingRule);
} else {
return result;
}
}
use of stanhebben.zenscript.expression.partial.IPartialExpression in project ZenScript by CraftTweaker.
the class ParsedExpressionOrOr method compile.
@Override
public IPartialExpression compile(IEnvironmentMethod environment, ZenType predictedType) {
Expression cLeft = left.compile(environment, predictedType).eval(environment);
Expression cRight = right.compile(environment, predictedType).eval(environment);
ZenType type;
if (cRight.getType().canCastImplicit(cLeft.getType(), environment)) {
type = cLeft.getType();
} else if (cLeft.getType().canCastImplicit(cRight.getType(), environment)) {
type = cRight.getType();
} else {
environment.error(getPosition(), "These types could not be unified: " + cLeft.getType() + " and " + cRight.getType());
type = ZenType.ANY;
}
return new ExpressionOrOr(getPosition(), cLeft.cast(getPosition(), environment, type), cRight.cast(getPosition(), environment, type));
}
use of stanhebben.zenscript.expression.partial.IPartialExpression in project ZenScript by CraftTweaker.
the class ParsedExpressionCompare method compile.
@Override
public IPartialExpression compile(IEnvironmentMethod environment, ZenType predictedType) {
Expression cLeft = left.compile(environment, null).eval(environment);
Expression cRight = right.compile(environment, null).eval(environment);
return cLeft.getType().compare(getPosition(), environment, cLeft, cRight, type);
}
use of stanhebben.zenscript.expression.partial.IPartialExpression in project ZenScript by CraftTweaker.
the class ParsedExpressionIndexSet method compile.
@Override
public IPartialExpression compile(IEnvironmentMethod environment, ZenType predictedType) {
// TODO: improve prediction in this expression
Expression cValue = value.compile(environment, null).eval(environment);
Expression cIndex = index.compile(environment, null).eval(environment);
Expression cSetValue = setValue.compile(environment, null).eval(environment);
return cValue.getType().trinary(getPosition(), environment, cValue, cIndex, cSetValue, OperatorType.INDEXSET);
}
use of stanhebben.zenscript.expression.partial.IPartialExpression in project ZenScript by CraftTweaker.
the class ZenType method read.
public static ZenType read(ZenTokener parser, IEnvironmentGlobal environment) {
ZenType base;
Token next = parser.next();
switch(next.getType()) {
case ZenTokener.T_ANY:
base = ANY;
break;
case ZenTokener.T_VOID:
base = VOID;
break;
case ZenTokener.T_BOOL:
base = BOOL;
break;
case ZenTokener.T_BYTE:
base = BYTE;
break;
case ZenTokener.T_SHORT:
base = SHORT;
break;
case ZenTokener.T_INT:
base = INT;
break;
case ZenTokener.T_LONG:
base = LONG;
break;
case ZenTokener.T_FLOAT:
base = FLOAT;
break;
case ZenTokener.T_DOUBLE:
base = DOUBLE;
break;
case ZenTokener.T_STRING:
base = STRING;
break;
case ZenTokener.T_ID:
base = ANY;
StringBuilder typeName = new StringBuilder();
typeName.append(next.getValue());
IPartialExpression partial = environment.getValue(next.getValue(), next.getPosition());
while (parser.optional(ZenTokener.T_DOT) != null) {
typeName.append('.');
Token member = parser.required(ZenTokener.T_ID, "identifier expected");
typeName.append(member.getValue());
partial = partial.getMember(member.getPosition(), environment, member.getValue());
if (partial == null) {
environment.error(member.getPosition(), "could not find type " + typeName);
break;
}
}
if (partial != null) {
base = partial.toType(environment);
}
break;
case ZenTokener.T_FUNCTION:
List<ZenType> argumentTypes = new ArrayList<>();
ZenType returnType;
parser.required(ZenTokener.T_BROPEN, "( required");
if (parser.optional(ZenTokener.T_BRCLOSE) == null) {
argumentTypes.add(read(parser, environment));
while (parser.optional(ZenTokener.T_COMMA) != null) {
argumentTypes.add(read(parser, environment));
}
parser.required(ZenTokener.T_BRCLOSE, ") required");
}
returnType = read(parser, environment);
base = new ZenTypeFunctionCallable(returnType, argumentTypes.toArray(new ZenType[0]), environment.makeClassName());
break;
case ZenTokener.T_SQBROPEN:
base = new ZenTypeArrayList(read(parser, environment));
parser.required(ZenTokener.T_SQBRCLOSE, "] expected");
break;
default:
throw new ParseException(next, "Unknown type: " + next.getValue());
}
while (parser.optional(ZenTokener.T_SQBROPEN) != null) {
if (parser.optional(ZenTokener.T_SQBRCLOSE) == null) {
base = new ZenTypeAssociative(base, read(parser, environment));
parser.required(ZenTokener.T_SQBRCLOSE, "] expected");
} else {
base = new ZenTypeArrayBasic(base);
}
}
return base;
}
Aggregations