/*!
 * Emit an assignment statement.
 */
void LLVMGenerator::emitStatement(const parser::statements::AssignmentStatement* statement)
{
    Value* rhsVal = getExpressionValue(statement->getRHS());

    // A regular variable expression.
    if(statement->getLHS()->getExpressionType() == Expression::Type::Variable)
    {
        VariableExpression* varExpr = (VariableExpression*)statement->getLHS();

        Value* lhsVal = getOrCreateVariablePointer(varExpr->getVariableName());
        m_primitiveHelper->emitCopy(lhsVal, rhsVal, getCurrentBBlock());
    }
    else if(statement->getLHS()->getExpressionType() == Expression::Type::ArrayIndex)
    {
        ArrayIndexExpression* arrayExpr = (ArrayIndexExpression*)statement->getLHS();

        // Expression is trying to index an item in a function return type or something.
        if(arrayExpr->getArray()->getExpressionType() != Expression::Type::Variable)
        {
            throw std::runtime_error("you can only assign values to arrays which are stored in user variables");
        }

        Value* arrayVal = getOrCreateVariablePointer(((VariableExpression*)arrayExpr->getArray())->getVariableName());
        Value* keyVal   = getExpressionValue(arrayExpr->getIndex());

        m_primitiveHelper->emitSetElement(arrayVal, keyVal, rhsVal, getCurrentBBlock());
    }
    else
    {
        throw std::runtime_error("only variables (or variable array index expressions) may be the target of an assignment");
    }


}