package me.august.lumen.compile.parser.ast.expr; import me.august.lumen.compile.analyze.ASTVisitor; import me.august.lumen.compile.analyze.VisitorConsumer; import me.august.lumen.compile.codegen.BuildContext; import me.august.lumen.compile.parser.ast.CodeBlock; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; public interface Expression extends CodeBlock, VisitorConsumer { default boolean isConstant() { return false; } default void generate(MethodVisitor visitor, BuildContext context) { throw new UnsupportedOperationException(); } // for evaluating constant expressions default void evaluate() { if (!isConstant()) throw new UnsupportedOperationException("This expression is not constant"); } default void accept(ASTVisitor visitor) { if (getChildren() != null) { for (Expression child : getChildren()) { if (child == null) continue; child.accept(visitor); } } if (this instanceof OwnedExpr) { Expression owned = ((OwnedExpr) this).getOwner(); if (owned != null) owned.accept(visitor); } visitor.visitExpression(this); } default Expression[] getChildren() { return new Expression[]{}; } default Type expressionType() { return null; } }