package abstractSyntaxTree.Expression; import TypeCheck.AbstractType; import TypeCheck.TypeCheckHelper; import TypeCheck.TypeCheckResult; import abstractSyntaxTree.Datatype.IDatatype; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import java.util.Objects; public class UnaryExpression extends AbstractType implements IExpression{ public String operator; public IDatatype operand; @Override public TypeCheckResult typeCheck() throws Exception { TypeCheckResult result = new TypeCheckResult(); TypeCheckResult operandTypeCheckResult = operand.typeCheck(); String operandType = operandTypeCheckResult.type; switch (operator) { case "!" :{ if (Objects.equals(operandType, "bool")){ result.type = "bool"; } break; } case "-": case "+": if (Objects.equals(operandType, "int")){ result.type = "int"; } break; } setTypeCheckResult(result); return result; } @Override public void codeGen(MethodVisitor mv) throws Exception { operand.codeGen(mv); switch (operator) { case "!": //XOR with 1 to get the negation mv.visitInsn(Opcodes.ICONST_1); mv.visitInsn(Opcodes.IXOR); break; case "-": mv.visitInsn(Opcodes.INEG); break; case "+": break; default: throw new Exception("Unknown operator :" + operator); } } }