// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use syntax::ast;

#[derive(Debug, PartialEq, Eq, Clone, RustcEncodable, RustcDecodable)]
pub enum ConstMathErr {
    NotInRange,
    CmpBetweenUnequalTypes,
    UnequalTypes(Op),
    Overflow(Op),
    ShiftNegative,
    DivisionByZero,
    RemainderByZero,
    UnsignedNegation,
    ULitOutOfRange(ast::UintTy),
    LitOutOfRange(ast::IntTy),
}
pub use self::ConstMathErr::*;

#[derive(Debug, PartialEq, Eq, Clone, RustcEncodable, RustcDecodable)]
pub enum Op {
    Add,
    Sub,
    Mul,
    Div,
    Rem,
    Shr,
    Shl,
    Neg,
    BitAnd,
    BitOr,
    BitXor,
}

impl ConstMathErr {
    pub fn description(&self) -> &'static str {
        use self::Op::*;
        match *self {
            NotInRange => "inferred value out of range",
            CmpBetweenUnequalTypes => "compared two values of different types",
            UnequalTypes(Add) => "tried to add two values of different types",
            UnequalTypes(Sub) => "tried to subtract two values of different types",
            UnequalTypes(Mul) => "tried to multiply two values of different types",
            UnequalTypes(Div) => "tried to divide two values of different types",
            UnequalTypes(Rem) => {
                "tried to calculate the remainder of two values of different types"
            },
            UnequalTypes(BitAnd) => "tried to bitand two values of different types",
            UnequalTypes(BitOr) => "tried to bitor two values of different types",
            UnequalTypes(BitXor) => "tried to xor two values of different types",
            UnequalTypes(_) => unreachable!(),
            Overflow(Add) => "attempted to add with overflow",
            Overflow(Sub) => "attempted to subtract with overflow",
            Overflow(Mul) => "attempted to multiply with overflow",
            Overflow(Div) => "attempted to divide with overflow",
            Overflow(Rem) => "attempted to calculate the remainder with overflow",
            Overflow(Neg) => "attempted to negate with overflow",
            Overflow(Shr) => "attempted to shift right with overflow",
            Overflow(Shl) => "attempted to shift left with overflow",
            Overflow(_) => unreachable!(),
            ShiftNegative => "attempted to shift by a negative amount",
            DivisionByZero => "attempted to divide by zero",
            RemainderByZero => "attempted to calculate the remainder with a divisor of zero",
            UnsignedNegation => "unary negation of unsigned integer",
            ULitOutOfRange(ast::UintTy::U8) => "literal out of range for u8",
            ULitOutOfRange(ast::UintTy::U16) => "literal out of range for u16",
            ULitOutOfRange(ast::UintTy::U32) => "literal out of range for u32",
            ULitOutOfRange(ast::UintTy::U64) => "literal out of range for u64",
            ULitOutOfRange(ast::UintTy::Us) => "literal out of range for usize",
            LitOutOfRange(ast::IntTy::I8) => "literal out of range for i8",
            LitOutOfRange(ast::IntTy::I16) => "literal out of range for i16",
            LitOutOfRange(ast::IntTy::I32) => "literal out of range for i32",
            LitOutOfRange(ast::IntTy::I64) => "literal out of range for i64",
            LitOutOfRange(ast::IntTy::Is) => "literal out of range for isize",
        }
    }
}
