Search in sources :

Example 1 with IPartialExpression

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;
    }
}
Also used : ICastingRule(stanhebben.zenscript.type.casting.ICastingRule) IPartialExpression(stanhebben.zenscript.expression.partial.IPartialExpression)

Example 2 with IPartialExpression

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));
}
Also used : IPartialExpression(stanhebben.zenscript.expression.partial.IPartialExpression) ZenType(stanhebben.zenscript.type.ZenType)

Example 3 with IPartialExpression

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);
}
Also used : Expression(stanhebben.zenscript.expression.Expression) IPartialExpression(stanhebben.zenscript.expression.partial.IPartialExpression)

Example 4 with IPartialExpression

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);
}
Also used : Expression(stanhebben.zenscript.expression.Expression) IPartialExpression(stanhebben.zenscript.expression.partial.IPartialExpression)

Example 5 with IPartialExpression

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;
}
Also used : IPartialExpression(stanhebben.zenscript.expression.partial.IPartialExpression)

Aggregations

IPartialExpression (stanhebben.zenscript.expression.partial.IPartialExpression)11 Expression (stanhebben.zenscript.expression.Expression)6 ZenType (stanhebben.zenscript.type.ZenType)2 ICastingRule (stanhebben.zenscript.type.casting.ICastingRule)2