All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opalj.br.ElementValue.scala Maven / Gradle / Ivy

The newest version!
/* BSD 2-Clause License - see OPAL/LICENSE for details. */
package org.opalj
package br

/**
 * An element value represents an annotation's value or an
 * annonation's default value; depending on the context in
 * which it is used.
 *
 * @author Michael Eichberg
 * @author Arne Lottmann
 */
sealed trait ElementValue extends Attribute {

    def valueType: FieldType

    /**
     * The representation of this element value as a Java literal/expression.
     */
    def toJava: String

    def asIntValue: IntValue = throw new ClassCastException();
    def asEnumValue: EnumValue = throw new ClassCastException();
    def asAnnotationValue: AnnotationValue = throw new ClassCastException();
    def asStringValue: StringValue = throw new ClassCastException();
    def asArrayValue: ArrayValue = throw new ClassCastException();
    def asClassValue: ClassValue = throw new ClassCastException();

}
object ElementValue {
    final val minKindId = ByteValue.KindId
    final val maxKindId = AnnotationValue.KindId

    def unapply(attribute: Attribute): Boolean = {
        attribute match {
            case _: ElementValue => true
            case _               => false
        }
    }
}

/**
 * Common super trait of all element values with a primitive base type.
 *
 * @author Michael Eichberg
 */
sealed trait BaseTypeElementValue extends ElementValue {

    final override def valueType = baseType

    def baseType: BaseType

    override def similar(other: Attribute, config: SimilarityTestConfiguration): Boolean = this == other
}

case class ByteValue(value: Byte) extends BaseTypeElementValue {

    override def baseType: BaseType = ByteType

    override def toJava: String = value.toString

    override def kindId: Int = ByteValue.KindId

}
object ByteValue {

    final val KindId = 29

}

case class CharValue(value: Char) extends BaseTypeElementValue {

    override def baseType: BaseType = CharType

    override def toJava: String = value.toString

    override def kindId: Int = CharValue.KindId

}
object CharValue {

    final val KindId = 30

}

case class DoubleValue(value: Double) extends BaseTypeElementValue {

    override def baseType: BaseType = DoubleType

    override def toJava: String = value.toString

    override def kindId: Int = DoubleValue.KindId

}
object DoubleValue {

    final val KindId = 31

}

case class FloatValue(value: Float) extends BaseTypeElementValue {

    override def baseType: BaseType = FloatType

    override def toJava: String = value.toString

    override def kindId: Int = FloatValue.KindId

}
object FloatValue {

    final val KindId = 32

}

case class IntValue(value: Int) extends BaseTypeElementValue {

    override def baseType: BaseType = IntegerType

    override def toJava: String = value.toString

    override def kindId: Int = IntValue.KindId

    final override def asIntValue: IntValue = this

}
object IntValue {

    final val KindId = 33

}

case class LongValue(value: Long) extends BaseTypeElementValue {

    override def baseType: BaseType = LongType

    override def toJava: String = value.toString

    override def kindId: Int = LongValue.KindId

}
object LongValue {

    final val KindId = 34

}

case class ShortValue(value: Short) extends BaseTypeElementValue {

    override def baseType: BaseType = ShortType

    override def toJava: String = value.toString

    override def kindId: Int = ShortValue.KindId

}
object ShortValue {

    final val KindId = 35

}

case class BooleanValue(value: Boolean) extends BaseTypeElementValue {

    override def baseType: BaseType = BooleanType

    override def toJava: String = value.toString

    override def kindId: Int = BooleanValue.KindId

}
object BooleanValue {

    final val KindId = 36

}

case class StringValue(value: String) extends ElementValue {

    final override def valueType = ObjectType.String

    override def toJava: String = "\""+value.toString+"\""

    override def kindId: Int = StringValue.KindId

    override def similar(other: Attribute, config: SimilarityTestConfiguration): Boolean = {
        this == other
    }

    final override def asStringValue: StringValue = this

}
object StringValue {

    final val KindId = 37

}

case class ClassValue(value: Type) extends ElementValue {

    final override def valueType = ObjectType.Class

    override def toJava: String = value.toJava+".class"

    override def kindId: Int = ClassValue.KindId

    override def similar(other: Attribute, config: SimilarityTestConfiguration): Boolean = {
        this == other
    }

    final override def asClassValue: ClassValue = this

}
object ClassValue {

    final val KindId = 38

}

case class EnumValue(enumType: ObjectType, constName: String) extends ElementValue {

    final override def valueType = enumType

    override def toJava: String = enumType.toJava+"."+constName

    override def kindId: Int = EnumValue.KindId

    override def similar(other: Attribute, config: SimilarityTestConfiguration): Boolean = {
        this == other
    }

    final override def asEnumValue: EnumValue = this

}
object EnumValue {

    final val KindId = 39

}

case class ArrayValue(values: ElementValues) extends ElementValue {

    // by design/specification the first value determines the type of the Array
    final override def valueType = ArrayType(values(0).valueType)

    override def toJava: String = values.map(_.toJava).mkString("{", ",", "}")

    override def kindId: Int = ArrayValue.KindId

    override def similar(other: Attribute, config: SimilarityTestConfiguration): Boolean = {
        this == other
    }

    final override def asArrayValue: ArrayValue = this

}
object ArrayValue {

    final val KindId = 40

}

case class AnnotationValue(annotation: Annotation) extends ElementValue {

    final override def valueType = annotation.annotationType

    override def toJava: String = annotation.toJava

    override def kindId: Int = AnnotationValue.KindId

    override def similar(other: Attribute, config: SimilarityTestConfiguration): Boolean = {
        other match {
            case AnnotationValue(thatAnnotation) => this.annotation.similar(thatAnnotation)
            case _                               => false
        }
    }

    final override def asAnnotationValue: AnnotationValue = this
}
object AnnotationValue {

    final val KindId = 41

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy