package me.august.lumen.compile.parser.components;
import me.august.lumen.compile.parser.TokenParser;
import me.august.lumen.compile.parser.ast.expr.Expression;
import me.august.lumen.compile.parser.ast.expr.IdentExpr;
import me.august.lumen.compile.parser.ast.expr.RescueExpr;
import me.august.lumen.compile.resolve.type.UnresolvedType;
import me.august.lumen.compile.scanner.Token;
import me.august.lumen.compile.scanner.Type;
public class RescueParser implements InfixParser {
@Override
public Expression parse(TokenParser parser, Expression left, Token token) {
Expression catchExpr;
UnresolvedType type = null;
if (parser.peek().getType() == Type.IDENTIFIER) {
String identifier = parser.consume().getContent();
if (parser.accept(Type.R_ARROW)) {
type = new UnresolvedType(identifier);
catchExpr = parser.parseExpression(getPrecedence());
} else {
catchExpr = new IdentExpr(identifier);
}
} else {
catchExpr = parser.parseExpression(getPrecedence());
}
RescueExpr expr = new RescueExpr(type, left, catchExpr);
if (type == null) {
expr.setResolvedType(org.objectweb.asm.Type.getType(Exception.class));
}
return expr;
}
@Override
public int getPrecedence() {
return Precedence.RESCUE.getLevel();
}
}