Search in sources :

Example 1 with IfStatement

use of dyvilx.tools.compiler.ast.statement.IfStatement in project Dyvil by Dyvil.

the class IfStatementParser method parse.

@Override
public void parse(IParserManager pm, IToken token) {
    final int type = token.type();
    switch(this.mode) {
        case IF:
            if (type != DyvilKeywords.IF) {
                pm.report(token, "if.if_keyword");
                return;
            }
            this.mode = OPEN_PAREN;
            this.statement = new IfStatement(token.raw());
            return;
        case OPEN_PAREN:
            if (type == BaseSymbols.OPEN_PARENTHESIS) {
                this.parentheses = true;
                this.mode = CONDITION_PART;
                return;
            }
        // Fallthrough
        case CONDITION_PART:
            if (type == DyvilKeywords.LET) {
                pm.pushParser(new DataMemberParser<>(this), true);
                this.mode = VARIABLE_VALUE;
                return;
            }
            this.mode = SEPARATOR;
            pm.pushParser(this.expressionParser(this.statement::setCondition), true);
            return;
        case VARIABLE_VALUE:
            if (type == BaseSymbols.EQUALS) {
                pm.pushParser(this.expressionParser(this.lastVariable));
                this.mode = SEPARATOR;
                return;
            }
            pm.report(token, "if.binding.assignment");
        // Fallthrough
        case SEPARATOR:
            switch(type) {
                case BaseSymbols.COMMA:
                case BaseSymbols.SEMICOLON:
                    if (this.parentheses && !this.hasCondition()) {
                        this.mode = CONDITION_PART;
                        return;
                    }
                    // then
                    break;
                case BaseSymbols.CLOSE_PARENTHESIS:
                    if (this.parentheses) {
                        this.mode = THEN;
                        return;
                    }
                    // then
                    break;
            }
            if (this.parentheses) {
                pm.report(token, "if.close_paren");
            }
        // Fallthrough
        case THEN:
            switch(type) {
                case Tokens.EOF:
                case BaseSymbols.SEMICOLON:
                    this.end(pm);
                    return;
            }
            this.mode = ELSE;
            pm.pushParser(new ExpressionParser(this.statement::setThen), true);
            return;
        case ELSE:
            if (type == DyvilKeywords.ELSE) {
                pm.pushParser(new ExpressionParser(this.statement::setElse));
                this.mode = END;
                return;
            }
            if (token.isInferred() && token.next().type() == DyvilKeywords.ELSE) {
                // ... inferred_semicolon else
                pm.skip();
                pm.pushParser(new ExpressionParser(this.statement::setElse));
                this.mode = END;
                return;
            }
        // Fallthrough
        case END:
            this.end(pm);
            return;
    }
}
Also used : IfStatement(dyvilx.tools.compiler.ast.statement.IfStatement) BindingIfStatement(dyvilx.tools.compiler.ast.statement.BindingIfStatement) ExpressionParser(dyvilx.tools.compiler.parser.expression.ExpressionParser)

Example 2 with IfStatement

use of dyvilx.tools.compiler.ast.statement.IfStatement in project Dyvil by Dyvil.

the class CaseClassMetadata method createUnapplyAnyMethod.

private CodeMethod createUnapplyAnyMethod() {
    // static final func unapply<TypeParams...>(value: any) -> (T...)?
    final SourcePosition position = this.theClass.position();
    final AttributeList attributes = AttributeList.of(Modifiers.PUBLIC | Modifiers.STATIC_FINAL | Modifiers.GENERATED);
    final IType type = NullableType.apply(this.getUnapplyReturnType());
    final CodeMethod unapply = new CodeMethod(this.theClass, Names.unapply, type, attributes);
    unapply.setPosition(position);
    unapply.getTypeParameters().addAll(this.theClass.getTypeParameters());
    final CodeParameter parameter = new CodeParameter(unapply, position, Names.value, Types.NULLABLE_ANY);
    unapply.getParameters().add(parameter);
    // = (param is This) ? unapply(param as This) : null
    final InstanceOfOperator isOperator = new InstanceOfOperator(new FieldAccess(parameter), this.theClass.getClassType());
    final CastOperator castOperator = new CastOperator(new FieldAccess(parameter), this.theClass.getThisType());
    final IValue call = new MethodCall(position, null, Names.unapply, new ArgumentList(castOperator));
    final IfStatement ifStatement = new IfStatement(isOperator, call, new NullValue());
    unapply.setValue(ifStatement);
    return unapply;
}
Also used : AttributeList(dyvilx.tools.compiler.ast.attribute.AttributeList) CastOperator(dyvilx.tools.compiler.ast.expression.CastOperator) ArgumentList(dyvilx.tools.compiler.ast.parameter.ArgumentList) CodeParameter(dyvilx.tools.compiler.ast.parameter.CodeParameter) MethodCall(dyvilx.tools.compiler.ast.expression.access.MethodCall) IType(dyvilx.tools.compiler.ast.type.IType) InstanceOfOperator(dyvilx.tools.compiler.ast.expression.InstanceOfOperator) IfStatement(dyvilx.tools.compiler.ast.statement.IfStatement) IValue(dyvilx.tools.compiler.ast.expression.IValue) NullValue(dyvilx.tools.compiler.ast.expression.constant.NullValue) CodeMethod(dyvilx.tools.compiler.ast.method.CodeMethod) SourcePosition(dyvil.source.position.SourcePosition) FieldAccess(dyvilx.tools.compiler.ast.expression.access.FieldAccess)

Aggregations

IfStatement (dyvilx.tools.compiler.ast.statement.IfStatement)2 SourcePosition (dyvil.source.position.SourcePosition)1 AttributeList (dyvilx.tools.compiler.ast.attribute.AttributeList)1 CastOperator (dyvilx.tools.compiler.ast.expression.CastOperator)1 IValue (dyvilx.tools.compiler.ast.expression.IValue)1 InstanceOfOperator (dyvilx.tools.compiler.ast.expression.InstanceOfOperator)1 FieldAccess (dyvilx.tools.compiler.ast.expression.access.FieldAccess)1 MethodCall (dyvilx.tools.compiler.ast.expression.access.MethodCall)1 NullValue (dyvilx.tools.compiler.ast.expression.constant.NullValue)1 CodeMethod (dyvilx.tools.compiler.ast.method.CodeMethod)1 ArgumentList (dyvilx.tools.compiler.ast.parameter.ArgumentList)1 CodeParameter (dyvilx.tools.compiler.ast.parameter.CodeParameter)1 BindingIfStatement (dyvilx.tools.compiler.ast.statement.BindingIfStatement)1 IType (dyvilx.tools.compiler.ast.type.IType)1 ExpressionParser (dyvilx.tools.compiler.parser.expression.ExpressionParser)1