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

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

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

/**
 * Implements a visitor for type signatures.
 *
 * @author Michael Eichberg
 */
trait SignatureVisitor[T] {
    def visit(cs: ClassSignature): T
    def visit(mts: MethodTypeSignature): T
    def visit(cts: ClassTypeSignature): T
    def visit(ats: ArrayTypeSignature): T
    def visit(tvs: TypeVariableSignature): T
    def visit(scts: SimpleClassTypeSignature): T
    def visit(ftp: FormalTypeParameter): T
    def visit(pta: ProperTypeArgument): T
    def visit(cvi: CovariantIndicator): T
    def visit(cvi: ContravariantIndicator): T
    def visit(wc: Wildcard): T
    def visit(bt: BooleanType): T
    def visit(bt: ByteType): T
    def visit(it: IntegerType): T
    def visit(lt: LongType): T
    def visit(ct: CharType): T
    def visit(st: ShortType): T
    def visit(ft: FloatType): T
    def visit(dt: DoubleType): T
    def visit(vt: VoidType): T
}
/**
 * This visitor's `visit` methods completely traverse all elements of a type signature.
 */
trait TraversingVisitor extends SignatureVisitor[Unit] {

    override def visit(cs: ClassSignature): Unit = {
        cs.formalTypeParameters.foreach(_.accept(this))
        cs.superClassSignature.accept(this)
        cs.superInterfacesSignature.foreach(_.accept(this))
    }

    override def visit(mts: MethodTypeSignature): Unit = {
        mts.formalTypeParameters.foreach(_.accept(this))
        mts.parametersTypeSignatures.foreach(_.accept(this))
        mts.returnTypeSignature.accept(this)
        mts.throwsSignature.foreach(_.accept(this))
    }

    override def visit(cts: ClassTypeSignature): Unit = {
        cts.simpleClassTypeSignature.accept(this)
        cts.classTypeSignatureSuffix.foreach(_.accept(this))
    }

    override def visit(ats: ArrayTypeSignature): Unit = {
        ats.typeSignature.accept(this)
    }

    override def visit(tvs: TypeVariableSignature): Unit = { /* Leafnode */ }

    override def visit(scts: SimpleClassTypeSignature): Unit = {
        scts.typeArguments.foreach(_.accept(this))
    }

    override def visit(ftp: FormalTypeParameter): Unit = {
        ftp.classBound.foreach(_.accept(this))
        ftp.interfaceBound.foreach(_.accept(this))
    }

    override def visit(pta: ProperTypeArgument): Unit = {
        pta.varianceIndicator.foreach(_.accept(this))
        pta.fieldTypeSignature.accept(this)
    }

    override def visit(cvi: CovariantIndicator): Unit = { /* Leafnode */ }

    override def visit(cvi: ContravariantIndicator): Unit = { /* Leafnode */ }

    override def visit(wc: Wildcard): Unit = { /* Leafnode */ }

    override def visit(bt: BooleanType): Unit = { /* Leafnode */ }

    override def visit(bt: ByteType): Unit = { /* Leafnode */ }

    override def visit(it: IntegerType): Unit = { /* Leafnode */ }

    override def visit(lt: LongType): Unit = { /* Leafnode */ }

    override def visit(ct: CharType): Unit = { /* Leafnode */ }

    override def visit(st: ShortType): Unit = { /* Leafnode */ }

    override def visit(ft: FloatType): Unit = { /* Leafnode */ }

    override def visit(dt: DoubleType): Unit = { /* Leafnode */ }

    override def visit(vt: VoidType): Unit = { /* Leafnode */ }

}

/**
 * Traverses a signature and calls for each `Type` the given method.
 *
 * ==Thread Safety==
 * This class is thread-safe and reusable. I.e., you can use one instance
 * of this visitor to simultaneously process multiple signatures. In this
 * case, however, the given function `f` also has to be thread safe or you have
 * to use different functions.
 */
class TypesVisitor(val f: Type => Unit) extends TraversingVisitor {

    override def visit(cts: ClassTypeSignature): Unit = {
        f(cts.objectType)
        super.visit(cts)
    }

    override def visit(bt: BooleanType): Unit = { f(bt) }

    override def visit(bt: ByteType): Unit = { f(bt) }

    override def visit(it: IntegerType): Unit = { f(it) }

    override def visit(lt: LongType): Unit = { f(lt) }

    override def visit(ct: CharType): Unit = { f(ct) }

    override def visit(st: ShortType): Unit = { f(st) }

    override def visit(ft: FloatType): Unit = { f(ft) }

    override def visit(dt: DoubleType): Unit = { f(dt) }

    override def visit(vt: VoidType): Unit = { f(vt) }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy