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

io.shiftleft.passes.linking.capturinglinker.CapturingLinker.scala Maven / Gradle / Ivy

package io.shiftleft.passes.linking.capturinglinker

import gremlin.scala.ScalaGraph
import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes, nodes}
import io.shiftleft.diffgraph.DiffGraph
import io.shiftleft.passes.CpgPass
import org.apache.logging.log4j.{LogManager, Logger}

/**
  *
  * This pass has no other pass as prerequisite.
  */
class CapturingLinker(graph: ScalaGraph) extends CpgPass(graph) {
  import CapturingLinker.logger

  override def run(): Iterator[DiffGraph] = {
    val dstGraph = new DiffGraph

    val idToClosureBinding: Map[String, nodes.ClosureBinding] =
      graph.V
        .hasLabel(NodeTypes.CLOSURE_BINDING)
        .collect {
          case closureBinding: nodes.ClosureBinding =>
            (closureBinding.closureBindingId.get, closureBinding)
        }
        .toMap

    graph.V
      .hasLabel(NodeTypes.LOCAL)
      .sideEffect {
        case local: nodes.Local =>
          local.closureBindingId.foreach { closureBindingId =>
            idToClosureBinding.get(closureBindingId) match {
              case Some(closureBindingNode) =>
                dstGraph.addEdgeInOriginal(local, closureBindingNode, EdgeTypes.CAPTURED_BY)
              case None =>
                logger.error(s"Missing CLOSURE_BINDING node or invalid closureBindingId=$closureBindingId")
            }
          }
        case _ =>
      }
      .iterate()
    Iterator(dstGraph)
  }
}

object CapturingLinker {
  private val logger: Logger = LogManager.getLogger(classOf[CapturingLinker])
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy