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

org.opalj.br.fpcf.properties.CompileTimeConstancy.scala Maven / Gradle / Ivy

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

import org.opalj.fpcf.FallbackReason
import org.opalj.fpcf.Entity
import org.opalj.fpcf.OrderedProperty
import org.opalj.fpcf.PropertyKey
import org.opalj.fpcf.PropertyMetaInformation
import org.opalj.fpcf.PropertyStore

sealed trait CompileTimeConstancyPropertyMetaInformation extends PropertyMetaInformation {

    final type Self = CompileTimeConstancy

}

/**
 * Describes whether a [[org.opalj.br.Field]] is initialized deterministically to the same value on
 * every execution of the program.
 *
 * @author Dominik Helm
 */
sealed abstract class CompileTimeConstancy
    extends OrderedProperty
    with CompileTimeConstancyPropertyMetaInformation {

    /**
     * The globally unique key of the [[CompileTimeConstancy]] property.
     */
    final def key: PropertyKey[CompileTimeConstancy] = CompileTimeConstancy.key

}

object CompileTimeConstancy extends CompileTimeConstancyPropertyMetaInformation {
    /**
     * The key associated with every compile-time constancy property. The name is
     * "CompileTimeConstancy"; the fallback is "CompileTimeVaryingField".
     */
    final val key = PropertyKey.create[Field, CompileTimeConstancy](
        "CompileTimeConstancy",
        (_: PropertyStore, _: FallbackReason, field: Field) => {
            if (field.isStatic && field.isFinal && field.constantFieldValue.isDefined)
                CompileTimeConstantField
            else
                CompileTimeVaryingField
        }
    )
}

/**
 * The constant field is deterministically initialized to the same value on every program run.
 */
case object CompileTimeConstantField extends CompileTimeConstancy {

    override def checkIsEqualOrBetterThan(e: Entity, other: CompileTimeConstancy): Unit = {}
}

/**
 * The field is not a constant or may be initialized to different values on different program runs.
 */
case object CompileTimeVaryingField extends CompileTimeConstancy {

    override def checkIsEqualOrBetterThan(e: Entity, other: CompileTimeConstancy): Unit = {
        if (other ne CompileTimeVaryingField)
            throw new IllegalArgumentException(s"$e: impossible refinement: $other => $this")
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy