
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