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

io.shiftleft.js2cpg.astcreation.AstEdgeBuilder.scala Maven / Gradle / Ivy

package io.shiftleft.js2cpg.astcreation

import io.shiftleft.codepropertygraph.generated.EdgeTypes
import io.shiftleft.codepropertygraph.generated.nodes._
import io.shiftleft.js2cpg.datastructures.OrderTracker
import overflowdb.BatchedUpdate.DiffGraphBuilder
import org.slf4j.LoggerFactory

class AstEdgeBuilder(private val diffGraph: DiffGraphBuilder) {

  private val logger = LoggerFactory.getLogger(getClass)

  private def addOrder(node: NewNode, order: Int): Unit = node match {
    case n: NewTypeDecl          => n.order = order
    case n: NewBlock             => n.order = order
    case n: NewCall              => n.order = order
    case n: NewFieldIdentifier   => n.order = order
    case n: NewFile              => n.order = order
    case n: NewIdentifier        => n.order = order
    case n: NewLocal             => n.order = order
    case n: NewMethod            => n.order = order
    case n: NewMethodParameterIn => n.order = order
    case n: NewMethodRef         => n.order = order
    case n: NewNamespaceBlock    => n.order = order
    case n: NewTypeRef           => n.order = order
    case n: NewUnknown           => n.order = order
    case n: NewModifier          => n.order = order
    case n: NewMethodReturn      => n.order = order
    case n: NewMember            => n.order = order
    case n: NewControlStructure  => n.order = order
    case n: NewLiteral           => n.order = order
    case n: NewReturn            => n.order = order
    case n: NewJumpTarget        => n.order = order
    case n                       => logger.warn(s"Unable to set ORDER for node: '$n'")
  }

  private def addArgumentIndex(node: NewNode, argIndex: Int): Unit = node match {
    case n: NewBlock            => n.argumentIndex = argIndex
    case n: NewCall             => n.argumentIndex = argIndex
    case n: NewFieldIdentifier  => n.argumentIndex = argIndex
    case n: NewIdentifier       => n.argumentIndex = argIndex
    case n: NewMethodRef        => n.argumentIndex = argIndex
    case n: NewTypeRef          => n.argumentIndex = argIndex
    case n: NewUnknown          => n.argumentIndex = argIndex
    case n: NewControlStructure => n.argumentIndex = argIndex
    case n: NewLiteral          => n.argumentIndex = argIndex
    case n: NewReturn           => n.argumentIndex = argIndex
    case n                      => logger.warn(s"Unable to set ARGUMENT_INDEX for node: '$n'")
  }

  def addAstEdge(dstId: NewNode, srcId: NewNode, orderTracker: OrderTracker): Unit = {
    dstId match {
      case wrapper: NewCompositeNode =>
        wrapper.iterate { id =>
          addAstEdge(id, srcId, orderTracker)
        }
      case impl: NewNode =>
        addAstEdge(impl, srcId)
        addOrder(impl, orderTracker.order)
        orderTracker.inc()
    }
  }

  def addAstEdge(dstId: NewNode, srcId: NewNode, order: Int): Unit = {
    val orderTracker = new OrderTracker(order)
    addAstEdge(dstId, srcId, orderTracker)
  }

  def addAstEdge(dstId: NewNode, srcId: NewNode): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.AST)
  }

  def addConditionEdge(dstId: NewNode, srcId: NewNode): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.CONDITION)
  }

  def addReceiverEdge(dstId: NewNode, srcId: NewNode): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.RECEIVER)
  }

  def addRefEdge(dstId: NewNode, srcId: NewNode): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.REF)
  }

  def addCaptureEdge(dstId: NewNode, srcId: NewNode): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.CAPTURE)
  }

  def addBindsEdge(dstId: NewNode, srcId: NewNode): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.BINDS)
    addOrder(srcId, 0)
  }

  def addArgumentEdge(dstId: NewNode, srcId: NewNode): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.ARGUMENT)
  }

  def addArgumentEdge(dstId: NewNode, srcId: NewNode, orderTracker: OrderTracker): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.ARGUMENT)
    addArgumentIndex(dstId, orderTracker.order)
    orderTracker.inc()
  }

  def addArgumentEdge(dstId: NewNode, srcId: NewNode, argIndex: Int): Unit = {
    diffGraph.addEdge(srcId, dstId, EdgeTypes.ARGUMENT)
    addArgumentIndex(dstId, argIndex)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy