Search in sources :

Example 1 with ParsedFunction

use of stanhebben.zenscript.definitions.ParsedFunction in project ZenScript by CraftTweaker.

the class ParsedZenClassMethod method parse.

public static ParsedZenClassMethod parse(ZenTokener parser, EnvironmentScript classEnvironment, String className) {
    Token tName = parser.required(ZenTokener.T_ID, "identifier expected");
    // function (argname [as type], argname [as type], ...) [as type] {
    // ...contents... }
    parser.required(T_BROPEN, "( expected");
    List<ParsedFunctionArgument> arguments = new ArrayList<>();
    if (parser.optional(T_BRCLOSE) == null) {
        Token argName = parser.required(T_ID, "identifier expected");
        ZenType type = ZenTypeAny.INSTANCE;
        ParsedExpression expression = null;
        boolean hasDefaultArgument = false;
        if (parser.optional(T_AS) != null) {
            type = ZenType.read(parser, classEnvironment);
        }
        if (parser.optional(T_ASSIGN) != null) {
            expression = ParsedExpression.read(parser, classEnvironment);
            if (expression instanceof ParsedExpressionVariable) {
                throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Variables are not allowed in default arguments");
            }
            hasDefaultArgument = true;
        }
        arguments.add(new ParsedFunctionArgument(argName.getValue(), type, expression));
        while (parser.optional(T_COMMA) != null) {
            Token argName2 = parser.required(T_ID, "identifier expected");
            ZenType type2 = ZenTypeAny.INSTANCE;
            ParsedExpression expression2 = null;
            if (parser.optional(T_AS) != null) {
                type2 = ZenType.read(parser, classEnvironment);
            }
            if (parser.optional(T_ASSIGN) != null) {
                expression2 = ParsedExpression.read(parser, classEnvironment);
                if (expression2 instanceof ParsedExpressionVariable) {
                    throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Variables are not allowed in default arguments");
                }
                hasDefaultArgument = true;
            } else if (hasDefaultArgument) {
                throw new ParseException(parser.getFile(), parser.getLine(), parser.getLineOffset(), "Parameter " + argName2.getValue() + " requires a default argument");
            }
            arguments.add(new ParsedFunctionArgument(argName2.getValue(), type2, expression2));
        }
        parser.required(T_BRCLOSE, ") expected");
    }
    ZenType type = ZenTypeAny.INSTANCE;
    if (parser.optional(T_AS) != null) {
        type = ZenType.read(parser, classEnvironment);
    }
    parser.required(T_AOPEN, "{ expected");
    Statement[] statements;
    if (parser.optional(T_ACLOSE) != null) {
        statements = new Statement[0];
    } else {
        ArrayList<Statement> statementsAL = new ArrayList<>();
        while (parser.optional(T_ACLOSE) == null) {
            statementsAL.add(Statement.read(parser, classEnvironment, type));
        }
        statements = statementsAL.toArray(new Statement[statementsAL.size()]);
    }
    return new ParsedZenClassMethod(new ParsedFunction(tName.getPosition(), tName.getValue(), arguments, type, statements), className);
}
Also used : ParsedFunction(stanhebben.zenscript.definitions.ParsedFunction) ParsedExpressionVariable(stanhebben.zenscript.parser.expression.ParsedExpressionVariable) Statement(stanhebben.zenscript.statements.Statement) ArrayList(java.util.ArrayList) Token(stanhebben.zenscript.parser.Token) ParsedFunctionArgument(stanhebben.zenscript.definitions.ParsedFunctionArgument) ParsedExpression(stanhebben.zenscript.parser.expression.ParsedExpression) ParseException(stanhebben.zenscript.parser.ParseException) ZenType(stanhebben.zenscript.type.ZenType)

Example 2 with ParsedFunction

use of stanhebben.zenscript.definitions.ParsedFunction in project ZenScript by CraftTweaker.

the class ParsedZenClass method addMethod.

private void addMethod(ParsedZenClassMethod parsedMethod) {
    ParsedFunction method = parsedMethod.method;
    methods.add(parsedMethod);
    if (!members.containsKey(method.getName())) {
        members.put(method.getName(), new ZenNativeMember());
        classEnvironment.putValue(method.getName(), position1 -> new ExpressionThis(position1, type).getMember(position1, classEnvironment, method.getName()), position);
    }
    parsedMethod.addToMember(members.get(method.getName()));
    for (int i = 0; i < method.getArguments().size(); i++) {
        ParsedFunctionArgument argument = method.getArguments().get(i);
        if (argument.getDefaultExpression() != null) {
            addField(new ParsedZenClassField(true, argument.getType(), argument.getDefaultExpression(), method.getDefaultParameterFieldName(i), className));
        }
    }
}
Also used : ParsedFunction(stanhebben.zenscript.definitions.ParsedFunction) ExpressionThis(stanhebben.zenscript.expression.ExpressionThis) ZenNativeMember(stanhebben.zenscript.type.natives.ZenNativeMember) ParsedFunctionArgument(stanhebben.zenscript.definitions.ParsedFunctionArgument)

Aggregations

ParsedFunction (stanhebben.zenscript.definitions.ParsedFunction)2 ParsedFunctionArgument (stanhebben.zenscript.definitions.ParsedFunctionArgument)2 ArrayList (java.util.ArrayList)1 ExpressionThis (stanhebben.zenscript.expression.ExpressionThis)1 ParseException (stanhebben.zenscript.parser.ParseException)1 Token (stanhebben.zenscript.parser.Token)1 ParsedExpression (stanhebben.zenscript.parser.expression.ParsedExpression)1 ParsedExpressionVariable (stanhebben.zenscript.parser.expression.ParsedExpressionVariable)1 Statement (stanhebben.zenscript.statements.Statement)1 ZenType (stanhebben.zenscript.type.ZenType)1 ZenNativeMember (stanhebben.zenscript.type.natives.ZenNativeMember)1