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

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

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

import org.opalj.bi.AccessFlagsContexts
import org.opalj.bi.AccessFlags

import scala.collection.immutable.ArraySeq

/**
 * Definition of a Java 9 module.
 *
 * @author Michael Eichberg
 */
case class Module(
        name:        String,
        moduleFlags: Int,
        versionInfo: Option[String],
        requires:    ArraySeq[Requires],
        exports:     ArraySeq[Exports],
        opens:       ArraySeq[Opens],
        uses:        ArraySeq[ObjectType],
        provides:    ArraySeq[Provides]
) extends Attribute {

    final override def kindId: Int = Module.KindId

    override def similar(other: Attribute, config: SimilarityTestConfiguration): Boolean = {
        // TODO make the comparisons order independent...
        this == other
    }
}

object Module {

    final val KindId = 44

}

/**
 * @param requires The name of a required module.
 */
case class Requires(requires: String, flags: Int, version: Option[String]) {

    def toJava: String = {
        var flags = AccessFlags.toString(this.flags, AccessFlagsContexts.MODULE)
        if (flags.nonEmpty) flags += " "
        val version = this.version.map(v => s" //$v").getOrElse("")
        s"requires $flags$requires;$version"
    }
}

/**
 * @param   exports Name of an exported package in internal form.
 * @param   exportsTo List of names of modules whose code can access the
 *          public types in this exported package (in internal form).
 */
case class Exports(exports: String, flags: Int, exportsTo: ArraySeq[String]) {

    def toJava: String = {
        var flags = AccessFlags.toString(this.flags, AccessFlagsContexts.MODULE)
        if (flags.nonEmpty) flags += " "
        val exportsTo =
            if (this.exportsTo.isEmpty) "" else this.exportsTo.mkString(" to ", ", ", "")

        s"exports $flags$exports$exportsTo;"
    }
}

/**
 * @param opens The name of the package.
 */
case class Opens(opens: String, flags: Int, toPackages: ArraySeq[String]) {

    def toJava: String = {
        val toPackages =
            if (this.toPackages.isEmpty) "" else this.toPackages.mkString(" to ", ", ", "")

        s"opens $opens$toPackages;"
    }

}

case class Provides(provides: ObjectType, withInterfaces: ArraySeq[ObjectType]) {

    def toJava: String = {
        val withInterfaces =
            if (this.withInterfaces.isEmpty)
                ""
            else
                this.withInterfaces.map(_.toJava).mkString(" with ", ", ", "")
        s"provides ${provides.toJava}$withInterfaces;"
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy