diff --git a/build.sbt b/build.sbt index 897fa0fb8d67..e6f4d6fe56d6 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ name := "joern" ThisBuild / organization := "io.joern" ThisBuild / scalaVersion := "3.4.2" -val cpgVersion = "1.6.16" +val cpgVersion = "1.6.19" lazy val joerncli = Projects.joerncli lazy val querydb = Projects.querydb diff --git a/console/src/main/scala/io/joern/console/Commit.scala b/console/src/main/scala/io/joern/console/Commit.scala index 402b16d4c619..cfc8ec8ec667 100644 --- a/console/src/main/scala/io/joern/console/Commit.scala +++ b/console/src/main/scala/io/joern/console/Commit.scala @@ -3,7 +3,7 @@ package io.joern.console import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.passes.CpgPass import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder object Commit { val overlayName: String = "commit" diff --git a/console/src/main/scala/io/joern/console/Console.scala b/console/src/main/scala/io/joern/console/Console.scala index 9f8ac55e2b17..1fe5e188f77d 100644 --- a/console/src/main/scala/io/joern/console/Console.scala +++ b/console/src/main/scala/io/joern/console/Console.scala @@ -12,7 +12,7 @@ import io.shiftleft.codepropertygraph.cpgloading.CpgLoader import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.dotextension.ImageViewer import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext} -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc import overflowdb.traversal.help.Table.AvailableWidthProvider import scala.sys.process.Process diff --git a/console/src/main/scala/io/joern/console/ConsoleConfig.scala b/console/src/main/scala/io/joern/console/ConsoleConfig.scala index a5b4ea738f95..fc86ca54d857 100644 --- a/console/src/main/scala/io/joern/console/ConsoleConfig.scala +++ b/console/src/main/scala/io/joern/console/ConsoleConfig.scala @@ -1,6 +1,6 @@ package io.joern.console -import better.files._ +import better.files.* import scala.annotation.tailrec import scala.collection.mutable diff --git a/console/src/main/scala/io/joern/console/PluginManager.scala b/console/src/main/scala/io/joern/console/PluginManager.scala index 0d049a1ab640..0666355bc429 100644 --- a/console/src/main/scala/io/joern/console/PluginManager.scala +++ b/console/src/main/scala/io/joern/console/PluginManager.scala @@ -1,5 +1,5 @@ package io.joern.console -import better.files.Dsl._ +import better.files.Dsl.* import better.files.File import better.files.File.apply diff --git a/console/src/main/scala/io/joern/console/Run.scala b/console/src/main/scala/io/joern/console/Run.scala index 5dfe92451f25..8724056ca080 100644 --- a/console/src/main/scala/io/joern/console/Run.scala +++ b/console/src/main/scala/io/joern/console/Run.scala @@ -6,7 +6,7 @@ import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext} import org.reflections8.Reflections import org.reflections8.util.{ClasspathHelper, ConfigurationBuilder} -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* object Run { @@ -64,7 +64,7 @@ object Run { | |val opts = new OptsDynamic() | - | import _root_.overflowdb.BatchedUpdate.DiffGraphBuilder + | import _root_.io.shiftleft.codepropertygraph.generated.DiffGraphBuilder | implicit def _diffGraph: DiffGraphBuilder = opts.commit.diffGraphBuilder | def diffGraph = _diffGraph |""".stripMargin diff --git a/console/src/main/scala/io/joern/console/cpgcreation/CpgGenerator.scala b/console/src/main/scala/io/joern/console/cpgcreation/CpgGenerator.scala index e429124dc67a..6a816135227f 100644 --- a/console/src/main/scala/io/joern/console/cpgcreation/CpgGenerator.scala +++ b/console/src/main/scala/io/joern/console/cpgcreation/CpgGenerator.scala @@ -3,7 +3,7 @@ package io.joern.console.cpgcreation import better.files.File import io.shiftleft.codepropertygraph.generated.Cpg -import scala.sys.process._ +import scala.sys.process.* import scala.util.Try /** A CpgGenerator generates Code Property Graphs from code. Each supported language implements a Generator, e.g., diff --git a/console/src/main/scala/io/joern/console/cpgcreation/CpgGeneratorFactory.scala b/console/src/main/scala/io/joern/console/cpgcreation/CpgGeneratorFactory.scala index 710ba95363dc..fc406b336e01 100644 --- a/console/src/main/scala/io/joern/console/cpgcreation/CpgGeneratorFactory.scala +++ b/console/src/main/scala/io/joern/console/cpgcreation/CpgGeneratorFactory.scala @@ -1,6 +1,6 @@ package io.joern.console.cpgcreation -import better.files.Dsl._ +import better.files.Dsl.* import better.files.File import io.shiftleft.codepropertygraph.cpgloading.{CpgLoader, CpgLoaderConfig} import io.shiftleft.codepropertygraph.generated.Languages diff --git a/console/src/main/scala/io/joern/console/cpgcreation/JavaCpgGenerator.scala b/console/src/main/scala/io/joern/console/cpgcreation/JavaCpgGenerator.scala index 1d9277902471..307a4d1793b7 100644 --- a/console/src/main/scala/io/joern/console/cpgcreation/JavaCpgGenerator.scala +++ b/console/src/main/scala/io/joern/console/cpgcreation/JavaCpgGenerator.scala @@ -3,7 +3,7 @@ package io.joern.console.cpgcreation import io.joern.console.FrontendConfig import java.nio.file.Path -import scala.sys.process._ +import scala.sys.process.* import scala.util.{Failure, Try} /** Language frontend for Java archives (JAR files). Translates Java archives into code property graphs. diff --git a/console/src/main/scala/io/joern/console/workspacehandling/Project.scala b/console/src/main/scala/io/joern/console/workspacehandling/Project.scala index 8de086cd693b..68d2ddc8780e 100644 --- a/console/src/main/scala/io/joern/console/workspacehandling/Project.scala +++ b/console/src/main/scala/io/joern/console/workspacehandling/Project.scala @@ -1,6 +1,6 @@ package io.joern.console.workspacehandling -import better.files.Dsl._ +import better.files.Dsl.* import better.files.File import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.semanticcpg.Overlays diff --git a/console/src/main/scala/io/joern/console/workspacehandling/WorkspaceManager.scala b/console/src/main/scala/io/joern/console/workspacehandling/WorkspaceManager.scala index 723a058617dc..c683300fe171 100644 --- a/console/src/main/scala/io/joern/console/workspacehandling/WorkspaceManager.scala +++ b/console/src/main/scala/io/joern/console/workspacehandling/WorkspaceManager.scala @@ -1,7 +1,7 @@ package io.joern.console.workspacehandling -import better.files.Dsl._ -import better.files._ +import better.files.Dsl.* +import better.files.* import io.joern.console import io.joern.console.defaultAvailableWidthProvider import io.joern.console.Reporting @@ -315,7 +315,7 @@ class WorkspaceManager[ProjectType <: Project](path: String, loader: WorkspaceLo case Success(v) => Some(v) case Failure(ex) => System.err.println("Error loading CPG") - System.err.println(ex) + ex.printStackTrace() None } } diff --git a/console/src/test/scala/io/joern/console/ConsoleTests.scala b/console/src/test/scala/io/joern/console/ConsoleTests.scala index 1114558d56fb..f88cf0ad0996 100644 --- a/console/src/test/scala/io/joern/console/ConsoleTests.scala +++ b/console/src/test/scala/io/joern/console/ConsoleTests.scala @@ -1,11 +1,11 @@ package io.joern.console -import better.files.Dsl._ -import better.files._ -import io.joern.console.testing._ +import better.files.Dsl.* +import better.files.* +import io.joern.console.testing.* import io.joern.x2cpg.X2Cpg.defaultOverlayCreators import io.joern.x2cpg.layers.{Base, CallGraph, ControlFlow, TypeRelations} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext} import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/console/src/test/scala/io/joern/console/LanguageHelperTests.scala b/console/src/test/scala/io/joern/console/LanguageHelperTests.scala index 80b145767aea..afe860453215 100644 --- a/console/src/test/scala/io/joern/console/LanguageHelperTests.scala +++ b/console/src/test/scala/io/joern/console/LanguageHelperTests.scala @@ -1,7 +1,7 @@ package io.joern.console -import better.files.Dsl._ -import better.files._ +import better.files.Dsl.* +import better.files.* import io.shiftleft.codepropertygraph.generated.Languages import io.joern.console.cpgcreation.{guessLanguage, LlvmCpgGenerator} import org.scalatest.matchers.should.Matchers diff --git a/console/src/test/scala/io/joern/console/PluginManagerTests.scala b/console/src/test/scala/io/joern/console/PluginManagerTests.scala index 9a0957769c27..63eb5d2b933c 100644 --- a/console/src/test/scala/io/joern/console/PluginManagerTests.scala +++ b/console/src/test/scala/io/joern/console/PluginManagerTests.scala @@ -1,7 +1,7 @@ package io.joern.console -import better.files.Dsl._ -import better.files._ +import better.files.Dsl.* +import better.files.* import io.shiftleft.utils.ProjectRoot import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/console/src/test/scala/io/joern/console/workspacehandling/WorkspaceManagerTests.scala b/console/src/test/scala/io/joern/console/workspacehandling/WorkspaceManagerTests.scala index 4d1ddb669d49..867f2e4cfd06 100644 --- a/console/src/test/scala/io/joern/console/workspacehandling/WorkspaceManagerTests.scala +++ b/console/src/test/scala/io/joern/console/workspacehandling/WorkspaceManagerTests.scala @@ -1,6 +1,6 @@ package io.joern.console.workspacehandling -import better.files._ +import better.files.* import io.shiftleft.codepropertygraph.generated.Cpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/console/src/test/scala/io/joern/console/workspacehandling/WorkspaceTests.scala b/console/src/test/scala/io/joern/console/workspacehandling/WorkspaceTests.scala index 0abe2f0887d2..9d1b5f48b3ef 100644 --- a/console/src/test/scala/io/joern/console/workspacehandling/WorkspaceTests.scala +++ b/console/src/test/scala/io/joern/console/workspacehandling/WorkspaceTests.scala @@ -1,6 +1,6 @@ package io.joern.console.workspacehandling -import better.files.Dsl._ +import better.files.Dsl.* import better.files.File import io.joern.console.testing.availableWidthProvider import io.shiftleft.semanticcpg.testing.MockCpg diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/dotgenerator/DdgGenerator.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/dotgenerator/DdgGenerator.scala index 61c55435add3..bc6428e2f57c 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/dotgenerator/DdgGenerator.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/dotgenerator/DdgGenerator.scala @@ -1,15 +1,13 @@ package io.joern.dataflowengineoss.dotgenerator import io.joern.dataflowengineoss.DefaultSemantics -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, Properties} -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.semanticsloader.Semantics import io.shiftleft.semanticcpg.dotgenerator.DotSerializer.{Edge, Graph} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.utils.MemberAccess.isGenericMemberAccessName -import overflowdb.Node -import overflowdb.traversal.jIteratortoTraversal import scala.collection.mutable @@ -59,7 +57,7 @@ class DdgGenerator { } } - private def shouldBeDisplayed(v: Node): Boolean = !( + private def shouldBeDisplayed(v: StoredNode): Boolean = !( v.isInstanceOf[ControlStructure] || v.isInstanceOf[JumpTarget] ) diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/language/package.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/language/package.scala index 842ce65d0d74..7101c872177f 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/language/package.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/language/package.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* import io.joern.dataflowengineoss.language.dotextension.DdgNodeDot import io.joern.dataflowengineoss.language.nodemethods.{ExpressionMethods, ExtendedCfgNodeMethods} -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc import scala.language.implicitConversions diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpCpg14.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpCpg14.scala index 16ea1b420cb0..4575fba5ab9b 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpCpg14.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpCpg14.scala @@ -2,9 +2,9 @@ package io.joern.dataflowengineoss.layers.dataflows import better.files.File import io.joern.dataflowengineoss.DefaultSemantics -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} case class Cpg14DumpOptions(var outDir: String) extends LayerCreatorOptions {} diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpDdg.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpDdg.scala index ec5db89d16c6..c76e5b9275d5 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpDdg.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpDdg.scala @@ -2,9 +2,9 @@ package io.joern.dataflowengineoss.layers.dataflows import better.files.File import io.joern.dataflowengineoss.DefaultSemantics -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} case class DdgDumpOptions(var outDir: String) extends LayerCreatorOptions {} diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpPdg.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpPdg.scala index 2221a5372c8d..3b3dc6d24d30 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpPdg.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/layers/dataflows/DumpPdg.scala @@ -2,9 +2,9 @@ package io.joern.dataflowengineoss.layers.dataflows import better.files.File import io.joern.dataflowengineoss.DefaultSemantics -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} case class PdgDumpOptions(var outDir: String) extends LayerCreatorOptions {} diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/DdgGenerator.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/DdgGenerator.scala index 887531648c7e..de3b6a8a99a1 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/DdgGenerator.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/DdgGenerator.scala @@ -7,7 +7,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, Operators, PropertyNames} import io.shiftleft.semanticcpg.accesspath.MatchResult import io.shiftleft.semanticcpg.language.* -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import scala.collection.{Set, mutable} diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/ReachingDefPass.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/ReachingDefPass.scala index a5aab780ed00..78b8f82cb20e 100755 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/ReachingDefPass.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/ReachingDefPass.scala @@ -2,9 +2,9 @@ package io.joern.dataflowengineoss.passes.reachingdef import io.joern.dataflowengineoss.semanticsloader.Semantics import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.slf4j.{Logger, LoggerFactory} import scala.collection.mutable diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/ReachingDefProblem.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/ReachingDefProblem.scala index 936f43ef4b9f..e06bb34447e0 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/ReachingDefProblem.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/passes/reachingdef/ReachingDefProblem.scala @@ -167,7 +167,7 @@ class ReachingDefTransferFunction(flowGraph: ReachingDefFlowGraph) val gen: Map[StoredNode, mutable.BitSet] = initGen(method).withDefaultValue(mutable.BitSet()) - val kill: Map[StoredNode, Set[Definition]] = + val kill: Map[StoredNode, mutable.BitSet] = initKill(method, gen).withDefaultValue(mutable.BitSet()) /** For a given flow graph node `n` and set of definitions, apply the transfer function to obtain the updated set of @@ -224,7 +224,7 @@ class ReachingDefTransferFunction(flowGraph: ReachingDefFlowGraph) * All operations in our graph are represented by calls and non-operations such as identifiers or field-identifiers * have empty gen and kill sets, meaning that they just pass on definitions unaltered. */ - private def initKill(method: Method, gen: Map[StoredNode, Set[Definition]]): Map[StoredNode, Set[Definition]] = { + private def initKill(method: Method, gen: Map[StoredNode, mutable.BitSet]): Map[StoredNode, mutable.BitSet] = { val allIdentifiers: Map[String, List[CfgNode]] = { val results = mutable.Map.empty[String, List[CfgNode]] @@ -259,42 +259,44 @@ class ReachingDefTransferFunction(flowGraph: ReachingDefFlowGraph) * calculate kill(call) based on gen(call). */ private def killsForGens( - genOfCall: Set[Definition], + genOfCall: mutable.BitSet, allIdentifiers: Map[String, List[CfgNode]], allCalls: Map[String, List[Call]] - ): Set[Definition] = { + ): mutable.BitSet = { - def definitionsOfSameVariable(definition: Definition): Set[Definition] = { + def definitionsOfSameVariable(definition: Definition): Iterator[Definition] = { val definedNodes = flowGraph.numberToNode(definition) match { case param: MethodParameterIn => - allIdentifiers(param.name) + allIdentifiers(param.name).iterator .filter(x => x.id != param.id) case identifier: Identifier => - val sameIdentifiers = allIdentifiers(identifier.name) + val sameIdentifiers = allIdentifiers(identifier.name).iterator .filter(x => x.id != identifier.id) /** Killing an identifier should also kill field accesses on that identifier. For example, a reassignment `x = * new Box()` should kill any previous calls to `x.value`, `x.length()`, etc. */ - val sameObjects: Iterable[Call] = allCalls.values.flatten + val sameObjects: Iterator[Call] = allCalls.valuesIterator.flatten .filter(_.name == Operators.fieldAccess) .filter(_.ast.isIdentifier.nameExact(identifier.name).nonEmpty) sameIdentifiers ++ sameObjects case call: Call => - allCalls(call.code) + allCalls(call.code).iterator .filter(x => x.id != call.id) - case _ => Set() + case _ => Iterator.empty } definedNodes // It can happen that the CFG is broken and contains isolated nodes, // in which case they are not in `nodeToNumber`. Let's filter those. - .collect { case x if nodeToNumber.contains(x) => Definition.fromNode(x, nodeToNumber) }.toSet + .collect { case x if nodeToNumber.contains(x) => Definition.fromNode(x, nodeToNumber) } } - genOfCall.flatMap { definition => - definitionsOfSameVariable(definition) + val res = mutable.BitSet() + for (definition <- genOfCall) { + res.addAll(definitionsOfSameVariable(definition)) } + res } } diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/AccessPathUsage.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/AccessPathUsage.scala index 341f29621d53..534b8bb565b8 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/AccessPathUsage.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/AccessPathUsage.scala @@ -1,8 +1,8 @@ package io.joern.dataflowengineoss.queryengine -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.accesspath._ -import io.shiftleft.semanticcpg.language.{AccessPathHandling, toCallMethods} +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.accesspath.* +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.utils.MemberAccess import org.slf4j.LoggerFactory diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/Engine.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/Engine.scala index 1c0c279a9758..94005b5304fd 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/Engine.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/Engine.scala @@ -254,7 +254,6 @@ object Engine { private def ddgInE(node: CfgNode, path: Vector[PathElement], callSiteStack: List[Call] = List()): Vector[Edge] = { node .inE(EdgeTypes.REACHING_DEF) - .asScala .filter { e => e.outNode() match { case srcNode: CfgNode => diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/HeldTaskCompletion.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/HeldTaskCompletion.scala index f0b0cf5fc9e1..46326fbc0e6c 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/HeldTaskCompletion.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/HeldTaskCompletion.scala @@ -1,7 +1,7 @@ package io.joern.dataflowengineoss.queryengine import scala.collection.mutable -import scala.collection.parallel.CollectionConverters._ +import scala.collection.parallel.CollectionConverters.* /** Complete held tasks using the result table. The result table is modified in the process. * diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/SourcesToStartingPoints.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/SourcesToStartingPoints.scala index cac222fbd476..9ee6b967ca79 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/SourcesToStartingPoints.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/SourcesToStartingPoints.scala @@ -32,7 +32,7 @@ object SourcesToStartingPoints { .map(src => { // We need to get Cpg wrapper from graph. Hence we are taking head element from source iterator. // This will also ensure if the source list is empty then these tasks are invoked. - val cpg = Cpg(src.graph()) + val cpg = Cpg(src.graph) val (startingPoints, methodTasks) = calculateStartingPoints(sources, executorService) val startingPointFromUsageInOtherClasses = calculateStatingPointsWithUsageInOtherClasses(methodTasks, cpg, executorService) diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/TaskCreator.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/TaskCreator.scala index f10f105d2409..5c8713e505c8 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/TaskCreator.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/TaskCreator.scala @@ -100,7 +100,7 @@ class TaskCreator(context: EngineContext) { */ private def paramToMethodRefCallReceivers(param: MethodParameterIn): List[Expression] = - new Cpg(param.graph()).methodRef.methodFullNameExact(param.method.fullName).inCall.argument(0).l + new Cpg(param.graph).methodRef.methodFullNameExact(param.method.fullName).inCall.argument(0).l /** Create new tasks from all results that end in an output argument, including return arguments. In this case, we * want to traverse to corresponding method output parameters and method return nodes respectively. diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/TaskSolver.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/TaskSolver.scala index 263251775694..b363112c358a 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/TaskSolver.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/queryengine/TaskSolver.scala @@ -2,7 +2,7 @@ package io.joern.dataflowengineoss.queryengine import io.joern.dataflowengineoss.queryengine.QueryEngineStatistics.{PATH_CACHE_HITS, PATH_CACHE_MISSES} import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.{toCfgNodeMethods, toExpressionMethods, _} import java.util.concurrent.Callable diff --git a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/semanticsloader/Parser.scala b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/semanticsloader/Parser.scala index f3e245d575c3..e3c4796791a4 100644 --- a/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/semanticsloader/Parser.scala +++ b/dataflowengineoss/src/main/scala/io/joern/dataflowengineoss/semanticsloader/Parser.scala @@ -7,7 +7,7 @@ import org.antlr.v4.runtime.tree.ParseTreeWalker import org.antlr.v4.runtime.{CharStream, CharStreams, CommonTokenStream} import scala.collection.mutable -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* object Semantics { diff --git a/dataflowengineoss/src/test/scala/io/joern/dataflowengineoss/queryengine/AccessPathUsageTests.scala b/dataflowengineoss/src/test/scala/io/joern/dataflowengineoss/queryengine/AccessPathUsageTests.scala index a0bb2ea6a4bf..668c37ce2fb2 100644 --- a/dataflowengineoss/src/test/scala/io/joern/dataflowengineoss/queryengine/AccessPathUsageTests.scala +++ b/dataflowengineoss/src/test/scala/io/joern/dataflowengineoss/queryengine/AccessPathUsageTests.scala @@ -1,13 +1,13 @@ package io.joern.dataflowengineoss.queryengine import io.shiftleft.OverflowDbTestInstance -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes, Operators, Properties} import io.joern.dataflowengineoss.queryengine.AccessPathUsage.toTrackedBaseAndAccessPathSimple -import io.shiftleft.semanticcpg.accesspath._ -import org.scalatest.matchers.should.Matchers._ +import io.shiftleft.semanticcpg.accesspath.* +import org.scalatest.matchers.should.Matchers.* import org.scalatest.wordspec.AnyWordSpec -import overflowdb._ +import overflowdb.* class AccessPathUsageTests extends AnyWordSpec { diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/Main.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/Main.scala index 358a14f3c1c5..af116f921c23 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/Main.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/Main.scala @@ -1,6 +1,6 @@ package io.joern.c2cpg -import io.joern.c2cpg.Frontend._ +import io.joern.c2cpg.Frontend.* import io.joern.x2cpg.{X2CpgConfig, X2CpgMain} import org.slf4j.LoggerFactory import scopt.OParser diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstCreator.scala index 6f4ca5fbd34b..6fe50d102f49 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstCreator.scala @@ -10,7 +10,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal import org.eclipse.cdt.core.dom.ast.{IASTNode, IASTTranslationUnit} import org.slf4j.{Logger, LoggerFactory} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import java.util.concurrent.ConcurrentHashMap import scala.collection.mutable @@ -82,12 +82,12 @@ class AstCreator( methodAstParentStack.push(fakeGlobalMethod) scope.pushNewScope(fakeGlobalMethod) - val blockNode_ = blockNode(iASTTranslationUnit, Defines.empty, registerType(Defines.anyTypeName)) + val blockNode_ = blockNode(iASTTranslationUnit) val declsAsts = allDecls.flatMap(astsForDeclaration) setArgumentIndices(declsAsts) - val methodReturn = newMethodReturnNode(iASTTranslationUnit, Defines.anyTypeName) + val methodReturn = methodReturnNode(iASTTranslationUnit, Defines.Any) Ast(fakeGlobalTypeDecl).withChild( methodAst(fakeGlobalMethod, Seq.empty, blockAst(blockNode_, declsAsts), methodReturn) ) @@ -100,7 +100,7 @@ class AstCreator( } override protected def lineEnd(node: IASTNode): Option[Int] = { - nullSafeFileLocation(node).map(_.getEndingLineNumber) + nullSafeFileLocationLast(node).map(_.getEndingLineNumber) } protected def column(node: IASTNode): Option[Int] = { diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstCreatorHelper.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstCreatorHelper.scala index a15e0f844637..e074518a73fb 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstCreatorHelper.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstCreatorHelper.scala @@ -4,6 +4,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.{ExpressionNew, NewCall, N import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.x2cpg.{Ast, SourceFiles, ValidationMode} import io.joern.x2cpg.utils.NodeBuilders.newDependencyNode +import io.joern.x2cpg.Defines as X2CpgDefines import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.utils.IOUtils import org.apache.commons.lang3.StringUtils @@ -46,8 +47,6 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As private var usedVariablePostfix: Int = 0 - private val IncludeKeyword = "include" - protected def isIncludedNode(node: IASTNode): Boolean = fileName(node) != filename protected def uniqueName(target: String, name: String, fullName: String): (String, String) = { @@ -80,6 +79,8 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As protected def nullSafeFileLocation(node: IASTNode): Option[IASTFileLocation] = Option(cdtAst.flattenLocationsToFile(node.getNodeLocations)).map(_.asFileLocation()) + protected def nullSafeFileLocationLast(node: IASTNode): Option[IASTFileLocation] = + Option(cdtAst.flattenLocationsToFile(node.getNodeLocations.lastOption.toArray)).map(_.asFileLocation()) protected def fileName(node: IASTNode): String = { val path = nullSafeFileLocation(node).map(_.getFileName).getOrElse(filename) @@ -125,6 +126,7 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As ) protected def cleanType(rawType: String, stripKeywords: Boolean = true): String = { + if (rawType == Defines.Any) return rawType val tpe = if (stripKeywords) { reservedTypeKeywords.foldLeft(rawType) { (cur, repl) => @@ -138,22 +140,24 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As rawType } StringUtils.normalizeSpace(tpe) match { - case "" => Defines.anyTypeName - case t if t.contains("org.eclipse.cdt.internal.core.dom.parser.ProblemType") => Defines.anyTypeName + case "" => Defines.Any + case t if t.contains("org.eclipse.cdt.internal.core.dom.parser.ProblemType") => Defines.Any case t if t.contains(" ->") && t.contains("}::") => fixQualifiedName(t.substring(t.indexOf("}::") + 3, t.indexOf(" ->"))) case t if t.contains(" ->") => fixQualifiedName(t.substring(0, t.indexOf(" ->"))) case t if t.contains("( ") => fixQualifiedName(t.substring(0, t.indexOf("( "))) - case t if t.contains("?") => Defines.anyTypeName - case t if t.contains("#") => Defines.anyTypeName + case t if t.contains("?") => Defines.Any + case t if t.contains("#") => Defines.Any + case t if t.contains("::{") || t.contains("}::") => Defines.Any case t if t.contains("{") && t.contains("}") => - val anonType = - s"${uniqueName("type", "", "")._1}${t.substring(0, t.indexOf("{"))}${t.substring(t.indexOf("}") + 1)}" + val beforeBracket = t.substring(0, t.indexOf("{")) + val afterBracket = t.substring(t.indexOf("}") + 1) + val anonType = s"${uniqueName("type", "", "")._1}$beforeBracket$afterBracket" anonType.replace(" ", "") - case t if t.startsWith("[") && t.endsWith("]") => Defines.anyTypeName - case t if t.contains(Defines.qualifiedNameSeparator) => fixQualifiedName(t) + case t if t.startsWith("[") && t.endsWith("]") => Defines.Any + case t if t.contains(Defines.QualifiedNameSeparator) => fixQualifiedName(t) case t if t.startsWith("unsigned ") => "unsigned " + t.substring(9).replace(" ", "") case t if t.contains("[") && t.contains("]") => t.replace(" ", "") case t if t.contains("*") => t.replace(" ", "") @@ -166,6 +170,16 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As Try(expr.getEvaluation).toOption } + protected def safeGetType(tpe: IType): String = { + // In case of unresolved includes etc. this may fail throwing an unrecoverable exception + Try(ASTTypeUtil.getType(tpe)).getOrElse(Defines.Any) + } + + private def safeGetNodeType(node: IASTNode): String = { + // In case of unresolved includes etc. this may fail throwing an unrecoverable exception + Try(ASTTypeUtil.getNodeType(node)).getOrElse(Defines.Any) + } + @nowarn protected def typeFor(node: IASTNode, stripKeywords: Boolean = true): String = { import org.eclipse.cdt.core.dom.ast.ASTSignatureUtil.getNodeSignature @@ -173,16 +187,15 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As case f: CPPASTFieldReference => safeGetEvaluation(f.getFieldOwner) match { case Some(evaluation: EvalBinding) => cleanType(evaluation.getType.toString, stripKeywords) - case _ => cleanType(ASTTypeUtil.getType(f.getFieldOwner.getExpressionType), stripKeywords) + case _ => cleanType(safeGetType(f.getFieldOwner.getExpressionType), stripKeywords) } case f: IASTFieldReference => - cleanType(ASTTypeUtil.getType(f.getFieldOwner.getExpressionType), stripKeywords) - case a: IASTArrayDeclarator if ASTTypeUtil.getNodeType(a).startsWith("? ") => + cleanType(safeGetType(f.getFieldOwner.getExpressionType), stripKeywords) + case a: IASTArrayDeclarator if safeGetNodeType(a).startsWith("? ") => val tpe = getNodeSignature(a).replace("[]", "").strip() - val arr = ASTTypeUtil.getNodeType(a).replace("? ", "") + val arr = safeGetNodeType(a).replace("? ", "") s"$tpe$arr" - case a: IASTArrayDeclarator - if ASTTypeUtil.getNodeType(a).contains("} ") || ASTTypeUtil.getNodeType(a).contains(" [") => + case a: IASTArrayDeclarator if safeGetNodeType(a).contains("} ") || safeGetNodeType(a).contains(" [") => val tpe = getNodeSignature(a).replace("[]", "").strip() val arr = a.getArrayModifiers.map { case m if m.getConstantExpression != null => s"[${nodeSignature(m.getConstantExpression)}]" @@ -201,12 +214,12 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As case Some(evalBinding: EvalBinding) => evalBinding.getBinding match { case m: CPPMethod => cleanType(fullName(m.getDefinition)) - case _ => cleanType(ASTTypeUtil.getNodeType(s), stripKeywords) + case _ => cleanType(safeGetNodeType(s), stripKeywords) } - case _ => cleanType(ASTTypeUtil.getNodeType(s), stripKeywords) + case _ => cleanType(safeGetNodeType(s), stripKeywords) } case _: IASTIdExpression | _: IASTName | _: IASTDeclarator => - cleanType(ASTTypeUtil.getNodeType(node), stripKeywords) + cleanType(safeGetNodeType(node), stripKeywords) case s: IASTNamedTypeSpecifier => cleanType(ASTStringUtil.getReturnTypeString(s, null), stripKeywords) case s: IASTCompositeTypeSpecifier => @@ -216,9 +229,9 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As case s: IASTElaboratedTypeSpecifier => cleanType(ASTStringUtil.getReturnTypeString(s, null), stripKeywords) case l: IASTLiteralExpression => - cleanType(ASTTypeUtil.getType(l.getExpressionType)) + cleanType(safeGetType(l.getExpressionType)) case e: IASTExpression => - cleanType(ASTTypeUtil.getNodeType(e), stripKeywords) + cleanType(safeGetNodeType(e), stripKeywords) case c: ICPPASTConstructorInitializer if c.getParent.isInstanceOf[ICPPASTConstructorChainInitializer] => cleanType( fullName(c.getParent.asInstanceOf[ICPPASTConstructorChainInitializer].getMemberInitializerId), @@ -271,25 +284,28 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As protected def dereferenceTypeFullName(fullName: String): String = fullName.replace("*", "") - protected def fixQualifiedName(name: String): String = - name.stripPrefix(Defines.qualifiedNameSeparator).replace(Defines.qualifiedNameSeparator, ".") + protected def fixQualifiedName(name: String): String = { + val normalizedName = StringUtils.normalizeSpace(name) + normalizedName.stripPrefix(Defines.QualifiedNameSeparator).replace(Defines.QualifiedNameSeparator, ".") + } protected def isQualifiedName(name: String): Boolean = - name.startsWith(Defines.qualifiedNameSeparator) + name.startsWith(Defines.QualifiedNameSeparator) protected def lastNameOfQualifiedName(name: String): String = { - val cleanedName = if (name.contains("<") && name.contains(">")) { - name.substring(0, name.indexOf("<")) + val normalizedName = StringUtils.normalizeSpace(name) + val cleanedName = if (normalizedName.contains("<") && normalizedName.contains(">")) { + name.substring(0, normalizedName.indexOf("<")) } else { - name + normalizedName } - cleanedName.split(Defines.qualifiedNameSeparator).lastOption.getOrElse(cleanedName) + cleanedName.split(Defines.QualifiedNameSeparator).lastOption.getOrElse(cleanedName) } protected def functionTypeToSignature(typ: IFunctionType): String = { - val returnType = ASTTypeUtil.getType(typ.getReturnType) - val parameterTypes = typ.getParameterTypes.map(ASTTypeUtil.getType) - s"$returnType(${parameterTypes.mkString(",")})" + val returnType = cleanType(safeGetType(typ.getReturnType)) + val parameterTypes = typ.getParameterTypes.map(t => cleanType(safeGetType(t))) + StringUtils.normalizeSpace(s"$returnType(${parameterTypes.mkString(",")})") } protected def fullName(node: IASTNode): String = { @@ -306,15 +322,29 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As } return fn case field: ICPPField => + val fullNameNoSig = field.getQualifiedName.mkString(".") + val fn = + if (field.isExternC) { + field.getName + } else { + s"$fullNameNoSig:${cleanType(safeGetType(field.getType))}" + } + return fn case _: IProblemBinding => - return "" + val fullNameNoSig = ASTStringUtil.getQualifiedName(declarator.getName) + val fixedFullName = fixQualifiedName(fullNameNoSig).stripPrefix(".") + if (fixedFullName.isEmpty) { + return s"${X2CpgDefines.UnresolvedNamespace}:${X2CpgDefines.UnresolvedSignature}" + } else { + return s"$fixedFullName:${X2CpgDefines.UnresolvedSignature}" + } + case _ => } case declarator: CASTFunctionDeclarator => - val fn = declarator.getName.toString - return fn + return declarator.getName.toString case definition: ICPPASTFunctionDefinition => return fullName(definition.getDeclarator) - case x => + case _ => } val qualifiedName: String = node match { @@ -352,6 +382,13 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As s"${fullName(enumSpecifier.getParent)}.${ASTStringUtil.getSimpleName(enumSpecifier.getName)}" case f: ICPPASTLambdaExpression => s"${fullName(f.getParent)}." + case f: IASTFunctionDeclarator + if ASTStringUtil.getSimpleName(f.getName).isEmpty && f.getNestedDeclarator != null => + s"${fullName(f.getParent)}.${shortName(f.getNestedDeclarator)}" + case f: IASTFunctionDeclarator if f.getParent.isInstanceOf[IASTFunctionDefinition] => + s"${fullName(f.getParent)}" + case f: IASTFunctionDeclarator => + s"${fullName(f.getParent)}.${ASTStringUtil.getSimpleName(f.getName)}" case f: IASTFunctionDefinition if f.getDeclarator != null => s"${fullName(f.getParent)}.${ASTStringUtil.getQualifiedName(f.getDeclarator.getName)}" case f: IASTFunctionDefinition => @@ -430,7 +467,7 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As val allIncludes = iASTTranslationUnit.getIncludeDirectives.toList.filterNot(isIncludedNode) allIncludes.map { include => val name = include.getName.toString - val _dependencyNode = newDependencyNode(name, name, IncludeKeyword) + val _dependencyNode = newDependencyNode(name, name, "include") val importNode = newImportNode(code(include), name, name, include) diffGraph.addNode(_dependencyNode) diffGraph.addEdge(importNode, _dependencyNode, EdgeTypes.IMPORTS) @@ -447,19 +484,19 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As } private def astForDecltypeSpecifier(decl: ICPPASTDecltypeSpecifier): Ast = { - val op = ".typeOf" - val cpgUnary = callNode(decl, code(decl), op, op, DispatchTypes.STATIC_DISPATCH) + val op = Defines.OperatorTypeOf + val cpgUnary = callNode(decl, code(decl), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val operand = nullSafeAst(decl.getDecltypeExpression) callAst(cpgUnary, List(operand)) } private def astForCASTDesignatedInitializer(d: ICASTDesignatedInitializer): Ast = { - val node = blockNode(d, Defines.empty, Defines.voidTypeName) + val node = blockNode(d, Defines.Empty, Defines.Void) scope.pushNewScope(node) val op = Operators.assignment val calls = withIndex(d.getDesignators) { (des, o) => val callNode_ = - callNode(d, code(d), op, op, DispatchTypes.STATIC_DISPATCH) + callNode(d, code(d), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) .argumentIndex(o) val left = astForNode(des) val right = astForNode(d.getOperand) @@ -470,12 +507,12 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As } private def astForCPPASTDesignatedInitializer(d: ICPPASTDesignatedInitializer): Ast = { - val node = blockNode(d, Defines.empty, Defines.voidTypeName) + val node = blockNode(d, Defines.Empty, Defines.Void) scope.pushNewScope(node) val op = Operators.assignment val calls = withIndex(d.getDesignators) { (des, o) => val callNode_ = - callNode(d, code(d), op, op, DispatchTypes.STATIC_DISPATCH) + callNode(d, code(d), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) .argumentIndex(o) val left = astForNode(des) val right = astForNode(d.getOperand) @@ -486,16 +523,15 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As } private def astForCPPASTConstructorInitializer(c: ICPPASTConstructorInitializer): Ast = { - val name = ".constructorInitializer" - val callNode_ = - callNode(c, code(c), name, name, DispatchTypes.STATIC_DISPATCH) - val args = c.getArguments.toList.map(a => astForNode(a)) + val name = Defines.OperatorConstructorInitializer + val callNode_ = callNode(c, code(c), name, name, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) + val args = c.getArguments.toList.map(a => astForNode(a)) callAst(callNode_, args) } private def astForCASTArrayRangeDesignator(des: CASTArrayRangeDesignator): Ast = { val op = Operators.arrayInitializer - val callNode_ = callNode(des, code(des), op, op, DispatchTypes.STATIC_DISPATCH) + val callNode_ = callNode(des, code(des), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val floorAst = nullSafeAst(des.getRangeFloor) val ceilingAst = nullSafeAst(des.getRangeCeiling) callAst(callNode_, List(floorAst, ceilingAst)) @@ -503,7 +539,7 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As private def astForCPPASTArrayRangeDesignator(des: CPPASTArrayRangeDesignator): Ast = { val op = Operators.arrayInitializer - val callNode_ = callNode(des, code(des), op, op, DispatchTypes.STATIC_DISPATCH) + val callNode_ = callNode(des, code(des), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val floorAst = nullSafeAst(des.getRangeFloor) val ceilingAst = nullSafeAst(des.getRangeCeiling) callAst(callNode_, List(floorAst, ceilingAst)) @@ -570,9 +606,9 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As pointersAsString(s, parentDecl, stripKeywords) case s: IASTElaboratedTypeSpecifier => ASTStringUtil.getSignatureString(s, null) // TODO: handle other types of IASTDeclSpecifier - case _ => Defines.anyTypeName + case _ => Defines.Any } - if (tpe.isEmpty) Defines.anyTypeName else tpe + if (tpe.isEmpty) Defines.Any else tpe } // We use our own call ast creation function since the version in x2cpg treats diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForExpressionsCreator.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForExpressionsCreator.scala index 3d999c23d4cd..9ed43e47d86f 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForExpressionsCreator.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForExpressionsCreator.scala @@ -1,31 +1,25 @@ package io.joern.c2cpg.astcreation -import io.shiftleft.codepropertygraph.generated.nodes.{NewCall, NewIdentifier, NewMethodRef} -import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.joern.x2cpg.{Ast, ValidationMode} +import io.joern.x2cpg.Ast +import io.joern.x2cpg.ValidationMode import io.joern.x2cpg.Defines as X2CpgDefines +import io.shiftleft.codepropertygraph.generated.DispatchTypes +import io.shiftleft.codepropertygraph.generated.Operators +import org.apache.commons.lang3.StringUtils import org.eclipse.cdt.core.dom.ast import org.eclipse.cdt.core.dom.ast.* import org.eclipse.cdt.core.dom.ast.cpp.* import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression -import org.eclipse.cdt.core.model.IMethod -import org.eclipse.cdt.internal.core.dom.parser.c.{ - CASTFieldReference, - CASTFunctionCallExpression, - CASTIdExpression, - CBasicType, - CFunctionType, - CPointerType -} -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.{EvalBinding, EvalFunctionCall} -import org.eclipse.cdt.internal.core.dom.parser.cpp.{ - CPPASTIdExpression, - CPPASTQualifiedName, - CPPClosureType, - CPPField, - CPPFunction, - CPPFunctionType -} +import org.eclipse.cdt.internal.core.dom.parser.c.CASTFunctionCallExpression +import org.eclipse.cdt.internal.core.dom.parser.c.CASTIdExpression +import org.eclipse.cdt.internal.core.dom.parser.c.CFunctionType +import org.eclipse.cdt.internal.core.dom.parser.c.CPointerType +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTIdExpression +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClosureType +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFunctionCall + +import scala.util.Try trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { this: AstCreator => @@ -62,22 +56,22 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { case IASTBinaryExpression.op_notequals => Operators.notEquals case IASTBinaryExpression.op_pmdot => Operators.indirectFieldAccess case IASTBinaryExpression.op_pmarrow => Operators.indirectFieldAccess - case IASTBinaryExpression.op_max => ".max" - case IASTBinaryExpression.op_min => ".min" - case IASTBinaryExpression.op_ellipses => ".op_ellipses" - case _ => ".unknown" + case IASTBinaryExpression.op_max => Defines.OperatorMax + case IASTBinaryExpression.op_min => Defines.OperatorMin + case IASTBinaryExpression.op_ellipses => Defines.OperatorEllipses + case _ => Defines.OperatorUnknown } - val callNode_ = callNode(bin, code(bin), op, op, DispatchTypes.STATIC_DISPATCH) + val callNode_ = callNode(bin, code(bin), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val left = nullSafeAst(bin.getOperand1) val right = nullSafeAst(bin.getOperand2) callAst(callNode_, List(left, right)) } private def astForExpressionList(exprList: IASTExpressionList): Ast = { - val name = ".expressionList" + val name = Defines.OperatorExpressionList val callNode_ = - callNode(exprList, code(exprList), name, name, DispatchTypes.STATIC_DISPATCH) + callNode(exprList, code(exprList), name, name, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val childAsts = exprList.getExpressions.map(nullSafeAst) callAst(callNode_, childAsts.toIndexedSeq) } @@ -87,10 +81,10 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val typ = functionNameExpr.getExpressionType typ match { case pointerType: IPointerType => - createPointerCallAst(call, cleanType(ASTTypeUtil.getType(call.getExpressionType))) + createPointerCallAst(call, cleanType(safeGetType(call.getExpressionType))) case functionType: ICPPFunctionType => functionNameExpr match { - case idExpr: CPPASTIdExpression => + case idExpr: CPPASTIdExpression if idExpr.getName.getBinding.isInstanceOf[ICPPFunction] => val function = idExpr.getName.getBinding.asInstanceOf[ICPPFunction] val name = idExpr.getName.getLastName.toString val signature = @@ -102,9 +96,9 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val fullName = if (function.isExternC) { - name + StringUtils.normalizeSpace(name) } else { - val fullNameNoSig = function.getQualifiedName.mkString(".") + val fullNameNoSig = StringUtils.normalizeSpace(function.getQualifiedName.mkString(".")) s"$fullNameNoSig:$signature" } @@ -117,7 +111,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { fullName, dispatchType, Some(signature), - Some(cleanType(ASTTypeUtil.getType(call.getExpressionType))) + Some(registerType(cleanType(safeGetType(call.getExpressionType)))) ) val args = call.getArguments.toList.map(a => astForNode(a)) @@ -130,11 +124,11 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val name = fieldRefExpr.getFieldName.toString val signature = functionTypeToSignature(functionType) - val classFullName = cleanType(ASTTypeUtil.getType(fieldRefExpr.getFieldOwnerType)) + val classFullName = cleanType(safeGetType(fieldRefExpr.getFieldOwnerType)) val fullName = s"$classFullName.$name:$signature" fieldRefExpr.getFieldName.resolveBinding() - val method = fieldRefExpr.getFieldName.getBinding().asInstanceOf[ICPPMethod] + val method = fieldRefExpr.getFieldName.getBinding.asInstanceOf[ICPPMethod] val (dispatchType, receiver) = if (method.isVirtual || method.isPureVirtual) { (DispatchTypes.DYNAMIC_DISPATCH, Some(instanceAst)) @@ -148,16 +142,18 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { fullName, dispatchType, Some(signature), - Some(cleanType(ASTTypeUtil.getType(call.getExpressionType))) + Some(registerType(cleanType(safeGetType(call.getExpressionType)))) ) - createCallAst(callCpgNode, args, base = Some(instanceAst), receiver) + case other => + astForCppCallExpressionUntyped(call) } case classType: ICPPClassType => - val evaluation = call.getEvaluation.asInstanceOf[EvalFunctionCall] - val functionType = evaluation.getOverload.getType - val signature = functionTypeToSignature(functionType) - val name = "()" + val evaluation = call.getEvaluation.asInstanceOf[EvalFunctionCall] + + val functionType = Try(evaluation.getOverload.getType).toOption + val signature = functionType.map(functionTypeToSignature).getOrElse(X2CpgDefines.UnresolvedSignature) + val name = Defines.OperatorCall classType match { case closureType: CPPClosureType => @@ -171,7 +167,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { fullName, dispatchType, Some(signature), - Some(cleanType(ASTTypeUtil.getType(call.getExpressionType))) + Some(registerType(cleanType(safeGetType(call.getExpressionType)))) ) val receiverAst = astForExpression(functionNameExpr) @@ -179,17 +175,19 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { createCallAst(callCpgNode, args, receiver = Some(receiverAst)) case _ => - val classFullName = cleanType(ASTTypeUtil.getType(classType)) + val classFullName = cleanType(safeGetType(classType)) val fullName = s"$classFullName.$name:$signature" - val method = evaluation.getOverload.asInstanceOf[ICPPMethod] - val dispatchType = - if (method.isVirtual || method.isPureVirtual) { - DispatchTypes.DYNAMIC_DISPATCH - } else { + val dispatchType = evaluation.getOverload match { + case method: ICPPMethod => + if (method.isVirtual || method.isPureVirtual) { + DispatchTypes.DYNAMIC_DISPATCH + } else { + DispatchTypes.STATIC_DISPATCH + } + case _ => DispatchTypes.STATIC_DISPATCH - } - + } val callCpgNode = callNode( call, code(call), @@ -197,18 +195,19 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { fullName, dispatchType, Some(signature), - Some(cleanType(ASTTypeUtil.getType(call.getExpressionType))) + Some(registerType(cleanType(safeGetType(call.getExpressionType)))) ) val instanceAst = astForExpression(functionNameExpr) val args = call.getArguments.toList.map(a => astForNode(a)) - createCallAst(callCpgNode, args, base = Some(instanceAst), receiver = Some(instanceAst)) } case _: IProblemType => astForCppCallExpressionUntyped(call) case _: IProblemBinding => astForCppCallExpressionUntyped(call) + case other => + astForCppCallExpressionUntyped(call) } } @@ -220,7 +219,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val instanceAst = astForExpression(fieldRefExpr.getFieldOwner) val args = call.getArguments.toList.map(a => astForNode(a)) - val name = fieldRefExpr.getFieldName.toString + val name = StringUtils.normalizeSpace(fieldRefExpr.getFieldName.toString) val signature = X2CpgDefines.UnresolvedSignature val fullName = s"${X2CpgDefines.UnresolvedNamespace}.$name:$signature(${args.size})" @@ -233,12 +232,11 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { Some(signature), Some(X2CpgDefines.Any) ) - createCallAst(callCpgNode, args, base = Some(instanceAst), receiver = Some(instanceAst)) case idExpr: CPPASTIdExpression => val args = call.getArguments.toList.map(a => astForNode(a)) - val name = idExpr.getName.getLastName.toString + val name = StringUtils.normalizeSpace(idExpr.getName.getLastName.toString) val signature = X2CpgDefines.UnresolvedSignature val fullName = s"${X2CpgDefines.UnresolvedNamespace}.$name:$signature(${args.size})" @@ -251,14 +249,13 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { Some(signature), Some(X2CpgDefines.Any) ) - createCallAst(callCpgNode, args) case other => - // This could either be a pointer or an operator() call we dont know at this point + // This could either be a pointer or an operator() call we do not know at this point // but since it is CPP we opt for the later. val args = call.getArguments.toList.map(a => astForNode(a)) - val name = "()" + val name = Defines.OperatorCall val signature = X2CpgDefines.UnresolvedSignature val fullName = s"${X2CpgDefines.UnresolvedNamespace}.$name:$signature(${args.size})" @@ -271,7 +268,6 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { Some(signature), Some(X2CpgDefines.Any) ) - val instanceAst = astForExpression(functionNameExpr) createCallAst(callCpgNode, args, base = Some(instanceAst), receiver = Some(instanceAst)) } @@ -282,13 +278,13 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val typ = functionNameExpr.getExpressionType typ match { case pointerType: CPointerType => - createPointerCallAst(call, cleanType(ASTTypeUtil.getType(call.getExpressionType))) + createPointerCallAst(call, cleanType(safeGetType(call.getExpressionType))) case functionType: CFunctionType => functionNameExpr match { case idExpr: CASTIdExpression => - createCFunctionCallAst(call, idExpr, cleanType(ASTTypeUtil.getType(call.getExpressionType))) + createCFunctionCallAst(call, idExpr, cleanType(safeGetType(call.getExpressionType))) case _ => - createPointerCallAst(call, cleanType(ASTTypeUtil.getType(call.getExpressionType))) + createPointerCallAst(call, cleanType(safeGetType(call.getExpressionType))) } case _ => astForCCallExpressionUntyped(call) @@ -300,25 +296,22 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { idExpr: CASTIdExpression, callTypeFullName: String ): Ast = { - val name = idExpr.getName.getLastName.toString - val signature = "" - + val name = idExpr.getName.getLastName.toString + val signature = "" val dispatchType = DispatchTypes.STATIC_DISPATCH - - val callCpgNode = callNode(call, code(call), name, name, dispatchType, Some(signature), Some(callTypeFullName)) - val args = call.getArguments.toList.map(a => astForNode(a)) - + val callCpgNode = + callNode(call, code(call), name, name, dispatchType, Some(signature), Some(registerType(callTypeFullName))) + val args = call.getArguments.toList.map(a => astForNode(a)) createCallAst(callCpgNode, args) } private def createPointerCallAst(call: IASTFunctionCallExpression, callTypeFullName: String): Ast = { val functionNameExpr = call.getFunctionNameExpression - val name = Defines.operatorPointerCall + val name = Defines.OperatorPointerCall val signature = "" - + val dispatchType = DispatchTypes.DYNAMIC_DISPATCH val callCpgNode = - callNode(call, code(call), name, name, DispatchTypes.DYNAMIC_DISPATCH, Some(signature), Some(callTypeFullName)) - + callNode(call, code(call), name, name, dispatchType, Some(signature), Some(registerType(callTypeFullName))) val args = call.getArguments.toList.map(a => astForNode(a)) val receiverAst = astForExpression(functionNameExpr) createCallAst(callCpgNode, args, receiver = Some(receiverAst)) @@ -326,21 +319,16 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { private def astForCCallExpressionUntyped(call: CASTFunctionCallExpression): Ast = { val functionNameExpr = call.getFunctionNameExpression - functionNameExpr match { - case idExpr: CASTIdExpression => - createCFunctionCallAst(call, idExpr, X2CpgDefines.Any) - case _ => - createPointerCallAst(call, X2CpgDefines.Any) + case idExpr: CASTIdExpression => createCFunctionCallAst(call, idExpr, X2CpgDefines.Any) + case _ => createPointerCallAst(call, X2CpgDefines.Any) } } private def astForCallExpression(call: IASTFunctionCallExpression): Ast = { call match { - case cppCall: ICPPASTFunctionCallExpression => - astForCppCallExpression(cppCall) - case cCall: CASTFunctionCallExpression => - astForCCallExpression(cCall) + case cppCall: ICPPASTFunctionCallExpression => astForCppCallExpression(cppCall) + case cCall: CASTFunctionCallExpression => astForCCallExpression(cCall) } } @@ -357,10 +345,10 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { case IASTUnaryExpression.op_sizeof => Operators.sizeOf case IASTUnaryExpression.op_postFixIncr => Operators.postIncrement case IASTUnaryExpression.op_postFixDecr => Operators.postDecrement - case IASTUnaryExpression.op_throw => ".throw" - case IASTUnaryExpression.op_typeid => ".typeOf" - case IASTUnaryExpression.op_bracketedPrimary => ".bracketedPrimary" - case _ => ".unknown" + case IASTUnaryExpression.op_throw => Defines.OperatorThrow + case IASTUnaryExpression.op_typeid => Defines.OperatorTypeOf + case IASTUnaryExpression.op_bracketedPrimary => Defines.OperatorBracketedPrimary + case _ => Defines.OperatorUnknown } if ( @@ -369,8 +357,15 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { ) { nullSafeAst(unary.getOperand) } else { - val cpgUnary = - callNode(unary, code(unary), operatorMethod, operatorMethod, DispatchTypes.STATIC_DISPATCH) + val cpgUnary = callNode( + unary, + code(unary), + operatorMethod, + operatorMethod, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val operand = nullSafeAst(unary.getOperand) callAst(cpgUnary, List(operand)) } @@ -385,7 +380,15 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { op == IASTTypeIdExpression.op_alignof || op == IASTTypeIdExpression.op_typeof => val call = - callNode(typeId, code(typeId), Operators.sizeOf, Operators.sizeOf, DispatchTypes.STATIC_DISPATCH) + callNode( + typeId, + code(typeId), + Operators.sizeOf, + Operators.sizeOf, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val arg = astForNode(typeId.getTypeId.getDeclSpecifier) callAst(call, List(arg)) case _ => notHandledYet(typeId) @@ -394,7 +397,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { private def astForConditionalExpression(expr: IASTConditionalExpression): Ast = { val name = Operators.conditional - val call = callNode(expr, code(expr), name, name, DispatchTypes.STATIC_DISPATCH) + val call = callNode(expr, code(expr), name, name, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val condAst = nullSafeAst(expr.getLogicalConditionExpression) val posAst = nullSafeAst(expr.getPositiveResultExpression) @@ -407,7 +410,15 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { private def astForArrayIndexExpression(arrayIndexExpression: IASTArraySubscriptExpression): Ast = { val name = Operators.indirectIndexAccess val cpgArrayIndexing = - callNode(arrayIndexExpression, code(arrayIndexExpression), name, name, DispatchTypes.STATIC_DISPATCH) + callNode( + arrayIndexExpression, + code(arrayIndexExpression), + name, + name, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val expr = astForExpression(arrayIndexExpression.getArrayExpression) val arg = astForNode(arrayIndexExpression.getArgument) @@ -416,7 +427,15 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { private def astForCastExpression(castExpression: IASTCastExpression): Ast = { val cpgCastExpression = - callNode(castExpression, code(castExpression), Operators.cast, Operators.cast, DispatchTypes.STATIC_DISPATCH) + callNode( + castExpression, + code(castExpression), + Operators.cast, + Operators.cast, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val expr = astForExpression(castExpression.getOperand) val argNode = castExpression.getTypeId @@ -438,9 +457,16 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { } private def astForNewExpression(newExpression: ICPPASTNewExpression): Ast = { - val name = ".new" - val cpgNewExpression = - callNode(newExpression, code(newExpression), name, name, DispatchTypes.STATIC_DISPATCH) + val name = Defines.OperatorNew + val cpgNewExpression = callNode( + newExpression, + code(newExpression), + name, + name, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val typeId = newExpression.getTypeId if (newExpression.isArrayAllocation) { @@ -457,7 +483,15 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { private def astForDeleteExpression(delExpression: ICPPASTDeleteExpression): Ast = { val name = Operators.delete val cpgDeleteNode = - callNode(delExpression, code(delExpression), name, name, DispatchTypes.STATIC_DISPATCH) + callNode( + delExpression, + code(delExpression), + name, + name, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val arg = astForExpression(delExpression.getOperand) callAst(cpgDeleteNode, List(arg)) } @@ -465,7 +499,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { private def astForTypeIdInitExpression(typeIdInit: IASTTypeIdInitializerExpression): Ast = { val name = Operators.cast val cpgCastExpression = - callNode(typeIdInit, code(typeIdInit), name, name, DispatchTypes.STATIC_DISPATCH) + callNode(typeIdInit, code(typeIdInit), name, name, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val typeAst = unknownNode(typeIdInit.getTypeId, code(typeIdInit.getTypeId)) val expr = astForNode(typeIdInit.getInitializer) @@ -474,7 +508,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { private def astForConstructorExpression(c: ICPPASTSimpleTypeConstructorExpression): Ast = { val name = c.getDeclSpecifier.toString - val callNode_ = callNode(c, code(c), name, name, DispatchTypes.STATIC_DISPATCH) + val callNode_ = callNode(c, code(c), name, name, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val arg = astForNode(c.getInitializer) callAst(callNode_, List(arg)) } @@ -516,11 +550,11 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { } protected def astForStaticAssert(a: ICPPASTStaticAssertDeclaration): Ast = { - val name = "static_assert" - val call = callNode(a, code(a), name, name, DispatchTypes.STATIC_DISPATCH) - val cond = nullSafeAst(a.getCondition) - val messg = nullSafeAst(a.getMessage) - callAst(call, List(cond, messg)) + val name = "static_assert" + val call = callNode(a, code(a), name, name, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) + val cond = nullSafeAst(a.getCondition) + val message = nullSafeAst(a.getMessage) + callAst(call, List(cond, message)) } } diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForFunctionsCreator.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForFunctionsCreator.scala index 1e7ac31e24f6..a3ed325a9c69 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForFunctionsCreator.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForFunctionsCreator.scala @@ -1,21 +1,22 @@ package io.joern.c2cpg.astcreation -import io.joern.x2cpg.{Ast, ValidationMode} +import io.joern.x2cpg.Ast +import io.joern.x2cpg.ValidationMode +import io.joern.x2cpg.Defines as X2CpgDefines import io.joern.x2cpg.datastructures.Stack.* import io.joern.x2cpg.utils.NodeBuilders.newModifierNode +import io.shiftleft.codepropertygraph.generated.EvaluationStrategies +import io.shiftleft.codepropertygraph.generated.ModifierTypes import io.shiftleft.codepropertygraph.generated.nodes.* -import io.shiftleft.codepropertygraph.generated.{EvaluationStrategies, ModifierTypes} import org.apache.commons.lang3.StringUtils import org.eclipse.cdt.core.dom.ast.* -import org.eclipse.cdt.core.dom.ast.cpp.{ICPPASTLambdaExpression, ICPPFunction} +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLambdaExpression import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator -import org.eclipse.cdt.internal.core.dom.parser.c.{CASTFunctionDeclarator, CASTParameterDeclaration, CTypedef} -import org.eclipse.cdt.internal.core.dom.parser.cpp.{ - CPPASTFunctionDeclarator, - CPPASTFunctionDefinition, - CPPASTParameterDeclaration, - CPPFunction -} +import org.eclipse.cdt.internal.core.dom.parser.c.CASTFunctionDeclarator +import org.eclipse.cdt.internal.core.dom.parser.c.CASTParameterDeclaration +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDeclarator +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDefinition +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTParameterDeclaration import org.eclipse.cdt.internal.core.model.ASTStringUtil import scala.annotation.tailrec @@ -103,13 +104,18 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th case declarator: IASTDeclarator => declarator.getTrailingReturnType match { case id: IASTTypeId => typeForDeclSpecifier(id.getDeclSpecifier) - case null => Defines.anyTypeName + case null => Defines.Any } - case null => Defines.anyTypeName + case null => Defines.Any } val name = nextClosureName() - val fullname = s"${fullName(lambdaExpression)}$name" - val signature = s"$returnType${parameterListSignature(lambdaExpression)}" + val rawFullname = fullName(lambdaExpression) + val fixedFullName = if (rawFullname.contains("[") || rawFullname.contains("{")) { + // FIXME: the lambda may be located in something we are not able to generate a correct fullname yet + s"${X2CpgDefines.UnresolvedSignature}." + } else StringUtils.normalizeSpace(rawFullname) + val fullname = s"$fixedFullName$name" + val signature = StringUtils.normalizeSpace(s"$returnType${parameterListSignature(lambdaExpression)}") val codeString = code(lambdaExpression) val methodNode_ = methodNode(lambdaExpression, name, codeString, fullname, Some(signature), filename) @@ -125,29 +131,43 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th methodNode_, parameterNodes.map(Ast(_)), astForMethodBody(Option(lambdaExpression.getBody)), - newMethodReturnNode(lambdaExpression, registerType(returnType)), + methodReturnNode(lambdaExpression, registerType(returnType)), newModifierNode(ModifierTypes.LAMBDA) :: Nil ) val typeDeclAst = createFunctionTypeAndTypeDecl(lambdaExpression, methodNode_, name, fullname, signature) Ast.storeInDiffGraph(astForLambda.merge(typeDeclAst), diffGraph) - Ast(methodRefNode(lambdaExpression, codeString, fullname, methodNode_.astParentFullName)) + Ast(methodRefNode(lambdaExpression, codeString, fullname, registerType(fullname))) } protected def astForFunctionDeclarator(funcDecl: IASTFunctionDeclarator): Ast = { funcDecl.getName.resolveBinding() match { case function: IFunction => - val returnType = typeForDeclSpecifier(funcDecl.getParent.asInstanceOf[IASTSimpleDeclaration].getDeclSpecifier) - val fullname = fullName(funcDecl) - val templateParams = templateParameters(funcDecl).getOrElse("") - val signature = - s"$returnType${parameterListSignature(funcDecl)}" + val returnType = cleanType( + typeForDeclSpecifier(funcDecl.getParent.asInstanceOf[IASTSimpleDeclaration].getDeclSpecifier) + ) + val name = StringUtils.normalizeSpace(shortName(funcDecl)) + val fixedName = if (name.isEmpty) { + nextClosureName() + } else name + val signature = StringUtils.normalizeSpace(s"$returnType${parameterListSignature(funcDecl)}") + val fullname = fullName(funcDecl) match { + case f + if funcDecl.isInstanceOf[CPPASTFunctionDeclarator] && + (f == "" || f == s"${X2CpgDefines.UnresolvedNamespace}.") => + s"${X2CpgDefines.UnresolvedNamespace}.$fixedName:$signature" + case f if funcDecl.isInstanceOf[CPPASTFunctionDeclarator] && f.contains("?") => + s"${StringUtils.normalizeSpace(f).takeWhile(_ != ':')}:$signature" + case f if f == "" || f == s"${X2CpgDefines.UnresolvedNamespace}." => + s"${X2CpgDefines.UnresolvedNamespace}.$fixedName" + case other if other.nonEmpty => StringUtils.normalizeSpace(other) + case other => s"${X2CpgDefines.UnresolvedNamespace}.$name" + } if (seenFunctionFullnames.add(fullname)) { - val name = shortName(funcDecl) val codeString = code(funcDecl.getParent) val filename = fileName(funcDecl) - val methodNode_ = methodNode(funcDecl, name, codeString, fullname, Some(signature), filename) + val methodNode_ = methodNode(funcDecl, fixedName, codeString, fullname, Some(signature), filename) scope.pushNewScope(methodNode_) @@ -162,9 +182,10 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th methodStubAst( methodNode_, parameterNodes.map(Ast(_)), - newMethodReturnNode(funcDecl, registerType(returnType)) + methodReturnNode(funcDecl, registerType(returnType)), + modifiers = modifierFor(funcDecl) ) - val typeDeclAst = createFunctionTypeAndTypeDecl(funcDecl, methodNode_, name, fullname, signature) + val typeDeclAst = createFunctionTypeAndTypeDecl(funcDecl, methodNode_, fixedName, fullname, signature) stubAst.merge(typeDeclAst) } else { Ast() @@ -180,8 +201,33 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th case typeDef: ITypedef => // TODO handle typeDecl for now we just ignore this. Ast() + case other => + notHandledYet(funcDecl) + } + + } + + private def modifierFromString(image: String): List[NewModifier] = { + image match { + case "static" => List(newModifierNode(ModifierTypes.STATIC)) + case _ => Nil } + } + + private def modifierFor(funcDef: IASTFunctionDefinition): List[NewModifier] = { + val constructorModifier = if (isCppConstructor(funcDef)) { + List(newModifierNode(ModifierTypes.CONSTRUCTOR), newModifierNode(ModifierTypes.PUBLIC)) + } else Nil + val visibilityModifier = if (funcDef.getSyntax != null) { + modifierFromString(funcDef.getSyntax.getImage) + } else Nil + constructorModifier ++ visibilityModifier + } + private def modifierFor(funcDecl: IASTFunctionDeclarator): List[NewModifier] = { + if (funcDecl.getParent != null && funcDecl.getParent.getSyntax != null) { + modifierFromString(funcDecl.getParent.getSyntax.getImage) + } else Nil } private def isCppConstructor(funcDef: IASTFunctionDefinition): Boolean = { @@ -196,16 +242,27 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th val returnType = if (isCppConstructor(funcDef)) { typeFor(funcDef.asInstanceOf[CPPASTFunctionDefinition].getMemberInitializers.head.getInitializer) } else typeForDeclSpecifier(funcDef.getDeclSpecifier) - val name = shortName(funcDef) - val fullname = fullName(funcDef) - val templateParams = templateParameters(funcDef).getOrElse("") - - val signature = - s"$returnType${parameterListSignature(funcDef)}" + val signature = StringUtils.normalizeSpace(s"$returnType${parameterListSignature(funcDef)}") + val name = StringUtils.normalizeSpace(shortName(funcDef)) + val fixedName = if (name.isEmpty) { + nextClosureName() + } else name + val fullname = fullName(funcDef) match { + case f + if funcDef.isInstanceOf[CPPASTFunctionDefinition] && + (f == "" || f == s"${X2CpgDefines.UnresolvedNamespace}.") => + s"${X2CpgDefines.UnresolvedNamespace}.$fixedName:$signature" + case f if funcDef.isInstanceOf[CPPASTFunctionDefinition] && f.contains("?") => + s"${StringUtils.normalizeSpace(f).takeWhile(_ != ':')}:$signature" + case f if f == "" || f == s"${X2CpgDefines.UnresolvedNamespace}." => + s"${X2CpgDefines.UnresolvedNamespace}.$fixedName" + case other if other.nonEmpty => StringUtils.normalizeSpace(other) + case other => s"${X2CpgDefines.UnresolvedNamespace}.$fixedName" + } seenFunctionFullnames.add(fullname) val codeString = code(funcDef) - val methodNode_ = methodNode(funcDef, name, codeString, fullname, Some(signature), filename) + val methodNode_ = methodNode(funcDef, fixedName, codeString, fullname, Some(signature), filename) methodAstParentStack.push(methodNode_) scope.pushNewScope(methodNode_) @@ -215,22 +272,18 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th } setVariadic(parameterNodes, funcDef) - val modifiers = if (isCppConstructor(funcDef)) { - List(newModifierNode(ModifierTypes.CONSTRUCTOR), newModifierNode(ModifierTypes.PUBLIC)) - } else Nil - val astForMethod = methodAst( methodNode_, parameterNodes.map(Ast(_)), astForMethodBody(Option(funcDef.getBody)), - newMethodReturnNode(funcDef, registerType(returnType)), - modifiers = modifiers + methodReturnNode(funcDef, registerType(returnType)), + modifiers = modifierFor(funcDef) ) scope.popScope() methodAstParentStack.pop() - val typeDeclAst = createFunctionTypeAndTypeDecl(funcDef, methodNode_, name, fullname, signature) + val typeDeclAst = createFunctionTypeAndTypeDecl(funcDef, methodNode_, fixedName, fullname, signature) astForMethod.merge(typeDeclAst) } @@ -280,7 +333,7 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th private def astForMethodBody(body: Option[IASTStatement]): Ast = body match { case Some(b: IASTCompoundStatement) => astForBlockStatement(b) case Some(b) => astForNode(b) - case None => blockAst(NewBlock()) + case None => blockAst(NewBlock().typeFullName(Defines.Any)) } } diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForPrimitivesCreator.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForPrimitivesCreator.scala index b1c268e2cb7e..57279371fa0f 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForPrimitivesCreator.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForPrimitivesCreator.scala @@ -1,12 +1,11 @@ package io.joern.c2cpg.astcreation -import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.joern.x2cpg.{Ast, ValidationMode} +import io.joern.x2cpg.{Ast, ValidationMode, Defines as X2CpgDefines} import io.shiftleft.codepropertygraph.generated.nodes.NewMethodRef +import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import org.eclipse.cdt.core.dom.ast.* import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalBinding -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding +import org.eclipse.cdt.internal.core.dom.parser.cpp.{CPPASTQualifiedName, ICPPInternalBinding} import org.eclipse.cdt.internal.core.model.ASTStringUtil trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { this: AstCreator => @@ -15,7 +14,7 @@ trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { t Ast(newCommentNode(comment, code(comment), fileName(comment))) protected def astForLiteral(lit: IASTLiteralExpression): Ast = { - val tpe = cleanType(ASTTypeUtil.getType(lit.getExpressionType)) + val tpe = cleanType(safeGetType(lit.getExpressionType)) Ast(literalNode(lit, code(lit), registerType(tpe))) } @@ -46,7 +45,7 @@ trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { t for { fullName <- mayBeFullName typeFullName <- mayBeTypeFullName - } yield methodRefNode(ident, code(ident), fullName, typeFullName) + } yield methodRefNode(ident, code(ident), fullName, registerType(cleanType(typeFullName))) case _ => None } } @@ -90,7 +89,7 @@ trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { t protected def astForFieldReference(fieldRef: IASTFieldReference): Ast = { val op = if (fieldRef.isPointerDereference) Operators.indirectFieldAccess else Operators.fieldAccess - val ma = callNode(fieldRef, code(fieldRef), op, op, DispatchTypes.STATIC_DISPATCH) + val ma = callNode(fieldRef, code(fieldRef), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val owner = astForExpression(fieldRef.getFieldOwner) val member = fieldIdentifierNode(fieldRef, fieldRef.getFieldName.toString, fieldRef.getFieldName.toString) callAst(ma, List(owner, Ast(member))) @@ -101,7 +100,7 @@ trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { t protected def astForInitializerList(l: IASTInitializerList): Ast = { val op = Operators.arrayInitializer - val initCallNode = callNode(l, code(l), op, op, DispatchTypes.STATIC_DISPATCH) + val initCallNode = callNode(l, code(l), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val MAX_INITIALIZERS = 1000 val clauses = l.getClauses.slice(0, MAX_INITIALIZERS) @@ -111,7 +110,7 @@ trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { t val ast = callAst(initCallNode, args) if (l.getClauses.length > MAX_INITIALIZERS) { val placeholder = - literalNode(l, "", Defines.anyTypeName).argumentIndex(MAX_INITIALIZERS) + literalNode(l, "", Defines.Any).argumentIndex(MAX_INITIALIZERS) ast.withChild(Ast(placeholder)).withArgEdge(initCallNode, placeholder) } else { ast @@ -120,7 +119,7 @@ trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { t protected def astForQualifiedName(qualId: CPPASTQualifiedName): Ast = { val op = Operators.fieldAccess - val ma = callNode(qualId, code(qualId), op, op, DispatchTypes.STATIC_DISPATCH) + val ma = callNode(qualId, code(qualId), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) def fieldAccesses(names: List[IASTNode], argIndex: Int = -1): Ast = names match { case Nil => Ast() @@ -129,7 +128,7 @@ trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { t case head :: tail => val codeString = s"${code(head)}::${tail.map(code).mkString("::")}" val callNode_ = - callNode(head, code(head), op, op, DispatchTypes.STATIC_DISPATCH) + callNode(head, code(head), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) .argumentIndex(argIndex) callNode_.code = codeString val arg1 = astForNode(head) @@ -142,7 +141,7 @@ trait AstForPrimitivesCreator(implicit withSchemaValidation: ValidationMode) { t val owner = if (qualifier != Ast()) { qualifier } else { - Ast(literalNode(qualId.getLastName, "", Defines.anyTypeName)) + Ast(literalNode(qualId.getLastName, "", Defines.Any)) } val member = fieldIdentifierNode( diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForStatementsCreator.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForStatementsCreator.scala index badeda55e61a..050968fd0fa4 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForStatementsCreator.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForStatementsCreator.scala @@ -21,8 +21,8 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t protected def astForBlockStatement(blockStmt: IASTCompoundStatement, order: Int = -1): Ast = { val codeString = code(blockStmt) - val blockCode = if (codeString == "{}" || codeString.isEmpty) Defines.empty else codeString - val node = blockNode(blockStmt, blockCode, registerType(Defines.voidTypeName)) + val blockCode = if (codeString == "{}" || codeString.isEmpty) Defines.Empty else codeString + val node = blockNode(blockStmt, blockCode, registerType(Defines.Void)) .order(order) .argumentIndex(order) scope.pushNewScope(node) @@ -193,7 +193,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t private def astForConditionExpression(expression: IASTExpression, explicitArgumentIndex: Option[Int] = None): Ast = { val ast = expression match { case exprList: IASTExpressionList => - val compareAstBlock = blockNode(expression, Defines.empty, registerType(Defines.voidTypeName)) + val compareAstBlock = blockNode(expression, Defines.Empty, registerType(Defines.Void)) scope.pushNewScope(compareAstBlock) val compareBlockAstChildren = exprList.getExpressions.toList.map(nullSafeAst) setArgumentIndices(compareBlockAstChildren) @@ -217,7 +217,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t val code = s"for ($codeInit$codeCond;$codeIter)" val forNode = controlStructureNode(forStmt, ControlStructureTypes.FOR, code) - val initAstBlock = blockNode(forStmt, Defines.empty, registerType(Defines.voidTypeName)) + val initAstBlock = blockNode(forStmt, Defines.Empty, registerType(Defines.Void)) scope.pushNewScope(initAstBlock) val initAst = blockAst(initAstBlock, nullSafeAst(forStmt.getInitializerStatement, 1).toList) scope.popScope() @@ -262,7 +262,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t (c, compareAst) case s: CPPASTIfStatement if s.getConditionExpression == null => val c = s"if (${nullSafeCode(s.getConditionDeclaration)})" - val exprBlock = blockNode(s.getConditionDeclaration, Defines.empty, Defines.voidTypeName) + val exprBlock = blockNode(s.getConditionDeclaration, Defines.Empty, Defines.Void) scope.pushNewScope(exprBlock) val a = astsForDeclaration(s.getConditionDeclaration) setArgumentIndices(a) @@ -275,7 +275,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t val thenAst = ifStmt.getThenClause match { case block: IASTCompoundStatement => astForBlockStatement(block) case other if other != null => - val thenBlock = blockNode(other, Defines.empty, Defines.voidTypeName) + val thenBlock = blockNode(other, Defines.Empty, Defines.Void) scope.pushNewScope(thenBlock) val a = astsForStatement(other) setArgumentIndices(a) @@ -291,7 +291,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t Ast(elseNode).withChild(elseAst) case other if other != null => val elseNode = controlStructureNode(ifStmt.getElseClause, ControlStructureTypes.ELSE, "else") - val elseBlock = blockNode(other, Defines.empty, Defines.voidTypeName) + val elseBlock = blockNode(other, Defines.Empty, Defines.Void) scope.pushNewScope(elseBlock) val a = astsForStatement(other) setArgumentIndices(a) diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForTypesCreator.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForTypesCreator.scala index 8bfbf0a2e05a..cd6d7dac6d9f 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForTypesCreator.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstForTypesCreator.scala @@ -3,6 +3,7 @@ package io.joern.c2cpg.astcreation import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.x2cpg.{Ast, ValidationMode} +import io.joern.x2cpg.Defines as X2CpgDefines import org.eclipse.cdt.core.dom.ast.* import org.eclipse.cdt.core.dom.ast.cpp.* import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAliasDeclaration @@ -99,19 +100,36 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: case i: IASTEqualsInitializer => val operatorName = Operators.assignment val callNode_ = - callNode(declarator, code(declarator), operatorName, operatorName, DispatchTypes.STATIC_DISPATCH) + callNode( + declarator, + code(declarator), + operatorName, + operatorName, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val left = astForNode(declarator.getName) val right = astForNode(i.getInitializerClause) callAst(callNode_, List(left, right)) case i: ICPPASTConstructorInitializer => - val name = ASTStringUtil.getSimpleName(declarator.getName) - val callNode_ = callNode(declarator, code(declarator), name, name, DispatchTypes.STATIC_DISPATCH) - val args = i.getArguments.toList.map(x => astForNode(x)) + val name = ASTStringUtil.getSimpleName(declarator.getName) + val callNode_ = + callNode(declarator, code(declarator), name, name, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) + val args = i.getArguments.toList.map(x => astForNode(x)) callAst(callNode_, args) case i: IASTInitializerList => val operatorName = Operators.assignment val callNode_ = - callNode(declarator, code(declarator), operatorName, operatorName, DispatchTypes.STATIC_DISPATCH) + callNode( + declarator, + code(declarator), + operatorName, + operatorName, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val left = astForNode(declarator.getName) val right = astForNode(i) callAst(callNode_, List(left, right)) @@ -151,7 +169,7 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: protected def astForASMDeclaration(asm: IASTASMDeclaration): Ast = Ast(unknownNode(asm, code(asm))) private def astForStructuredBindingDeclaration(decl: ICPPASTStructuredBindingDeclaration): Ast = { - val node = blockNode(decl, Defines.empty, Defines.voidTypeName) + val node = blockNode(decl, Defines.Empty, Defines.Void) scope.pushNewScope(node) val childAsts = decl.getNames.toList.map { name => astForNode(name) @@ -212,8 +230,9 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: case d: IASTDeclarator if d.getInitializer != null => astForInitializer(d, d.getInitializer) case arrayDecl: IASTArrayDeclarator => - val op = Operators.arrayInitializer - val initCallNode = callNode(arrayDecl, code(arrayDecl), op, op, DispatchTypes.STATIC_DISPATCH) + val op = Operators.arrayInitializer + val initCallNode = + callNode(arrayDecl, code(arrayDecl), op, op, DispatchTypes.STATIC_DISPATCH, None, Some(X2CpgDefines.Any)) val initArgs = arrayDecl.getArrayModifiers.toList.filter(m => m.getConstantExpression != null).map(astForNode) callAst(initCallNode, initArgs) @@ -270,9 +289,9 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: } else { val init = staticInitMethodAst( calls, - s"$fullname:${io.joern.x2cpg.Defines.StaticInitMethodName}", + s"$fullname.${io.joern.x2cpg.Defines.StaticInitMethodName}", None, - Defines.anyTypeName, + Defines.Any, Some(filename), lineNumber, columnNumber @@ -318,7 +337,15 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: if (enumerator.getValue != null) { val operatorName = Operators.assignment val callNode_ = - callNode(enumerator, code(enumerator), operatorName, operatorName, DispatchTypes.STATIC_DISPATCH) + callNode( + enumerator, + code(enumerator), + operatorName, + operatorName, + DispatchTypes.STATIC_DISPATCH, + None, + Some(X2CpgDefines.Any) + ) val left = astForNode(enumerator.getName) val right = astForNode(enumerator.getValue) val ast = callAst(callNode_, List(left, right)) @@ -370,7 +397,7 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: calls, s"$deAliasedFullName:${io.joern.x2cpg.Defines.StaticInitMethodName}", None, - Defines.anyTypeName, + Defines.Any, Some(filename), lineNumber, columnNumber diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstNodeBuilder.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstNodeBuilder.scala index f3d7316835f2..90e44534fe4a 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstNodeBuilder.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/AstNodeBuilder.scala @@ -1,12 +1,12 @@ package io.joern.c2cpg.astcreation -import io.joern.x2cpg.utils.NodeBuilders.{newMethodReturnNode => newMethodReturnNode_} -import io.shiftleft.codepropertygraph.generated.nodes._ -import org.eclipse.cdt.core.dom.ast.{IASTLabelStatement, IASTNode} -import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement +import io.shiftleft.codepropertygraph.generated.nodes.* +import org.eclipse.cdt.core.dom.ast.IASTLabelStatement +import org.eclipse.cdt.core.dom.ast.IASTNode import org.eclipse.cdt.internal.core.model.ASTStringUtil trait AstNodeBuilder { this: AstCreator => + protected def newCommentNode(node: IASTNode, code: String, filename: String): NewComment = { NewComment().code(code).filename(filename).lineNumber(line(node)).columnNumber(column(node)) } @@ -27,11 +27,6 @@ trait AstNodeBuilder { this: AstCreator => .fullName(fullname) } - // TODO: We should get rid of this method as its being used at multiple places and use it from x2cpg/AstNodeBuilder "methodReturnNode" - protected def newMethodReturnNode(node: IASTNode, typeFullName: String): NewMethodReturn = { - newMethodReturnNode_(typeFullName, None, line(node), column(node)) - } - protected def newJumpTargetNode(node: IASTNode): NewJumpTarget = { val codeString = code(node) val name = node match { diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/Defines.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/Defines.scala index f697eb70ca23..044592090abf 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/Defines.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/Defines.scala @@ -1,10 +1,21 @@ package io.joern.c2cpg.astcreation object Defines { - val anyTypeName: String = "ANY" - val voidTypeName: String = "void" - val qualifiedNameSeparator: String = "::" - val empty = "" + val Any: String = "ANY" + val Void: String = "void" + val QualifiedNameSeparator: String = "::" + val Empty = "" - val operatorPointerCall = ".pointerCall" + val OperatorPointerCall = ".pointerCall" + val OperatorConstructorInitializer = ".constructorInitializer" + val OperatorTypeOf = ".typeOf" + val OperatorMax = ".max" + val OperatorMin = ".min" + val OperatorEllipses = ".op_ellipses" + val OperatorUnknown = ".unknown" + val OperatorCall = "()" + val OperatorExpressionList = ".expressionList" + val OperatorNew = ".new" + val OperatorThrow = ".throw" + val OperatorBracketedPrimary = ".bracketedPrimary" } diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/MacroHandler.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/MacroHandler.scala index 9001ddcd0855..6bef1b5c44ad 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/MacroHandler.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/astcreation/MacroHandler.scala @@ -53,7 +53,7 @@ trait MacroHandler(implicit withSchemaValidation: ValidationMode) { this: AstCre case Some(_: NewBlock) => newAst case _ => - val b = NewBlock().argumentIndex(1).typeFullName(registerType(Defines.voidTypeName)) + val b = NewBlock().argumentIndex(1).typeFullName(registerType(Defines.Void)) blockAst(b, List(newAst)) } callAst.withChildren(lostLocals).withChild(childAst) @@ -124,13 +124,14 @@ trait MacroHandler(implicit withSchemaValidation: ValidationMode) { this: AstCre val callName = StringUtils.normalizeSpace(name) val callFullName = StringUtils.normalizeSpace(fullName(macroDef, argAsts)) + val typeFullName = registerType(cleanType(typeFor(node))) val callNode = NewCall() .name(callName) .dispatchType(DispatchTypes.INLINED) .methodFullName(callFullName) .code(code) - .typeFullName(typeFor(node)) + .typeFullName(typeFullName) .lineNumber(line(node)) .columnNumber(column(node)) callAst(callNode, argAsts) diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/parser/HeaderFileFinder.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/parser/HeaderFileFinder.scala index dbc6f36a1be9..af72687a9315 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/parser/HeaderFileFinder.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/parser/HeaderFileFinder.scala @@ -1,6 +1,6 @@ package io.joern.c2cpg.parser -import better.files._ +import better.files.* import io.joern.x2cpg.SourceFiles import org.jline.utils.Levenshtein diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/passes/AstCreationPass.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/passes/AstCreationPass.scala index a140db208fe4..ec30e91a4676 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/passes/AstCreationPass.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/passes/AstCreationPass.scala @@ -14,18 +14,22 @@ import io.joern.x2cpg.utils.TimeUtils import java.nio.file.Paths import java.util.concurrent.ConcurrentHashMap +import org.slf4j.{Logger, LoggerFactory} import scala.util.matching.Regex +import scala.util.{Failure, Success, Try} import scala.jdk.CollectionConverters.* class AstCreationPass(cpg: Cpg, config: Config, report: Report = new Report()) extends ForkJoinParallelCpgPass[String](cpg) { + private val logger: Logger = LoggerFactory.getLogger(classOf[AstCreationPass]) + private val file2OffsetTable: ConcurrentHashMap[String, Array[Int]] = new ConcurrentHashMap() private val parser: CdtParser = new CdtParser(config) private val global = new Global() - def typesSeen(): List[String] = global.usedTypes.keys().asScala.filterNot(_ == Defines.anyTypeName).toList + def typesSeen(): List[String] = global.usedTypes.keys().asScala.filterNot(_ == Defines.Any).toList override def generateParts(): Array[String] = { val sourceFileExtensions = FileDefaults.SOURCE_FILE_EXTENSIONS @@ -61,11 +65,17 @@ class AstCreationPass(cpg: Cpg, config: Config, report: Report = new Report()) parseResult match { case Some(translationUnit) => report.addReportInfo(relPath, fileLOC, parsed = true) - val localDiff = new AstCreator(relPath, global, config, translationUnit, file2OffsetTable)( - config.schemaValidation - ).createAst() - diffGraph.absorb(localDiff) - true + Try { + val localDiff = new AstCreator(relPath, global, config, translationUnit, file2OffsetTable)( + config.schemaValidation + ).createAst() + diffGraph.absorb(localDiff) + } match { + case Failure(exception) => + logger.warn(s"Failed to generate a CPG for: '$filename'", exception) + false + case Success(_) => true + } case None => report.addReportInfo(relPath, fileLOC) false diff --git a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/passes/TypeDeclNodePass.scala b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/passes/TypeDeclNodePass.scala index f8437a16004b..f4dc1ead9293 100644 --- a/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/passes/TypeDeclNodePass.scala +++ b/joern-cli/frontends/c2cpg/src/main/scala/io/joern/c2cpg/passes/TypeDeclNodePass.scala @@ -34,8 +34,8 @@ class TypeDeclNodePass(cpg: Cpg)(implicit withSchemaValidation: ValidationMode) .lineNumber(1) .astParentType(NodeTypes.NAMESPACE_BLOCK) .astParentFullName(fullName) - val blockNode = NewBlock().typeFullName(Defines.anyTypeName) - val methodReturn = newMethodReturnNode(Defines.anyTypeName, line = None, column = None) + val blockNode = NewBlock().typeFullName(Defines.Any) + val methodReturn = newMethodReturnNode(Defines.Any, line = None, column = None) Ast(includesFile).withChild( Ast(namespaceBlock) .withChild(Ast(fakeGlobalIncludesMethod).withChild(Ast(blockNode)).withChild(Ast(methodReturn))) diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/dataflow/ReachingDefTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/dataflow/ReachingDefTests.scala index c1c41699ed98..c8c0771dc094 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/dataflow/ReachingDefTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/dataflow/ReachingDefTests.scala @@ -3,7 +3,7 @@ package io.joern.c2cpg.dataflow import io.joern.c2cpg.testfixtures.DataFlowCodeToCpgSuite import io.joern.dataflowengineoss.passes.reachingdef.ReachingDefFlowGraph import io.shiftleft.codepropertygraph.generated.nodes.Identifier -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ReachingDefTests extends DataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/CodeDumperFromFileTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/CodeDumperFromFileTests.scala index e05a794841d5..fcd7e87c1502 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/CodeDumperFromFileTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/CodeDumperFromFileTests.scala @@ -3,7 +3,7 @@ package io.joern.c2cpg.io import better.files.File import io.joern.c2cpg.testfixtures.C2CpgSuite import io.shiftleft.semanticcpg.codedumper.CodeDumper -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.util.regex.Pattern diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/ExcludeTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/ExcludeTests.scala index 4d750ebda36e..09c8dad7fe05 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/ExcludeTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/ExcludeTests.scala @@ -4,7 +4,7 @@ import better.files.File import io.joern.c2cpg.Config import io.joern.c2cpg.C2Cpg import io.joern.x2cpg.X2Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import org.scalatest.matchers.should.Matchers import org.scalatest.prop.TableDrivenPropertyChecks @@ -62,6 +62,28 @@ class ExcludeTests extends AnyWordSpec with Matchers with TableDrivenPropertyChe ) } + "Using case sensitive excludes" should { + "exclude the given files correctly" in { + if (scala.util.Properties.isWin) { + // both are written uppercase and are ignored nevertheless + testWithArguments(Seq("Folder", "Index.c"), "", Set("a.c", "foo.bar/d.c")) + } + if (scala.util.Properties.isMac) { + // Folder written uppercase and it is not ignored while Index.c is. + // This might be an issue within Files.isSameFile but we take it for now. + testWithArguments(Seq("Folder", "Index.c"), "", Set("a.c", "folder/b.c", "folder/c.c", "foo.bar/d.c")) + } + if (scala.util.Properties.isLinux) { + // both are written uppercase and are not ignored + testWithArguments( + Seq("Folder", "Index.c"), + "", + Set("a.c", "folder/b.c", "folder/c.c", "foo.bar/d.c", "index.c") + ) + } + } + } + "Using different excludes via program arguments" should { val testInput = Table( diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotAstGeneratorTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotAstGeneratorTests.scala index 76a1bc882684..32e598393484 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotAstGeneratorTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotAstGeneratorTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.io.dotgenerator import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DotAstGeneratorTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotCdgGeneratorTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotCdgGeneratorTests.scala index 08778bd8ec6e..550e5a2349dd 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotCdgGeneratorTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotCdgGeneratorTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.io.dotgenerator import io.joern.c2cpg.testfixtures.DataFlowCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DotCdgGeneratorTests extends DataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotCfgGeneratorTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotCfgGeneratorTests.scala index 4cd62011ce76..a281be9e1b01 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotCfgGeneratorTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotCfgGeneratorTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.io.dotgenerator import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DotCfgGeneratorTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotDdgGeneratorTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotDdgGeneratorTests.scala index 846ca622d3d7..f043b7fbe7f5 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotDdgGeneratorTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/io/dotgenerator/DotDdgGeneratorTests.scala @@ -1,8 +1,8 @@ package io.joern.c2cpg.io.dotgenerator import io.joern.c2cpg.testfixtures.DataFlowCodeToCpgSuite -import io.joern.dataflowengineoss.language._ -import io.shiftleft.semanticcpg.language._ +import io.joern.dataflowengineoss.language.* +import io.shiftleft.semanticcpg.language.* class DotDdgGeneratorTests extends DataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/macros/MacroHandlingTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/macros/MacroHandlingTests.scala index 56192a053e2f..08e2e3c81434 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/macros/MacroHandlingTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/macros/MacroHandlingTests.scala @@ -2,13 +2,13 @@ package io.joern.c2cpg.macros import io.joern.c2cpg.testfixtures.C2CpgSuite import io.joern.c2cpg.testfixtures.DataFlowCodeToCpgSuite -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.Block import io.shiftleft.codepropertygraph.generated.nodes.Call import io.shiftleft.codepropertygraph.generated.nodes.Identifier -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MacroHandlingTests extends C2CpgSuite { @@ -231,7 +231,7 @@ class MacroHandlingTests extends C2CpgSuite { """.stripMargin) "should not result in malformed CFGs when expanding a nested macro with block" in { - cpg.all.collectAll[Block].l.count(b => b.cfgOut.size > 1) shouldBe 0 + cpg.all.collectAll[Block].l.count(b => b._cfgOut.size > 1) shouldBe 0 } } diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/MetaDataPassTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/MetaDataPassTests.scala index 2068e17210ff..cfb64ade809f 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/MetaDataPassTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/MetaDataPassTests.scala @@ -2,13 +2,13 @@ package io.joern.c2cpg.passes import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Languages -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal import io.joern.x2cpg.passes.frontend.MetaDataPass import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class MetaDataPassTests extends AnyWordSpec with Matchers { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/AstCreationPassTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/AstCreationPassTests.scala index 1fa6e7de118c..a2a10de66ae0 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/AstCreationPassTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/AstCreationPassTests.scala @@ -910,8 +910,8 @@ class AstCreationPassTests extends AstC2CpgSuite { |} """.stripMargin) inside(cpg.method.name("main").ast.isCall.codeExact("(*strLenFunc)(\"123\")").l) { case List(call) => - call.name shouldBe Defines.operatorPointerCall - call.methodFullName shouldBe Defines.operatorPointerCall + call.name shouldBe Defines.OperatorPointerCall + call.methodFullName shouldBe Defines.OperatorPointerCall } } @@ -2123,7 +2123,7 @@ class AstCreationPassTests extends AstC2CpgSuite { val cpg = code("class Foo { char (*(*x())[5])() }", "test.cpp") val List(method) = cpg.method.nameNot("").l method.name shouldBe "x" - method.fullName shouldBe "Foo.x:char (* (*)[5])()()" + method.fullName shouldBe "Foo.x:char(*(*)[5])()()" method.code shouldBe "char (*(*x())[5])()" method.signature shouldBe "char()" } diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/CallConventionsTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/CallConventionsTests.scala index 1adaddce886d..41f1ee51627c 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/CallConventionsTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/CallConventionsTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.AstC2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class CallConventionsTests extends AstC2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/CallTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/CallTests.scala index a7efec6f1df8..b928b1b3d38d 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/CallTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/CallTests.scala @@ -9,8 +9,6 @@ import io.shiftleft.codepropertygraph.generated.nodes.Literal import io.shiftleft.semanticcpg.language.NoResolve import io.shiftleft.semanticcpg.language.* -import java.nio.file.{Files, Path} - class CallTests extends C2CpgSuite { implicit val resolver: NoResolve.type = NoResolve @@ -112,7 +110,7 @@ class CallTests extends C2CpgSuite { "have the correct callIn" in { val List(m) = cpg.method.nameNot("").where(_.ast.isReturn.code(".*nullptr.*")).l val List(c) = cpg.call.codeExact("b->GetObj()").l - c.callee.head shouldBe m + c.callee.l should contain(m) val List(callIn) = m.callIn.l callIn.code shouldBe "b->GetObj()" } @@ -341,9 +339,9 @@ class CallTests extends C2CpgSuite { "test.cpp" ) - val List(call) = cpg.call.nameExact(Defines.operatorPointerCall).l + val List(call) = cpg.call.nameExact(Defines.OperatorPointerCall).l call.signature shouldBe "" - call.methodFullName shouldBe Defines.operatorPointerCall + call.methodFullName shouldBe Defines.OperatorPointerCall call.dispatchType shouldBe DispatchTypes.DYNAMIC_DISPATCH call.typeFullName shouldBe "void" @@ -408,9 +406,9 @@ class CallTests extends C2CpgSuite { "test.c" ) - val List(call) = cpg.call.nameExact(Defines.operatorPointerCall).l + val List(call) = cpg.call.nameExact(Defines.OperatorPointerCall).l call.signature shouldBe "" - call.methodFullName shouldBe Defines.operatorPointerCall + call.methodFullName shouldBe Defines.OperatorPointerCall call.dispatchType shouldBe DispatchTypes.DYNAMIC_DISPATCH call.typeFullName shouldBe "void" @@ -562,9 +560,9 @@ class CallTests extends C2CpgSuite { "test.c" ) - val List(call) = cpg.call.nameExact(Defines.operatorPointerCall).l + val List(call) = cpg.call.nameExact(Defines.OperatorPointerCall).l call.signature shouldBe "" - call.methodFullName shouldBe Defines.operatorPointerCall + call.methodFullName shouldBe Defines.OperatorPointerCall call.dispatchType shouldBe DispatchTypes.DYNAMIC_DISPATCH call.typeFullName shouldBe X2CpgDefines.Any @@ -610,9 +608,9 @@ class CallTests extends C2CpgSuite { "test.c" ) - val List(call) = cpg.call.nameExact(Defines.operatorPointerCall).l + val List(call) = cpg.call.nameExact(Defines.OperatorPointerCall).l call.signature shouldBe "" - call.methodFullName shouldBe Defines.operatorPointerCall + call.methodFullName shouldBe Defines.OperatorPointerCall call.dispatchType shouldBe DispatchTypes.DYNAMIC_DISPATCH call.typeFullName shouldBe X2CpgDefines.Any diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/ControlStructureTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/ControlStructureTests.scala index b918bb66bca4..5313ff41f2d4 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/ControlStructureTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/ControlStructureTests.scala @@ -3,7 +3,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.parser.FileDefaults import io.joern.c2cpg.testfixtures.C2CpgSuite import io.shiftleft.codepropertygraph.generated.ControlStructureTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ControlStructureTests extends C2CpgSuite(FileDefaults.CPP_EXT) { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/DependencyTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/DependencyTests.scala index 5961a22bd2f1..ff9882703a7d 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/DependencyTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/DependencyTests.scala @@ -2,7 +2,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.AstC2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DependencyTests extends AstC2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/HeaderAstCreationPassTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/HeaderAstCreationPassTests.scala index 53a624e68242..646c510c6759 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/HeaderAstCreationPassTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/HeaderAstCreationPassTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class HeaderAstCreationPassTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MemberTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MemberTests.scala index 82b91be23f27..6117f4ae71e0 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MemberTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MemberTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MemberTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MetaDataTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MetaDataTests.scala index 0724f67523f9..c3c91d81c19b 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MetaDataTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MetaDataTests.scala @@ -6,7 +6,7 @@ import io.joern.x2cpg.layers.CallGraph import io.joern.x2cpg.layers.ControlFlow import io.joern.x2cpg.layers.TypeRelations import io.shiftleft.codepropertygraph.generated.Languages -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MetaDataTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodParameterTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodParameterTests.scala index 4c4535132524..d3c12d8c82c2 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodParameterTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodParameterTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodParameterTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodReturnTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodReturnTests.scala index 64ab131c7323..ca33f31a7595 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodReturnTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodReturnTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class MethodReturnTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodTests.scala index 194649699a10..d4b32cbe95ef 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/MethodTests.scala @@ -3,7 +3,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.C2CpgSuite import io.shiftleft.codepropertygraph.generated.EvaluationStrategies import io.shiftleft.codepropertygraph.generated.NodeTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class MethodTests extends C2CpgSuite { @@ -270,6 +270,34 @@ class MethodTests extends C2CpgSuite { } + "Static modifier for methods" should { + "be correct" in { + val cpg = code( + """ + |static void staticCMethodDecl(); + |static void staticCMethodDef() {} + |""".stripMargin, + "test.c" + ).moreCode( + """ + |class A { + | static void staticCPPMethodDecl(); + | static void staticCPPMethodDef() {} + |}; + |""".stripMargin, + "test.cpp" + ) + val List(m1, m2, m3, m4) = cpg.method + .nameExact("staticCMethodDecl", "staticCMethodDef", "staticCPPMethodDecl", "staticCPPMethodDef") + .isStatic + .l + m1.fullName shouldBe "staticCMethodDecl" + m2.fullName shouldBe "staticCMethodDef" + m3.fullName shouldBe "A.staticCPPMethodDecl:void()" + m4.fullName shouldBe "A.staticCPPMethodDef:void()" + } + } + "Method name, signature and full name tests" should { "be correct for plain method C" in { val cpg = code( diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/NamespaceBlockTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/NamespaceBlockTests.scala index 200c7bed77ce..335c187314d6 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/NamespaceBlockTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/NamespaceBlockTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/ProgramStructureTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/ProgramStructureTests.scala index cda8183dcc8a..bef636625dac 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/ProgramStructureTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/ast/ProgramStructureTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.passes.ast import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class ProgramStructureTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/cfg/CfgCreationPassTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/cfg/CfgCreationPassTests.scala index 6ade9688aa0e..770fc02dea87 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/cfg/CfgCreationPassTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/cfg/CfgCreationPassTests.scala @@ -14,196 +14,196 @@ class CfgCreationPassTests extends CfgTestFixture(() => new CCfgTestCpg) { "Cfg" should { "contain an entry and exit node at least" in { implicit val cpg: Cpg = code("") - succOf("func") shouldBe expected(("RET", AlwaysEdge)) - succOf("RET") shouldBe expected() + succOf("func") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("RET") should contain theSameElementsAs expected() } "be correct for decl statement with assignment" in { implicit val cpg: Cpg = code("int x = 1;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x = 1", AlwaysEdge)) - succOf("x = 1") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x = 1", AlwaysEdge)) + succOf("x = 1") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for nested expression" in { implicit val cpg: Cpg = code("x = y + 1;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y + 1", AlwaysEdge)) - succOf("y + 1") shouldBe expected(("x = y + 1", AlwaysEdge)) - succOf("x = y + 1") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y + 1", AlwaysEdge)) + succOf("y + 1") should contain theSameElementsAs expected(("x = y + 1", AlwaysEdge)) + succOf("x = y + 1") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for return statement" in { implicit val cpg: Cpg = code("return x;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("return x;", AlwaysEdge)) - succOf("return x;") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("return x;", AlwaysEdge)) + succOf("return x;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for consecutive return statements" in { implicit val cpg: Cpg = code("return x; return y;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("return x;", AlwaysEdge)) - succOf("y") shouldBe expected(("return y;", AlwaysEdge)) - succOf("return x;") shouldBe expected(("RET", AlwaysEdge)) - succOf("return y;") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("return x;", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("return y;", AlwaysEdge)) + succOf("return x;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("return y;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for void return statement" in { implicit val cpg: Cpg = code("return;") - succOf("func") shouldBe expected(("return;", AlwaysEdge)) - succOf("return;") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("return;", AlwaysEdge)) + succOf("return;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for call expression" in { implicit val cpg: Cpg = code("foo(a + 1, b);") - succOf("func") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("a + 1", AlwaysEdge)) - succOf("a + 1") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("foo(a + 1, b)", AlwaysEdge)) - succOf("foo(a + 1, b)") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("a + 1", AlwaysEdge)) + succOf("a + 1") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("foo(a + 1, b)", AlwaysEdge)) + succOf("foo(a + 1, b)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for unary expression '+'" in { implicit val cpg: Cpg = code("+x;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("+x", AlwaysEdge)) - succOf("+x") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("+x", AlwaysEdge)) + succOf("+x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for unary expression '++'" in { implicit val cpg: Cpg = code("++x;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("++x", AlwaysEdge)) - succOf("++x") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("++x", AlwaysEdge)) + succOf("++x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for conditional expression" in { implicit val cpg: Cpg = code("x ? y : z;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("z", FalseEdge)) - succOf("y") shouldBe expected(("x ? y : z", AlwaysEdge)) - succOf("z") shouldBe expected(("x ? y : z", AlwaysEdge)) - succOf("x ? y : z") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("z", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("x ? y : z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("x ? y : z", AlwaysEdge)) + succOf("x ? y : z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for conditional expression with empty then" in { implicit val cpg: Cpg = code("x ? : z;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("x ? : z", TrueEdge), ("z", FalseEdge)) - succOf("z") shouldBe expected(("x ? : z", AlwaysEdge)) - succOf("x ? : z") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("x ? : z", TrueEdge), ("z", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("x ? : z", AlwaysEdge)) + succOf("x ? : z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for short-circuit AND expression" in { implicit val cpg: Cpg = code("int z = x && y;") - succOf("func") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("x && y", FalseEdge)) - succOf("y") shouldBe expected(("x && y", AlwaysEdge)) - succOf("x && y") shouldBe expected(("z = x && y", AlwaysEdge)) - succOf("z = x && y") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("x && y", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("x && y", AlwaysEdge)) + succOf("x && y") should contain theSameElementsAs expected(("z = x && y", AlwaysEdge)) + succOf("z = x && y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for short-circuit OR expression" in { implicit val cpg: Cpg = code("x || y;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", FalseEdge), ("x || y", TrueEdge)) - succOf("y") shouldBe expected(("x || y", AlwaysEdge)) - succOf("x || y") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", FalseEdge), ("x || y", TrueEdge)) + succOf("y") should contain theSameElementsAs expected(("x || y", AlwaysEdge)) + succOf("x || y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } "Cfg for while-loop" should { "be correct" in { implicit val cpg: Cpg = code("while (x < 1) { y = 2; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("y = 2", AlwaysEdge)) - succOf("y = 2") shouldBe expected(("x", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("y = 2", AlwaysEdge)) + succOf("y = 2") should contain theSameElementsAs expected(("x", AlwaysEdge)) } "be correct with break" in { implicit val cpg: Cpg = code("while (x < 1) { break; y; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("break;", TrueEdge), ("RET", FalseEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("y") shouldBe expected(("x", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("break;", TrueEdge), ("RET", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", AlwaysEdge)) } "be correct with continue" in { implicit val cpg: Cpg = code("while (x < 1) { continue; y; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("continue;", TrueEdge), ("RET", FalseEdge)) - succOf("continue;") shouldBe expected(("x", AlwaysEdge)) - succOf("y") shouldBe expected(("x", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("continue;", TrueEdge), ("RET", FalseEdge)) + succOf("continue;") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", AlwaysEdge)) } "be correct with nested while-loop" in { implicit val cpg: Cpg = code("while (x) { while (y) { z; }}") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("z", TrueEdge), ("x", FalseEdge)) - succOf("z") shouldBe expected(("y", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("z", TrueEdge), ("x", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("y", AlwaysEdge)) } } "Cfg for do-while-loop" should { "be correct" in { implicit val cpg: Cpg = code("do { y = 2; } while (x < 1);") - succOf("func") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("y = 2", AlwaysEdge)) - succOf("y = 2") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("func") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("y = 2", AlwaysEdge)) + succOf("y = 2") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) } "be correct with break" in { implicit val cpg: Cpg = code("do { break; y; } while (x < 1);") - succOf("func") shouldBe expected(("break;", AlwaysEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("y") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("break;", TrueEdge), ("RET", FalseEdge)) + succOf("func") should contain theSameElementsAs expected(("break;", AlwaysEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("break;", TrueEdge), ("RET", FalseEdge)) } "be correct with continue" in { implicit val cpg: Cpg = code("do { continue; y; } while (x < 1);") - succOf("func") shouldBe expected(("continue;", AlwaysEdge)) - succOf("continue;") shouldBe expected(("x", AlwaysEdge)) - succOf("y") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("continue;", TrueEdge), ("RET", FalseEdge)) + succOf("func") should contain theSameElementsAs expected(("continue;", AlwaysEdge)) + succOf("continue;") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("continue;", TrueEdge), ("RET", FalseEdge)) } "be correct with nested do-while-loop" in { implicit val cpg: Cpg = code("do { do { x; } while (y); } while (z);") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("x", TrueEdge), ("z", FalseEdge)) - succOf("z") shouldBe expected(("x", TrueEdge), ("RET", FalseEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", TrueEdge), ("z", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("x", TrueEdge), ("RET", FalseEdge)) } "be correct for do-while-loop with empty body" in { implicit val cpg: Cpg = code("do { } while(x > 1);") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("1") shouldBe expected(("x > 1", AlwaysEdge)) - succOf("x > 1") shouldBe expected(("x", TrueEdge), ("RET", FalseEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x > 1", AlwaysEdge)) + succOf("x > 1") should contain theSameElementsAs expected(("x", TrueEdge), ("RET", FalseEdge)) } } @@ -211,122 +211,122 @@ class CfgCreationPassTests extends CfgTestFixture(() => new CCfgTestCpg) { "Cfg for for-loop" should { "be correct" in { implicit val cpg: Cpg = code("for (x = 0; y < 1; z += 2) { a = 3; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("x = 0", AlwaysEdge)) - succOf("x = 0") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y < 1", AlwaysEdge)) - succOf("y < 1") shouldBe expected(("a", TrueEdge), ("RET", FalseEdge)) - succOf("a") shouldBe expected(("3", AlwaysEdge)) - succOf("3") shouldBe expected(("a = 3", AlwaysEdge)) - succOf("a = 3") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("z += 2", AlwaysEdge)) - succOf("z += 2") shouldBe expected(("y", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("x = 0", AlwaysEdge)) + succOf("x = 0") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y < 1", AlwaysEdge)) + succOf("y < 1") should contain theSameElementsAs expected(("a", TrueEdge), ("RET", FalseEdge)) + succOf("a") should contain theSameElementsAs expected(("3", AlwaysEdge)) + succOf("3") should contain theSameElementsAs expected(("a = 3", AlwaysEdge)) + succOf("a = 3") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("z += 2", AlwaysEdge)) + succOf("z += 2") should contain theSameElementsAs expected(("y", AlwaysEdge)) } "be correct with break" in { implicit val cpg: Cpg = code("for (x = 0; y < 1; z += 2) { break; a = 3; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("0", AlwaysEdge)) - succOf("x = 0") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y < 1", AlwaysEdge)) - succOf("y < 1") shouldBe expected(("break;", TrueEdge), ("RET", FalseEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("a") shouldBe expected(("3", AlwaysEdge)) - succOf("3") shouldBe expected(("a = 3", AlwaysEdge)) - succOf("a = 3") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("z += 2", AlwaysEdge)) - succOf("z += 2") shouldBe expected(("y", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("x = 0") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y < 1", AlwaysEdge)) + succOf("y < 1") should contain theSameElementsAs expected(("break;", TrueEdge), ("RET", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("3", AlwaysEdge)) + succOf("3") should contain theSameElementsAs expected(("a = 3", AlwaysEdge)) + succOf("a = 3") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("z += 2", AlwaysEdge)) + succOf("z += 2") should contain theSameElementsAs expected(("y", AlwaysEdge)) } "be correct with continue" in { implicit val cpg: Cpg = code("for (x = 0; y < 1; z += 2) { continue; a = 3; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("x = 0", AlwaysEdge)) - succOf("x = 0") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y < 1", AlwaysEdge)) - succOf("y < 1") shouldBe expected(("continue;", TrueEdge), ("RET", FalseEdge)) - succOf("continue;") shouldBe expected(("z", AlwaysEdge)) - succOf("a") shouldBe expected(("3", AlwaysEdge)) - succOf("3") shouldBe expected(("a = 3", AlwaysEdge)) - succOf("a = 3") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("z += 2", AlwaysEdge)) - succOf("z += 2") shouldBe expected(("y", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("x = 0", AlwaysEdge)) + succOf("x = 0") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y < 1", AlwaysEdge)) + succOf("y < 1") should contain theSameElementsAs expected(("continue;", TrueEdge), ("RET", FalseEdge)) + succOf("continue;") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("3", AlwaysEdge)) + succOf("3") should contain theSameElementsAs expected(("a = 3", AlwaysEdge)) + succOf("a = 3") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("z += 2", AlwaysEdge)) + succOf("z += 2") should contain theSameElementsAs expected(("y", AlwaysEdge)) } "be correct with nested for-loop" in { implicit val cpg: Cpg = code("for (x; y; z) { for (a; b; c) { u; } }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("a", TrueEdge), ("RET", FalseEdge)) - succOf("z") shouldBe expected(("y", AlwaysEdge)) - succOf("a") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("u", TrueEdge), ("z", FalseEdge)) - succOf("c") shouldBe expected(("b", AlwaysEdge)) - succOf("u") shouldBe expected(("c", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("a", TrueEdge), ("RET", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("u", TrueEdge), ("z", FalseEdge)) + succOf("c") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("u") should contain theSameElementsAs expected(("c", AlwaysEdge)) } "be correct with empty condition" in { implicit val cpg: Cpg = code("for (;;) { a = 1; }") - succOf("func") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("a = 1", AlwaysEdge)) - succOf("a = 1") shouldBe expected(("a", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("a = 1", AlwaysEdge)) + succOf("a = 1") should contain theSameElementsAs expected(("a", AlwaysEdge)) } "be correct with empty condition with break" in { implicit val cpg: Cpg = code("for (;;) { break; }") - succOf("func") shouldBe expected(("break;", AlwaysEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("break;", AlwaysEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with empty condition with continue" in { implicit val cpg: Cpg = code("for (;;) { continue ; }") - succOf("func") shouldBe expected(("continue ;", AlwaysEdge)) - succOf("continue ;") shouldBe expected(("continue ;", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("continue ;", AlwaysEdge)) + succOf("continue ;") should contain theSameElementsAs expected(("continue ;", AlwaysEdge)) } "be correct with empty condition with nested empty for-loop" in { implicit val cpg: Cpg = code("for (;;) { for (;;) { x; } }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("x", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("x", AlwaysEdge)) } "be correct with empty condition with empty block" in { implicit val cpg: Cpg = code("for (;;) ;") - succOf("func") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct when empty for-loop is skipped" in { implicit val cpg: Cpg = code("for (;;) {}; return;") - succOf("func") shouldBe expected(("return;", AlwaysEdge)) - succOf("return;") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("return;", AlwaysEdge)) + succOf("return;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with function call condition with empty block" in { implicit val cpg: Cpg = code("for (; x(1);) ;") - succOf("func") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x(1)", AlwaysEdge)) - succOf("x(1)") shouldBe expected(("1", TrueEdge), ("RET", FalseEdge)) + succOf("func") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x(1)", AlwaysEdge)) + succOf("x(1)") should contain theSameElementsAs expected(("1", TrueEdge), ("RET", FalseEdge)) } } "Cfg for goto" should { "be correct for single label" in { implicit val cpg: Cpg = code("x; goto l1; y; l1: ;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("goto l1;", AlwaysEdge)) - succOf("goto l1;") shouldBe expected(("l1: ;", AlwaysEdge)) - succOf("l1: ;") shouldBe expected(("RET", AlwaysEdge)) - succOf("y") shouldBe expected(("l1: ;", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("goto l1;", AlwaysEdge)) + succOf("goto l1;") should contain theSameElementsAs expected(("l1: ;", AlwaysEdge)) + succOf("l1: ;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("l1: ;", AlwaysEdge)) } "be correct for GNU goto labels as values" in { @@ -336,40 +336,40 @@ class CfgCreationPassTests extends CfgTestFixture(() => new CCfgTestCpg) { |otherCall(); |foo: someCall(); |""".stripMargin) - succOf("func") shouldBe expected(("ptr", AlwaysEdge)) - succOf("ptr") shouldBe expected(("foo", AlwaysEdge)) - succOf("ptr", 1) shouldBe expected(("*ptr", AlwaysEdge)) - succOf("foo") shouldBe expected(("&&foo", AlwaysEdge)) - succOf("*ptr = &&foo") shouldBe expected(("goto *;", AlwaysEdge)) - succOf("goto *;") shouldBe expected(("foo: someCall();", AlwaysEdge)) - succOf("foo: someCall();") shouldBe expected(("someCall()", AlwaysEdge)) - succOf("otherCall()") shouldBe expected(("foo: someCall();", AlwaysEdge)) - succOf("someCall()") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("ptr", AlwaysEdge)) + succOf("ptr") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("ptr", 1) should contain theSameElementsAs expected(("*ptr", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("&&foo", AlwaysEdge)) + succOf("*ptr = &&foo") should contain theSameElementsAs expected(("goto *;", AlwaysEdge)) + succOf("goto *;") should contain theSameElementsAs expected(("foo: someCall();", AlwaysEdge)) + succOf("foo: someCall();") should contain theSameElementsAs expected(("someCall()", AlwaysEdge)) + succOf("otherCall()") should contain theSameElementsAs expected(("foo: someCall();", AlwaysEdge)) + succOf("someCall()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for multiple labels" in { implicit val cpg: Cpg = code("x; goto l1; l2: y; l1: ;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("goto l1;", AlwaysEdge)) - succOf("goto l1;") shouldBe expected(("l1: ;", AlwaysEdge)) - succOf("y") shouldBe expected(("l1: ;", AlwaysEdge)) - succOf("l1: ;") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("goto l1;", AlwaysEdge)) + succOf("goto l1;") should contain theSameElementsAs expected(("l1: ;", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("l1: ;", AlwaysEdge)) + succOf("l1: ;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for multiple labels on same spot" in { implicit val cpg: Cpg = code("x; goto l2; y; l1: ;l2: ;") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("goto l2;", AlwaysEdge)) - succOf("goto l2;") shouldBe expected(("l2: ;", AlwaysEdge)) - succOf("y") shouldBe expected(("l1: ;", AlwaysEdge)) - succOf("l1: ;") shouldBe expected(("l2: ;", AlwaysEdge)) - succOf("l2: ;") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("goto l2;", AlwaysEdge)) + succOf("goto l2;") should contain theSameElementsAs expected(("l2: ;", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("l1: ;", AlwaysEdge)) + succOf("l1: ;") should contain theSameElementsAs expected(("l2: ;", AlwaysEdge)) + succOf("l2: ;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "work correctly with if block" in { implicit val cpg: Cpg = code("if(foo) goto end; if(bar) { f(x); } end: ;") - succOf("func") shouldBe expected(("foo", AlwaysEdge)) - succOf("goto end;") shouldBe expected(("end: ;", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("goto end;") should contain theSameElementsAs expected(("end: ;", AlwaysEdge)) } } @@ -377,85 +377,93 @@ class CfgCreationPassTests extends CfgTestFixture(() => new CCfgTestCpg) { "Cfg for switch" should { "be correct with one case" in { implicit val cpg: Cpg = code("switch (x) { case 1: y; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("RET", CaseEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("case 1:", CaseEdge), ("RET", CaseEdge)) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with multiple cases" in { implicit val cpg: Cpg = code("switch (x) { case 1: y; case 2: z;}") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("case 2:", CaseEdge), ("RET", CaseEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("case 2:", AlwaysEdge)) - succOf("case 2:") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected( + ("case 1:", CaseEdge), + ("case 2:", CaseEdge), + ("RET", CaseEdge) + ) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("case 2:", AlwaysEdge)) + succOf("case 2:") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with multiple cases on same spot" in { implicit val cpg: Cpg = code("switch (x) { case 1: case 2: y; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("case 2:", CaseEdge), ("RET", CaseEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("case 2:", AlwaysEdge)) - succOf("case 2:") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected( + ("case 1:", CaseEdge), + ("case 2:", CaseEdge), + ("RET", CaseEdge) + ) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("case 2:", AlwaysEdge)) + succOf("case 2:") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with multiple cases and multiple cases on same spot" in { implicit val cpg: Cpg = code("switch (x) { case 1: case 2: y; case 3: z;}") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected( + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected( ("case 1:", CaseEdge), ("case 2:", CaseEdge), ("case 3:", CaseEdge), ("RET", CaseEdge) ) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("case 2:", AlwaysEdge)) - succOf("case 2:") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("case 3:", AlwaysEdge)) - succOf("case 3:") shouldBe expected(("3", AlwaysEdge)) - succOf("3") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("case 2:", AlwaysEdge)) + succOf("case 2:") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("case 3:", AlwaysEdge)) + succOf("case 3:") should contain theSameElementsAs expected(("3", AlwaysEdge)) + succOf("3") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with default case" in { implicit val cpg: Cpg = code("switch (x) { default: y; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("default:", CaseEdge)) - succOf("default:") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("default:", CaseEdge)) + succOf("default:") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for case and default combined" in { implicit val cpg: Cpg = code("switch (x) { case 1: y; break; default: z;}") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("default:", CaseEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("break;", AlwaysEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("default:") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("case 1:", CaseEdge), ("default:", CaseEdge)) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("break;", AlwaysEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("default:") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for nested switch" in { implicit val cpg: Cpg = code("switch (x) { case 1: switch(y) { default: z; } }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("RET", AlwaysEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("default:", CaseEdge)) - succOf("default:") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("case 1:", CaseEdge), ("RET", AlwaysEdge)) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("default:", CaseEdge)) + succOf("default:") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for switch containing continue statement" in { @@ -467,42 +475,62 @@ class CfgCreationPassTests extends CfgTestFixture(() => new CCfgTestCpg) { | } |} |""".stripMargin) - succOf("continue;") shouldBe expected(("i", AlwaysEdge)) + succOf("continue;") should contain theSameElementsAs expected(("i", AlwaysEdge)) } } "Cfg for if" should { "be correct" in { implicit val cpg: Cpg = code("if (x) { y; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with else block" in { implicit val cpg: Cpg = code("if (x) { y; } else { z; }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("z", FalseEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("z", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with nested if" in { implicit val cpg: Cpg = code("if (x) { if (y) { z; } }") - succOf("func") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("z", TrueEdge), ("RET", FalseEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("z", TrueEdge), ("RET", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct with else if chain" in { implicit val cpg: Cpg = code("if (a) { b; } else if (c) { d;} else { e; }") - succOf("func") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("b", TrueEdge), ("c", FalseEdge)) - succOf("b") shouldBe expected(("RET", AlwaysEdge)) - succOf("c") shouldBe expected(("d", TrueEdge), ("e", FalseEdge)) - succOf("d") shouldBe expected(("RET", AlwaysEdge)) - succOf("e") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("b", TrueEdge), ("c", FalseEdge)) + succOf("b") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("c") should contain theSameElementsAs expected(("d", TrueEdge), ("e", FalseEdge)) + succOf("d") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("e") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + } + + "be correct for empty 'then' block" in { + implicit val cpg: Cpg = code("if (cond()) {} else { foo(); }") + succOf("func") should contain theSameElementsAs expected(("cond()", AlwaysEdge)) + succOf("cond()") should contain theSameElementsAs expected(("RET", TrueEdge), ("foo()", FalseEdge)) + succOf("foo()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + } + + "be correct for empty 'else' block" in { + implicit val cpg: Cpg = code("if (cond()) {foo();} else {}") + succOf("func") should contain theSameElementsAs expected(("cond()", AlwaysEdge)) + succOf("cond()") should contain theSameElementsAs expected(("RET", FalseEdge), ("foo()", TrueEdge)) + succOf("foo()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + } + + "be correct for empty 'then' and 'else' block" in { + implicit val cpg: Cpg = code("if (cond()) {} else {}") + succOf("func") should contain theSameElementsAs expected(("cond()", AlwaysEdge)) + succOf("cond()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } } @@ -516,9 +544,9 @@ class CppCfgCreationPassTests extends CfgTestFixture(() => new CCfgTestCpg(FileD "be correct for try with a single catch" in { implicit val cpg: Cpg = code("try { a; } catch (int x) { b; }") - succOf("func") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("b", AlwaysEdge), ("RET", AlwaysEdge)) - succOf("b") shouldBe expected(("RET", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("b", AlwaysEdge), ("RET", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for try with multiple catches" in { @@ -533,13 +561,18 @@ class CppCfgCreationPassTests extends CfgTestFixture(() => new CCfgTestCpg(FileD | d; |} |""".stripMargin) - succOf("func") shouldBe expected(("a", AlwaysEdge)) + succOf("func") should contain theSameElementsAs expected(("a", AlwaysEdge)) // Try should have an edge to all catches and return - succOf("a") shouldBe expected(("b", AlwaysEdge), ("c", AlwaysEdge), ("d", AlwaysEdge), ("RET", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected( + ("b", AlwaysEdge), + ("c", AlwaysEdge), + ("d", AlwaysEdge), + ("RET", AlwaysEdge) + ) // But catches should only have edges to return - succOf("b") shouldBe expected(("RET", AlwaysEdge)) - succOf("c") shouldBe expected(("RET", AlwaysEdge)) - succOf("d") shouldBe expected(("RET", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("c") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("d") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } } diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/cfg/MethodCfgLayoutTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/cfg/MethodCfgLayoutTests.scala index d2c5042faa88..27b285307716 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/cfg/MethodCfgLayoutTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/cfg/MethodCfgLayoutTests.scala @@ -1,9 +1,9 @@ package io.joern.c2cpg.passes.cfg import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodCfgLayoutTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/ClassTypeTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/ClassTypeTests.scala index c746c034f705..2b796e3e2deb 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/ClassTypeTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/ClassTypeTests.scala @@ -2,7 +2,7 @@ package io.joern.c2cpg.passes.types import io.joern.c2cpg.parser.FileDefaults import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class ClassTypeTests extends C2CpgSuite(FileDefaults.CPP_EXT) { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/EnumTypeTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/EnumTypeTests.scala index 27dd1b780dd2..48d4cafc9034 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/EnumTypeTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/EnumTypeTests.scala @@ -6,7 +6,7 @@ import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.Call import io.shiftleft.codepropertygraph.generated.nodes.FieldIdentifier import io.shiftleft.codepropertygraph.generated.nodes.Identifier -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class EnumTypeTests extends C2CpgSuite(fileSuffix = FileDefaults.CPP_EXT) { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/NamespaceTypeTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/NamespaceTypeTests.scala index a58938f089aa..855ace0ba469 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/NamespaceTypeTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/NamespaceTypeTests.scala @@ -6,7 +6,7 @@ import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.Call import io.shiftleft.codepropertygraph.generated.nodes.FieldIdentifier import io.shiftleft.codepropertygraph.generated.nodes.Identifier -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class NamespaceTypeTests extends C2CpgSuite(fileSuffix = FileDefaults.CPP_EXT) { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/StructTypeTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/StructTypeTests.scala index c6cfba93a1d4..8b4b9b76c92f 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/StructTypeTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/StructTypeTests.scala @@ -2,7 +2,7 @@ package io.joern.c2cpg.passes.types import io.joern.c2cpg.testfixtures.C2CpgSuite import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class StructTypeTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/TemplateTypeTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/TemplateTypeTests.scala index 59720a9a3042..050c9603ea52 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/TemplateTypeTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/TemplateTypeTests.scala @@ -2,7 +2,7 @@ package io.joern.c2cpg.passes.types import io.joern.c2cpg.parser.FileDefaults import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class TemplateTypeTests extends C2CpgSuite(fileSuffix = FileDefaults.CPP_EXT) { @@ -72,10 +72,10 @@ class TemplateTypeTests extends C2CpgSuite(fileSuffix = FileDefaults.CPP_EXT) { |""".stripMargin) inside(cpg.method.nameNot("").internal.l) { case List(x, y) => x.name shouldBe "x" - x.fullName shouldBe "x:void(#0,#1)" + x.fullName shouldBe "x:void(ANY,ANY)" x.signature shouldBe "void(T,U)" y.name shouldBe "y" - y.fullName shouldBe "y:void(#0,#1)" + y.fullName shouldBe "y:void(ANY,ANY)" y.signature shouldBe "void(T,U)" } } diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/TypeNodePassTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/TypeNodePassTests.scala index 01a1ffa70919..2795aa9a80ca 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/TypeNodePassTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/passes/types/TypeNodePassTests.scala @@ -1,9 +1,9 @@ package io.joern.c2cpg.passes.types import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class TypeNodePassTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/AstQueryTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/AstQueryTests.scala index b77feba015d4..f3b9675ec390 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/AstQueryTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/AstQueryTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.querying import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class AstQueryTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/CfgQueryTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/CfgQueryTests.scala index f66694c2ceb2..8c31b9ce4a69 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/CfgQueryTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/CfgQueryTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.querying import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CfgQueryTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/DdgCfgQueryTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/DdgCfgQueryTests.scala index befa06bf7d00..f2e558ed8dd9 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/DdgCfgQueryTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/DdgCfgQueryTests.scala @@ -2,8 +2,8 @@ package io.joern.c2cpg.querying import io.joern.c2cpg.testfixtures.DataFlowCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.nodes -import io.joern.dataflowengineoss.language._ -import io.shiftleft.semanticcpg.language._ +import io.joern.dataflowengineoss.language.* +import io.shiftleft.semanticcpg.language.* class DdgCfgQueryTests extends DataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/LocalQueryTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/LocalQueryTests.scala index d858744b122e..ae0acd31eb25 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/LocalQueryTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/LocalQueryTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.querying import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* /** Language primitives for navigating local variables */ diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/LocationQueryTests.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/LocationQueryTests.scala index a4bc22e264c4..7ac71e73f9fe 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/LocationQueryTests.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/querying/LocationQueryTests.scala @@ -1,7 +1,7 @@ package io.joern.c2cpg.querying import io.joern.c2cpg.testfixtures.C2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LocationQueryTests extends C2CpgSuite { diff --git a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/testfixtures/DataFlowCodeToCpgSuite.scala b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/testfixtures/DataFlowCodeToCpgSuite.scala index 16211eb85508..7e3498ff8d24 100644 --- a/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/testfixtures/DataFlowCodeToCpgSuite.scala +++ b/joern-cli/frontends/c2cpg/src/test/scala/io/joern/c2cpg/testfixtures/DataFlowCodeToCpgSuite.scala @@ -27,7 +27,7 @@ class DataFlowCodeToCpgSuite extends Code2CpgFixture(() => new DataFlowTestCpg() protected implicit val context: EngineContext = EngineContext() protected def flowToResultPairs(path: Path): List[(String, Integer)] = - path.resultPairs().collect { case (firstElement: String, secondElement: Option[Integer]) => + path.resultPairs().collect { case (firstElement: String, secondElement) => (firstElement, secondElement.getOrElse(-1)) } } diff --git a/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstCreator.scala index 90291c57fcb6..7a1608fab132 100644 --- a/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstCreator.scala @@ -10,7 +10,7 @@ import io.shiftleft.codepropertygraph.generated.NodeTypes import io.shiftleft.codepropertygraph.generated.nodes.{NewFile, NewTypeDecl} import io.shiftleft.passes.IntervalKeyPool import org.slf4j.{Logger, LoggerFactory} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import ujson.Value import java.math.BigInteger diff --git a/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstCreatorHelper.scala b/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstCreatorHelper.scala index a070f8c8b539..4ff6587e8638 100644 --- a/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstCreatorHelper.scala +++ b/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstCreatorHelper.scala @@ -83,7 +83,7 @@ trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: As case x: NewMethodParameterIn => identifierNode(dotNetNode.orNull, x.name, x.code, x.typeFullName, x.dynamicTypeHintFullName) case x => - logger.warn(s"Unhandled declaration type '${x.label()}' for ${x.name}") + logger.warn(s"Unhandled declaration type '${x.label}' for ${x.name}") identifierNode(dotNetNode.orNull, x.name, x.name, Defines.Any) } diff --git a/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/datastructures/CSharpProgramSummary.scala b/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/datastructures/CSharpProgramSummary.scala index 6ff1c0715021..ca6598bea083 100644 --- a/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/datastructures/CSharpProgramSummary.scala +++ b/joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/datastructures/CSharpProgramSummary.scala @@ -25,7 +25,7 @@ type NamespaceToTypeMap = mutable.Map[String, mutable.Set[CSharpType]] * @see * [[CSharpProgramSummary.jsonToInitialMapping]] for generating initial mappings. */ -case class CSharpProgramSummary(val namespaceToType: NamespaceToTypeMap, val imports: Set[String]) +case class CSharpProgramSummary(namespaceToType: NamespaceToTypeMap, imports: Set[String]) extends ProgramSummary[CSharpType, CSharpMethod, CSharpField] { def findGlobalTypes: Set[CSharpType] = namespaceToType.getOrElse(Constants.Global, Set.empty).toSet diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala index 751ec5c511fe..1b3003fa1945 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala @@ -13,7 +13,7 @@ import ghidra.program.model.listing.Program import ghidra.program.util.{DefinedDataIterator, GhidraProgramUtilities} import ghidra.util.exception.InvalidInputException import ghidra.util.task.TaskMonitor -import io.joern.ghidra2cpg.passes._ +import io.joern.ghidra2cpg.passes.* import io.joern.ghidra2cpg.passes.arm.ArmFunctionPass import io.joern.ghidra2cpg.passes.mips.{LoHiPass, MipsFunctionPass} import io.joern.ghidra2cpg.passes.x86.{ReturnEdgesPass, X86FunctionPass} @@ -26,7 +26,7 @@ import utilities.util.FileUtilities import java.io.File import scala.collection.mutable -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.util.Try class Ghidra2Cpg extends X2CpgFrontend[Config] { diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Main.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Main.scala index 3c6ee6139f2f..189f3f8fd034 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Main.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Main.scala @@ -1,6 +1,6 @@ package io.joern.ghidra2cpg -import io.joern.ghidra2cpg.Frontend._ +import io.joern.ghidra2cpg.Frontend.* import io.joern.x2cpg.{X2CpgConfig, X2CpgMain} import scopt.OParser diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/FunctionPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/FunctionPass.scala index 4af29997e1d5..c32880c96990 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/FunctionPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/FunctionPass.scala @@ -6,17 +6,17 @@ import ghidra.program.model.lang.Register import ghidra.program.model.listing.{CodeUnitFormat, CodeUnitFormatOptions, Function, Instruction, Program} import ghidra.program.model.pcode.{HighFunction, HighSymbol} import ghidra.program.model.scalar.Scalar -import io.joern.ghidra2cpg._ -import io.joern.ghidra2cpg.processors._ +import io.joern.ghidra2cpg.* +import io.joern.ghidra2cpg.processors.* import io.joern.ghidra2cpg.utils.Decompiler -import io.joern.ghidra2cpg.utils.Utils._ +import io.joern.ghidra2cpg.utils.Utils.* import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{CfgNodeNew, NewBlock, NewMethod} import io.shiftleft.codepropertygraph.generated.{EdgeTypes, nodes} import io.shiftleft.passes.ForkJoinParallelCpgPass import scala.collection.mutable -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.language.implicitConversions abstract class FunctionPass( @@ -60,7 +60,7 @@ abstract class FunctionPass( override def generateParts(): Array[Function] = functions.toArray - implicit def intToIntegerOption(intOption: Option[Int]): Option[Integer] = intOption.map(intValue => { + implicit def intToIntegerOption(intOption: Option[Int]): Option[Int] = intOption.map(intValue => { val integerValue = intValue integerValue }) diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/JumpPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/JumpPass.scala index dfbd5fa2beca..7a58ae23608e 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/JumpPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/JumpPass.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.{Call, Method} import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import scala.util.Try diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala index 97e27d06c0b9..97f37248b57a 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala @@ -6,7 +6,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes import io.shiftleft.passes.ForkJoinParallelCpgPass -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.language.implicitConversions class LiteralPass(cpg: Cpg, flatProgramAPI: FlatProgramAPI) extends ForkJoinParallelCpgPass[String](cpg) { diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala index 7905e95c11df..de8fca302cdf 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala @@ -2,15 +2,14 @@ package io.joern.ghidra2cpg.passes import ghidra.program.model.listing.{Function, Program} import ghidra.program.util.DefinedDataIterator -import io.joern.ghidra2cpg._ -import io.joern.ghidra2cpg.utils.Utils._ +import io.joern.ghidra2cpg.* +import io.joern.ghidra2cpg.utils.Utils.* import io.joern.ghidra2cpg.utils.{Decompiler, PCodeMapper} -import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{NewBlock, NewMethod} -import io.shiftleft.codepropertygraph.generated.{EdgeTypes, nodes} +import io.shiftleft.codepropertygraph.generated.{Cpg, EdgeTypes, nodes} import io.shiftleft.passes.ForkJoinParallelCpgPass -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.language.implicitConversions class PCodePass(currentProgram: Program, fileName: String, functions: List[Function], cpg: Cpg, decompiler: Decompiler) diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/arm/ArmFunctionPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/arm/ArmFunctionPass.scala index c0ebcf7d26df..60963b18126e 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/arm/ArmFunctionPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/arm/ArmFunctionPass.scala @@ -5,9 +5,8 @@ import io.joern.ghidra2cpg.utils.Decompiler import io.joern.ghidra2cpg.passes.FunctionPass import io.joern.ghidra2cpg.processors.ArmProcessor import io.joern.ghidra2cpg.utils.Utils.{checkIfExternal, createMethodNode, createReturnNode} -import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.NewBlock -import io.shiftleft.codepropertygraph.generated.{EdgeTypes, nodes} +import io.shiftleft.codepropertygraph.generated.{Cpg, EdgeTypes, nodes} class ArmFunctionPass( currentProgram: Program, diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/LoHiPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/LoHiPass.scala index 2b592a15e403..36e43c08854b 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/LoHiPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/LoHiPass.scala @@ -1,10 +1,10 @@ package io.joern.ghidra2cpg.passes.mips import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, PropertyNames} import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LoHiPass(cpg: Cpg) extends ForkJoinParallelCpgPass[(Call, Call)](cpg) { override def generateParts(): Array[(Call, Call)] = { diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/MipsFunctionPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/MipsFunctionPass.scala index 6e5a238b570d..71222e896100 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/MipsFunctionPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/MipsFunctionPass.scala @@ -2,12 +2,12 @@ package io.joern.ghidra2cpg.passes.mips import ghidra.program.model.address.GenericAddress import ghidra.program.model.lang.Register import ghidra.program.model.listing.{Function, Instruction, Program} -import ghidra.program.model.pcode.PcodeOp._ +import ghidra.program.model.pcode.PcodeOp.* import ghidra.program.model.pcode.{HighFunction, PcodeOp, PcodeOpAST, Varnode} import ghidra.program.model.scalar.Scalar import io.joern.ghidra2cpg.passes.FunctionPass import io.joern.ghidra2cpg.processors.MipsProcessor -import io.joern.ghidra2cpg.utils.Utils._ +import io.joern.ghidra2cpg.utils.Utils.* import io.joern.ghidra2cpg.Types import io.joern.ghidra2cpg.utils.Decompiler import io.shiftleft.codepropertygraph.generated.Cpg @@ -15,7 +15,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.{CfgNodeNew, NewBlock} import io.shiftleft.codepropertygraph.generated.{EdgeTypes, nodes} import org.slf4j.LoggerFactory -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.language.implicitConversions class MipsFunctionPass( diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/MipsReturnEdgesPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/MipsReturnEdgesPass.scala index 03f63d30fb6a..7637edca44f7 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/MipsReturnEdgesPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/mips/MipsReturnEdgesPass.scala @@ -3,7 +3,7 @@ package io.joern.ghidra2cpg.passes.mips import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.{EdgeTypes, PropertyNames} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.slf4j.{Logger, LoggerFactory} class MipsReturnEdgesPass(cpg: Cpg) extends CpgPass(cpg) { diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/x86/ReturnEdgesPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/x86/ReturnEdgesPass.scala index 956c55cb58e9..42dfc354d787 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/x86/ReturnEdgesPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/x86/ReturnEdgesPass.scala @@ -3,7 +3,7 @@ package io.joern.ghidra2cpg.passes.x86 import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.{EdgeTypes, PropertyNames} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.slf4j.LoggerFactory class ReturnEdgesPass(cpg: Cpg) extends CpgPass(cpg) { diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/x86/X86FunctionPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/x86/X86FunctionPass.scala index c7e5ae1c0134..aff0452836d8 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/x86/X86FunctionPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/x86/X86FunctionPass.scala @@ -4,7 +4,7 @@ import ghidra.program.model.listing.{Function, Program} import io.joern.ghidra2cpg.utils.Decompiler import io.joern.ghidra2cpg.passes.FunctionPass import io.joern.ghidra2cpg.processors.X86Processor -import io.joern.ghidra2cpg.utils.Utils._ +import io.joern.ghidra2cpg.utils.Utils.* import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.{EdgeTypes, nodes} import io.shiftleft.codepropertygraph.generated.nodes.{NewBlock, NewMethod} diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala index ccd8fa695d6a..d24f15f3b5db 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala @@ -2,17 +2,17 @@ package io.joern.ghidra2cpg.utils import ghidra.app.util.template.TemplateSimplifier import ghidra.program.model.listing.{CodeUnitFormat, CodeUnitFormatOptions, Function, Instruction} -import ghidra.program.model.pcode.PcodeOp._ +import ghidra.program.model.pcode.PcodeOp.* import ghidra.program.model.pcode.{HighFunction, PcodeOp, PcodeOpAST, Varnode} import io.joern.ghidra2cpg.Types //import io.joern.ghidra2cpg.utils.Utils.{createCallNode, createIdentifier, createLiteral} -import io.joern.ghidra2cpg.utils.Utils._ +import io.joern.ghidra2cpg.utils.Utils.* import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.CfgNodeNew import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.language.implicitConversions class State(argumentIndex: Int) { var argument: Int = argumentIndex diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/Utils.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/Utils.scala index 5185c815db89..1d9128ba886c 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/Utils.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/Utils.scala @@ -2,11 +2,11 @@ package io.joern.ghidra2cpg.utils import ghidra.program.model.listing.{Function, Instruction, Program} import io.joern.ghidra2cpg.Types -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.NodeTypes import io.shiftleft.proto.cpg.Cpg.DispatchTypes -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.language.implicitConversions object Utils { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/fixtures/DataFlowBinToCpgSuite.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/fixtures/DataFlowBinToCpgSuite.scala index f8b6abfbdf82..a586f3206acd 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/fixtures/DataFlowBinToCpgSuite.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/fixtures/DataFlowBinToCpgSuite.scala @@ -9,12 +9,13 @@ import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.dotextension.ImageViewer import io.shiftleft.semanticcpg.layers.* +import scala.compiletime.uninitialized import scala.sys.process.Process import scala.util.Try class DataFlowBinToCpgSuite extends GhidraBinToCpgSuite { - implicit var context: EngineContext = scala.compiletime.uninitialized + implicit var context: EngineContext = uninitialized override def beforeAll(): Unit = { super.beforeAll() @@ -33,7 +34,7 @@ class DataFlowBinToCpgSuite extends GhidraBinToCpgSuite { new OssDataFlow(options).run(context) } - protected implicit def int2IntegerOption(x: Int): Option[Integer] = + protected implicit def int2IntegerOption(x: Int): Option[Int] = Some(x) protected def getMemberOfType(cpg: Cpg, typeName: String, memberName: String): Iterator[Member] = diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/fixtures/GhidraBinToCpgSuite.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/fixtures/GhidraBinToCpgSuite.scala index 07546bea0205..21d619dcb701 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/fixtures/GhidraBinToCpgSuite.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/fixtures/GhidraBinToCpgSuite.scala @@ -6,8 +6,8 @@ import io.joern.x2cpg.testfixtures.LanguageFrontend import io.shiftleft.utils.ProjectRoot import org.apache.commons.io.FileUtils import io.shiftleft.codepropertygraph.generated.nodes -import io.joern.dataflowengineoss.language._ -import io.shiftleft.semanticcpg.language._ +import io.joern.dataflowengineoss.language.* +import io.shiftleft.semanticcpg.language.* import java.nio.file.Files diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/CallArgumentsTest.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/CallArgumentsTest.scala index f885b944657c..9fc3cf0d22ec 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/CallArgumentsTest.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/CallArgumentsTest.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.mips import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CallArgumentsTest extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/DataFlowTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/DataFlowTests.scala index 99f43aace6f6..dc6babe19dae 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/DataFlowTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/DataFlowTests.scala @@ -1,13 +1,13 @@ package io.joern.ghidra2cpg.querying.mips -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.layers.dataflows.{OssDataFlow, OssDataFlowOptions} import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite import io.joern.x2cpg.X2Cpg.applyDefaultOverlays import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.semanticcpg.language.{ICallResolver, _} -import io.shiftleft.semanticcpg.layers._ +import io.shiftleft.semanticcpg.layers.* class DataFlowTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/DataFlowThroughLoHiRegistersTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/DataFlowThroughLoHiRegistersTests.scala index e0c1b017f17f..1fb218d0ad93 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/DataFlowThroughLoHiRegistersTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/mips/DataFlowThroughLoHiRegistersTests.scala @@ -1,14 +1,14 @@ package io.joern.ghidra2cpg.querying.mips -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.layers.dataflows.{OssDataFlow, OssDataFlowOptions} import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.{Parser, Semantics} import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite import io.joern.x2cpg.X2Cpg.applyDefaultOverlays import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ -import io.shiftleft.semanticcpg.layers._ +import io.shiftleft.semanticcpg.language.* +import io.shiftleft.semanticcpg.layers.* class DataFlowThroughLoHiRegistersTests extends GhidraBinToCpgSuite { override def passes(cpg: Cpg): Unit = { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/CFGTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/CFGTests.scala index 5b9e420a5059..15f43cc1807b 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/CFGTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/CFGTests.scala @@ -2,7 +2,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite import io.shiftleft.codepropertygraph.generated.nodes.Call -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CFGTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/DataFlowTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/DataFlowTests.scala index c0e439760c4f..de5a4ea2f40b 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/DataFlowTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/DataFlowTests.scala @@ -2,14 +2,14 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite import io.shiftleft.codepropertygraph.generated.Cpg -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.layers.dataflows.{OssDataFlow, OssDataFlowOptions} import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.Semantics import io.joern.dataflowengineoss.DefaultSemantics import io.joern.x2cpg.layers.{Base, CallGraph, ControlFlow, TypeRelations} -import io.shiftleft.semanticcpg.language._ -import io.shiftleft.semanticcpg.layers._ +import io.shiftleft.semanticcpg.language.* +import io.shiftleft.semanticcpg.layers.* class DataFlowTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/FileTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/FileTests.scala index 2d77c4520a6c..645b906d5873 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/FileTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/FileTests.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import java.io.File diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/LiteralNodeTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/LiteralNodeTests.scala index 2b10f2019861..f7bab3771104 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/LiteralNodeTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/LiteralNodeTests.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LiteralNodeTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/LocalNodeTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/LocalNodeTests.scala index 009cf922c0fa..1a54bd8a3bc4 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/LocalNodeTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/LocalNodeTests.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LocalNodeTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/MetaDataNodeTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/MetaDataNodeTests.scala index f8b5143c4252..9f141e9ff412 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/MetaDataNodeTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/MetaDataNodeTests.scala @@ -2,7 +2,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite import io.shiftleft.codepropertygraph.generated.Languages -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MetaDataNodeTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/MethodNodeTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/MethodNodeTests.scala index c4c04ce1c827..85f99d1afa53 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/MethodNodeTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/MethodNodeTests.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodNodeTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/NamespaceBlockTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/NamespaceBlockTests.scala index f9341692c73a..abe9dcd5f9db 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/NamespaceBlockTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/NamespaceBlockTests.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.{FileTraversal, NamespaceTraversal} class NamespaceBlockTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/ParameterNodeTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/ParameterNodeTests.scala index 9f2c03f4b1fb..c37d5ac9c4d5 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/ParameterNodeTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/ParameterNodeTests.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ParameterNodeTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/RefNodeTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/RefNodeTests.scala index b3b317abc4f1..2db2de746f84 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/RefNodeTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/RefNodeTests.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class RefNodeTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/ReturnNodeTests.scala b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/ReturnNodeTests.scala index 795b879e4f38..dd564ce01662 100644 --- a/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/ReturnNodeTests.scala +++ b/joern-cli/frontends/ghidra2cpg/src/test/scala/io/joern/ghidra2cpg/querying/x86/ReturnNodeTests.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.querying.x86 import io.joern.ghidra2cpg.fixtures.GhidraBinToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ReturnNodeTests extends GhidraBinToCpgSuite { diff --git a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/GoSrc2Cpg.scala b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/GoSrc2Cpg.scala index efbcaa30af5e..9fa86ed511d4 100644 --- a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/GoSrc2Cpg.scala +++ b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/GoSrc2Cpg.scala @@ -23,30 +23,33 @@ class GoSrc2Cpg(goGlobalOption: Option[GoGlobal] = Option(GoGlobal())) extends X def createCpg(config: Config): Try[Cpg] = { withNewEmptyCpg(config.outputPath, config) { (cpg, config) => File.usingTemporaryDirectory("gosrc2cpgOut") { tmpDir => - goGlobalOption - .orElse(Option(GoGlobal())) - .foreach(goGlobal => { - MetaDataPass(cpg, Languages.GOLANG, config.inputPath).createAndApply() - val astGenResult = new AstGenRunner(config).execute(tmpDir).asInstanceOf[GoAstGenRunnerResult] - goMod = Some( - GoModHelper( - Some(config), - astGenResult.parsedModFile - .flatMap(modFile => GoAstJsonParser.readModFile(Paths.get(modFile)).map(x => x)) + MetaDataPass(cpg, Languages.GOLANG, config.inputPath).createAndApply() + val astGenResults = new AstGenRunner(config).executeForGo(tmpDir) + astGenResults.foreach(astGenResult => { + goGlobalOption + .orElse(Option(GoGlobal())) + .foreach(goGlobal => { + goMod = Some( + GoModHelper( + Some(astGenResult.modulePath), + astGenResult.parsedModFile + .flatMap(modFile => GoAstJsonParser.readModFile(Paths.get(modFile)).map(x => x)) + ) ) - ) - goGlobal.mainModule = goMod.flatMap(modHelper => modHelper.getModMetaData().map(mod => mod.module.name)) - InitialMainSrcPass(cpg, astGenResult.parsedFiles, config, goMod.get, goGlobal, tmpDir).createAndApply() - if goGlobal.pkgLevelVarAndConstantAstMap.size() > 0 then - PackageCtorCreationPass(cpg, config, goGlobal).createAndApply() - if (config.fetchDependencies) { - goGlobal.processingDependencies = true - DownloadDependenciesPass(cpg, goMod.get, goGlobal, config).process() - goGlobal.processingDependencies = false - } - AstCreationPass(cpg, astGenResult.parsedFiles, config, goMod.get, goGlobal, tmpDir, report).createAndApply() - report.print() - }) + goGlobal.mainModule = goMod.flatMap(modHelper => modHelper.getModMetaData().map(mod => mod.module.name)) + InitialMainSrcPass(cpg, astGenResult.parsedFiles, config, goMod.get, goGlobal, tmpDir).createAndApply() + if goGlobal.pkgLevelVarAndConstantAstMap.size() > 0 then + PackageCtorCreationPass(cpg, config, goGlobal).createAndApply() + if (config.fetchDependencies) { + goGlobal.processingDependencies = true + DownloadDependenciesPass(cpg, goMod.get, goGlobal, config).process() + goGlobal.processingDependencies = false + } + AstCreationPass(cpg, astGenResult.parsedFiles, config, goMod.get, goGlobal, tmpDir, report) + .createAndApply() + report.print() + }) + }) } } } diff --git a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/AstCreator.scala index 3fc1aa1d21c8..1d0a90cbdd2a 100644 --- a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/AstCreator.scala @@ -12,7 +12,7 @@ import io.joern.x2cpg.{Ast, AstCreatorBase, ValidationMode} import io.shiftleft.codepropertygraph.generated.nodes.NewNode import io.shiftleft.codepropertygraph.generated.{ModifierTypes, NodeTypes} import org.slf4j.{Logger, LoggerFactory} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import ujson.Value import java.nio.file.Paths diff --git a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/AstForPackageConstructorCreator.scala b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/AstForPackageConstructorCreator.scala index d7c2f7b6a4e5..31b8d03a1732 100644 --- a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/AstForPackageConstructorCreator.scala +++ b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/AstForPackageConstructorCreator.scala @@ -7,7 +7,7 @@ import io.joern.x2cpg.astgen.AstGenNodeBuilder import io.joern.x2cpg.{Ast, AstCreatorBase, ValidationMode, Defines as XDefines} import io.shiftleft.codepropertygraph.generated.NodeTypes import org.apache.commons.lang3.StringUtils -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import ujson.Value import scala.collection.immutable.Set diff --git a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/InitialMainSrcProcessor.scala b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/InitialMainSrcProcessor.scala index 5893116d563a..d56020f92998 100644 --- a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/InitialMainSrcProcessor.scala +++ b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/astcreation/InitialMainSrcProcessor.scala @@ -5,7 +5,7 @@ import io.joern.gosrc2cpg.parser.{ParserKeys, ParserNodeInfo} import io.joern.gosrc2cpg.utils.UtilityConstants.fileSeparateorPattern import io.joern.x2cpg.{Ast, ValidationMode} import io.shiftleft.codepropertygraph.generated.nodes.NewNamespaceBlock -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import ujson.{Arr, Obj, Value} import java.io.File diff --git a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/model/GoMod.scala b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/model/GoMod.scala index 619aa1834231..df2d810c3f6f 100644 --- a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/model/GoMod.scala +++ b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/model/GoMod.scala @@ -1,6 +1,5 @@ package io.joern.gosrc2cpg.model -import io.joern.gosrc2cpg.Config import io.joern.gosrc2cpg.utils.UtilityConstants.fileSeparateorPattern import upickle.default.* @@ -9,11 +8,10 @@ import java.util.Set import java.util.concurrent.ConcurrentSkipListSet import scala.util.control.Breaks.* -class GoModHelper(config: Option[Config] = None, meta: Option[GoMod] = None) { +class GoModHelper(modulePath: Option[String] = None, meta: Option[GoMod] = None) { def getModMetaData(): Option[GoMod] = meta def getNameSpace(compilationUnitFilePath: String, pkg: String): String = { - if (meta.isEmpty || compilationUnitFilePath == null || compilationUnitFilePath.isEmpty) { // When there no go.mod file, we don't have the information about the module prefix // In this case we will use package name as a namespace @@ -29,7 +27,7 @@ class GoModHelper(config: Option[Config] = None, meta: Option[GoMod] = None) { // 1. if there is go file inside /first/second/test.go (package main) => '/first/second/main' // 2. /test.go (package main) => 'main' - val remainingpath = compilationUnitFilePath.stripPrefix(config.get.inputPath) + val remainingpath = compilationUnitFilePath.stripPrefix(modulePath.get) val pathTokens = remainingpath.split(fileSeparateorPattern) val tokens = pathTokens.dropRight(1).filterNot(x => x == null || x.trim.isEmpty) :+ pkg return tokens.mkString("/") @@ -39,7 +37,7 @@ class GoModHelper(config: Option[Config] = None, meta: Option[GoMod] = None) { // go.mod (module jorn.io/trial) and /foo.go (package foo) => jorn.io/trial>foo // go.mod (module jorn.io/trial) and /first/foo.go (package first) => jorn.io/trial/first // go.mod (module jorn.io/trial) and /first/foo.go (package bar) => jorn.io/trial/first - val remainingpath = compilationUnitFilePath.stripPrefix(config.get.inputPath) + val remainingpath = compilationUnitFilePath.stripPrefix(modulePath.get) val pathTokens = remainingpath.split(fileSeparateorPattern) // prefixing module name i.e. jorn.io/trial val tokens = meta.get.module.name +: pathTokens.dropRight(1).filterNot(x => x == null || x.trim.isEmpty) diff --git a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/passes/DownloadDependenciesPass.scala b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/passes/DownloadDependenciesPass.scala index 00b5d2558202..744d42b93185 100644 --- a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/passes/DownloadDependenciesPass.scala +++ b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/passes/DownloadDependenciesPass.scala @@ -83,10 +83,11 @@ class DownloadDependenciesPass(cpg: Cpg, parentGoMod: GoModHelper, goGlobal: GoG .withIgnoredFilesRegex(config.ignoredFilesRegex.toString()) .withIgnoredFiles(config.ignoredFiles.toList) val astGenResult = new AstGenRunner(depConfig, dependency.getIncludePackagesList()) - .execute(astLocation) - .asInstanceOf[GoAstGenRunnerResult] + .executeForGo(astLocation) + .headOption + .getOrElse(GoAstGenRunnerResult()) val goMod = new GoModHelper( - Some(depConfig), + Some(dependencyLocation), astGenResult.parsedModFile.flatMap(modFile => GoAstJsonParser.readModFile(Paths.get(modFile)).map(x => x)) ) DependencySrcProcessorPass(cpg, astGenResult.parsedFiles, depConfig, goMod, goGlobal, astLocation) diff --git a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/utils/AstGenRunner.scala b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/utils/AstGenRunner.scala index 93f06aeea3f7..c7d107ce76cc 100644 --- a/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/utils/AstGenRunner.scala +++ b/joern-cli/frontends/gosrc2cpg/src/main/scala/io/joern/gosrc2cpg/utils/AstGenRunner.scala @@ -10,12 +10,16 @@ import io.joern.x2cpg.utils.Environment.OperatingSystemType.OperatingSystemType import io.joern.x2cpg.utils.{Environment, ExternalCommand} import org.slf4j.LoggerFactory +import java.nio.file.Paths +import scala.collection.mutable.ListBuffer +import scala.jdk.CollectionConverters.* import scala.util.matching.Regex import scala.util.{Failure, Success, Try} object AstGenRunner { private val logger = LoggerFactory.getLogger(getClass) case class GoAstGenRunnerResult( + modulePath: String = "", parsedModFile: Option[String] = None, parsedFiles: List[String] = List.empty, skippedFiles: List[String] = List.empty @@ -76,7 +80,7 @@ class AstGenRunner(config: Config, includeFileRegex: String = "") extends AstGen ExternalCommand.run(s"$astGenCommand $excludeCommand $includeCommand -out ${out.toString()} $in", ".") } - override def execute(out: File): AstGenRunnerResult = { + def executeForGo(out: File): List[GoAstGenRunnerResult] = { implicit val metaData: AstGenProgramMetaData = config.astGenMetaData val in = File(config.inputPath) logger.info(s"Running goastgen in '$config.inputPath' ...") @@ -91,11 +95,108 @@ class AstGenRunner(config: Config, includeFileRegex: String = "") extends AstGen val parsedModFile = filterModFile(srcFiles, out) val parsed = filterFiles(srcFiles, out) val skipped = skippedFiles(in, result.toList) - GoAstGenRunnerResult(parsedModFile.headOption, parsed, skipped) + segregateByModule(config.inputPath, out.toString, parsedModFile, parsed, skipped) case Failure(f) => logger.error("\t- running astgen failed!", f) - GoAstGenRunnerResult() + List() } } + /** Segregate all parsed files including go.mod files under separate modules. This will also segregate modules defined + * inside another module + */ + private def segregateByModule( + inputPath: String, + outPath: String, + parsedModFiles: List[String], + parsedFiles: List[String], + skippedFiles: List[String] + ): List[GoAstGenRunnerResult] = { + val moduleMeta: ModuleMeta = + ModuleMeta(inputPath, outPath, None, ListBuffer[String](), ListBuffer[String](), ListBuffer[ModuleMeta]()) + if (parsedModFiles.size > 0) { + parsedModFiles + .sortBy(_.split(UtilityConstants.fileSeparateorPattern).length) + .foreach(modFile => { + moduleMeta.addModFile(modFile, inputPath, outPath) + }) + parsedFiles.foreach(moduleMeta.addParsedFile) + skippedFiles.foreach(moduleMeta.addSkippedFile) + moduleMeta.getOnlyChilds() + } else { + parsedFiles.foreach(moduleMeta.addParsedFile) + skippedFiles.foreach(moduleMeta.addSkippedFile) + moduleMeta.getAllChilds() + } + } + + private def getParentFolder(path: String): String = { + val parent = Paths.get(path).getParent + if (parent != null) parent.toString else "" + } + + case class ModuleMeta( + modulePath: String, + outputModulePath: String, + modFilePath: Option[String], + parsedFiles: ListBuffer[String], + skippedFiles: ListBuffer[String], + childModules: ListBuffer[ModuleMeta] + ) { + def addModFile(modFile: String, inputPath: String, outPath: String): Unit = { + childModules.collectFirst { + case childMod if modFile.startsWith(childMod.outputModulePath) => + childMod.addModFile(modFile, inputPath, outPath) + } match { + case None => + val outmodpath = getParentFolder(modFile) + childModules.addOne( + ModuleMeta( + outmodpath.replace(outPath, inputPath), + outmodpath, + Some(modFile), + ListBuffer[String](), + ListBuffer[String](), + ListBuffer[ModuleMeta]() + ) + ) + case _ => + } + } + + def addParsedFile(parsedFile: String): Unit = { + childModules.collectFirst { + case childMod if parsedFile.startsWith(childMod.outputModulePath) => + childMod.addParsedFile(parsedFile) + } match { + case None => parsedFiles.addOne(parsedFile) + case _ => + } + } + + def addSkippedFile(skippedFile: String): Unit = { + childModules.collectFirst { + case childMod if skippedFile.startsWith(childMod.outputModulePath) => + childMod.addSkippedFile(skippedFile) + } match { + case None => skippedFiles.addOne(skippedFile) + case _ => + } + } + + def getOnlyChilds(): List[GoAstGenRunnerResult] = { + childModules.flatMap(_.getAllChilds()).toList + } + + def getAllChilds(): List[GoAstGenRunnerResult] = { + getOnlyChilds() ++ List( + GoAstGenRunnerResult( + modulePath = modulePath, + parsedModFile = modFilePath, + parsedFiles = parsedFiles.toList, + skippedFiles = skippedFiles.toList + ) + ) + } + } } diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/ConditionalsDataflowTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/ConditionalsDataflowTests.scala index a0f4fbac6484..6dd2003ef65a 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/ConditionalsDataflowTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/ConditionalsDataflowTests.scala @@ -1,8 +1,8 @@ package io.joern.go2cpg.dataflow import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite class ConditionalsDataflowTests extends GoCodeToCpgSuite(withOssDataflow = true) { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/LoopsDataflowTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/LoopsDataflowTests.scala index ce889f319522..f69b72680ea0 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/LoopsDataflowTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/LoopsDataflowTests.scala @@ -1,8 +1,8 @@ package io.joern.go2cpg.dataflow import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite class LoopsDataflowTests extends GoCodeToCpgSuite(withOssDataflow = true) { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/SwitchDataflowTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/SwitchDataflowTests.scala index ad4d2a22445a..9eb77b9272ba 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/SwitchDataflowTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/SwitchDataflowTests.scala @@ -1,8 +1,8 @@ package io.joern.go2cpg.dataflow import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite class SwitchDataflowTests extends GoCodeToCpgSuite(withOssDataflow = true) { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/TypeDeclConstructorDataflowTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/TypeDeclConstructorDataflowTests.scala index f2829f37f35e..5f79899ff2fe 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/TypeDeclConstructorDataflowTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/dataflow/TypeDeclConstructorDataflowTests.scala @@ -1,8 +1,8 @@ package io.joern.go2cpg.dataflow import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* class TypeDeclConstructorDataflowTests extends GoCodeToCpgSuite(withOssDataflow = true) { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/model/GoModTest.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/model/GoModTest.scala index 960916e97852..6691ab69e1db 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/model/GoModTest.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/model/GoModTest.scala @@ -17,13 +17,12 @@ class GoModTest extends AnyWordSpec with Matchers with BeforeAndAfterAll { namespace shouldBe "main" } "invalid compilation file unit with main pkg" in { - val config = Config() - config.inputPath = File.currentWorkingDirectory.toString() + val inputPath = File.currentWorkingDirectory.toString() val goMod = new GoModHelper( - Some(config), + Some(inputPath), Some( GoMod( - fileFullPath = File(config.inputPath) / "go.mod" pathAsString, + fileFullPath = File(inputPath) / "go.mod" pathAsString, module = GoModModule("joern.io/trial"), dependencies = List[GoModDependency]() ) @@ -37,128 +36,121 @@ class GoModTest extends AnyWordSpec with Matchers with BeforeAndAfterAll { } "with .mod file and main pkg 1 use case" in { - val config = Config() - config.inputPath = File.currentWorkingDirectory.toString() + val inputPath = File.currentWorkingDirectory.toString() val goMod = new GoModHelper( - Some(config), + Some(inputPath), Some( GoMod( - fileFullPath = File(config.inputPath) / "go.mod" pathAsString, + fileFullPath = File(inputPath) / "go.mod" pathAsString, module = GoModModule("joern.io/trial"), dependencies = List[GoModDependency]() ) ) ) val namespace = - goMod.getNameSpace(File(config.inputPath) / "first" / "second" / "test.go" pathAsString, "main") + goMod.getNameSpace(File(inputPath) / "first" / "second" / "test.go" pathAsString, "main") namespace shouldBe "first/second/main" } "with .mod file and main pkg 2 use case" in { - val config = Config() - config.inputPath = File.currentWorkingDirectory.toString() + JFile.separator + val inputPath = File.currentWorkingDirectory.toString() + JFile.separator val goMod = new GoModHelper( - Some(config), + Some(inputPath), Some( GoMod( - fileFullPath = File(config.inputPath) / "go.mod" pathAsString, + fileFullPath = File(inputPath) / "go.mod" pathAsString, module = GoModModule("joern.io/trial"), dependencies = List[GoModDependency]() ) ) ) val namespace = - goMod.getNameSpace(File(config.inputPath) / "first" / "second" / "test.go" pathAsString, "main") + goMod.getNameSpace(File(inputPath) / "first" / "second" / "test.go" pathAsString, "main") namespace shouldBe "first/second/main" } "with .mod file and main pkg 3 use case" in { - val config = Config() - config.inputPath = File.currentWorkingDirectory.toString() + val inputPath = File.currentWorkingDirectory.toString() + JFile.separator val goMod = new GoModHelper( - Some(config), + Some(inputPath), Some( GoMod( - fileFullPath = File(config.inputPath) / "go.mod" pathAsString, + fileFullPath = File(inputPath) / "go.mod" pathAsString, module = GoModModule("joern.io/trial"), dependencies = List[GoModDependency]() ) ) ) val namespace = - goMod.getNameSpace(File(config.inputPath) / "test.go" pathAsString, "main") + goMod.getNameSpace(File(inputPath) / "test.go" pathAsString, "main") namespace shouldBe "main" } "with .mod file and pkg other than main matching with folder" in { - val config = Config() - config.inputPath = File.currentWorkingDirectory.toString() + val inputPath = File.currentWorkingDirectory.toString() + JFile.separator val goMod = new GoModHelper( - Some(config), + Some(inputPath), Some( GoMod( - fileFullPath = File(config.inputPath) / "go.mod" pathAsString, + fileFullPath = File(inputPath) / "go.mod" pathAsString, module = GoModModule("joern.io/trial"), dependencies = List[GoModDependency]() ) ) ) val namespace = - goMod.getNameSpace(File(config.inputPath) / "test.go" pathAsString, "trial") + goMod.getNameSpace(File(inputPath) / "test.go" pathAsString, "trial") namespace shouldBe "joern.io/trial" } "with .mod file, pkg other than main, one level child folder, and package matching with last folder" in { - val config = Config() - config.inputPath = File.currentWorkingDirectory.toString() + val inputPath = File.currentWorkingDirectory.toString() + JFile.separator val goMod = new GoModHelper( - Some(config), + Some(inputPath), Some( GoMod( - fileFullPath = File(config.inputPath) / "go.mod" pathAsString, + fileFullPath = File(inputPath) / "go.mod" pathAsString, module = GoModModule("joern.io/trial"), dependencies = List[GoModDependency]() ) ) ) val namespace = - goMod.getNameSpace(File(config.inputPath) / "first" / "test.go" pathAsString, "first") + goMod.getNameSpace(File(inputPath) / "first" / "test.go" pathAsString, "first") namespace shouldBe "joern.io/trial/first" } "with .mod file and pkg other than main and not matching with folder" in { - val config = Config() - config.inputPath = File.currentWorkingDirectory.toString() + val inputPath = File.currentWorkingDirectory.toString() + JFile.separator val goMod = new GoModHelper( - Some(config), + Some(inputPath), Some( GoMod( - fileFullPath = File(config.inputPath) / "go.mod" pathAsString, + fileFullPath = File(inputPath) / "go.mod" pathAsString, module = GoModModule("joern.io/trial"), dependencies = List[GoModDependency]() ) ) ) val namespace = - goMod.getNameSpace(File(config.inputPath) / "test.go" pathAsString, "foo") + goMod.getNameSpace(File(inputPath) / "test.go" pathAsString, "foo") namespace shouldBe "joern.io/trial" } "with .mod file, pkg other than main, one level child folder, and package not matching with last folder" in { - val config = Config() - config.inputPath = File.currentWorkingDirectory.toString() + val inputPath = File.currentWorkingDirectory.toString() + JFile.separator val goMod = new GoModHelper( - Some(config), + Some(inputPath), Some( GoMod( - fileFullPath = File(config.inputPath) / "go.mod" pathAsString, + fileFullPath = File(inputPath) / "go.mod" pathAsString, module = GoModModule("joern.io/trial"), dependencies = List[GoModDependency]() ) ) ) val namespace = - goMod.getNameSpace(File(config.inputPath) / "first" / "test.go" pathAsString, "bar") + goMod.getNameSpace(File(inputPath) / "first" / "test.go" pathAsString, "bar") namespace shouldBe "joern.io/trial/first" } } diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ConditionalsTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ConditionalsTests.scala index 776c8c5a5142..36183ae1d152 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ConditionalsTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ConditionalsTests.scala @@ -4,8 +4,8 @@ import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.nodes.Call import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, Operators} -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes import scala.collection.immutable.List diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/DeclarationsTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/DeclarationsTests.scala index 0d4deb9b345f..827b7812364e 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/DeclarationsTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/DeclarationsTests.scala @@ -1,8 +1,8 @@ package io.joern.go2cpg.passes.ast import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, Operators} -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ExpressionsTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ExpressionsTests.scala index aff9c3dda63f..50f14e27db6b 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ExpressionsTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ExpressionsTests.scala @@ -3,8 +3,8 @@ package io.joern.go2cpg.passes.ast import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, Operators} -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes class ExpressionsTests extends GoCodeToCpgSuite { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/FileTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/FileTests.scala index f338ba6084aa..357fa250f93f 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/FileTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/FileTests.scala @@ -1,7 +1,7 @@ package io.joern.go2cpg.passes.ast import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal import java.io.File diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ImportTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ImportTests.scala index dbacf6940a4a..571d6632a569 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ImportTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/ImportTests.scala @@ -1,7 +1,7 @@ package io.joern.go2cpg.passes.ast import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ImportTests extends GoCodeToCpgSuite { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MetaDataTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MetaDataTests.scala index 83662d57b493..98370d93b790 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MetaDataTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MetaDataTests.scala @@ -3,7 +3,7 @@ package io.joern.go2cpg.passes.ast import io.joern.x2cpg.layers.{Base, CallGraph, ControlFlow, TypeRelations} import io.shiftleft.codepropertygraph.generated.Languages import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MetaDataTests extends GoCodeToCpgSuite { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MethodCallTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MethodCallTests.scala index ceb574e867ed..56972e8865a6 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MethodCallTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MethodCallTests.scala @@ -7,9 +7,8 @@ import io.shiftleft.codepropertygraph.generated.edges.Ref import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators, nodes} import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.{jIteratortoTraversal, toNodeTraversal} - import java.io.File + class MethodCallTests extends GoCodeToCpgSuite(withOssDataflow = true) { "Simple method call use case" should { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MultiModuleTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MultiModuleTests.scala new file mode 100644 index 000000000000..d3d117a00c4d --- /dev/null +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/MultiModuleTests.scala @@ -0,0 +1,318 @@ +package io.joern.go2cpg.passes.ast + +import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite +import io.shiftleft.semanticcpg.language.* + +import java.io.File +import scala.collection.immutable.List + +class MultiModuleTests extends GoCodeToCpgSuite { + "Module defined under another directory" should { + val cpg = code( + """ + |module joern.io/sample + |go 1.18 + |""".stripMargin, + Seq("module1", "go.mod").mkString(File.separator) + ).moreCode( + """ + |package fpkg + |type Sample struct { + | Name string + |} + |func Woo(a int) int{ + | return 0 + |} + |""".stripMargin, + Seq("module1", "lib", "lib.go").mkString(File.separator) + ).moreCode( + """ + |package main + |import "joern.io/sample/lib" + |func main() { + | var a = fpkg.Woo(10) + | var b = fpkg.Sample{name: "Pandurang"} + | var c = b.Name + | var d fpkg.Sample + |} + |""".stripMargin, + Seq("module1", "main.go").mkString(File.separator) + ) + + "Check METHOD Node" in { + cpg.method("Woo").size shouldBe 1 + val List(x) = cpg.method("Woo").l + x.fullName shouldBe "joern.io/sample/lib.Woo" + x.signature shouldBe "joern.io/sample/lib.Woo(int)int" + } + + "Check CALL Node" in { + val List(x) = cpg.call("Woo").l + x.methodFullName shouldBe "joern.io/sample/lib.Woo" + x.typeFullName shouldBe "int" + } + + "Traversal from call to callee method node" in { + val List(x) = cpg.call("Woo").callee.l + x.fullName shouldBe "joern.io/sample/lib.Woo" + x.isExternal shouldBe false + } + + "Check TypeDecl Node" in { + val List(x) = cpg.typeDecl("Sample").l + x.fullName shouldBe "joern.io/sample/lib.Sample" + } + + "Check LOCAL Nodes" in { + val List(a, b, c, d) = cpg.local.l + a.typeFullName shouldBe "int" + b.typeFullName shouldBe "joern.io/sample/lib.Sample" + c.typeFullName shouldBe "string" + d.typeFullName shouldBe "joern.io/sample/lib.Sample" + } + } + + "Multiple modules defined under one directory" should { + val cpg = code( + """ + |module joern.io/module1 + |go 1.18 + |""".stripMargin, + Seq("module1", "go.mod").mkString(File.separator) + ).moreCode( + """ + |package pkg + |type ModoneSample struct { + | Name string + |} + |func ModoneWoo(a int) int{ + | return 0 + |} + |""".stripMargin, + Seq("module1", "pkg", "lib.go").mkString(File.separator) + ).moreCode( + """ + |package main + |import "joern.io/module1/pkg" + |func main() { + | var a = pkg.ModoneWoo(10) + | var b = pkg.ModoneSample{name: "Pandurang"} + | var c = b.Name + | var d pkg.ModoneSample + |} + |""".stripMargin, + Seq("module1", "main.go").mkString(File.separator) + ).moreCode( + """ + |module joern.io/module2 + |go 1.18 + |""".stripMargin, + Seq("module2", "go.mod").mkString(File.separator) + ).moreCode( + """ + |package pkg + |type ModtwoSample struct { + | Name string + |} + |func ModtwoWoo(a int) int{ + | return 0 + |} + |""".stripMargin, + Seq("module2", "pkg", "lib.go").mkString(File.separator) + ).moreCode( + """ + |package main + |import "joern.io/module2/pkg" + |func main() { + | var a = pkg.ModtwoWoo(10) + | var b = pkg.ModtwoSample{name: "Pandurang"} + | var c = b.Name + | var d pkg.ModtwoSample + |} + |""".stripMargin, + Seq("module2", "main.go").mkString(File.separator) + ) + "Check METHOD Node module 1" in { + cpg.method("ModoneWoo").size shouldBe 1 + val List(x) = cpg.method("ModoneWoo").l + x.fullName shouldBe "joern.io/module1/pkg.ModoneWoo" + x.signature shouldBe "joern.io/module1/pkg.ModoneWoo(int)int" + } + + "Check METHOD Node module 2" in { + cpg.method("ModtwoWoo").size shouldBe 1 + val List(x) = cpg.method("ModtwoWoo").l + x.fullName shouldBe "joern.io/module2/pkg.ModtwoWoo" + x.signature shouldBe "joern.io/module2/pkg.ModtwoWoo(int)int" + } + + "Check CALL Node module 1" in { + val List(x) = cpg.call("ModoneWoo").l + x.methodFullName shouldBe "joern.io/module1/pkg.ModoneWoo" + x.typeFullName shouldBe "int" + } + + "Check CALL Node module 2" in { + val List(x) = cpg.call("ModtwoWoo").l + x.methodFullName shouldBe "joern.io/module2/pkg.ModtwoWoo" + x.typeFullName shouldBe "int" + } + + "Traversal from call to callee method node module 1" in { + val List(x) = cpg.call("ModoneWoo").callee.l + x.fullName shouldBe "joern.io/module1/pkg.ModoneWoo" + x.isExternal shouldBe false + } + + "Traversal from call to callee method node module 2" in { + val List(x) = cpg.call("ModtwoWoo").callee.l + x.fullName shouldBe "joern.io/module2/pkg.ModtwoWoo" + x.isExternal shouldBe false + } + + "Check TypeDecl Node module 1" in { + val List(x) = cpg.typeDecl("ModoneSample").l + x.fullName shouldBe "joern.io/module1/pkg.ModoneSample" + } + + "Check TypeDecl Node module 2" in { + val List(x) = cpg.typeDecl("ModtwoSample").l + x.fullName shouldBe "joern.io/module2/pkg.ModtwoSample" + } + + "Check LOCAL Nodes Module 1 and 2" in { + val List(a, b, c, d, e, f, g, h) = cpg.local.l + a.typeFullName shouldBe "int" + b.typeFullName shouldBe "joern.io/module1/pkg.ModoneSample" + c.typeFullName shouldBe "string" + d.typeFullName shouldBe "joern.io/module1/pkg.ModoneSample" + + e.typeFullName shouldBe "int" + f.typeFullName shouldBe "joern.io/module2/pkg.ModtwoSample" + g.typeFullName shouldBe "string" + h.typeFullName shouldBe "joern.io/module2/pkg.ModtwoSample" + } + } + + "Multiple modules defined one inside another" should { + val cpg = code( + """ + |module joern.io/module1 + |go 1.18 + |""".stripMargin, + Seq("module1", "go.mod").mkString(File.separator) + ).moreCode( + """ + |package pkg + |type ModoneSample struct { + | Name string + |} + |func ModoneWoo(a int) int{ + | return 0 + |} + |""".stripMargin, + Seq("module1", "pkg", "lib.go").mkString(File.separator) + ).moreCode( + """ + |package main + |import "joern.io/module1/pkg" + |func main() { + | var a = pkg.ModoneWoo(10) + | var b = pkg.ModoneSample{name: "Pandurang"} + | var c = b.Name + | var d pkg.ModoneSample + |} + |""".stripMargin, + Seq("module1", "main.go").mkString(File.separator) + ).moreCode( + """ + |module joern.io/module2 + |go 1.18 + |""".stripMargin, + Seq("module1", "stage", "src", "module2", "go.mod").mkString(File.separator) + ).moreCode( + """ + |package pkg + |type ModtwoSample struct { + | Name string + |} + |func ModtwoWoo(a int) int{ + | return 0 + |} + |""".stripMargin, + Seq("module1", "stage", "src", "module2", "pkg", "lib.go").mkString(File.separator) + ).moreCode( + """ + |package main + |import "joern.io/module2/pkg" + |func main() { + | var a = pkg.ModtwoWoo(10) + | var b = pkg.ModtwoSample{name: "Pandurang"} + | var c = b.Name + | var d pkg.ModtwoSample + |} + |""".stripMargin, + Seq("module1", "stage", "src", "module2", "main.go").mkString(File.separator) + ) + "Check METHOD Node module 1" in { + cpg.method("ModoneWoo").size shouldBe 1 + val List(x) = cpg.method("ModoneWoo").l + x.fullName shouldBe "joern.io/module1/pkg.ModoneWoo" + x.signature shouldBe "joern.io/module1/pkg.ModoneWoo(int)int" + } + + "Check METHOD Node module 2" in { + cpg.method("ModtwoWoo").size shouldBe 1 + val List(x) = cpg.method("ModtwoWoo").l + x.fullName shouldBe "joern.io/module2/pkg.ModtwoWoo" + x.signature shouldBe "joern.io/module2/pkg.ModtwoWoo(int)int" + } + + "Check CALL Node module 1" in { + val List(x) = cpg.call("ModoneWoo").l + x.methodFullName shouldBe "joern.io/module1/pkg.ModoneWoo" + x.typeFullName shouldBe "int" + } + + "Check CALL Node module 2" in { + val List(x) = cpg.call("ModtwoWoo").l + x.methodFullName shouldBe "joern.io/module2/pkg.ModtwoWoo" + x.typeFullName shouldBe "int" + } + + "Traversal from call to callee method node module 1" in { + val List(x) = cpg.call("ModoneWoo").callee.l + x.fullName shouldBe "joern.io/module1/pkg.ModoneWoo" + x.isExternal shouldBe false + } + + "Traversal from call to callee method node module 2" in { + val List(x) = cpg.call("ModtwoWoo").callee.l + x.fullName shouldBe "joern.io/module2/pkg.ModtwoWoo" + x.isExternal shouldBe false + } + + "Check TypeDecl Node module 1" in { + val List(x) = cpg.typeDecl("ModoneSample").l + x.fullName shouldBe "joern.io/module1/pkg.ModoneSample" + } + + "Check TypeDecl Node module 2" in { + val List(x) = cpg.typeDecl("ModtwoSample").l + x.fullName shouldBe "joern.io/module2/pkg.ModtwoSample" + } + + "Check LOCAL Nodes Module 1 and 2" in { + val List(a, b, c, d, e, f, g, h) = cpg.local.l + a.typeFullName shouldBe "int" + b.typeFullName shouldBe "joern.io/module2/pkg.ModtwoSample" + c.typeFullName shouldBe "string" + d.typeFullName shouldBe "joern.io/module2/pkg.ModtwoSample" + + e.typeFullName shouldBe "int" + f.typeFullName shouldBe "joern.io/module1/pkg.ModoneSample" + g.typeFullName shouldBe "string" + h.typeFullName shouldBe "joern.io/module1/pkg.ModoneSample" + } + } +} diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/NamespaceBlockTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/NamespaceBlockTests.scala index b9013d929b36..e860d36a142f 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/NamespaceBlockTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/NamespaceBlockTests.scala @@ -1,7 +1,7 @@ package io.joern.go2cpg.passes.ast import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/OperatorsTests.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/OperatorsTests.scala index 21238c36cb69..5b56a56d070c 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/OperatorsTests.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/OperatorsTests.scala @@ -3,7 +3,7 @@ package io.joern.go2cpg.passes.ast import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class OperatorsTests extends GoCodeToCpgSuite { diff --git a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/TypeDeclMembersAndMemberMethodsTest.scala b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/TypeDeclMembersAndMemberMethodsTest.scala index 878af00ed211..34d2bc145379 100644 --- a/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/TypeDeclMembersAndMemberMethodsTest.scala +++ b/joern-cli/frontends/gosrc2cpg/src/test/scala/io/joern/go2cpg/passes/ast/TypeDeclMembersAndMemberMethodsTest.scala @@ -4,8 +4,8 @@ import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.nodes.Call import io.joern.go2cpg.testfixtures.GoCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, Operators} -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes import scala.collection.immutable.List import io.joern.gosrc2cpg.astcreation.Defines diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/AstCreator.scala index 3d661070e83c..c7b5e5a46c59 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/AstCreator.scala @@ -51,7 +51,7 @@ import io.joern.x2cpg.{Ast, AstCreatorBase, AstNodeBuilder, ValidationMode} import io.shiftleft.codepropertygraph.generated.NodeTypes import io.shiftleft.codepropertygraph.generated.nodes.{NewClosureBinding, NewFile, NewImport, NewNamespaceBlock} import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import java.util.concurrent.ConcurrentHashMap import scala.collection.mutable @@ -135,10 +135,10 @@ class AstCreator( .removeOption(new DefaultConfigurationOption(ConfigOption.PRINT_COMMENTS)) .removeOption(new DefaultConfigurationOption(ConfigOption.PRINT_JAVADOC)) - protected def line(node: Node): Option[Int] = node.getBegin.map(x => x.line).toScala - protected def column(node: Node): Option[Int] = node.getBegin.map(x => x.column).toScala - protected def lineEnd(node: Node): Option[Int] = node.getEnd.map(x => x.line).toScala - protected def columnEnd(node: Node): Option[Int] = node.getEnd.map(x => x.column).toScala + protected def line(node: Node): Option[Int] = node.getBegin.map(_.line).toScala + protected def column(node: Node): Option[Int] = node.getBegin.map(_.column).toScala + protected def lineEnd(node: Node): Option[Int] = node.getEnd.map(_.line).toScala + protected def columnEnd(node: Node): Option[Int] = node.getEnd.map(_.column).toScala protected def code(node: Node): String = node.toString(codePrinterOptions) private val lineOffsetTable = OffsetUtils.getLineOffsetTable(fileContent) diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/declarations/AstForMethodsCreator.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/declarations/AstForMethodsCreator.scala index 9352e254b8f8..5fecec488de1 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/declarations/AstForMethodsCreator.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/declarations/AstForMethodsCreator.scala @@ -40,6 +40,7 @@ import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.shiftleft.codepropertygraph.generated.EdgeTypes import com.github.javaparser.ast.Node +import com.github.javaparser.ast.`type`.ClassOrInterfaceType import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserParameterDeclaration import io.joern.javasrc2cpg.astcreation.declarations.AstForMethodsCreator.PartialConstructorDeclaration import io.joern.javasrc2cpg.util.{NameConstants, Util} @@ -59,11 +60,9 @@ private[declarations] trait AstForMethodsCreator { this: AstCreator => val returnTypeFullName = expectedReturnType .flatMap(typeInfoCalc.fullName) .orElse(simpleMethodReturnType.flatMap(scope.lookupType(_))) - .orElse( - tryWithSafeStackOverflow(methodDeclaration.getType.asClassOrInterfaceType).toOption.flatMap(t => - scope.lookupType(t.getNameAsString) - ) - ) + .orElse(tryWithSafeStackOverflow(methodDeclaration.getType).toOption.collect { case t: ClassOrInterfaceType => + scope.lookupType(t.getNameAsString) + }.flatten) .orElse(typeParameters.find(typeParam => simpleMethodReturnType.contains(typeParam.name)).map(_.typeFullName)) scope.pushMethodScope( @@ -464,8 +463,8 @@ private[declarations] trait AstForMethodsCreator { this: AstCreator => } private def constructorReturnNode(constructorDeclaration: ConstructorDeclaration): NewMethodReturn = { - val line = constructorDeclaration.getEnd.map(x => x.line).toScala - val column = constructorDeclaration.getEnd.map(x => x.column).toScala + val line = constructorDeclaration.getEnd.map(_.line).toScala + val column = constructorDeclaration.getEnd.map(_.column).toScala newMethodReturnNode(TypeConstants.Void, None, line, column) } diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/expressions/AstForSimpleExpressionsCreator.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/expressions/AstForSimpleExpressionsCreator.scala index 7982e905e43e..867636fa1e43 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/expressions/AstForSimpleExpressionsCreator.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/expressions/AstForSimpleExpressionsCreator.scala @@ -59,7 +59,11 @@ trait AstForSimpleExpressionsCreator { this: AstCreator => } private[expressions] def astForArrayCreationExpr(expr: ArrayCreationExpr, expectedType: ExpectedType): Ast = { - val maybeInitializerAst = expr.getInitializer.toScala.map(astForArrayInitializerExpr(_, expectedType)) + val elementType = tryWithSafeStackOverflow(expr.getElementType.resolve()).map(elementType => + ExpectedType(typeInfoCalc.fullName(elementType).map(_ ++ "[]"), Option(elementType)) + ) + val maybeInitializerAst = + expr.getInitializer.toScala.map(astForArrayInitializerExpr(_, elementType.getOrElse(expectedType))) maybeInitializerAst.flatMap(_.root) match { case Some(initializerRoot: NewCall) => initializerRoot.code(expr.toString) @@ -84,11 +88,12 @@ trait AstForSimpleExpressionsCreator { this: AstCreator => } private[expressions] def astForArrayInitializerExpr(expr: ArrayInitializerExpr, expectedType: ExpectedType): Ast = { - val typeFullName = - expressionReturnTypeFullName(expr) - .orElse(expectedType.fullName) - .map(typeInfoCalc.registerType) - .getOrElse(TypeConstants.Any) + // In the expression `new int[] { 1, 2 }`, the ArrayInitializerExpr is only the `{ 1, 2 }` part and does not have + // a type itself. We need to use the expected type from the parent expr here. + val typeFullName = expectedType.fullName + .map(typeInfoCalc.registerType) + .getOrElse(TypeConstants.Any) + val callNode = newOperatorCallNode( Operators.arrayInitializer, code = expr.toString, diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/jartypereader/descriptorparser/TokenParser.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/jartypereader/descriptorparser/TokenParser.scala index 2984520ca54c..e053b780a2f0 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/jartypereader/descriptorparser/TokenParser.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/jartypereader/descriptorparser/TokenParser.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.jartypereader.descriptorparser import io.joern.javasrc2cpg.jartypereader.model.PrimitiveType -import io.joern.javasrc2cpg.jartypereader.model.Model.TypeConstants._ +import io.joern.javasrc2cpg.jartypereader.model.Model.TypeConstants.* import org.slf4j.LoggerFactory import scala.util.parsing.combinator.RegexParsers diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/jartypereader/descriptorparser/TypeParser.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/jartypereader/descriptorparser/TypeParser.scala index d1f735573013..6694c27abf3a 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/jartypereader/descriptorparser/TypeParser.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/jartypereader/descriptorparser/TypeParser.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.jartypereader.descriptorparser import io.joern.javasrc2cpg.jartypereader.model.Bound.{BoundAbove, BoundBelow} -import io.joern.javasrc2cpg.jartypereader.model._ +import io.joern.javasrc2cpg.jartypereader.model.* import org.slf4j.LoggerFactory trait TypeParser extends TokenParser { diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/passes/TypeInferencePass.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/passes/TypeInferencePass.scala index 34cd3c42241c..3ebc038b928f 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/passes/TypeInferencePass.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/passes/TypeInferencePass.scala @@ -7,7 +7,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.ModifierTypes import io.shiftleft.codepropertygraph.generated.nodes.{Call, Method} import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.slf4j.LoggerFactory import scala.jdk.OptionConverters.RichOptional diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/JmodClassPath.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/JmodClassPath.scala index e234475e2508..a9891ff5aabf 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/JmodClassPath.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/JmodClassPath.scala @@ -1,10 +1,10 @@ package io.joern.javasrc2cpg.typesolvers import better.files.File -import io.joern.javasrc2cpg.typesolvers.JmodClassPath._ +import io.joern.javasrc2cpg.typesolvers.JmodClassPath.* import javassist.ClassPath -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.util.Try import java.io.InputStream import java.net.URL diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/TypeSizeReducer.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/TypeSizeReducer.scala index 11fa1fdd082f..5e1e0e250267 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/TypeSizeReducer.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/TypeSizeReducer.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.typesolvers import com.github.javaparser.ast.body.TypeDeclaration import com.github.javaparser.ast.stmt.BlockStmt -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* object TypeSizeReducer { def simplifyType(typeDeclaration: TypeDeclaration[?]): Unit = { diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/util/BindingTable.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/util/BindingTable.scala index 27d8c2634036..1e4c3f190960 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/util/BindingTable.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/util/BindingTable.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.util import scala.collection.mutable import io.shiftleft.codepropertygraph.generated.nodes.NewTypeDecl import io.joern.x2cpg.utils.NodeBuilders.newBindingNode -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import io.shiftleft.codepropertygraph.generated.EdgeTypes case class BindingTableEntry(name: String, signature: String, implementingMethodFullName: String) diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/util/Util.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/util/Util.scala index 8bc1e05e920d..9d844758da35 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/util/Util.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/util/Util.scala @@ -2,15 +2,12 @@ package io.joern.javasrc2cpg.util import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration import com.github.javaparser.resolution.types.ResolvedReferenceType -import io.joern.javasrc2cpg.typesolvers.TypeInfoCalculator.TypeConstants -import io.joern.x2cpg.{Ast, Defines} -import io.shiftleft.codepropertygraph.generated.{DispatchTypes, PropertyNames} -import io.shiftleft.codepropertygraph.generated.nodes.{NewCall, NewFieldIdentifier, NewMember} +import io.joern.x2cpg.Defines import org.slf4j.LoggerFactory import scala.collection.mutable import scala.util.{Failure, Success, Try} -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* object Util { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/passes/ConfigFileCreationPassTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/passes/ConfigFileCreationPassTests.scala index 2891f13b3eaa..1c67e821d798 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/passes/ConfigFileCreationPassTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/passes/ConfigFileCreationPassTests.scala @@ -8,7 +8,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.NewMetaData import io.shiftleft.semanticcpg.language.* import io.shiftleft.utils.ProjectRoot import overflowdb.BatchedUpdate -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import java.nio.file.Paths diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ArithmeticOperationsTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ArithmeticOperationsTests.scala index e804e57eee6f..6e33a3755eef 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ArithmeticOperationsTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ArithmeticOperationsTests.scala @@ -5,7 +5,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.Identifier import io.shiftleft.semanticcpg.language.toNodeTypeStarters -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ArithmeticOperationsTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ArrayTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ArrayTests.scala index e1f247b52fd8..1c44df3ef426 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ArrayTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ArrayTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Call, Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ArrayTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/BindingTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/BindingTests.scala index e7904883cec5..153b99d7e4a1 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/BindingTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/BindingTests.scala @@ -1,6 +1,6 @@ package io.joern.javasrc2cpg.querying -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture class BindingTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/BooleanOperationsTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/BooleanOperationsTests.scala index 7ec4357a2891..76e69e381f6c 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/BooleanOperationsTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/BooleanOperationsTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class BooleanOperationsTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CallGraphTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CallGraphTests.scala index c54121618cf8..1c680d2d689b 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CallGraphTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CallGraphTests.scala @@ -2,7 +2,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CallGraphTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CallTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CallTests.scala index 3072ad5574d3..86b4d600d1cd 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CallTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CallTests.scala @@ -6,7 +6,7 @@ import io.shiftleft.codepropertygraph.generated.edges.Ref import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators, nodes} import io.shiftleft.codepropertygraph.generated.nodes.{Call, FieldIdentifier, Identifier, Literal, MethodParameterIn} import io.shiftleft.semanticcpg.language.NoResolve -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import overflowdb.traversal.jIteratortoTraversal import overflowdb.traversal.toNodeTraversal diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CfgTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CfgTests.scala index 5bcf4d6c7fec..9b7e75ec1bd0 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CfgTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/CfgTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CfgTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ClassLoaderTypeTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ClassLoaderTypeTests.scala index 1178f9113a77..303a4a668994 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ClassLoaderTypeTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ClassLoaderTypeTests.scala @@ -2,7 +2,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.Config import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.joern.x2cpg.utils.ExternalCommand class ClassLoaderTypeTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ConditionalTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ConditionalTests.scala index a253b40778a6..b621d8dcd0d9 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ConditionalTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ConditionalTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Call, Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ConditionalTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ConstructorInvocationTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ConstructorInvocationTests.scala index 2c3c5a20b2ab..c6a05511822d 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ConstructorInvocationTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ConstructorInvocationTests.scala @@ -262,20 +262,20 @@ class ConstructorInvocationTests extends JavaSrcCode2CpgFixture { case List(method) => val List(_: Local, assign: Call, init: Call) = method.astChildren.isBlock.astChildren.l: @unchecked - assign.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + assign.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() assign.name shouldBe Operators.assignment val alloc = assign.argument(2).asInstanceOf[Call] alloc.name shouldBe ".alloc" alloc.code shouldBe "new Bar(4, 2)" - alloc.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + alloc.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() alloc.methodFullName shouldBe ".alloc" alloc.typeFullName shouldBe "Bar" alloc.argument.size shouldBe 0 init.name shouldBe io.joern.x2cpg.Defines.ConstructorMethodName init.methodFullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int,int)" - init.callOut.head.fullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int,int)" - init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + init._methodViaCallOut.head.fullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int,int)" + init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() init.typeFullName shouldBe "void" init.signature shouldBe "void(int,int)" init.code shouldBe "new Bar(4, 2)" @@ -303,20 +303,20 @@ class ConstructorInvocationTests extends JavaSrcCode2CpgFixture { case List(method) => val List(assign: Call, init: Call) = method.astChildren.isBlock.astChildren.l: @unchecked - assign.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + assign.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() assign.name shouldBe Operators.assignment val alloc = assign.argument(2).asInstanceOf[Call] alloc.name shouldBe ".alloc" alloc.code shouldBe "new Bar(4, 2)" - alloc.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + alloc.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() alloc.methodFullName shouldBe ".alloc" alloc.typeFullName shouldBe "Bar" alloc.argument.size shouldBe 0 init.name shouldBe io.joern.x2cpg.Defines.ConstructorMethodName init.methodFullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int,int)" - init.callOut.head.fullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int,int)" - init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + init._methodViaCallOut.head.fullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int,int)" + init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() init.typeFullName shouldBe "void" init.signature shouldBe "void(int,int)" init.code shouldBe "new Bar(4, 2)" @@ -362,16 +362,16 @@ class ConstructorInvocationTests extends JavaSrcCode2CpgFixture { alloc.order shouldBe 2 alloc.argumentIndex shouldBe 2 alloc.code shouldBe "new Bar(42)" - alloc.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + alloc.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() alloc.typeFullName shouldBe "Bar" alloc.argument.size shouldBe 0 init.name shouldBe io.joern.x2cpg.Defines.ConstructorMethodName init.methodFullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int)" - init.callOut.head.fullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int)" + init._methodViaCallOut.head.fullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int)" init.signature shouldBe "void(int)" init.code shouldBe "new Bar(42)" - init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() init.argument.size shouldBe 2 val List(obj: Identifier, initArg1: Literal) = init.argument.l: @unchecked @@ -411,16 +411,16 @@ class ConstructorInvocationTests extends JavaSrcCode2CpgFixture { alloc.order shouldBe 2 alloc.argumentIndex shouldBe 2 alloc.code shouldBe "new Bar(42)" - alloc.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + alloc.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() alloc.typeFullName shouldBe "Bar" alloc.argument.size shouldBe 0 init.name shouldBe io.joern.x2cpg.Defines.ConstructorMethodName init.methodFullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int)" - init.callOut.head.fullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int)" + init._methodViaCallOut.head.fullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int)" init.signature shouldBe "void(int)" init.code shouldBe "new Bar(42)" - init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() init.argument.size shouldBe 2 val List(obj: Identifier, initArg1: Literal) = init.argument.l: @unchecked @@ -447,7 +447,7 @@ class ConstructorInvocationTests extends JavaSrcCode2CpgFixture { val List(init: Call) = method.astChildren.isBlock.astChildren.l: @unchecked init.name shouldBe io.joern.x2cpg.Defines.ConstructorMethodName init.methodFullName shouldBe s"Bar.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int)" - init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() init.typeFullName shouldBe "void" init.signature shouldBe "void(int)" @@ -475,7 +475,7 @@ class ConstructorInvocationTests extends JavaSrcCode2CpgFixture { val List(init: Call) = method.astChildren.isBlock.astChildren.l: @unchecked init.name shouldBe io.joern.x2cpg.Defines.ConstructorMethodName init.methodFullName shouldBe s"Foo.${io.joern.x2cpg.Defines.ConstructorMethodName}:void(int)" - init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.toString + init.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH.name() init.typeFullName shouldBe "void" init.signature shouldBe "void(int)" diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ControlStructureTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ControlStructureTests.scala index e1fbe59ce842..c26cd0355f5b 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ControlStructureTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ControlStructureTests.scala @@ -13,10 +13,9 @@ import io.shiftleft.codepropertygraph.generated.nodes.{ Local, Return } -import io.shiftleft.semanticcpg.language._ -import overflowdb.traversal.toNodeTraversal +import io.shiftleft.semanticcpg.language.* -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class NewControlStructureTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala index 84e8ed5e3df6..5130397d3462 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala @@ -2,7 +2,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.Literal -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class EnumTests extends JavaSrcCode2CpgFixture { val cpg = code(""" diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/FileTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/FileTests.scala index bd64f35330a9..728ffbdb36f1 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/FileTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/FileTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import org.scalatest.Ignore diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/GenericsTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/GenericsTests.scala index 609e8789244e..8620f7318b31 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/GenericsTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/GenericsTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class GenericsTests extends JavaSrcCode2CpgFixture { "unresolved generic type declarations" should { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ImportTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ImportTests.scala index 8e01a0910bd9..aa26b95d1eab 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ImportTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ImportTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ImportTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/InferenceJarTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/InferenceJarTests.scala index 1d6b65f6dc97..48d405fdfb17 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/InferenceJarTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/InferenceJarTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.JavaSrc2CpgTestContext import io.joern.javasrc2cpg.typesolvers.TypeInfoCalculator.TypeConstants import io.joern.x2cpg.Defines -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.utils.ProjectRoot import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LiteralTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LiteralTests.scala index ebb4c50a1907..4b95846be327 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LiteralTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LiteralTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import com.github.javaparser.ast.expr.LiteralExpr import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LiteralTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LocalTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LocalTests.scala index 6c2024b75004..7ba4a1df0eae 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LocalTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LocalTests.scala @@ -2,7 +2,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.Local -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LocalTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LombokTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LombokTests.scala index c8697f6fdef9..ca15ffbfe948 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LombokTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/LombokTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.joern.javasrc2cpg.typesolvers.TypeInfoCalculator.TypeConstants import io.joern.x2cpg.Defines -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.joern.javasrc2cpg.Config class LombokTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MemberTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MemberTests.scala index 7ee3291c7607..8e707b219888 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MemberTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MemberTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, ModifierTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.{Call, FieldIdentifier, Identifier, Literal, Member} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class NewMemberTests extends JavaSrcCode2CpgFixture { "locals shadowing members" should { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MetaDataTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MetaDataTests.scala index ea2f134d41fc..2a307d8ef928 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MetaDataTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MetaDataTests.scala @@ -2,7 +2,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Languages -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MetaDataTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodParameterTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodParameterTests.scala index b0149ece816c..5462b381f3b9 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodParameterTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodParameterTests.scala @@ -2,7 +2,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.EvaluationStrategies -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodParameterTests2 extends JavaSrcCode2CpgFixture { "non generic method" should { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodReturnTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodReturnTests.scala index 67f350880208..ba6c505cc449 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodReturnTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodReturnTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.Ignore class MethodReturnTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodTests.scala index 093544e797b5..03213b5d2467 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/MethodTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.io.File diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/NamespaceBlockTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/NamespaceBlockTests.scala index 77fca2f6ef15..b5d45219eb0d 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/NamespaceBlockTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/NamespaceBlockTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class NamespaceBlockTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ScopeTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ScopeTests.scala index 34944d78812c..92ce9102f707 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ScopeTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/ScopeTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Call, FieldIdentifier, Identifier} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ScopeTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/SpecialOperatorTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/SpecialOperatorTests.scala index 9dbf0dfc7380..99a6dd5520d0 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/SpecialOperatorTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/SpecialOperatorTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, TypeRef} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SpecialOperatorTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/SynchronizedTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/SynchronizedTests.scala index 66eeb14c0d67..48b215d300c8 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/SynchronizedTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/SynchronizedTests.scala @@ -11,7 +11,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.{ Modifier, Return } -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SynchronizedTests extends JavaSrcCode2CpgFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeDeclTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeDeclTests.scala index 3d4857c67aca..8e287021afb9 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeDeclTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeDeclTests.scala @@ -3,7 +3,7 @@ package io.joern.javasrc2cpg.querying import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.shiftleft.codepropertygraph.generated.ModifierTypes import io.shiftleft.codepropertygraph.generated.nodes.Return -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import java.io.File diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeInferenceTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeInferenceTests.scala index 5f2562cbd982..ce3a116dd730 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeInferenceTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeInferenceTests.scala @@ -4,7 +4,7 @@ import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.joern.x2cpg.Defines import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.io.File diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeTests.scala index 7ef189482af9..1e37c6ed4139 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/TypeTests.scala @@ -5,7 +5,7 @@ import io.joern.javasrc2cpg.typesolvers.TypeInfoCalculator.TypeConstants import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Call, Identifier} import io.shiftleft.proto.cpg.Cpg.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class NewTypeTests extends JavaSrcCode2CpgFixture { "processing wildcard types should not crash (smoke test)" when { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ArrayTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ArrayTests.scala index 4dc784776b8d..e146937fda67 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ArrayTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ArrayTests.scala @@ -1,9 +1,9 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class ArrayTests extends JavaDataflowFixture { behavior of "Dataflow through arrays" diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/FunctionCallTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/FunctionCallTests.scala index bb3b4b15a230..53a5570b7d6b 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/FunctionCallTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/FunctionCallTests.scala @@ -1,8 +1,8 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.{JavaDataflowFixture, JavaSrcCode2CpgFixture} -import io.joern.dataflowengineoss.language._ -import io.shiftleft.semanticcpg.language._ +import io.joern.dataflowengineoss.language.* +import io.shiftleft.semanticcpg.language.* class NewFunctionCallTests extends JavaSrcCode2CpgFixture(withOssDataflow = true) { "Dataflow through function calls" should { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/IfTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/IfTests.scala index 0a85145fd59f..f5384cab3c8c 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/IfTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/IfTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* class IfTests extends JavaDataflowFixture { behavior of "Dataflow through IF structures" diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/LambdaTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/LambdaTests.scala index 2ae5354391e6..c18f615eedcc 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/LambdaTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/LambdaTests.scala @@ -1,8 +1,8 @@ package io.joern.javasrc2cpg.querying.dataflow -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LambdaTests extends JavaSrcCode2CpgFixture(withOssDataflow = true) { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/LoopTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/LoopTests.scala index 556a263e0588..d664633ca5ef 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/LoopTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/LoopTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* class LoopTests extends JavaDataflowFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/MemberTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/MemberTests.scala index 2d104271385c..76a9cc9d6c2f 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/MemberTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/MemberTests.scala @@ -1,8 +1,8 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.{JavaDataflowFixture, JavaSrcCode2CpgFixture} -import io.joern.dataflowengineoss.language._ -import io.shiftleft.semanticcpg.language._ +import io.joern.dataflowengineoss.language.* +import io.shiftleft.semanticcpg.language.* class MemberTests extends JavaDataflowFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/MethodReturnTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/MethodReturnTests.scala index 1f39c507cbef..e1db74388037 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/MethodReturnTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/MethodReturnTests.scala @@ -1,8 +1,8 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* class MethodReturnTests extends JavaDataflowFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ObjectTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ObjectTests.scala index babcb1667967..0e261e9e7446 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ObjectTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ObjectTests.scala @@ -1,8 +1,8 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.joern.dataflowengineoss.language._ -import io.shiftleft.semanticcpg.language._ +import io.joern.dataflowengineoss.language.* +import io.shiftleft.semanticcpg.language.* class ObjectTests extends JavaDataflowFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/OperatorTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/OperatorTests.scala index 6a463d4e3819..b549f8ce6e50 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/OperatorTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/OperatorTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* class OperatorTests extends JavaDataflowFixture { behavior of "Dataflow through operators" diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ReturnTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ReturnTests.scala index 6125def15d45..d2fd5859aec4 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ReturnTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/ReturnTests.scala @@ -1,8 +1,8 @@ package io.joern.javasrc2cpg.querying.dataflow -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ReturnTests extends JavaDataflowFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/SemanticTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/SemanticTests.scala index 8401b458b68d..f212f592607f 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/SemanticTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/SemanticTests.scala @@ -1,10 +1,10 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.queryengine.{EngineContext, EngineConfig} -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import io.joern.dataflowengineoss.DefaultSemantics import io.joern.dataflowengineoss.semanticsloader.FlowSemantic diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/SwitchTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/SwitchTests.scala index 89131994d336..ba82845d22f1 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/SwitchTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/SwitchTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* class SwitchTests extends JavaDataflowFixture { diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/TryTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/TryTests.scala index 9f205a153558..8939c875e2a3 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/TryTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/dataflow/TryTests.scala @@ -1,7 +1,7 @@ package io.joern.javasrc2cpg.querying.dataflow import io.joern.javasrc2cpg.testfixtures.JavaDataflowFixture -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* class TryTests extends JavaDataflowFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/Main.scala b/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/Main.scala index cc383563ea52..9f57cf44aa4f 100644 --- a/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/Main.scala +++ b/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/Main.scala @@ -1,6 +1,6 @@ package io.joern.jimple2cpg -import io.joern.jimple2cpg.Frontend._ +import io.joern.jimple2cpg.Frontend.* import io.joern.x2cpg.{X2CpgConfig, X2CpgMain} import scopt.OParser diff --git a/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/astcreation/AstCreator.scala index ca9600e2cba9..6f248ffa494b 100644 --- a/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/astcreation/AstCreator.scala @@ -11,7 +11,7 @@ import io.shiftleft.codepropertygraph.generated.* import io.shiftleft.codepropertygraph.generated.nodes.* import org.objectweb.asm.Type import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import soot.jimple.* import soot.tagkit.* import soot.{Unit as SUnit, Local as _, *} diff --git a/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/astcreation/declarations/AstForDeclarationsCreator.scala b/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/astcreation/declarations/AstForDeclarationsCreator.scala index a2af7244d5f3..e9286134bce8 100644 --- a/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/astcreation/declarations/AstForDeclarationsCreator.scala +++ b/joern-cli/frontends/jimple2cpg/src/main/scala/io/joern/jimple2cpg/astcreation/declarations/AstForDeclarationsCreator.scala @@ -11,6 +11,7 @@ import soot.tagkit.* import scala.collection.mutable import scala.collection.mutable.ListBuffer import scala.jdk.CollectionConverters.CollectionHasAsScala + trait AstForDeclarationsCreator(implicit withSchemaValidation: ValidationMode) extends AstForTypeDeclsCreator with AstForMethodsCreator { this: AstCreator => diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/AnnotationTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/AnnotationTests.scala index 11bb1da6a974..dd4e5c7f83fe 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/AnnotationTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/AnnotationTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{Annotation, AnnotationLiteral, ArrayInitializer} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class AnnotationTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ArrayTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ArrayTests.scala index a7ccd178c297..cd97abf470bf 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ArrayTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ArrayTests.scala @@ -4,7 +4,7 @@ import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Call, Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.Failed class ArrayTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/CfgTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/CfgTests.scala index 3dee0d91e31e..57325ce9c37f 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/CfgTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/CfgTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CfgTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/CodeDumperTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/CodeDumperTests.scala index 918b20fe503d..08d772ddac75 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/CodeDumperTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/CodeDumperTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.Config import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CodeDumperTests extends JimpleCode2CpgFixture { private val config = Config().withDisableFileContent(false) diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ConstructorInvocationTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ConstructorInvocationTests.scala index 38ddf83d54c1..9bca4df2876c 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ConstructorInvocationTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ConstructorInvocationTests.scala @@ -3,9 +3,9 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.proto.cpg.Cpg.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* /** These tests are based off of those found in javasrc2cpg but modified to fit to Jimple's 3-address code rule and flat * AST. diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/EnumTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/EnumTests.scala index a1204ba6a8e0..2c5deae1521f 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/EnumTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/EnumTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.Literal -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class EnumTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/FieldAccessTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/FieldAccessTests.scala index 00835ff01fff..233c5a3a65e9 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/FieldAccessTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/FieldAccessTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{Call, FieldIdentifier, Identifier} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class FieldAccessTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/FileTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/FileTests.scala index 39cf829b92c3..b0878237e449 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/FileTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/FileTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import java.io.{File => JFile} diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/IfGotoTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/IfGotoTests.scala index aa5cb73bcd2e..20cc5fe5c232 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/IfGotoTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/IfGotoTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{Call, Unknown} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class IfGotoTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ImplementsInterfaceTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ImplementsInterfaceTests.scala index 0238a83d4225..8a1e81d2fbd0 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ImplementsInterfaceTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ImplementsInterfaceTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import java.io.File diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/InterfaceTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/InterfaceTests.scala index 4426dea1cb6d..e457ecf7108d 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/InterfaceTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/InterfaceTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.ModifierTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.io.File diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/LocalTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/LocalTests.scala index dc9f97880ff4..8762d9b2f9ee 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/LocalTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/LocalTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.Local -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.Ignore class LocalTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MemberTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MemberTests.scala index 903dfeda8669..b86d2a728c6d 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MemberTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MemberTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.Ignore class MemberTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MetaDataTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MetaDataTests.scala index 650fd5eca576..1830f176ce88 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MetaDataTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MetaDataTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MetaDataTests extends JimpleCode2CpgFixture { @@ -19,8 +19,8 @@ class MetaDataTests extends JimpleCode2CpgFixture { "should not have any incoming or outgoing edges" in { cpg.metaData.size shouldBe 1 - cpg.metaData.in().l shouldBe List() - cpg.metaData.out().l shouldBe List() + cpg.metaData.in.l shouldBe List() + cpg.metaData.out.l shouldBe List() } } diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodParameterTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodParameterTests.scala index 005df7e16195..953ee19f0e25 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodParameterTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodParameterTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.EvaluationStrategies -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodParameterTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodReturnTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodReturnTests.scala index 676c2e40ff1a..90394c197098 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodReturnTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodReturnTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodReturnTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodTests.scala index a6f3cbbbede7..fa5284f4b101 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/MethodTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.io.File diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/NamespaceBlockTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/NamespaceBlockTests.scala index 4af8a2ae9956..b2b389bdd073 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/NamespaceBlockTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/NamespaceBlockTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class NamespaceBlockTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ReflectionTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ReflectionTests.scala index d509ea4e5857..5b50d987c98c 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ReflectionTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/ReflectionTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* /** Right now reflection is mostly unsupported. This should be extended in later when it is. */ diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SpecialOperatorTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SpecialOperatorTests.scala index 7797f83427ed..3cb0f35d077e 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SpecialOperatorTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SpecialOperatorTests.scala @@ -4,7 +4,7 @@ import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, TypeRef} import io.shiftleft.proto.cpg.Cpg.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SpecialOperatorTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SwitchTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SwitchTests.scala index 41896808acaf..2214335eb27b 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SwitchTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SwitchTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.JumpTarget -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SwitchTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SynchronizedTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SynchronizedTests.scala index fad58de51c90..ce4481faaee6 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SynchronizedTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/SynchronizedTests.scala @@ -2,8 +2,8 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class SynchronizedTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/TypeDeclTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/TypeDeclTests.scala index 57d46e0f2853..78bf627e2ac4 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/TypeDeclTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/TypeDeclTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.ModifierTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import java.io.File diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/TypeTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/TypeTests.scala index 3dbc9ca13a40..8108fcbef372 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/TypeTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/TypeTests.scala @@ -2,7 +2,7 @@ package io.joern.jimple2cpg.querying import io.joern.jimple2cpg.testfixtures.JimpleCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class TypeTests extends JimpleCode2CpgFixture { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/ArrayTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/ArrayTests.scala index b36a9e75e763..a375017251e0 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/ArrayTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/ArrayTests.scala @@ -1,6 +1,6 @@ package io.joern.jimple2cpg.querying.dataflow -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.jimple2cpg.testfixtures.{JimpleDataFlowCodeToCpgSuite, JimpleDataflowTestCpg} class ArrayTests extends JimpleDataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/FunctionCallTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/FunctionCallTests.scala index 63a49bb0cfaf..942d79905634 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/FunctionCallTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/FunctionCallTests.scala @@ -3,7 +3,7 @@ package io.joern.jimple2cpg.querying.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.jimple2cpg.testfixtures.JimpleDataFlowCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.Operators class FunctionCallTests extends JimpleDataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/SemanticTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/SemanticTests.scala index 2cf966788c4d..e88ec1a145c0 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/SemanticTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/SemanticTests.scala @@ -1,6 +1,6 @@ package io.joern.jimple2cpg.querying.dataflow -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.jimple2cpg.testfixtures.{JimpleDataFlowCodeToCpgSuite, JimpleDataflowTestCpg} import io.joern.dataflowengineoss.semanticsloader.FlowSemantic import io.joern.x2cpg.Defines diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/SwitchTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/SwitchTests.scala index 5949eda27a45..2611292db34a 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/SwitchTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/querying/dataflow/SwitchTests.scala @@ -1,6 +1,6 @@ package io.joern.jimple2cpg.querying.dataflow -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.jimple2cpg.testfixtures.JimpleDataFlowCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.Cpg diff --git a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/unpacking/JarUnpackingTests.scala b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/unpacking/JarUnpackingTests.scala index b36deb4b9189..5f641af9a7b7 100644 --- a/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/unpacking/JarUnpackingTests.scala +++ b/joern-cli/frontends/jimple2cpg/src/test/scala/io/joern/jimple2cpg/unpacking/JarUnpackingTests.scala @@ -12,14 +12,15 @@ import org.scalatest.matchers.should.Matchers.* import org.scalatest.wordspec.AnyWordSpec import java.nio.file.{Files, Path, Paths} +import scala.compiletime.uninitialized import scala.util.{Failure, Success, Try} class JarUnpackingTests extends AnyWordSpec with Matchers with BeforeAndAfterAll { - var recurseCpgs: Map[String, Cpg] = scala.compiletime.uninitialized - var noRecurseCpgs: Map[String, Cpg] = scala.compiletime.uninitialized - var depthsCpgs: Map[String, Cpg] = scala.compiletime.uninitialized - var slippyCpg: Cpg = scala.compiletime.uninitialized + var recurseCpgs: Map[String, Cpg] = uninitialized + var noRecurseCpgs: Map[String, Cpg] = uninitialized + var depthsCpgs: Map[String, Cpg] = uninitialized + var slippyCpg: Cpg = uninitialized override protected def beforeAll(): Unit = { super.beforeAll() diff --git a/joern-cli/frontends/jssrc2cpg/src/main/resources/application.conf b/joern-cli/frontends/jssrc2cpg/src/main/resources/application.conf index caa918ef495a..0dc11de48300 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/resources/application.conf +++ b/joern-cli/frontends/jssrc2cpg/src/main/resources/application.conf @@ -1,3 +1,3 @@ jssrc2cpg { - astgen_version: "3.14.0" + astgen_version: "3.16.0" } diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstCreator.scala index dd6b95bb45c5..b9ef1295c560 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstCreator.scala @@ -18,7 +18,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.NewNode import io.shiftleft.codepropertygraph.generated.nodes.NewTypeDecl import io.shiftleft.codepropertygraph.generated.nodes.NewTypeRef import org.slf4j.{Logger, LoggerFactory} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import ujson.Value import scala.collection.mutable diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForExpressionsCreator.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForExpressionsCreator.scala index 01fe0605917d..851c1657e641 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForExpressionsCreator.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForExpressionsCreator.scala @@ -21,9 +21,8 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { case MemberExpression => code(callee.json("property")) case _ => callee.code } - val callNode = - createStaticCallNode(callExpr.code, callName, fullName, callee.lineNumber, callee.columnNumber) - val argAsts = astForNodes(callExpr.json("arguments").arr.toList) + val callNode = createStaticCallNode(callExpr.code, callName, fullName, callee.lineNumber, callee.columnNumber) + val argAsts = astForNodes(callExpr.json("arguments").arr.toList) callAst(callNode, argAsts) } @@ -114,9 +113,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { diffGraph.addEdge(localAstParentStack.head, localTmpAllocNode, EdgeTypes.AST) scope.addVariableReference(tmpAllocName, tmpAllocNode1) - val allocCallNode = - callNode(newExpr, ".alloc", Operators.alloc, DispatchTypes.STATIC_DISPATCH) - + val allocCallNode = callNode(newExpr, ".alloc", Operators.alloc, DispatchTypes.STATIC_DISPATCH) val assignmentTmpAllocCallNode = createAssignmentCallAst( tmpAllocNode1, @@ -126,12 +123,9 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { newExpr.columnNumber ) - val tmpAllocNode2 = identifierNode(newExpr, tmpAllocName) - - val receiverNode = astForNodeWithFunctionReference(callee) - - val callAst = handleCallNodeArgs(newExpr, receiverNode, tmpAllocNode2, Defines.OperatorsNew) - + val tmpAllocNode2 = identifierNode(newExpr, tmpAllocName) + val receiverNode = astForNodeWithFunctionReference(callee) + val callAst = handleCallNodeArgs(newExpr, receiverNode, tmpAllocNode2, Defines.OperatorsNew) val tmpAllocReturnNode = Ast(identifierNode(newExpr, tmpAllocName)) scope.popScope() @@ -217,31 +211,21 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { astForBinaryExpression(logicalExpr) protected def astForTSNonNullExpression(nonNullExpr: BabelNodeInfo): Ast = { - val op = Operators.notNullAssert - val callNode_ = - callNode(nonNullExpr, nonNullExpr.code, op, DispatchTypes.STATIC_DISPATCH) - val argAsts = List(astForNodeWithFunctionReference(nonNullExpr.json("expression"))) + val op = Operators.notNullAssert + val callNode_ = callNode(nonNullExpr, nonNullExpr.code, op, DispatchTypes.STATIC_DISPATCH) + val argAsts = List(astForNodeWithFunctionReference(nonNullExpr.json("expression"))) callAst(callNode_, argAsts) } protected def astForCastExpression(castExpr: BabelNodeInfo): Ast = { - val op = Operators.cast - val lhsNode = castExpr.json("typeAnnotation") - val rhsAst = astForNodeWithFunctionReference(castExpr.json("expression")) - typeFor(castExpr) match { - case tpe if GlobalBuiltins.builtins.contains(tpe) || Defines.isBuiltinType(tpe) => - val lhsAst = Ast(literalNode(castExpr, code(lhsNode), Option(tpe))) - val node = - callNode(castExpr, castExpr.code, op, DispatchTypes.STATIC_DISPATCH).dynamicTypeHintFullName(Seq(tpe)) - val argAsts = List(lhsAst, rhsAst) - callAst(node, argAsts) - case t => - val possibleTypes = Seq(t) - val lhsAst = Ast(literalNode(castExpr, code(lhsNode), None).possibleTypes(possibleTypes)) - val node = callNode(castExpr, castExpr.code, op, DispatchTypes.STATIC_DISPATCH).possibleTypes(possibleTypes) - val argAsts = List(lhsAst, rhsAst) - callAst(node, argAsts) - } + val op = Operators.cast + val lhsNode = castExpr.json("typeAnnotation") + val rhsAst = astForNodeWithFunctionReference(castExpr.json("expression")) + val possibleTypes = Seq(typeFor(castExpr)) + val lhsAst = Ast(literalNode(castExpr, code(lhsNode), None).possibleTypes(possibleTypes)) + val node = callNode(castExpr, castExpr.code, op, DispatchTypes.STATIC_DISPATCH).possibleTypes(possibleTypes) + val argAsts = List(lhsAst, rhsAst) + callAst(node, argAsts) } protected def astForBinaryExpression(binExpr: BabelNodeInfo): Ast = { @@ -340,8 +324,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { } protected def astForAwaitExpression(awaitExpr: BabelNodeInfo): Ast = { - val node = - callNode(awaitExpr, awaitExpr.code, ".await", DispatchTypes.STATIC_DISPATCH) + val node = callNode(awaitExpr, awaitExpr.code, ".await", DispatchTypes.STATIC_DISPATCH) val argAsts = List(astForNodeWithFunctionReference(awaitExpr.json("argument"))) callAst(node, argAsts) } @@ -417,12 +400,11 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { } def astForTemplateExpression(templateExpr: BabelNodeInfo): Ast = { - val argumentAst = astForNodeWithFunctionReference(templateExpr.json("quasi")) - val callName = code(templateExpr.json("tag")) - val callCode = s"$callName(${codeOf(argumentAst.nodes.head)})" - val templateExprCall = - callNode(templateExpr, callCode, callName, DispatchTypes.STATIC_DISPATCH) - val argAsts = List(argumentAst) + val argumentAst = astForNodeWithFunctionReference(templateExpr.json("quasi")) + val callName = code(templateExpr.json("tag")) + val callCode = s"$callName(${codeOf(argumentAst.nodes.head)})" + val templateExprCall = callNode(templateExpr, callCode, callName, DispatchTypes.STATIC_DISPATCH) + val argAsts = List(argumentAst) callAst(templateExprCall, argAsts) } diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForFunctionsCreator.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForFunctionsCreator.scala index bcaea8374b4c..c357f76de027 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForFunctionsCreator.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForFunctionsCreator.scala @@ -5,7 +5,7 @@ import io.joern.jssrc2cpg.parser.BabelAst.* import io.joern.jssrc2cpg.parser.BabelNodeInfo import io.joern.x2cpg.datastructures.Stack.* import io.joern.x2cpg.frontendspecific.jssrc2cpg.Defines -import io.joern.x2cpg.utils.NodeBuilders.{newBindingNode, newModifierNode} +import io.joern.x2cpg.utils.NodeBuilders.newModifierNode import io.joern.x2cpg.{Ast, ValidationMode} import io.shiftleft.codepropertygraph.generated.nodes.{Identifier as _, *} import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EdgeTypes, EvaluationStrategies, ModifierTypes} @@ -325,10 +325,13 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th } protected def astForTSDeclareFunction(func: BabelNodeInfo): Ast = { - val functionNode = createMethodDefinitionNode(func) - val bindingNode = newBindingNode("", "", "") - diffGraph.addEdge(getParentTypeDecl, bindingNode, EdgeTypes.BINDS) - diffGraph.addEdge(bindingNode, functionNode, EdgeTypes.REF) + val functionNode = createMethodDefinitionNode(func) + val tpe = typeFor(func) + val possibleTypes = Seq(tpe) + val typeFullName = if (Defines.isBuiltinType(tpe)) tpe else Defines.Any + val memberNode_ = memberNode(func, functionNode.name, func.code, typeFullName, Seq(functionNode.fullName)) + .possibleTypes(possibleTypes) + diffGraph.addEdge(getParentTypeDecl, memberNode_, EdgeTypes.AST) addModifier(functionNode, func.json) Ast(functionNode) } diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForTypesCreator.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForTypesCreator.scala index ccb700cf3f0d..20233415203f 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForTypesCreator.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstForTypesCreator.scala @@ -6,9 +6,8 @@ import io.joern.jssrc2cpg.parser.BabelNodeInfo import io.joern.x2cpg.{Ast, ValidationMode} import io.joern.x2cpg.datastructures.Stack.* import io.joern.x2cpg.frontendspecific.jssrc2cpg.Defines -import io.joern.x2cpg.utils.NodeBuilders.newBindingNode import io.shiftleft.codepropertygraph.generated.nodes.* -import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EdgeTypes, ModifierTypes, Operators} +import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EdgeTypes, ModifierTypes, Operators, PropertyNames} import ujson.Value import scala.util.Try @@ -30,7 +29,7 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: } else nameTpe val astParentType = methodAstParentStack.head.label - val astParentFullName = methodAstParentStack.head.properties("FULL_NAME").toString + val astParentFullName = methodAstParentStack.head.properties(PropertyNames.FULL_NAME).toString val aliasTypeDeclNode = typeDeclNode(alias, aliasName, aliasFullName, parserResult.filename, alias.code, astParentType, astParentFullName) @@ -180,18 +179,12 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: val typeFullName = if (Defines.isBuiltinType(tpe)) tpe else Defines.Any val memberNode_ = nodeInfo.node match { case TSDeclareMethod | TSDeclareFunction => - val function = createMethodDefinitionNode(nodeInfo) - val bindingNode = newBindingNode("", "", "") - diffGraph.addEdge(typeDeclNode, bindingNode, EdgeTypes.BINDS) - diffGraph.addEdge(bindingNode, function, EdgeTypes.REF) + val function = createMethodDefinitionNode(nodeInfo) addModifier(function, nodeInfo.json) memberNode(nodeInfo, function.name, nodeInfo.code, typeFullName, Seq(function.fullName)) .possibleTypes(possibleTypes) case ClassMethod | ClassPrivateMethod => - val function = createMethodAstAndNode(nodeInfo).methodNode - val bindingNode = newBindingNode("", "", "") - diffGraph.addEdge(typeDeclNode, bindingNode, EdgeTypes.BINDS) - diffGraph.addEdge(bindingNode, function, EdgeTypes.REF) + val function = createMethodAstAndNode(nodeInfo).methodNode addModifier(function, nodeInfo.json) memberNode(nodeInfo, function.name, nodeInfo.code, typeFullName, Seq(function.fullName)) .possibleTypes(possibleTypes) @@ -237,7 +230,7 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: registerType(typeFullName) val astParentType = methodAstParentStack.head.label - val astParentFullName = methodAstParentStack.head.properties("FULL_NAME").toString + val astParentFullName = methodAstParentStack.head.properties(PropertyNames.FULL_NAME).toString val typeDeclNode_ = typeDeclNode( tsEnum, @@ -319,7 +312,7 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: registerType(typeFullName) val astParentType = methodAstParentStack.head.label - val astParentFullName = methodAstParentStack.head.properties("FULL_NAME").toString + val astParentFullName = methodAstParentStack.head.properties(PropertyNames.FULL_NAME).toString val superClass = Try(createBabelNodeInfo(clazz.json("superClass")).code).toOption.toSeq val implements = Try(clazz.json("implements").arr.map(createBabelNodeInfo(_).code)).toOption.toSeq.flatten @@ -474,7 +467,7 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: registerType(typeFullName) val astParentType = methodAstParentStack.head.label - val astParentFullName = methodAstParentStack.head.properties("FULL_NAME").toString + val astParentFullName = methodAstParentStack.head.properties(PropertyNames.FULL_NAME).toString val extendz = Try(tsInterface.json("extends").arr.map(createBabelNodeInfo(_).code)).toOption.toSeq.flatten @@ -500,9 +493,9 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: val constructorNode = interfaceConstructor(typeName, tsInterface) diffGraph.addEdge(constructorNode, NewModifier().modifierType(ModifierTypes.CONSTRUCTOR), EdgeTypes.AST) - val constructorBindingNode = newBindingNode("", "", "") - diffGraph.addEdge(typeDeclNode_, constructorBindingNode, EdgeTypes.BINDS) - diffGraph.addEdge(constructorBindingNode, constructorNode, EdgeTypes.REF) + val memberNode_ = + memberNode(tsInterface, constructorNode.name, constructorNode.code, typeFullName, Seq(constructorNode.fullName)) + diffGraph.addEdge(typeDeclNode_, memberNode_, EdgeTypes.AST) val interfaceBodyElements = classMembers(tsInterface, withConstructor = false) @@ -514,9 +507,6 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: val memberNodes = nodeInfo.node match { case TSCallSignatureDeclaration | TSMethodSignature => val functionNode = createMethodDefinitionNode(nodeInfo) - val bindingNode = newBindingNode("", "", "") - diffGraph.addEdge(typeDeclNode_, bindingNode, EdgeTypes.BINDS) - diffGraph.addEdge(bindingNode, functionNode, EdgeTypes.REF) addModifier(functionNode, nodeInfo.json) Seq( memberNode(nodeInfo, functionNode.name, nodeInfo.code, typeFullName, Seq(functionNode.fullName)) diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstNodeBuilder.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstNodeBuilder.scala index 2ef960276b6a..2c6ccdb5dc6c 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstNodeBuilder.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/AstNodeBuilder.scala @@ -6,8 +6,7 @@ import io.joern.x2cpg.{Ast, ValidationMode} import io.joern.x2cpg.frontendspecific.jssrc2cpg.Defines import io.joern.x2cpg.utils.NodeBuilders.newMethodReturnNode import io.shiftleft.codepropertygraph.generated.nodes.* -import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.codepropertygraph.generated.Operators +import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators, PropertyNames} trait AstNodeBuilder(implicit withSchemaValidation: ValidationMode) { this: AstCreator => protected def createMethodReturnNode(func: BabelNodeInfo): NewMethodReturn = { @@ -251,7 +250,7 @@ trait AstNodeBuilder(implicit withSchemaValidation: ValidationMode) { this: AstC registerType(methodFullName) val astParentType = parentNode.label - val astParentFullName = parentNode.properties("FULL_NAME").toString + val astParentFullName = parentNode.properties(PropertyNames.FULL_NAME).toString val functionTypeDeclNode = typeDeclNode( node, diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/TypeHelper.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/TypeHelper.scala index 744fde0d8a05..726106fa22ad 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/TypeHelper.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/astcreation/TypeHelper.scala @@ -1,6 +1,6 @@ package io.joern.jssrc2cpg.astcreation -import io.joern.jssrc2cpg.parser.BabelAst._ +import io.joern.jssrc2cpg.parser.BabelAst.* import io.joern.jssrc2cpg.parser.BabelNodeInfo import io.joern.x2cpg.frontendspecific.jssrc2cpg.Defines diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/parser/BabelAst.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/parser/BabelAst.scala index 2513121ab491..cae2a0ef5705 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/parser/BabelAst.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/parser/BabelAst.scala @@ -206,6 +206,7 @@ object BabelAst { object TSIndexSignature extends BabelNode object TSIndexedAccessType extends TSType object TSInferType extends TSType + object TSInstantiationExpression extends Expression object TSInterfaceBody extends BabelNode object TSInterfaceDeclaration extends BabelNode object TSIntersectionType extends TSType diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/passes/AstCreationPass.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/passes/AstCreationPass.scala index f9664be8c0c4..ad57e246e711 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/passes/AstCreationPass.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/passes/AstCreationPass.scala @@ -15,7 +15,7 @@ import org.slf4j.{Logger, LoggerFactory} import java.nio.file.Paths import scala.util.{Failure, Success, Try} -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class AstCreationPass(cpg: Cpg, astGenRunnerResult: AstGenRunnerResult, config: Config, report: Report = new Report())( implicit withSchemaValidation: ValidationMode diff --git a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/passes/ImportsPass.scala b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/passes/ImportsPass.scala index a3aa62569e84..2ce72c78ef45 100644 --- a/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/passes/ImportsPass.scala +++ b/joern-cli/frontends/jssrc2cpg/src/main/scala/io/joern/jssrc2cpg/passes/ImportsPass.scala @@ -4,7 +4,7 @@ import io.joern.x2cpg.X2Cpg import io.joern.x2cpg.passes.frontend.XImportsPass import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.Call -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.Assignment /** This pass creates `IMPORT` nodes by looking for calls to `require`. `IMPORT` nodes are linked to existing dependency diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/dataflow/DataflowTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/dataflow/DataflowTests.scala index 24fde502b8a4..0de84f2d723a 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/dataflow/DataflowTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/dataflow/DataflowTests.scala @@ -1,11 +1,11 @@ package io.joern.jssrc2cpg.dataflow -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.jssrc2cpg.testfixtures.DataFlowCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.CfgNode -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DataflowTests extends DataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/io/CodeDumperFromFileTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/io/CodeDumperFromFileTests.scala index 9c27a157a302..ede0ff1342a9 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/io/CodeDumperFromFileTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/io/CodeDumperFromFileTests.scala @@ -3,7 +3,7 @@ package io.joern.jssrc2cpg.io import better.files.File import io.joern.jssrc2cpg.testfixtures.JsSrc2CpgSuite import io.shiftleft.semanticcpg.codedumper.CodeDumper -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.util.regex.Pattern diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/CallLinkerPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/CallLinkerPassTests.scala index 0e31d1703470..1f6d34a4f8ef 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/CallLinkerPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/CallLinkerPassTests.scala @@ -3,7 +3,7 @@ package io.joern.jssrc2cpg.passes import io.joern.jssrc2cpg.testfixtures.DataFlowCodeToCpgSuite import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.Identifier -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CallLinkerPassTests extends DataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ConfigPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ConfigPassTests.scala index 87a0e66dad5e..3d2f165406e6 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ConfigPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ConfigPassTests.scala @@ -4,7 +4,7 @@ import better.files.File import io.joern.jssrc2cpg.Config import io.joern.x2cpg.frontendspecific.jssrc2cpg.Defines import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ConstClosurePassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ConstClosurePassTests.scala index 6abed767948d..f1acaba369fa 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ConstClosurePassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ConstClosurePassTests.scala @@ -1,7 +1,7 @@ package io.joern.jssrc2cpg.passes import io.joern.jssrc2cpg.testfixtures.DataFlowCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ConstClosurePassTests extends DataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/DomPassTestsHelper.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/DomPassTestsHelper.scala index dc9ac7cc858c..98433e4d23ef 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/DomPassTestsHelper.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/DomPassTestsHelper.scala @@ -3,7 +3,7 @@ package io.joern.jssrc2cpg.passes import io.shiftleft.codepropertygraph.generated.nodes.Expression import io.shiftleft.codepropertygraph.generated.nodes.TemplateDom import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.apache.commons.lang3.StringUtils trait DomPassTestsHelper { diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/InheritanceFullNamePassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/InheritanceFullNamePassTests.scala index cfccc1632b34..f580bf8cb688 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/InheritanceFullNamePassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/InheritanceFullNamePassTests.scala @@ -1,7 +1,7 @@ package io.joern.jssrc2cpg.passes import io.joern.jssrc2cpg.testfixtures.DataFlowCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.io.File import scala.annotation.nowarn diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/RequirePassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/RequirePassTests.scala index 672a73ca0f65..b354a9942b94 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/RequirePassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/RequirePassTests.scala @@ -1,8 +1,8 @@ package io.joern.jssrc2cpg.passes -import io.joern.dataflowengineoss.language._ +import io.joern.dataflowengineoss.language.* import io.joern.jssrc2cpg.testfixtures.DataFlowCodeToCpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.io.File diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/DependencyAstCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/DependencyAstCreationPassTests.scala index daa810ae9689..a581f7f76162 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/DependencyAstCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/DependencyAstCreationPassTests.scala @@ -3,7 +3,7 @@ package io.joern.jssrc2cpg.passes.ast import io.joern.jssrc2cpg.testfixtures.AstJsSrc2CpgSuite import io.joern.x2cpg.layers.Base import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DependencyAstCreationPassTests extends AstJsSrc2CpgSuite { diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/MixedAstCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/MixedAstCreationPassTests.scala index be5e156a9e4b..c582fa0879f3 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/MixedAstCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/MixedAstCreationPassTests.scala @@ -5,7 +5,7 @@ import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.shiftleft.codepropertygraph.generated.EvaluationStrategies import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.MethodParameterIn -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MixedAstCreationPassTests extends AstJsSrc2CpgSuite { diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsAstCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsAstCreationPassTests.scala index 71144ce1141b..33c2d5209640 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsAstCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsAstCreationPassTests.scala @@ -108,8 +108,7 @@ class TsAstCreationPassTests extends AstJsSrc2CpgSuite(".ts") { arg.typeFullName shouldBe Defines.String arg.code shouldBe "arg: string" arg.index shouldBe 1 - val List(parentTypeDecl) = cpg.typeDecl.name(":program").l - parentTypeDecl.bindsOut.flatMap(_.refOut).l should contain(func) + cpg.method("foo").bindingTypeDecl.fullName.l shouldBe List("Test0.ts::program:foo") } "have correct structure for type assertion" in { diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsClassesAstCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsClassesAstCreationPassTests.scala index fed85c602569..43d24af28886 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsClassesAstCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsClassesAstCreationPassTests.scala @@ -191,7 +191,10 @@ class TsClassesAstCreationPassTests extends AstJsSrc2CpgSuite(".ts") { greeter.fullName shouldBe "Test0.ts::program:Greeter" greeter.filename shouldBe "Test0.ts" greeter.file.name.head shouldBe "Test0.ts" - inside(cpg.typeDecl("Greeter").member.l) { case List(greeting, name, propName, foo, anon, toString) => + inside(cpg.typeDecl("Greeter").member.l) { case List(init, greeting, name, propName, foo, anon, toString) => + init.name shouldBe "" + init.typeFullName shouldBe "Test0.ts::program:Greeter" + init.dynamicTypeHintFullName shouldBe List("Test0.ts::program:Greeter:") greeting.name shouldBe "greeting" greeting.code shouldBe "greeting: string;" name.name shouldBe "name" @@ -339,7 +342,7 @@ class TsClassesAstCreationPassTests extends AstJsSrc2CpgSuite(".ts") { val List(credentialsParam) = cpg.parameter.nameExact("credentials").l credentialsParam.typeFullName shouldBe "Test0.ts::program:Test:run:0" // should not produce dangling nodes that are meant to be inside procedures - cpg.all.collectAll[CfgNode].whereNot(_._astIn).size shouldBe 0 + cpg.all.collectAll[CfgNode].whereNot(_.astParent).size shouldBe 0 cpg.identifier.count(_.refsTo.size > 1) shouldBe 0 cpg.identifier.whereNot(_.refsTo).size shouldBe 0 // should not produce assignment calls directly under typedecls @@ -359,7 +362,7 @@ class TsClassesAstCreationPassTests extends AstJsSrc2CpgSuite(".ts") { val List(credentialsParam) = cpg.parameter.nameExact("param1_0").l credentialsParam.typeFullName shouldBe "Test0.ts::program:apiCall:0" // should not produce dangling nodes that are meant to be inside procedures - cpg.all.collectAll[CfgNode].whereNot(_._astIn).size shouldBe 0 + cpg.all.collectAll[CfgNode].whereNot(_.astParent).size shouldBe 0 cpg.identifier.count(_.refsTo.size > 1) shouldBe 0 cpg.identifier.whereNot(_.refsTo).size shouldBe 0 // should not produce assignment calls directly under typedecls diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsDecoratorAstCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsDecoratorAstCreationPassTests.scala index c15f2dc879ae..38bd7b036a5c 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsDecoratorAstCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/ast/TsDecoratorAstCreationPassTests.scala @@ -1,8 +1,7 @@ package io.joern.jssrc2cpg.passes.ast import io.joern.jssrc2cpg.testfixtures.AstJsSrc2CpgSuite -import io.joern.x2cpg.frontendspecific.jssrc2cpg.Defines -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class TsDecoratorAstCreationPassTests extends AstJsSrc2CpgSuite(".ts") { @@ -324,308 +323,6 @@ class TsDecoratorAstCreationPassTests extends AstJsSrc2CpgSuite(".ts") { annotationD.parameterAssign.l shouldBe empty } } - - "create methods for const exports" in { - val cpg = code("export const getApiA = (req: Request) => { const user = req.user as UserDocument; }") - cpg.method.name.sorted.l shouldBe List(":program", "0") - cpg.assignment.code.l shouldBe List( - "const user = req.user as UserDocument", - "const getApiA = (req: Request) => { const user = req.user as UserDocument; }", - "exports.getApiA = getApiA" - ) - inside(cpg.method.name("0").l) { case List(anon) => - anon.fullName shouldBe "Test0.ts::program:0" - anon.ast.isIdentifier.name.l shouldBe List("user", "req") - } - } - - "have correct structure for import assignments" in { - val cpg = code(""" - |import fs = require('fs'); - |import models = require('../models/index'); - |""".stripMargin) - cpg.assignment.code.l shouldBe List("var fs = require(\"fs\")", "var models = require(\"../models/index\")") - cpg.local.code.l shouldBe List("fs", "models") - val List(fsDep, modelsDep) = cpg.dependency.l - fsDep.name shouldBe "fs" - fsDep.dependencyGroupId shouldBe Option("fs") - modelsDep.name shouldBe "models" - modelsDep.dependencyGroupId shouldBe Option("../models/index") - - val List(fs, models) = cpg.imports.l - fs.code shouldBe "import fs = require('fs')" - fs.importedEntity shouldBe Option("fs") - fs.importedAs shouldBe Option("fs") - models.code shouldBe "import models = require('../models/index')" - models.importedEntity shouldBe Option("../models/index") - models.importedAs shouldBe Option("models") - } - - "have correct structure for declared functions" in { - val cpg = code("declare function foo(arg: string): string") - val List(func) = cpg.method("foo").l - func.code shouldBe "declare function foo(arg: string): string" - func.name shouldBe "foo" - func.fullName shouldBe "Test0.ts::program:foo" - val List(_, arg) = cpg.method("foo").parameter.l - arg.name shouldBe "arg" - arg.typeFullName shouldBe Defines.String - arg.code shouldBe "arg: string" - arg.index shouldBe 1 - val List(parentTypeDecl) = cpg.typeDecl.name(":program").l - parentTypeDecl.bindsOut.flatMap(_.refOut).l should contain(func) - } - - } - - "AST generation for TS enums" should { - - "have correct structure for simple enum" in { - val cpg = code(""" - |enum Direction { - | Up = 1, - | Down, - | Left, - | Right, - |} - |""".stripMargin) - inside(cpg.typeDecl("Direction").l) { case List(direction) => - direction.name shouldBe "Direction" - direction.code shouldBe "enum Direction" - direction.fullName shouldBe "Test0.ts::program:Direction" - direction.filename shouldBe "Test0.ts" - direction.file.name.head shouldBe "Test0.ts" - inside(direction.method.name(io.joern.x2cpg.Defines.StaticInitMethodName).l) { case List(init) => - init.block.astChildren.isCall.code.head shouldBe "Up = 1" - } - inside(cpg.typeDecl("Direction").member.l) { case List(up, down, left, right) => - up.name shouldBe "Up" - up.code shouldBe "Up = 1" - down.name shouldBe "Down" - down.code shouldBe "Down" - left.name shouldBe "Left" - left.code shouldBe "Left" - right.name shouldBe "Right" - right.code shouldBe "Right" - } - } - } - - } - - "AST generation for TS classes" should { - - "have correct structure for simple classes" in { - val cpg = code(""" - |class Greeter { - | greeting: string; - | greet() { - | return "Hello, " + this.greeting; - | } - |} - |""".stripMargin) - inside(cpg.typeDecl("Greeter").l) { case List(greeter) => - greeter.name shouldBe "Greeter" - greeter.code shouldBe "class Greeter" - greeter.fullName shouldBe "Test0.ts::program:Greeter" - greeter.filename shouldBe "Test0.ts" - greeter.file.name.head shouldBe "Test0.ts" - val constructor = greeter.method.nameExact(io.joern.x2cpg.Defines.ConstructorMethodName).head - greeter.method.isConstructor.head shouldBe constructor - constructor.fullName shouldBe s"Test0.ts::program:Greeter:${io.joern.x2cpg.Defines.ConstructorMethodName}" - inside(cpg.typeDecl("Greeter").member.l) { case List(greeting, greet) => - greeting.name shouldBe "greeting" - greeting.code shouldBe "greeting: string;" - greet.name shouldBe "greet" - greet.dynamicTypeHintFullName shouldBe Seq("Test0.ts::program:Greeter:greet") - } - } - } - - "have correct structure for declared classes with empty constructor" in { - val cpg = code(""" - |declare class Greeter { - | greeting: string; - | constructor(arg: string); - |} - |""".stripMargin) - inside(cpg.typeDecl("Greeter").l) { case List(greeter) => - greeter.name shouldBe "Greeter" - greeter.code shouldBe "class Greeter" - greeter.fullName shouldBe "Test0.ts::program:Greeter" - greeter.filename shouldBe "Test0.ts" - greeter.file.name.head shouldBe "Test0.ts" - val constructor = greeter.method.nameExact(io.joern.x2cpg.Defines.ConstructorMethodName).head - constructor.fullName shouldBe s"Test0.ts::program:Greeter:${io.joern.x2cpg.Defines.ConstructorMethodName}" - greeter.method.isConstructor.head shouldBe constructor - inside(cpg.typeDecl("Greeter").member.l) { case List(greeting) => - greeting.name shouldBe "greeting" - greeting.code shouldBe "greeting: string;" - } - } - } - - "have correct modifier" in { - val cpg = code(""" - |abstract class Greeter { - | static a: string; - | private b: string; - | public c: string; - | protected d: string; - | #e: string; // also private - |} - |""".stripMargin) - inside(cpg.typeDecl.name("Greeter.*").l) { case List(greeter) => - greeter.name shouldBe "Greeter" - cpg.typeDecl.isAbstract.head shouldBe greeter - greeter.member.isStatic.head shouldBe greeter.member.name("a").head - greeter.member.isPrivate.l shouldBe greeter.member.name("b", "e").l - greeter.member.isPublic.head shouldBe greeter.member.name("c").head - greeter.member.isProtected.head shouldBe greeter.member.name("d").head - } - } - - "have correct structure for empty interfaces" in { - val cpg = code(""" - |interface A {}; - |interface B {}; - |""".stripMargin) - cpg.method.fullName.sorted.l shouldBe List( - "Test0.ts::program", - s"Test0.ts::program:A:${io.joern.x2cpg.Defines.ConstructorMethodName}", - s"Test0.ts::program:B:${io.joern.x2cpg.Defines.ConstructorMethodName}" - ) - } - - "have correct structure for simple interfaces" in { - val cpg = code(""" - |interface Greeter { - | greeting: string; - | name?: string; - | [propName: string]: any; - | "foo": string; - | (source: string, subString: string): boolean; - |} - |""".stripMargin) - inside(cpg.typeDecl("Greeter").l) { case List(greeter) => - greeter.name shouldBe "Greeter" - greeter.code shouldBe "interface Greeter" - greeter.fullName shouldBe "Test0.ts::program:Greeter" - greeter.filename shouldBe "Test0.ts" - greeter.file.name.head shouldBe "Test0.ts" - inside(cpg.typeDecl("Greeter").member.l) { case List(greeting, name, propName, foo, anon) => - greeting.name shouldBe "greeting" - greeting.code shouldBe "greeting: string;" - name.name shouldBe "name" - name.code shouldBe "name?: string;" - propName.name shouldBe "propName" - propName.code shouldBe "[propName: string]: any;" - foo.name shouldBe "foo" - foo.code shouldBe "\"foo\": string;" - anon.name shouldBe "0" - anon.dynamicTypeHintFullName shouldBe Seq("Test0.ts::program:Greeter:0") - anon.code shouldBe "(source: string, subString: string): boolean;" - } - inside(cpg.typeDecl("Greeter").method.l) { case List(constructor, anon) => - constructor.name shouldBe io.joern.x2cpg.Defines.ConstructorMethodName - constructor.fullName shouldBe s"Test0.ts::program:Greeter:${io.joern.x2cpg.Defines.ConstructorMethodName}" - constructor.code shouldBe "new: Greeter" - greeter.method.isConstructor.head shouldBe constructor - anon.name shouldBe "0" - anon.fullName shouldBe "Test0.ts::program:Greeter:0" - anon.code shouldBe "(source: string, subString: string): boolean;" - anon.parameter.name.l shouldBe List("this", "source", "subString") - anon.parameter.code.l shouldBe List("this", "source: string", "subString: string") - } - } - } - - "have correct structure for interface constructor" in { - val cpg = code(""" - |interface Greeter { - | new (param: string) : Greeter - |} - |""".stripMargin) - inside(cpg.typeDecl("Greeter").l) { case List(greeter) => - greeter.name shouldBe "Greeter" - greeter.code shouldBe "interface Greeter" - greeter.fullName shouldBe "Test0.ts::program:Greeter" - greeter.filename shouldBe "Test0.ts" - greeter.file.name.head shouldBe "Test0.ts" - inside(cpg.typeDecl("Greeter").method.l) { case List(constructor) => - constructor.name shouldBe io.joern.x2cpg.Defines.ConstructorMethodName - constructor.fullName shouldBe s"Test0.ts::program:Greeter:${io.joern.x2cpg.Defines.ConstructorMethodName}" - constructor.code shouldBe "new (param: string) : Greeter" - constructor.parameter.name.l shouldBe List("this", "param") - constructor.parameter.code.l shouldBe List("this", "param: string") - greeter.method.isConstructor.head shouldBe constructor - } - } - } - - "have correct structure for simple namespace" in { - val cpg = code(""" - |namespace A { - | class Foo {}; - |} - |""".stripMargin) - inside(cpg.namespaceBlock("A").l) { case List(namespaceA) => - namespaceA.code should startWith("namespace A") - namespaceA.fullName shouldBe "Test0.ts::program:A" - namespaceA.typeDecl.name("Foo").head.fullName shouldBe "Test0.ts::program:A:Foo" - } - } - - "have correct structure for nested namespaces" in { - val cpg = code(""" - |namespace A { - | namespace B { - | namespace C { - | class Foo {}; - | } - | } - |} - |""".stripMargin) - inside(cpg.namespaceBlock("A").l) { case List(namespaceA) => - namespaceA.code should startWith("namespace A") - namespaceA.fullName shouldBe "Test0.ts::program:A" - namespaceA.astChildren.astChildren.isNamespaceBlock.name("B").head shouldBe cpg.namespaceBlock("B").head - } - inside(cpg.namespaceBlock("B").l) { case List(namespaceB) => - namespaceB.code should startWith("namespace B") - namespaceB.fullName shouldBe "Test0.ts::program:A:B" - namespaceB.astChildren.astChildren.isNamespaceBlock.name("C").head shouldBe cpg.namespaceBlock("C").head - } - inside(cpg.namespaceBlock("C").l) { case List(namespaceC) => - namespaceC.code should startWith("namespace C") - namespaceC.fullName shouldBe "Test0.ts::program:A:B:C" - namespaceC.typeDecl.name("Foo").head.fullName shouldBe "Test0.ts::program:A:B:C:Foo" - } - } - - "have correct structure for nested namespaces with path" in { - val cpg = code(""" - |namespace A.B.C { - | class Foo {}; - |} - |""".stripMargin) - inside(cpg.namespaceBlock("A").l) { case List(namespaceA) => - namespaceA.code should startWith("namespace A") - namespaceA.fullName shouldBe "Test0.ts::program:A" - namespaceA.astChildren.isNamespaceBlock.name("B").head shouldBe cpg.namespaceBlock("B").head - } - inside(cpg.namespaceBlock("B").l) { case List(b) => - b.code should startWith("B.C") - b.fullName shouldBe "Test0.ts::program:A:B" - b.astChildren.isNamespaceBlock.name("C").head shouldBe cpg.namespaceBlock("C").head - } - inside(cpg.namespaceBlock("C").l) { case List(c) => - c.code should startWith("C") - c.fullName shouldBe "Test0.ts::program:A:B:C" - c.typeDecl.name("Foo").head.fullName shouldBe "Test0.ts::program:A:B:C:Foo" - } - } - } } diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/DependencyCfgCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/DependencyCfgCreationPassTests.scala index c83d24acb0b4..7e914d662a6f 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/DependencyCfgCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/DependencyCfgCreationPassTests.scala @@ -10,16 +10,16 @@ class DependencyCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTe "CFG generation for global builtins" should { "be correct for JSON.parse" in { implicit val cpg: Cpg = code("""JSON.parse("foo");""") - succOf(":program") shouldBe expected((""""foo"""", AlwaysEdge)) - succOf(""""foo"""") shouldBe expected(("""JSON.parse("foo")""", AlwaysEdge)) - succOf("""JSON.parse("foo")""") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected((""""foo"""", AlwaysEdge)) + succOf(""""foo"""") should contain theSameElementsAs expected(("""JSON.parse("foo")""", AlwaysEdge)) + succOf("""JSON.parse("foo")""") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "have correct structure for JSON.stringify" in { implicit val cpg: Cpg = code("""JSON.stringify(foo);""") - succOf(":program") shouldBe expected(("foo", AlwaysEdge)) - succOf("foo") shouldBe expected(("JSON.stringify(foo)", AlwaysEdge)) - succOf("JSON.stringify(foo)") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("JSON.stringify(foo)", AlwaysEdge)) + succOf("JSON.stringify(foo)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/JsClassesCfgCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/JsClassesCfgCreationPassTests.scala index 8301cf8a4afc..f827e03dbaab 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/JsClassesCfgCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/JsClassesCfgCreationPassTests.scala @@ -11,61 +11,65 @@ class JsClassesCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTes "CFG generation for constructor" should { "be correct for simple new" in { implicit val cpg: Cpg = code("new MyClass()") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected((".alloc", AlwaysEdge)) - succOf(".alloc") shouldBe expected(("_tmp_0 = .alloc", AlwaysEdge)) - succOf("_tmp_0 = .alloc") shouldBe expected(("MyClass", AlwaysEdge)) - succOf("MyClass") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("new MyClass()", AlwaysEdge)) - succOf("new MyClass()", NodeTypes.CALL) shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("new MyClass()", AlwaysEdge)) - succOf("new MyClass()") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected((".alloc", AlwaysEdge)) + succOf(".alloc") should contain theSameElementsAs expected(("_tmp_0 = .alloc", AlwaysEdge)) + succOf("_tmp_0 = .alloc") should contain theSameElementsAs expected(("MyClass", AlwaysEdge)) + succOf("MyClass") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("new MyClass()", AlwaysEdge)) + succOf("new MyClass()", NodeTypes.CALL) should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("new MyClass()", AlwaysEdge)) + succOf("new MyClass()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for simple new with arguments" in { implicit val cpg: Cpg = code("new MyClass(arg1, arg2)") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected((".alloc", AlwaysEdge)) - succOf(".alloc") shouldBe expected(("_tmp_0 = .alloc", AlwaysEdge)) - succOf("_tmp_0 = .alloc") shouldBe expected(("MyClass", AlwaysEdge)) - succOf("MyClass") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("arg1", AlwaysEdge)) - succOf("arg1") shouldBe expected(("arg2", AlwaysEdge)) - succOf("arg2") shouldBe expected(("new MyClass(arg1, arg2)", AlwaysEdge)) - succOf("new MyClass(arg1, arg2)", NodeTypes.CALL) shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("new MyClass(arg1, arg2)", AlwaysEdge)) - succOf("new MyClass(arg1, arg2)") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected((".alloc", AlwaysEdge)) + succOf(".alloc") should contain theSameElementsAs expected(("_tmp_0 = .alloc", AlwaysEdge)) + succOf("_tmp_0 = .alloc") should contain theSameElementsAs expected(("MyClass", AlwaysEdge)) + succOf("MyClass") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("arg1", AlwaysEdge)) + succOf("arg1") should contain theSameElementsAs expected(("arg2", AlwaysEdge)) + succOf("arg2") should contain theSameElementsAs expected(("new MyClass(arg1, arg2)", AlwaysEdge)) + succOf("new MyClass(arg1, arg2)", NodeTypes.CALL) should contain theSameElementsAs expected( + ("_tmp_0", 2, AlwaysEdge) + ) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("new MyClass(arg1, arg2)", AlwaysEdge)) + succOf("new MyClass(arg1, arg2)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for new with access path" in { implicit val cpg: Cpg = code("new foo.bar.MyClass()") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected((".alloc", AlwaysEdge)) - succOf(".alloc") shouldBe expected(("_tmp_0 = .alloc", AlwaysEdge)) - succOf("_tmp_0 = .alloc") shouldBe expected(("foo", AlwaysEdge)) - succOf("foo") shouldBe expected(("bar", AlwaysEdge)) - succOf("bar") shouldBe expected(("foo.bar", AlwaysEdge)) - succOf("foo.bar") shouldBe expected(("MyClass", AlwaysEdge)) - succOf("MyClass") shouldBe expected(("foo.bar.MyClass", AlwaysEdge)) - succOf("foo.bar.MyClass") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("new foo.bar.MyClass()", AlwaysEdge)) - succOf("new foo.bar.MyClass()", NodeTypes.CALL) shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("new foo.bar.MyClass()", AlwaysEdge)) - succOf("new foo.bar.MyClass()") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected((".alloc", AlwaysEdge)) + succOf(".alloc") should contain theSameElementsAs expected(("_tmp_0 = .alloc", AlwaysEdge)) + succOf("_tmp_0 = .alloc") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("bar", AlwaysEdge)) + succOf("bar") should contain theSameElementsAs expected(("foo.bar", AlwaysEdge)) + succOf("foo.bar") should contain theSameElementsAs expected(("MyClass", AlwaysEdge)) + succOf("MyClass") should contain theSameElementsAs expected(("foo.bar.MyClass", AlwaysEdge)) + succOf("foo.bar.MyClass") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("new foo.bar.MyClass()", AlwaysEdge)) + succOf("new foo.bar.MyClass()", NodeTypes.CALL) should contain theSameElementsAs expected( + ("_tmp_0", 2, AlwaysEdge) + ) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("new foo.bar.MyClass()", AlwaysEdge)) + succOf("new foo.bar.MyClass()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be structure for throw new exceptions" in { implicit val cpg: Cpg = code("function foo() { throw new Foo() }") - succOf("foo", NodeTypes.METHOD) shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected((".alloc", AlwaysEdge)) - succOf(".alloc") shouldBe expected(("_tmp_0 = .alloc", AlwaysEdge)) - succOf("_tmp_0 = .alloc") shouldBe expected(("Foo", AlwaysEdge)) - succOf("Foo") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("new Foo()", AlwaysEdge)) - succOf("new Foo()", NodeTypes.CALL) shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("new Foo()", AlwaysEdge)) - succOf("new Foo()") shouldBe expected(("throw new Foo()", AlwaysEdge)) - succOf("throw new Foo()") shouldBe expected(("RET", AlwaysEdge)) + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected((".alloc", AlwaysEdge)) + succOf(".alloc") should contain theSameElementsAs expected(("_tmp_0 = .alloc", AlwaysEdge)) + succOf("_tmp_0 = .alloc") should contain theSameElementsAs expected(("Foo", AlwaysEdge)) + succOf("Foo") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("new Foo()", AlwaysEdge)) + succOf("new Foo()", NodeTypes.CALL) should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("new Foo()", AlwaysEdge)) + succOf("new Foo()") should contain theSameElementsAs expected(("throw new Foo()", AlwaysEdge)) + succOf("throw new Foo()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } @@ -78,10 +82,10 @@ class JsClassesCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTes | } |} |""".stripMargin) - succOf("foo", NodeTypes.METHOD) shouldBe expected(("bar", AlwaysEdge)) - succOf("bar") shouldBe expected(("this", AlwaysEdge)) - succOf("this", NodeTypes.IDENTIFIER) shouldBe expected(("bar()", AlwaysEdge)) - succOf("bar()") shouldBe expected(("RET", 2, AlwaysEdge)) + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("bar", AlwaysEdge)) + succOf("bar") should contain theSameElementsAs expected(("this", AlwaysEdge)) + succOf("this", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("bar()", AlwaysEdge)) + succOf("bar()") should contain theSameElementsAs expected(("RET", 2, AlwaysEdge)) } "be correct for methods in class type decls with assignment" in { @@ -92,17 +96,17 @@ class JsClassesCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTes | } |} |""".stripMargin) - succOf(":program") shouldBe expected(("a", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("a", AlwaysEdge)) // call to constructor of ClassA - succOf("a") shouldBe expected(("class ClassA", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("class ClassA", AlwaysEdge)) } "be correct for outer method of anonymous class declaration" in { implicit val cpg: Cpg = code("var a = class {}") - succOf(":program") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("class 0", AlwaysEdge)) - succOf("class 0") shouldBe expected(("var a = class {}", AlwaysEdge)) - succOf("var a = class {}") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("class 0", AlwaysEdge)) + succOf("class 0") should contain theSameElementsAs expected(("var a = class {}", AlwaysEdge)) + succOf("var a = class {}") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/MixedCfgCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/MixedCfgCreationPassTests.scala index bef8d7d9f81c..f3c619eed31c 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/MixedCfgCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/MixedCfgCreationPassTests.scala @@ -7,164 +7,172 @@ import io.joern.x2cpg.passes.controlflow.cfgcreation.Cfg.TrueEdge import io.joern.x2cpg.testfixtures.CfgTestFixture import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.NodeTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MixedCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCpg()) { "CFG generation for destructing assignment" should { "be correct for object destruction assignment with declaration" in { implicit val cpg: Cpg = code("var {a, b} = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - - succOf("_tmp_0 = x") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("a", 1, AlwaysEdge)) - succOf("a", 1) shouldBe expected(("_tmp_0.a", AlwaysEdge)) - succOf("_tmp_0.a") shouldBe expected(("a = _tmp_0.a", AlwaysEdge)) - - succOf("a = _tmp_0.a") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("b", 1, AlwaysEdge)) - succOf("b", 1) shouldBe expected(("_tmp_0.b", AlwaysEdge)) - succOf("_tmp_0.b") shouldBe expected(("b = _tmp_0.b", AlwaysEdge)) - succOf("b = _tmp_0.b") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("var {a, b} = x", AlwaysEdge)) - succOf("var {a, b} = x") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("a", 1, AlwaysEdge)) + succOf("a", 1) should contain theSameElementsAs expected(("_tmp_0.a", AlwaysEdge)) + succOf("_tmp_0.a") should contain theSameElementsAs expected(("a = _tmp_0.a", AlwaysEdge)) + + succOf("a = _tmp_0.a") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("b", 1, AlwaysEdge)) + succOf("b", 1) should contain theSameElementsAs expected(("_tmp_0.b", AlwaysEdge)) + succOf("_tmp_0.b") should contain theSameElementsAs expected(("b = _tmp_0.b", AlwaysEdge)) + succOf("b = _tmp_0.b") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("var {a, b} = x", AlwaysEdge)) + succOf("var {a, b} = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for object destruction assignment with declaration and ternary init" in { implicit val cpg: Cpg = code("const { a, b } = test() ? foo() : bar()") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("test", AlwaysEdge)) - succOf("test") shouldBe expected(("this", AlwaysEdge)) - succOf("this", NodeTypes.IDENTIFIER) shouldBe expected(("test()", AlwaysEdge)) - succOf("test()") shouldBe expected(("foo", TrueEdge), ("bar", FalseEdge)) - succOf("foo") shouldBe expected(("this", 1, AlwaysEdge)) - succOf("this", 2) shouldBe expected(("foo()", AlwaysEdge)) - succOf("bar()") shouldBe expected(("test() ? foo() : bar()", AlwaysEdge)) - succOf("foo()") shouldBe expected(("test() ? foo() : bar()", AlwaysEdge)) - succOf("test() ? foo() : bar()") shouldBe expected(("_tmp_0 = test() ? foo() : bar()", AlwaysEdge)) - succOf("_tmp_0 = test() ? foo() : bar()") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("a", 1, AlwaysEdge)) - succOf("a", 1) shouldBe expected(("_tmp_0.a", AlwaysEdge)) - succOf("_tmp_0.a") shouldBe expected(("a = _tmp_0.a", AlwaysEdge)) - succOf("a = _tmp_0.a") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("b", 1, AlwaysEdge)) - succOf("b", 1) shouldBe expected(("_tmp_0.b", AlwaysEdge)) - succOf("_tmp_0.b") shouldBe expected(("b = _tmp_0.b", AlwaysEdge)) - succOf("b = _tmp_0.b") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("const { a, b } = test() ? foo() : bar()", AlwaysEdge)) - succOf("const { a, b } = test() ? foo() : bar()") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("test", AlwaysEdge)) + succOf("test") should contain theSameElementsAs expected(("this", AlwaysEdge)) + succOf("this", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("test()", AlwaysEdge)) + succOf("test()") should contain theSameElementsAs expected(("foo", TrueEdge), ("bar", FalseEdge)) + succOf("foo") should contain theSameElementsAs expected(("this", 1, AlwaysEdge)) + succOf("this", 2) should contain theSameElementsAs expected(("foo()", AlwaysEdge)) + succOf("bar()") should contain theSameElementsAs expected(("test() ? foo() : bar()", AlwaysEdge)) + succOf("foo()") should contain theSameElementsAs expected(("test() ? foo() : bar()", AlwaysEdge)) + succOf("test() ? foo() : bar()") should contain theSameElementsAs expected( + ("_tmp_0 = test() ? foo() : bar()", AlwaysEdge) + ) + succOf("_tmp_0 = test() ? foo() : bar()") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("a", 1, AlwaysEdge)) + succOf("a", 1) should contain theSameElementsAs expected(("_tmp_0.a", AlwaysEdge)) + succOf("_tmp_0.a") should contain theSameElementsAs expected(("a = _tmp_0.a", AlwaysEdge)) + succOf("a = _tmp_0.a") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("b", 1, AlwaysEdge)) + succOf("b", 1) should contain theSameElementsAs expected(("_tmp_0.b", AlwaysEdge)) + succOf("_tmp_0.b") should contain theSameElementsAs expected(("b = _tmp_0.b", AlwaysEdge)) + succOf("b = _tmp_0.b") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected( + ("const { a, b } = test() ? foo() : bar()", AlwaysEdge) + ) + succOf("const { a, b } = test() ? foo() : bar()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for object destruction assignment with reassignment" in { implicit val cpg: Cpg = code("var {a: n, b: m} = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - - succOf("_tmp_0 = x") shouldBe expected(("n", AlwaysEdge)) - succOf("n") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("_tmp_0.a", AlwaysEdge)) - succOf("_tmp_0.a") shouldBe expected(("n = _tmp_0.a", AlwaysEdge)) - - succOf("n = _tmp_0.a") shouldBe expected(("m", AlwaysEdge)) - succOf("m") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("_tmp_0.b", AlwaysEdge)) - succOf("_tmp_0.b") shouldBe expected(("m = _tmp_0.b", AlwaysEdge)) - succOf("m = _tmp_0.b") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("var {a: n, b: m} = x", AlwaysEdge)) - succOf("var {a: n, b: m} = x") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("n", AlwaysEdge)) + succOf("n") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("_tmp_0.a", AlwaysEdge)) + succOf("_tmp_0.a") should contain theSameElementsAs expected(("n = _tmp_0.a", AlwaysEdge)) + + succOf("n = _tmp_0.a") should contain theSameElementsAs expected(("m", AlwaysEdge)) + succOf("m") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_0.b", AlwaysEdge)) + succOf("_tmp_0.b") should contain theSameElementsAs expected(("m = _tmp_0.b", AlwaysEdge)) + succOf("m = _tmp_0.b") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("var {a: n, b: m} = x", AlwaysEdge)) + succOf("var {a: n, b: m} = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for object destruction assignment with reassignment and defaults" in { implicit val cpg: Cpg = code("var {a: n = 1, b: m = 2} = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - succOf("_tmp_0 = x") shouldBe expected(("n", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("n", AlwaysEdge)) // test statement - succOf("n") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("_tmp_0.a", AlwaysEdge)) - succOf("_tmp_0.a") shouldBe expected(("void 0", AlwaysEdge)) - succOf("void 0") shouldBe expected(("_tmp_0.a === void 0", AlwaysEdge)) + succOf("n") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("_tmp_0.a", AlwaysEdge)) + succOf("_tmp_0.a") should contain theSameElementsAs expected(("void 0", AlwaysEdge)) + succOf("void 0") should contain theSameElementsAs expected(("_tmp_0.a === void 0", AlwaysEdge)) // true, false cases - succOf("_tmp_0.a === void 0") shouldBe expected(("1", TrueEdge), ("_tmp_0", 2, FalseEdge)) - succOf("_tmp_0", 2) shouldBe expected(("a", 1, AlwaysEdge)) - succOf("a", 1) shouldBe expected(("_tmp_0.a", 1, AlwaysEdge)) - succOf("_tmp_0.a", 1) shouldBe expected(("_tmp_0.a === void 0 ? 1 : _tmp_0.a", AlwaysEdge)) - succOf("1") shouldBe expected(("_tmp_0.a === void 0 ? 1 : _tmp_0.a", AlwaysEdge)) - succOf("_tmp_0.a === void 0 ? 1 : _tmp_0.a") shouldBe + succOf("_tmp_0.a === void 0") should contain theSameElementsAs expected(("1", TrueEdge), ("_tmp_0", 2, FalseEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("a", 1, AlwaysEdge)) + succOf("a", 1) should contain theSameElementsAs expected(("_tmp_0.a", 1, AlwaysEdge)) + succOf("_tmp_0.a", 1) should contain theSameElementsAs expected( + ("_tmp_0.a === void 0 ? 1 : _tmp_0.a", AlwaysEdge) + ) + succOf("1") should contain theSameElementsAs expected(("_tmp_0.a === void 0 ? 1 : _tmp_0.a", AlwaysEdge)) + succOf("_tmp_0.a === void 0 ? 1 : _tmp_0.a") should contain theSameElementsAs expected(("n = _tmp_0.a === void 0 ? 1 : _tmp_0.a", AlwaysEdge)) - succOf("n = _tmp_0.a === void 0 ? 1 : _tmp_0.a") shouldBe + succOf("n = _tmp_0.a === void 0 ? 1 : _tmp_0.a") should contain theSameElementsAs expected(("m", AlwaysEdge)) // test statement - succOf("m") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("_tmp_0.b", AlwaysEdge)) - succOf("_tmp_0.b") shouldBe expected(("void 0", 1, AlwaysEdge)) - succOf("void 0", 1) shouldBe expected(("_tmp_0.b === void 0", AlwaysEdge)) + succOf("m") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_0.b", AlwaysEdge)) + succOf("_tmp_0.b") should contain theSameElementsAs expected(("void 0", 1, AlwaysEdge)) + succOf("void 0", 1) should contain theSameElementsAs expected(("_tmp_0.b === void 0", AlwaysEdge)) // true, false cases - succOf("_tmp_0.b === void 0") shouldBe expected(("2", TrueEdge), ("_tmp_0", 4, FalseEdge)) - succOf("_tmp_0", 4) shouldBe expected(("b", 1, AlwaysEdge)) - succOf("b", 1) shouldBe expected(("_tmp_0.b", 1, AlwaysEdge)) - succOf("_tmp_0.b", 1) shouldBe expected(("_tmp_0.b === void 0 ? 2 : _tmp_0.b", AlwaysEdge)) - succOf("2") shouldBe expected(("_tmp_0.b === void 0 ? 2 : _tmp_0.b", AlwaysEdge)) - succOf("_tmp_0.b === void 0 ? 2 : _tmp_0.b") shouldBe + succOf("_tmp_0.b === void 0") should contain theSameElementsAs expected(("2", TrueEdge), ("_tmp_0", 4, FalseEdge)) + succOf("_tmp_0", 4) should contain theSameElementsAs expected(("b", 1, AlwaysEdge)) + succOf("b", 1) should contain theSameElementsAs expected(("_tmp_0.b", 1, AlwaysEdge)) + succOf("_tmp_0.b", 1) should contain theSameElementsAs expected( + ("_tmp_0.b === void 0 ? 2 : _tmp_0.b", AlwaysEdge) + ) + succOf("2") should contain theSameElementsAs expected(("_tmp_0.b === void 0 ? 2 : _tmp_0.b", AlwaysEdge)) + succOf("_tmp_0.b === void 0 ? 2 : _tmp_0.b") should contain theSameElementsAs expected(("m = _tmp_0.b === void 0 ? 2 : _tmp_0.b", AlwaysEdge)) - succOf("m = _tmp_0.b === void 0 ? 2 : _tmp_0.b") shouldBe + succOf("m = _tmp_0.b === void 0 ? 2 : _tmp_0.b") should contain theSameElementsAs expected(("_tmp_0", 5, AlwaysEdge)) - succOf("_tmp_0", 5) shouldBe expected(("var {a: n = 1, b: m = 2} = x", AlwaysEdge)) - succOf("var {a: n = 1, b: m = 2} = x") shouldBe expected(("RET", AlwaysEdge)) + succOf("_tmp_0", 5) should contain theSameElementsAs expected(("var {a: n = 1, b: m = 2} = x", AlwaysEdge)) + succOf("var {a: n = 1, b: m = 2} = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for object destruction assignment with rest" in { implicit val cpg: Cpg = code("var {a, ...rest} = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - - succOf("_tmp_0 = x") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("a", 1, AlwaysEdge)) - succOf("a", 1) shouldBe expected(("_tmp_0.a", AlwaysEdge)) - succOf("_tmp_0.a") shouldBe expected(("a = _tmp_0.a", AlwaysEdge)) - - succOf("a = _tmp_0.a") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("rest", AlwaysEdge)) - succOf("rest") shouldBe expected(("...rest", AlwaysEdge)) - succOf("...rest") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - - succOf("_tmp_0", 3) shouldBe expected(("var {a, ...rest} = x", AlwaysEdge)) - succOf("var {a, ...rest} = x") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("a", 1, AlwaysEdge)) + succOf("a", 1) should contain theSameElementsAs expected(("_tmp_0.a", AlwaysEdge)) + succOf("_tmp_0.a") should contain theSameElementsAs expected(("a = _tmp_0.a", AlwaysEdge)) + + succOf("a = _tmp_0.a") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("rest", AlwaysEdge)) + succOf("rest") should contain theSameElementsAs expected(("...rest", AlwaysEdge)) + succOf("...rest") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("var {a, ...rest} = x", AlwaysEdge)) + succOf("var {a, ...rest} = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for object destruction assignment with computed property name" in { implicit val cpg: Cpg = code("var {[propName]: n} = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - - succOf("_tmp_0 = x") shouldBe expected(("n", AlwaysEdge)) - succOf("n") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("propName", AlwaysEdge)) - succOf("propName") shouldBe expected(("_tmp_0.propName", AlwaysEdge)) - succOf("_tmp_0.propName") shouldBe expected(("n = _tmp_0.propName", AlwaysEdge)) - - succOf("n = _tmp_0.propName") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("var {[propName]: n} = x", AlwaysEdge)) - succOf("var {[propName]: n} = x") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("n", AlwaysEdge)) + succOf("n") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("propName", AlwaysEdge)) + succOf("propName") should contain theSameElementsAs expected(("_tmp_0.propName", AlwaysEdge)) + succOf("_tmp_0.propName") should contain theSameElementsAs expected(("n = _tmp_0.propName", AlwaysEdge)) + + succOf("n = _tmp_0.propName") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("var {[propName]: n} = x", AlwaysEdge)) + succOf("var {[propName]: n} = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for nested object destruction assignment with defaults as parameter" in { @@ -172,46 +180,50 @@ class MixedCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCpg |function userId({id = {}, b} = {}) { | return id |}""".stripMargin) - succOf("userId", NodeTypes.METHOD) shouldBe expected(("_tmp_1", AlwaysEdge)) - succOf("_tmp_1") shouldBe expected(("param1_0", AlwaysEdge)) - succOf("param1_0") shouldBe expected(("void 0", AlwaysEdge)) - succOf("void 0") shouldBe expected(("param1_0 === void 0", AlwaysEdge)) - succOf("param1_0 === void 0") shouldBe expected( + succOf("userId", NodeTypes.METHOD) should contain theSameElementsAs expected(("_tmp_1", AlwaysEdge)) + succOf("_tmp_1") should contain theSameElementsAs expected(("param1_0", AlwaysEdge)) + succOf("param1_0") should contain theSameElementsAs expected(("void 0", AlwaysEdge)) + succOf("void 0") should contain theSameElementsAs expected(("param1_0 === void 0", AlwaysEdge)) + succOf("param1_0 === void 0") should contain theSameElementsAs expected( ("_tmp_0", TrueEdge), // holds {} ("param1_0", 1, FalseEdge) ) - succOf("param1_0", 1) shouldBe expected(("param1_0 === void 0 ? {} : param1_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("param1_0 === void 0 ? {} : param1_0", AlwaysEdge)) - succOf("param1_0 === void 0 ? {} : param1_0") shouldBe expected( + succOf("param1_0", 1) should contain theSameElementsAs expected( + ("param1_0 === void 0 ? {} : param1_0", AlwaysEdge) + ) + succOf("_tmp_0") should contain theSameElementsAs expected(("param1_0 === void 0 ? {} : param1_0", AlwaysEdge)) + succOf("param1_0 === void 0 ? {} : param1_0") should contain theSameElementsAs expected( ("_tmp_1 = param1_0 === void 0 ? {} : param1_0", AlwaysEdge) ) - succOf("_tmp_1 = param1_0 === void 0 ? {} : param1_0") shouldBe expected(("id", AlwaysEdge)) - succOf("id") shouldBe expected(("_tmp_1", 1, AlwaysEdge)) - succOf("_tmp_1", 1) shouldBe expected(("id", 1, AlwaysEdge)) - succOf("id", 1) shouldBe expected(("_tmp_1.id", AlwaysEdge)) - succOf("_tmp_1.id") shouldBe expected(("void 0", 1, AlwaysEdge)) - succOf("void 0", 1) shouldBe expected(("_tmp_1.id === void 0", AlwaysEdge)) - succOf("_tmp_1.id === void 0") shouldBe expected( + succOf("_tmp_1 = param1_0 === void 0 ? {} : param1_0") should contain theSameElementsAs expected( + ("id", AlwaysEdge) + ) + succOf("id") should contain theSameElementsAs expected(("_tmp_1", 1, AlwaysEdge)) + succOf("_tmp_1", 1) should contain theSameElementsAs expected(("id", 1, AlwaysEdge)) + succOf("id", 1) should contain theSameElementsAs expected(("_tmp_1.id", AlwaysEdge)) + succOf("_tmp_1.id") should contain theSameElementsAs expected(("void 0", 1, AlwaysEdge)) + succOf("void 0", 1) should contain theSameElementsAs expected(("_tmp_1.id === void 0", AlwaysEdge)) + succOf("_tmp_1.id === void 0") should contain theSameElementsAs expected( ("_tmp_2", TrueEdge), // holds {} ("_tmp_1", 2, FalseEdge) ) - succOf("_tmp_2") shouldBe expected(("_tmp_1.id === void 0 ? {} : _tmp_1.id", AlwaysEdge)) - succOf("_tmp_1", 2) shouldBe expected(("id", 2, AlwaysEdge)) + succOf("_tmp_2") should contain theSameElementsAs expected(("_tmp_1.id === void 0 ? {} : _tmp_1.id", AlwaysEdge)) + succOf("_tmp_1", 2) should contain theSameElementsAs expected(("id", 2, AlwaysEdge)) - succOf("_tmp_1.id === void 0 ? {} : _tmp_1.id") shouldBe expected( + succOf("_tmp_1.id === void 0 ? {} : _tmp_1.id") should contain theSameElementsAs expected( ("id = _tmp_1.id === void 0 ? {} : _tmp_1.id", AlwaysEdge) ) - succOf("id", 2) shouldBe expected(("_tmp_1.id", 1, AlwaysEdge)) + succOf("id", 2) should contain theSameElementsAs expected(("_tmp_1.id", 1, AlwaysEdge)) - succOf("id = _tmp_1.id === void 0 ? {} : _tmp_1.id") shouldBe expected(("b", AlwaysEdge)) + succOf("id = _tmp_1.id === void 0 ? {} : _tmp_1.id") should contain theSameElementsAs expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("_tmp_1", 3, AlwaysEdge)) - succOf("_tmp_1", 3) shouldBe expected(("b", 1, AlwaysEdge)) - succOf("b", 1) shouldBe expected(("_tmp_1.b", AlwaysEdge)) - succOf("_tmp_1.b") shouldBe expected(("b = _tmp_1.b", AlwaysEdge)) - succOf("b = _tmp_1.b") shouldBe expected(("_tmp_1", 4, AlwaysEdge)) - succOf("_tmp_1", 4) shouldBe expected(("{id = {}, b} = {}", 1, AlwaysEdge)) - succOf("{id = {}, b} = {}", 1) shouldBe expected(("id", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_1", 3, AlwaysEdge)) + succOf("_tmp_1", 3) should contain theSameElementsAs expected(("b", 1, AlwaysEdge)) + succOf("b", 1) should contain theSameElementsAs expected(("_tmp_1.b", AlwaysEdge)) + succOf("_tmp_1.b") should contain theSameElementsAs expected(("b = _tmp_1.b", AlwaysEdge)) + succOf("b = _tmp_1.b") should contain theSameElementsAs expected(("_tmp_1", 4, AlwaysEdge)) + succOf("_tmp_1", 4) should contain theSameElementsAs expected(("{id = {}, b} = {}", 1, AlwaysEdge)) + succOf("{id = {}, b} = {}", 1) should contain theSameElementsAs expected(("id", AlwaysEdge)) } @@ -220,151 +232,163 @@ class MixedCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCpg |function userId({id}) { | return id |}""".stripMargin) - succOf("userId", NodeTypes.METHOD) shouldBe expected(("id", AlwaysEdge)) - succOf("id") shouldBe expected(("param1_0", AlwaysEdge)) - succOf("param1_0") shouldBe expected(("id", 1, AlwaysEdge)) - succOf("id", 1) shouldBe expected(("param1_0.id", AlwaysEdge)) - succOf("param1_0.id") shouldBe expected(("id = param1_0.id", AlwaysEdge)) - succOf("id = param1_0.id") shouldBe expected(("id", 2, AlwaysEdge)) - succOf("id", 2) shouldBe expected(("return id", AlwaysEdge)) - succOf("return id") shouldBe expected(("RET", AlwaysEdge)) + succOf("userId", NodeTypes.METHOD) should contain theSameElementsAs expected(("id", AlwaysEdge)) + succOf("id") should contain theSameElementsAs expected(("param1_0", AlwaysEdge)) + succOf("param1_0") should contain theSameElementsAs expected(("id", 1, AlwaysEdge)) + succOf("id", 1) should contain theSameElementsAs expected(("param1_0.id", AlwaysEdge)) + succOf("param1_0.id") should contain theSameElementsAs expected(("id = param1_0.id", AlwaysEdge)) + succOf("id = param1_0.id") should contain theSameElementsAs expected(("id", 2, AlwaysEdge)) + succOf("id", 2) should contain theSameElementsAs expected(("return id", AlwaysEdge)) + succOf("return id") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for array destruction assignment with declaration" in { implicit val cpg: Cpg = code("var [a, b] = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - - succOf("_tmp_0 = x") shouldBe expected(("a", AlwaysEdge)) - - succOf("a") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("_tmp_0[0]", AlwaysEdge)) - succOf("_tmp_0[0]") shouldBe expected(("a = _tmp_0[0]", AlwaysEdge)) - - succOf("a = _tmp_0[0]") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("_tmp_0[1]", AlwaysEdge)) - succOf("_tmp_0[1]") shouldBe expected(("b = _tmp_0[1]", AlwaysEdge)) - succOf("b = _tmp_0[1]") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("var [a, b] = x", AlwaysEdge)) - succOf("var [a, b] = x") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("a", AlwaysEdge)) + + succOf("a") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("_tmp_0[0]", AlwaysEdge)) + succOf("_tmp_0[0]") should contain theSameElementsAs expected(("a = _tmp_0[0]", AlwaysEdge)) + + succOf("a = _tmp_0[0]") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("_tmp_0[1]", AlwaysEdge)) + succOf("_tmp_0[1]") should contain theSameElementsAs expected(("b = _tmp_0[1]", AlwaysEdge)) + succOf("b = _tmp_0[1]") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("var [a, b] = x", AlwaysEdge)) + succOf("var [a, b] = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for array destruction assignment without declaration" in { implicit val cpg: Cpg = code("[a, b] = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - - succOf("_tmp_0 = x") shouldBe expected(("a", AlwaysEdge)) - - succOf("a") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("_tmp_0[0]", AlwaysEdge)) - succOf("_tmp_0[0]") shouldBe expected(("a = _tmp_0[0]", AlwaysEdge)) - - succOf("a = _tmp_0[0]") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("_tmp_0[1]", AlwaysEdge)) - succOf("_tmp_0[1]") shouldBe expected(("b = _tmp_0[1]", AlwaysEdge)) - succOf("b = _tmp_0[1]") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("[a, b] = x", AlwaysEdge)) - succOf("[a, b] = x") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("a", AlwaysEdge)) + + succOf("a") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("_tmp_0[0]", AlwaysEdge)) + succOf("_tmp_0[0]") should contain theSameElementsAs expected(("a = _tmp_0[0]", AlwaysEdge)) + + succOf("a = _tmp_0[0]") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("_tmp_0[1]", AlwaysEdge)) + succOf("_tmp_0[1]") should contain theSameElementsAs expected(("b = _tmp_0[1]", AlwaysEdge)) + succOf("b = _tmp_0[1]") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("[a, b] = x", AlwaysEdge)) + succOf("[a, b] = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for array destruction assignment with defaults" in { implicit val cpg: Cpg = code("var [a = 1, b = 2] = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) - succOf("_tmp_0 = x") shouldBe expected(("a", AlwaysEdge)) + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("a", AlwaysEdge)) // test statement - succOf("a") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("_tmp_0[0]", AlwaysEdge)) - succOf("_tmp_0[0]") shouldBe expected(("void 0", AlwaysEdge)) - succOf("void 0") shouldBe expected(("_tmp_0[0] === void 0", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("_tmp_0[0]", AlwaysEdge)) + succOf("_tmp_0[0]") should contain theSameElementsAs expected(("void 0", AlwaysEdge)) + succOf("void 0") should contain theSameElementsAs expected(("_tmp_0[0] === void 0", AlwaysEdge)) // true, false cases - succOf("_tmp_0[0] === void 0") shouldBe expected(("1", TrueEdge), ("_tmp_0", 2, FalseEdge)) - succOf("_tmp_0", 2) shouldBe expected(("0", 1, AlwaysEdge)) - succOf("0", 1) shouldBe expected(("_tmp_0[0]", 1, AlwaysEdge)) - succOf("_tmp_0[0]", 1) shouldBe expected(("_tmp_0[0] === void 0 ? 1 : _tmp_0[0]", AlwaysEdge)) - succOf("_tmp_0[0] === void 0 ? 1 : _tmp_0[0]") shouldBe expected( + succOf("_tmp_0[0] === void 0") should contain theSameElementsAs expected( + ("1", TrueEdge), + ("_tmp_0", 2, FalseEdge) + ) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("0", 1, AlwaysEdge)) + succOf("0", 1) should contain theSameElementsAs expected(("_tmp_0[0]", 1, AlwaysEdge)) + succOf("_tmp_0[0]", 1) should contain theSameElementsAs expected( + ("_tmp_0[0] === void 0 ? 1 : _tmp_0[0]", AlwaysEdge) + ) + succOf("_tmp_0[0] === void 0 ? 1 : _tmp_0[0]") should contain theSameElementsAs expected( ("a = _tmp_0[0] === void 0 ? 1 : _tmp_0[0]", AlwaysEdge) ) - succOf("a = _tmp_0[0] === void 0 ? 1 : _tmp_0[0]") shouldBe expected(("b", AlwaysEdge)) + succOf("a = _tmp_0[0] === void 0 ? 1 : _tmp_0[0]") should contain theSameElementsAs expected(("b", AlwaysEdge)) // test statement - succOf("b") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("1", 1, AlwaysEdge)) - succOf("1", 1) shouldBe expected(("_tmp_0[1]", AlwaysEdge)) - succOf("_tmp_0[1]") shouldBe expected(("void 0", 1, AlwaysEdge)) - succOf("void 0", 1) shouldBe expected(("_tmp_0[1] === void 0", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("1", 1, AlwaysEdge)) + succOf("1", 1) should contain theSameElementsAs expected(("_tmp_0[1]", AlwaysEdge)) + succOf("_tmp_0[1]") should contain theSameElementsAs expected(("void 0", 1, AlwaysEdge)) + succOf("void 0", 1) should contain theSameElementsAs expected(("_tmp_0[1] === void 0", AlwaysEdge)) // true, false cases - succOf("_tmp_0[1] === void 0") shouldBe expected(("2", TrueEdge), ("_tmp_0", 4, FalseEdge)) - succOf("_tmp_0", 4) shouldBe expected(("1", 2, AlwaysEdge)) - succOf("1", 2) shouldBe expected(("_tmp_0[1]", 1, AlwaysEdge)) - succOf("_tmp_0[1]", 1) shouldBe expected(("_tmp_0[1] === void 0 ? 2 : _tmp_0[1]", AlwaysEdge)) - succOf("_tmp_0[1] === void 0 ? 2 : _tmp_0[1]") shouldBe expected( + succOf("_tmp_0[1] === void 0") should contain theSameElementsAs expected( + ("2", TrueEdge), + ("_tmp_0", 4, FalseEdge) + ) + succOf("_tmp_0", 4) should contain theSameElementsAs expected(("1", 2, AlwaysEdge)) + succOf("1", 2) should contain theSameElementsAs expected(("_tmp_0[1]", 1, AlwaysEdge)) + succOf("_tmp_0[1]", 1) should contain theSameElementsAs expected( + ("_tmp_0[1] === void 0 ? 2 : _tmp_0[1]", AlwaysEdge) + ) + succOf("_tmp_0[1] === void 0 ? 2 : _tmp_0[1]") should contain theSameElementsAs expected( ("b = _tmp_0[1] === void 0 ? 2 : _tmp_0[1]", AlwaysEdge) ) - succOf("b = _tmp_0[1] === void 0 ? 2 : _tmp_0[1]") shouldBe expected(("_tmp_0", 5, AlwaysEdge)) - succOf("_tmp_0", 5) shouldBe expected(("var [a = 1, b = 2] = x", AlwaysEdge)) - succOf("var [a = 1, b = 2] = x") shouldBe expected(("RET", AlwaysEdge)) + succOf("b = _tmp_0[1] === void 0 ? 2 : _tmp_0[1]") should contain theSameElementsAs expected( + ("_tmp_0", 5, AlwaysEdge) + ) + succOf("_tmp_0", 5) should contain theSameElementsAs expected(("var [a = 1, b = 2] = x", AlwaysEdge)) + succOf("var [a = 1, b = 2] = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for array destruction assignment with ignores" in { implicit val cpg: Cpg = code("var [a, , b] = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - - succOf("_tmp_0 = x") shouldBe expected(("a", AlwaysEdge)) - - succOf("a") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("_tmp_0[0]", AlwaysEdge)) - succOf("_tmp_0[0]") shouldBe expected(("a = _tmp_0[0]", AlwaysEdge)) - - succOf("a = _tmp_0[0]") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("_tmp_0[2]", AlwaysEdge)) - succOf("_tmp_0[2]") shouldBe expected(("b = _tmp_0[2]", AlwaysEdge)) - succOf("b = _tmp_0[2]") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("var [a, , b] = x", AlwaysEdge)) - succOf("var [a, , b] = x") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("a", AlwaysEdge)) + + succOf("a") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("_tmp_0[0]", AlwaysEdge)) + succOf("_tmp_0[0]") should contain theSameElementsAs expected(("a = _tmp_0[0]", AlwaysEdge)) + + succOf("a = _tmp_0[0]") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("_tmp_0[2]", AlwaysEdge)) + succOf("_tmp_0[2]") should contain theSameElementsAs expected(("b = _tmp_0[2]", AlwaysEdge)) + succOf("b = _tmp_0[2]") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("var [a, , b] = x", AlwaysEdge)) + succOf("var [a, , b] = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for array destruction assignment with rest" in { implicit val cpg: Cpg = code("var [a, ...rest] = x") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0 = x", AlwaysEdge)) - - succOf("_tmp_0 = x") shouldBe expected(("a", AlwaysEdge)) - - succOf("a") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("_tmp_0[0]", AlwaysEdge)) - succOf("_tmp_0[0]") shouldBe expected(("a = _tmp_0[0]", AlwaysEdge)) - - succOf("a = _tmp_0[0]") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("_tmp_0[1]", AlwaysEdge)) - succOf("_tmp_0[1]") shouldBe expected(("rest", AlwaysEdge)) - succOf("rest") shouldBe expected(("...rest", AlwaysEdge)) - succOf("...rest") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("var [a, ...rest] = x", AlwaysEdge)) - succOf("var [a, ...rest] = x") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0 = x", AlwaysEdge)) + + succOf("_tmp_0 = x") should contain theSameElementsAs expected(("a", AlwaysEdge)) + + succOf("a") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("_tmp_0[0]", AlwaysEdge)) + succOf("_tmp_0[0]") should contain theSameElementsAs expected(("a = _tmp_0[0]", AlwaysEdge)) + + succOf("a = _tmp_0[0]") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("_tmp_0[1]", AlwaysEdge)) + succOf("_tmp_0[1]") should contain theSameElementsAs expected(("rest", AlwaysEdge)) + succOf("rest") should contain theSameElementsAs expected(("...rest", AlwaysEdge)) + succOf("...rest") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("var [a, ...rest] = x", AlwaysEdge)) + succOf("var [a, ...rest] = x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for array destruction assignment as parameter" in { @@ -373,25 +397,25 @@ class MixedCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCpg | return id |} |""".stripMargin) - succOf("userId", NodeTypes.METHOD) shouldBe expected(("id", AlwaysEdge)) - succOf("id") shouldBe expected(("param1_0", AlwaysEdge)) - succOf("param1_0") shouldBe expected(("id", 1, AlwaysEdge)) - succOf("id", 1) shouldBe expected(("param1_0.id", AlwaysEdge)) - succOf("param1_0.id") shouldBe expected(("id = param1_0.id", AlwaysEdge)) - succOf("id = param1_0.id") shouldBe expected(("id", 2, AlwaysEdge)) - succOf("id", 2) shouldBe expected(("return id", AlwaysEdge)) - succOf("return id") shouldBe expected(("RET", AlwaysEdge)) + succOf("userId", NodeTypes.METHOD) should contain theSameElementsAs expected(("id", AlwaysEdge)) + succOf("id") should contain theSameElementsAs expected(("param1_0", AlwaysEdge)) + succOf("param1_0") should contain theSameElementsAs expected(("id", 1, AlwaysEdge)) + succOf("id", 1) should contain theSameElementsAs expected(("param1_0.id", AlwaysEdge)) + succOf("param1_0.id") should contain theSameElementsAs expected(("id = param1_0.id", AlwaysEdge)) + succOf("id = param1_0.id") should contain theSameElementsAs expected(("id", 2, AlwaysEdge)) + succOf("id", 2) should contain theSameElementsAs expected(("return id", AlwaysEdge)) + succOf("return id") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "CFG generation for spread arguments" should { "have correct structure for method spread argument" in { implicit val cpg: Cpg = code("foo(...args)") - succOf(":program") shouldBe expected(("foo", AlwaysEdge)) - succOf("foo") shouldBe expected(("this", AlwaysEdge)) - succOf("this", NodeTypes.IDENTIFIER) shouldBe expected(("args", AlwaysEdge)) - succOf("args") shouldBe expected(("...args", AlwaysEdge)) - succOf("...args") shouldBe expected(("foo(...args)", AlwaysEdge)) - succOf("foo(...args)") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("this", AlwaysEdge)) + succOf("this", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("args", AlwaysEdge)) + succOf("args") should contain theSameElementsAs expected(("...args", AlwaysEdge)) + succOf("...args") should contain theSameElementsAs expected(("foo(...args)", AlwaysEdge)) + succOf("foo(...args)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } @@ -400,110 +424,110 @@ class MixedCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCpg "CFG generation for await/async" should { "be correct for await/async" in { implicit val cpg: Cpg = code("async function x(foo) { await foo() }") - succOf("x", NodeTypes.METHOD) shouldBe expected(("foo", AlwaysEdge)) - succOf("foo", NodeTypes.IDENTIFIER) shouldBe expected(("this", AlwaysEdge)) - succOf("this", NodeTypes.IDENTIFIER) shouldBe expected(("foo()", AlwaysEdge)) - succOf("foo()") shouldBe expected(("await foo()", AlwaysEdge)) - succOf("await foo()") shouldBe expected(("RET", AlwaysEdge)) + succOf("x", NodeTypes.METHOD) should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("this", AlwaysEdge)) + succOf("this", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("foo()", AlwaysEdge)) + succOf("foo()") should contain theSameElementsAs expected(("await foo()", AlwaysEdge)) + succOf("await foo()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } "CFG generation for instanceof/delete" should { "be correct for instanceof" in { implicit val cpg: Cpg = code("x instanceof Foo") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("Foo", AlwaysEdge)) - succOf("Foo") shouldBe expected(("x instanceof Foo", AlwaysEdge)) - succOf("x instanceof Foo", NodeTypes.CALL) shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("Foo", AlwaysEdge)) + succOf("Foo") should contain theSameElementsAs expected(("x instanceof Foo", AlwaysEdge)) + succOf("x instanceof Foo", NodeTypes.CALL) should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for delete" in { implicit val cpg: Cpg = code("delete foo.x") - succOf(":program") shouldBe expected(("foo", AlwaysEdge)) - succOf("foo") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("foo.x", AlwaysEdge)) - succOf("foo.x") shouldBe expected(("delete foo.x", AlwaysEdge)) - succOf("delete foo.x", NodeTypes.CALL) shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("foo.x", AlwaysEdge)) + succOf("foo.x") should contain theSameElementsAs expected(("delete foo.x", AlwaysEdge)) + succOf("delete foo.x", NodeTypes.CALL) should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } "CFG generation for default parameters" should { "be correct for method parameter with default" in { implicit val cpg: Cpg = code("function foo(a = 1) { }") - cpg.method.nameExact("foo").parameter.code.l shouldBe List("this", "a = 1") - - succOf("foo", NodeTypes.METHOD) shouldBe expected(("a", AlwaysEdge)) - succOf("a", NodeTypes.IDENTIFIER) shouldBe expected(("a", 1, AlwaysEdge)) - succOf("a", 1) shouldBe expected(("void 0", AlwaysEdge)) - succOf("void 0") shouldBe expected(("a === void 0", AlwaysEdge)) - succOf("a === void 0") shouldBe expected(("1", TrueEdge), ("a", 2, FalseEdge)) - succOf("1") shouldBe expected(("a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a", 2) shouldBe expected(("a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a === void 0 ? 1 : a") shouldBe expected(("a = a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a = a === void 0 ? 1 : a") shouldBe expected(("RET", AlwaysEdge)) + cpg.method.nameExact("foo").parameter.code.l should contain theSameElementsAs List("this", "a = 1") + + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("a", 1, AlwaysEdge)) + succOf("a", 1) should contain theSameElementsAs expected(("void 0", AlwaysEdge)) + succOf("void 0") should contain theSameElementsAs expected(("a === void 0", AlwaysEdge)) + succOf("a === void 0") should contain theSameElementsAs expected(("1", TrueEdge), ("a", 2, FalseEdge)) + succOf("1") should contain theSameElementsAs expected(("a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a", 2) should contain theSameElementsAs expected(("a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a === void 0 ? 1 : a") should contain theSameElementsAs expected(("a = a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a = a === void 0 ? 1 : a") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for multiple method parameters with default" in { implicit val cpg: Cpg = code("function foo(a = 1, b = 2) { }") - cpg.method.nameExact("foo").parameter.code.l shouldBe List("this", "a = 1", "b = 2") - - succOf("foo", NodeTypes.METHOD) shouldBe expected(("a", AlwaysEdge)) - succOf("a", NodeTypes.IDENTIFIER) shouldBe expected(("a", 1, AlwaysEdge)) - succOf("a", 1) shouldBe expected(("void 0", AlwaysEdge)) - succOf("void 0") shouldBe expected(("a === void 0", AlwaysEdge)) - succOf("a === void 0") shouldBe expected(("1", TrueEdge), ("a", 2, FalseEdge)) - succOf("1") shouldBe expected(("a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a", 2) shouldBe expected(("a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a === void 0 ? 1 : a") shouldBe expected(("a = a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a = a === void 0 ? 1 : a") shouldBe expected(("b", AlwaysEdge)) - - succOf("b", NodeTypes.IDENTIFIER) shouldBe expected(("b", 1, AlwaysEdge)) - succOf("b", 1) shouldBe expected(("void 0", 1, AlwaysEdge)) - succOf("void 0", 1) shouldBe expected(("b === void 0", AlwaysEdge)) - succOf("b === void 0") shouldBe expected(("2", TrueEdge), ("b", 2, FalseEdge)) - succOf("2") shouldBe expected(("b === void 0 ? 2 : b", AlwaysEdge)) - succOf("b", 2) shouldBe expected(("b === void 0 ? 2 : b", AlwaysEdge)) - succOf("b === void 0 ? 2 : b") shouldBe expected(("b = b === void 0 ? 2 : b", AlwaysEdge)) - succOf("b = b === void 0 ? 2 : b") shouldBe expected(("RET", AlwaysEdge)) + cpg.method.nameExact("foo").parameter.code.l should contain theSameElementsAs List("this", "a = 1", "b = 2") + + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("a", 1, AlwaysEdge)) + succOf("a", 1) should contain theSameElementsAs expected(("void 0", AlwaysEdge)) + succOf("void 0") should contain theSameElementsAs expected(("a === void 0", AlwaysEdge)) + succOf("a === void 0") should contain theSameElementsAs expected(("1", TrueEdge), ("a", 2, FalseEdge)) + succOf("1") should contain theSameElementsAs expected(("a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a", 2) should contain theSameElementsAs expected(("a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a === void 0 ? 1 : a") should contain theSameElementsAs expected(("a = a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a = a === void 0 ? 1 : a") should contain theSameElementsAs expected(("b", AlwaysEdge)) + + succOf("b", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("b", 1, AlwaysEdge)) + succOf("b", 1) should contain theSameElementsAs expected(("void 0", 1, AlwaysEdge)) + succOf("void 0", 1) should contain theSameElementsAs expected(("b === void 0", AlwaysEdge)) + succOf("b === void 0") should contain theSameElementsAs expected(("2", TrueEdge), ("b", 2, FalseEdge)) + succOf("2") should contain theSameElementsAs expected(("b === void 0 ? 2 : b", AlwaysEdge)) + succOf("b", 2) should contain theSameElementsAs expected(("b === void 0 ? 2 : b", AlwaysEdge)) + succOf("b === void 0 ? 2 : b") should contain theSameElementsAs expected(("b = b === void 0 ? 2 : b", AlwaysEdge)) + succOf("b = b === void 0 ? 2 : b") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for method mixed parameters with default" in { implicit val cpg: Cpg = code("function foo(a, b = 1) { }") - cpg.method.nameExact("foo").parameter.code.l shouldBe List("this", "a", "b = 1") - - succOf("foo", NodeTypes.METHOD) shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("b", 1, AlwaysEdge)) - succOf("b", 1) shouldBe expected(("void 0", AlwaysEdge)) - succOf("void 0") shouldBe expected(("b === void 0", AlwaysEdge)) - succOf("b === void 0") shouldBe expected(("1", TrueEdge), ("b", 2, FalseEdge)) - succOf("1") shouldBe expected(("b === void 0 ? 1 : b", AlwaysEdge)) - succOf("b", 2) shouldBe expected(("b === void 0 ? 1 : b", AlwaysEdge)) - succOf("b === void 0 ? 1 : b") shouldBe expected(("b = b === void 0 ? 1 : b", AlwaysEdge)) - succOf("b = b === void 0 ? 1 : b") shouldBe expected(("RET", AlwaysEdge)) + cpg.method.nameExact("foo").parameter.code.l should contain theSameElementsAs List("this", "a", "b = 1") + + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("b", 1, AlwaysEdge)) + succOf("b", 1) should contain theSameElementsAs expected(("void 0", AlwaysEdge)) + succOf("void 0") should contain theSameElementsAs expected(("b === void 0", AlwaysEdge)) + succOf("b === void 0") should contain theSameElementsAs expected(("1", TrueEdge), ("b", 2, FalseEdge)) + succOf("1") should contain theSameElementsAs expected(("b === void 0 ? 1 : b", AlwaysEdge)) + succOf("b", 2) should contain theSameElementsAs expected(("b === void 0 ? 1 : b", AlwaysEdge)) + succOf("b === void 0 ? 1 : b") should contain theSameElementsAs expected(("b = b === void 0 ? 1 : b", AlwaysEdge)) + succOf("b = b === void 0 ? 1 : b") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for multiple method mixed parameters with default" in { implicit val cpg: Cpg = code("function foo(x, a = 1, b = 2) { }") - cpg.method.nameExact("foo").parameter.code.l shouldBe List("this", "x", "a = 1", "b = 2") - - succOf("foo", NodeTypes.METHOD) shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("a", 1, AlwaysEdge)) - succOf("a", 1) shouldBe expected(("void 0", AlwaysEdge)) - succOf("void 0") shouldBe expected(("a === void 0", AlwaysEdge)) - succOf("a === void 0") shouldBe expected(("1", TrueEdge), ("a", 2, FalseEdge)) - succOf("1") shouldBe expected(("a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a", 2) shouldBe expected(("a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a === void 0 ? 1 : a") shouldBe expected(("a = a === void 0 ? 1 : a", AlwaysEdge)) - succOf("a = a === void 0 ? 1 : a") shouldBe expected(("b", AlwaysEdge)) - - succOf("b") shouldBe expected(("b", 1, AlwaysEdge)) - succOf("b", 1) shouldBe expected(("void 0", 1, AlwaysEdge)) - succOf("void 0", 1) shouldBe expected(("b === void 0", AlwaysEdge)) - succOf("b === void 0") shouldBe expected(("2", TrueEdge), ("b", 2, FalseEdge)) - succOf("2") shouldBe expected(("b === void 0 ? 2 : b", AlwaysEdge)) - succOf("b", 2) shouldBe expected(("b === void 0 ? 2 : b", AlwaysEdge)) - succOf("b === void 0 ? 2 : b") shouldBe expected(("b = b === void 0 ? 2 : b", AlwaysEdge)) - succOf("b = b === void 0 ? 2 : b") shouldBe expected(("RET", AlwaysEdge)) + cpg.method.nameExact("foo").parameter.code.l should contain theSameElementsAs List("this", "x", "a = 1", "b = 2") + + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("a", 1, AlwaysEdge)) + succOf("a", 1) should contain theSameElementsAs expected(("void 0", AlwaysEdge)) + succOf("void 0") should contain theSameElementsAs expected(("a === void 0", AlwaysEdge)) + succOf("a === void 0") should contain theSameElementsAs expected(("1", TrueEdge), ("a", 2, FalseEdge)) + succOf("1") should contain theSameElementsAs expected(("a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a", 2) should contain theSameElementsAs expected(("a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a === void 0 ? 1 : a") should contain theSameElementsAs expected(("a = a === void 0 ? 1 : a", AlwaysEdge)) + succOf("a = a === void 0 ? 1 : a") should contain theSameElementsAs expected(("b", AlwaysEdge)) + + succOf("b") should contain theSameElementsAs expected(("b", 1, AlwaysEdge)) + succOf("b", 1) should contain theSameElementsAs expected(("void 0", 1, AlwaysEdge)) + succOf("void 0", 1) should contain theSameElementsAs expected(("b === void 0", AlwaysEdge)) + succOf("b === void 0") should contain theSameElementsAs expected(("2", TrueEdge), ("b", 2, FalseEdge)) + succOf("2") should contain theSameElementsAs expected(("b === void 0 ? 2 : b", AlwaysEdge)) + succOf("b", 2) should contain theSameElementsAs expected(("b === void 0 ? 2 : b", AlwaysEdge)) + succOf("b === void 0 ? 2 : b") should contain theSameElementsAs expected(("b = b === void 0 ? 2 : b", AlwaysEdge)) + succOf("b = b === void 0 ? 2 : b") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/SimpleCfgCreationPassTests.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/SimpleCfgCreationPassTests.scala index 9a290cbb5931..35caf9728ac7 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/SimpleCfgCreationPassTests.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/passes/cfg/SimpleCfgCreationPassTests.scala @@ -11,85 +11,99 @@ class SimpleCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCp "CFG generation for simple fragments" should { "have correct structure for block expression" in { implicit val cpg: Cpg = code("let x = (class Foo {}, bar())") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("class Foo", AlwaysEdge)) - succOf("class Foo") shouldBe expected(("bar", AlwaysEdge)) - succOf("bar") shouldBe expected(("this", AlwaysEdge)) - succOf("this", NodeTypes.IDENTIFIER) shouldBe expected(("bar()", AlwaysEdge)) - succOf("bar()") shouldBe expected(("class Foo {}, bar()", AlwaysEdge)) - succOf("class Foo {}, bar()") shouldBe expected(("let x = (class Foo {}, bar())", AlwaysEdge)) - succOf("let x = (class Foo {}, bar())") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("class Foo", AlwaysEdge)) + succOf("class Foo") should contain theSameElementsAs expected(("bar", AlwaysEdge)) + succOf("bar") should contain theSameElementsAs expected(("this", AlwaysEdge)) + succOf("this", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("bar()", AlwaysEdge)) + succOf("bar()") should contain theSameElementsAs expected(("class Foo {}, bar()", AlwaysEdge)) + succOf("class Foo {}, bar()") should contain theSameElementsAs expected( + ("let x = (class Foo {}, bar())", AlwaysEdge) + ) + succOf("let x = (class Foo {}, bar())") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "have correct structure for empty array literal" in { implicit val cpg: Cpg = code("var x = []") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("__ecma.Array.factory()", AlwaysEdge)) - succOf("__ecma.Array.factory()") shouldBe expected(("var x = []", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("__ecma.Array.factory()", AlwaysEdge)) + succOf("__ecma.Array.factory()") should contain theSameElementsAs expected(("var x = []", AlwaysEdge)) } "have correct structure for array literal with values" in { implicit val cpg: Cpg = code("var x = [1, 2]") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("__ecma.Array.factory()", AlwaysEdge)) - succOf("__ecma.Array.factory()") shouldBe expected(("_tmp_0 = __ecma.Array.factory()", AlwaysEdge)) - - succOf("_tmp_0 = __ecma.Array.factory()") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("push", AlwaysEdge)) - succOf("push") shouldBe expected(("_tmp_0.push", AlwaysEdge)) - succOf("_tmp_0.push") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("_tmp_0.push(1)", AlwaysEdge)) - - succOf("_tmp_0.push(1)") shouldBe expected(("_tmp_0", 3, AlwaysEdge)) - succOf("_tmp_0", 3) shouldBe expected(("push", 1, AlwaysEdge)) - succOf("push", 1) shouldBe expected(("_tmp_0.push", 1, AlwaysEdge)) - succOf("_tmp_0.push", 1) shouldBe expected(("_tmp_0", 4, AlwaysEdge)) - succOf("_tmp_0", 4) shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("_tmp_0.push(2)", AlwaysEdge)) - - succOf("_tmp_0.push(2)") shouldBe expected(("_tmp_0", 5, AlwaysEdge)) - succOf("_tmp_0", 5) shouldBe expected(("[1, 2]", AlwaysEdge)) - succOf("[1, 2]") shouldBe expected(("var x = [1, 2]", AlwaysEdge)) - succOf("var x = [1, 2]") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("__ecma.Array.factory()", AlwaysEdge)) + succOf("__ecma.Array.factory()") should contain theSameElementsAs expected( + ("_tmp_0 = __ecma.Array.factory()", AlwaysEdge) + ) + + succOf("_tmp_0 = __ecma.Array.factory()") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("push", AlwaysEdge)) + succOf("push") should contain theSameElementsAs expected(("_tmp_0.push", AlwaysEdge)) + succOf("_tmp_0.push") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("_tmp_0.push(1)", AlwaysEdge)) + + succOf("_tmp_0.push(1)") should contain theSameElementsAs expected(("_tmp_0", 3, AlwaysEdge)) + succOf("_tmp_0", 3) should contain theSameElementsAs expected(("push", 1, AlwaysEdge)) + succOf("push", 1) should contain theSameElementsAs expected(("_tmp_0.push", 1, AlwaysEdge)) + succOf("_tmp_0.push", 1) should contain theSameElementsAs expected(("_tmp_0", 4, AlwaysEdge)) + succOf("_tmp_0", 4) should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("_tmp_0.push(2)", AlwaysEdge)) + + succOf("_tmp_0.push(2)") should contain theSameElementsAs expected(("_tmp_0", 5, AlwaysEdge)) + succOf("_tmp_0", 5) should contain theSameElementsAs expected(("[1, 2]", AlwaysEdge)) + succOf("[1, 2]") should contain theSameElementsAs expected(("var x = [1, 2]", AlwaysEdge)) + succOf("var x = [1, 2]") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "have correct structure for untagged runtime node in call" in { implicit val cpg: Cpg = code(s"foo(`Hello $${world}!`)") - succOf(":program") shouldBe expected(("foo", AlwaysEdge)) - succOf("foo") shouldBe expected(("this", AlwaysEdge)) - succOf("this", NodeTypes.IDENTIFIER) shouldBe expected(("\"Hello \"", AlwaysEdge)) - succOf("\"Hello \"") shouldBe expected(("world", AlwaysEdge)) - succOf("world") shouldBe expected(("\"!\"", AlwaysEdge)) - succOf("\"!\"") shouldBe expected((s"${Operators.formatString}(\"Hello \", world, \"!\")", AlwaysEdge)) - succOf(s"${Operators.formatString}(\"Hello \", world, \"!\")") shouldBe expected( + succOf(":program") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("this", AlwaysEdge)) + succOf("this", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("\"Hello \"", AlwaysEdge)) + succOf("\"Hello \"") should contain theSameElementsAs expected(("world", AlwaysEdge)) + succOf("world") should contain theSameElementsAs expected(("\"!\"", AlwaysEdge)) + succOf("\"!\"") should contain theSameElementsAs expected( + (s"${Operators.formatString}(\"Hello \", world, \"!\")", AlwaysEdge) + ) + succOf(s"${Operators.formatString}(\"Hello \", world, \"!\")") should contain theSameElementsAs expected( (s"foo(`Hello $${world}!`)", AlwaysEdge) ) - succOf(s"foo(`Hello $${world}!`)") shouldBe expected(("RET", AlwaysEdge)) + succOf(s"foo(`Hello $${world}!`)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "have correct structure for untagged runtime node" in { implicit val cpg: Cpg = code(s"`$${x + 1}`") - succOf(":program") shouldBe expected(("\"\"", AlwaysEdge)) - succOf("\"\"") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x + 1", AlwaysEdge)) - succOf("x + 1") shouldBe expected(("\"\"", 1, AlwaysEdge)) - succOf("\"\"", 1) shouldBe expected((s"${Operators.formatString}(\"\", x + 1, \"\")", AlwaysEdge)) - succOf(s"${Operators.formatString}(\"\", x + 1, \"\")") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("\"\"", AlwaysEdge)) + succOf("\"\"") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x + 1", AlwaysEdge)) + succOf("x + 1") should contain theSameElementsAs expected(("\"\"", 1, AlwaysEdge)) + succOf("\"\"", 1) should contain theSameElementsAs expected( + (s"${Operators.formatString}(\"\", x + 1, \"\")", AlwaysEdge) + ) + succOf(s"${Operators.formatString}(\"\", x + 1, \"\")") should contain theSameElementsAs expected( + ("RET", AlwaysEdge) + ) } "have correct structure for tagged runtime node" in { implicit val cpg: Cpg = code(s"String.raw`../$${42}\\..`") - succOf(":program") shouldBe expected(("\"../\"", AlwaysEdge)) - succOf("\"../\"") shouldBe expected(("42", AlwaysEdge)) - succOf("42") shouldBe expected(("\"\\..\"", AlwaysEdge)) - succOf("\"\\..\"") shouldBe expected((s"${Operators.formatString}(\"../\", 42, \"\\..\")", AlwaysEdge)) - succOf(s"${Operators.formatString}(\"../\", 42, \"\\..\")") shouldBe expected( + succOf(":program") should contain theSameElementsAs expected(("\"../\"", AlwaysEdge)) + succOf("\"../\"") should contain theSameElementsAs expected(("42", AlwaysEdge)) + succOf("42") should contain theSameElementsAs expected(("\"\\..\"", AlwaysEdge)) + succOf("\"\\..\"") should contain theSameElementsAs expected( + (s"${Operators.formatString}(\"../\", 42, \"\\..\")", AlwaysEdge) + ) + succOf(s"${Operators.formatString}(\"../\", 42, \"\\..\")") should contain theSameElementsAs expected( (s"String.raw(${Operators.formatString}(\"../\", 42, \"\\..\"))", AlwaysEdge) ) - succOf(s"String.raw(${Operators.formatString}(\"../\", 42, \"\\..\"))") shouldBe expected(("RET", AlwaysEdge)) + succOf(s"String.raw(${Operators.formatString}(\"../\", 42, \"\\..\"))") should contain theSameElementsAs expected( + ("RET", AlwaysEdge) + ) } "be correct for try" in { @@ -102,13 +116,13 @@ class SimpleCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCp | close() |} |""".stripMargin) - succOf(":program") shouldBe expected(("open", AlwaysEdge)) - succOf("open") shouldBe expected(("this", AlwaysEdge)) - succOf("this", NodeTypes.IDENTIFIER) shouldBe expected(("open()", AlwaysEdge)) - succOf("open()") shouldBe expected(("err", AlwaysEdge), ("close", AlwaysEdge)) - succOf("err") shouldBe expected(("handle", AlwaysEdge)) - succOf("handle()") shouldBe expected(("close", AlwaysEdge)) - succOf("close()") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("open", AlwaysEdge)) + succOf("open") should contain theSameElementsAs expected(("this", AlwaysEdge)) + succOf("this", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("open()", AlwaysEdge)) + succOf("open()") should contain theSameElementsAs expected(("err", AlwaysEdge), ("close", AlwaysEdge)) + succOf("err") should contain theSameElementsAs expected(("handle", AlwaysEdge)) + succOf("handle()") should contain theSameElementsAs expected(("close", AlwaysEdge)) + succOf("close()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for try with multiple CFG exit nodes in try block" in { @@ -125,14 +139,14 @@ class SimpleCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCp | close() |} |""".stripMargin) - succOf(":program") shouldBe expected(("true", AlwaysEdge)) - succOf("true") shouldBe expected(("doA", TrueEdge), ("doB", FalseEdge)) - succOf("doA()") shouldBe expected(("err", AlwaysEdge), ("close", AlwaysEdge)) - succOf("err") shouldBe expected(("handle", AlwaysEdge)) - succOf("doB()") shouldBe expected(("err", AlwaysEdge), ("close", AlwaysEdge)) - succOf("err") shouldBe expected(("handle", AlwaysEdge)) - succOf("handle()") shouldBe expected(("close", AlwaysEdge)) - succOf("close()") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("true", AlwaysEdge)) + succOf("true") should contain theSameElementsAs expected(("doA", TrueEdge), ("doB", FalseEdge)) + succOf("doA()") should contain theSameElementsAs expected(("err", AlwaysEdge), ("close", AlwaysEdge)) + succOf("err") should contain theSameElementsAs expected(("handle", AlwaysEdge)) + succOf("doB()") should contain theSameElementsAs expected(("err", AlwaysEdge), ("close", AlwaysEdge)) + succOf("err") should contain theSameElementsAs expected(("handle", AlwaysEdge)) + succOf("handle()") should contain theSameElementsAs expected(("close", AlwaysEdge)) + succOf("close()") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for 1 object with simple values" in { @@ -142,133 +156,135 @@ class SimpleCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCp | key2: 2 |} |""".stripMargin) - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("key1", AlwaysEdge)) - succOf("key1") shouldBe expected(("_tmp_0.key1", AlwaysEdge)) - succOf("_tmp_0.key1") shouldBe expected(("\"value\"", AlwaysEdge)) - succOf("\"value\"") shouldBe expected(("_tmp_0.key1 = \"value\"", AlwaysEdge)) - - succOf("_tmp_0.key1 = \"value\"") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("key2", AlwaysEdge)) - succOf("key2") shouldBe expected(("_tmp_0.key2", AlwaysEdge)) - succOf("_tmp_0.key2") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("_tmp_0.key2 = 2", AlwaysEdge)) - - succOf("_tmp_0.key2 = 2") shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("{\n key1: \"value\",\n key2: 2\n}", AlwaysEdge)) - succOf("{\n key1: \"value\",\n key2: 2\n}") shouldBe expected( + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("key1", AlwaysEdge)) + succOf("key1") should contain theSameElementsAs expected(("_tmp_0.key1", AlwaysEdge)) + succOf("_tmp_0.key1") should contain theSameElementsAs expected(("\"value\"", AlwaysEdge)) + succOf("\"value\"") should contain theSameElementsAs expected(("_tmp_0.key1 = \"value\"", AlwaysEdge)) + + succOf("_tmp_0.key1 = \"value\"") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("key2", AlwaysEdge)) + succOf("key2") should contain theSameElementsAs expected(("_tmp_0.key2", AlwaysEdge)) + succOf("_tmp_0.key2") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("_tmp_0.key2 = 2", AlwaysEdge)) + + succOf("_tmp_0.key2 = 2") should contain theSameElementsAs expected(("_tmp_0", 2, AlwaysEdge)) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("{\n key1: \"value\",\n key2: 2\n}", AlwaysEdge)) + succOf("{\n key1: \"value\",\n key2: 2\n}") should contain theSameElementsAs expected( ("var x = {\n key1: \"value\",\n key2: 2\n}", AlwaysEdge) ) - succOf("var x = {\n key1: \"value\",\n key2: 2\n}") shouldBe expected(("RET", AlwaysEdge)) + succOf("var x = {\n key1: \"value\",\n key2: 2\n}") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for member access used in an assignment (chained)" in { implicit val cpg: Cpg = code("a.b = c.z;") - succOf(":program") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("a.b", AlwaysEdge)) - succOf("a.b") shouldBe expected(("c", AlwaysEdge)) - succOf("c") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("c.z", AlwaysEdge)) - succOf("c.z") shouldBe expected(("a.b = c.z", AlwaysEdge)) - succOf("a.b = c.z") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("a.b", AlwaysEdge)) + succOf("a.b") should contain theSameElementsAs expected(("c", AlwaysEdge)) + succOf("c") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("c.z", AlwaysEdge)) + succOf("c.z") should contain theSameElementsAs expected(("a.b = c.z", AlwaysEdge)) + succOf("a.b = c.z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for decl statement with assignment" in { implicit val cpg: Cpg = code("var x = 1;") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("var x = 1", AlwaysEdge)) - succOf("var x = 1") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("var x = 1", AlwaysEdge)) + succOf("var x = 1") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for nested expression" in { implicit val cpg: Cpg = code("x = y + 1;") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y + 1", AlwaysEdge)) - succOf("y + 1") shouldBe expected(("x = y + 1", AlwaysEdge)) - succOf("x = y + 1") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y + 1", AlwaysEdge)) + succOf("y + 1") should contain theSameElementsAs expected(("x = y + 1", AlwaysEdge)) + succOf("x = y + 1") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for return statement" in { implicit val cpg: Cpg = code("function foo(x) { return x; }") - succOf("foo", NodeTypes.METHOD) shouldBe expected(("x", AlwaysEdge)) - succOf("x", NodeTypes.IDENTIFIER) shouldBe expected(("return x", AlwaysEdge)) - succOf("return x") shouldBe expected(("RET", AlwaysEdge)) + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("return x", AlwaysEdge)) + succOf("return x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for consecutive return statements" in { implicit val cpg: Cpg = code("function foo(x, y) { return x; return y; }") - succOf("foo", NodeTypes.METHOD) shouldBe expected(("x", AlwaysEdge)) - succOf("x", NodeTypes.IDENTIFIER) shouldBe expected(("return x", AlwaysEdge)) - succOf("y", NodeTypes.IDENTIFIER) shouldBe expected(("return y", AlwaysEdge)) - succOf("return x") shouldBe expected(("RET", AlwaysEdge)) - succOf("return y") shouldBe expected(("RET", AlwaysEdge)) + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("return x", AlwaysEdge)) + succOf("y", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("return y", AlwaysEdge)) + succOf("return x") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("return y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for outer program function which declares foo function object" in { implicit val cpg: Cpg = code("function foo(x, y) { return; }") - succOf(":program", NodeTypes.METHOD) shouldBe expected(("foo", 2, AlwaysEdge)) - succOf("foo", NodeTypes.IDENTIFIER) shouldBe expected(("foo", 3, AlwaysEdge)) - succOf("foo", NodeTypes.METHOD_REF) shouldBe expected( + succOf(":program", NodeTypes.METHOD) should contain theSameElementsAs expected(("foo", 2, AlwaysEdge)) + succOf("foo", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("foo", 3, AlwaysEdge)) + succOf("foo", NodeTypes.METHOD_REF) should contain theSameElementsAs expected( ("function foo = function foo(x, y) { return; }", AlwaysEdge) ) - succOf("function foo = function foo(x, y) { return; }") shouldBe expected(("RET", AlwaysEdge)) + succOf("function foo = function foo(x, y) { return; }") should contain theSameElementsAs expected( + ("RET", AlwaysEdge) + ) } "be correct for void return statement" in { implicit val cpg: Cpg = code("function foo() { return; }") - succOf("foo", NodeTypes.METHOD) shouldBe expected(("return", AlwaysEdge)) - succOf("return") shouldBe expected(("RET", AlwaysEdge)) + succOf("foo", NodeTypes.METHOD) should contain theSameElementsAs expected(("return", AlwaysEdge)) + succOf("return") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for call expression" in { implicit val cpg: Cpg = code("foo(a + 1, b);") - succOf(":program") shouldBe expected(("foo", AlwaysEdge)) - succOf("foo") shouldBe expected(("this", AlwaysEdge)) - succOf("this", NodeTypes.IDENTIFIER) shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("a + 1", AlwaysEdge)) - succOf("a + 1") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("foo(a + 1, b)", AlwaysEdge)) - succOf("foo(a + 1, b)") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("this", AlwaysEdge)) + succOf("this", NodeTypes.IDENTIFIER) should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("a + 1", AlwaysEdge)) + succOf("a + 1") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("foo(a + 1, b)", AlwaysEdge)) + succOf("foo(a + 1, b)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for chained calls" in { implicit val cpg: Cpg = code("x.foo(y).bar(z)") - succOf(":program") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("foo", AlwaysEdge)) - succOf("foo") shouldBe expected(("x.foo", AlwaysEdge)) - succOf("x.foo") shouldBe expected(("x", 1, AlwaysEdge)) - succOf("x", 1) shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("x.foo(y)", AlwaysEdge)) - succOf("x.foo(y)") shouldBe expected(("(_tmp_0 = x.foo(y))", AlwaysEdge)) - succOf("(_tmp_0 = x.foo(y))") shouldBe expected(("bar", AlwaysEdge)) - succOf("bar") shouldBe expected(("(_tmp_0 = x.foo(y)).bar", AlwaysEdge)) - succOf("(_tmp_0 = x.foo(y)).bar") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("x.foo(y).bar(z)", AlwaysEdge)) - succOf("x.foo(y).bar(z)") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("x.foo", AlwaysEdge)) + succOf("x.foo") should contain theSameElementsAs expected(("x", 1, AlwaysEdge)) + succOf("x", 1) should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x.foo(y)", AlwaysEdge)) + succOf("x.foo(y)") should contain theSameElementsAs expected(("(_tmp_0 = x.foo(y))", AlwaysEdge)) + succOf("(_tmp_0 = x.foo(y))") should contain theSameElementsAs expected(("bar", AlwaysEdge)) + succOf("bar") should contain theSameElementsAs expected(("(_tmp_0 = x.foo(y)).bar", AlwaysEdge)) + succOf("(_tmp_0 = x.foo(y)).bar") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("x.foo(y).bar(z)", AlwaysEdge)) + succOf("x.foo(y).bar(z)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for unary expression '++'" in { implicit val cpg: Cpg = code("x++") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("x++", AlwaysEdge)) - succOf("x++") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("x++", AlwaysEdge)) + succOf("x++") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for conditional expression" in { implicit val cpg: Cpg = code("x ? y : z;") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("z", FalseEdge)) - succOf("y") shouldBe expected(("x ? y : z", AlwaysEdge)) - succOf("z") shouldBe expected(("x ? y : z", AlwaysEdge)) - succOf("x ? y : z") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("z", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("x ? y : z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("x ? y : z", AlwaysEdge)) + succOf("x ? y : z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for labeled expressions with continue" in { @@ -283,98 +299,101 @@ class SimpleCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCp | } |} |""".stripMargin) - succOf(":program") shouldBe expected(("var i, j;", AlwaysEdge)) - succOf("loop1:") shouldBe expected(("i", AlwaysEdge)) - succOf("i") shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("i = 0", AlwaysEdge)) - succOf("i = 0") shouldBe expected(("i", 1, AlwaysEdge)) - succOf("i", 1) shouldBe expected(("3", AlwaysEdge)) - succOf("3") shouldBe expected(("i < 3", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("var i, j;", AlwaysEdge)) + succOf("loop1:") should contain theSameElementsAs expected(("i", AlwaysEdge)) + succOf("i") should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("i = 0", AlwaysEdge)) + succOf("i = 0") should contain theSameElementsAs expected(("i", 1, AlwaysEdge)) + succOf("i", 1) should contain theSameElementsAs expected(("3", AlwaysEdge)) + succOf("3") should contain theSameElementsAs expected(("i < 3", AlwaysEdge)) import io.shiftleft.semanticcpg.language._ val codeStr = cpg.method.ast.code(".*loop1:.*").code.head - succOf("i < 3") shouldBe expected(("loop2:", AlwaysEdge), (codeStr, AlwaysEdge)) - succOf(codeStr) shouldBe expected(("RET", AlwaysEdge)) + succOf("i < 3") should contain theSameElementsAs expected(("loop2:", AlwaysEdge), (codeStr, AlwaysEdge)) + succOf(codeStr) should contain theSameElementsAs expected(("RET", AlwaysEdge)) - succOf("loop2:") shouldBe expected(("j", AlwaysEdge)) - succOf("j") shouldBe expected(("0", 1, AlwaysEdge)) - succOf("0", 1) shouldBe expected(("j = 0", AlwaysEdge)) - succOf("j = 0") shouldBe expected(("j", 1, AlwaysEdge)) - succOf("j", 1) shouldBe expected(("3", 1, AlwaysEdge)) - succOf("3", 1) shouldBe expected(("j < 3", AlwaysEdge)) + succOf("loop2:") should contain theSameElementsAs expected(("j", AlwaysEdge)) + succOf("j") should contain theSameElementsAs expected(("0", 1, AlwaysEdge)) + succOf("0", 1) should contain theSameElementsAs expected(("j = 0", AlwaysEdge)) + succOf("j = 0") should contain theSameElementsAs expected(("j", 1, AlwaysEdge)) + succOf("j", 1) should contain theSameElementsAs expected(("3", 1, AlwaysEdge)) + succOf("3", 1) should contain theSameElementsAs expected(("j < 3", AlwaysEdge)) val code2 = cpg.method.ast.isBlock.code("loop2: for.*").code.head - succOf("j < 3") shouldBe expected((code2, AlwaysEdge), ("i", 2, AlwaysEdge)) - succOf(code2) shouldBe expected(("i", 2, AlwaysEdge)) - - succOf("i", 2) shouldBe expected(("i++", AlwaysEdge)) - succOf("i++") shouldBe expected(("i", 3, AlwaysEdge)) - succOf("i", 3) shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("i === 1", AlwaysEdge)) - succOf("i === 1") shouldBe expected(("j", AlwaysEdge), ("i === 1 && j === 1", AlwaysEdge)) - succOf("i === 1 && j === 1") shouldBe expected(("continue loop1;", AlwaysEdge), ("console", AlwaysEdge)) - succOf("continue loop1;") shouldBe expected(("loop1:", AlwaysEdge)) - succOf("console") shouldBe expected(("log", AlwaysEdge)) - succOf("log") shouldBe expected(("console.log", AlwaysEdge)) + succOf("j < 3") should contain theSameElementsAs expected((code2, AlwaysEdge), ("i", 2, AlwaysEdge)) + succOf(code2) should contain theSameElementsAs expected(("i", 2, AlwaysEdge)) + + succOf("i", 2) should contain theSameElementsAs expected(("i++", AlwaysEdge)) + succOf("i++") should contain theSameElementsAs expected(("i", 3, AlwaysEdge)) + succOf("i", 3) should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("i === 1", AlwaysEdge)) + succOf("i === 1") should contain theSameElementsAs expected(("j", AlwaysEdge), ("i === 1 && j === 1", AlwaysEdge)) + succOf("i === 1 && j === 1") should contain theSameElementsAs expected( + ("continue loop1;", AlwaysEdge), + ("console", AlwaysEdge) + ) + succOf("continue loop1;") should contain theSameElementsAs expected(("loop1:", AlwaysEdge)) + succOf("console") should contain theSameElementsAs expected(("log", AlwaysEdge)) + succOf("log") should contain theSameElementsAs expected(("console.log", AlwaysEdge)) } "be correct for plain while loop" in { implicit val cpg: Cpg = code("while (x < 1) { y = 2; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("y = 2", AlwaysEdge)) - succOf("y = 2") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("y = 2", AlwaysEdge)) + succOf("y = 2") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) } "be correct for plain while loop with break" in { implicit val cpg: Cpg = code("while (x < 1) { break; y; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("break;", TrueEdge), ("RET", FalseEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("y") shouldBe expected(("x", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("break;", TrueEdge), ("RET", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", AlwaysEdge)) } "be correct for plain while loop with continue" in { implicit val cpg: Cpg = code("while (x < 1) { continue; y; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("continue;", TrueEdge), ("RET", FalseEdge)) - succOf("continue;") shouldBe expected(("x", AlwaysEdge)) - succOf("y") shouldBe expected(("x", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("continue;", TrueEdge), ("RET", FalseEdge)) + succOf("continue;") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", AlwaysEdge)) } "be correct for nested while loop" in { implicit val cpg: Cpg = code("while (x) {while(y) {z;}}") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("z", TrueEdge), ("x", FalseEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("z", TrueEdge), ("x", FalseEdge)) } "be correct for nested while loop with break" in { implicit val cpg: Cpg = code("while (x) { while(y) { break; z;} a;} b;") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("b", FalseEdge)) - succOf("y") shouldBe expected(("break;", TrueEdge), ("a", FalseEdge)) - succOf("a") shouldBe expected(("x", AlwaysEdge)) - succOf("b") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("b", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("break;", TrueEdge), ("a", FalseEdge)) + succOf("a") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for another nested while loop with break" in { implicit val cpg: Cpg = code("while (x) { while(y) { break; z;} a; break; b; } c;") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("c", FalseEdge)) - succOf("y") shouldBe expected(("break;", TrueEdge), ("a", FalseEdge)) - succOf("break;") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("break;", 1, AlwaysEdge)) - succOf("break;", 1) shouldBe expected(("c", AlwaysEdge)) - succOf("c") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("c", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("break;", TrueEdge), ("a", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("break;", 1, AlwaysEdge)) + succOf("break;", 1) should contain theSameElementsAs expected(("c", AlwaysEdge)) + succOf("c") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "nested while loop with conditional break" in { @@ -388,134 +407,134 @@ class SimpleCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCp | } |} """.stripMargin) - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("break;", TrueEdge), ("z", FalseEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("break;", 1) shouldBe expected(("x", AlwaysEdge)) - succOf("z") shouldBe expected(("break;", 1, TrueEdge), ("x", FalseEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("break;", TrueEdge), ("z", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("break;", 1) should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("break;", 1, TrueEdge), ("x", FalseEdge)) } // DO-WHILE Loops "be correct for plain do-while loop" in { implicit val cpg: Cpg = code("do { y = 2; } while (x < 1);") - succOf(":program") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("y = 2", AlwaysEdge)) - succOf("y = 2") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf(":program") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("y = 2", AlwaysEdge)) + succOf("y = 2") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) } "be correct for plain do-while loop with break" in { implicit val cpg: Cpg = code("do { break; y; } while (x < 1);") - succOf(":program") shouldBe expected(("break;", AlwaysEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("y") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("break;", TrueEdge), ("RET", FalseEdge)) + succOf(":program") should contain theSameElementsAs expected(("break;", AlwaysEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("break;", TrueEdge), ("RET", FalseEdge)) } "be correct for plain do-while loop with continue" in { implicit val cpg: Cpg = code("do { continue; y; } while (x < 1);") - succOf(":program") shouldBe expected(("continue;", AlwaysEdge)) - succOf("continue;") shouldBe expected(("x", AlwaysEdge)) - succOf("y") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("continue;", TrueEdge), ("RET", FalseEdge)) + succOf(":program") should contain theSameElementsAs expected(("continue;", AlwaysEdge)) + succOf("continue;") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("continue;", TrueEdge), ("RET", FalseEdge)) } "be correct for nested do-while loop with continue" in { implicit val cpg: Cpg = code("do { do { x; } while (y); } while (z);") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("x", TrueEdge), ("z", FalseEdge)) - succOf("z") shouldBe expected(("x", TrueEdge), ("RET", FalseEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("x", TrueEdge), ("z", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("x", TrueEdge), ("RET", FalseEdge)) } "be correct for nested while/do-while loops with break" in { implicit val cpg: Cpg = code("while (x) { do { while(y) { break; a; } z; } while (x < 1); } c;") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("c", FalseEdge)) - succOf("y") shouldBe expected(("break;", TrueEdge), ("z", FalseEdge)) - succOf("break;") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("x", 1, AlwaysEdge)) - succOf("x", 1) shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("x < 1", AlwaysEdge)) - succOf("x < 1") shouldBe expected(("y", TrueEdge), ("x", FalseEdge)) - succOf("c") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("c", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("break;", TrueEdge), ("z", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("x", 1, AlwaysEdge)) + succOf("x", 1) should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x < 1", AlwaysEdge)) + succOf("x < 1") should contain theSameElementsAs expected(("y", TrueEdge), ("x", FalseEdge)) + succOf("c") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for nested while/do-while loops with break and continue" in { implicit val cpg: Cpg = code("while(x) { do { break; } while (y) } o;") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("break;", TrueEdge), ("o", FalseEdge)) - succOf("break;") shouldBe expected(("x", AlwaysEdge)) - succOf("o") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("break;", TrueEdge), ("o", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("o") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for two nested while loop with inner break" in { implicit val cpg: Cpg = code("while(y) { while(z) { break; x; } }") - succOf(":program") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("z", TrueEdge), ("RET", FalseEdge)) - succOf("z") shouldBe expected(("break;", TrueEdge), ("y", FalseEdge)) - succOf("break;") shouldBe expected(("y", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("z", TrueEdge), ("RET", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("break;", TrueEdge), ("y", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("y", AlwaysEdge)) } // FOR Loops "be correct for plain for-loop" in { implicit val cpg: Cpg = code("for (x = 0; y < 1; z += 2) { a = 3; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("x = 0", AlwaysEdge)) - succOf("x = 0") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y < 1", AlwaysEdge)) - succOf("y < 1") shouldBe expected(("a", TrueEdge), ("RET", FalseEdge)) - succOf("a") shouldBe expected(("3", AlwaysEdge)) - succOf("3") shouldBe expected(("a = 3", AlwaysEdge)) - succOf("a = 3") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("z += 2", AlwaysEdge)) - succOf("z += 2") shouldBe expected(("y", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("x = 0", AlwaysEdge)) + succOf("x = 0") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y < 1", AlwaysEdge)) + succOf("y < 1") should contain theSameElementsAs expected(("a", TrueEdge), ("RET", FalseEdge)) + succOf("a") should contain theSameElementsAs expected(("3", AlwaysEdge)) + succOf("3") should contain theSameElementsAs expected(("a = 3", AlwaysEdge)) + succOf("a = 3") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("z += 2", AlwaysEdge)) + succOf("z += 2") should contain theSameElementsAs expected(("y", AlwaysEdge)) } "be correct for plain for-loop with break" in { implicit val cpg: Cpg = code("for (x = 0; y < 1; z += 2) { break; a = 3; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("0", AlwaysEdge)) - succOf("x = 0") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y < 1", AlwaysEdge)) - succOf("y < 1") shouldBe expected(("break;", TrueEdge), ("RET", FalseEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("a") shouldBe expected(("3", AlwaysEdge)) - succOf("3") shouldBe expected(("a = 3", AlwaysEdge)) - succOf("a = 3") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("z += 2", AlwaysEdge)) - succOf("z += 2") shouldBe expected(("y", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("x = 0") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y < 1", AlwaysEdge)) + succOf("y < 1") should contain theSameElementsAs expected(("break;", TrueEdge), ("RET", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("3", AlwaysEdge)) + succOf("3") should contain theSameElementsAs expected(("a = 3", AlwaysEdge)) + succOf("a = 3") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("z += 2", AlwaysEdge)) + succOf("z += 2") should contain theSameElementsAs expected(("y", AlwaysEdge)) } "be correct for plain for-loop with continue" in { implicit val cpg: Cpg = code("for (x = 0; y < 1; z += 2) { continue; a = 3; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("0", AlwaysEdge)) - succOf("0") shouldBe expected(("x = 0", AlwaysEdge)) - succOf("x = 0") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y < 1", AlwaysEdge)) - succOf("y < 1") shouldBe expected(("continue;", TrueEdge), ("RET", FalseEdge)) - succOf("continue;") shouldBe expected(("z", AlwaysEdge)) - succOf("a") shouldBe expected(("3", AlwaysEdge)) - succOf("3") shouldBe expected(("a = 3", AlwaysEdge)) - succOf("a = 3") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("z += 2", AlwaysEdge)) - succOf("z += 2") shouldBe expected(("y", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("0", AlwaysEdge)) + succOf("0") should contain theSameElementsAs expected(("x = 0", AlwaysEdge)) + succOf("x = 0") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y < 1", AlwaysEdge)) + succOf("y < 1") should contain theSameElementsAs expected(("continue;", TrueEdge), ("RET", FalseEdge)) + succOf("continue;") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("3", AlwaysEdge)) + succOf("3") should contain theSameElementsAs expected(("a = 3", AlwaysEdge)) + succOf("a = 3") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("z += 2", AlwaysEdge)) + succOf("z += 2") should contain theSameElementsAs expected(("y", AlwaysEdge)) } "be correct for for-loop with for-in" in { @@ -530,193 +549,214 @@ class SimpleCfgCreationPassTests extends CfgTestFixture(() => new JsSrcCfgTestCp "be correct for nested for-loop" in { implicit val cpg: Cpg = code("for (x; y; z) { for (a; b; c) { u; } }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("a", TrueEdge), ("RET", FalseEdge)) - succOf("z") shouldBe expected(("y", AlwaysEdge)) - succOf("a") shouldBe expected(("b", AlwaysEdge)) - succOf("b") shouldBe expected(("u", TrueEdge), ("z", FalseEdge)) - succOf("c") shouldBe expected(("b", AlwaysEdge)) - succOf("u") shouldBe expected(("c", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("a", TrueEdge), ("RET", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("u", TrueEdge), ("z", FalseEdge)) + succOf("c") should contain theSameElementsAs expected(("b", AlwaysEdge)) + succOf("u") should contain theSameElementsAs expected(("c", AlwaysEdge)) } "be correct for for-loop with empty condition" in { implicit val cpg: Cpg = code("for (;;) { a = 1; }") - succOf(":program") shouldBe expected(("true", AlwaysEdge)) - succOf("true") shouldBe expected(("a", TrueEdge), ("RET", FalseEdge)) - succOf("a") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("a = 1", AlwaysEdge)) - succOf("a = 1") shouldBe expected(("true", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("true", AlwaysEdge)) + succOf("true") should contain theSameElementsAs expected(("a", TrueEdge), ("RET", FalseEdge)) + succOf("a") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("a = 1", AlwaysEdge)) + succOf("a = 1") should contain theSameElementsAs expected(("true", AlwaysEdge)) } "be correct for for-loop with empty condition and break" in { implicit val cpg: Cpg = code("for (;;) { break; }") - succOf(":program") shouldBe expected(("true", AlwaysEdge)) - succOf("true") shouldBe expected(("break;", TrueEdge), ("RET", FalseEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("true", AlwaysEdge)) + succOf("true") should contain theSameElementsAs expected(("break;", TrueEdge), ("RET", FalseEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for for-loop with empty condition and continue" in { implicit val cpg: Cpg = code("for (;;) { continue; }") - succOf(":program") shouldBe expected(("true", AlwaysEdge)) - succOf("true") shouldBe expected(("continue;", TrueEdge), ("RET", FalseEdge)) - succOf("continue;") shouldBe expected(("true", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("true", AlwaysEdge)) + succOf("true") should contain theSameElementsAs expected(("continue;", TrueEdge), ("RET", FalseEdge)) + succOf("continue;") should contain theSameElementsAs expected(("true", AlwaysEdge)) } "be correct with empty condition with nested empty for-loop" in { implicit val cpg: Cpg = code("for (;;) { for (;;) { x; } }") - succOf(":program") shouldBe expected(("true", AlwaysEdge)) - succOf("true") shouldBe expected(("true", 1, TrueEdge), ("RET", FalseEdge)) - succOf("true", 1) shouldBe expected(("x", TrueEdge), ("true", 0, FalseEdge)) - succOf("x") shouldBe expected(("true", 1, AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("true", AlwaysEdge)) + succOf("true") should contain theSameElementsAs expected(("true", 1, TrueEdge), ("RET", FalseEdge)) + succOf("true", 1) should contain theSameElementsAs expected(("x", TrueEdge), ("true", 0, FalseEdge)) + succOf("x") should contain theSameElementsAs expected(("true", 1, AlwaysEdge)) } "be correct for for-loop with empty block" in { implicit val cpg: Cpg = code("for (;;) ;") - succOf(":program") shouldBe expected(("true", AlwaysEdge)) - succOf("true") shouldBe expected(("true", TrueEdge), ("RET", FalseEdge)) + succOf(":program") should contain theSameElementsAs expected(("true", AlwaysEdge)) + succOf("true") should contain theSameElementsAs expected(("true", TrueEdge), ("RET", FalseEdge)) } "be correct for simple if statement" in { implicit val cpg: Cpg = code("if (x) { y; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for simple if statement with else block" in { implicit val cpg: Cpg = code("if (x) { y; } else { z; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("z", FalseEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("z", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for nested if statement" in { implicit val cpg: Cpg = code("if (x) { if (y) { z; } }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("y", TrueEdge), ("RET", FalseEdge)) - succOf("y") shouldBe expected(("z", TrueEdge), ("RET", FalseEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("y", TrueEdge), ("RET", FalseEdge)) + succOf("y") should contain theSameElementsAs expected(("z", TrueEdge), ("RET", FalseEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for nested if statement with else-if chains" in { implicit val cpg: Cpg = code("if (a) { b; } else if (c) { d;} else { e; }") - succOf(":program") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("b", TrueEdge), ("c", FalseEdge)) - succOf("b") shouldBe expected(("RET", AlwaysEdge)) - succOf("c") shouldBe expected(("d", TrueEdge), ("e", FalseEdge)) - succOf("d") shouldBe expected(("RET", AlwaysEdge)) - succOf("e") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("b", TrueEdge), ("c", FalseEdge)) + succOf("b") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("c") should contain theSameElementsAs expected(("d", TrueEdge), ("e", FalseEdge)) + succOf("d") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("e") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for switch-case with single case" in { implicit val cpg: Cpg = code("switch (x) { case 1: y;}") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("RET", CaseEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("case 1:", CaseEdge), ("RET", CaseEdge)) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for switch-case with multiple cases" in { implicit val cpg: Cpg = code("switch (x) { case 1: y; case 2: z;}") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("case 2:", CaseEdge), ("RET", CaseEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("case 2:", AlwaysEdge)) - succOf("case 2:") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected( + ("case 1:", CaseEdge), + ("case 2:", CaseEdge), + ("RET", CaseEdge) + ) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("case 2:", AlwaysEdge)) + succOf("case 2:") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for switch-case with multiple cases on the same spot" in { implicit val cpg: Cpg = code("switch (x) { case 1: case 2: y; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("case 2:", CaseEdge), ("RET", CaseEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("case 2:", AlwaysEdge)) - succOf("case 2:") shouldBe expected(("2", AlwaysEdge)) - succOf("2") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected( + ("case 1:", CaseEdge), + ("case 2:", CaseEdge), + ("RET", CaseEdge) + ) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("case 2:", AlwaysEdge)) + succOf("case 2:") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for switch-case with default case" in { implicit val cpg: Cpg = code("switch (x) { default: y; }") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("default:", CaseEdge)) - succOf("default:") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("default:", CaseEdge)) + succOf("default:") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for switch-case with multiple cases and default combined" in { implicit val cpg: Cpg = code("switch (x) { case 1: y; break; default: z;}") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("case 1:", CaseEdge), ("default:", CaseEdge)) - succOf("case 1:") shouldBe expected(("1", AlwaysEdge)) - succOf("1") shouldBe expected(("y", AlwaysEdge)) - succOf("y") shouldBe expected(("break;", AlwaysEdge)) - succOf("break;") shouldBe expected(("RET", AlwaysEdge)) - succOf("default:") shouldBe expected(("z", AlwaysEdge)) - succOf("z") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("case 1:", CaseEdge), ("default:", CaseEdge)) + succOf("case 1:") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("y", AlwaysEdge)) + succOf("y") should contain theSameElementsAs expected(("break;", AlwaysEdge)) + succOf("break;") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("default:") should contain theSameElementsAs expected(("z", AlwaysEdge)) + succOf("z") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for constructor call with new" in { implicit val cpg: Cpg = code("""var x = new MyClass(arg1, arg2)""") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("_tmp_0", AlwaysEdge)) - succOf("_tmp_0") shouldBe expected((".alloc", AlwaysEdge)) - succOf(".alloc") shouldBe expected(("_tmp_0 = .alloc", AlwaysEdge)) - succOf("_tmp_0 = .alloc") shouldBe expected(("MyClass", AlwaysEdge)) - succOf("MyClass") shouldBe expected(("_tmp_0", 1, AlwaysEdge)) - succOf("_tmp_0", 1) shouldBe expected(("arg1", AlwaysEdge)) - succOf("arg1") shouldBe expected(("arg2", AlwaysEdge)) - succOf("arg2") shouldBe expected(("new MyClass(arg1, arg2)", AlwaysEdge)) - succOf("new MyClass(arg1, arg2)", NodeTypes.CALL) shouldBe expected(("_tmp_0", 2, AlwaysEdge)) - succOf("_tmp_0", 2) shouldBe expected(("new MyClass(arg1, arg2)", AlwaysEdge)) - succOf("new MyClass(arg1, arg2)") shouldBe expected(("var x = new MyClass(arg1, arg2)", AlwaysEdge)) - succOf("var x = new MyClass(arg1, arg2)") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("_tmp_0", AlwaysEdge)) + succOf("_tmp_0") should contain theSameElementsAs expected((".alloc", AlwaysEdge)) + succOf(".alloc") should contain theSameElementsAs expected(("_tmp_0 = .alloc", AlwaysEdge)) + succOf("_tmp_0 = .alloc") should contain theSameElementsAs expected(("MyClass", AlwaysEdge)) + succOf("MyClass") should contain theSameElementsAs expected(("_tmp_0", 1, AlwaysEdge)) + succOf("_tmp_0", 1) should contain theSameElementsAs expected(("arg1", AlwaysEdge)) + succOf("arg1") should contain theSameElementsAs expected(("arg2", AlwaysEdge)) + succOf("arg2") should contain theSameElementsAs expected(("new MyClass(arg1, arg2)", AlwaysEdge)) + succOf("new MyClass(arg1, arg2)", NodeTypes.CALL) should contain theSameElementsAs expected( + ("_tmp_0", 2, AlwaysEdge) + ) + succOf("_tmp_0", 2) should contain theSameElementsAs expected(("new MyClass(arg1, arg2)", AlwaysEdge)) + succOf("new MyClass(arg1, arg2)") should contain theSameElementsAs expected( + ("var x = new MyClass(arg1, arg2)", AlwaysEdge) + ) + succOf("var x = new MyClass(arg1, arg2)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } private def testForInOrOf()(implicit cpg: Cpg): Unit = { - succOf(":program") shouldBe expected(("_iterator_0", AlwaysEdge)) - succOf("_iterator_0") shouldBe expected(("arr", AlwaysEdge)) - succOf("arr") shouldBe expected((".iterator(arr)", AlwaysEdge)) - succOf(".iterator(arr)") shouldBe expected(("_iterator_0 = .iterator(arr)", AlwaysEdge)) - succOf("_iterator_0 = .iterator(arr)") shouldBe expected(("_result_0", AlwaysEdge)) - succOf("_result_0") shouldBe expected(("i", AlwaysEdge)) - succOf("i") shouldBe expected(("_result_0", 1, AlwaysEdge)) - succOf("_result_0", 1) shouldBe expected(("_iterator_0", 1, AlwaysEdge)) - succOf("_iterator_0", 1) shouldBe expected(("next", AlwaysEdge)) - succOf("next") shouldBe expected(("_iterator_0.next", AlwaysEdge)) - succOf("_iterator_0.next") shouldBe expected(("_iterator_0", 2, AlwaysEdge)) - succOf("_iterator_0", 2) shouldBe expected(("_iterator_0.next()", AlwaysEdge)) - succOf("_iterator_0.next()") shouldBe expected(("(_result_0 = _iterator_0.next())", AlwaysEdge)) - succOf("(_result_0 = _iterator_0.next())") shouldBe expected(("done", AlwaysEdge)) - succOf("done") shouldBe expected(("(_result_0 = _iterator_0.next()).done", AlwaysEdge)) - succOf("(_result_0 = _iterator_0.next()).done") shouldBe expected( + succOf(":program") should contain theSameElementsAs expected(("_iterator_0", AlwaysEdge)) + succOf("_iterator_0") should contain theSameElementsAs expected(("arr", AlwaysEdge)) + succOf("arr") should contain theSameElementsAs expected((".iterator(arr)", AlwaysEdge)) + succOf(".iterator(arr)") should contain theSameElementsAs expected( + ("_iterator_0 = .iterator(arr)", AlwaysEdge) + ) + succOf("_iterator_0 = .iterator(arr)") should contain theSameElementsAs expected( + ("_result_0", AlwaysEdge) + ) + succOf("_result_0") should contain theSameElementsAs expected(("i", AlwaysEdge)) + succOf("i") should contain theSameElementsAs expected(("_result_0", 1, AlwaysEdge)) + succOf("_result_0", 1) should contain theSameElementsAs expected(("_iterator_0", 1, AlwaysEdge)) + succOf("_iterator_0", 1) should contain theSameElementsAs expected(("next", AlwaysEdge)) + succOf("next") should contain theSameElementsAs expected(("_iterator_0.next", AlwaysEdge)) + succOf("_iterator_0.next") should contain theSameElementsAs expected(("_iterator_0", 2, AlwaysEdge)) + succOf("_iterator_0", 2) should contain theSameElementsAs expected(("_iterator_0.next()", AlwaysEdge)) + succOf("_iterator_0.next()") should contain theSameElementsAs expected( + ("(_result_0 = _iterator_0.next())", AlwaysEdge) + ) + succOf("(_result_0 = _iterator_0.next())") should contain theSameElementsAs expected(("done", AlwaysEdge)) + succOf("done") should contain theSameElementsAs expected(("(_result_0 = _iterator_0.next()).done", AlwaysEdge)) + succOf("(_result_0 = _iterator_0.next()).done") should contain theSameElementsAs expected( ("!(_result_0 = _iterator_0.next()).done", AlwaysEdge) ) import io.shiftleft.semanticcpg.language._ val code = cpg.method.ast.isBlock.code("for \\(var i.*foo.*}").code.head - succOf("!(_result_0 = _iterator_0.next()).done") shouldBe expected(("i", 1, TrueEdge), (code, FalseEdge)) - succOf(code) shouldBe expected(("RET", AlwaysEdge)) - - succOf("i", 1) shouldBe expected(("_result_0", 2, AlwaysEdge)) - succOf("_result_0", 2) shouldBe expected(("value", AlwaysEdge)) - succOf("value") shouldBe expected(("_result_0.value", AlwaysEdge)) - succOf("_result_0.value") shouldBe expected(("i = _result_0.value", AlwaysEdge)) - succOf("i = _result_0.value") shouldBe expected(("foo", AlwaysEdge)) - succOf("foo") shouldBe expected(("this", 1, AlwaysEdge)) - succOf("this", 1) shouldBe expected(("i", 2, AlwaysEdge)) - succOf("i", 2) shouldBe expected(("foo(i)", AlwaysEdge)) + succOf("!(_result_0 = _iterator_0.next()).done") should contain theSameElementsAs expected( + ("i", 1, TrueEdge), + (code, FalseEdge) + ) + succOf(code) should contain theSameElementsAs expected(("RET", AlwaysEdge)) + + succOf("i", 1) should contain theSameElementsAs expected(("_result_0", 2, AlwaysEdge)) + succOf("_result_0", 2) should contain theSameElementsAs expected(("value", AlwaysEdge)) + succOf("value") should contain theSameElementsAs expected(("_result_0.value", AlwaysEdge)) + succOf("_result_0.value") should contain theSameElementsAs expected(("i = _result_0.value", AlwaysEdge)) + succOf("i = _result_0.value") should contain theSameElementsAs expected(("foo", AlwaysEdge)) + succOf("foo") should contain theSameElementsAs expected(("this", 1, AlwaysEdge)) + succOf("this", 1) should contain theSameElementsAs expected(("i", 2, AlwaysEdge)) + succOf("i", 2) should contain theSameElementsAs expected(("foo(i)", AlwaysEdge)) val code2 = "{ foo(i) }" - succOf("foo(i)") shouldBe expected((code2, AlwaysEdge)) - succOf(code2) shouldBe expected(("_result_0", 1, AlwaysEdge)) + succOf("foo(i)") should contain theSameElementsAs expected((code2, AlwaysEdge)) + succOf(code2) should contain theSameElementsAs expected(("_result_0", 1, AlwaysEdge)) } } diff --git a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/testfixtures/DataFlowCodeToCpgSuite.scala b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/testfixtures/DataFlowCodeToCpgSuite.scala index eb93c807ba97..3e6a9fdaab97 100644 --- a/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/testfixtures/DataFlowCodeToCpgSuite.scala +++ b/joern-cli/frontends/jssrc2cpg/src/test/scala/io/joern/jssrc2cpg/testfixtures/DataFlowCodeToCpgSuite.scala @@ -31,7 +31,7 @@ class DataFlowCodeToCpgSuite extends Code2CpgFixture(() => new DataFlowTestCpg() protected implicit val context: EngineContext = EngineContext() protected def flowToResultPairs(path: Path): List[(String, Integer)] = - path.resultPairs().collect { case (firstElement: String, secondElement: Option[Integer]) => + path.resultPairs().collect { case (firstElement: String, secondElement) => (firstElement, secondElement.getOrElse(-1)) } } diff --git a/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/ast/AstCreator.scala b/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/ast/AstCreator.scala index 11bfd8af9afd..9b03f2aa8180 100644 --- a/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/ast/AstCreator.scala +++ b/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/ast/AstCreator.scala @@ -28,7 +28,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.slf4j.Logger import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import java.io.PrintWriter import java.io.StringWriter diff --git a/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/ast/AstForStatementsCreator.scala b/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/ast/AstForStatementsCreator.scala index 65ce497f60a9..f083d75d63af 100644 --- a/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/ast/AstForStatementsCreator.scala +++ b/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/ast/AstForStatementsCreator.scala @@ -62,7 +62,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { // private def astForForWithDestructuringLHS(expr: KtForExpression)(implicit typeInfoProvider: TypeInfoProvider): Ast = { val loopRangeText = expr.getLoopRange.getText - val iteratorName = s"${Constants.iteratorPrefix}${iteratorKeyPool.next()}" + val iteratorName = s"${Constants.iteratorPrefix}${iteratorKeyPool.next}" val localForIterator = localNode(expr, iteratorName, iteratorName, TypeConstants.any) val iteratorAssignmentLhs = newIdentifierNode(iteratorName, TypeConstants.any) val iteratorLocalAst = Ast(localForIterator).withRefEdge(iteratorAssignmentLhs, localForIterator) @@ -182,7 +182,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { // private def astForForWithSimpleVarLHS(expr: KtForExpression)(implicit typeInfoProvider: TypeInfoProvider): Ast = { val loopRangeText = expr.getLoopRange.getText - val iteratorName = s"${Constants.iteratorPrefix}${iteratorKeyPool.next()}" + val iteratorName = s"${Constants.iteratorPrefix}${iteratorKeyPool.next}" val iteratorLocal = localNode(expr, iteratorName, iteratorName, TypeConstants.any) val iteratorAssignmentLhs = newIdentifierNode(iteratorName, TypeConstants.any) val iteratorLocalAst = Ast(iteratorLocal).withRefEdge(iteratorAssignmentLhs, iteratorLocal) diff --git a/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/passes/KotlinTypeHintCallLinker.scala b/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/passes/KotlinTypeHintCallLinker.scala index 5c688e3bbc79..31ed0b375ce5 100644 --- a/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/passes/KotlinTypeHintCallLinker.scala +++ b/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/passes/KotlinTypeHintCallLinker.scala @@ -4,7 +4,7 @@ import io.joern.x2cpg.Defines import io.joern.x2cpg.passes.frontend.XTypeHintCallLinker import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.Call -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.util.regex.Pattern diff --git a/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/passes/KotlinTypeRecoveryPassGenerator.scala b/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/passes/KotlinTypeRecoveryPassGenerator.scala index 9b0960fcc2e3..e4614d139906 100644 --- a/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/passes/KotlinTypeRecoveryPassGenerator.scala +++ b/joern-cli/frontends/kotlin2cpg/src/main/scala/io/joern/kotlin2cpg/passes/KotlinTypeRecoveryPassGenerator.scala @@ -7,7 +7,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.PropertyNames import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder class KotlinTypeRecoveryPassGenerator(cpg: Cpg, config: XTypeRecoveryConfig = XTypeRecoveryConfig()) extends XTypeRecoveryPassGenerator[File](cpg, config) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/DefaultRegisteredTypesTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/DefaultRegisteredTypesTests.scala index 1978c0e3d840..50915958495e 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/DefaultRegisteredTypesTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/DefaultRegisteredTypesTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DefaultRegisteredTypesTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/compiler/JavaInteroperabilityTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/compiler/JavaInteroperabilityTests.scala index 580b2056da24..55f047956f61 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/compiler/JavaInteroperabilityTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/compiler/JavaInteroperabilityTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.compiler import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class JavaInteroperabilityTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with Java interop" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/CollectionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/CollectionsTests.scala index c9bb114aba6a..baaa894378a8 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/CollectionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/CollectionsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CollectionsTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ControlExpressionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ControlExpressionsTests.scala index 83742fc2916a..99031a2c5510 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ControlExpressionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ControlExpressionsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ControlExpressionsTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/DestructuringTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/DestructuringTests.scala index 23d0a75e2e71..108ae3e4fab1 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/DestructuringTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/DestructuringTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DestructuringTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ExtensionFnsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ExtensionFnsTests.scala index ef42c65d7aac..d6df51061783 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ExtensionFnsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ExtensionFnsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ExtensionFnsTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ForTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ForTests.scala index 5b52128e351f..a810b2f050f9 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ForTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ForTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ForTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/FunctionCallTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/FunctionCallTests.scala index bffc61e47053..f5e138aec00c 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/FunctionCallTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/FunctionCallTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class FunctionCallTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/GenericsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/GenericsTests.scala index 6510a41d156f..7c4528652d61 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/GenericsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/GenericsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class GenericsTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/IfTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/IfTests.scala index 39b9a9a03f59..3c2b48e764b2 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/IfTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/IfTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class IfTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/InterproceduralTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/InterproceduralTests.scala index 6d0d9ea0f607..474fd0b25863 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/InterproceduralTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/InterproceduralTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class InterproceduralTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/JavaInteroperabilityTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/JavaInteroperabilityTests.scala index 3219e96572f6..b6e998601691 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/JavaInteroperabilityTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/JavaInteroperabilityTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class JavaInteroperabilityTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/LambdaTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/LambdaTests.scala index 3946446c2657..c13308cd1448 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/LambdaTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/LambdaTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LambdaTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ObjectExpressionsAndDeclarationsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ObjectExpressionsAndDeclarationsTests.scala index 7ab56c2b3df4..f1a7e87f961d 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ObjectExpressionsAndDeclarationsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ObjectExpressionsAndDeclarationsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ObjectExpressionsAndDeclarationsTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/OperatorTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/OperatorTests.scala index 927c9dcf8069..8e095ce30420 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/OperatorTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/OperatorTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class OperatorTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ScopeFunctionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ScopeFunctionsTests.scala index 7e70895c5772..690d7eaec9bd 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ScopeFunctionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/ScopeFunctionsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ScopeFunctionsTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/SimpleDataFlowTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/SimpleDataFlowTests.scala index ac54ea19e525..987bd4bd9c10 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/SimpleDataFlowTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/SimpleDataFlowTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SimpleDataFlowTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/TryTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/TryTests.scala index 7002f4da3b0e..d25e5e83c117 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/TryTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/TryTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class TryTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/WhenTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/WhenTests.scala index 0c94cf520002..021fc3198813 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/WhenTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/WhenTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class WhenTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/WhileTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/WhileTests.scala index 74beb35f10fd..aa7e419eabda 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/WhileTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/dataflow/WhileTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.dataflow import io.joern.dataflowengineoss.language.toExtendedCfgNode import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class WhileTests extends KotlinCode2CpgFixture(withOssDataflow = true) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/postProcessing/TypeRecoveryPassTest.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/postProcessing/TypeRecoveryPassTest.scala index 6e241e7e2afd..06276c0ec95f 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/postProcessing/TypeRecoveryPassTest.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/postProcessing/TypeRecoveryPassTest.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.postProcessing import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.semanticcpg.language.{ICallResolver, NoResolve} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class TypeRecoveryPassTest extends KotlinCode2CpgFixture(withPostProcessing = true) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AnnotationsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AnnotationsTests.scala index 71d1ee17cc51..767cd7bdcbb4 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AnnotationsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AnnotationsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Annotation, AnnotationLiteral} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class AnnotationsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with two identical calls, one annotated and one not" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AnonymousFunctionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AnonymousFunctionsTests.scala index fad29eeaf8b4..49c85dae7c6c 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AnonymousFunctionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AnonymousFunctionsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{EvaluationStrategies, ModifierTypes} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.Ignore import scala.annotation.unused diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ArithmeticOperationsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ArithmeticOperationsTests.scala index 1116622eaeaa..80f1d9695263 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ArithmeticOperationsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ArithmeticOperationsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ArithmeticOperationsTests extends KotlinCode2CpgFixture(withOssDataflow = true) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ArrayAccessExprsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ArrayAccessExprsTests.scala index 5a9b5767607c..84632d3f4acf 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ArrayAccessExprsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ArrayAccessExprsTests.scala @@ -3,7 +3,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Literal} import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ArrayAccessExprsTests extends KotlinCode2CpgFixture(withOssDataflow = true) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AssignmentTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AssignmentTests.scala index 25ddaea2e3ef..4ef82a053da0 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AssignmentTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/AssignmentTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class AssignmentTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/BooleanLogicTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/BooleanLogicTests.scala index 3e6ed13c3b82..922a64926e35 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/BooleanLogicTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/BooleanLogicTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class BooleanLogicTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallGraphTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallGraphTests.scala index 794edfec1c3e..ddd91f3f1f80 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallGraphTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallGraphTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CallGraphTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallableReferenceTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallableReferenceTests.scala index e5edd465e017..da0b64126080 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallableReferenceTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallableReferenceTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CallableReferenceTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallbackTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallbackTests.scala index d6c2814bafc0..97631a4a5475 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallbackTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallbackTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CallbackTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallsToConstructorTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallsToConstructorTests.scala index 49335321c273..aeb59738be64 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallsToConstructorTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CallsToConstructorTests.scala @@ -3,7 +3,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Block, Call, Identifier, Literal, Local} import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CallsToConstructorTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CfgTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CfgTests.scala index 3ca374924968..8455d8aeb781 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CfgTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CfgTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CfgTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ClassLiteralTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ClassLiteralTests.scala index 0fe33a3b79ee..77a1fb225fb1 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ClassLiteralTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ClassLiteralTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ClassLiteralTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CollectionAccessTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CollectionAccessTests.scala index 3d30027b02e5..aaddb05e6db2 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CollectionAccessTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CollectionAccessTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CollectionAccessTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CompanionObjectTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CompanionObjectTests.scala index bcb0948837db..6916bbe07d10 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CompanionObjectTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/CompanionObjectTests.scala @@ -4,7 +4,7 @@ import io.joern.kotlin2cpg.Constants import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.{Call, FieldIdentifier, Identifier, Member} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CompanionObjectTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ComparisonOperatorTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ComparisonOperatorTests.scala index 9057c973301e..6fc007434046 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ComparisonOperatorTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ComparisonOperatorTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ComparisonOperatorTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ComplexExpressionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ComplexExpressionsTests.scala index 7e31ba806ead..b469e6f84ca1 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ComplexExpressionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ComplexExpressionsTests.scala @@ -3,8 +3,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.edges.Argument -import io.shiftleft.semanticcpg.language._ -import overflowdb.traversal.jIteratortoTraversal +import io.shiftleft.semanticcpg.language.* class ComplexExpressionsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with _and_/_or_ operator and try-catch as one of the arguments" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ConfigFileTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ConfigFileTests.scala index e0fdc9238657..99fca7000164 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ConfigFileTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ConfigFileTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ConfigFileTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ConstructorTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ConstructorTests.scala index ecf3222d003b..09e8df5cb759 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ConstructorTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ConstructorTests.scala @@ -4,7 +4,7 @@ import io.joern.kotlin2cpg.Constants import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.{Call, FieldIdentifier, Identifier, MethodParameterIn} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ConstructorTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ControlStructureTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ControlStructureTests.scala index 4c14ced555f7..367c7e7f0fd3 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ControlStructureTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ControlStructureTests.scala @@ -3,7 +3,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Block, Call, ControlStructure, Identifier, Local} import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ControlStructureTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with simple if-else" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DataClassTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DataClassTests.scala index b5bc553d1b4e..bee57af468ad 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DataClassTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DataClassTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DataClassTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with simple data class" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DefaultContentRootsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DefaultContentRootsTests.scala index c53f42ab2b96..02b442bbbaf8 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DefaultContentRootsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DefaultContentRootsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DefaultContentRootsTests extends KotlinCode2CpgFixture(withOssDataflow = false, withDefaultJars = true) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DelegatedPropertiesTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DelegatedPropertiesTests.scala index 7fc0b7dc4649..9f53a65e7f21 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DelegatedPropertiesTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DelegatedPropertiesTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DelegatedPropertiesTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DestructuringTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DestructuringTests.scala index c0d046f962ed..96d03e1a589c 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DestructuringTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/DestructuringTests.scala @@ -3,7 +3,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.{Call, Identifier, Literal, Local} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DestructuringTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/EnumTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/EnumTests.scala index 8feb1ba5df25..3d4e6ad56dea 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/EnumTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/EnumTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class EnumTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ExtensionTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ExtensionTests.scala index 7c1e535826ea..2dd7156c2f5c 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ExtensionTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ExtensionTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ExtensionTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with simple extension function declarations" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/FieldAccessTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/FieldAccessTests.scala index fd8521787396..df05efd93966 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/FieldAccessTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/FieldAccessTests.scala @@ -3,7 +3,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{FieldIdentifier, Identifier} import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class FieldAccessTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/FileTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/FileTests.scala index 098c7f9329ba..4dae7d002d57 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/FileTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/FileTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import java.io.File diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/GenericsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/GenericsTests.scala index d0a78b7ec837..55100727bac4 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/GenericsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/GenericsTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class GenericsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/GlobalsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/GlobalsTests.scala index ff11e7d51c86..8e3eed81a92f 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/GlobalsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/GlobalsTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class GlobalsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code simple global declaration" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/IdentifierTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/IdentifierTests.scala index 0650814cb889..6c4c0745afa4 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/IdentifierTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/IdentifierTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class IdentifierTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with two simple methods" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ImportTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ImportTests.scala index 00b79d34b1ea..38bdb3aba291 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ImportTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ImportTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ImportTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/InnerClassesTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/InnerClassesTests.scala index 7bc06f15d41e..b81c62b036ca 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/InnerClassesTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/InnerClassesTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.Ignore class InnerClassesTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LabeledExpressionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LabeledExpressionsTests.scala index b4243faf88c0..dc0fb0b566f9 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LabeledExpressionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LabeledExpressionsTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LabeledExpressionsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LambdaTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LambdaTests.scala index 6de2838c017e..3a681cef31b0 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LambdaTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LambdaTests.scala @@ -17,7 +17,6 @@ import io.shiftleft.codepropertygraph.generated.nodes.MethodRef import io.shiftleft.codepropertygraph.generated.nodes.Return import io.shiftleft.codepropertygraph.generated.nodes.TypeDecl import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.jIteratortoTraversal class LambdaTests extends KotlinCode2CpgFixture(withOssDataflow = false, withDefaultJars = true) { "CPG for code with a simple lambda which captures a method parameter" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LiteralTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LiteralTests.scala index ba4288736d87..5a5c8475318a 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LiteralTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LiteralTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LiteralTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LocalClassesTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LocalClassesTests.scala index bb57eb21932b..42a261fe5f83 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LocalClassesTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LocalClassesTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.TypeDecl -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LocalClassesTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LocalTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LocalTests.scala index a0c49d8842ca..07635e8dd1d4 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LocalTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/LocalTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LocalTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code simple local declarations" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MemberTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MemberTests.scala index 19457372c82d..4d0db375a81f 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MemberTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MemberTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MemberTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MetaDataTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MetaDataTests.scala index 40695e336c24..1f54baae7bc2 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MetaDataTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MetaDataTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MetaDataTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodParameterTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodParameterTests.scala index 5e5db29df2dc..3a610e47ab1a 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodParameterTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodParameterTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.MethodParameterIn -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodParameterTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodReturnTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodReturnTests.scala index d34372b3d2d9..fc332dade842 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodReturnTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodReturnTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.EvaluationStrategies -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodReturnTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodTests.scala index efc0e016c1e9..73eff0a85c5b 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/MethodTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Block, Call, Return} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MethodTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with simple method defined at package-level" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ModifierTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ModifierTests.scala index 3b686142e41b..605185f136b9 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ModifierTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ModifierTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ModifierTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with various modifiers applied to various functions" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/NamespaceBlockTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/NamespaceBlockTests.scala index 33cf5c4be855..200ff2a9a41b 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/NamespaceBlockTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/NamespaceBlockTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class NamespaceBlockTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with simple namespace declaration" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ObjectDeclarationsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ObjectDeclarationsTests.scala index 81118e41fe2a..310aa4086717 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ObjectDeclarationsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ObjectDeclarationsTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ObjectDeclarationsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with simple object declaration" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ParenthesizedExpressionTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ParenthesizedExpressionTests.scala index da0f5858545c..bd1548c9e909 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ParenthesizedExpressionTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ParenthesizedExpressionTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ParenthesizedExpressionTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/QualifiedExpressionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/QualifiedExpressionsTests.scala index 824698ecce4a..570ec15821b2 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/QualifiedExpressionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/QualifiedExpressionsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class QualifiedExpressionsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with qualified expression with QE as a receiver" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ResolutionErrorsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ResolutionErrorsTests.scala index c4e676596e97..652e2f7e2253 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ResolutionErrorsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ResolutionErrorsTests.scala @@ -4,7 +4,7 @@ import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.joern.kotlin2cpg.types.TypeConstants import io.joern.x2cpg.Defines import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ResolutionErrorsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with QE of receiver for which the type cannot be inferred" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SafeQualifiedExpressionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SafeQualifiedExpressionsTests.scala index 28267aa5ef34..f340e39dd835 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SafeQualifiedExpressionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SafeQualifiedExpressionsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SafeQualifiedExpressionsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { implicit val resolver: ICallResolver = NoResolve diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ScopeFunctionTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ScopeFunctionTests.scala index 8d5a75d91e27..2881fdf26380 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ScopeFunctionTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ScopeFunctionTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Block, Return} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ScopeFunctionTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code call to `also` scope function without an explicitly-defined parameter" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SpecialOperatorsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SpecialOperatorsTests.scala index a307d4b01dda..78078f2cf511 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SpecialOperatorsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SpecialOperatorsTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SpecialOperatorsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/StdLibTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/StdLibTests.scala index 72498ccfea49..4dd6884d94ea 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/StdLibTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/StdLibTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class StdLibTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with call to `takeIf`" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/StringInterpolationTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/StringInterpolationTests.scala index 644435182656..7253fbbf3221 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/StringInterpolationTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/StringInterpolationTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class StringInterpolationTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SuperTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SuperTests.scala index 79de86e710b2..00d832760d29 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SuperTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/SuperTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SuperTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with simple call using _super_" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ThisTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ThisTests.scala index 8af6d9af6548..d976133041d6 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ThisTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/ThisTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.Identifier -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ThisTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with calls to functions of same name, but different scope" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TryExpressionsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TryExpressionsTests.scala index ce5b2fc7ce02..473aa0e84c5c 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TryExpressionsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TryExpressionsTests.scala @@ -3,7 +3,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Block, Call, Identifier} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class TryExpressionsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with simple `try`-expression" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TypeAliasTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TypeAliasTests.scala index d76b92786d78..3af134f92b59 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TypeAliasTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TypeAliasTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.joern.x2cpg.Defines -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class TypeAliasTests extends KotlinCode2CpgFixture(withOssDataflow = false, withDefaultJars = true) { "CPG for code with simple typealias to Int" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TypeDeclTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TypeDeclTests.scala index e05da10d7311..3ee7dc51b82d 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TypeDeclTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/TypeDeclTests.scala @@ -11,7 +11,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.{ MethodParameterIn } import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal class TypeDeclTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/UnaryOpTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/UnaryOpTests.scala index 7c6aa3617877..4ca47bfc65aa 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/UnaryOpTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/querying/UnaryOpTests.scala @@ -2,7 +2,7 @@ package io.joern.kotlin2cpg.querying import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class UnaryOpTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/DefaultImportsTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/DefaultImportsTests.scala index 2e381352d259..607313386ce5 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/DefaultImportsTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/DefaultImportsTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.validation import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class DefaultImportsTests extends KotlinCode2CpgFixture(withOssDataflow = false) { // It tests if we take into consideration default imports: https://kotlinlang.org/docs/packages.html#default-imports diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/IdentifierReferencesTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/IdentifierReferencesTests.scala index c24e30d6d6b7..02e94913b2ae 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/IdentifierReferencesTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/IdentifierReferencesTests.scala @@ -3,7 +3,7 @@ package io.joern.kotlin2cpg.validation import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Local, MethodParameterIn} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* // TODO: also add test with refs inside TYPE_DECL diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/MissingTypeInformationTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/MissingTypeInformationTests.scala index c435499d3310..14e375b0d9ac 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/MissingTypeInformationTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/MissingTypeInformationTests.scala @@ -3,7 +3,7 @@ package io.joern.kotlin2cpg.validation import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.joern.x2cpg.Defines import io.shiftleft.codepropertygraph.generated.nodes.{Call, Method} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MissingTypeInformationTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with CALL to Java stdlib fn with argument of unknown type" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/PrimitiveArrayTypeMappingTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/PrimitiveArrayTypeMappingTests.scala index afb57d324c9f..e4191018c6ad 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/PrimitiveArrayTypeMappingTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/PrimitiveArrayTypeMappingTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.validation import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class PrimitiveArrayTypeMappingTests extends KotlinCode2CpgFixture(withOssDataflow = false) { "CPG for code with usage of `kotlin.BooleanArray`" should { diff --git a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/UnitTypeMappingTests.scala b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/UnitTypeMappingTests.scala index dc2f0f467378..8ee9dde0d2e1 100644 --- a/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/UnitTypeMappingTests.scala +++ b/joern-cli/frontends/kotlin2cpg/src/test/scala/io/joern/kotlin2cpg/validation/UnitTypeMappingTests.scala @@ -1,7 +1,7 @@ package io.joern.kotlin2cpg.validation import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class UnitTypeMappingTests extends KotlinCode2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/astcreation/AstCreator.scala index c821740b5c9c..636443b3866c 100644 --- a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/astcreation/AstCreator.scala @@ -15,9 +15,9 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.passes.IntervalKeyPool import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate import java.nio.charset.StandardCharsets +import scala.collection.mutable class AstCreator(filename: String, phpAst: PhpFile, fileContent: Option[String], disableFileContent: Boolean)(implicit withSchemaValidation: ValidationMode @@ -31,7 +31,7 @@ class AstCreator(filename: String, phpAst: PhpFile, fileContent: Option[String], private def getNewTmpName(prefix: String = "tmp"): String = s"$prefix${tmpKeyPool.next.toString}" - override def createAst(): BatchedUpdate.DiffGraphBuilder = { + override def createAst(): DiffGraphBuilder = { val ast = astForPhpFile(phpAst) storeInDiffGraph(ast, diffGraph) diffGraph @@ -1097,12 +1097,97 @@ class AstCreator(filename: String, phpAst: PhpFile, fileContent: Option[String], arrayPushAst } + /** Lower the array/list unpack. For example `[$a, $b] = $arr;` will be lowered to `$a = $arr[0]; $b = $arr[1];` + */ + private def astForArrayUnpack(assignment: PhpAssignment, target: PhpArrayExpr | PhpListExpr): Ast = { + val loweredAssignNodes = mutable.ListBuffer.empty[Ast] + + // create a Identifier ast for given name + def createIdentifier(name: String): Ast = Ast(identifierNode(assignment, name, s"$$$name", TypeConstants.Any)) + + def createIndexAccessChain( + targetAst: Ast, + sourceAst: Ast, + idxTracker: ArrayIndexTracker, + item: PhpArrayItem + ): Ast = { + val dimensionAst = astForExpr(PhpInt(idxTracker.next, item.attributes)) + val indexAccessCode = s"${sourceAst.rootCodeOrEmpty}[${dimensionAst.rootCodeOrEmpty}]" + // .indexAccess(sourceAst, index) + val indexAccessNode = callAst( + newOperatorCallNode(Operators.indexAccess, indexAccessCode, line = line(item)), + sourceAst :: dimensionAst :: Nil + ) + val assignCode = s"${targetAst.rootCodeOrEmpty} = $indexAccessCode" + val assignNode = newOperatorCallNode(Operators.assignment, assignCode, line = line(item)) + // targetAst = .indexAccess(sourceAst, index) + callAst(assignNode, targetAst :: indexAccessNode :: Nil) + } + + // Take `[[$a, $b], $c] = $arr;` as an example + def handleUnpackLowering( + target: PhpArrayExpr | PhpListExpr, + itemsOf: PhpArrayExpr | PhpListExpr => List[Option[PhpArrayItem]], + sourceAst: Ast + ): Unit = { + val idxTracker = new ArrayIndexTracker + + // create an alias identifier of $arr + val sourceAliasName = getNewTmpName() + val sourceAliasIdentifier = createIdentifier(sourceAliasName) + val assignCode = s"${sourceAliasIdentifier.rootCodeOrEmpty} = ${sourceAst.rootCodeOrEmpty}" + val assignNode = newOperatorCallNode(Operators.assignment, assignCode, line = line(assignment)) + loweredAssignNodes += callAst(assignNode, sourceAliasIdentifier :: sourceAst :: Nil) + + itemsOf(target).foreach { + case Some(item) => + item.value match { + case nested: (PhpArrayExpr | PhpListExpr) => // item is [$a, $b] + // create tmp variable for [$a, $b] to receive the result of .indexAccess($arr, 0) + val tmpIdentifierName = getNewTmpName() + // tmpVar = .indexAccess($arr, 0) + val targetAssignNode = + createIndexAccessChain( + createIdentifier(tmpIdentifierName), + createIdentifier(sourceAliasName), + idxTracker, + item + ) + loweredAssignNodes += targetAssignNode + handleUnpackLowering(nested, itemsOf, createIdentifier(tmpIdentifierName)) + case phpVar: PhpVariable => // item is $c + val identifier = astForExpr(phpVar) + // $c = .indexAccess($arr, 1) + val targetAssignNode = + createIndexAccessChain(identifier, createIdentifier(sourceAliasName), idxTracker, item) + loweredAssignNodes += targetAssignNode + case _ => + // unknown case + idxTracker.next + } + case None => + idxTracker.next + } + } + + val sourceAst = astForExpr(assignment.source) + val itemsOf = (exp: PhpArrayExpr | PhpListExpr) => + exp match { + case x: PhpArrayExpr => x.items + case x: PhpListExpr => x.items + } + handleUnpackLowering(target, itemsOf, sourceAst) + Ast(blockNode(assignment)) + .withChildren(loweredAssignNodes.toList) + } + private def astForAssignment(assignment: PhpAssignment): Ast = { assignment.target match { case arrayDimFetch: PhpArrayDimFetchExpr if arrayDimFetch.dimension.isEmpty => // Rewrite `$xs[] = ` as `array_push($xs, )` to simplify finding dataflows. astForEmptyArrayDimAssign(assignment, arrayDimFetch) - + case arrayExpr: (PhpArrayExpr | PhpListExpr) => + astForArrayUnpack(assignment, arrayExpr) case _ => val operatorName = assignment.assignOp diff --git a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AnyTypePass.scala b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AnyTypePass.scala index 8f9c618a3333..601228aa26cf 100644 --- a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AnyTypePass.scala +++ b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AnyTypePass.scala @@ -6,7 +6,7 @@ import io.shiftleft.codepropertygraph.generated.PropertyNames import io.shiftleft.codepropertygraph.generated.nodes.AstNode import io.shiftleft.codepropertygraph.generated.nodes.Call.PropertyDefaults import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* // TODO This is a hack for a customer issue. Either extend this to handle type full names properly, // or do it elsewhere. diff --git a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AstParentInfoPass.scala b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AstParentInfoPass.scala index 8594efb2a949..701b7523d033 100644 --- a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AstParentInfoPass.scala +++ b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/AstParentInfoPass.scala @@ -1,10 +1,9 @@ package io.joern.php2cpg.passes -import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.PropertyNames +import io.shiftleft.codepropertygraph.generated.{Cpg, Properties, PropertyNames} import io.shiftleft.codepropertygraph.generated.nodes.{AstNode, NamespaceBlock, Method, TypeDecl} import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class AstParentInfoPass(cpg: Cpg) extends ForkJoinParallelCpgPass[AstNode](cpg) { @@ -15,7 +14,7 @@ class AstParentInfoPass(cpg: Cpg) extends ForkJoinParallelCpgPass[AstNode](cpg) override def runOnPart(diffGraph: DiffGraphBuilder, node: AstNode): Unit = { findParent(node).foreach { parentNode => val astParentType = parentNode.label - val astParentFullName = parentNode.property(PropertyNames.FULL_NAME) + val astParentFullName = parentNode.property(Properties.FullName) diffGraph.setNodeProperty(node, PropertyNames.AST_PARENT_TYPE, astParentType) diffGraph.setNodeProperty(node, PropertyNames.AST_PARENT_FULL_NAME, astParentFullName) diff --git a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/ClosureRefPass.scala b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/ClosureRefPass.scala index ac790b9fb438..c5c2c289a54c 100644 --- a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/ClosureRefPass.scala +++ b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/ClosureRefPass.scala @@ -3,7 +3,7 @@ package io.joern.php2cpg.passes import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{ClosureBinding, Method, MethodRef} import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.slf4j.LoggerFactory import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.AstNode @@ -22,7 +22,7 @@ class ClosureRefPass(cpg: Cpg) extends ForkJoinParallelCpgPass[ClosureBinding](c * that is the scope in which the closure would have originally been created. */ override def runOnPart(diffGraph: DiffGraphBuilder, closureBinding: ClosureBinding): Unit = { - closureBinding.captureIn.collectAll[MethodRef].toList match { + closureBinding._methodRefViaCaptureIn.toList match { case Nil => logger.error(s"No MethodRef corresponding to closureBinding ${closureBinding.closureBindingId}") diff --git a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/DependencyPass.scala b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/DependencyPass.scala index 003efcc8d33c..8b56de0fa15e 100644 --- a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/DependencyPass.scala +++ b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/DependencyPass.scala @@ -6,7 +6,6 @@ import io.shiftleft.codepropertygraph.generated.nodes.{NewDependency, NewTag} import io.shiftleft.codepropertygraph.generated.{Cpg, EdgeTypes} import io.shiftleft.passes.ForkJoinParallelCpgPass import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate import upickle.default.* import scala.annotation.targetName diff --git a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/LocalCreationPass.scala b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/LocalCreationPass.scala index 89ed00ffe137..2e113b80ae0a 100644 --- a/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/LocalCreationPass.scala +++ b/joern-cli/frontends/php2cpg/src/main/scala/io/joern/php2cpg/passes/LocalCreationPass.scala @@ -13,7 +13,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.{ NewNode, TypeDecl } -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.joern.php2cpg.astcreation.AstCreator import io.joern.php2cpg.parser.Domain import io.joern.php2cpg.parser.Domain.PhpOperators @@ -96,7 +96,7 @@ abstract class LocalCreationPass[ScopeType <: AstNode](cpg: Cpg) ): Unit = { val identifierMap = getIdentifiersInScope(bodyNode) - .filter(_.refOut.isEmpty) + .filter(_._refOut.isEmpty) .filterNot(excludeIdentifierFn) .groupBy(_.name) diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/dataflow/IntraMethodDataflowTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/dataflow/IntraMethodDataflowTests.scala index 737898f2bc05..d470cc8d6f51 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/dataflow/IntraMethodDataflowTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/dataflow/IntraMethodDataflowTests.scala @@ -1,8 +1,8 @@ package io.joern.php2cpg.dataflow import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* class IntraMethodDataflowTests extends PhpCode2CpgFixture(runOssDataflow = true) { "flows from parameters to corresponding identifiers should be found" in { @@ -29,4 +29,37 @@ class IntraMethodDataflowTests extends PhpCode2CpgFixture(runOssDataflow = true) flows.size shouldBe 1 } + + "flow from single layer array unpacking should be found" in { + val cpg = code(""" new PhpCfgTestCpg) { | } |} |""".stripMargin) - succOf("break(1)") shouldBe expected(("$i", AlwaysEdge)) + succOf("break(1)") should contain theSameElementsAs expected(("$i", AlwaysEdge)) } "be correct for break with level 2" in { @@ -40,7 +40,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } |} |""".stripMargin) - succOf("break(2)") shouldBe expected(("RET", AlwaysEdge)) + succOf("break(2)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for continue with level 1" in { @@ -51,7 +51,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } |} |""".stripMargin) - succOf("continue(1)") shouldBe expected(("$j", AlwaysEdge)) + succOf("continue(1)") should contain theSameElementsAs expected(("$j", AlwaysEdge)) } "be correct for continue with level 2" in { @@ -62,7 +62,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } |} |""".stripMargin) - succOf("continue(2)") shouldBe expected(("$i", AlwaysEdge)) + succOf("continue(2)") should contain theSameElementsAs expected(("$i", AlwaysEdge)) } } @@ -75,7 +75,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } while ($j < 1); |} while ($i < 1) |""".stripMargin) - succOf("break(1)") shouldBe expected(("$i", AlwaysEdge)) + succOf("break(1)") should contain theSameElementsAs expected(("$i", AlwaysEdge)) } "be correct for break with level 2" in { @@ -86,7 +86,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } while ($j < 1); |} while ($i < 1) |""".stripMargin) - succOf("break(2)") shouldBe expected(("RET", AlwaysEdge)) + succOf("break(2)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for continue with level 1" in { @@ -97,7 +97,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } while ($j < 1); |} while ($i < 1) |""".stripMargin) - succOf("continue(1)") shouldBe expected(("$j", AlwaysEdge)) + succOf("continue(1)") should contain theSameElementsAs expected(("$j", AlwaysEdge)) } "be correct for continue with level 2" in { @@ -108,7 +108,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } while ($j < 1); |} while ($i < 1) |""".stripMargin) - succOf("continue(2)") shouldBe expected(("$i", AlwaysEdge)) + succOf("continue(2)") should contain theSameElementsAs expected(("$i", AlwaysEdge)) } } @@ -121,7 +121,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } |} |""".stripMargin) - succOf("break(1)") shouldBe expected(("$i", AlwaysEdge)) + succOf("break(1)") should contain theSameElementsAs expected(("$i", AlwaysEdge)) } "be correct for break with level 2" in { @@ -132,7 +132,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } |} |""".stripMargin) - succOf("break(2)") shouldBe expected(("RET", AlwaysEdge)) + succOf("break(2)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "be correct for continue with level 1" in { @@ -143,7 +143,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } |} |""".stripMargin) - succOf("continue(1)") shouldBe expected(("$j", AlwaysEdge)) + succOf("continue(1)") should contain theSameElementsAs expected(("$j", AlwaysEdge)) } "be correct for continue with level 2" in { @@ -154,7 +154,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | } |} |""".stripMargin) - succOf("continue(2)") shouldBe expected(("$i", AlwaysEdge)) + succOf("continue(2)") should contain theSameElementsAs expected(("$i", AlwaysEdge)) } } @@ -170,7 +170,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | $k; |} |""".stripMargin) - succOf("break(1)") shouldBe expected(("$k", AlwaysEdge)) + succOf("break(1)") should contain theSameElementsAs expected(("$k", AlwaysEdge)) } "be correct for break with level 2" in { @@ -184,7 +184,7 @@ class CfgCreationPassTests extends CfgTestFixture(() => new PhpCfgTestCpg) { | $k; |} |""".stripMargin) - succOf("break(2)") shouldBe expected(("RET", AlwaysEdge)) + succOf("break(2)") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } } diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ArrayTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ArrayTests.scala index 7e671a914683..353c5f15c2a9 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ArrayTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ArrayTests.scala @@ -3,7 +3,7 @@ package io.joern.php2cpg.querying import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Block, Call, Identifier, Literal, Local} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ArrayTests extends PhpCode2CpgFixture { "array accesses with variable keys should be represented as index accesses" in { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CallTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CallTests.scala index 9e554bb19725..7297935b2db3 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CallTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CallTests.scala @@ -5,7 +5,7 @@ import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture import io.joern.x2cpg.Defines import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.{Call, Identifier} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CallTests extends PhpCode2CpgFixture { "variable call arguments with names matching methods should not have a methodref" in { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CfgTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CfgTests.scala index c630338e7794..49f9c79a2708 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CfgTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CfgTests.scala @@ -3,7 +3,7 @@ package io.joern.php2cpg.querying import io.joern.php2cpg.parser.Domain.PhpOperators import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Call, JumpTarget} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CfgTests extends PhpCode2CpgFixture { "the CFG for match constructs" when { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CommentTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CommentTests.scala index c7b490ff6922..26728291ee45 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CommentTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/CommentTests.scala @@ -1,7 +1,7 @@ package io.joern.php2cpg.querying import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CommentTests extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ControlStructureTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ControlStructureTests.scala index c67fe7bbc2a4..0d3baf696b81 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ControlStructureTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ControlStructureTests.scala @@ -14,7 +14,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.{ Literal, Local } -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.nodes.AstNode import scala.util.Try diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/FieldAccessTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/FieldAccessTests.scala index c016b8c0fadb..3925ebd2d799 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/FieldAccessTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/FieldAccessTests.scala @@ -3,7 +3,7 @@ package io.joern.php2cpg.querying import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{FieldIdentifier, Identifier} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class FieldAccessTests extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/LocalTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/LocalTests.scala index 322bd1a5a79d..ec99c5e84002 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/LocalTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/LocalTests.scala @@ -1,7 +1,7 @@ package io.joern.php2cpg.querying import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class LocalTests extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/MemberTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/MemberTests.scala index 087fb9e578c8..a69a4334520c 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/MemberTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/MemberTests.scala @@ -5,7 +5,7 @@ import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture import io.joern.x2cpg.Defines import io.shiftleft.codepropertygraph.generated.{ModifierTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.{Call, FieldIdentifier, Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MemberTests extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/NamespaceTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/NamespaceTests.scala index 4b5ff757d74b..b8e062767765 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/NamespaceTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/NamespaceTests.scala @@ -1,7 +1,7 @@ package io.joern.php2cpg.querying import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.nodes.Method class NamespaceTests extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/OperatorTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/OperatorTests.scala index cc0c46830db0..6dbb2cb1f677 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/OperatorTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/OperatorTests.scala @@ -4,10 +4,10 @@ import io.joern.php2cpg.astcreation.AstCreator.TypeConstants import io.joern.php2cpg.parser.Domain.{PhpDomainTypeConstants, PhpOperators} import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture import io.joern.x2cpg.Defines -import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} +import io.shiftleft.codepropertygraph.generated.{DispatchTypes, NodeTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.{Block, Call, Identifier, Literal, TypeRef} import io.shiftleft.passes.IntervalKeyPool -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal class OperatorTests extends PhpCode2CpgFixture { @@ -497,29 +497,6 @@ class OperatorTests extends PhpCode2CpgFixture { } } - "temporary list implementation should work" in { - // TODO This is a simple placeholder implementation that represents most of the useful information - // in the AST, while being pretty much unusable for dataflow. A better implementation needs to follow. - val cpg = code(""" - listCall.methodFullName shouldBe PhpOperators.listFunc - listCall.code shouldBe "list($a,$b)" - listCall.lineNumber shouldBe Some(2) - inside(listCall.argument.l) { case List(aArg: Identifier, bArg: Identifier) => - aArg.name shouldBe "a" - aArg.code shouldBe "$a" - aArg.lineNumber shouldBe Some(2) - - bArg.name shouldBe "b" - bArg.code shouldBe "$b" - bArg.lineNumber shouldBe Some(2) - } - } - } - "include calls" should { "be correctly represented for normal includes" in { val cpg = code(""" block }.head + inside(block.astChildren.assignment.l) { case tmp0 :: tmp1 :: tmp2 :: a :: b :: c :: Nil => + tmp0.code shouldBe "$tmp0 = $arr" + tmp0.source.label shouldBe NodeTypes.IDENTIFIER + tmp0.source.code shouldBe "$arr" + tmp0.target.label shouldBe NodeTypes.IDENTIFIER + tmp0.target.code shouldBe "$tmp0" + + tmp1.code shouldBe "$tmp1 = $tmp0[0]" + tmp1.source.label shouldBe NodeTypes.CALL + tmp1.source.asInstanceOf[Call].name shouldBe Operators.indexAccess + tmp1.source.code shouldBe "$tmp0[0]" + tmp1.target.label shouldBe NodeTypes.IDENTIFIER + tmp1.target.code shouldBe "$tmp1" + + tmp2.code shouldBe "$tmp2 = $tmp1" + tmp2.source.label shouldBe NodeTypes.IDENTIFIER + tmp2.source.code shouldBe "$tmp1" + tmp2.target.label shouldBe NodeTypes.IDENTIFIER + tmp2.target.code shouldBe "$tmp2" + + a.code shouldBe "$a = $tmp2[0]" + a.source.label shouldBe NodeTypes.CALL + a.source.asInstanceOf[Call].name shouldBe Operators.indexAccess + a.source.code shouldBe "$tmp2[0]" + a.target.label shouldBe NodeTypes.IDENTIFIER + a.target.code shouldBe "$a" + + b.code shouldBe "$b = $tmp2[1]" + b.source.label shouldBe NodeTypes.CALL + b.source.asInstanceOf[Call].name shouldBe Operators.indexAccess + b.source.code shouldBe "$tmp2[1]" + b.target.label shouldBe NodeTypes.IDENTIFIER + b.target.code shouldBe "$b" + + c.code shouldBe "$c = $tmp0[1]" + c.source.label shouldBe NodeTypes.CALL + c.source.asInstanceOf[Call].name shouldBe Operators.indexAccess + c.source.code shouldBe "$tmp0[1]" + c.target.label shouldBe NodeTypes.IDENTIFIER + c.target.code shouldBe "$c" + } + } } diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/PocTest.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/PocTest.scala index 83a8b537fce1..ca17c9c06936 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/PocTest.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/PocTest.scala @@ -4,7 +4,7 @@ import io.joern.php2cpg.astcreation.AstCreator.TypeConstants import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.shiftleft.codepropertygraph.generated.nodes.{Call, Identifier, Literal} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class PocTest extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ScalarTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ScalarTests.scala index 0d913e2fa4cd..2f3b4e530e94 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ScalarTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/ScalarTests.scala @@ -1,7 +1,7 @@ package io.joern.php2cpg.querying import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Literal} class ScalarTests extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/TypeNodeTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/TypeNodeTests.scala index c26317f4dc3f..f2a6ce23bd03 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/TypeNodeTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/TypeNodeTests.scala @@ -4,7 +4,7 @@ import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture import io.joern.x2cpg.Defines import io.shiftleft.codepropertygraph.generated.{ModifierTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.{Call, Identifier, Literal, Local, Member, Method} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.nodes.Block class TypeNodeTests extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/UseTests.scala b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/UseTests.scala index f9c911f8c617..040966272f3c 100644 --- a/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/UseTests.scala +++ b/joern-cli/frontends/php2cpg/src/test/scala/io/joern/php2cpg/querying/UseTests.scala @@ -1,7 +1,7 @@ package io.joern.php2cpg.querying import io.joern.php2cpg.testfixtures.PhpCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class UseTests extends PhpCode2CpgFixture { diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/DependenciesFromRequirementsTxtPass.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/DependenciesFromRequirementsTxtPass.scala index 0afff1632080..01a932277c44 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/DependenciesFromRequirementsTxtPass.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/DependenciesFromRequirementsTxtPass.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.nodes.{NewDependency} import org.slf4j.{Logger, LoggerFactory} diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/EdgeBuilder.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/EdgeBuilder.scala index fdb409d6ab0b..2973108ba84d 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/EdgeBuilder.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/EdgeBuilder.scala @@ -23,7 +23,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.{ NewUnknown } import io.shiftleft.codepropertygraph.generated.{EdgeTypes, nodes} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder class EdgeBuilder(diffGraph: DiffGraphBuilder) { def astEdge(dstNode: nodes.NewNode, srcNode: nodes.NewNode, order: Int): Unit = { diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/NodeBuilder.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/NodeBuilder.scala index e1364856880e..369c192d3532 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/NodeBuilder.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/NodeBuilder.scala @@ -7,7 +7,7 @@ import io.joern.x2cpg.Defines import io.joern.x2cpg.frontendspecific.pysrc2cpg.Constants import io.joern.x2cpg.utils.NodeBuilders import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EvaluationStrategies, nodes} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder class NodeBuilder(diffGraph: DiffGraphBuilder) { diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/Py2Cpg.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/Py2Cpg.scala index e951442986bb..6171292d3347 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/Py2Cpg.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/Py2Cpg.scala @@ -5,7 +5,7 @@ import io.joern.x2cpg.frontendspecific.pysrc2cpg.Constants import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Languages import overflowdb.BatchedUpdate -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder object Py2Cpg { case class InputPair(content: String, relFileName: String) diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/Py2CpgOnFileSystem.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/Py2CpgOnFileSystem.scala index 58e58dd8da88..391e044dca21 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/Py2CpgOnFileSystem.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/Py2CpgOnFileSystem.scala @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory import java.nio.file.* import scala.util.Try -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* case class Py2CpgOnFileSystemConfig( venvDir: Option[Path] = None, diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/PythonAstVisitor.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/PythonAstVisitor.scala index f1b8f7993a4b..fe5053bf0b29 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/PythonAstVisitor.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pysrc2cpg/PythonAstVisitor.scala @@ -9,7 +9,7 @@ import io.joern.x2cpg.{AstCreatorBase, ValidationMode} import io.shiftleft.codepropertygraph.generated.* import io.shiftleft.codepropertygraph.generated.nodes.{NewCall, NewIdentifier, NewNode, NewTypeDecl} import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import scala.collection.mutable diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/AstPrinter.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/AstPrinter.scala index 18a3cb30d32c..3e8864537c8b 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/AstPrinter.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/AstPrinter.scala @@ -1,5 +1,5 @@ package io.joern.pythonparser -import io.joern.pythonparser.ast._ +import io.joern.pythonparser.ast.* import scala.collection.immutable class AstPrinter(indentStr: String) extends AstVisitor[String] { diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/AstVisitor.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/AstVisitor.scala index 4a9617055bdd..167c2287c689 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/AstVisitor.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/AstVisitor.scala @@ -1,6 +1,6 @@ package io.joern.pythonparser -import io.joern.pythonparser.ast._ +import io.joern.pythonparser.ast.* trait AstVisitor[T] { def visit(ast: iast): T diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/PyParser.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/PyParser.scala index 36040ca8274b..826960e7f439 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/PyParser.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/PyParser.scala @@ -6,7 +6,7 @@ import io.joern.pythonparser.ast.{ErrorStatement, iast} import java.io.{BufferedReader, ByteArrayInputStream, InputStream, Reader} import java.nio.charset.StandardCharsets -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class PyParser { private var pythonParser: PythonParser = scala.compiletime.uninitialized diff --git a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/ast/Ast.scala b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/ast/Ast.scala index 02c5272c4df7..0ba09590deb0 100644 --- a/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/ast/Ast.scala +++ b/joern-cli/frontends/pysrc2cpg/src/main/scala/io/joern/pythonparser/ast/Ast.scala @@ -3,7 +3,7 @@ package io.joern.pythonparser.ast import io.joern.pythonparser.AstVisitor import java.util -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* // This file describes the AST classes. // It tries to stay as close as possible to the AST defined by CPython at diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/PySrc2CpgFixture.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/PySrc2CpgFixture.scala index a9b8a22e450a..ec18bfcc32a7 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/PySrc2CpgFixture.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/PySrc2CpgFixture.scala @@ -71,7 +71,7 @@ class PySrc2CpgFixture( implicit val resolver: ICallResolver = NoResolve protected def flowToResultPairs(path: Path): List[(String, Integer)] = - path.resultPairs().collect { case (firstElement: String, secondElement: Option[Integer]) => + path.resultPairs().collect { case (firstElement: String, secondElement) => (firstElement, secondElement.getOrElse(-1)) } } diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AssertCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AssertCpgTests.scala index 1f7ef899b70f..3861a8fb9f43 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AssertCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AssertCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AssignCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AssignCpgTests.scala index dca961f63eef..dfd12f7901db 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AssignCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AssignCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators, nodes} import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AttributeCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AttributeCpgTests.scala index e64fb1369e79..fb009aa002a0 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AttributeCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/AttributeCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BinOpCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BinOpCpgTests.scala index 1e2dc03cb42c..32965a724e30 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BinOpCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BinOpCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BoolOpCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BoolOpCpgTests.scala index 0d5ffa521e3a..d9e6ce6e5163 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BoolOpCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BoolOpCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BuiltinIdentifierTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BuiltinIdentifierTests.scala index fff6c7d5889c..ab82b9b8b083 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BuiltinIdentifierTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/BuiltinIdentifierTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/CallCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/CallCpgTests.scala index 7ec13f219950..503becf26f54 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/CallCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/CallCpgTests.scala @@ -2,8 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.PySrc2CpgFixture import io.shiftleft.codepropertygraph.generated.DispatchTypes -import io.shiftleft.semanticcpg.language._ -import overflowdb.traversal.NodeOps +import io.shiftleft.semanticcpg.language.* import java.io.File diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ClassCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ClassCpgTests.scala index aed25d40e211..aa85ab8bbd06 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ClassCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ClassCpgTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.PySrc2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ClassCpgTests extends PySrc2CpgFixture(withOssDataflow = false) { "class" should { diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/CompareCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/CompareCpgTests.scala index f01d5f698aa7..7fc6fcc9955f 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/CompareCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/CompareCpgTests.scala @@ -3,7 +3,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/DeleteCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/DeleteCpgTests.scala index cc1aa72bf86f..5fd9dbd26c11 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/DeleteCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/DeleteCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/FormatStringCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/FormatStringCpgTests.scala index 113401a91718..6f7e592a7a48 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/FormatStringCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/FormatStringCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/IfCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/IfCpgTests.scala index cbb02e48d5ba..c9e0512606a4 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/IfCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/IfCpgTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, nodes} import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ListCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ListCpgTests.scala index 73f85aa73fab..378c47532e30 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ListCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ListCpgTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/MemberCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/MemberCpgTests.scala index f8e88367fc3c..5e1171d10070 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/MemberCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/MemberCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext import io.shiftleft.codepropertygraph.generated.nodes.Member -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/MethodCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/MethodCpgTests.scala index 6e03d0808b92..0fa7609e8490 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/MethodCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/MethodCpgTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ModuleFunctionCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ModuleFunctionCpgTests.scala index 57c274c7502d..ced1d8d5ce99 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ModuleFunctionCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ModuleFunctionCpgTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/PatternMatchingTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/PatternMatchingTests.scala index 75bacc6c1dac..32adc0bc7394 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/PatternMatchingTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/PatternMatchingTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.PySrc2CpgFixture import io.shiftleft.codepropertygraph.generated.NodeTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class PatternMatchingTests extends PySrc2CpgFixture() { "pattern matching" should { diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/RaiseCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/RaiseCpgTests.scala index 58dd9b40fae4..48b154ac8d5e 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/RaiseCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/RaiseCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.Operators import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ReturnCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ReturnCpgTests.scala index 631bddb4aa5e..031df1583f3c 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ReturnCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/ReturnCpgTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/StarredCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/StarredCpgTests.scala index 67c53bd02f5a..3f8aa59df120 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/StarredCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/StarredCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/StringExpressionListCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/StringExpressionListCpgTests.scala index e926441a1940..c3e730932133 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/StringExpressionListCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/StringExpressionListCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.DispatchTypes import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/SubscriptCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/SubscriptCpgTests.scala index 134d0bd16608..e5186682a86d 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/SubscriptCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/SubscriptCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/UnaryOpCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/UnaryOpCpgTests.scala index 0c7739cda935..182b0fbfff05 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/UnaryOpCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/UnaryOpCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/VariableReferencingCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/VariableReferencingCpgTests.scala index 9da932fb2023..987baa0a4ee9 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/VariableReferencingCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/VariableReferencingCpgTests.scala @@ -2,7 +2,7 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext import io.shiftleft.codepropertygraph.generated.EvaluationStrategies -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/WhileCpgTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/WhileCpgTests.scala index 661c3bf6cb5e..f06eee5e617b 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/WhileCpgTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/cpg/WhileCpgTests.scala @@ -1,6 +1,6 @@ package io.joern.pysrc2cpg.cpg import io.joern.pysrc2cpg.Py2CpgTestContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, nodes} import org.scalatest.freespec.AnyFreeSpec import org.scalatest.matchers.should.Matchers diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/dataflow/DataFlowTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/dataflow/DataFlowTests.scala index 034b5183c0b7..6a7bf52adfff 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/dataflow/DataFlowTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/dataflow/DataFlowTests.scala @@ -969,8 +969,8 @@ class RegexDefinedFlowsDataFlowTests |print(Foo.func()) |""".stripMargin) "be found" in { - val src = cpg.call.code("Foo.func").l - val snk = cpg.call("print").l + val src = cpg.call.code("Foo.func") + val snk = cpg.call("print") snk.argument.reachableByFlows(src).size shouldBe 1 } } diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/ConfigPassTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/ConfigPassTests.scala index 930affce1d65..379ad722456f 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/ConfigPassTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/ConfigPassTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.passes import io.joern.pysrc2cpg.PySrc2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ConfigPassTests extends PySrc2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/DynamicTypeHintFullNamePassTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/DynamicTypeHintFullNamePassTests.scala index 284fb6b27408..af54b4d96685 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/DynamicTypeHintFullNamePassTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/DynamicTypeHintFullNamePassTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.passes import io.joern.pysrc2cpg.PySrc2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.io.File diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/ImportsPassTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/ImportsPassTests.scala index 1a8f338cb498..506a5be71027 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/ImportsPassTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/ImportsPassTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.passes import io.joern.pysrc2cpg.PySrc2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ImportsPassTests extends PySrc2CpgFixture(withOssDataflow = false) { diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/InheritanceFullNamePassTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/InheritanceFullNamePassTests.scala index 71e90af7761e..43d91d177418 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/InheritanceFullNamePassTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/InheritanceFullNamePassTests.scala @@ -1,7 +1,7 @@ package io.joern.pysrc2cpg.passes import io.joern.pysrc2cpg.PySrc2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.io.File diff --git a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/TypeRecoveryPassTests.scala b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/TypeRecoveryPassTests.scala index 8ae43b3361ba..1c75942ef685 100644 --- a/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/TypeRecoveryPassTests.scala +++ b/joern-cli/frontends/pysrc2cpg/src/test/scala/io/joern/pysrc2cpg/passes/TypeRecoveryPassTests.scala @@ -1051,7 +1051,7 @@ class TypeRecoveryPassTests extends PySrc2CpgFixture(withOssDataflow = false) { "assert the method properties in RedisDB, especially quoted type hints" in { val Some(redisDB) = cpg.typeDecl.nameExact("RedisDB").method.nameExact("").headOption: @unchecked - val List(instanceM, getRedisM, setM) = redisDB.astOut.isMethod.nameExact("instance", "get_redis", "set").l + val List(instanceM, getRedisM, setM) = redisDB.astChildren.isMethod.nameExact("instance", "get_redis", "set").l instanceM.methodReturn.typeFullName shouldBe Seq("db", "redis.py:.RedisDB").mkString(File.separator) getRedisM.methodReturn.typeFullName shouldBe "aioredis.py:.Redis" @@ -1324,12 +1324,9 @@ class TypeRecoveryPassTests extends PySrc2CpgFixture(withOssDataflow = false) { val variables = cpg.moduleVariables .where(_.typeFullName(".*FastAPI.*")) .l - val appIncludeRouterCalls = - variables.invokingCalls - .nameExact("include_router") - .l - val includedRouters = appIncludeRouterCalls.argument.argumentIndexGte(1).moduleVariables.l - val definitionsOfRouters = includedRouters.definitions.whereNot(_.source.isCall.nameExact("import")).l + val appIncludeRouterCalls = variables.invokingCalls.nameExact("include_router") + val includedRouters = appIncludeRouterCalls.argument.argumentIndexGte(1).moduleVariables + val definitionsOfRouters = includedRouters.definitions.whereNot(_.source.isCall.nameExact("import")) val List(adminRouter, normalRouter, itemsRouter) = definitionsOfRouters.map(x => (x.code, x.method.fullName)).sortBy(_._1).l: @unchecked diff --git a/joern-cli/frontends/rubysrc2cpg/build.sbt b/joern-cli/frontends/rubysrc2cpg/build.sbt index 9f2372e82bb6..78f72c6531f7 100644 --- a/joern-cli/frontends/rubysrc2cpg/build.sbt +++ b/joern-cli/frontends/rubysrc2cpg/build.sbt @@ -65,4 +65,4 @@ joernTypeStubsDlTask := { Compile / compile := ((Compile / compile) dependsOn joernTypeStubsDlTask).value Universal / packageName := name.value -Universal / topLevelDirectory := None \ No newline at end of file +Universal / topLevelDirectory := None diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/antlr4/io/joern/rubysrc2cpg/parser/RubyParser.g4 b/joern-cli/frontends/rubysrc2cpg/src/main/antlr4/io/joern/rubysrc2cpg/parser/RubyParser.g4 index 986106504530..34b867a2a5d6 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/antlr4/io/joern/rubysrc2cpg/parser/RubyParser.g4 +++ b/joern-cli/frontends/rubysrc2cpg/src/main/antlr4/io/joern/rubysrc2cpg/parser/RubyParser.g4 @@ -208,7 +208,7 @@ argumentWithParentheses argumentList : blockArgument # blockArgumentArgumentList - | splattingArgument (COMMA NL* blockArgument)? + | splattingArgument (COMMA NL* blockArgument)? (COMMA NL* operatorExpressionList)? # splattingArgumentArgumentList | operatorExpressionList (COMMA NL* associationList)? (COMMA NL* splattingArgument)? (COMMA NL* blockArgument)? # operatorsArgumentList @@ -282,7 +282,7 @@ primaryValue # assignmentWithRescue // Definitions - | CLASS classPath (LT commandOrPrimaryValueClass)? (SEMI | NL) bodyStatement END + | CLASS classPath (LT commandOrPrimaryValueClass)? (SEMI | NL)? bodyStatement END # classDefinition | CLASS LT2 commandOrPrimaryValueClass (SEMI | NL) bodyStatement END # singletonClassDefinition @@ -316,25 +316,10 @@ primaryValue # whileExpression | FOR NL* forVariable IN NL* commandOrPrimaryValue doClause END # forExpression - - // Non-nested calls - | SUPER argumentWithParentheses? block? - # superWithParentheses - | SUPER argumentList? block? - # superWithoutParentheses - | isDefinedKeyword LPAREN expressionOrCommand RPAREN - # isDefinedExpression - | isDefinedKeyword primaryValue - # isDefinedCommand - | methodOnlyIdentifier - # methodCallExpression - | methodIdentifier block - # methodCallWithBlockExpression - | methodIdentifier argumentWithParentheses block? - # methodCallWithParenthesesExpression - | variableReference - # methodCallOrVariableReference - + + | methodCallsWithParentheses + # methodCallWithParentheses + // Literals | LBRACK NL* indexingArgumentList? NL* RBRACK # bracketedArrayLiteral @@ -407,6 +392,26 @@ primaryValue # hereDocs ; +// Non-nested calls +methodCallsWithParentheses + : SUPER argumentWithParentheses? block? + # superWithParentheses + | SUPER argumentList? block? + # superWithoutParentheses + | isDefinedKeyword LPAREN expressionOrCommand RPAREN + # isDefinedExpression + | isDefinedKeyword primaryValue + # isDefinedCommand + | methodOnlyIdentifier + # methodCallExpression + | methodIdentifier block + # methodCallWithBlockExpression + | methodIdentifier argumentWithParentheses block? + # methodCallWithParenthesesExpression + | variableReference + # methodCallOrVariableReference + ; + // This is required to make chained calls work. For classes, we cannot move up the `primaryValue` due to the possible // presence of AMPDOT when inheriting (class Foo < Bar::Baz), but the command rule doesn't allow chained calls // in if statements to be created properly, and ends throwing away everything after the first call. Splitting these @@ -516,7 +521,7 @@ methodParameterPart parameterList : mandatoryOrOptionalParameterList (COMMA NL* arrayParameter)? (COMMA NL* hashParameter)? (COMMA NL* procParameter)? - | arrayParameter (COMMA NL* hashParameter)? (COMMA NL* procParameter)? + | arrayParameter (COMMA NL* hashParameter)? (COMMA NL* procParameter)? (COMMA NL* mandatoryOrOptionalParameterList)? | hashParameter (COMMA NL* procParameter)? | procParameter ; @@ -591,6 +596,9 @@ associationList association : associationKey (EQGT | COLON) NL* operatorExpression + # associationElement + | associationHashArgument + # associationHashArg ; associationKey @@ -598,6 +606,10 @@ associationKey | keyword ; +associationHashArgument + : STAR2 (LOCAL_VARIABLE_IDENTIFIER | methodCallsWithParentheses | (LPAREN methodInvocationWithoutParentheses RPAREN))? + ; + regexpLiteralContent : REGULAR_EXPRESSION_BODY | REGULAR_EXPRESSION_INTERPOLATION_BEGIN compoundStatement REGULAR_EXPRESSION_INTERPOLATION_END diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreator.scala index ea422185d4e1..a5aba81c9209 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreator.scala @@ -1,5 +1,6 @@ package io.joern.rubysrc2cpg.astcreation +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import io.joern.rubysrc2cpg.astcreation.RubyIntermediateAst.* import io.joern.rubysrc2cpg.datastructures.{BlockScope, NamespaceScope, RubyProgramSummary, RubyScope, RubyStubbedType} import io.joern.rubysrc2cpg.parser.{RubyNodeCreator, RubyParser} @@ -10,8 +11,7 @@ import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EdgeTypes, Modif import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal import org.slf4j.{Logger, LoggerFactory} -import overflowdb.BatchedUpdate -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import java.util.regex.Matcher @@ -44,14 +44,14 @@ class AstCreator( .map(_.stripPrefix(java.io.File.separator)) .getOrElse(fileName) - private def internalLineAndColNum: Option[Integer] = Option(1) + private def internalLineAndColNum: Option[Int] = Option(1) /** The relative file name, in a unix path delimited format. */ private def relativeUnixStyleFileName = relativeFileName.replaceAll(Matcher.quoteReplacement(java.io.File.separator), "/") - override def createAst(): BatchedUpdate.DiffGraphBuilder = { + override def createAst(): DiffGraphBuilder = { val rootNode = new RubyNodeCreator().visit(programCtx).asInstanceOf[StatementList] val ast = astForRubyFile(rootNode) Ast.storeInDiffGraph(ast, diffGraph) @@ -78,9 +78,11 @@ class AstCreator( } private def astInFakeMethod(rootNode: StatementList): Ast = { - val name = Defines.Program - val fullName = computeMethodFullName(name) - val code = rootNode.text + val name = Defines.Main + // From the
method onwards, we do not embed the namespace name in the full names + val fullName = + s"${scope.surroundingScopeFullName.head.stripSuffix(NamespaceTraversal.globalNamespaceName)}$name" + val code = rootNode.text val methodNode_ = methodNode( node = rootNode, name = name, diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreatorHelper.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreatorHelper.scala index d519c4e1deb8..56b03f389b4b 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreatorHelper.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreatorHelper.scala @@ -15,10 +15,32 @@ import io.joern.x2cpg.{Ast, ValidationMode} import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EdgeTypes, Operators} +import scala.collection.mutable + trait AstCreatorHelper(implicit withSchemaValidation: ValidationMode) { this: AstCreator => - protected def computeClassFullName(name: String): String = s"${scope.surroundingScopeFullName.head}.$name" - protected def computeMethodFullName(name: String): String = s"${scope.surroundingScopeFullName.head}:$name" + private val usedFullNames = mutable.Set.empty[String] + + /** Ensures a unique full name is assigned based on the current scope. + * @param name + * the name of the entity. + * @param counter + * an optional counter, used to create unique instances in the case of redefinitions. + * @return + * a unique full name. + */ + protected def computeFullName(name: String, counter: Option[Int] = None): String = { + val candidate = counter match { + case Some(cnt) => s"${scope.surroundingScopeFullName.head}.$name$cnt" + case None => s"${scope.surroundingScopeFullName.head}.$name" + } + if (usedFullNames.contains(candidate)) { + computeFullName(name, counter.map(_ + 1).orElse(Option(0))) + } else { + usedFullNames.add(candidate) + candidate + } + } override def column(node: RubyNode): Option[Int] = node.column override def columnEnd(node: RubyNode): Option[Int] = node.columnEnd diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForExpressionsCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForExpressionsCreator.scala index 8c1000f388f3..4f4241d55c86 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForExpressionsCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForExpressionsCreator.scala @@ -22,41 +22,44 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val tmpGen: FreshNameGenerator[String] = FreshNameGenerator(i => s"") protected def astForExpression(node: RubyNode): Ast = node match - case node: StaticLiteral => astForStaticLiteral(node) - case node: HereDocNode => astForHereDoc(node) - case node: DynamicLiteral => astForDynamicLiteral(node) - case node: UnaryExpression => astForUnary(node) - case node: BinaryExpression => astForBinary(node) - case node: MemberAccess => astForMemberAccess(node) - case node: MemberCall => astForMemberCall(node) - case node: ObjectInstantiation => astForObjectInstantiation(node) - case node: IndexAccess => astForIndexAccess(node) - case node: SingleAssignment => astForSingleAssignment(node) - case node: AttributeAssignment => astForAttributeAssignment(node) - case node: TypeIdentifier => astForTypeIdentifier(node) - case node: RubyIdentifier => astForSimpleIdentifier(node) - case node: SimpleCall => astForSimpleCall(node) - case node: RequireCall => astForRequireCall(node) - case node: IncludeCall => astForIncludeCall(node) - case node: YieldExpr => astForYield(node) - case node: RangeExpression => astForRange(node) - case node: ArrayLiteral => astForArrayLiteral(node) - case node: HashLiteral => astForHashLiteral(node) - case node: Association => astForAssociation(node) - case node: IfExpression => astForIfExpression(node) - case node: UnlessExpression => astForUnlessExpression(node) - case node: RescueExpression => astForRescueExpression(node) - case node: CaseExpression => blockAst(NewBlock(), astsForCaseExpression(node).toList) - case node: MandatoryParameter => astForMandatoryParameter(node) - case node: SplattingRubyNode => astForSplattingRubyNode(node) - case node: AnonymousTypeDeclaration => astForAnonymousTypeDeclaration(node) - case node: ProcOrLambdaExpr => astForProcOrLambdaExpr(node) - case node: RubyCallWithBlock[_] => astForCallWithBlock(node) - case node: SelfIdentifier => astForSelfIdentifier(node) - case node: BreakStatement => astForBreakStatement(node) - case node: StatementList => astForStatementList(node) - case node: DummyNode => Ast(node.node) - case node: Unknown => astForUnknown(node) + case node: StaticLiteral => astForStaticLiteral(node) + case node: HereDocNode => astForHereDoc(node) + case node: DynamicLiteral => astForDynamicLiteral(node) + case node: UnaryExpression => astForUnary(node) + case node: BinaryExpression => astForBinary(node) + case node: MemberAccess => astForMemberAccess(node) + case node: MemberCall => astForMemberCall(node) + case node: ObjectInstantiation => astForObjectInstantiation(node) + case node: IndexAccess => astForIndexAccess(node) + case node: SingleAssignment => astForSingleAssignment(node) + case node: AttributeAssignment => astForAttributeAssignment(node) + case node: TypeIdentifier => astForTypeIdentifier(node) + case node: RubyIdentifier => astForSimpleIdentifier(node) + case node: SimpleCall => astForSimpleCall(node) + case node: RequireCall => astForRequireCall(node) + case node: IncludeCall => astForIncludeCall(node) + case node: YieldExpr => astForYield(node) + case node: RangeExpression => astForRange(node) + case node: ArrayLiteral => astForArrayLiteral(node) + case node: HashLiteral => astForHashLiteral(node) + case node: Association => astForAssociation(node) + case node: IfExpression => astForIfExpression(node) + case node: UnlessExpression => astForUnlessExpression(node) + case node: RescueExpression => astForRescueExpression(node) + case node: CaseExpression => blockAst(NewBlock(), astsForCaseExpression(node).toList) + case node: MandatoryParameter => astForMandatoryParameter(node) + case node: SplattingRubyNode => astForSplattingRubyNode(node) + case node: AnonymousTypeDeclaration => astForAnonymousTypeDeclaration(node) + case node: ProcOrLambdaExpr => astForProcOrLambdaExpr(node) + case node: SingletonObjectMethodDeclaration => astForSingletonObjectMethodDeclaration(node) + case node: RubyCallWithBlock[_] => astForCallWithBlock(node) + case node: SelfIdentifier => astForSelfIdentifier(node) + case node: BreakStatement => astForBreakStatement(node) + case node: StatementList => astForStatementList(node) + case node: ReturnExpression => astForReturnStatement(node) + case node: NextExpression => astForNextExpression(node) + case node: DummyNode => Ast(node.node) + case node: Unknown => astForUnknown(node) case x => logger.warn(s"Unhandled expression of type ${x.getClass.getSimpleName}") astForUnknown(node) @@ -171,7 +174,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { Ast(typeRefNode(node, code(node), node.typeFullName)) } - protected def astForMemberCall(node: MemberCall): Ast = { + protected def astForMemberCall(node: MemberCall, isStatic: Boolean = false): Ast = { def createMemberCall(n: MemberCall): Ast = { val baseAst = astForExpression(n.target) // this wil be something like self.Foo @@ -184,22 +187,26 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { } val (receiverFullName, methodFullName) = receiverAst.nodes .collectFirst { - case _ if builtinType.isDefined => builtinType.get -> s"${builtinType.get}:${n.methodName}" + case _ if builtinType.isDefined => builtinType.get -> s"${builtinType.get}.${n.methodName}" case x: NewMethodRef => x.methodFullName -> x.methodFullName case _ => (n.target match { case ma: MemberAccess => scope.tryResolveTypeReference(ma.memberName).map(_.name) case _ => typeFromCallTarget(n.target) - }).map(x => x -> s"$x:${n.methodName}") + }).map(x => x -> s"$x.${n.methodName}") .getOrElse(XDefines.Any -> XDefines.DynamicCallUnknownFullName) } .getOrElse(XDefines.Any -> XDefines.DynamicCallUnknownFullName) val argumentAsts = n.arguments.map(astForMethodCallArgument) - val dispatchType = DispatchTypes.DYNAMIC_DISPATCH + val dispatchType = if (isStatic) DispatchTypes.STATIC_DISPATCH else DispatchTypes.DYNAMIC_DISPATCH val call = callNode(n, code(n), n.methodName, XDefines.DynamicCallUnknownFullName, dispatchType) if methodFullName != XDefines.DynamicCallUnknownFullName then call.possibleTypes(Seq(methodFullName)) - callAst(call, argumentAsts, base = Option(baseAst), receiver = Option(receiverAst)) + if (isStatic) { + callAst(call, argumentAsts, base = Option(baseAst)).copy(receiverEdges = Nil) + } else { + callAst(call, argumentAsts, base = Option(baseAst), receiver = Option(receiverAst)) + } } def determineMemberAccessBase(target: RubyNode): RubyNode = target match { @@ -262,7 +269,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { as referring to the singleton class. */ val (receiverTypeFullName, fullName) = scope.tryResolveTypeReference(className) match { - case Some(typeMetaData) => s"${typeMetaData.name}" -> s"${typeMetaData.name}:$methodName" + case Some(typeMetaData) => s"${typeMetaData.name}" -> s"${typeMetaData.name}.$methodName" case None => XDefines.Any -> XDefines.DynamicCallUnknownFullName } /* @@ -302,8 +309,8 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val argumentAsts = node match { case x: SimpleObjectInstantiation => x.arguments.map(astForMethodCallArgument) case x: ObjectInstantiationWithBlock => - val Seq(_, methodRef) = astForDoBlock(x.block): @unchecked - x.arguments.map(astForMethodCallArgument) :+ methodRef + val Seq(typeRef, _) = astForDoBlock(x.block): @unchecked + x.arguments.map(astForMethodCallArgument) :+ typeRef } val constructorCall = callNode(node, code(node), callName, fullName, DispatchTypes.DYNAMIC_DISPATCH) @@ -360,6 +367,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { astForExpression(node.lhs) case _ => astForExpression(node.lhs) } + val rhsAst = astForExpression(node.rhs) // If this is a simple object instantiation assignment, we can give the LHS variable a type hint @@ -472,24 +480,22 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { astForSimpleCall(node.asSimpleCall) } - /** A yield in Ruby could either return the result of the block, or simply call the block, depending on runtime - * conditions. Thus we embed this in a conditional expression where the condition itself is some non-deterministic - * placeholder. + /** A yield in Ruby calls an explicit (or implicit) proc parameter and returns its value. This can be lowered as + * block.call(), which is effectively how one invokes a proc parameter in any case. */ protected def astForYield(node: YieldExpr): Ast = { scope.useProcParam match { case Some(param) => - val call = astForExpression( - SimpleCall(SimpleIdentifier()(node.span.spanStart(param)), node.arguments)(node.span.spanStart(param)) - ) - val ret = returnAst(returnNode(node, code(node))) - val cond = astForExpression( - SimpleCall(SimpleIdentifier()(node.span.spanStart(tmpGen.fresh)), List())(node.span.spanStart("")) - ) - callAst( - callNode(node, code(node), Operators.conditional, Operators.conditional, DispatchTypes.STATIC_DISPATCH), - List(cond, call, ret) - ) + // We do not know if we necessarily have an explicit proc param here, or if we need to create a new one + if (scope.lookupVariable(param).isEmpty) { + scope.anonProcParam.map { param => + val paramNode = ProcParameter(param)(node.span.spanStart(s"&$param")) + astForParameter(paramNode, -1) + } + } + val loweredCall = + MemberCall(SimpleIdentifier()(node.span.spanStart(param)), ".", "call", node.arguments)(node.span) + astForExpression(loweredCall) case None => logger.warn(s"Yield expression outside of method scope: ${code(node)} ($relativeFileName), skipping") astForUnknown(node) @@ -548,7 +554,8 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val argumentAsts = node.elements.flatMap(elem => elem match - case associationNode: Association => astForAssociationHash(associationNode, tmp) + case associationNode: Association => astForAssociationHash(associationNode, tmp) + case splattingRubyNode: SplattingRubyNode => astForSplattingRubyNode(splattingRubyNode) :: Nil case node => logger.warn(s"Could not represent element: ${code(node)} ($relativeFileName), skipping") astForUnknown(node) :: Nil @@ -728,7 +735,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { val methodName = memberAccess.memberName // TODO: Type recovery should potentially resolve this val methodFullName = typeFromCallTarget(memberAccess.target) - .map(x => s"$x:$methodName") + .map(x => s"$x.$methodName") .getOrElse(XDefines.DynamicCallUnknownFullName) val argumentAsts = node.arguments.map(astForMethodCallArgument) val call = @@ -753,7 +760,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { ) // Check if this is a method invocation of a member imported into scope match { case Some(m) => - scope.typeForMethod(m).map(t => t.name -> s"${t.name}:${m.name}").getOrElse(defaultResult) + scope.typeForMethod(m).map(t => t.name -> s"${t.name}.${m.name}").getOrElse(defaultResult) case None => defaultResult } @@ -774,8 +781,22 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { } private def astForProcOrLambdaExpr(node: ProcOrLambdaExpr): Ast = { - val Seq(_, methodRef) = astForDoBlock(node.block): @unchecked - methodRef + val Seq(typeRef, _) = astForDoBlock(node.block): @unchecked + typeRef + } + + private def astForSingletonObjectMethodDeclaration(node: SingletonObjectMethodDeclaration): Ast = { + val methodAstsWithRefs = astForMethodDeclaration(node, isSingletonObjectMethod = true) + + // Set span contents + methodAstsWithRefs.flatMap(_.nodes).foreach { + case m: NewMethodRef => DummyNode(m.copy)(node.body.span.spanStart(m.code)) + case _ => + } + + val Seq(typeRef, _) = methodAstsWithRefs + + typeRef } private def astForMethodCallArgument(node: RubyNode): Ast = { @@ -783,11 +804,11 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { // Associations in method calls are keyword arguments case assoc: Association => astForKeywordArgument(assoc) case block: RubyBlock => - val Seq(methodDecl, typeDecl, _, methodRef) = astForDoBlock(block) + val Seq(methodDecl, typeDecl, typeRef, _) = astForDoBlock(block) Ast.storeInDiffGraph(methodDecl, diffGraph) Ast.storeInDiffGraph(typeDecl, diffGraph) - methodRef + typeRef case selfMethod: SingletonMethodDeclaration => // Last element is the method declaration, the prefix methods would be `foo = def foo (...)` pointers in other // contexts, but this would be empty as a method call argument @@ -799,7 +820,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { } Ast.storeInDiffGraph(methodDeclAst, diffGraph) scope.surroundingScopeFullName - .map(s => Ast(methodRefNode(node, selfMethod.span.text, s"$s:${selfMethod.methodName}", Defines.Any))) + .map(s => Ast(methodRefNode(node, selfMethod.span.text, s"$s.${selfMethod.methodName}", Defines.Any))) .getOrElse(Ast()) case _ => astForExpression(node) } @@ -813,7 +834,7 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) { x.argumentIndex_=(-1) } value - case _: StaticLiteral => astForExpression(assoc) + case _: (LiteralExpr | RubyCall) => astForExpression(assoc) case x => logger.warn(s"Not explicitly handled argument association key of type ${x.getClass.getSimpleName}") astForExpression(assoc) diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForFunctionsCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForFunctionsCreator.scala index 4bdc09643f52..a03cb3498be0 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForFunctionsCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForFunctionsCreator.scala @@ -36,12 +36,22 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th * @return * a method declaration with additional refs and types if specified. */ - protected def astForMethodDeclaration(node: MethodDeclaration, isClosure: Boolean = false): Seq[Ast] = { + protected def astForMethodDeclaration( + node: RubyNode & ProcedureDeclaration, + isClosure: Boolean = false, + isSingletonObjectMethod: Boolean = false + ): Seq[Ast] = { val isInTypeDecl = scope.surroundingAstLabel.contains(NodeTypes.TYPE_DECL) val isConstructor = (node.methodName == Defines.Initialize) && isInTypeDecl val methodName = node.methodName + // TODO: body could be a try - val fullName = computeMethodFullName(methodName) + + val fullName = node match { + case x: SingletonObjectMethodDeclaration => computeFullName(s"class<<${x.baseClass.span.text}.$methodName") + case _ => computeFullName(methodName) + } + val method = methodNode( node = node, name = methodName, @@ -59,6 +69,7 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th val thisParameterAst = Ast( newThisParameterNode( + name = Defines.Self, code = Defines.Self, typeFullName = scope.surroundingTypeFullName.getOrElse(Defines.Any), line = method.lineNumber, @@ -71,11 +82,15 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th val methodReturn = methodReturnNode(node, Defines.Any) - val refs = - List(typeRefNode(node, methodName, fullName), methodRefNode(node, methodName, fullName, fullName)).map(Ast.apply) + val refs = { + val typeRef = + if isClosure then typeRefNode(node, s"$methodName&Proc", s"$fullName&Proc") + else typeRefNode(node, methodName, fullName) + List(typeRef, methodRefNode(node, methodName, fullName, fullName)).map(Ast.apply) + } // Consider which variables are captured from the outer scope - val stmtBlockAst = if (isClosure) { + val stmtBlockAst = if (isClosure || isSingletonObjectMethod) { val baseStmtBlockAst = astForMethodBody(node.body, optionalStatementList) transformAsClosureBody(refs, baseStmtBlockAst) } else { @@ -90,11 +105,11 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th } // For yield statements where there isn't an explicit proc parameter - val anonProcParam = scope.anonProcParam.map { param => - val paramNode = ProcParameter(param)(node.span.spanStart(s"&$param")) + val anonProcParam = scope.procParamName.map { p => val nextIndex = - parameterAsts.lastOption.flatMap(_.root).map { case m: NewMethodParameterIn => m.index + 1 }.getOrElse(0) - astForParameter(paramNode, nextIndex) + parameterAsts.flatMap(_.root).lastOption.map { case m: NewMethodParameterIn => m.index + 1 }.getOrElse(0) + + Ast(p.index(nextIndex)) } scope.popScope() @@ -104,29 +119,36 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th scope.surroundingAstLabel.foreach(typeDeclNode_.astParentType(_)) scope.surroundingScopeFullName.foreach(typeDeclNode_.astParentFullName(_)) createMethodTypeBindings(method, typeDeclNode_) - if isClosure then - Ast(typeDeclNode_) - .withChild(Ast(newModifierNode(ModifierTypes.LAMBDA))) - .withChild( - // This member refers back to itself, as itself is the type decl bound to the respective method - Ast(NewMember().name("call").code("call").dynamicTypeHintFullName(Seq(fullName)).typeFullName(Defines.Any)) - ) + if isClosure then Ast(typeDeclNode_).withChild(Ast(newModifierNode(ModifierTypes.LAMBDA))) else Ast(typeDeclNode_) } + // Due to lambdas being invoked by `call()`, this additional type ref holding that member is created. + val lambdaTypeDeclAst = if isClosure then { + val typeDeclNode_ = typeDeclNode(node, s"$methodName&Proc", s"$fullName&Proc", relativeFileName, code(node)) + scope.surroundingAstLabel.foreach(typeDeclNode_.astParentType(_)) + scope.surroundingScopeFullName.foreach(typeDeclNode_.astParentFullName(_)) + Ast(typeDeclNode_) + .withChild( + // This member refers back to itself, as itself is the type decl bound to the respective method + Ast(NewMember().name("call").code("call").dynamicTypeHintFullName(Seq(fullName)).typeFullName(Defines.Any)) + ) + } else Ast() + val modifiers = mutable.Buffer(ModifierTypes.VIRTUAL) if (isClosure) modifiers.addOne(ModifierTypes.LAMBDA) if (isConstructor) modifiers.addOne(ModifierTypes.CONSTRUCTOR) val prefixMemberAst = - if isClosure || isSurroundedByProgramScope then Ast() // program scope members are set elsewhere + if isClosure || isSingletonObjectMethod || isSurroundedByProgramScope then + Ast() // program scope members are set elsewhere else { // Singleton constructors that initialize @@ fields should have their members linked under the singleton class val methodMember = scope.surroundingTypeFullName match { case Some(astParentTfn) => memberForMethod(method, Option(NodeTypes.TYPE_DECL), Option(astParentTfn)) case None => memberForMethod(method, scope.surroundingAstLabel, scope.surroundingScopeFullName) } - Ast(memberForMethod(method, scope.surroundingAstLabel, scope.surroundingScopeFullName)) + Ast(memberForMethod(method, Option(NodeTypes.TYPE_DECL), scope.surroundingScopeFullName)) } // For closures, we also want the method/type refs for upstream use val methodAst_ = { @@ -141,10 +163,11 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th } // Each of these ASTs are linked via AstLinker as per the astParent* properties - (prefixMemberAst :: methodAst_ :: methodTypeDeclAst :: Nil).foreach(Ast.storeInDiffGraph(_, diffGraph)) + (prefixMemberAst :: methodAst_ :: methodTypeDeclAst :: lambdaTypeDeclAst :: Nil) + .foreach(Ast.storeInDiffGraph(_, diffGraph)) // In the case of a closure, we expect this method to return a method ref, otherwise, we bind a pointer to a // method ref, e.g. self.foo = def foo(...) - if isClosure then refs else createMethodRefPointer(method) :: Nil + if isClosure || isSingletonObjectMethod then refs else createMethodRefPointer(method) :: Nil } private def transformAsClosureBody(refs: List[Ast], baseStmtBlockAst: Ast) = { @@ -163,25 +186,25 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th case _ => false }) - val methodRefOption = refs.flatMap(_.nodes).collectFirst { case x: NewMethodRef => x } + val methodRefOption = refs.flatMap(_.nodes).collectFirst { case x: NewTypeRef => x } capturedLocalNodes .collect { case local: NewLocal => - val closureBindingId = scope.surroundingScopeFullName.map(x => s"$x:${local.name}") + val closureBindingId = scope.variableScopeFullName(local.name).map(x => s"$x.${local.name}") (local, local.name, local.code, closureBindingId) case param: NewMethodParameterIn => - val closureBindingId = scope.surroundingScopeFullName.map(x => s"$x:${param.name}") + val closureBindingId = scope.variableScopeFullName(param.name).map(x => s"$x.${param.name}") (param, param.name, param.code, closureBindingId) } - .collect { case (decl, name, code, Some(closureBindingId)) => - val local = newLocalNode(name, code, Option(closureBindingId)) + .collect { case (capturedLocal, name, code, Some(closureBindingId)) => + val capturingLocal = newLocalNode(name, code, Option(closureBindingId)) val closureBinding = newClosureBindingNode(closureBindingId, name, EvaluationStrategies.BY_REFERENCE) // Create new local node for lambda, with corresponding REF edges to identifiers and closure binding - capturedBlockAst.withChild(Ast(local)) - capturedIdentifiers.filter(_.name == name).foreach(i => capturedBlockAst.withRefEdge(i, local)) - diffGraph.addEdge(closureBinding, decl, EdgeTypes.REF) + capturedBlockAst.root.foreach(rootBlock => diffGraph.addEdge(rootBlock, capturingLocal, EdgeTypes.AST)) + capturedIdentifiers.filter(_.name == name).foreach(i => diffGraph.addEdge(i, capturingLocal, EdgeTypes.REF)) + diffGraph.addEdge(closureBinding, capturedLocal, EdgeTypes.REF) methodRefOption.foreach(methodRef => diffGraph.addEdge(methodRef, closureBinding, EdgeTypes.CAPTURE)) } @@ -222,9 +245,8 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th evaluationStrategy = EvaluationStrategies.BY_REFERENCE, typeFullName = None ) - scope.addToScope(node.name, parameterIn) - scope.setProcParam(node.name) - Ast(parameterIn) + scope.setProcParam(node.name, parameterIn) + Ast() // The proc parameter is retrieved later under method AST creation case node: CollectionParameter => val typeFullName = node match { case ArrayParameter(_) => prefixAsKernelDefined("Array") @@ -301,7 +323,7 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th protected def astForSingletonMethodDeclaration(node: SingletonMethodDeclaration): Seq[Ast] = { node.target match { case targetNode: SingletonMethodIdentifier => - val fullName = computeMethodFullName(node.methodName) + val fullName = computeFullName(node.methodName) val (astParentType, astParentFullName, thisParamCode, addEdge) = targetNode match { case _: SelfIdentifier => @@ -353,15 +375,15 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th ) ) - val parameterAsts = astForParameters(node.parameters) + val parameterAsts = thisParameterAst :: astForParameters(node.parameters) val optionalStatementList = statementListForOptionalParams(node.parameters) val stmtBlockAst = astForMethodBody(node.body, optionalStatementList) - val anonProcParam = scope.anonProcParam.map { param => - val paramNode = ProcParameter(param)(node.span.spanStart(s"&$param")) + val anonProcParam = scope.procParamName.map { p => val nextIndex = - parameterAsts.lastOption.flatMap(_.root).map { case m: NewMethodParameterIn => m.index + 1 }.getOrElse(1) - astForParameter(paramNode, nextIndex) + parameterAsts.flatMap(_.root).lastOption.map { case m: NewMethodParameterIn => m.index + 1 }.getOrElse(0) + + Ast(p.index(nextIndex)) } scope.popScope() @@ -373,7 +395,7 @@ trait AstForFunctionsCreator(implicit withSchemaValidation: ValidationMode) { th val _methodAst = methodAst( method, - (thisParameterAst +: parameterAsts) ++ anonProcParam, + parameterAsts ++ anonProcParam, stmtBlockAst, methodReturnNode(node, Defines.Any), newModifierNode(ModifierTypes.VIRTUAL) :: Nil diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForStatementsCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForStatementsCreator.scala index 68504e6cd561..4e1089105fab 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForStatementsCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForStatementsCreator.scala @@ -29,6 +29,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t case node: SingletonMethodDeclaration => astForSingletonMethodDeclaration(node) case node: MultipleAssignment => node.assignments.map(astForExpression) case node: BreakStatement => astForBreakStatement(node) :: Nil + case node: SingletonStatementList => astForSingletonStatementList(node) case _ => astForExpression(node) :: Nil private def astForWhileStatement(node: WhileExpression): Ast = { @@ -195,13 +196,13 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t * ``` */ protected def astForCallWithBlock[C <: RubyCall](node: RubyNode & RubyCallWithBlock[C]): Ast = { - val Seq(_, methodRefAst) = astForDoBlock(node.block): @unchecked - val methodRefDummyNode = methodRefAst.root.map(DummyNode(_)(node.span)).toList + val Seq(typeRef, _) = astForDoBlock(node.block): @unchecked + val typeRefDummyNode = typeRef.root.map(DummyNode(_)(node.span)).toList // Create call with argument referencing the MethodRef val callWithLambdaArg = node.withoutBlock match { - case x: SimpleCall => astForSimpleCall(x.copy(arguments = x.arguments ++ methodRefDummyNode)(x.span)) - case x: MemberCall => astForMemberCall(x.copy(arguments = x.arguments ++ methodRefDummyNode)(x.span)) + case x: SimpleCall => astForSimpleCall(x.copy(arguments = x.arguments ++ typeRefDummyNode)(x.span)) + case x: MemberCall => astForMemberCall(x.copy(arguments = x.arguments ++ typeRefDummyNode)(x.span)) case x => logger.warn(s"Unhandled call-with-block type ${code(x)}, creating anonymous method structures only") Ast() @@ -221,12 +222,6 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t astForMethodDeclaration(block.toMethodDeclaration(methodName, Option(block.parameters)), isClosure = true) } - // Set span contents - methodAstsWithRefs.flatMap(_.nodes).foreach { - case m: NewMethodRef => DummyNode(m.copy)(block.span.spanStart(m.code)) - case _ => - } - methodAstsWithRefs } @@ -236,6 +231,15 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t returnAst(returnNode_, argumentAsts) } + protected def astForNextExpression(node: NextExpression): Ast = { + val nextNode = NewControlStructure() + .controlStructureType(ControlStructureTypes.CONTINUE) + .lineNumber(line(node)) + .columnNumber(column(node)) + .code(code(node)) + Ast(nextNode) + } + protected def astForStatementListReturningLastExpression(node: StatementList): Ast = { val block = blockNode(node) scope.pushNewScope(BlockScope(block)) @@ -280,8 +284,8 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t ) case node: MemberAccess => astForReturnMemberCall(node) :: Nil case ret: ReturnExpression => astForReturnStatement(ret) :: Nil - case node: MethodDeclaration => - (astForMethodDeclaration(node) :+ astForReturnMethodDeclarationSymbolName(node)).toList + case node: (MethodDeclaration | SingletonMethodDeclaration) => + (astsForStatement(node) :+ astForReturnMethodDeclarationSymbolName(node)).toList case _: BreakStatement => astsForStatement(node).toList case node => logger.warn( @@ -301,7 +305,7 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t // The evaluation of a MethodDeclaration returns its name in symbol form. // E.g. `def f = 0` ===> `:f` - private def astForReturnMethodDeclarationSymbolName(node: MethodDeclaration): Ast = { + private def astForReturnMethodDeclarationSymbolName(node: RubyNode & ProcedureDeclaration): Ast = { val literalNode_ = literalNode(node, s":${node.methodName}", getBuiltInType(Defines.Symbol)) val returnNode_ = returnNode(node, literalNode_.code) returnAst(returnNode_, Seq(Ast(literalNode_))) @@ -324,6 +328,10 @@ trait AstForStatementsCreator(implicit withSchemaValidation: ValidationMode) { t Ast(_node) } + protected def astForSingletonStatementList(list: SingletonStatementList): Seq[Ast] = { + list.statements.map(astForExpression) + } + /** Wraps the last RubyNode with a ReturnExpression. * @param x * the node to wrap a return around. If a StatementList is given, then the ReturnExpression will wrap around the diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForTypesCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForTypesCreator.scala index 4b827f02db83..7471ad98994b 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForTypesCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForTypesCreator.scala @@ -27,26 +27,21 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: astForUnknown(node) :: Nil } - private def getBaseClassName(node: RubyNode): Option[String] = { + private def getBaseClassName(node: RubyNode): String = { node match case simpleIdentifier: SimpleIdentifier => - val name = simpleIdentifier.text - scope.lookupVariable(name) match { - case Some(_) => Option(name) // in the case of singleton classes, we want to keep the variable name - case None => scope.tryResolveTypeReference(name).map(_.name).orElse(Option(name)) - } + simpleIdentifier.text case _: SelfIdentifier => - scope.surroundingTypeFullName + Defines.Self case qualifiedBaseClass: MemberAccess => - scope - .tryResolveTypeReference(qualifiedBaseClass.toString) - .map(_.name) - .orElse(Option(qualifiedBaseClass.toString)) + qualifiedBaseClass.text.replace("::", ".") + case qualifiedBaseClass: MemberCall => + qualifiedBaseClass.text.replace("::", ".") case x => logger.warn( - s"Base class names of type ${x.getClass} are not supported yet: ${code(node)} ($relativeFileName), skipping" + s"Base class names of type ${x.getClass} are not supported yet: ${code(node)} ($relativeFileName), returning string as-is" ) - None + x.text } private def astForSimpleNamedClassDeclaration( @@ -54,8 +49,8 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: nameIdentifier: SimpleIdentifier ): Seq[Ast] = { val className = nameIdentifier.text - val inheritsFrom = node.baseClass.flatMap(getBaseClassName).toList - val classFullName = computeClassFullName(className) + val inheritsFrom = node.baseClass.map(getBaseClassName).toList + val classFullName = computeFullName(className) val typeDecl = typeDeclNode( node = node, name = className, @@ -146,7 +141,7 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: .withChildren(fieldSingletonMemberNodes.map(_._2)) val bodyMemberCallAst = node.bodyMemberCall match { - case Some(bodyMemberCall) => astForMemberCall(bodyMemberCall) + case Some(bodyMemberCall) => astForTypeDeclBodyCall(bodyMemberCall, classFullName) case None => Ast() } @@ -154,6 +149,14 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: prefixAst :: bodyMemberCallAst :: Nil } + private def astForTypeDeclBodyCall(node: TypeDeclBodyCall, typeFullName: String): Ast = { + val callAst = astForMemberCall(node.toMemberCall, isStatic = true) + callAst.nodes.collectFirst { + case c: NewCall if c.name == Defines.TypeDeclBody => c.methodFullName(s"$typeFullName.${Defines.TypeDeclBody}") + } + callAst + } + private def createTypeRefPointer(typeDecl: NewTypeDecl): Ast = { if (scope.isSurroundedByProgramScope) { // We aim to preserve whether it's a `class` or `module` in the `code` property @@ -197,78 +200,43 @@ trait AstForTypesCreator(implicit withSchemaValidation: ValidationMode) { this: val fieldName = nameAsSymbol.innerText.prepended('@') val memberNode_ = memberNode(nameAsSymbol, fieldName, code(node), Defines.Any) val memberAst = Ast(memberNode_) - val getterAst = Option.when(node.hasGetter)(astForGetterMethod(node, fieldName)) - val setterAst = Option.when(node.hasSetter)(astForSetterMethod(node, fieldName)) - Seq(memberAst) ++ getterAst.toList ++ setterAst.toList + val getterAst = Option.when(node.hasGetter)(astForGetterMethod(node, fieldName)).getOrElse(Nil) + val setterAst = Option.when(node.hasSetter)(astForSetterMethod(node, fieldName)).getOrElse(Nil) + Seq(memberAst) ++ getterAst ++ setterAst case _ => logger.warn(s"Unsupported field declaration: ${nameNode.text}, skipping") Seq() } // creates a `def () { return }` METHOD, for = @. - private def astForGetterMethod(node: FieldsDeclaration, fieldName: String): Ast = { - val name = fieldName.drop(1) - val fullName = computeMethodFullName(name) - val method = methodNode( - node = node, - name = name, - fullName = fullName, - code = s"def $name (...)", - signature = None, - fileName = relativeFileName, - astParentType = scope.surroundingAstLabel, - astParentFullName = scope.surroundingScopeFullName - ) - scope.pushNewScope(MethodScope(fullName, procParamGen.fresh)) - val block_ = blockNode(node) - scope.pushNewScope(BlockScope(block_)) - // TODO: Should it be `return this.@abc`? - val returnAst_ = { - val returnNode_ = returnNode(node, s"return $fieldName") - val fieldNameIdentifier = identifierNode(node, fieldName, fieldName, Defines.Any) - returnAst(returnNode_, Seq(Ast(fieldNameIdentifier))) - } - - val methodBody = blockAst(block_, List(returnAst_)) - scope.popScope() - scope.popScope() - methodAst(method, Seq(), methodBody, methodReturnNode(node, Defines.Any)) + private def astForGetterMethod(node: FieldsDeclaration, fieldName: String): Seq[Ast] = { + val name = fieldName.drop(1) + val code = s"def $name (...)" + val methodDecl = MethodDeclaration( + name, + Nil, + StatementList(InstanceFieldIdentifier()(node.span.spanStart(fieldName)) :: Nil)( + node.span.spanStart(s"return $fieldName") + ) + )(node.span.spanStart(code)) + astForMethodDeclaration(methodDecl) } // creates a `def =(x) { = x }` METHOD, for = @ - private def astForSetterMethod(node: FieldsDeclaration, fieldName: String): Ast = { - val name = fieldName.drop(1) + "=" - val fullName = computeMethodFullName(name) - val method = methodNode( - node = node, - name = name, - fullName = fullName, - code = s"def $name (...)", - signature = None, - fileName = relativeFileName, - astParentType = scope.surroundingAstLabel, - astParentFullName = scope.surroundingScopeFullName - ) - scope.pushNewScope(MethodScope(fullName, procParamGen.fresh)) - val parameter = parameterInNode(node, "x", "x", 1, false, EvaluationStrategies.BY_REFERENCE) - val methodBody = { - val block_ = blockNode(node) - scope.pushNewScope(BlockScope(block_)) - val lhs = identifierNode(node, fieldName, fieldName, Defines.Any) - val rhs = identifierNode(node, parameter.name, parameter.name, Defines.Any) - val assignmentCall = callNode( - node, - s"${lhs.code} = ${rhs.code}", - Operators.assignment, - Operators.assignment, - DispatchTypes.STATIC_DISPATCH - ) - val assignmentAst = callAst(assignmentCall, Seq(Ast(lhs), Ast(rhs))) - scope.popScope() - blockAst(blockNode(node), List(assignmentAst)) - } - scope.popScope() - methodAst(method, Seq(Ast(parameter)), methodBody, methodReturnNode(node, Defines.Any)) + private def astForSetterMethod(node: FieldsDeclaration, fieldName: String): Seq[Ast] = { + val name = fieldName.drop(1) + "=" + val code = s"def $name (...)" + val assignment = SingleAssignment( + InstanceFieldIdentifier()(node.span.spanStart(fieldName)), + "=", + SimpleIdentifier()(node.span.spanStart("x")) + )(node.span.spanStart(s"$fieldName = x")) + val methodDecl = MethodDeclaration( + name, + MandatoryParameter("x")(node.span.spanStart("x")) :: Nil, + StatementList(assignment :: Nil)(node.span.spanStart(s"return $fieldName")) + )(node.span.spanStart(code)) + astForMethodDeclaration(methodDecl) } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstSummaryVisitor.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstSummaryVisitor.scala index a1aceea6f561..3c2ae03bfd1e 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstSummaryVisitor.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstSummaryVisitor.scala @@ -116,7 +116,7 @@ trait AstSummaryVisitor(implicit withSchemaValidation: ValidationMode) { this: A }.toSet // Map module types val typeEntries = namespace.method.collectFirst { - case m: Method if m.name == Defines.Program => + case m: Method if m.name == Defines.Main => val childrenTypes = m.astChildren.collectAll[TypeDecl].l val fullName = if childrenTypes.nonEmpty && asExternal then buildFullName(childrenTypes.head) else s"${m.fullName}" diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/RubyIntermediateAst.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/RubyIntermediateAst.scala index 01a57a1f6414..ed053dd7476f 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/RubyIntermediateAst.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/RubyIntermediateAst.scala @@ -46,20 +46,28 @@ object RubyIntermediateAst { def size: Int = statements.size } + final case class SingletonStatementList(statements: List[RubyNode])(span: TextSpan) extends RubyNode(span) { + override def text: String = statements.size match + case 0 | 1 => span.text + case _ => "(...)" + + def size: Int = statements.size + } + sealed trait AllowedTypeDeclarationChild sealed trait TypeDeclaration extends AllowedTypeDeclarationChild { def name: RubyNode def baseClass: Option[RubyNode] def body: RubyNode - def bodyMemberCall: Option[MemberCall] + def bodyMemberCall: Option[TypeDeclBodyCall] } final case class ModuleDeclaration( name: RubyNode, body: RubyNode, fields: List[RubyNode & RubyFieldIdentifier], - bodyMemberCall: Option[MemberCall] + bodyMemberCall: Option[TypeDeclBodyCall] )(span: TextSpan) extends RubyNode(span) with TypeDeclaration { @@ -71,7 +79,7 @@ object RubyIntermediateAst { baseClass: Option[RubyNode], body: RubyNode, fields: List[RubyNode & RubyFieldIdentifier], - bodyMemberCall: Option[MemberCall] + bodyMemberCall: Option[TypeDeclBodyCall] )(span: TextSpan) extends RubyNode(span) with TypeDeclaration @@ -82,7 +90,7 @@ object RubyIntermediateAst { name: RubyNode, baseClass: Option[RubyNode], body: RubyNode, - bodyMemberCall: Option[MemberCall] = None + bodyMemberCall: Option[TypeDeclBodyCall] = None )(span: TextSpan) extends RubyNode(span) with AnonymousTypeDeclaration @@ -91,7 +99,7 @@ object RubyIntermediateAst { name: RubyNode, baseClass: Option[RubyNode], body: RubyNode, - bodyMemberCall: Option[MemberCall] = None + bodyMemberCall: Option[TypeDeclBodyCall] = None )(span: TextSpan) extends RubyNode(span) with AnonymousTypeDeclaration @@ -104,8 +112,15 @@ object RubyIntermediateAst { def hasSetter: Boolean = text.startsWith("attr_writer") || text.startsWith("attr_accessor") } + sealed trait ProcedureDeclaration { + def methodName: String + def parameters: List[RubyNode] + def body: RubyNode + } + final case class MethodDeclaration(methodName: String, parameters: List[RubyNode], body: RubyNode)(span: TextSpan) extends RubyNode(span) + with ProcedureDeclaration with AllowedTypeDeclarationChild final case class SingletonMethodDeclaration( @@ -115,8 +130,18 @@ object RubyIntermediateAst { body: RubyNode )(span: TextSpan) extends RubyNode(span) + with ProcedureDeclaration with AllowedTypeDeclarationChild + final case class SingletonObjectMethodDeclaration( + methodName: String, + parameters: List[RubyNode], + body: RubyNode, + baseClass: RubyNode + )(span: TextSpan) + extends RubyNode(span) + with ProcedureDeclaration + sealed trait MethodParameter { def name: String } @@ -234,6 +259,8 @@ object RubyIntermediateAst { extends RubyNode(span) with ControlFlowClause + final case class NextExpression()(span: TextSpan) extends RubyNode(span) with ControlFlowExpression + final case class ReturnExpression(expressions: List[RubyNode])(span: TextSpan) extends RubyNode(span) /** Represents an unqualified identifier e.g. `X`, `x`, `@@x`, `$x`, `$<`, etc. */ @@ -368,6 +395,19 @@ object RubyIntermediateAst { ) extends RubyNode(span) with RubyCall + /** Special class for `` calls of type decls. + */ + final case class TypeDeclBodyCall(target: RubyNode, typeName: String)(span: TextSpan) + extends RubyNode(span) + with RubyCall { + + def toMemberCall: MemberCall = MemberCall(target, op, Defines.TypeDeclBody, arguments)(span) + + def arguments: List[RubyNode] = Nil + + def op: String = "::" + } + final case class MemberCallWithBlock( target: RubyNode, op: String, @@ -411,7 +451,6 @@ object RubyIntermediateAst { case Some(givenParameters) => MethodDeclaration(name, givenParameters, body)(span) case None => MethodDeclaration(name, this.parameters, body)(span) } - } /** A dummy class for wrapping around `NewNode` and allowing it to integrate with RubyNode classes. diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/datastructures/RubyScope.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/datastructures/RubyScope.scala index 2b98bce044aa..bc59ee105b11 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/datastructures/RubyScope.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/datastructures/RubyScope.scala @@ -5,9 +5,10 @@ import io.joern.rubysrc2cpg.passes.GlobalTypes import io.joern.rubysrc2cpg.passes.GlobalTypes.builtinPrefix import io.joern.x2cpg.Defines import io.joern.rubysrc2cpg.passes.Defines as RDefines -import io.joern.x2cpg.datastructures.* +import io.joern.x2cpg.datastructures.{TypedScopeElement, *} import io.shiftleft.codepropertygraph.generated.NodeTypes import io.shiftleft.codepropertygraph.generated.nodes.{DeclarationNew, NewLocal, NewMethodParameterIn} +import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal import java.io.File as JFile import scala.collection.mutable @@ -47,7 +48,8 @@ class RubyScope(summary: RubyProgramSummary, projectRoot: Option[String]) /** @return * using the stack, will initialize a new module scope object. */ - def newProgramScope: Option[ProgramScope] = surroundingScopeFullName.map(ProgramScope.apply) + def newProgramScope: Option[ProgramScope] = + surroundingScopeFullName.map(_.stripSuffix(NamespaceTraversal.globalNamespaceName)).map(ProgramScope.apply) /** @return * true if the top of the stack is the program/module. @@ -224,15 +226,26 @@ class RubyScope(summary: RubyProgramSummary, projectRoot: Option[String]) (ScopeElement(MethodScope(fullName, param, true), variables), param.fold(x => x, x => x)) } - /** Get the name of the implicit or explict proc param */ + /** Get the name of the implicit or explicit proc param */ def anonProcParam: Option[String] = stack.collectFirst { case ScopeElement(MethodScope(_, Left(param), true), _) => param } - /** Set the name of explict proc param */ - def setProcParam(param: String): Unit = updateSurrounding { + /** Set the name of explicit proc param */ + def setProcParam(param: String, paramNode: NewMethodParameterIn): Unit = updateSurrounding { case ScopeElement(MethodScope(fullName, _, _), variables) => - (ScopeElement(MethodScope(fullName, Right(param)), variables), ()) + (ScopeElement(MethodScope(fullName, Right(param), true), variables ++ Map(paramNode.name -> paramNode)), ()) + } + + /** If a proc param is used, provides the node to add to the AST. + */ + def procParamName: Option[NewMethodParameterIn] = { + stack + .collectFirst { + case ScopeElement(MethodScope(_, Left(param), true), _) => param + case ScopeElement(MethodScope(_, Right(param), true), _) => param + } + .flatMap(lookupVariable(_).collect { case p: NewMethodParameterIn => p }) } def surroundingTypeFullName: Option[String] = stack.collectFirst { case ScopeElement(x: TypeLikeScope, _) => @@ -332,7 +345,7 @@ class RubyScope(summary: RubyProgramSummary, projectRoot: Option[String]) case None if GlobalTypes.kernelFunctions.contains(normalizedTypeName) => Option(RubyType(s"${GlobalTypes.kernelPrefix}.$normalizedTypeName", List.empty, List.empty)) case None if GlobalTypes.bundledClasses.contains(normalizedTypeName) => - Option(RubyType(s"<${GlobalTypes.builtinPrefix}.$normalizedTypeName>", List.empty, List.empty)) + Option(RubyType(s"${GlobalTypes.builtinPrefix}.$normalizedTypeName", List.empty, List.empty)) case None => None case x => x @@ -340,4 +353,22 @@ class RubyScope(summary: RubyProgramSummary, projectRoot: Option[String]) } } + /** @param identifier + * the name of the variable. + * @return + * the full name of the variable's scope, if available. + */ + def variableScopeFullName(identifier: String): Option[String] = { + stack + .collectFirst { + case scopeElement if scopeElement.variables.contains(identifier) => + scopeElement + } + .map { + case ScopeElement(x: NamespaceLikeScope, _) => x.fullName + case ScopeElement(x: TypeLikeScope, _) => x.fullName + case ScopeElement(x: MethodLikeScope, _) => x.fullName + } + } + } diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/datastructures/ScopeElement.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/datastructures/ScopeElement.scala index f7661770e69c..3d2e94d7f610 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/datastructures/ScopeElement.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/datastructures/ScopeElement.scala @@ -35,7 +35,7 @@ trait TypeLikeScope extends TypedScopeElement { * the relative file name. */ case class ProgramScope(fileName: String) extends TypeLikeScope { - override def fullName: String = s"$fileName:${Defines.Program}" + override def fullName: String = s"$fileName${Defines.Main}" } /** A Ruby module/abstract class. diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/astcreation/AstCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/astcreation/AstCreator.scala index 347319eca95f..f987a89f3ae9 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/astcreation/AstCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/astcreation/AstCreator.scala @@ -14,7 +14,6 @@ import io.shiftleft.codepropertygraph.generated.* import io.shiftleft.codepropertygraph.generated.nodes.* import org.antlr.v4.runtime.ParserRuleContext import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate import java.io.File as JFile import java.util.concurrent.atomic.{AtomicBoolean, AtomicInteger} @@ -74,7 +73,7 @@ class AstCreator( // Hashmap to store used variable names, to avoid duplicates in case of un-named variables protected val usedVariableNames = mutable.HashMap.empty[String, Int] - override def createAst(): BatchedUpdate.DiffGraphBuilder = createAstForProgramCtx(programCtx) + override def createAst(): DiffGraphBuilder = createAstForProgramCtx(programCtx) private def createAstForProgramCtx(programCtx: DeprecatedRubyParser.ProgramContext) = { val name = ":program" diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/astcreation/RubyScope.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/astcreation/RubyScope.scala index 773c656bb44b..1788679262a1 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/astcreation/RubyScope.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/astcreation/RubyScope.scala @@ -1,9 +1,8 @@ package io.joern.rubysrc2cpg.deprecated.astcreation import io.joern.x2cpg.datastructures.Scope -import io.shiftleft.codepropertygraph.generated.EdgeTypes +import io.shiftleft.codepropertygraph.generated.{DiffGraphBuilder, EdgeTypes} import io.shiftleft.codepropertygraph.generated.nodes.{DeclarationNew, NewIdentifier, NewLocal, NewNode} -import overflowdb.BatchedUpdate import scala.collection.mutable @@ -39,18 +38,16 @@ class RubyScope extends Scope[String, NewIdentifier, NewNode] { * @param paramNames * the names of parameters. */ - def createAndLinkLocalNodes( - diffGraph: BatchedUpdate.DiffGraphBuilder, - paramNames: Set[String] = Set.empty - ): List[DeclarationNew] = stack.headOption match - case Some(top) => scopeToVarMap.buildVariableGroupings(top.scopeNode, paramNames ++ Set("this"), diffGraph) - case None => List.empty[DeclarationNew] - - /** @param identifier - * the identifier to count - * @return - * the number of times the given identifier occurs in the immediate scope. - */ + def createAndLinkLocalNodes(diffGraph: DiffGraphBuilder, paramNames: Set[String] = Set.empty): List[DeclarationNew] = + stack.headOption match + case Some(top) => scopeToVarMap.buildVariableGroupings(top.scopeNode, paramNames ++ Set("this"), diffGraph) + case None => List.empty[DeclarationNew] + + /** @param identifier + * the identifier to count + * @return + * the number of times the given identifier occurs in the immediate scope. + */ def numVariableReferences(identifier: String): Int = { stack.map(_.scopeNode).flatMap(scopeToVarMap.get).flatMap(_.get(identifier)).map(_.ids.size).headOption.getOrElse(0) } @@ -93,7 +90,7 @@ class RubyScope extends Scope[String, NewIdentifier, NewNode] { def buildVariableGroupings( key: ScopeNodeType, paramNames: Set[String], - diffGraph: BatchedUpdate.DiffGraphBuilder + diffGraph: DiffGraphBuilder ): List[DeclarationNew] = scopeMap.get(key) match case Some(varMap) => diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/passes/AstCreationPass.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/passes/AstCreationPass.scala index 1a93f4b5e9e3..23addda53ec8 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/passes/AstCreationPass.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/passes/AstCreationPass.scala @@ -10,7 +10,6 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.passes.ForkJoinParallelCpgPass import io.shiftleft.semanticcpg.language.* import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate import scala.jdk.CollectionConverters.EnumerationHasAsScala diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/passes/RubyTypeRecoveryPassGenerator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/passes/RubyTypeRecoveryPassGenerator.scala index b9dc8c0c80cb..b3dc97358024 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/passes/RubyTypeRecoveryPassGenerator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/deprecated/passes/RubyTypeRecoveryPassGenerator.scala @@ -4,7 +4,7 @@ import io.joern.x2cpg.passes.frontend.* import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import io.joern.x2cpg.Defines as XDefines class RubyTypeRecoveryPassGenerator(cpg: Cpg, config: XTypeRecoveryConfig = XTypeRecoveryConfig()) diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/parser/AntlrContextHelpers.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/parser/AntlrContextHelpers.scala index eb2e0d9ecadc..490eea8ad327 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/parser/AntlrContextHelpers.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/parser/AntlrContextHelpers.scala @@ -26,6 +26,17 @@ object AntlrContextHelpers { text = ctx.getStart.getInputStream.getText(new Interval(startIndex, stopIndex)) ) } + + /** @return + * true if this token's text is the same as a keyword, false if otherwise. + */ + def isKeyword: Boolean = { + // See RubyParser for why the bounds are used + val minBound = 19 + val maxBound = 56 + val typ = ctx.start.getType + typ >= minBound && typ <= maxBound + } } sealed implicit class CompoundStatementContextHelper(ctx: CompoundStatementContext) { @@ -210,7 +221,9 @@ object AntlrContextHelpers { case ctx: AssociationsArgumentListContext => Option(ctx.associationList()).map(_.associations).getOrElse(List.empty) case ctx: SplattingArgumentArgumentListContext => - Option(ctx.splattingArgument()).toList + Option(ctx.splattingArgument()).toList ++ Option(ctx.blockArgument()).toList ++ Option( + ctx.operatorExpressionList() + ).toList case ctx: BlockArgumentArgumentListContext => Option(ctx.blockArgument()).toList case ctx => diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/parser/RubyNodeCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/parser/RubyNodeCreator.scala index 4f5ec2560ea3..e9e5ed2e2149 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/parser/RubyNodeCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/parser/RubyNodeCreator.scala @@ -1,12 +1,13 @@ package io.joern.rubysrc2cpg.parser -import io.joern.rubysrc2cpg.astcreation.RubyIntermediateAst.* +import io.joern.rubysrc2cpg.astcreation.RubyIntermediateAst.{Block, *} import io.joern.rubysrc2cpg.parser.AntlrContextHelpers.* import io.joern.rubysrc2cpg.parser.RubyParser.{CommandWithDoBlockContext, ConstantVariableReferenceContext} import io.joern.rubysrc2cpg.passes.Defines import io.joern.rubysrc2cpg.passes.Defines.getBuiltInType import io.joern.rubysrc2cpg.utils.FreshNameGenerator import io.joern.x2cpg.Defines as XDefines +import org.antlr.v4.runtime.ParserRuleContext import org.antlr.v4.runtime.tree.{ParseTree, RuleNode} import org.slf4j.LoggerFactory @@ -42,6 +43,10 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { StatementList(ctx.getStatements.map(visit))(ctx.toTextSpan) } + override def visitNextWithoutArguments(ctx: RubyParser.NextWithoutArgumentsContext): RubyNode = { + NextExpression()(ctx.toTextSpan) + } + override def visitGroupingStatement(ctx: RubyParser.GroupingStatementContext): RubyNode = { // When there's only 1 statement, we can use it directly, instead of wrapping it in a StatementList. val statements = ctx.compoundStatement().getStatements.map(visit) @@ -160,6 +165,10 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { ReturnExpression(expressions)(ctx.toTextSpan) } + override def visitReturnWithoutArguments(ctx: RubyParser.ReturnWithoutArgumentsContext): RubyNode = { + ReturnExpression(Nil)(ctx.toTextSpan) + } + override def visitNumericLiteral(ctx: RubyParser.NumericLiteralContext): RubyNode = { if (ctx.hasSign) { UnaryExpression(ctx.sign.getText, visit(ctx.unsignedNumericLiteral()))(ctx.toTextSpan) @@ -574,6 +583,26 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { } } + override def visitSuperWithParentheses(ctx: RubyParser.SuperWithParenthesesContext): RubyNode = { + val block = Option(ctx.block()).map(visit) + val arguments = Option(ctx.argumentWithParentheses()).map(_.arguments.map(visit)).getOrElse(Nil) + visitSuperCall(ctx, arguments, block) + } + + override def visitSuperWithoutParentheses(ctx: RubyParser.SuperWithoutParenthesesContext): RubyNode = { + val block = Option(ctx.block()).map(visit) + val arguments = Option(ctx.argumentList()).map(_.elements.map(visit)).getOrElse(Nil) + visitSuperCall(ctx, arguments, block) + } + + private def visitSuperCall(ctx: ParserRuleContext, arguments: List[RubyNode], block: Option[RubyNode]): RubyNode = { + val callName = SimpleIdentifier()(ctx.toTextSpan.spanStart("super")) + block match { + case Some(body) => SimpleCallWithBlock(callName, arguments, body.asInstanceOf[Block])(ctx.toTextSpan) + case None => SimpleCall(callName, arguments)(ctx.toTextSpan) + } + } + override def visitIsDefinedExpression(ctx: RubyParser.IsDefinedExpressionContext): RubyNode = { SimpleCall(visit(ctx.isDefinedKeyword), visit(ctx.expressionOrCommand()) :: Nil)(ctx.toTextSpan) } @@ -611,7 +640,7 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { override def visitLambdaExpression(ctx: RubyParser.LambdaExpressionContext): RubyNode = { val parameters = Option(ctx.parameterList()).fold(List())(_.parameters).map(visit) - val body = visit(ctx.block()) + val body = visit(ctx.block()).asInstanceOf[Block] ProcOrLambdaExpr(Block(parameters, body)(ctx.toTextSpan))(ctx.toTextSpan) } @@ -813,7 +842,7 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { HashLiteral(Option(ctx.associationList()).map(_.associations).getOrElse(List()).map(visit))(ctx.toTextSpan) } - override def visitAssociation(ctx: RubyParser.AssociationContext): RubyNode = { + override def visitAssociationElement(ctx: RubyParser.AssociationElementContext): RubyNode = { ctx.associationKey().getText match { case "if" => Association(SimpleIdentifier()(ctx.toTextSpan.spanStart("if")), visit(ctx.operatorExpression()))(ctx.toTextSpan) @@ -822,6 +851,18 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { } } + override def visitAssociationHashArgument(ctx: RubyParser.AssociationHashArgumentContext): RubyNode = { + val identifierName = Option(ctx.LOCAL_VARIABLE_IDENTIFIER()).map(_.getText) + + identifierName match { + case Some(identName) => + SplattingRubyNode(SimpleIdentifier()(ctx.toTextSpan.spanStart(identName)))(ctx.toTextSpan) + case None => + if ctx.LPAREN() == null then SplattingRubyNode(visit(ctx.methodCallsWithParentheses()))(ctx.toTextSpan) + else SplattingRubyNode(visit(ctx.methodInvocationWithoutParentheses()))(ctx.toTextSpan) + } + } + override def visitModuleDefinition(ctx: RubyParser.ModuleDefinitionContext): RubyNode = { val (nonFieldStmts, fields) = genInitFieldStmts(ctx.bodyStatement()) @@ -832,11 +873,34 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { } override def visitSingletonClassDefinition(ctx: RubyParser.SingletonClassDefinitionContext): RubyNode = { - SingletonClassDeclaration( - freshClassName(ctx.toTextSpan), - Option(ctx.commandOrPrimaryValueClass()).map(visit), - visit(ctx.bodyStatement()) - )(ctx.toTextSpan) + val baseClass = Option(ctx.commandOrPrimaryValueClass()).map(visit) + val body = visit(ctx.bodyStatement()).asInstanceOf[StatementList] + + baseClass match { + case Some(baseClass) => + baseClass match { + case x: SelfIdentifier => + SingletonClassDeclaration(freshClassName(ctx.toTextSpan), Option(baseClass), body)(ctx.toTextSpan) + case x => + val stmts = body.statements.map { + case x: MethodDeclaration => + val memberAccess = + MemberAccess(baseClass, ".", x.methodName)( + x.span.spanStart(s"${baseClass.span.text}.${x.methodName}") + ) + val singletonBlockMethod = + SingletonObjectMethodDeclaration(x.methodName, x.parameters, x.body, baseClass)(x.span) + SingleAssignment(memberAccess, "=", singletonBlockMethod)( + ctx.toTextSpan.spanStart(s"${memberAccess.span.text} = ${x.span.text}") + ) + case x => x + } + + SingletonStatementList(stmts)(ctx.toTextSpan) + } + case None => + SingletonClassDeclaration(freshClassName(ctx.toTextSpan), baseClass, body)(ctx.toTextSpan) + } } private def findFieldsInMethodDecls(methodDecls: List[MethodDeclaration]): List[RubyNode & RubyFieldIdentifier] = { @@ -1046,15 +1110,13 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { )(ctx.toTextSpan) } - private def createBodyMemberCall(name: String, textSpan: TextSpan): MemberCall = { - MemberCall( + private def createBodyMemberCall(name: String, textSpan: TextSpan): TypeDeclBodyCall = { + TypeDeclBodyCall( MemberAccess(SelfIdentifier()(textSpan.spanStart(Defines.Self)), "::", name)( textSpan.spanStart(s"${Defines.Self}::$name") ), - "::", - Defines.TypeDeclBody, - List.empty - )(textSpan.spanStart(s"${Defines.Self}::$name::")) + name + )(textSpan.spanStart(s"${Defines.Self}::$name::${Defines.TypeDeclBody}")) } /** Lowers all MethodDeclaration found in SingletonClassDeclaration to SingletonMethodDeclaration. @@ -1090,11 +1152,13 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { } override def visitMethodDefinition(ctx: RubyParser.MethodDefinitionContext): RubyNode = { - MethodDeclaration( - ctx.definedMethodName().getText, - Option(ctx.methodParameterPart().parameterList()).fold(List())(_.parameters).map(visit), - visit(ctx.bodyStatement()) - )(ctx.toTextSpan) + val params = + Option(ctx.methodParameterPart().parameterList()) + .fold(List())(_.parameters) + .map(visit) + .sortBy(x => (x.span.line, x.span.column)) + + MethodDeclaration(ctx.definedMethodName().getText, params, visit(ctx.bodyStatement()))(ctx.toTextSpan) } override def visitEndlessMethodDefinition(ctx: RubyParser.EndlessMethodDefinitionContext): RubyNode = { @@ -1125,7 +1189,8 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { } override def visitHashParameter(ctx: RubyParser.HashParameterContext): RubyNode = { - HashParameter(Option(ctx.LOCAL_VARIABLE_IDENTIFIER()).map(_.getText).getOrElse(ctx.getText))(ctx.toTextSpan) + val identifierName = Option(ctx.LOCAL_VARIABLE_IDENTIFIER()).map(_.getText).getOrElse(ctx.getText) + HashParameter(identifierName)(ctx.toTextSpan) } override def visitArrayParameter(ctx: RubyParser.ArrayParameterContext): RubyNode = { @@ -1205,10 +1270,10 @@ class RubyNodeCreator extends RubyParserBaseVisitor[RubyNode] { } override def visitAssociationKey(ctx: RubyParser.AssociationKeyContext): RubyNode = { - if (Option(ctx.operatorExpression()).isDefined) { - visit(ctx.operatorExpression()) - } else { - SimpleIdentifier()(ctx.toTextSpan) + Option(ctx.operatorExpression()) match { + case Some(ctx) if ctx.isKeyword => SimpleIdentifier()(ctx.toTextSpan) + case Some(ctx) => visit(ctx) + case None => SimpleIdentifier()(ctx.toTextSpan) } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/Defines.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/Defines.scala index c571804387f3..030c86508d96 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/Defines.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/Defines.scala @@ -24,7 +24,7 @@ object Defines { val Initialize: String = "initialize" val TypeDeclBody: String = "" - val Program: String = ":program" + val Main: String = "
" val Resolver: String = "" diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/DependencySummarySolverPass.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/DependencySummarySolverPass.scala index 30f4908bbad0..f5bb6e11e890 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/DependencySummarySolverPass.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/DependencySummarySolverPass.scala @@ -16,7 +16,7 @@ class DependencySummarySolverPass(cpg: Cpg, dependencySummary: RubyProgramSummar override def runOnPart(diffGraph: DiffGraphBuilder, dependency: Dependency): Unit = { dependencySummary.namespaceToType.filter(_._1.startsWith(dependency.name)).flatMap(_._2).foreach { x => val typeDeclName = - if x.name.endsWith(RDefines.Program) then RDefines.Program + if x.name.endsWith(RDefines.Main) then RDefines.Main else x.name.split("[.]").lastOption.getOrElse(Defines.Unknown) val dependencyTypeDecl = TypeDeclStubCreator diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/ImplicitRequirePass.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/ImplicitRequirePass.scala index f556b25457fb..f5d206649272 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/ImplicitRequirePass.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/ImplicitRequirePass.scala @@ -85,7 +85,7 @@ class ImplicitRequirePass(cpg: Cpg, programSummary: RubyProgramSummary) extends val requireCallNode = NewCall() .name(importCallName) .code(s"$importCallName '$path'") - .methodFullName(s"__builtin:$importCallName") + .methodFullName(s"__builtin.$importCallName") .dispatchType(DispatchTypes.DYNAMIC_DISPATCH) .typeFullName(Defines.Any) val receiverIdentifier = diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyImportResolverPass.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyImportResolverPass.scala index f52733204573..25c891175b3e 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyImportResolverPass.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyImportResolverPass.scala @@ -61,7 +61,7 @@ class RubyImportResolverPass(cpg: Cpg) extends XImportResolverPass(cpg) { // Expose methods which are directly present in a file, without any module, TypeDecl val resolvedMethods = cpg.method .where(_.file.name(filePattern)) - .where(_.nameExact(RDefines.Program)) + .where(_.nameExact(RDefines.Main)) .astChildren .astChildren .isMethod diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyTypeHintCallLinker.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyTypeHintCallLinker.scala index 333245e40dda..cb48259d2fd8 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyTypeHintCallLinker.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyTypeHintCallLinker.scala @@ -26,7 +26,7 @@ class RubyTypeHintCallLinker(cpg: Cpg) extends XTypeHintCallLinker(cpg) { } val name = if (methodName.contains(pathSep) && methodName.length > methodName.lastIndexOf(pathSep) + 1) - val strippedMethod = methodName.stripPrefix(s"${GlobalTypes.kernelPrefix}:") + val strippedMethod = methodName.stripPrefix(s"${GlobalTypes.kernelPrefix}.") if GlobalTypes.kernelFunctions.contains(strippedMethod) then strippedMethod else methodName.substring(methodName.lastIndexOf(pathSep) + pathSep.length) else methodName diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyTypeRecoveryPassGenerator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyTypeRecoveryPassGenerator.scala index a9afaf7b9d67..8a49c70bdc97 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyTypeRecoveryPassGenerator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/passes/RubyTypeRecoveryPassGenerator.scala @@ -6,8 +6,8 @@ import io.joern.x2cpg.passes.frontend.XTypeRecovery.AllNodeTypesFromNodeExt import io.shiftleft.codepropertygraph.generated.{Cpg, Operators, PropertyNames} import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.FieldAccess -import io.shiftleft.semanticcpg.language.{types, *} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.semanticcpg.language.* +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder class RubyTypeRecoveryPassGenerator(cpg: Cpg, config: XTypeRecoveryConfig = XTypeRecoveryConfig()) extends XTypeRecoveryPassGenerator[File](cpg, config) { @@ -96,7 +96,7 @@ private class RecoverForRubyFile(cpg: Cpg, cu: File, builder: DiffGraphBuilder, else fieldAccessParents .filter(_.endsWith(fieldAccessName.stripSuffix(s".${c.name}"))) - .map(x => s"$x:${c.name}") + .map(x => s"$x.${c.name}") } else { types } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/dataflow/ProcParameterAndYieldTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/dataflow/ProcParameterAndYieldTests.scala index 04ca9426a463..3aeece7aed74 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/dataflow/ProcParameterAndYieldTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/dataflow/ProcParameterAndYieldTests.scala @@ -95,7 +95,7 @@ class ProcParameterAndYieldTests extends RubyCode2CpgFixture(withPostProcessing sink2.reachableByFlows(src2).size shouldBe 2 } - "Data flow through invocationWithBlockOnlyPrimary usage" in { + "Data flow through invocationWithBlockOnlyPrimary usage" ignore { val cpg = code(""" |def hello(&block) | block.call @@ -110,7 +110,7 @@ class ProcParameterAndYieldTests extends RubyCode2CpgFixture(withPostProcessing sink.reachableByFlows(source).size shouldBe 1 } - "Data flow through invocationWithBlockOnlyPrimary and method name starting with capital usage" in { + "Data flow through invocationWithBlockOnlyPrimary and method name starting with capital usage" ignore { val cpg = code(""" |def Hello(&block) | block.call @@ -126,7 +126,7 @@ class ProcParameterAndYieldTests extends RubyCode2CpgFixture(withPostProcessing } // Works in deprecated - "Data flow for yield block specified along with the call" in { + "Data flow for yield block specified along with the call" ignore { val cpg = code(""" |x=10 |def foo(x) @@ -168,7 +168,7 @@ class ProcParameterAndYieldTests extends RubyCode2CpgFixture(withPostProcessing sink.reachableByFlows(source).size shouldBe 2 } - "flow through a proc definition with non-empty block and zero parameters" in { + "flow through a proc definition with non-empty block and zero parameters" ignore { val cpg = code(""" |x=10 |y = x diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/dataflow/SingleAssignmentTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/dataflow/SingleAssignmentTests.scala index 7f20321567c8..c9ace03bcd28 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/dataflow/SingleAssignmentTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/dataflow/SingleAssignmentTests.scala @@ -15,13 +15,13 @@ class SingleAssignmentTests extends RubyCode2CpgFixture(withPostProcessing = tru |""".stripMargin) val source = cpg.literal.l val sink = cpg.method.name("puts").callIn.argument.l - val flows = sink.reachableByFlows(source).map(flowToResultPairs).distinct.sortBy(_.length).l - val List(flow1, flow2, flow3, flow4, flow5) = flows - flow1 shouldBe List(("y = 1", 2), ("puts y", 3)) - flow2 shouldBe List(("y = 1", 2), ("x = y = 1", 2), ("puts x", 4)) - flow3 shouldBe List(("y = 1", 2), ("puts y", 3), ("puts x", 4)) - flow4 shouldBe List(("y = 1", 2), ("x = y = 1", 2), ("z = x = y = 1", 2), ("puts z", 5)) - flow5 shouldBe List(("y = 1", 2), ("x = y = 1", 2), ("puts x", 4), ("puts z", 5)) + val flows = sink.reachableByFlows(source).map(flowToResultPairs).distinct.l + flows.size shouldBe 5 + flows should contain(List(("y = 1", 2), ("puts y", 3))) + flows should contain(List(("y = 1", 2), ("x = y = 1", 2), ("puts x", 4))) + flows should contain(List(("y = 1", 2), ("puts y", 3), ("puts x", 4))) + flows should contain(List(("y = 1", 2), ("x = y = 1", 2), ("z = x = y = 1", 2), ("puts z", 5))) + flows should contain(List(("y = 1", 2), ("x = y = 1", 2), ("puts x", 4), ("puts z", 5))) } "flow through expressions" in { diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ConfigFileCreationPassTest.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ConfigFileCreationPassTest.scala index ecd048bbb4a4..80e812c67529 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ConfigFileCreationPassTest.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ConfigFileCreationPassTest.scala @@ -5,7 +5,7 @@ import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.joern.x2cpg.passes.frontend.MetaDataPass import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Languages -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/MetaDataPassTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/MetaDataPassTests.scala index eeeb970917c1..56f28ffdd521 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/MetaDataPassTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/MetaDataPassTests.scala @@ -13,8 +13,10 @@ class MetaDataPassTests extends AnyWordSpec with Matchers { "create a metadata node with correct language" in { File.usingTemporaryDirectory("rubysrc2cpgTest") { dir => - val config = Config().withInputPath(dir.pathAsString).withOutputPath(dir.pathAsString) - val cpg = new RubySrc2Cpg().createCpg(config).get + val config = Config() + .withInputPath(dir.createChild("dummyinputfile").pathAsString) + .withOutputPath(dir.createChild("dummyoutputfile").pathAsString) + val cpg = new RubySrc2Cpg().createCpg(config).get cpg.metaData.language.l shouldBe List(Languages.RUBYSRC) } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/CallCpgTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/CallCpgTests.scala index b2c499a6cd93..1b698ae9798c 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/CallCpgTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/CallCpgTests.scala @@ -29,7 +29,7 @@ class CallCpgTests extends RubyCode2CpgFixture(withPostProcessing = true, useDep "test astChildren" taggedAs SameInNewFrontend in { val callNode = cpg.call.name("foo").head - val children = callNode.astChildren + val children = callNode.astChildren.l children.size shouldBe 2 val firstChild = children.head @@ -62,7 +62,7 @@ class CallCpgTests extends RubyCode2CpgFixture(withPostProcessing = true, useDep "test astChildren" in { val callNode = cpg.call.name("foo").head - val children = callNode.astChildren + val children = callNode.astChildren.l children.size shouldBe 3 val firstChild = children.head diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/FileTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/FileTests.scala index d10d44769cdd..aad06a906c3f 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/FileTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/FileTests.scala @@ -1,7 +1,7 @@ package io.joern.rubysrc2cpg.deprecated.passes.ast import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/IdentifierLocalTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/IdentifierLocalTests.scala index af1d8a6f45e4..1339d37baeb4 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/IdentifierLocalTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/IdentifierLocalTests.scala @@ -1,7 +1,7 @@ package io.joern.rubysrc2cpg.deprecated.passes.ast import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class IdentifierLocalTests extends RubyCode2CpgFixture(useDeprecatedFrontend = true) { diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/MetaDataTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/MetaDataTests.scala index 4ff668b72a19..4ba49aeaa0c4 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/MetaDataTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/MetaDataTests.scala @@ -3,7 +3,7 @@ package io.joern.rubysrc2cpg.deprecated.passes.ast import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.joern.x2cpg.layers.{Base, CallGraph, ControlFlow, TypeRelations} import io.shiftleft.codepropertygraph.generated.Languages -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class MetaDataTests extends RubyCode2CpgFixture(useDeprecatedFrontend = true) { val cpg = code("""puts 123""") diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/NamespaceBlockTest.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/NamespaceBlockTest.scala index d79061ac44e5..16004607814e 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/NamespaceBlockTest.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/ast/NamespaceBlockTest.scala @@ -1,7 +1,7 @@ package io.joern.rubysrc2cpg.deprecated.passes.ast import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.FileTraversal import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal import io.joern.x2cpg.Defines diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/cfg/SimpleCfgCreationPassTest.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/cfg/SimpleCfgCreationPassTest.scala index 4e72b25ef4bd..cf4efbb72c4f 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/cfg/SimpleCfgCreationPassTest.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/deprecated/passes/cfg/SimpleCfgCreationPassTest.scala @@ -10,47 +10,47 @@ class SimpleCfgCreationPassTest extends CfgTestFixture(() => new RubyCfgTestCpg( "CFG generation for simple fragments" should { "have correct structure for empty array literal" ignore { implicit val cpg: Cpg = code("x = []") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x") shouldBe expected(("x = []", AlwaysEdge)) - succOf("x = []") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("x = []", AlwaysEdge)) + succOf("x = []") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "have correct structure for array literal with values" in { implicit val cpg: Cpg = code("x = [1, 2]") - succOf("1") shouldBe expected(("2", AlwaysEdge)) - succOf("x = [1, 2]") shouldBe expected(("RET", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("x = [1, 2]") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "assigning a literal value" in { implicit val cpg: Cpg = code("x = 1") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x = 1") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x = 1") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "assigning a string literal value" in { implicit val cpg: Cpg = code("x = 'some literal'") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x = 'some literal'") shouldBe expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x = 'some literal'") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } "addition of two numbers" in { implicit val cpg: Cpg = code("x = 1 + 2") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x = 1 + 2") shouldBe expected(("RET", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("2") shouldBe expected(("1 + 2", AlwaysEdge)) - succOf("1") shouldBe expected(("2", AlwaysEdge)) - succOf("1 + 2") shouldBe expected(("x = 1 + 2", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x = 1 + 2") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("1 + 2", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("1 + 2") should contain theSameElementsAs expected(("x = 1 + 2", AlwaysEdge)) } "addition of two string" in { implicit val cpg: Cpg = code("x = 1 + 2") - succOf(":program") shouldBe expected(("x", AlwaysEdge)) - succOf("x = 1 + 2") shouldBe expected(("RET", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("2") shouldBe expected(("1 + 2", AlwaysEdge)) - succOf("1") shouldBe expected(("2", AlwaysEdge)) - succOf("1 + 2") shouldBe expected(("x = 1 + 2", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("x = 1 + 2") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("1 + 2", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("2", AlwaysEdge)) + succOf("1 + 2") should contain theSameElementsAs expected(("x = 1 + 2", AlwaysEdge)) } "addition of multiple string" in { @@ -60,15 +60,17 @@ class SimpleCfgCreationPassTest extends CfgTestFixture(() => new RubyCfgTestCpg( |c = "do you like blueberries?" |a+b+c |""".stripMargin) - succOf(":program") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("\"Nice to meet you\"", AlwaysEdge)) - succOf("b") shouldBe expected(("\", \"", AlwaysEdge)) - succOf("c") shouldBe expected(("\"do you like blueberries?\"", AlwaysEdge)) - succOf("a+b+c") shouldBe expected(("RET", AlwaysEdge)) - succOf("a+b") shouldBe expected(("c", AlwaysEdge)) - succOf("\"Nice to meet you\"") shouldBe expected(("a = \"Nice to meet you\"", AlwaysEdge)) - succOf("\", \"") shouldBe expected(("b = \", \"", AlwaysEdge)) - succOf("\"do you like blueberries?\"") shouldBe expected(("c = \"do you like blueberries?\"", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("\"Nice to meet you\"", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("\", \"", AlwaysEdge)) + succOf("c") should contain theSameElementsAs expected(("\"do you like blueberries?\"", AlwaysEdge)) + succOf("a+b+c") should contain theSameElementsAs expected(("RET", AlwaysEdge)) + succOf("a+b") should contain theSameElementsAs expected(("c", AlwaysEdge)) + succOf("\"Nice to meet you\"") should contain theSameElementsAs expected(("a = \"Nice to meet you\"", AlwaysEdge)) + succOf("\", \"") should contain theSameElementsAs expected(("b = \", \"", AlwaysEdge)) + succOf("\"do you like blueberries?\"") should contain theSameElementsAs expected( + ("c = \"do you like blueberries?\"", AlwaysEdge) + ) } "addition of multiple string and assign to variable" in { @@ -78,16 +80,18 @@ class SimpleCfgCreationPassTest extends CfgTestFixture(() => new RubyCfgTestCpg( |c = "do you like blueberries?" |x = a+b+c |""".stripMargin) - succOf(":program") shouldBe expected(("a", AlwaysEdge)) - succOf("a") shouldBe expected(("\"Nice to meet you\"", AlwaysEdge)) - succOf("b") shouldBe expected(("\", \"", AlwaysEdge)) - succOf("c") shouldBe expected(("\"do you like blueberries?\"", AlwaysEdge)) - succOf("a+b+c") shouldBe expected(("x = a+b+c", AlwaysEdge)) - succOf("a+b") shouldBe expected(("c", AlwaysEdge)) - succOf("\"Nice to meet you\"") shouldBe expected(("a = \"Nice to meet you\"", AlwaysEdge)) - succOf("\", \"") shouldBe expected(("b = \", \"", AlwaysEdge)) - succOf("\"do you like blueberries?\"") shouldBe expected(("c = \"do you like blueberries?\"", AlwaysEdge)) - succOf("x") shouldBe expected(("a", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("a", AlwaysEdge)) + succOf("a") should contain theSameElementsAs expected(("\"Nice to meet you\"", AlwaysEdge)) + succOf("b") should contain theSameElementsAs expected(("\", \"", AlwaysEdge)) + succOf("c") should contain theSameElementsAs expected(("\"do you like blueberries?\"", AlwaysEdge)) + succOf("a+b+c") should contain theSameElementsAs expected(("x = a+b+c", AlwaysEdge)) + succOf("a+b") should contain theSameElementsAs expected(("c", AlwaysEdge)) + succOf("\"Nice to meet you\"") should contain theSameElementsAs expected(("a = \"Nice to meet you\"", AlwaysEdge)) + succOf("\", \"") should contain theSameElementsAs expected(("b = \", \"", AlwaysEdge)) + succOf("\"do you like blueberries?\"") should contain theSameElementsAs expected( + ("c = \"do you like blueberries?\"", AlwaysEdge) + ) + succOf("x") should contain theSameElementsAs expected(("a", AlwaysEdge)) } "single hierarchy of if else statement" in { @@ -97,16 +101,16 @@ class SimpleCfgCreationPassTest extends CfgTestFixture(() => new RubyCfgTestCpg( | puts "x is greater than 2" |end |""".stripMargin) - succOf(":program") shouldBe expected(("puts", AlwaysEdge)) - succOf("puts") shouldBe expected(("__builtin.puts", AlwaysEdge)) - succOf("__builtin.puts") shouldBe expected(("puts = __builtin.puts", AlwaysEdge)) - succOf("puts = __builtin.puts") shouldBe expected(("x", AlwaysEdge)) - succOf("1") shouldBe expected(("x = 1", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("2") shouldBe expected(("x > 2", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("puts", AlwaysEdge)) + succOf("puts") should contain theSameElementsAs expected(("__builtin.puts", AlwaysEdge)) + succOf("__builtin.puts") should contain theSameElementsAs expected(("puts = __builtin.puts", AlwaysEdge)) + succOf("puts = __builtin.puts") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x = 1", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("x > 2", AlwaysEdge)) } - "multiple hierarchy of if else statement" in { + "multiple hierarchy of if else statement" ignore { implicit val cpg: Cpg = code(""" |x = 1 |if x > 2 @@ -117,15 +121,15 @@ class SimpleCfgCreationPassTest extends CfgTestFixture(() => new RubyCfgTestCpg( | puts "I can't guess the number" |end |""".stripMargin) - succOf(":program") shouldBe expected(("puts", AlwaysEdge)) - succOf("puts") shouldBe expected(("__builtin.puts", AlwaysEdge)) - succOf("__builtin.puts") shouldBe expected(("puts = __builtin.puts", AlwaysEdge)) - succOf("puts = __builtin.puts") shouldBe expected(("x", AlwaysEdge)) - succOf("1") shouldBe expected(("x = 1", AlwaysEdge)) - succOf("x") shouldBe expected(("1", AlwaysEdge)) - succOf("2") shouldBe expected(("x > 2", AlwaysEdge)) - succOf("x <= 2 and x!=0") subsetOf expected(("\"x is 1\"", AlwaysEdge)) - succOf("x <= 2 and x!=0") subsetOf expected(("RET", AlwaysEdge)) + succOf(":program") should contain theSameElementsAs expected(("puts", AlwaysEdge)) + succOf("puts") should contain theSameElementsAs expected(("__builtin.puts", AlwaysEdge)) + succOf("__builtin.puts") should contain theSameElementsAs expected(("puts = __builtin.puts", AlwaysEdge)) + succOf("puts = __builtin.puts") should contain theSameElementsAs expected(("x", AlwaysEdge)) + succOf("1") should contain theSameElementsAs expected(("x = 1", AlwaysEdge)) + succOf("x") should contain theSameElementsAs expected(("1", AlwaysEdge)) + succOf("2") should contain theSameElementsAs expected(("x > 2", AlwaysEdge)) + succOf("x <= 2 and x!=0") should contain theSameElementsAs expected(("\"x is 1\"", AlwaysEdge)) + succOf("x <= 2 and x!=0") should contain theSameElementsAs expected(("RET", AlwaysEdge)) } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ArrayParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ArrayParserTests.scala new file mode 100644 index 000000000000..a5711c4fe459 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ArrayParserTests.scala @@ -0,0 +1,37 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.parser +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class ArrayParserTests extends RubyParserFixture with Matchers { + + "array structures" in { + test("[]") + test("%w[]") + test("%i[]") + test("%I{}") + test("%w[x y z]") + test("%w(x y z)") + test("%w{x y z}") + test("%w") + test("%w-x y z-") + test("""%w( + | bob + | cod + | dod + |)""".stripMargin) + test("%W(x#{1})") + test("""%W[ + | x#{0} + |]""".stripMargin) + test("%i") + test("%i{x\\ y}") + test("%i[x [y]]") + test("""%i( + |x y + |z + |)""".stripMargin) + test("%I(x#{0} x1)") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/AssignmentParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/AssignmentParserTests.scala new file mode 100644 index 000000000000..9f603a954497 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/AssignmentParserTests.scala @@ -0,0 +1,25 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class AssignmentParserTests extends RubyParserFixture with Matchers { + "Single assignment" in { + test("x=1") + } + + "Multiple assignment" in { + test("p, q = [foo(), bar()]") + } + + "Destructured Assignment" in { + test("a, b, c = 1, 2, 3") + test("a, b, c, d = 1, 2, 3") + test("a, b, *c = 1, 2, 3, 4") + test("a, *b, c = 1, 2, 3") + test("*a, b, c = 1, 2, 3, 4") + test("a = 1, 2, 3, 4") + test("a, b, c = 1, 2, *list") + test("a, b, c = 1, *list") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BeginExpressionParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BeginExpressionParserTests.scala new file mode 100644 index 000000000000..bdd9ee6c7d4e --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BeginExpressionParserTests.scala @@ -0,0 +1,13 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class BeginExpressionParserTests extends RubyParserFixture with Matchers { + "Begin expression" in { + test("""begin + |1/0 + |rescue ZeroDivisionError => e + |end""".stripMargin) + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BeginStatementParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BeginStatementParserTests.scala new file mode 100644 index 000000000000..fc28e58163d2 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BeginStatementParserTests.scala @@ -0,0 +1,12 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class BeginStatementParserTests extends RubyParserFixture with Matchers { + "BEGIN statement" in { + // TODO: Fix - valid for Ruby 2, but not 3 +// test("BEGIN { 1 }") +// test("BEGIN {}") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BooleanParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BooleanParserTests.scala new file mode 100644 index 000000000000..bf9bc666cd2f --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/BooleanParserTests.scala @@ -0,0 +1,26 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class BooleanParserTests extends RubyParserFixture with Matchers { + "Boolean word operators" in { + test("1 or 2") + test("1 and 2") + test("not 1") + test("not 1 and 2") + test("1 and not 2") + test("1 or 2 or 3") + test("1 and 2 and 3") + } + + "Boolean sign operators" in { + test("1 || 2") + test("1 && 2") + test("!1") + test("!1 && 2") + test("1 && !2") + test("1 || 2 || 3") + test("1 && 2 && 3") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/CaseConditionParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/CaseConditionParserTests.scala new file mode 100644 index 000000000000..e00ab8698f41 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/CaseConditionParserTests.scala @@ -0,0 +1,31 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class CaseConditionParserTests extends RubyParserFixture with Matchers { + "A case expression" in { + test("""case something + | when 1 + | puts 2 + |end + |""".stripMargin) + + test("""case something + | when 1 + | else + | end + |""".stripMargin) + + test("""case something + | when 1 then + | end + |""".stripMargin) + + test("""case x + | when 1 then 2 + | when 2 then 3 + | end + |""".stripMargin) + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ClassDefinitionParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ClassDefinitionParserTests.scala new file mode 100644 index 000000000000..e02de43eb0e9 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ClassDefinitionParserTests.scala @@ -0,0 +1,15 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class ClassDefinitionParserTests extends RubyParserFixture with Matchers { + "class definitions" in { + test("class << self ; end") + test("class X 1 end") + test("""class << x + | def show; puts self; end + |end + |""".stripMargin) + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ControlStructureParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ControlStructureParserTests.scala new file mode 100644 index 000000000000..766b46c62e5b --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ControlStructureParserTests.scala @@ -0,0 +1,42 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class ControlStructureParserTests extends RubyParserFixture with Matchers { + "while" in { + test("""while x > 0 do + |end + |""".stripMargin) + } + + "if" in { + test("""if __LINE__ > 1 then + |end + |""".stripMargin) + + test("""if __LINE__ > 1 then + |else + |end + |""".stripMargin) + + test("""if __LINE__ > 1 then + |elsif __LINE__ > 0 then + |end + |""".stripMargin) + + test("a = if (y > 3) then 123 elsif(y < 6) then 2003 elsif(y < 10) then 982 else 456 end") + } + + "for loops" in { + test(""" + |for i in 1..10 do + |end + |""".stripMargin) + + test(""" + |for i in 1..x do + |end + |""".stripMargin) + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/DoBlockParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/DoBlockParserTests.scala new file mode 100644 index 000000000000..ab5000feffc8 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/DoBlockParserTests.scala @@ -0,0 +1,17 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class DoBlockParserTests extends RubyParserFixture with Matchers { + "Some block" in { + test("def foo █end") + test("""arr.each { |item| }""") + test("""hash.each do |key, value| + |end + |""".stripMargin) + test(s"x = proc { \"Hello #{myValue}\" }") + test("Array.new(x) { |i| i += 1 }") + test("test_name 'Foo' do;end") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/EnsureClauseParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/EnsureClauseParserTests.scala new file mode 100644 index 000000000000..40a96664ac52 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/EnsureClauseParserTests.scala @@ -0,0 +1,14 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class EnsureClauseParserTests extends RubyParserFixture with Matchers { + "ensure statement" in { + test("""def refund + | ensure + | redirect_to paddle_charge_path(@charge) + |end + |""".stripMargin) + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/FieldAccessParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/FieldAccessParserTests.scala new file mode 100644 index 000000000000..f7e0c1b91287 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/FieldAccessParserTests.scala @@ -0,0 +1,11 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class FieldAccessParserTests extends RubyParserFixture with Matchers { + "Normal field access" in { + test("x.y") + test("self.x") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/HashLiteralParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/HashLiteralParserTests.scala new file mode 100644 index 000000000000..97513b6b7e2e --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/HashLiteralParserTests.scala @@ -0,0 +1,14 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class HashLiteralParserTests extends RubyParserFixture with Matchers { + "hash-literal" in { + test("{ }") + test("{**x}") + test("{**x, **y}") + test("{**x, y => 1, **z}") + test("{**group_by_type(some)}") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/IndexAccessParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/IndexAccessParserTests.scala new file mode 100644 index 000000000000..e6f80ff77f1b --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/IndexAccessParserTests.scala @@ -0,0 +1,11 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class IndexAccessParserTests extends RubyParserFixture with Matchers { + "Index access" in { + test("a[1]") + test("a[1,2]") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/InvocationWithParenthesisParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/InvocationWithParenthesisParserTests.scala new file mode 100644 index 000000000000..ebf307451302 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/InvocationWithParenthesisParserTests.scala @@ -0,0 +1,29 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class InvocationWithParenthesisParserTests extends RubyParserFixture with Matchers { + "method invocation with parenthesis" in { + test("foo()") + test("""foo( + |) + |""".stripMargin) + test("foo(1)") + test("foo(region: 1)") + test("foo(region:region)") + test("foo(id: /.*/)") + test("foo(*x, y)") + test("foo(:region)") + test("foo(:region,)") + test("foo(if: true)") + test("foo&.bar()") + test("foo&.bar(1, 2)") + test("""foo + |.bar + |""".stripMargin) + test("""foo. + |bar + |""".stripMargin) + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/InvocationWithoutParenthesesParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/InvocationWithoutParenthesesParserTests.scala new file mode 100644 index 000000000000..51445c816021 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/InvocationWithoutParenthesesParserTests.scala @@ -0,0 +1,22 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class InvocationWithoutParenthesesParserTests extends RubyParserFixture with Matchers { + "method invocation without parenthesis" in { + test("task.nil?") + test("foo?") + test("foo!") + } + + "command with do block" in { + test("""it 'should print 1' do + | puts 1 + |end + |""".stripMargin) + + test("foo&.bar") + test("foo&.bar 1,2") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/MethodDefinitionParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/MethodDefinitionParserTests.scala new file mode 100644 index 000000000000..7940cc17d00e --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/MethodDefinitionParserTests.scala @@ -0,0 +1,80 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class MethodDefinitionParserTests extends RubyParserFixture with Matchers { + "single line method definition" in { + test("def foo; end") + test("def foo(x); end") + test("def foo(x=1); end") + test("def foo(x, &y); end") + test("def foo(*arr); end") + test("def foo(**hash); end") + test("def foo(*arr, **hash); end") + test("def foo(x=1, y); end") + test("def foo(x: 1); end") + test("def foo(x:); end") + test("def foo(name:, surname:); end") + } + + "multi-line method definition" in { + test("""def foo + | 1/0 + | rescue ZeroDivisionError => e + |end + |""".stripMargin) + } + + "endless method definition" in { + test("def foo = x") + test("def foo =\n x") + test("def foo = \"something\"") + test("def id(x) = x") + } + + "method def with proc params" in { + test("""def foo(&block) + | yield + |end + |""".stripMargin) + + } + + "method def for mandatory parameters" in { + test("def foo(bar:) end") + + test(""" + |class SampleClass + | def sample_method (first_param:, second_param:) + | end + |end + |""".stripMargin) + + test(""" + |class SomeClass + | def initialize( + | name, age) + | end + |end + |""".stripMargin) + + test(""" + |class SomeClass + | def initialize( + | name, age + | ) + | end + |end + |""".stripMargin) + + test(""" + |class SomeClass + | def initialize( + | name: nil, age + | ) + | end + |end + |""".stripMargin) + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ModuleParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ModuleParserTests.scala new file mode 100644 index 000000000000..a5959423caf9 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ModuleParserTests.scala @@ -0,0 +1,10 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class ModuleParserTests extends RubyParserFixture with Matchers { + "Module Definition" in { + test("module Bar; end") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ProcDefinitionParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ProcDefinitionParserTests.scala new file mode 100644 index 000000000000..a6525a467c76 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ProcDefinitionParserTests.scala @@ -0,0 +1,17 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class ProcDefinitionParserTests extends RubyParserFixture with Matchers { + "one-line proc definition" in { + test("-> {}") + test("-> do ; end") + test("-> do 1 end") + test("-> (x) {}") + test("-> (x) do ; end") + test("->(x = 1) {}") + test("-> (foo: 1) do ; end") + test("->(x, y) {puts x; puts y}") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RangeParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RangeParserTests.scala new file mode 100644 index 000000000000..ff7faa351589 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RangeParserTests.scala @@ -0,0 +1,10 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class RangeParserTests extends RubyParserFixture with Matchers { + "Range Operator" in { + test("1..2") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RegexParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RegexParserTests.scala new file mode 100644 index 000000000000..80c7abe47642 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RegexParserTests.scala @@ -0,0 +1,32 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class RegexParserTests extends RubyParserFixture with Matchers { + "Regex" in { + test("//") + test("x = //") + test("puts //") + test("puts(//)") + test("puts(1, //)") + test("""case foo + | when /^ch_/ + | bar + |end""".stripMargin) + test("""unless /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i.match?(value) + |end""".stripMargin) + test("/(eu|us)/") + test("x = /(eu|us)/") + test("puts /(eu|us)/") + test("puts(/eu|us/)") + test("%r{a-z}") + test("%r") + test("%r[]") + test("/x#{1}y/") + test("x = /x#{1}y/") + test("puts /x#{1}y/") + test("puts(/x#{1}y/)") + test("%r{x#{0}|y}") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RequireParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RequireParserTests.scala new file mode 100644 index 000000000000..714c49453da5 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RequireParserTests.scala @@ -0,0 +1,12 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class RequireParserTests extends RubyParserFixture with Matchers { + "require" in { + test("require sendgrid-ruby") + test("require_all './dir'") + test("require_relative 'util/help/dir/'") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RescueClauseParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RescueClauseParserTests.scala new file mode 100644 index 000000000000..22714ce8f7da --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/RescueClauseParserTests.scala @@ -0,0 +1,27 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class RescueClauseParserTests extends RubyParserFixture with Matchers { + "resuce statement" in { + test("""begin + |1/0 + |rescue ZeroDivisionError => e + |end + |""".stripMargin) + + test("""def foo; + |1/0 + |rescue ZeroDivisionError => e + |end + |""".stripMargin) + + test("""foo x do |y| + |y/0 + |rescue ZeroDivisionError => e + |end + |""".stripMargin) + } + +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ReturnParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ReturnParserTests.scala new file mode 100644 index 000000000000..dccb0a16898c --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/ReturnParserTests.scala @@ -0,0 +1,12 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class ReturnParserTests extends RubyParserFixture with Matchers { + "Standalone return statement" in { + test("return") + test("return ::X.y()") + test("return(0)") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/StringParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/StringParserTests.scala new file mode 100644 index 000000000000..01d363592873 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/StringParserTests.scala @@ -0,0 +1,67 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class StringParserTests extends RubyParserFixture with Matchers { + "single quoted literal" in { + test("''") + test("'x' 'y'") + test("""'x' \ + | 'y' + |""".stripMargin) + test("""'x' \ + | 'y' \ + | 'z'""".stripMargin) + } + + "non expanded `%q` literal" in { + test("%q()") + test("%q[]") + test("%q{}") + test("%q<>") + test("%q##") + test("%q(x)") + test("%q[x]") + test("%q#x#") + test("%q(\\()") + test("%q[\\]]") + test("%q#\\##") + test("%q(foo)") + test("%q( () )") + test("%q( (\\)) )") + test("%q< <\\>> >") + } + + "expanded `%Q` literal" in { + test("%Q()") + test("%Q{text=#{1}}") + test("%Q[#{1}#{2}]") + } + + "expanded `%(` string literal" in { + test("%()") + test("%(text=#{1})") + test("%(#{1}#{2})") + test("puts %()") + } + + "double quoted string literal" in { + test("\"\"") + test("\"x\" \"y\"") + test(""" + |"x" \ + | "y"""".stripMargin) + } + + "double quoted string interpolation" in { + test("\"#{1}#{2}\"") + test(""""#{10} \ + | is a number."""".stripMargin) + } + + "Expanded `%x` external command literal" in { + test("%x//") + test("%x{l#{'s'}}") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/TernaryConditionalParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/TernaryConditionalParserTests.scala new file mode 100644 index 000000000000..0308bbd8605a --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/TernaryConditionalParserTests.scala @@ -0,0 +1,14 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class TernaryConditionalParserTests extends RubyParserFixture with Matchers { + "ternary conditional expressions" in { + test("x ? y : z") + test("""x ? + | y + |: z + |""".stripMargin) + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/UnlessConditionParserTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/UnlessConditionParserTests.scala new file mode 100644 index 000000000000..21694e04ec06 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/parser/UnlessConditionParserTests.scala @@ -0,0 +1,29 @@ +package io.joern.rubysrc2cpg.parser + +import io.joern.rubysrc2cpg.testfixtures.RubyParserFixture +import org.scalatest.matchers.should.Matchers + +class UnlessConditionParserTests extends RubyParserFixture with Matchers { + "Unless expression" in { + test("""unless foo + | bar + |end + |""".stripMargin) + + test("""unless foo; bar + |end + |""".stripMargin) + + test("""unless foo then + | bar + |end + |""".stripMargin) + + test("""unless __LINE__ == 0 then + |else + |end + |""".stripMargin) + + test("return(value) unless item") + } +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/passes/RubyTypeRecoveryTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/passes/RubyTypeRecoveryTests.scala index bb06adf658b3..fd780666c55a 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/passes/RubyTypeRecoveryTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/passes/RubyTypeRecoveryTests.scala @@ -1,5 +1,6 @@ package io.joern.rubysrc2cpg.passes +import io.joern.rubysrc2cpg.passes.Defines.Main import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.joern.x2cpg.Defines as XDefines import io.joern.rubysrc2cpg.passes.GlobalTypes.kernelPrefix @@ -59,14 +60,14 @@ class RubyInternalTypeRecoveryTests extends RubyCode2CpgFixture(withPostProcessi "resolve 'print' and 'puts' StubbedRubyType calls" in { val List(printCall) = cpg.call("print").l - printCall.methodFullName shouldBe s"$kernelPrefix:print" + printCall.methodFullName shouldBe s"$kernelPrefix.print" val List(maxCall) = cpg.call("puts").l - maxCall.methodFullName shouldBe s"$kernelPrefix:puts" + maxCall.methodFullName shouldBe s"$kernelPrefix.puts" } "present the declared method name when a built-in with the same name is used in the same compilation unit" in { val List(absCall) = cpg.call("sleep").l - absCall.methodFullName shouldBe "main.rb:::program:sleep" + absCall.methodFullName shouldBe s"main.rb:$Main.sleep" } } @@ -141,7 +142,7 @@ class RubyInternalTypeRecoveryTests extends RubyCode2CpgFixture(withPostProcessi inside(constructAssignment.argument.l) { case (lhs: Identifier) :: rhs :: Nil => - lhs.typeFullName shouldBe "test2.rb:::program.Test2A" + lhs.typeFullName shouldBe s"test2.rb:$Main.Test2A" case xs => fail(s"Expected lhs and rhs, got [${xs.code.mkString(",")}]") } case xs => fail(s"Expected lhs and rhs, got [${xs.code.mkString(",")}]") @@ -167,8 +168,8 @@ class RubyInternalTypeRecoveryTests extends RubyCode2CpgFixture(withPostProcessi "propagate to identifier" ignore { inside(cpg.identifier.name("(a|b)").l) { case aIdent :: bIdent :: Nil => - aIdent.typeFullName shouldBe "Test0.rb:::program.A" - bIdent.typeFullName shouldBe "Test0.rb:::program.A" + aIdent.typeFullName shouldBe s"Test0.rb:$Main.A" + bIdent.typeFullName shouldBe s"Test0.rb:$Main.A" case xs => fail(s"Expected one identifier, got [${xs.name.mkString(",")}]") } } @@ -195,7 +196,7 @@ class RubyExternalTypeRecoveryTests // TODO: Revisit "be present in (Case 1)" ignore { cpg.identifier("sg").lineNumber(5).typeFullName.l shouldBe List("sendgrid-ruby.SendGrid.API") - cpg.call("client").methodFullName.headOption shouldBe Option("sendgrid-ruby.SendGrid.API:client") + cpg.call("client").methodFullName.headOption shouldBe Option("sendgrid-ruby.SendGrid.API.client") } "resolve correct imports via tag nodes" in { @@ -219,7 +220,7 @@ class RubyExternalTypeRecoveryTests "be present in (Case 2)" ignore { cpg.call("post").methodFullName.l shouldBe List( - "sendgrid-ruby::program.SendGrid.API.client.mail.anonymous.post" + s"sendgrid-ruby.$Main.SendGrid.API.client.mail.anonymous.post" ) } } @@ -280,7 +281,7 @@ class RubyExternalTypeRecoveryTests .isIdentifier .name("d") .headOption: @unchecked - d.typeFullName shouldBe "dbi::program.DBI.connect." + d.typeFullName shouldBe "dbi.$Main.DBI.connect." d.dynamicTypeHintFullName shouldBe Seq() } @@ -291,7 +292,7 @@ class RubyExternalTypeRecoveryTests .isCall .name("select_one") .l - d.methodFullName shouldBe "dbi::program.DBI.connect..select_one" + d.methodFullName shouldBe "dbi.$Main.DBI.connect..select_one" d.dynamicTypeHintFullName shouldBe Seq() d.callee(NoResolve).isExternal.headOption shouldBe Some(true) } @@ -300,10 +301,10 @@ class RubyExternalTypeRecoveryTests "resolve correct imports via tag nodes" ignore { val List(foo: ResolvedTypeDecl) = cpg.file(".*foo.rb").ast.isCall.where(_.referencedImports).tag._toEvaluatedImport.toList: @unchecked - foo.fullName shouldBe "dbi::program.DBI" + foo.fullName shouldBe s"dbi.$Main.DBI" val List(bar: ResolvedTypeDecl) = cpg.file(".*bar.rb").ast.isCall.where(_.referencedImports).tag._toEvaluatedImport.toList: @unchecked - bar.fullName shouldBe "foo.rb::program.FooModule" + bar.fullName shouldBe s"foo.rb.$Main.FooModule" } } @@ -341,7 +342,7 @@ class RubyExternalTypeRecoveryTests val Some(log) = cpg.identifier("log").headOption: @unchecked log.typeFullName shouldBe "logger.Logger" val List(errorCall) = cpg.call("error").l - errorCall.methodFullName shouldBe "logger.Logger:error" + errorCall.methodFullName shouldBe "logger.Logger.error" } } @@ -360,12 +361,12 @@ class RubyExternalTypeRecoveryTests "resolved the type of call" in { val Some(create) = cpg.call("create").headOption: @unchecked - create.methodFullName shouldBe "stripe.rb:::program.Stripe.Customer:create" + create.methodFullName shouldBe s"stripe.rb:$Main.Stripe.Customer.create" } "resolved the type of identifier" in { val Some(customer) = cpg.identifier("customer").headOption: @unchecked - customer.typeFullName shouldBe "stripe::program.Stripe.Customer.create." + customer.typeFullName shouldBe s"stripe.$Main.Stripe.Customer.create." } } @@ -384,11 +385,11 @@ class RubyExternalTypeRecoveryTests .moreCode(RubyExternalTypeRecoveryTests.LOGGER_GEMFILE, "Gemfile") "have a correct type for call `connect`" in { - cpg.call("error").methodFullName.l shouldBe List("logger.Logger:error") + cpg.call("error").methodFullName.l shouldBe List("logger.Logger.error") } "have a correct type for identifier `d`" in { - cpg.identifier("e").typeFullName.l shouldBe List("logger.Logger:error.") + cpg.identifier("e").typeFullName.l shouldBe List("logger.Logger.error.") } } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/CallTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/CallTests.scala index 7286d66ef50a..60acfd6a01ec 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/CallTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/CallTests.scala @@ -1,7 +1,7 @@ package io.joern.rubysrc2cpg.querying import io.joern.rubysrc2cpg.passes.{GlobalTypes, Defines as RubyDefines} -import io.joern.rubysrc2cpg.passes.Defines.RubyOperators +import io.joern.rubysrc2cpg.passes.Defines.{Main, RubyOperators} import io.joern.rubysrc2cpg.passes.GlobalTypes.kernelPrefix import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.joern.x2cpg.Defines @@ -19,7 +19,7 @@ class CallTests extends RubyCode2CpgFixture(withPostProcessing = true) { val List(puts) = cpg.call.name("puts").l puts.lineNumber shouldBe Some(2) puts.code shouldBe "puts 'hello'" - puts.methodFullName shouldBe s"$kernelPrefix:puts" + puts.methodFullName shouldBe s"$kernelPrefix.puts" puts.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH val List(selfReceiver: Identifier, hello: Literal) = puts.argument.l: @unchecked @@ -53,7 +53,7 @@ class CallTests extends RubyCode2CpgFixture(withPostProcessing = true) { val List(puts) = cpg.call.name("puts").l puts.lineNumber shouldBe Some(2) puts.code shouldBe "Kernel.puts 'hello'" - puts.methodFullName shouldBe s"$kernelPrefix:puts" + puts.methodFullName shouldBe s"$kernelPrefix.puts" puts.dispatchType shouldBe DispatchTypes.DYNAMIC_DISPATCH val List(kernelRec: Call) = puts.receiver.l: @unchecked @@ -71,7 +71,7 @@ class CallTests extends RubyCode2CpgFixture(withPostProcessing = true) { val List(atan2) = cpg.call.name("atan2").l atan2.lineNumber shouldBe Some(3) atan2.code shouldBe "Math.atan2(1, 1)" - atan2.methodFullName shouldBe s"${GlobalTypes.builtinPrefix}.Math:atan2" + atan2.methodFullName shouldBe s"${GlobalTypes.builtinPrefix}.Math.atan2" atan2.dispatchType shouldBe DispatchTypes.DYNAMIC_DISPATCH val List(mathRec: Call) = atan2.receiver.l: @unchecked @@ -161,13 +161,13 @@ class CallTests extends RubyCode2CpgFixture(withPostProcessing = true) { |""".stripMargin) "create an assignment from `a` to an invocation block" in { - inside(cpg.method(":program").assignment.where(_.target.isIdentifier.name("a")).l) { + inside(cpg.method.isModule.assignment.where(_.target.isIdentifier.name("a")).l) { case assignment :: Nil => assignment.code shouldBe "a = A.new" inside(assignment.argument.l) { case (a: Identifier) :: (_: Block) :: Nil => a.name shouldBe "a" - a.dynamicTypeHintFullName should contain("Test0.rb:::program.A") + a.dynamicTypeHintFullName should contain(s"Test0.rb:$Main.A") case xs => fail(s"Expected one identifier and one call argument, got [${xs.code.mkString(",")}]") } case xs => fail(s"Expected a single assignment, got [${xs.code.mkString(",")}]") @@ -175,7 +175,7 @@ class CallTests extends RubyCode2CpgFixture(withPostProcessing = true) { } "create an assignment from a temp variable to the call" in { - inside(cpg.method(":program").assignment.where(_.target.isIdentifier.name("")).l) { + inside(cpg.method.isModule.assignment.where(_.target.isIdentifier.name("")).l) { case assignment :: Nil => inside(assignment.argument.l) { case (a: Identifier) :: (alloc: Call) :: Nil => @@ -196,7 +196,7 @@ class CallTests extends RubyCode2CpgFixture(withPostProcessing = true) { inside(constructor.argument.l) { case (a: Identifier) :: Nil => a.name shouldBe "" - a.typeFullName shouldBe "Test0.rb:::program.A" + a.typeFullName shouldBe s"Test0.rb:$Main.A" a.argumentIndex shouldBe 0 case xs => fail(s"Expected one identifier and one call argument, got [${xs.code.mkString(",")}]") } @@ -218,7 +218,7 @@ class CallTests extends RubyCode2CpgFixture(withPostProcessing = true) { inside(cpg.call("src").l) { case src :: Nil => src.name shouldBe "src" - src.methodFullName shouldBe "Test0.rb:::program:src" + src.methodFullName shouldBe s"Test0.rb:$Main.src" case xs => fail(s"Expected exactly one `src` call, instead got [${xs.code.mkString(",")}]") } } @@ -260,6 +260,15 @@ class CallTests extends RubyCode2CpgFixture(withPostProcessing = true) { inArg.argumentName shouldBe Option("in") } + "named parameters in parenthesis-less call with a known keyword as the association key should shadow the keyword" in { + val cpg = code(""" + |foo retry: 3 + |""".stripMargin) + val List(_, retry) = cpg.call.nameExact("foo").argument.l: @unchecked + retry.code shouldBe "3" + retry.argumentName shouldBe Some("retry") + } + "a call with a quoted regex literal should have a literal receiver" in { val cpg = code("%r{^/}.freeze") val regexLiteral = cpg.call.nameExact("freeze").receiver.fieldAccess.argument(1).head.asInstanceOf[Literal] diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/CaseTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/CaseTests.scala index 2d9ae6491306..f46d99664045 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/CaseTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/CaseTests.scala @@ -1,10 +1,9 @@ package io.joern.rubysrc2cpg.querying import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture -import io.shiftleft.semanticcpg.language.* -import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.Operators - +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class CaseTests extends RubyCode2CpgFixture { "`case x ... end` should be represented with if-else chain and multiple match expressions should be or-ed together" in { @@ -20,7 +19,7 @@ class CaseTests extends RubyCode2CpgFixture { |""".stripMargin val cpg = code(caseCode) - val block @ List(_) = cpg.method(":program").block.astChildren.isBlock.l + val block @ List(_) = cpg.method.isModule.block.astChildren.isBlock.l val List(assign) = block.astChildren.assignment.l; val List(lhs, rhs) = assign.argument.l @@ -68,7 +67,7 @@ class CaseTests extends RubyCode2CpgFixture { |end |""".stripMargin) - val block @ List(_) = cpg.method(":program").block.astChildren.isBlock.l + val block @ List(_) = cpg.method.isModule.block.astChildren.isBlock.l val headIf @ List(_) = block.astChildren.isControlStructure.l val ifStmts @ List(_, _, _, _) = headIf.repeat(_.astChildren.order(3).astChildren.isControlStructure)(_.emit).l; diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ClassTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ClassTests.scala index 9c03d330146d..70fa020c7f1d 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ClassTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ClassTests.scala @@ -3,9 +3,10 @@ package io.joern.rubysrc2cpg.querying import io.joern.rubysrc2cpg.passes.{GlobalTypes, Defines as RubyDefines} import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.joern.x2cpg.Defines -import io.shiftleft.codepropertygraph.generated.Operators +import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* +import io.joern.rubysrc2cpg.passes.Defines.Main class ClassTests extends RubyCode2CpgFixture { @@ -17,7 +18,7 @@ class ClassTests extends RubyCode2CpgFixture { val List(classC) = cpg.typeDecl.name("C").l classC.inheritsFromTypeFullName shouldBe List() - classC.fullName shouldBe "Test0.rb:::program.C" + classC.fullName shouldBe s"Test0.rb:$Main.C" classC.lineNumber shouldBe Some(2) classC.baseType.l shouldBe List() classC.member.name.l shouldBe List(RubyDefines.TypeDeclBody, RubyDefines.Initialize) @@ -25,7 +26,7 @@ class ClassTests extends RubyCode2CpgFixture { val List(singletonC) = cpg.typeDecl.nameExact("C").l singletonC.inheritsFromTypeFullName shouldBe List() - singletonC.fullName shouldBe "Test0.rb:::program.C" + singletonC.fullName shouldBe s"Test0.rb:$Main.C" singletonC.lineNumber shouldBe Some(2) singletonC.baseType.l shouldBe List() singletonC.member.name.l shouldBe List() @@ -42,7 +43,7 @@ class ClassTests extends RubyCode2CpgFixture { val List(classC) = cpg.typeDecl.name("C").l classC.inheritsFromTypeFullName shouldBe List("D") - classC.fullName shouldBe "Test0.rb:::program.C" + classC.fullName shouldBe s"Test0.rb:$Main.C" classC.lineNumber shouldBe Some(2) classC.member.name.l shouldBe List(RubyDefines.TypeDeclBody, RubyDefines.Initialize) classC.method.name.l shouldBe List(RubyDefines.TypeDeclBody, RubyDefines.Initialize) @@ -53,7 +54,7 @@ class ClassTests extends RubyCode2CpgFixture { val List(singletonC) = cpg.typeDecl.nameExact("C").l singletonC.inheritsFromTypeFullName shouldBe List("D") - singletonC.fullName shouldBe "Test0.rb:::program.C" + singletonC.fullName shouldBe s"Test0.rb:$Main.C" singletonC.lineNumber shouldBe Some(2) singletonC.member.name.l shouldBe List() singletonC.method.name.l shouldBe List() @@ -74,6 +75,9 @@ class ClassTests extends RubyCode2CpgFixture { val List(singletonC) = cpg.typeDecl.name("C").l singletonC.member.nameExact("@a").isEmpty shouldBe true + + val List(aGetterMember) = classC.member.nameExact("a").l + aGetterMember.dynamicTypeHintFullName should contain("Test0.rb:
.C.a") } "`attr_reader :'abc'` is represented by a `@abc` MEMBER node" in { @@ -88,6 +92,9 @@ class ClassTests extends RubyCode2CpgFixture { abcMember.code shouldBe "attr_reader :'abc'" abcMember.lineNumber shouldBe Some(3) + + val List(aMember) = classC.member.nameExact("abc").l + aMember.dynamicTypeHintFullName should contain("Test0.rb:
.C.abc") } "`attr_reader :'abc' creates an `abc` METHOD node" in { @@ -102,14 +109,17 @@ class ClassTests extends RubyCode2CpgFixture { methodAbc.code shouldBe "def abc (...)" methodAbc.lineNumber shouldBe Some(3) - methodAbc.parameter.isEmpty shouldBe true - methodAbc.fullName shouldBe "Test0.rb:::program.C:abc" + methodAbc.parameter.indexGt(0).isEmpty shouldBe true + methodAbc.fullName shouldBe s"Test0.rb:$Main.C.abc" - // TODO: Make sure that @abc in this return is the actual field val List(ret: Return) = methodAbc.methodReturn.cfgIn.l: @unchecked - val List(abcField: Identifier) = ret.astChildren.l: @unchecked - ret.code shouldBe "return @abc" - abcField.name shouldBe "@abc" + val List(abcFieldAccess: Call) = ret.astChildren.l: @unchecked + ret.code shouldBe "@abc" + abcFieldAccess.name shouldBe Operators.fieldAccess + abcFieldAccess.code shouldBe "self.@abc" + + val List(aMember) = classC.member.nameExact("abc").l + aMember.dynamicTypeHintFullName should contain("Test0.rb:
.C.abc") } "`attr_reader :a, :b` is represented by `@a`, `@b` MEMBER nodes" in { @@ -152,15 +162,19 @@ class ClassTests extends RubyCode2CpgFixture { methodA.code shouldBe "def a= (...)" methodA.lineNumber shouldBe Some(3) - methodA.fullName shouldBe "Test0.rb:::program.C:a=" + methodA.fullName shouldBe s"Test0.rb:$Main.C.a=" // TODO: there's probably a better way for testing this - val List(param) = methodA.parameter.l - val List(assignment) = methodA.assignment.l - val List(lhs: Identifier, rhs: Identifier) = assignment.argument.l: @unchecked + val List(_, param) = methodA.parameter.l + val List(assignment) = methodA.assignment.l + val List(lhs: Call, rhs: Identifier) = assignment.argument.l: @unchecked param.name shouldBe rhs.name - lhs.name shouldBe "@a" + lhs.name shouldBe Operators.fieldAccess + lhs.code shouldBe "self.@a" + + val List(aMember) = classC.member.nameExact("a=").l + aMember.dynamicTypeHintFullName should contain("Test0.rb:
.C.a=") } "`attr_accessor :a` is represented by a `@a` MEMBER node" in { @@ -189,7 +203,7 @@ class ClassTests extends RubyCode2CpgFixture { val List(classC) = cpg.typeDecl.name("C").l val List(methodF) = classC.method.name("f").l - methodF.fullName shouldBe "Test0.rb:::program.C:f" + methodF.fullName shouldBe s"Test0.rb:$Main.C.f" val List(memberF) = classC.member.nameExact("f").l memberF.dynamicTypeHintFullName.toSet should contain(methodF.fullName) @@ -261,7 +275,7 @@ class ClassTests extends RubyCode2CpgFixture { val List(classC) = cpg.typeDecl.name("C").l val List(methodInit) = classC.method.name(RubyDefines.Initialize).l - methodInit.fullName shouldBe s"Test0.rb:::program.C:${RubyDefines.Initialize}" + methodInit.fullName shouldBe s"Test0.rb:$Main.C.${RubyDefines.Initialize}" methodInit.isConstructor.isEmpty shouldBe false } @@ -274,7 +288,7 @@ class ClassTests extends RubyCode2CpgFixture { val List(classC) = cpg.typeDecl.name("C").l val List(methodInit) = classC.method.name(RubyDefines.Initialize).l - methodInit.fullName shouldBe s"Test0.rb:::program.C:${RubyDefines.Initialize}" + methodInit.fullName shouldBe s"Test0.rb:$Main.C.${RubyDefines.Initialize}" } "only `def initialize() ... end` directly under class has the constructor modifier" in { @@ -312,8 +326,8 @@ class ClassTests extends RubyCode2CpgFixture { | |""".stripMargin) - cpg.member("MConst").typeDecl.fullName.head shouldBe "Test0.rb:::program.MMM" - cpg.member("NConst").typeDecl.fullName.head shouldBe "Test0.rb:::program.MMM.Nested" + cpg.member("MConst").typeDecl.fullName.head shouldBe s"Test0.rb:$Main.MMM" + cpg.member("NConst").typeDecl.fullName.head shouldBe s"Test0.rb:$Main.MMM.Nested" } "a basic anonymous class" should { @@ -329,14 +343,14 @@ class ClassTests extends RubyCode2CpgFixture { inside(cpg.typeDecl.nameExact("").l) { case anonClass :: Nil => anonClass.name shouldBe "" - anonClass.fullName shouldBe "Test0.rb:::program." + anonClass.fullName shouldBe s"Test0.rb:$Main." inside(anonClass.method.l) { case hello :: defaultConstructor :: Nil => defaultConstructor.name shouldBe RubyDefines.Initialize - defaultConstructor.fullName shouldBe s"Test0.rb:::program.:${RubyDefines.Initialize}" + defaultConstructor.fullName shouldBe s"Test0.rb:$Main..${RubyDefines.Initialize}" hello.name shouldBe "hello" - hello.fullName shouldBe "Test0.rb:::program.:hello" + hello.fullName shouldBe s"Test0.rb:$Main..hello" case xs => fail(s"Expected a single method, but got [${xs.map(x => x.label -> x.code).mkString(",")}]") } case xs => fail(s"Expected a single anonymous class, but got [${xs.map(x => x.label -> x.code).mkString(",")}]") @@ -344,7 +358,7 @@ class ClassTests extends RubyCode2CpgFixture { } "generate an assignment to the variable `a` with the source being a constructor invocation of the class" in { - inside(cpg.method(":program").assignment.l) { + inside(cpg.method.isModule.assignment.l) { case aAssignment :: Nil => aAssignment.target.code shouldBe "a" aAssignment.source.code shouldBe "Class.new (...)" @@ -354,8 +368,7 @@ class ClassTests extends RubyCode2CpgFixture { } - // TODO: This should be remodelled as a property access `animal.bark = METHOD_REF` - "a basic singleton class" ignore { + "a basic singleton class extending an object instance" should { val cpg = code("""class Animal; end |animal = Animal.new | @@ -363,35 +376,49 @@ class ClassTests extends RubyCode2CpgFixture { | def bark | 'Woof' | end + | + | def legs + | 4 + | end |end | |animal.bark # => 'Woof' |""".stripMargin) - "generate a type decl with the associated members" in { - inside(cpg.typeDecl.nameExact("").l) { - case anonClass :: Nil => - anonClass.name shouldBe "" - anonClass.fullName shouldBe "Test0.rb:::program." - // TODO: Attempt to resolve the below with the `scope` class once we're handling constructors - anonClass.inheritsFromTypeFullName shouldBe Seq("animal") - inside(anonClass.method.l) { - case defaultConstructor :: bark :: Nil => - defaultConstructor.name shouldBe Defines.ConstructorMethodName - defaultConstructor.fullName shouldBe s"Test0.rb:::program.:${Defines.ConstructorMethodName}" + "Create assignments to method refs for methods on singleton object" in { + inside(cpg.method.isModule.block.assignment.l) { + case _ :: _ :: _ :: barkAssignment :: legsAssignment :: Nil => + inside(barkAssignment.argument.l) { + case (lhs: Call) :: (rhs: TypeRef) :: Nil => + val List(identifier, fieldIdentifier) = lhs.argument.l: @unchecked + identifier.code shouldBe "animal" + fieldIdentifier.code shouldBe "bark" + + rhs.typeFullName shouldBe s"Test0.rb:$Main.class< fail(s"Expected two arguments for assignment, got [${xs.code.mkString(",")}]") + } - bark.name shouldBe "bark" - bark.fullName shouldBe "Test0.rb:::program.:bark" - case xs => fail(s"Expected a single method, but got [${xs.map(x => x.label -> x.code).mkString(",")}]") + inside(legsAssignment.argument.l) { + case (lhs: Call) :: (rhs: TypeRef) :: Nil => + val List(identifier, fieldIdentifier) = lhs.argument.l: @unchecked + identifier.code shouldBe "animal" + fieldIdentifier.code shouldBe "legs" + + rhs.typeFullName shouldBe s"Test0.rb:$Main.class< fail(s"Expected two arguments for assignment, got [${xs.code.mkString(",")}]") } - case xs => fail(s"Expected a single anonymous class, but got [${xs.map(x => x.label -> x.code).mkString(",")}]") + case xs => fail(s"Expected five assignments, got [${xs.code.mkString(",")}]") } } - "register that `animal` may possibly be an instantiation of the singleton type" in { - cpg.local("animal").possibleTypes.l should contain("Test0.rb:::program.") + "Create TYPE_DECL nodes for two singleton methods" in { + inside(cpg.typeDecl.name("(bark|legs)").l) { + case barkTypeDecl :: legsTypeDecl :: Nil => + barkTypeDecl.fullName shouldBe s"Test0.rb:$Main.class< fail(s"Expected two type_decls, got [${xs.code.mkString(",")}]") + } } - } "if: as function param" should { @@ -466,12 +493,14 @@ class ClassTests extends RubyCode2CpgFixture { } } - "fully qualified base types" should { + "base types names extending a class in the definition" should { val cpg = code("""require "rails/all" | |module Bar - | class Baz + | module Baz + | class Boz + | end | end |end | @@ -479,12 +508,12 @@ class ClassTests extends RubyCode2CpgFixture { | class Application < Rails::Application | end | - | class Foo < Bar::Baz + | class Foo < Bar::Baz::Boz | end |end |""".stripMargin) - "not confuse the internal `Application` with `Rails::Application` and leave the type unresolved" in { + "handle a qualified base type from an external type correctly" in { inside(cpg.typeDecl("Application").headOption) { case Some(app) => app.inheritsFromTypeFullName.head shouldBe "Rails.Application" @@ -492,10 +521,10 @@ class ClassTests extends RubyCode2CpgFixture { } } - "resolve the internal type being referenced" in { + "handle a deeply qualified internal base type correctly" in { inside(cpg.typeDecl("Foo").headOption) { case Some(app) => - app.inheritsFromTypeFullName.head shouldBe "Test0.rb:::program.Bar.Baz" + app.inheritsFromTypeFullName.head shouldBe "Bar.Baz.Boz" case None => fail("Expected a type decl for 'Foo', instead got nothing") } } @@ -576,6 +605,23 @@ class ClassTests extends RubyCode2CpgFixture { case xs => fail(s"Expected TypeDecl for Foo, instead got ${xs.name.mkString(", ")}") } } + + "call the body method" in { + inside(cpg.call.nameExact(RubyDefines.TypeDeclBody).headOption) { + case Some(bodyCall) => + bodyCall.dispatchType shouldBe DispatchTypes.STATIC_DISPATCH + bodyCall.methodFullName shouldBe s"Test0.rb:$Main.Foo.${RubyDefines.TypeDeclBody}" + + bodyCall.receiver.isEmpty shouldBe true + inside(bodyCall.argumentOption(0)) { + case Some(selfArg: Call) => + selfArg.name shouldBe Operators.fieldAccess + selfArg.code shouldBe "self::Foo" + case None => fail("Expected `self` argument") + } + case None => fail("Expected call") + } + } } "Class Variables in Class and Methods" should { @@ -680,7 +726,7 @@ class ClassTests extends RubyCode2CpgFixture { "create the `StandardError` local variable" in { cpg.local.nameExact("some_variable").dynamicTypeHintFullName.toList shouldBe List( - s"<${GlobalTypes.builtinPrefix}.StandardError>" + s"${GlobalTypes.builtinPrefix}.StandardError" ) } @@ -744,12 +790,19 @@ class ClassTests extends RubyCode2CpgFixture { inside(methodBlock.astChildren.l) { case methodCall :: Nil => inside(methodCall.astChildren.l) { - case (base: Call) :: (self: Identifier) :: (literal: Literal) :: (methodRef: MethodRef) :: Nil => + case (base: Call) :: (self: Identifier) :: (literal: Literal) :: (typeRef: TypeRef) :: Nil => base.code shouldBe "self.scope" self.name shouldBe "self" literal.code shouldBe ":hits_by_ip" - methodRef.methodFullName shouldBe s"Test0.rb:::program.Foo:${RubyDefines.TypeDeclBody}:0" - methodRef.referencedMethod.parameter.indexGt(0).name.l shouldBe List("ip", "col") + typeRef.typeFullName shouldBe s"Test0.rb:$Main.Foo.${RubyDefines.TypeDeclBody}.0&Proc" + cpg.method + .fullNameExact( + typeRef.typ.referencedTypeDecl.member.name("call").dynamicTypeHintFullName.toSeq* + ) + .parameter + .indexGt(0) + .name + .l shouldBe List("ip", "col") case xs => fail(s"Expected three children, got ${xs.code.mkString(", ")} instead") } case xs => fail(s"Expected one call, got ${xs.code.mkString(", ")} instead") @@ -776,11 +829,83 @@ class ClassTests extends RubyCode2CpgFixture { case assignCall :: Nil => inside(assignCall.argument.l) { case lhs :: (rhs: Call) :: Nil => - rhs.typeFullName shouldBe "<__builtin.Encoding.Converter>:asciicompat_encoding" + rhs.typeFullName shouldBe "__builtin.Encoding.Converter.asciicompat_encoding" case xs => fail(s"Expected lhs and rhs for assignment call, got [${xs.code.mkString(",")}]") } case xs => fail(s"Expected one call for assignment, got [${xs.code.mkString(",")}]") } } } + + "Class definition on one line" should { + val cpg = code(""" + |class X 1 end + |""".stripMargin) + + "create TYPE_DECL" in { + inside(cpg.typeDecl.name("X").l) { + case xClass :: Nil => + inside(xClass.astChildren.isMethod.l) { + case bodyMethod :: initMethod :: Nil => + inside(bodyMethod.block.astChildren.l) { + case (literal: Literal) :: Nil => + literal.code shouldBe "1" + case xs => fail(s"Expected literal for body method, got [${xs.code.mkString(",")}]") + } + case xs => fail(s"Expected body and init method, got [${xs.code.mkString(",")}]") + } + case xs => fail(s"Expected one class, got [${xs.code.mkString(",")}]") + } + } + } + + "A call to super" should { + val cpg = code(""" + |class A + | def foo(a) + | end + |end + |class B < A + | def foo(a) + | super(a) + | end + |end + |""".stripMargin) + + "create a simple call" in { + val superCall = cpg.call.nameExact("super").head + superCall.code shouldBe "super(a)" + superCall.name shouldBe "super" + superCall.methodFullName shouldBe Defines.DynamicCallUnknownFullName + } + } + + "a class that is redefined should have a counter suffixed to ensure uniqueness" in { + val cpg = code(""" + |class Foo + | def foo;end + |end + |class Bar;end + |class Foo + | def foo;end + |end + |class Foo;end + |""".stripMargin) + + cpg.typeDecl.name("(Foo|Bar).*").filterNot(_.name.endsWith("")).name.l shouldBe List( + "Foo", + "Bar", + "Foo", + "Foo" + ) + cpg.typeDecl.name("(Foo|Bar).*").filterNot(_.name.endsWith("")).fullName.l shouldBe List( + s"Test0.rb:$Main.Foo", + s"Test0.rb:$Main.Bar", + s"Test0.rb:$Main.Foo0", + s"Test0.rb:$Main.Foo1" + ) + + cpg.method.nameExact("foo").fullName.l shouldBe List(s"Test0.rb:$Main.Foo.foo", s"Test0.rb:$Main.Foo0.foo") + + } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ControlStructureTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ControlStructureTests.scala index a24197513520..2007e59ea37d 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ControlStructureTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ControlStructureTests.scala @@ -293,7 +293,7 @@ class ControlStructureTests extends RubyCode2CpgFixture { whileCond.code shouldBe "true" whileCond.lineNumber shouldBe Some(2) - putsHi.methodFullName shouldBe s"$kernelPrefix:puts" + putsHi.methodFullName shouldBe s"$kernelPrefix.puts" putsHi.code shouldBe "puts 'hi'" putsHi.lineNumber shouldBe Some(2) } @@ -518,4 +518,18 @@ class ControlStructureTests extends RubyCode2CpgFixture { } } } + + "Generate continue node for next" in { + val cpg = code(""" + |for i in arr do + | next if i % 2 == 0 + |end + |""".stripMargin) + + inside(cpg.controlStructure.controlStructureType(ControlStructureTypes.CONTINUE).l) { + case nextControl :: Nil => + nextControl.code shouldBe "next" + case xs => fail(s"Expected next to be continue, got [${xs.code.mkString(",")}]") + } + } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/DependencyTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/DependencyTests.scala index 106efaf63b19..8b0148d6ae5c 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/DependencyTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/DependencyTests.scala @@ -5,6 +5,7 @@ import io.joern.x2cpg.Defines import io.joern.rubysrc2cpg.passes.Defines as RubyDefines import io.shiftleft.codepropertygraph.generated.nodes.{Block, Identifier} import io.shiftleft.semanticcpg.language.* +import io.joern.rubysrc2cpg.passes.Defines.Main class DependencyTests extends RubyCode2CpgFixture { @@ -96,7 +97,7 @@ class DownloadDependencyTest extends RubyCode2CpgFixture(downloadDependencies = inside(block.astChildren.isCall.nameExact("new").headOption) { case Some(constructorCall) => - constructorCall.methodFullName shouldBe s"dummy_logger.Main_module.Main_outer_class:${RubyDefines.Initialize}" + constructorCall.methodFullName shouldBe s"dummy_logger.Main_module.Main_outer_class.${RubyDefines.Initialize}" case None => fail(s"Expected constructor call, did not find one") } case xs => fail(s"Expected two arguments under the constructor assignment, got [${xs.code.mkString(", ")}]") @@ -110,7 +111,7 @@ class DownloadDependencyTest extends RubyCode2CpgFixture(downloadDependencies = inside(block.astChildren.isCall.name("new").headOption) { case Some(constructorCall) => - constructorCall.methodFullName shouldBe s"dummy_logger.Help:${RubyDefines.Initialize}" + constructorCall.methodFullName shouldBe s"dummy_logger.Help.${RubyDefines.Initialize}" case None => fail(s"Expected constructor call, did not find one") } case xs => fail(s"Expected two arguments under the constructor assignment, got [${xs.code.mkString(", ")}]") @@ -120,12 +121,12 @@ class DownloadDependencyTest extends RubyCode2CpgFixture(downloadDependencies = // TODO: This requires type propagation "recognise methodFullName for `first_fun`" ignore { cpg.call.name("first_fun").head.methodFullName should equal( - "dummy_logger::program:Main_module:Main_outer_class:first_fun" + s"dummy_logger.$Main.Main_module.Main_outer_class.first_fun" ) cpg.call .name("help_print") .head - .methodFullName shouldBe "dummy_logger::program:Help:help_print" + .methodFullName shouldBe s"dummy_logger.$Main:Help:help_print" } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/DoBlockTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/DoBlockTests.scala index 4b89a14b3c87..65e9a7cc7f5c 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/DoBlockTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/DoBlockTests.scala @@ -1,6 +1,7 @@ package io.joern.rubysrc2cpg.querying import io.joern.rubysrc2cpg.passes.GlobalTypes.builtinPrefix +import io.joern.rubysrc2cpg.passes.Defines.Main import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.joern.x2cpg.Defines import io.shiftleft.codepropertygraph.generated.nodes.* @@ -21,7 +22,7 @@ class DoBlockTests extends RubyCode2CpgFixture { | |""".stripMargin) - "create an anonymous method with associated type declaration" in { + "create an anonymous method with associated type declaration and wrapper type" in { inside(cpg.method.isModule.l) { case program :: Nil => inside(program.astChildren.collectAll[Method].l) { @@ -29,18 +30,22 @@ class DoBlockTests extends RubyCode2CpgFixture { foo.name shouldBe "foo" closureMethod.name shouldBe "0" - closureMethod.fullName shouldBe "Test0.rb:::program:0" + closureMethod.fullName shouldBe s"Test0.rb:$Main.0" case xs => fail(s"Expected a two method nodes, instead got [${xs.code.mkString(", ")}]") } inside(program.astChildren.collectAll[TypeDecl].isLambda.l) { case closureType :: Nil => closureType.name shouldBe "0" - closureType.fullName shouldBe "Test0.rb:::program:0" + closureType.fullName shouldBe s"Test0.rb:$Main.0" + case xs => fail(s"Expected a one closure type node, instead got [${xs.code.mkString(", ")}]") + } + inside(program.astChildren.collectAll[TypeDecl].name(".*Proc").l) { + case closureType :: Nil => val callMember = closureType.member.nameExact("call").head callMember.typeFullName shouldBe Defines.Any - callMember.dynamicTypeHintFullName shouldBe Seq("Test0.rb:::program:0") + callMember.dynamicTypeHintFullName shouldBe Seq(s"Test0.rb:$Main.0") case xs => fail(s"Expected a one closure type node, instead got [${xs.code.mkString(", ")}]") } case xs => fail(s"Expected a single program module, instead got [${xs.code.mkString(", ")}]") @@ -48,9 +53,9 @@ class DoBlockTests extends RubyCode2CpgFixture { } "create a method ref argument with populated type full name, which corresponds to the method type" in { - val methodRefArg = cpg.call("foo").argument(1).head.asInstanceOf[MethodRef] + val typeRefArg = cpg.call("foo").argument(1).head.asInstanceOf[TypeRef] val lambdaTypeDecl = cpg.typeDecl("0").head - methodRefArg.typeFullName shouldBe lambdaTypeDecl.fullName + typeRefArg.typeFullName shouldBe s"${lambdaTypeDecl.fullName}&Proc" } "have no parameters in the closure declaration" in { @@ -79,19 +84,19 @@ class DoBlockTests extends RubyCode2CpgFixture { |""".stripMargin) "create an anonymous method with associated type declaration" in { - inside(cpg.method.nameExact(":program").l) { + inside(cpg.method.isModule.l) { case program :: Nil => inside(program.astChildren.collectAll[Method].l) { case closureMethod :: Nil => closureMethod.name shouldBe "0" - closureMethod.fullName shouldBe "Test0.rb:::program:0" + closureMethod.fullName shouldBe s"Test0.rb:$Main.0" case xs => fail(s"Expected a one method nodes, instead got [${xs.code.mkString(", ")}]") } - inside(program.astChildren.collectAll[TypeDecl].l) { + inside(program.astChildren.collectAll[TypeDecl].isLambda.l) { case closureType :: Nil => closureType.name shouldBe "0" - closureType.fullName shouldBe "Test0.rb:::program:0" + closureType.fullName shouldBe s"Test0.rb:$Main.0" case xs => fail(s"Expected a one closure type node, instead got [${xs.code.mkString(", ")}]") } case xs => fail(s"Expected a single program module, instead got [${xs.code.mkString(", ")}]") @@ -108,13 +113,13 @@ class DoBlockTests extends RubyCode2CpgFixture { "specify the closure reference as an argument to the member call with block" in { inside(cpg.call("each").argument.l) { - case (myArray: Identifier) :: (lambdaRef: MethodRef) :: Nil => + case (myArray: Identifier) :: (lambdaRef: TypeRef) :: Nil => myArray.argumentIndex shouldBe 0 myArray.name shouldBe "my_array" myArray.code shouldBe "my_array" lambdaRef.argumentIndex shouldBe 1 - lambdaRef.methodFullName shouldBe "Test0.rb:::program:0" + lambdaRef.typeFullName shouldBe s"Test0.rb:$Main.0&Proc" case xs => fail(s"Expected `each` call to have call and method ref arguments, instead got [${xs.code.mkString(", ")}]") } @@ -141,20 +146,20 @@ class DoBlockTests extends RubyCode2CpgFixture { |""".stripMargin) "create an anonymous method with associated type declaration" in { - inside(cpg.method.nameExact(":program").l) { + inside(cpg.method.isModule.l) { case program :: Nil => inside(program.astChildren.collectAll[Method].l) { case closureMethod :: Nil => closureMethod.name shouldBe "0" - closureMethod.fullName shouldBe "Test0.rb:::program:0" + closureMethod.fullName shouldBe s"Test0.rb:$Main.0" closureMethod.isLambda.nonEmpty shouldBe true case xs => fail(s"Expected a one method nodes, instead got [${xs.code.mkString(", ")}]") } - inside(program.astChildren.collectAll[TypeDecl].l) { + inside(program.astChildren.collectAll[TypeDecl].isLambda.l) { case closureType :: Nil => closureType.name shouldBe "0" - closureType.fullName shouldBe "Test0.rb:::program:0" + closureType.fullName shouldBe s"Test0.rb:$Main.0" closureType.isLambda.nonEmpty shouldBe true case xs => fail(s"Expected a one closure type node, instead got [${xs.code.mkString(", ")}]") } @@ -173,13 +178,13 @@ class DoBlockTests extends RubyCode2CpgFixture { "specify the closure reference as an argument to the member call with block" in { inside(cpg.call("each").argument.l) { - case (hash: Identifier) :: (lambdaRef: MethodRef) :: Nil => + case (hash: Identifier) :: (lambdaRef: TypeRef) :: Nil => hash.argumentIndex shouldBe 0 hash.name shouldBe "hash" hash.code shouldBe "hash" lambdaRef.argumentIndex shouldBe 1 - lambdaRef.methodFullName shouldBe "Test0.rb:::program:0" + lambdaRef.typeFullName shouldBe s"Test0.rb:$Main.0&Proc" case xs => fail(s"Expected `each` call to have call and method ref arguments, instead got [${xs.code.mkString(", ")}]") } @@ -207,14 +212,16 @@ class DoBlockTests extends RubyCode2CpgFixture { |""".stripMargin) // Basic assertions for expected behaviour - "create the declarations for the closure" in { - inside(cpg.method(".*").l) { + "create the declarations for the closure with captured local" in { + inside(cpg.method.isLambda.l) { case m :: Nil => m.name should startWith("") + val myValue = m.local.nameExact("myValue").head + myValue.closureBindingId shouldBe Option(s"Test0.rb:$Main.myValue") case xs => fail(s"Expected exactly one closure method decl, instead got [${xs.code.mkString(",")}]") } - inside(cpg.typeDecl(".*").l) { + inside(cpg.typeDecl.isLambda.l) { case m :: Nil => m.name should startWith("") case xs => fail(s"Expected exactly one closure type decl, instead got [${xs.code.mkString(",")}]") @@ -224,17 +231,17 @@ class DoBlockTests extends RubyCode2CpgFixture { "annotate the nodes via CAPTURE bindings" in { cpg.all.collectAll[ClosureBinding].l match { case myValue :: Nil => - myValue.closureOriginalName.head shouldBe "myValue" + myValue.closureOriginalName shouldBe Option("myValue") inside(myValue._localViaRefOut) { case Some(local) => local.name shouldBe "myValue" - local.method.fullName.headOption shouldBe Option("Test0.rb:::program") + local.method.fullName.headOption shouldBe Option(s"Test0.rb:$Main") case None => fail("Expected closure binding refer to the captured local") } inside(myValue._captureIn.l) { - case (x: MethodRef) :: Nil => x.methodFullName shouldBe "Test0.rb:::program:0" - case xs => fail(s"Expected single method ref binding but got [${xs.mkString(",")}]") + case (x: TypeRef) :: Nil => x.typeFullName shouldBe s"Test0.rb:$Main.0&Proc" + case xs => fail(s"Expected single method ref binding but got [${xs.mkString(",")}]") } case xs => @@ -263,12 +270,12 @@ class DoBlockTests extends RubyCode2CpgFixture { tmpAssign.code shouldBe " = Array.new(x) { |i| i += 1 }" newCall.name shouldBe "new" - newCall.methodFullName shouldBe s"$builtinPrefix.Array:initialize" + newCall.methodFullName shouldBe s"$builtinPrefix.Array.initialize" inside(newCall.argument.l) { - case (_: Identifier) :: (x: Identifier) :: (closure: MethodRef) :: Nil => + case (_: Identifier) :: (x: Identifier) :: (closure: TypeRef) :: Nil => x.name shouldBe "x" - closure.methodFullName should endWith("0") + closure.typeFullName should endWith("0&Proc") case xs => fail(s"Expected a base, `x`, and closure ref, instead got [${xs.code.mkString(",")}]") } case xs => @@ -308,13 +315,69 @@ class DoBlockTests extends RubyCode2CpgFixture { "create a call `test_name` with a test name and lambda argument" in { inside(cpg.call.nameExact("test_name").argument.l) { - case (_: Identifier) :: (testName: Literal) :: (testMethod: MethodRef) :: Nil => + case (_: Identifier) :: (testName: Literal) :: (testMethod: TypeRef) :: Nil => testName.code shouldBe "'Foo'" - testMethod.referencedMethod.call.nameExact("puts").nonEmpty shouldBe true + cpg.method + .fullNameExact(testMethod.typ.referencedTypeDecl.member.name("call").dynamicTypeHintFullName.toSeq*) + .call + .nameExact("puts") + .nonEmpty shouldBe true case xs => fail(s"Expected a literal and method ref argument, instead got $xs") } } } + "A lambda with arrow syntax" should { + + val cpg = code(""" + |arrow_lambda = ->(y) { y } + |""".stripMargin) + + "create a lambda method with a `y` parameter" in { + inside(cpg.method.isLambda.headOption) { + case Some(lambda) => + lambda.code shouldBe "{ y }" + lambda.parameter.name.l shouldBe List("self", "y") + case xs => fail(s"Expected a lambda method") + } + } + + "create a method ref assigned to `arrow_lambda`" in { + inside(cpg.method.isModule.assignment.code("arrow_lambda.*").headOption) { + case Some(lambdaAssign) => + lambdaAssign.target.asInstanceOf[Identifier].name shouldBe "arrow_lambda" + lambdaAssign.source.asInstanceOf[TypeRef].typeFullName shouldBe s"Test0.rb:$Main.0&Proc" + case xs => fail(s"Expected an assignment to a lambda") + } + } + + } + + "A lambda with lambda keyword syntax" should { + + val cpg = code(""" + |a_lambda = lambda { |y| y } + |""".stripMargin) + + "create a lambda method with a `y` parameter" in { + inside(cpg.method.isLambda.headOption) { + case Some(lambda) => + lambda.code shouldBe "{ |y| y }" + lambda.parameter.name.l shouldBe List("self", "y") + case xs => fail(s"Expected a lambda method") + } + } + + "create a method ref assigned to `arrow_lambda`" in { + inside(cpg.method.isModule.assignment.code("a_lambda.*").headOption) { + case Some(lambdaAssign) => + lambdaAssign.target.asInstanceOf[Identifier].name shouldBe "a_lambda" + lambdaAssign.source.asInstanceOf[TypeRef].typeFullName shouldBe s"Test0.rb:$Main.0&Proc" + case xs => fail(s"Expected an assignment to a lambda") + } + } + + } + } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/FieldAccessTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/FieldAccessTests.scala index 8f6608977daa..a5c872383a26 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/FieldAccessTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/FieldAccessTests.scala @@ -4,6 +4,7 @@ import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.{Call, FieldIdentifier, Identifier, TypeRef} import io.shiftleft.codepropertygraph.generated.{DispatchTypes, Operators} import io.shiftleft.semanticcpg.language.* +import io.joern.rubysrc2cpg.passes.Defines.Main class FieldAccessTests extends RubyCode2CpgFixture { @@ -105,7 +106,7 @@ class FieldAccessTests extends RubyCode2CpgFixture { bazAssign.code shouldBe "self.Baz" val bazTypeRef = baz.argument(2).asInstanceOf[TypeRef] - bazTypeRef.typeFullName shouldBe "Test0.rb:::program.Baz" + bazTypeRef.typeFullName shouldBe s"Test0.rb:$Main.Baz" bazTypeRef.code shouldBe "module Baz (...)" val fooAssign = foo.argument(1).asInstanceOf[Call] @@ -113,7 +114,7 @@ class FieldAccessTests extends RubyCode2CpgFixture { fooAssign.code shouldBe "self.Foo" val fooTypeRef = foo.argument(2).asInstanceOf[TypeRef] - fooTypeRef.typeFullName shouldBe "Test0.rb:::program.Foo" + fooTypeRef.typeFullName shouldBe s"Test0.rb:$Main.Foo" fooTypeRef.code shouldBe "class Foo (...)" case _ => fail(s"Expected two type ref assignments on the module level") } @@ -226,7 +227,7 @@ class FieldAccessTests extends RubyCode2CpgFixture { base.name shouldBe Operators.fieldAccess base.code shouldBe "A::B" - base.argument(1).asInstanceOf[TypeRef].typeFullName shouldBe "Test0.rb:::program.A" + base.argument(1).asInstanceOf[TypeRef].typeFullName shouldBe s"Test0.rb:$Main.A" base.argument(2).asInstanceOf[FieldIdentifier].canonicalName shouldBe "B" val receiver = call.receiver.isCall.head @@ -237,7 +238,7 @@ class FieldAccessTests extends RubyCode2CpgFixture { selfArg1.name shouldBe Operators.fieldAccess selfArg1.code shouldBe "A::B" - selfArg1.argument(1).asInstanceOf[TypeRef].typeFullName shouldBe "Test0.rb:::program.A" + selfArg1.argument(1).asInstanceOf[TypeRef].typeFullName shouldBe s"Test0.rb:$Main.A" selfArg1.argument(2).asInstanceOf[FieldIdentifier].canonicalName shouldBe "B" val selfArg2 = receiver.argument(2).asInstanceOf[FieldIdentifier] diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/HashTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/HashTests.scala index 2cd5e4caa398..051c2b574cec 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/HashTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/HashTests.scala @@ -209,4 +209,62 @@ class HashTests extends RubyCode2CpgFixture { } } + "Splatting argument in hash" in { + val cpg = code(""" + |a = {**x, **y} + |""".stripMargin) + + inside(cpg.call.name(RubyOperators.hashInitializer).l) { + case hashCall :: Nil => + val List(xSplatCall, ySplatCall) = hashCall.inCall.astSiblings.isCall.l + xSplatCall.code shouldBe "**x" + xSplatCall.methodFullName shouldBe RubyOperators.splat + + ySplatCall.code shouldBe "**y" + ySplatCall.methodFullName shouldBe RubyOperators.splat + case xs => fail(s"Expected call to hashInitializer, [${xs.code.mkString(",")}]") + } + } + + "Function call in hash" in { + val cpg = code(""" + |a = {**foo(bar)} + |""".stripMargin) + + inside(cpg.call.name(RubyOperators.hashInitializer).l) { + case hashInitializer :: Nil => + val List(splatCall) = hashInitializer.inCall.astSiblings.isCall.l + splatCall.code shouldBe "**foo(bar)" + splatCall.name shouldBe RubyOperators.splat + + val List(splatCallArg: Call) = splatCall.argument.l: @unchecked + + splatCallArg.code shouldBe "foo(bar)" + + val List(selfCallArg, barCallArg) = splatCallArg.argument.l + barCallArg.code shouldBe "self.bar" + case xs => fail(s"Expected one call for init, got [${xs.code.mkString(",")}]") + } + } + + "Function call without parentheses" in { + val cpg = code(""" + |a = {**(foo 13)} + |""".stripMargin) + + inside(cpg.call.name(RubyOperators.hashInitializer).l) { + case hashInitializer :: Nil => + val List(splatCall) = hashInitializer.inCall.astSiblings.isCall.l + splatCall.code shouldBe "**(foo 13)" + splatCall.name shouldBe RubyOperators.splat + + val List(splatCallArg: Call) = splatCall.argument.l: @unchecked + + splatCallArg.code shouldBe "foo 13" + + val List(selfCallArg, literalCallArg) = splatCallArg.argument.l + literalCallArg.code shouldBe "13" + case xs => fail(s"Expected one call for init, got [${xs.code.mkString(",")}]") + } + } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ImportTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ImportTests.scala index 5551d82ec6b1..c509a36f056c 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ImportTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ImportTests.scala @@ -1,10 +1,8 @@ package io.joern.rubysrc2cpg.querying +import io.joern.rubysrc2cpg.passes.Defines.Main import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.shiftleft.semanticcpg.language.* -import io.joern.rubysrc2cpg.RubySrc2Cpg -import io.joern.rubysrc2cpg.Config -import scala.util.{Success, Failure} import org.scalatest.Inspectors class ImportTests extends RubyCode2CpgFixture(withPostProcessing = true) with Inspectors { @@ -59,8 +57,8 @@ class ImportTests extends RubyCode2CpgFixture(withPostProcessing = true) with In ) val List(newCall) = - cpg.method.name(":program").filename("t1.rb").ast.isCall.methodFullName(".*:initialize").methodFullName.l - newCall should startWith(s"${path}.rb:") + cpg.method.isModule.filename("t1.rb").ast.isCall.methodFullName(".*\\.initialize").methodFullName.l + newCall should startWith(s"$path.rb:") } } @@ -86,7 +84,7 @@ class ImportTests extends RubyCode2CpgFixture(withPostProcessing = true) with In |""".stripMargin) val List(methodName) = - cpg.method.name("bar").ast.isCall.methodFullName(".*::program\\.(A|B):foo").methodFullName.l + cpg.method.name("bar").ast.isCall.methodFullName(s".*\\.$Main\\.(A|B).foo").methodFullName.l methodName should endWith(s"${moduleName}:foo") } } @@ -171,9 +169,9 @@ class ImportTests extends RubyCode2CpgFixture(withPostProcessing = true) with In "resolve calls to builtin functions" in { inside(cpg.call.methodFullName("(pp|csv).*").l) { case csvParseCall :: csvTableInitCall :: ppCall :: Nil => - csvParseCall.methodFullName shouldBe "csv.CSV:parse" - ppCall.methodFullName shouldBe "pp.PP:pp" - csvTableInitCall.methodFullName shouldBe "csv.CSV.Table:initialize" + csvParseCall.methodFullName shouldBe "csv.CSV.parse" + ppCall.methodFullName shouldBe "pp.PP.pp" + csvTableInitCall.methodFullName shouldBe "csv.CSV.Table.initialize" case xs => fail(s"Expected three calls, got [${xs.code.mkString(",")}] instead") } } @@ -206,8 +204,8 @@ class ImportTests extends RubyCode2CpgFixture(withPostProcessing = true) with In "allow the resolution for all modules in that directory" in { cpg.call("foo").methodFullName.l shouldBe List( - "dir/module1.rb:::program.Module1:foo", - "dir/module2.rb:::program.Module2:foo" + s"dir/module1.rb:$Main.Module1.foo", + s"dir/module2.rb:$Main.Module2.foo" ) } } @@ -245,9 +243,9 @@ class ImportTests extends RubyCode2CpgFixture(withPostProcessing = true) with In |require 'file2' |require 'file3' | - |File1::foo # lib/file1.rb::program:foo - |File2::foo # lib/file2.rb::program:foo - |File3::foo # src/file3.rb::program:foo + |File1::foo # lib/file1.rb.
.foo + |File2::foo # lib/file2.rb.
.foo + |File3::foo # src/file3.rb.
.foo |""".stripMargin, "main.rb" ).moreCode( @@ -279,9 +277,9 @@ class ImportTests extends RubyCode2CpgFixture(withPostProcessing = true) with In "resolve the calls directly" in { inside(cpg.call.name("foo.*").l) { case foo1 :: foo2 :: foo3 :: Nil => - foo1.methodFullName shouldBe "lib/file1.rb:::program.File1:foo" - foo2.methodFullName shouldBe "lib/file2.rb:::program.File2:foo" - foo3.methodFullName shouldBe "src/file3.rb:::program.File3:foo" + foo1.methodFullName shouldBe s"lib/file1.rb:$Main.File1.foo" + foo2.methodFullName shouldBe s"lib/file2.rb:$Main.File2.foo" + foo3.methodFullName shouldBe s"src/file3.rb:$Main.File3.foo" case xs => fail(s"Expected 3 calls, got [${xs.code.mkString(",")}] instead") } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/MethodReturnTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/MethodReturnTests.scala index d2cc7fd8775a..b63fced8d728 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/MethodReturnTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/MethodReturnTests.scala @@ -1,10 +1,10 @@ package io.joern.rubysrc2cpg.querying -import io.joern.rubysrc2cpg.passes.Defines.RubyOperators +import io.joern.rubysrc2cpg.passes.Defines.{Main, RubyOperators} +import io.joern.rubysrc2cpg.passes.GlobalTypes.kernelPrefix import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.shiftleft.codepropertygraph.generated.Operators -import io.joern.rubysrc2cpg.passes.GlobalTypes.kernelPrefix -import io.shiftleft.codepropertygraph.generated.nodes.{Call, Literal, Method, MethodRef, Return} +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* class MethodReturnTests extends RubyCode2CpgFixture(withDataFlow = true) { @@ -72,7 +72,7 @@ class MethodReturnTests extends RubyCode2CpgFixture(withDataFlow = true) { r.lineNumber shouldBe Some(3) val List(c: Call) = r.astChildren.isCall.l - c.methodFullName shouldBe s"$kernelPrefix:puts" + c.methodFullName shouldBe s"$kernelPrefix.puts" c.lineNumber shouldBe Some(3) c.code shouldBe "puts x" } @@ -339,7 +339,7 @@ class MethodReturnTests extends RubyCode2CpgFixture(withDataFlow = true) { } } - "implicit RETURN node for ASSOCIATION" in { + "implicit RETURN node for super call" in { val cpg = code(""" |def j | super(only: ["a"]) @@ -350,11 +350,11 @@ class MethodReturnTests extends RubyCode2CpgFixture(withDataFlow = true) { case jMethod :: Nil => inside(jMethod.methodReturn.toReturn.l) { case retAssoc :: Nil => - retAssoc.code shouldBe "only: [\"a\"]" + retAssoc.code shouldBe "super(only: [\"a\"])" val List(call: Call) = retAssoc.astChildren.l: @unchecked - call.name shouldBe RubyOperators.association - call.code shouldBe "only: [\"a\"]" + call.name shouldBe "super" + call.code shouldBe "super(only: [\"a\"])" case xs => fail(s"Expected exactly one return nodes, instead got [${xs.code.mkString(",")}]") } case _ => fail("Only one method expected") @@ -380,7 +380,7 @@ class MethodReturnTests extends RubyCode2CpgFixture(withDataFlow = true) { inside(bar.astChildren.collectAll[Method].l) { case closureMethod :: Nil => closureMethod.name shouldBe "0" - closureMethod.fullName shouldBe "Test0.rb:::program:bar:0" + closureMethod.fullName shouldBe s"Test0.rb:$Main.bar.0" case xs => fail(s"Expected closure method, but found ${xs.code.mkString(", ")} instead") } @@ -392,8 +392,8 @@ class MethodReturnTests extends RubyCode2CpgFixture(withDataFlow = true) { returnCall.name shouldBe "foo" - val List(_, arg: MethodRef) = returnCall.argument.l: @unchecked - arg.methodFullName shouldBe "Test0.rb:::program:bar:0" + val List(_, arg: TypeRef) = returnCall.argument.l: @unchecked + arg.typeFullName shouldBe s"Test0.rb:$Main.bar.0&Proc" case xs => fail(s"Expected one call for return, but found ${xs.code.mkString(", ")} instead") } @@ -439,4 +439,21 @@ class MethodReturnTests extends RubyCode2CpgFixture(withDataFlow = true) { } } + "a return in an expression position without arguments should generate a return node with no children" in { + val cpg = code(""" + |def foo + | return unless baz() + | bar() + |end + |""".stripMargin) + + inside(cpg.method.nameExact("foo").ast.isReturn.headOption) { + case Some(ret) => + ret.code shouldBe "return" + ret.astChildren.size shouldBe 0 + ret.astParent.astParent.code shouldBe "return unless baz()" + case None => fail(s"Expected at least one return node") + } + } + } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/MethodTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/MethodTests.scala index 4e6b8bc2daa7..50dfd667dcc5 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/MethodTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/MethodTests.scala @@ -1,6 +1,7 @@ package io.joern.rubysrc2cpg.querying import io.joern.rubysrc2cpg.passes.Defines as RDefines +import io.joern.rubysrc2cpg.passes.Defines.Main import io.joern.rubysrc2cpg.passes.GlobalTypes.kernelPrefix import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.shiftleft.codepropertygraph.generated.nodes.* @@ -17,7 +18,7 @@ class MethodTests extends RubyCode2CpgFixture { "be represented by a METHOD node" in { val List(f) = cpg.method.name("f").l - f.fullName shouldBe "Test0.rb:::program:f" + f.fullName shouldBe s"Test0.rb:$Main.f" f.isExternal shouldBe false f.lineNumber shouldBe Some(2) f.numberOfLines shouldBe 1 @@ -30,17 +31,17 @@ class MethodTests extends RubyCode2CpgFixture { "have a corresponding bound type" in { val List(fType) = cpg.typeDecl("f").l - fType.fullName shouldBe "Test0.rb:::program:f" + fType.fullName shouldBe s"Test0.rb:$Main.f" fType.code shouldBe "def f(x) = 1" - fType.astParentFullName shouldBe "Test0.rb:::program" + fType.astParentFullName shouldBe s"Test0.rb:$Main" fType.astParentType shouldBe NodeTypes.METHOD val List(fMethod) = fType.iterator.boundMethod.l - fType.fullName shouldBe "Test0.rb:::program:f" + fType.fullName shouldBe s"Test0.rb:$Main.f" } "create a 'fake' method for the file" in { - val List(m) = cpg.method.nameExact(RDefines.Program).l - m.fullName shouldBe "Test0.rb:::program" + val List(m) = cpg.method.nameExact(RDefines.Main).l + m.fullName shouldBe s"Test0.rb:$Main" m.isModule.nonEmpty shouldBe true } } @@ -54,7 +55,7 @@ class MethodTests extends RubyCode2CpgFixture { val List(f) = cpg.method.name("f").l - f.fullName shouldBe "Test0.rb:::program:f" + f.fullName shouldBe s"Test0.rb:$Main.f" f.isExternal shouldBe false f.lineNumber shouldBe Some(2) f.numberOfLines shouldBe 3 @@ -68,7 +69,7 @@ class MethodTests extends RubyCode2CpgFixture { val List(f) = cpg.method.name("f").l - f.fullName shouldBe "Test0.rb:::program:f" + f.fullName shouldBe s"Test0.rb:$Main.f" f.isExternal shouldBe false f.lineNumber shouldBe Some(2) f.numberOfLines shouldBe 1 @@ -86,7 +87,7 @@ class MethodTests extends RubyCode2CpgFixture { val List(f) = cpg.method.name("f").l - f.fullName shouldBe "Test0.rb:::program:f" + f.fullName shouldBe s"Test0.rb:$Main.f" f.isExternal shouldBe false f.lineNumber shouldBe Some(2) f.numberOfLines shouldBe 1 @@ -193,7 +194,7 @@ class MethodTests extends RubyCode2CpgFixture { inside(funcF.parameter.l) { case thisParam :: xParam :: Nil => thisParam.code shouldBe RDefines.Self - thisParam.typeFullName shouldBe "Test0.rb:::program.C" + thisParam.typeFullName shouldBe s"Test0.rb:$Main.C" thisParam.index shouldBe 0 thisParam.isVariadic shouldBe false @@ -227,7 +228,7 @@ class MethodTests extends RubyCode2CpgFixture { inside(funcF.parameter.l) { case thisParam :: xParam :: Nil => thisParam.code shouldBe RDefines.Self - thisParam.typeFullName shouldBe "Test0.rb:::program.C" + thisParam.typeFullName shouldBe s"Test0.rb:$Main.C" thisParam.index shouldBe 0 thisParam.isVariadic shouldBe false @@ -351,7 +352,7 @@ class MethodTests extends RubyCode2CpgFixture { case thisParam :: xParam :: Nil => thisParam.name shouldBe RDefines.Self thisParam.code shouldBe "F" - thisParam.typeFullName shouldBe "Test0.rb:::program.F" + thisParam.typeFullName shouldBe s"Test0.rb:$Main.F" xParam.name shouldBe "x" case xs => fail(s"Expected two parameters, got ${xs.name.mkString(", ")}") @@ -361,7 +362,7 @@ class MethodTests extends RubyCode2CpgFixture { case thisParam :: xParam :: Nil => thisParam.name shouldBe RDefines.Self thisParam.code shouldBe "F" - thisParam.typeFullName shouldBe "Test0.rb:::program.F" + thisParam.typeFullName shouldBe s"Test0.rb:$Main.F" xParam.name shouldBe "x" xParam.code shouldBe "x" @@ -374,17 +375,17 @@ class MethodTests extends RubyCode2CpgFixture { // TODO: we cannot bind baz as this is a dynamic assignment to `F` which is trickier to determine // Also, double check bindings "have bindings to the singleton module TYPE_DECL" ignore { - cpg.typeDecl.name("F").methodBinding.methodFullName.l shouldBe List("Test0.rb:::program.F:bar") + cpg.typeDecl.name("F").methodBinding.methodFullName.l shouldBe List(s"Test0.rb:$Main.F.bar") } - "baz should not exist in the :program block" in { - inside(cpg.method.name(":program").l) { + "baz should not exist in the
block" in { + inside(cpg.method.isModule.l) { case prog :: Nil => inside(prog.block.astChildren.isMethod.name("baz").l) { case Nil => // passing case case _ => fail("Baz should not exist under program method block") } - case _ => fail("Expected one Method for :program") + case _ => fail("Expected one Method for ") } } } @@ -399,7 +400,7 @@ class MethodTests extends RubyCode2CpgFixture { "be represented by a METHOD node" in { inside(cpg.method.name("exists\\?").l) { case existsMethod :: Nil => - existsMethod.fullName shouldBe "Test0.rb:::program:exists?" + existsMethod.fullName shouldBe s"Test0.rb:$Main.exists?" existsMethod.isExternal shouldBe false inside(existsMethod.methodReturn.cfgIn.l) { @@ -601,7 +602,7 @@ class MethodTests extends RubyCode2CpgFixture { ) "be directly under :program" in { - inside(cpg.method.name(RDefines.Program).filename("t1.rb").assignment.l) { + inside(cpg.method.name(RDefines.Main).filename("t1.rb").assignment.l) { case moduleAssignment :: classAssignment :: methodAssignment :: Nil => moduleAssignment.code shouldBe "self.A = module A (...)" classAssignment.code shouldBe "self.B = class B (...)" @@ -611,7 +612,7 @@ class MethodTests extends RubyCode2CpgFixture { case (lhs: Call) :: (rhs: TypeRef) :: Nil => lhs.code shouldBe "self.A" lhs.name shouldBe Operators.fieldAccess - rhs.typeFullName shouldBe "t1.rb:::program.A" + rhs.typeFullName shouldBe s"t1.rb:$Main.A" case xs => fail(s"Expected lhs and rhs, instead got ${xs.code.mkString(",")}") } @@ -619,7 +620,7 @@ class MethodTests extends RubyCode2CpgFixture { case (lhs: Call) :: (rhs: TypeRef) :: Nil => lhs.code shouldBe "self.B" lhs.name shouldBe Operators.fieldAccess - rhs.typeFullName shouldBe "t1.rb:::program.B" + rhs.typeFullName shouldBe s"t1.rb:$Main.B" case xs => fail(s"Expected lhs and rhs, instead got ${xs.code.mkString(",")}") } @@ -627,8 +628,8 @@ class MethodTests extends RubyCode2CpgFixture { case (lhs: Call) :: (rhs: MethodRef) :: Nil => lhs.code shouldBe "self.c" lhs.name shouldBe Operators.fieldAccess - rhs.methodFullName shouldBe "t1.rb:::program:c" - rhs.typeFullName shouldBe "t1.rb:::program:c" + rhs.methodFullName shouldBe s"t1.rb:$Main.c" + rhs.typeFullName shouldBe s"t1.rb:$Main.c" case xs => fail(s"Expected lhs and rhs, instead got ${xs.code.mkString(",")}") } @@ -637,7 +638,7 @@ class MethodTests extends RubyCode2CpgFixture { } "not be present in other files" in { - inside(cpg.method.name(RDefines.Program).filename("t2.rb").assignment.l) { + inside(cpg.method.name(RDefines.Main).filename("t2.rb").assignment.l) { case classAssignment :: methodAssignment :: Nil => classAssignment.code shouldBe "self.D = class D (...)" methodAssignment.code shouldBe "self.e = def e (...)" @@ -646,7 +647,7 @@ class MethodTests extends RubyCode2CpgFixture { case (lhs: Call) :: (rhs: TypeRef) :: Nil => lhs.code shouldBe "self.D" lhs.name shouldBe Operators.fieldAccess - rhs.typeFullName shouldBe "t2.rb:::program.D" + rhs.typeFullName shouldBe s"t2.rb:$Main.D" case xs => fail(s"Expected lhs and rhs, instead got ${xs.code.mkString(",")}") } @@ -654,8 +655,8 @@ class MethodTests extends RubyCode2CpgFixture { case (lhs: Call) :: (rhs: MethodRef) :: Nil => lhs.code shouldBe "self.e" lhs.name shouldBe Operators.fieldAccess - rhs.methodFullName shouldBe "t2.rb:::program:e" - rhs.typeFullName shouldBe "t2.rb:::program:e" + rhs.methodFullName shouldBe s"t2.rb:$Main.e" + rhs.typeFullName shouldBe s"t2.rb:$Main.e" case xs => fail(s"Expected lhs and rhs, instead got ${xs.code.mkString(",")}") } @@ -664,7 +665,7 @@ class MethodTests extends RubyCode2CpgFixture { } "be placed in order of definition" in { - inside(cpg.method.name(RDefines.Program).filename("t1.rb").block.astChildren.l) { + inside(cpg.method.name(RDefines.Main).filename("t1.rb").block.astChildren.l) { case (a1: Call) :: (a2: Call) :: (a3: Call) :: (a4: Call) :: (a5: Call) :: Nil => a1.code shouldBe "self.A = module A (...)" a2.code shouldBe "self::A::" @@ -675,4 +676,76 @@ class MethodTests extends RubyCode2CpgFixture { } } } + + "Splatting and normal argument" in { + val cpg = code(""" + |def foo(*x, y) + |end + |""".stripMargin) + + inside(cpg.method.name("foo").l) { + case fooMethod :: Nil => + inside(fooMethod.method.parameter.l) { + case selfArg :: splatArg :: normalArg :: Nil => + splatArg.code shouldBe "*x" + splatArg.index shouldBe 1 + + normalArg.code shouldBe "y" + normalArg.index shouldBe 2 + case xs => fail(s"Expected two parameters, got [${xs.code.mkString(",")}]") + } + case xs => fail(s"Expected one method, got [${xs.code.mkString(",")}]") + } + } + + "Splatting argument in call" in { + val cpg = code(""" + |def foo(a, b) + |end + | + |x = 1,2 + |foo(*x, y) + |""".stripMargin) + + inside(cpg.call.name("foo").l) { + case fooCall :: Nil => + inside(fooCall.argument.l) { + case selfArg :: xArg :: yArg :: Nil => + xArg.code shouldBe "*x" + yArg.code shouldBe "self.y" + case xs => fail(s"Expected two args, got [${xs.code.mkString(",")}]") + } + case xs => fail(s"Expected one call to foo, got [${xs.code.mkString(",")}]") + } + } + + "a nested method declaration inside of a do-block should connect the member node to the bound type decl" in { + val cpg = code(""" + |foo do + | def bar + | end + |end + |""".stripMargin) + + val parentType = cpg.member("bar").typeDecl.head + parentType.isLambda should not be empty + parentType.methodBinding.methodFullName.head should endWith("0") + } + + "a method that is redefined should have a counter suffixed to ensure uniqueness" in { + val cpg = code(""" + |def foo;end + |def bar;end + |def foo;end + |def foo;end + |""".stripMargin) + + cpg.method.name("(foo|bar).*").name.l shouldBe List("foo", "bar", "foo", "foo") + cpg.method.name("(foo|bar).*").fullName.l shouldBe List( + s"Test0.rb:$Main.foo", + s"Test0.rb:$Main.bar", + s"Test0.rb:$Main.foo0", + s"Test0.rb:$Main.foo1" + ) + } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ModuleTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ModuleTests.scala index 818e191e8b8d..9e3801817b58 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ModuleTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ModuleTests.scala @@ -1,6 +1,7 @@ package io.joern.rubysrc2cpg.querying import io.joern.rubysrc2cpg.passes.Defines +import io.joern.rubysrc2cpg.passes.Defines.Main import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture import io.shiftleft.semanticcpg.language.* @@ -14,7 +15,7 @@ class ModuleTests extends RubyCode2CpgFixture { val List(m) = cpg.typeDecl.name("M").l - m.fullName shouldBe "Test0.rb:::program.M" + m.fullName shouldBe s"Test0.rb:$Main.M" m.lineNumber shouldBe Some(2) m.baseType.l shouldBe List() m.member.name.l shouldBe List(Defines.TypeDeclBody) @@ -31,7 +32,7 @@ class ModuleTests extends RubyCode2CpgFixture { val List(m) = cpg.typeDecl.name("M1").l - m.fullName shouldBe "Test0.rb:::program.M1" + m.fullName shouldBe s"Test0.rb:$Main.M1" m.lineNumber shouldBe Some(2) m.baseType.l shouldBe List() m.member.name.l shouldBe List(Defines.TypeDeclBody) diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ProcParameterAndYieldTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ProcParameterAndYieldTests.scala index 67abaca49a42..605880a70a29 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ProcParameterAndYieldTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/ProcParameterAndYieldTests.scala @@ -1,84 +1,96 @@ package io.joern.rubysrc2cpg.querying import io.joern.rubysrc2cpg.testfixtures.RubyCode2CpgFixture -import io.shiftleft.codepropertygraph.generated.Operators -import org.scalatest.Inspectors -import io.shiftleft.semanticcpg.language.* import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* +import org.scalatest.Inspectors class ProcParameterAndYieldTests extends RubyCode2CpgFixture with Inspectors { - "Methods" should { - "with a yield expression" should { - "with a proc parameter" should { - val cpg1 = code("def foo(&b) yield end") - val cpg2 = code("def self.foo(&b) yield end") - val cpgs = List(cpg1, cpg2) - - "have a single block argument" in { - forAll(cpgs)(_.method("foo").parameter.code("&.*").name.l shouldBe List("b")) - } - - "represent the yield as a conditional with a call and return node as children" in { - forAll(cpgs) { cpg => - inside(cpg.method("foo").call.nameExact(Operators.conditional).code("yield").astChildren.l) { - case List(cond: Expression, call: Call, ret: Return) => { - cond.code shouldBe "" - call.name shouldBe "b" - call.code shouldBe "b" - ret.code shouldBe "yield" - } - } - } - } - } - - "without a proc parameter" should { - val cpg = code(""" - |def foo() yield end - |def self.bar() yield end - |""".stripMargin) - - "have a call to a block parameter" in { - cpg.method("foo").call.code("yield").astChildren.isCall.code("").name.l shouldBe List( - "" - ) - cpg.method("bar").call.code("yield").astChildren.isCall.code("").name.l shouldBe List( - "" - ) - } - - "add a block argument" in { - val List(param1) = cpg.method("foo").parameter.code("&.*").l - param1.name shouldBe "" - param1.index shouldBe 1 - - val List(param2) = cpg.method("bar").parameter.code("&.*").l - param2.name shouldBe "" - param2.index shouldBe 1 - } - } - - "with yield arguments" should { - val cpg = code("def foo(x) yield(x) end") - "replace the yield with a call to the block parameter with arguments" in { - val List(call) = cpg.call.codeExact("yield(x)").astChildren.isCall.codeExact("").l - call.name shouldBe "" - call.argument.code.l shouldBe List("self", "x") - } - - } + + "a method with an explicit proc parameter should create an invocation of it's `call` member" in { + val cpg = code("def foo(&b) yield end") + + val foo = cpg.method("foo").head + + val bParam = foo.parameter.last + bParam.name shouldBe "b" + bParam.code shouldBe "&b" + bParam.index shouldBe 1 + + inside(foo.call.nameExact("call").argument.l) { case selfBase :: Nil => + selfBase.code shouldBe "b" } + } + + "a singleton method with an explicit proc parameter should create an invocation of it's `call` member" in { + val cpg = code("def self.foo(&b) yield end") + + val foo = cpg.method("foo").head - "that don't have a yield nor a proc parameter" should { - val cpg1 = code("def foo() end") - val cpg2 = code("def self.foo() end") - val cpgs = List(cpg1, cpg2) + val bParam = foo.parameter.last + bParam.name shouldBe "b" + bParam.code shouldBe "&b" + bParam.index shouldBe 1 - "not add a block argument" in { - forAll(cpgs)(_.method("foo").parameter.code("&.*").name.l should be(empty)) - } + inside(foo.call.nameExact("call").argument.l) { case selfBase :: Nil => + selfBase.code shouldBe "b" } + } + + "a method with an implicit proc parameter should create an invocation using a unique parameter name" in { + val cpg = code(""" + |def foo() yield end + |def self.bar() yield end + |""".stripMargin) + + val foo = cpg.method("foo").head + val bar = cpg.method("bar").head + + val fooParam = foo.parameter.last + fooParam.name shouldBe "" + fooParam.code shouldBe "&" + fooParam.index shouldBe 1 + + val barParam = bar.parameter.last + barParam.name shouldBe "" + barParam.code shouldBe "&" + barParam.index shouldBe 1 + + foo.call.nameExact("call").argument.isIdentifier.name.l shouldBe List("") + bar.call.nameExact("call").argument.isIdentifier.name.l shouldBe List("") + } + + "a method with an implicit proc parameter should create an invocation of it's `call` member with given arguments" in { + val cpg = code("def foo(x) yield(x) end") + + val foo = cpg.method("foo").head + + val List(xParam, procParam) = foo.parameter.l.takeRight(2) + + xParam.name shouldBe "x" + xParam.index shouldBe 1 + + procParam.name shouldBe "" + procParam.code shouldBe "&" + procParam.index shouldBe 2 + + inside(foo.call.nameExact("call").argument.l) { case selfBase :: x :: Nil => + selfBase.code shouldBe "" + selfBase.argumentIndex shouldBe 0 + x.code shouldBe "x" + x.argumentIndex shouldBe 1 + } + } + + "a method without a yield nor proc parameter should not have either modelled" in { + val cpg1 = code("def foo() end") + val cpg2 = code("def self.foo() end") + val cpgs = List(cpg1, cpg2) + forAll(cpgs)(cpg => { + cpg.method("foo").parameter.code("&.*").name.l should be(empty) + cpg.method("foo").call.nameExact("call").name.l should be(empty) + }) } } diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/RegexTests.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/RegexTests.scala index 674a39f6f40d..d5d892cb1e8d 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/RegexTests.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/querying/RegexTests.scala @@ -12,7 +12,7 @@ class RegexTests extends RubyCode2CpgFixture(withPostProcessing = true) { |0 |""".stripMargin) cpg.call(RubyOperators.regexpMatch).methodFullName.l shouldBe List( - s"$kernelPrefix.String:${RubyOperators.regexpMatch}" + s"$kernelPrefix.String.${RubyOperators.regexpMatch}" ) } "`/x/ =~ 'y'` is a member call `/x/.=~ 'y'" in { @@ -20,7 +20,7 @@ class RegexTests extends RubyCode2CpgFixture(withPostProcessing = true) { |0 |""".stripMargin) cpg.call(RubyOperators.regexpMatch).methodFullName.l shouldBe List( - s"$kernelPrefix.Regexp:${RubyOperators.regexpMatch}" + s"$kernelPrefix.Regexp.${RubyOperators.regexpMatch}" ) } @@ -33,7 +33,7 @@ class RegexTests extends RubyCode2CpgFixture(withPostProcessing = true) { inside(cpg.controlStructure.isIf.l) { case regexIf :: Nil => - regexIf.condition.isCall.methodFullName.l shouldBe List(s"$kernelPrefix.Regexp:${RubyOperators.regexpMatch}") + regexIf.condition.isCall.methodFullName.l shouldBe List(s"$kernelPrefix.Regexp.${RubyOperators.regexpMatch}") inside(regexIf.condition.isCall.argument.l) { case (lhs: Literal) :: (rhs: Literal) :: Nil => diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/testfixtures/RubyCode2CpgFixture.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/testfixtures/RubyCode2CpgFixture.scala index c8ec8791bd1d..af052e2a4367 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/testfixtures/RubyCode2CpgFixture.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/testfixtures/RubyCode2CpgFixture.scala @@ -1,13 +1,12 @@ package io.joern.rubysrc2cpg.testfixtures import io.joern.dataflowengineoss.language.Path -import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.FlowSemantic import io.joern.dataflowengineoss.testfixtures.{SemanticCpgTestFixture, SemanticTestCpg} import io.joern.rubysrc2cpg.deprecated.utils.PackageTable import io.joern.rubysrc2cpg.{Config, RubySrc2Cpg} import io.joern.x2cpg.testfixtures.* -import io.joern.x2cpg.{ValidationMode, X2Cpg} +import io.joern.x2cpg.ValidationMode import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.semanticcpg.language.{ICallResolver, NoResolve} import org.scalatest.Tag @@ -52,7 +51,6 @@ class DefaultTestCpgWithRuby( } RubySrc2Cpg.postProcessingPasses(this, config).foreach(_.createAndApply()) } - } class RubyCode2CpgFixture( diff --git a/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/testfixtures/RubyParserFixture.scala b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/testfixtures/RubyParserFixture.scala new file mode 100644 index 000000000000..c6c5ef2ec97d --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/test/scala/io/joern/rubysrc2cpg/testfixtures/RubyParserFixture.scala @@ -0,0 +1,96 @@ +package io.joern.rubysrc2cpg.testfixtures + +import io.joern.rubysrc2cpg.Config +import io.joern.rubysrc2cpg.parser.{ResourceManagedParser, RubyNodeCreator, RubyParser} +import io.joern.x2cpg.SourceFiles +import io.joern.x2cpg.utils.{ConcurrentTaskUtil, TestCodeWriter} +import org.scalatest.matchers.should.Matchers +import org.scalatest.wordspec.AnyWordSpecLike +import org.slf4j.LoggerFactory +import better.files.File as BFile + +import java.nio.charset.StandardCharsets +import java.nio.file.{Files, Path} +import scala.util.{Failure, Success, Using} + +class RubyParserFixture + extends RubyFrontend(useDeprecatedFrontend = false, withDownloadDependencies = false) + with TestCodeWriter + with AnyWordSpecLike + with Matchers { + private val RubySourceFileExtensions: Set[String] = Set(".rb") + private val logger = LoggerFactory.getLogger(this.getClass) + private var fileNameCounter = 0 + + def generateParserTasks( + resourceManagedParser: ResourceManagedParser, + config: Config, + inputPath: String + ): Iterator[() => RubyParser.ProgramContext] = { + SourceFiles + .determine( + inputPath, + RubySourceFileExtensions, + ignoredDefaultRegex = Option(config.defaultIgnoredFilesRegex), + ignoredFilesRegex = Option(config.ignoredFilesRegex), + ignoredFilesPath = Option(config.ignoredFiles) + ) + .map(fileName => + () => + resourceManagedParser.parse(BFile(config.inputPath), fileName) match { + case Failure(exception) => throw exception + case Success(ctx) => ctx + } + ) + .iterator + } + + def writeCode(code: String, extension: String): Path = { + val tmpDir = BFile.newTemporaryDirectory("x2cpgTestTmpDir").deleteOnExit() + val tmpPath = tmpDir.path + val codeFiles = { + val fileName = { + val filename = s"Test$fileNameCounter$extension" + fileNameCounter += 1 + filename + } + + val filePath = Path.of(fileName) + if (filePath.getParent != null) { + Files.createDirectories(tmpPath.resolve(filePath.getParent)) + } + val codeAsBytes = code.getBytes(StandardCharsets.UTF_8) + val codeFile = tmpPath.resolve(filePath) + Files.write(codeFile, codeAsBytes) + codeFilePreProcessing(codeFile) + codeFile + } + + tmpPath + } + + def parseCode(code: String): List[RubyParser.ProgramContext] = { + val tempPath = writeCode(code, ".rb") + + Using.resource(new ResourceManagedParser(config.antlrCacheMemLimit)) { parser => + ConcurrentTaskUtil.runUsingThreadPool(generateParserTasks(parser, config, tempPath.toString)).flatMap { + case Failure(exception) => logger.warn(s"Could not parse file, skipping - ", exception); None + case Success(ctx) => Option(ctx) + } + } + } + + def test(code: String, expected: String = null): Unit = { + val ast = parseCode(code).headOption match { + case Some(head) => Option(new RubyNodeCreator().visit(head)) + case None => None + } + + ast match { + case Some(ast) => + val compareTo = if (expected != null) expected else code + ast.span.text shouldBe compareTo + case None => fail("AST generation failed") + } + } +} diff --git a/joern-cli/frontends/swiftsrc2cpg/src/main/scala/io/joern/swiftsrc2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/swiftsrc2cpg/src/main/scala/io/joern/swiftsrc2cpg/astcreation/AstCreator.scala index 43d16968e363..af843e9d2568 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/main/scala/io/joern/swiftsrc2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/main/scala/io/joern/swiftsrc2cpg/astcreation/AstCreator.scala @@ -21,7 +21,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.NewTypeRef import io.shiftleft.codepropertygraph.generated.ModifierTypes import io.shiftleft.codepropertygraph.generated.nodes.File.PropertyDefaults import org.slf4j.{Logger, LoggerFactory} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import scala.collection.mutable @@ -121,10 +121,10 @@ class AstCreator(val config: Config, val global: Global, val parserResult: Parse case null => notHandledYet(node) } - override protected def line(node: SwiftNode): Option[Int] = node.startLine.map(Integer.valueOf) - override protected def column(node: SwiftNode): Option[Int] = node.startColumn.map(Integer.valueOf) - override protected def lineEnd(node: SwiftNode): Option[Int] = node.endLine.map(Integer.valueOf) - override protected def columnEnd(node: SwiftNode): Option[Int] = node.endColumn.map(Integer.valueOf) + override protected def line(node: SwiftNode): Option[Int] = node.startLine + override protected def column(node: SwiftNode): Option[Int] = node.startColumn + override protected def lineEnd(node: SwiftNode): Option[Int] = node.endLine + override protected def columnEnd(node: SwiftNode): Option[Int] = node.endColumn private val lineOffsetTable = OffsetUtils.getLineOffsetTable(Option(parserResult.fileContent)) diff --git a/joern-cli/frontends/swiftsrc2cpg/src/main/scala/io/joern/swiftsrc2cpg/passes/ImportsPass.scala b/joern-cli/frontends/swiftsrc2cpg/src/main/scala/io/joern/swiftsrc2cpg/passes/ImportsPass.scala index 963e5e4e66c4..d89d9b8f5dbe 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/main/scala/io/joern/swiftsrc2cpg/passes/ImportsPass.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/main/scala/io/joern/swiftsrc2cpg/passes/ImportsPass.scala @@ -4,7 +4,7 @@ import io.joern.x2cpg.X2Cpg import io.joern.x2cpg.passes.frontend.XImportsPass import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.Call -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.Assignment /** This pass creates `IMPORT` nodes by looking for calls to `require`. `IMPORT` nodes are linked to existing dependency diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/dataflow/DataFlowTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/dataflow/DataFlowTests.scala index e7de93beec41..430d345972b8 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/dataflow/DataFlowTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/dataflow/DataFlowTests.scala @@ -8,7 +8,6 @@ import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.Identifier import io.shiftleft.codepropertygraph.generated.nodes.Literal import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.toNodeTraversal class DataFlowTests extends DataFlowCodeToCpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/io/CodeDumperFromFileTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/io/CodeDumperFromFileTests.scala index 401379610cca..74070859371c 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/io/CodeDumperFromFileTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/io/CodeDumperFromFileTests.scala @@ -3,7 +3,7 @@ package io.joern.swiftsrc2cpg.io import better.files.File import io.joern.swiftsrc2cpg.testfixtures.SwiftSrc2CpgSuite import io.shiftleft.semanticcpg.codedumper.CodeDumper -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import java.util.regex.Pattern diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ActorTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ActorTests.scala index 9f35b700b653..ac7a7b581e3a 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ActorTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ActorTests.scala @@ -3,9 +3,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class ActorTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/AvailabilityQueryTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/AvailabilityQueryTests.scala index bc5471c202f6..f49f1b07708d 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/AvailabilityQueryTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/AvailabilityQueryTests.scala @@ -3,9 +3,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class AvailabilityQueryTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/BorrowExprTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/BorrowExprTests.scala index 346292310e0b..41d5bfb74245 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/BorrowExprTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/BorrowExprTests.scala @@ -3,7 +3,7 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class BorrowExprTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/BuiltinWordTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/BuiltinWordTests.scala index 1619e9046cf2..01e2535d6108 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/BuiltinWordTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/BuiltinWordTests.scala @@ -3,7 +3,7 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class BuiltinWordTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ConflictMarkersTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ConflictMarkersTests.scala index 83c8113a0304..1c102a80e460 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ConflictMarkersTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ConflictMarkersTests.scala @@ -3,7 +3,7 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class ConflictMarkersTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/CopyExprTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/CopyExprTests.scala index a37615b6b7c0..74cdd5dd2ad3 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/CopyExprTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/CopyExprTests.scala @@ -3,7 +3,7 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CopyExprTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/DeclarationTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/DeclarationTests.scala index d296aa4a8c6e..07ba4e56a134 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/DeclarationTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/DeclarationTests.scala @@ -2,9 +2,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class DeclarationTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/EnumTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/EnumTests.scala index 4c06817fe338..eb1f77e8ac99 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/EnumTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/EnumTests.scala @@ -4,9 +4,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class EnumTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ExpressionTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ExpressionTests.scala index a34be3b027d8..fe36cd54b82f 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ExpressionTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ExpressionTests.scala @@ -2,9 +2,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class ExpressionTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ForeachTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ForeachTests.scala index 034f2cd05a6b..82baf8f5365f 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ForeachTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ForeachTests.scala @@ -2,9 +2,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class ForeachTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/StatementTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/StatementTests.scala index 071f028346f7..99102b6f6b62 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/StatementTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/StatementTests.scala @@ -2,9 +2,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class StatementTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/SuperTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/SuperTests.scala index 3991c1d143f5..c3e538e433a3 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/SuperTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/SuperTests.scala @@ -4,7 +4,7 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class SuperTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/SwitchTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/SwitchTests.scala index a49ca2a5a8b5..1532d02ad0da 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/SwitchTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/SwitchTests.scala @@ -4,9 +4,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class SwitchTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ToplevelLibraryTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ToplevelLibraryTests.scala index eda0969c3d9c..a70e3645c9ba 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ToplevelLibraryTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/ToplevelLibraryTests.scala @@ -4,9 +4,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class ToplevelLibraryTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/TryTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/TryTests.scala index cc04f6a56439..92f9e092680e 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/TryTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/TryTests.scala @@ -4,9 +4,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class TryTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/TypealiasTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/TypealiasTests.scala index 97ecb3006bdc..9a974501a878 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/TypealiasTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/TypealiasTests.scala @@ -4,9 +4,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class TypealiasTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/WhileTests.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/WhileTests.scala index df30834877dd..6138b719d8e1 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/WhileTests.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/passes/ast/WhileTests.scala @@ -2,9 +2,9 @@ package io.joern.swiftsrc2cpg.passes.ast import io.joern.swiftsrc2cpg.testfixtures.AstSwiftSrc2CpgSuite -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.* +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* class WhileTests extends AstSwiftSrc2CpgSuite { diff --git a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/testfixtures/DataFlowCodeToCpgSuite.scala b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/testfixtures/DataFlowCodeToCpgSuite.scala index 451f2dfefeb0..af0875c95404 100644 --- a/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/testfixtures/DataFlowCodeToCpgSuite.scala +++ b/joern-cli/frontends/swiftsrc2cpg/src/test/scala/io/joern/swiftsrc2cpg/testfixtures/DataFlowCodeToCpgSuite.scala @@ -27,7 +27,7 @@ class DataFlowCodeToCpgSuite extends Code2CpgFixture(() => new DataFlowTestCpg() protected implicit val context: EngineContext = EngineContext() protected def flowToResultPairs(path: Path): List[(String, Integer)] = - path.resultPairs().collect { case (firstElement: String, secondElement: Option[Integer]) => + path.resultPairs().collect { case (firstElement: String, secondElement) => (firstElement, secondElement.getOrElse(-1)) } } diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/Ast.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/Ast.scala index ea5f9f8bd5f4..51a28e4d4311 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/Ast.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/Ast.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.nodes.AstNode.PropertyDefaults import org.slf4j.LoggerFactory -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import overflowdb.SchemaViolationException case class AstEdge(src: NewNode, dst: NewNode) @@ -58,7 +58,7 @@ object Ast { !(src.isValidOutNeighbor(edge, dst) && dst.isValidInNeighbor(edge, src)) ) { throw new SchemaViolationException( - s"Malformed AST detected: (${src.label()}) -[$edge]-> (${dst.label()}) violates the schema." + s"Malformed AST detected: (${src.label}) -[$edge]-> (${dst.label}) violates the schema." ) } @@ -222,9 +222,10 @@ case class Ast( * copy. */ def subTreeCopy(node: AstNodeNew, argIndex: Int = -1, replacementNode: Option[AstNodeNew] = None): Ast = { - val newNode = replacementNode match + val newNode = replacementNode match { case Some(n) => n case None => node.copy + } if (argIndex != -1) { // newNode.order = argIndex newNode match { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/AstCreatorBase.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/AstCreatorBase.scala index 8df7a930c78c..caa3e903c0cb 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/AstCreatorBase.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/AstCreatorBase.scala @@ -7,7 +7,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, ModifierTypes} import io.shiftleft.passes.IntervalKeyPool import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder abstract class AstCreatorBase(filename: String)(implicit withSchemaValidation: ValidationMode) { val diffGraph: DiffGraphBuilder = Cpg.newDiffGraphBuilder @@ -88,7 +88,7 @@ abstract class AstCreatorBase(filename: String)(implicit withSchemaValidation: V ): Ast = Ast(method) .withChildren(parameters) - .withChild(Ast(NewBlock())) + .withChild(Ast(NewBlock().typeFullName(Defines.Any))) .withChildren(modifiers.map(Ast(_))) .withChild(Ast(methodReturn)) @@ -113,7 +113,7 @@ abstract class AstCreatorBase(filename: String)(implicit withSchemaValidation: V methodNode.filename(fileName.get) } val staticModifier = NewModifier().modifierType(ModifierTypes.STATIC) - val body = blockAst(NewBlock(), initAsts) + val body = blockAst(NewBlock().typeFullName(Defines.Any), initAsts) val methodReturn = newMethodReturnNode(returnType, None, None, None) methodAst(methodNode, Nil, body, methodReturn, List(staticModifier)) } @@ -150,9 +150,9 @@ abstract class AstCreatorBase(filename: String)(implicit withSchemaValidation: V def wrapMultipleInBlock(asts: Seq[Ast], lineNumber: Option[Int]): Ast = { asts.toList match { - case Nil => blockAst(NewBlock().lineNumber(lineNumber)) + case Nil => blockAst(NewBlock().typeFullName(Defines.Any).lineNumber(lineNumber)) case ast :: Nil => ast - case astList => blockAst(NewBlock().lineNumber(lineNumber), astList) + case astList => blockAst(NewBlock().typeFullName(Defines.Any).lineNumber(lineNumber), astList) } } diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/AstNodeBuilder.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/AstNodeBuilder.scala index 2b2832960813..217814f6d4d0 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/AstNodeBuilder.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/AstNodeBuilder.scala @@ -234,7 +234,7 @@ trait AstNodeBuilder[Node, NodeProcessor] { this: NodeProcessor => } protected def blockNode(node: Node): NewBlock = { - blockNode(node, BlockDefaults.Code, BlockDefaults.TypeFullName) + blockNode(node, BlockDefaults.Code, Defines.Any) } protected def blockNode(node: Node, code: String, typeFullName: String): NewBlock = { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/Imports.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/Imports.scala index a46e41fdabaf..7d523c6aba44 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/Imports.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/Imports.scala @@ -2,7 +2,7 @@ package io.joern.x2cpg import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.{CallBase, NewImport} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder object Imports { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/SourceFiles.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/SourceFiles.scala index 24b224a15fab..ce6b87266244 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/SourceFiles.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/SourceFiles.scala @@ -13,9 +13,11 @@ object SourceFiles { private val logger = LoggerFactory.getLogger(getClass) private def isIgnoredByFileList(filePath: String, ignoredFiles: Seq[String]): Boolean = { - val isInIgnoredFiles = ignoredFiles.exists { - case ignorePath if File(ignorePath).isDirectory => filePath.startsWith(ignorePath) - case ignorePath => filePath == ignorePath + val isInIgnoredFiles = ignoredFiles.exists { ignorePath => + val ignorePathFile = File(ignorePath) + val filePathFile = File(filePath) + ignorePathFile.exists && + (ignorePathFile.contains(filePathFile, strict = false) || ignorePathFile.isSameFileAs(filePathFile)) } if (isInIgnoredFiles) { logger.debug(s"'$filePath' ignored (--exclude)") diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/X2Cpg.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/X2Cpg.scala index ca5b223ec8b1..b3ecb4fdb4ed 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/X2Cpg.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/X2Cpg.scala @@ -173,15 +173,22 @@ trait X2CpgFrontend[T <: X2CpgConfig[?]] { /** Create CPG according to given configuration, printing errors to the console if they occur. The CPG is closed and * not returned. */ + @throws[Throwable]("if createCpg throws any Throwable") def run(config: T): Unit = { withErrorsToConsole(config) { _ => createCpg(config) match { case Success(cpg) => - cpg.close() + cpg.close() // persists to disk Success(cpg) case Failure(exception) => Failure(exception) } + }.recover { exception => + // We explicitly rethrow the exception so that every frontend will + // terminate with exit code 1 if there was an exception during createCpg. + // Frontend maintainer may want to catch that RuntimeException on their end + // to add custom error handling. + throw exception } } diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/javasrc2cpg/JavaTypeRecoveryPassGenerator.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/javasrc2cpg/JavaTypeRecoveryPassGenerator.scala index 607bc70fa3dd..936595fc045b 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/javasrc2cpg/JavaTypeRecoveryPassGenerator.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/javasrc2cpg/JavaTypeRecoveryPassGenerator.scala @@ -5,7 +5,7 @@ import io.joern.x2cpg.passes.frontend.* import io.shiftleft.codepropertygraph.generated.{Cpg, PropertyNames} import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder class JavaTypeRecoveryPassGenerator(cpg: Cpg, config: XTypeRecoveryConfig = XTypeRecoveryConfig()) extends XTypeRecoveryPassGenerator[Method](cpg, config) { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/ConstClosurePass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/ConstClosurePass.scala index fedb8e0f77d7..f9b4b0f339c9 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/ConstClosurePass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/ConstClosurePass.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.PropertyNames import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Method, MethodRef} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* /** A pass that identifies assignments of closures to constants and updates `METHOD` nodes accordingly. */ diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/JavaScriptTypeRecovery.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/JavaScriptTypeRecovery.scala index 3264b4e73f05..4872f080a718 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/JavaScriptTypeRecovery.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/JavaScriptTypeRecovery.scala @@ -8,7 +8,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{Operators, PropertyNames} import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.FieldAccess -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder class JavaScriptTypeRecoveryPassGenerator(cpg: Cpg, config: XTypeRecoveryConfig = XTypeRecoveryConfig()) extends XTypeRecoveryPassGenerator[File](cpg, config) { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/ObjectPropertyCallLinker.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/ObjectPropertyCallLinker.scala index cb09e7df9d4d..4b77b193ed03 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/ObjectPropertyCallLinker.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/jssrc2cpg/ObjectPropertyCallLinker.scala @@ -3,7 +3,6 @@ package io.joern.x2cpg.frontendspecific.jssrc2cpg import io.shiftleft.codepropertygraph.generated.nodes.{Call, MethodRef} import io.shiftleft.codepropertygraph.generated.{Cpg, PropertyNames} import io.shiftleft.passes.CpgPass -import overflowdb.BatchedUpdate import io.shiftleft.semanticcpg.language.* /** Perform a simple analysis to find a common pattern in JavaScript where objects are dynamically assigned function @@ -13,7 +12,7 @@ import io.shiftleft.semanticcpg.language.* */ class ObjectPropertyCallLinker(cpg: Cpg) extends CpgPass(cpg) { - override def run(builder: BatchedUpdate.DiffGraphBuilder): Unit = { + override def run(builder: DiffGraphBuilder): Unit = { def propertyCallRegexPattern(withMatchingGroup: Boolean): String = "^(?:\\{.*\\}|.*):\\(" + (if withMatchingGroup then "(.*)" else ".*") + "\\):.*$" diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/php2cpg/PhpTypeRecovery.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/php2cpg/PhpTypeRecovery.scala index 9c7857a95ccd..39fff713b025 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/php2cpg/PhpTypeRecovery.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/php2cpg/PhpTypeRecovery.scala @@ -8,7 +8,7 @@ import io.shiftleft.codepropertygraph.generated.{Cpg, DispatchTypes, Operators, import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.{Assignment, FieldAccess} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import scala.collection.mutable diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/php2cpg/PhpTypeStubsParser.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/php2cpg/PhpTypeStubsParser.scala index e8f2cb4cec7c..c7d43c33f4e9 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/php2cpg/PhpTypeStubsParser.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/php2cpg/PhpTypeStubsParser.scala @@ -9,7 +9,6 @@ import io.shiftleft.passes.ForkJoinParallelCpgPass import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes import org.slf4j.{Logger, LoggerFactory} -import overflowdb.BatchedUpdate import scopt.OParser import java.io.File as JFile @@ -47,7 +46,7 @@ class PhpTypeStubsParserPass(cpg: Cpg, config: XTypeStubsParserConfig = XTypeStu arr } - override def runOnPart(builder: overflowdb.BatchedUpdate.DiffGraphBuilder, part: KnownFunction): Unit = { + override def runOnPart(builder: DiffGraphBuilder, part: KnownFunction): Unit = { /* calculate the result of this part - this is done as a concurrent task */ val builtinMethod = cpg.method.fullNameExact(part.name).l builtinMethod.foreach(mNode => { @@ -73,7 +72,7 @@ class PhpTypeStubsParserPass(cpg: Cpg, config: XTypeStubsParserConfig = XTypeStu def scanParamTypes(pTypesRawArr: List[String]): Seq[Seq[String]] = pTypesRawArr.map(paramTypeRaw => paramTypeRaw.split(",").map(_.strip).toSeq).toSeq - protected def setTypes(builder: overflowdb.BatchedUpdate.DiffGraphBuilder, n: StoredNode, types: Seq[String]): Unit = + protected def setTypes(builder: DiffGraphBuilder, n: StoredNode, types: Seq[String]): Unit = if (types.size == 1) builder.setNodeProperty(n, PropertyNames.TYPE_FULL_NAME, types.head) else builder.setNodeProperty(n, PropertyNames.DYNAMIC_TYPE_HINT_FULL_NAME, types) } diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/pysrc2cpg/DynamicTypeHintFullNamePass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/pysrc2cpg/DynamicTypeHintFullNamePass.scala index 5675afe23e63..2e70aea7e38f 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/pysrc2cpg/DynamicTypeHintFullNamePass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/pysrc2cpg/DynamicTypeHintFullNamePass.scala @@ -5,7 +5,6 @@ import io.shiftleft.codepropertygraph.generated.{Cpg, PropertyNames} import io.shiftleft.codepropertygraph.generated.nodes.{CfgNode, MethodParameterIn, MethodReturn, StoredNode} import io.shiftleft.passes.ForkJoinParallelCpgPass import io.shiftleft.semanticcpg.language.* -import overflowdb.BatchedUpdate import java.io.File import java.util.regex.{Matcher, Pattern} @@ -74,7 +73,7 @@ class DynamicTypeHintFullNamePass(cpg: Cpg) extends ForkJoinParallelCpgPass[CfgN fullName.replaceFirst("\\.py:", "").replaceAll(Pattern.quote(File.separator), ".") private def setTypeHints( - diffGraph: BatchedUpdate.DiffGraphBuilder, + diffGraph: DiffGraphBuilder, node: StoredNode, typeHint: String, alias: String, diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/pysrc2cpg/PythonTypeRecovery.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/pysrc2cpg/PythonTypeRecovery.scala index 6449cfc8e013..ccdbf86c4aec 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/pysrc2cpg/PythonTypeRecovery.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/pysrc2cpg/PythonTypeRecovery.scala @@ -13,7 +13,7 @@ import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.importresolver.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.FieldAccess -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder private class PythonTypeRecovery(cpg: Cpg, state: XTypeRecoveryState, iteration: Int) extends XTypeRecovery[File](cpg, state, iteration) { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/swiftsrc2cpg/SwiftTypeRecovery.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/swiftsrc2cpg/SwiftTypeRecovery.scala index a40fd813531c..04bd681c0ca7 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/swiftsrc2cpg/SwiftTypeRecovery.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/frontendspecific/swiftsrc2cpg/SwiftTypeRecovery.scala @@ -8,7 +8,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{Operators, PropertyNames} import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.FieldAccess -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder class SwiftTypeRecoveryPassGenerator(cpg: Cpg, config: XTypeRecoveryConfig = XTypeRecoveryConfig()) extends XTypeRecoveryPassGenerator[File](cpg, config) { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/Base.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/Base.scala index a14daa5f8ad5..8e59eb053b69 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/Base.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/Base.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.PropertyNames import io.shiftleft.passes.CpgPassBase import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} -import io.joern.x2cpg.passes.base._ +import io.joern.x2cpg.passes.base.* object Base { val overlayName: String = "base" diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/ControlFlow.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/ControlFlow.scala index d0cdb3b1de5c..eb992e1f3b85 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/ControlFlow.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/ControlFlow.scala @@ -3,7 +3,7 @@ package io.joern.x2cpg.layers import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Languages import io.shiftleft.passes.CpgPassBase -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} import io.joern.x2cpg.passes.controlflow.CfgCreationPass import io.joern.x2cpg.passes.controlflow.cfgdominator.CfgDominatorPass diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpAst.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpAst.scala index cbbe9ceaf31d..cf06abf67ed7 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpAst.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpAst.scala @@ -1,7 +1,7 @@ package io.joern.x2cpg.layers import better.files.File -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} case class AstDumpOptions(var outDir: String) extends LayerCreatorOptions {} diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpCdg.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpCdg.scala index 2528d7107758..6e92efc27ac8 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpCdg.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpCdg.scala @@ -1,7 +1,7 @@ package io.joern.x2cpg.layers import better.files.File -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} case class CdgDumpOptions(var outDir: String) extends LayerCreatorOptions {} diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpCfg.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpCfg.scala index 1f78125b4177..0b3000c31fc8 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpCfg.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/layers/DumpCfg.scala @@ -1,7 +1,7 @@ package io.joern.x2cpg.layers import better.files.File -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions} case class CfgDumpOptions(var outDir: String) extends LayerCreatorOptions {} diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/ContainsEdgePass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/ContainsEdgePass.scala index 703607803eee..e3d5145b7d8f 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/ContainsEdgePass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/ContainsEdgePass.scala @@ -1,12 +1,12 @@ package io.joern.x2cpg.passes.base import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes} import io.shiftleft.passes.ForkJoinParallelCpgPass import scala.collection.mutable -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* /** This pass has MethodStubCreator and TypeDeclStubCreator as prerequisite for language frontends which do not provide * method stubs and type decl stubs. diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/MethodDecoratorPass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/MethodDecoratorPass.scala index 99b19f36d7a4..19f2bf802a87 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/MethodDecoratorPass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/MethodDecoratorPass.scala @@ -3,7 +3,7 @@ package io.joern.x2cpg.passes.base import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.{EdgeTypes, nodes} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.slf4j.{Logger, LoggerFactory} /** Adds a METHOD_PARAMETER_OUT for each METHOD_PARAMETER_IN to the graph and connects those with a PARAMETER_LINK edge. diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/MethodStubCreator.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/MethodStubCreator.scala index 7fa2f42016e5..794127e77402 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/MethodStubCreator.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/MethodStubCreator.scala @@ -3,12 +3,11 @@ package io.joern.x2cpg.passes.base import io.joern.x2cpg.Defines import io.joern.x2cpg.passes.base.MethodStubCreator.createMethodStub import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EdgeTypes, EvaluationStrategies, NodeTypes} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ -import overflowdb.BatchedUpdate -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.semanticcpg.language.* +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import scala.collection.mutable import scala.util.Try @@ -24,7 +23,7 @@ class MethodStubCreator(cpg: Cpg) extends CpgPass(cpg) { private val methodFullNameToNode = mutable.LinkedHashMap[String, Method]() private val methodToParameterCount = mutable.LinkedHashMap[CallSummary, Int]() - override def run(dstGraph: BatchedUpdate.DiffGraphBuilder): Unit = { + override def run(dstGraph: DiffGraphBuilder): Unit = { for (method <- cpg.method) { methodFullNameToNode.put(method.fullName, method) } @@ -121,7 +120,7 @@ object MethodStubCreator { val blockNode = NewBlock() .order(1) .argumentIndex(1) - .typeFullName("ANY") + .typeFullName(Defines.Any) dstGraph.addNode(blockNode) dstGraph.addEdge(methodNode, blockNode, EdgeTypes.AST) diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/NamespaceCreator.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/NamespaceCreator.scala index 9d6724e7a607..417c8b24afbf 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/NamespaceCreator.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/NamespaceCreator.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.NewNamespace import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* /** Creates NAMESPACE nodes and connects NAMESPACE_BLOCKs to corresponding NAMESPACE nodes. * diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/ParameterIndexCompatPass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/ParameterIndexCompatPass.scala index a5a3dc2ae508..9323da89cf01 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/ParameterIndexCompatPass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/ParameterIndexCompatPass.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.PropertyNames import io.shiftleft.codepropertygraph.generated.nodes.MethodParameterIn.PropertyDefaults import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* /** Old CPGs use the `order` field to indicate the parameter index while newer CPGs use the `parameterIndex` field. This * pass checks whether `parameterIndex` is not set, in which case the value of `order` is copied over. diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/TypeDeclStubCreator.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/TypeDeclStubCreator.scala index 778c9cd42a9e..7d658d7efb2f 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/TypeDeclStubCreator.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/base/TypeDeclStubCreator.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.NodeTypes import io.shiftleft.codepropertygraph.generated.nodes.{NewTypeDecl, TypeDeclBase} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.types.structure.{FileTraversal, NamespaceTraversal} /** This pass has no other pass as prerequisite. For each `TYPE` node that does not have a corresponding `TYPE_DECL` diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/callgraph/DynamicCallLinker.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/callgraph/DynamicCallLinker.scala index e12539269822..5174b5812630 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/callgraph/DynamicCallLinker.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/callgraph/DynamicCallLinker.scala @@ -5,12 +5,12 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{Call, Method, TypeDecl} import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EdgeTypes, PropertyNames} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.slf4j.{Logger, LoggerFactory} import overflowdb.{NodeDb, NodeRef} import scala.collection.mutable -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* /** We compute the set of possible call-targets for each dynamic call, and add them as CALL edges to the graph, based on * call.methodFullName, method.name and method.signature, the inheritance hierarchy and the AST of typedecls and @@ -56,10 +56,10 @@ class DynamicCallLinker(cpg: Cpg) extends CpgPass(cpg) { initMaps() // ValidM maps class C and method name N to the set of // func ptrs implementing N for C and its subclasses - for ( - typeDecl <- cpg.typeDecl; + for { + typeDecl <- cpg.typeDecl method <- typeDecl._methodViaAstOut - ) { + } { val methodName = method.fullName val candidates = allSubclasses(typeDecl.fullName).flatMap { staticLookup(_, method) } validM.put(methodName, candidates) diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/callgraph/NaiveCallLinker.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/callgraph/NaiveCallLinker.scala index e9156f217b49..f9f1332af728 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/callgraph/NaiveCallLinker.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/callgraph/NaiveCallLinker.scala @@ -3,8 +3,7 @@ package io.joern.x2cpg.passes.callgraph import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.{EdgeTypes, PropertyNames} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ -import overflowdb.traversal.jIteratortoTraversal +import io.shiftleft.semanticcpg.language.* /** Link remaining unlinked calls to methods only by their name (not full name) * @param cpg diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/CfgCreationPass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/CfgCreationPass.scala index f1dab9252fb7..cf2ce37a0f43 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/CfgCreationPass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/CfgCreationPass.scala @@ -3,7 +3,7 @@ package io.joern.x2cpg.passes.controlflow import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.Method import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.joern.x2cpg.passes.controlflow.cfgcreation.CfgCreator /** A pass that creates control flow graphs from abstract syntax trees. diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/cfgcreation/CfgCreator.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/cfgcreation/CfgCreator.scala index ac157243ac15..cf16da1c7e6f 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/cfgcreation/CfgCreator.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/cfgcreation/CfgCreator.scala @@ -4,7 +4,7 @@ import io.joern.x2cpg.passes.controlflow.cfgcreation.Cfg.CfgEdgeType import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, DispatchTypes, EdgeTypes, Operators} import io.shiftleft.semanticcpg.language.* -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder /** Translation of abstract syntax trees into control flow graphs * @@ -368,16 +368,17 @@ class CfgCreator(entryNode: Method, diffGraph: DiffGraphBuilder) { val loopExprCfg = children.find(_.order == nLocals + 3).map(cfgFor).getOrElse(Cfg.empty) val bodyCfg = children.find(_.order == nLocals + 4).map(cfgFor).getOrElse(Cfg.empty) - val innerCfg = conditionCfg ++ bodyCfg ++ loopExprCfg - val entryNode = (initExprCfg ++ innerCfg).entryNode + val innerCfg = bodyCfg ++ loopExprCfg + val loopEntryNode = conditionCfg.entryNode.orElse(innerCfg.entryNode) + val entryNode = initExprCfg.entryNode.orElse(loopEntryNode) - val newEdges = edgesFromFringeTo(initExprCfg, innerCfg.entryNode) ++ - edgesFromFringeTo(innerCfg, innerCfg.entryNode) ++ - edgesFromFringeTo(conditionCfg, bodyCfg.entryNode, TrueEdge) ++ { + val newEdges = edgesFromFringeTo(initExprCfg, loopEntryNode) ++ + edgesFromFringeTo(innerCfg, loopEntryNode) ++ + edgesFromFringeTo(conditionCfg, innerCfg.entryNode.orElse(conditionCfg.entryNode), TrueEdge) ++ { if (loopExprCfg.entryNode.isDefined) { edges(takeCurrentLevel(bodyCfg.continues), loopExprCfg.entryNode) } else { - edges(takeCurrentLevel(bodyCfg.continues), innerCfg.entryNode) + edges(takeCurrentLevel(bodyCfg.continues), loopEntryNode) } } @@ -385,7 +386,7 @@ class CfgCreator(entryNode: Method, diffGraph: DiffGraphBuilder) { .from(initExprCfg, conditionCfg, loopExprCfg, bodyCfg) .copy( entryNode = entryNode, - edges = newEdges ++ initExprCfg.edges ++ innerCfg.edges, + edges = newEdges ++ initExprCfg.edges ++ conditionCfg.edges ++ innerCfg.edges, fringe = conditionCfg.fringe.withEdgeType(FalseEdge) ++ takeCurrentLevel(bodyCfg.breaks).map((_, AlwaysEdge)), breaks = reduceAndFilterLevel(bodyCfg.breaks), continues = reduceAndFilterLevel(bodyCfg.continues) @@ -461,18 +462,32 @@ class CfgCreator(entryNode: Method, diffGraph: DiffGraphBuilder) { val diffGraphs = edgesFromFringeTo(conditionCfg, trueCfg.entryNode) ++ edgesFromFringeTo(conditionCfg, falseCfg.entryNode) - Cfg - .from(conditionCfg, trueCfg, falseCfg) - .copy( - entryNode = conditionCfg.entryNode, - edges = diffGraphs ++ conditionCfg.edges ++ trueCfg.edges ++ falseCfg.edges, - fringe = trueCfg.fringe ++ { + val ifStatementFringe = + if (trueCfg.entryNode.isEmpty && falseCfg.entryNode.isEmpty) { + conditionCfg.fringe.withEdgeType(AlwaysEdge) + } else { + val trueFringe = if (trueCfg.entryNode.isDefined) { + trueCfg.fringe + } else { + conditionCfg.fringe.withEdgeType(TrueEdge) + } + + val falseFringe = if (falseCfg.entryNode.isDefined) { falseCfg.fringe } else { conditionCfg.fringe.withEdgeType(FalseEdge) } - } + + trueFringe ++ falseFringe + } + + Cfg + .from(conditionCfg, trueCfg, falseCfg) + .copy( + entryNode = conditionCfg.entryNode, + edges = diffGraphs ++ conditionCfg.edges ++ trueCfg.edges ++ falseCfg.edges, + fringe = ifStatementFringe ) } diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/cfgdominator/CfgDominatorPass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/cfgdominator/CfgDominatorPass.scala index 933ba72fdf2b..69e33e8773a0 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/cfgdominator/CfgDominatorPass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/cfgdominator/CfgDominatorPass.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.{Method, StoredNode} import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import scala.collection.mutable diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/codepencegraph/CdgPass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/codepencegraph/CdgPass.scala index 5bca67fd685f..4fc9f82d346f 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/codepencegraph/CdgPass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/controlflow/codepencegraph/CdgPass.scala @@ -13,7 +13,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.{ Unknown } import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.joern.x2cpg.passes.controlflow.cfgdominator.{CfgDominatorFrontier, ReverseCpgCfgAdapter} import org.slf4j.{Logger, LoggerFactory} diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/Dereference.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/Dereference.scala index 2ee1c7ae355a..14eb957d6b17 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/Dereference.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/Dereference.scala @@ -2,7 +2,7 @@ package io.joern.x2cpg.passes.frontend import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Languages -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* object Dereference { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/TypeNodePass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/TypeNodePass.scala index 179c31d4b6d1..8da938a5f782 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/TypeNodePass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/TypeNodePass.scala @@ -1,11 +1,10 @@ package io.joern.x2cpg.passes.frontend import io.joern.x2cpg.passes.frontend.TypeNodePass.fullToShortName -import io.shiftleft.codepropertygraph.generated.Cpg +import io.shiftleft.codepropertygraph.generated.{Cpg, Properties} import io.shiftleft.codepropertygraph.generated.nodes.NewType import io.shiftleft.passes.{KeyPool, CpgPass} -import io.shiftleft.semanticcpg.language._ -import io.shiftleft.codepropertygraph.generated.PropertyNames +import io.shiftleft.semanticcpg.language.* import scala.collection.mutable import io.shiftleft.semanticcpg.language.types.structure.NamespaceTraversal @@ -33,9 +32,8 @@ class TypeNodePass protected ( protected def typeFullNamesFromCpg: Set[String] = { cpg.all - .map(_.property(PropertyNames.TYPE_FULL_NAME)) + .map(_.property(Properties.TypeFullName)) .filter(_ != null) - .map(_.toString) .toSet } @@ -74,6 +72,11 @@ object TypeNodePass { } def fullToShortName(typeName: String): String = { - typeName.takeWhile(_ != ':').split('.').lastOption.getOrElse(typeName) + if (typeName.endsWith(">")) { + // special case for typeFullName with generics as suffix + typeName.takeWhile(c => c != ':' && c != '<').split('.').lastOption.getOrElse(typeName) + } else { + typeName.takeWhile(_ != ':').split('.').lastOption.getOrElse(typeName) + } } } diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XConfigFileCreationPass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XConfigFileCreationPass.scala index 4a496b1b2855..252bc2d28e01 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XConfigFileCreationPass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XConfigFileCreationPass.scala @@ -4,7 +4,7 @@ import better.files.File import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.NewConfigFile import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.utils.IOUtils import org.slf4j.LoggerFactory diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XImportsPass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XImportsPass.scala index bb81e30b77ff..3d6ab6bbba53 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XImportsPass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XImportsPass.scala @@ -4,7 +4,7 @@ import io.joern.x2cpg.Imports.createImportNodeAndLink import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.Call import io.shiftleft.passes.ForkJoinParallelCpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.Assignment abstract class XImportsPass(cpg: Cpg) extends ForkJoinParallelCpgPass[(Call, Assignment)](cpg) { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XInheritanceFullNamePass.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XInheritanceFullNamePass.scala index 6f42f087cb0a..7a3adaf38617 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XInheritanceFullNamePass.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XInheritanceFullNamePass.scala @@ -2,7 +2,7 @@ package io.joern.x2cpg.passes.frontend import io.joern.x2cpg.passes.base.TypeDeclStubCreator import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, PropertyNames} import io.shiftleft.passes.ForkJoinParallelCpgPass import io.shiftleft.semanticcpg.language.* @@ -41,7 +41,7 @@ abstract class XInheritanceFullNamePass(cpg: Cpg) extends ForkJoinParallelCpgPas inheritedTypes == Seq("ANY") || inheritedTypes == Seq("object") || inheritedTypes.isEmpty private def extractTypeDeclFromNode(node: AstNode): Option[String] = node match { - case x: Call if x.isCallForImportOut.nonEmpty => + case x: Call if x._isCallForImportOut.nonEmpty => x.isCallForImportOut.importedEntity.map { case imp if relativePathPattern.matcher(imp).matches() => imp.split(pathSep).toList match { diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XTypeHintCallLinker.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XTypeHintCallLinker.scala index 7447a091f588..92733810ca93 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XTypeHintCallLinker.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XTypeHintCallLinker.scala @@ -4,9 +4,8 @@ import io.joern.x2cpg.passes.base.MethodStubCreator import io.joern.x2cpg.passes.frontend.XTypeRecovery.isDummyType import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.* -import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes, PropertyNames} +import io.shiftleft.codepropertygraph.generated.{DispatchTypes, EdgeTypes, NodeTypes, PropertyNames} import io.shiftleft.passes.CpgPass -import io.shiftleft.proto.cpg.Cpg.DispatchTypes import io.shiftleft.semanticcpg.language.* import java.util.regex.Pattern @@ -151,7 +150,7 @@ abstract class XTypeHintCallLinker(cpg: Cpg) extends CpgPass(cpg) { name, fullName, "", - DispatchTypes.DYNAMIC_DISPATCH.name(), + DispatchTypes.DYNAMIC_DISPATCH, argSize, builder, isExternal, diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XTypeRecovery.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XTypeRecovery.scala index b82ed185384c..0541d2cb0fdc 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XTypeRecovery.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/passes/frontend/XTypeRecovery.scala @@ -1,7 +1,15 @@ package io.joern.x2cpg.passes.frontend import io.joern.x2cpg.{Defines, X2CpgConfig} -import io.shiftleft.codepropertygraph.generated.{Cpg, DispatchTypes, EdgeTypes, NodeTypes, Operators, PropertyNames} +import io.shiftleft.codepropertygraph.generated.{ + Cpg, + DispatchTypes, + EdgeTypes, + NodeTypes, + Operators, + Properties, + PropertyNames +} import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.passes.{CpgPass, CpgPassBase, ForkJoinParallelCpgPass} import io.shiftleft.semanticcpg.language.* @@ -9,8 +17,7 @@ import io.shiftleft.semanticcpg.language.importresolver.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.{Assignment, FieldAccess} import org.slf4j.{Logger, LoggerFactory} -import overflowdb.BatchedUpdate -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder import scopt.OParser import java.util.regex.Pattern @@ -151,7 +158,7 @@ abstract class XTypeRecoveryPassGenerator[CompilationUnitType <: AstNode]( if (postTypeRecoveryAndPropagation) res.append( new CpgPass(cpg): - override def run(builder: BatchedUpdate.DiffGraphBuilder): Unit = { + override def run(builder: DiffGraphBuilder): Unit = { XTypeRecoveryPassGenerator.linkMembersToTheirRefs(cpg, builder) } ) @@ -265,9 +272,9 @@ object XTypeRecovery { // the symbol table then perhaps this would work out better implicit class AllNodeTypesFromNodeExt(x: StoredNode) { def allTypes: Iterator[String] = - (x.property(PropertyNames.TYPE_FULL_NAME, "ANY") +: - (x.property(PropertyNames.DYNAMIC_TYPE_HINT_FULL_NAME, Seq.empty) - ++ x.property(PropertyNames.POSSIBLE_TYPES, Seq.empty))).iterator + (x.propertyOption(Properties.TypeFullName).orElse("ANY") +: + (x.property(Properties.DynamicTypeHintFullName) ++ + x.property(Properties.PossibleTypes))).iterator def getKnownTypes: Set[String] = { x.allTypes.toSet.filterNot(XTypeRecovery.unknownTypePattern.matches) @@ -436,7 +443,8 @@ abstract class RecoverForXCompilationUnit[CompilationUnitType <: AstNode]( * @param a * assignment call pointer. */ - protected def visitAssignments(a: Assignment): Set[String] = visitAssignmentArguments(a.argumentOut.l) + protected def visitAssignments(a: Assignment): Set[String] = + visitAssignmentArguments(a.argumentOut.cast[CfgNode].l) protected def visitAssignmentArguments(args: List[AstNode]): Set[String] = args match { case List(i: Identifier, b: Block) => visitIdentifierAssignedToBlock(i, b) @@ -555,7 +563,7 @@ abstract class RecoverForXCompilationUnit[CompilationUnitType <: AstNode]( isFieldCache.getOrElseUpdate(i, isFieldUncached(i)) protected def isFieldUncached(i: Identifier): Boolean = - i.method.typeDecl.member.nameExact(i.name).nonEmpty + Try(i.method.typeDecl.member.nameExact(i.name).nonEmpty).getOrElse(false) /** Associates the types with the identifier. This may sometimes be an identifier that should be considered a field * which this method uses [[isField]] to determine. @@ -569,7 +577,9 @@ abstract class RecoverForXCompilationUnit[CompilationUnitType <: AstNode]( val fieldName = getFieldName(fa).split(Pattern.quote(pathSep)).last Try(cpg.member.nameExact(fieldName).typeDecl.fullName.filterNot(_.contains("ANY")).toSet) match case Failure(exception) => - logger.warn("Unable to obtain name of member's parent type declaration", exception) + logger.warn( + s"Unable to obtain name of member's parent type declaration: ${cpg.member.nameExact(fieldName).propertiesMap.mkString(",")}" + ) Set.empty case Success(typeDeclNames) => typeDeclNames } @@ -1231,7 +1241,8 @@ abstract class RecoverForXCompilationUnit[CompilationUnitType <: AstNode]( lazy val existingTypes = storedNode.getKnownTypes val hasUnknownTypeFullName = storedNode - .property(PropertyNames.TYPE_FULL_NAME, Defines.Any) + .propertyOption(Properties.TypeFullName) + .orElse(Defines.Any) .matches(XTypeRecovery.unknownTypePattern.pattern.pattern()) if (types.nonEmpty && (hasUnknownTypeFullName || types.toSet != existingTypes)) { @@ -1270,7 +1281,9 @@ abstract class RecoverForXCompilationUnit[CompilationUnitType <: AstNode]( */ protected def storeDefaultTypeInfo(n: StoredNode, types: Seq[String]): Unit = val hasUnknownType = - n.property(PropertyNames.TYPE_FULL_NAME, Defines.Any).matches(XTypeRecovery.unknownTypePattern.pattern.pattern()) + n.propertyOption(Properties.TypeFullName) + .orElse(Defines.Any) + .matches(XTypeRecovery.unknownTypePattern.pattern.pattern()) if (types.toSet != n.getKnownTypes || (hasUnknownType && types.nonEmpty)) { setTypes(n, (n.property(PropertyNames.DYNAMIC_TYPE_HINT_FULL_NAME, Seq.empty) ++ types).distinct) diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/utils/LinkingUtil.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/utils/LinkingUtil.scala index 9fd6290b4d8b..72c962aab116 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/utils/LinkingUtil.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/utils/LinkingUtil.scala @@ -14,7 +14,7 @@ import scala.jdk.CollectionConverters.* trait LinkingUtil { - import overflowdb.BatchedUpdate.DiffGraphBuilder + import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder val MAX_BATCH_SIZE: Int = 100 diff --git a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/utils/dependency/GradleDependencies.scala b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/utils/dependency/GradleDependencies.scala index bc8c13918df7..c69af9ea12ac 100644 --- a/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/utils/dependency/GradleDependencies.scala +++ b/joern-cli/frontends/x2cpg/src/main/scala/io/joern/x2cpg/utils/dependency/GradleDependencies.scala @@ -1,6 +1,6 @@ package io.joern.x2cpg.utils.dependency -import better.files._ +import better.files.* import org.gradle.tooling.{GradleConnector, ProjectConnection} import org.gradle.tooling.model.GradleProject import org.gradle.tooling.model.build.BuildEnvironment @@ -10,7 +10,7 @@ import java.io.ByteArrayOutputStream import java.nio.file.{Files, Path} import java.io.{File => JFile} import java.util.stream.Collectors -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.util.{Failure, Random, Success, Try, Using} case class GradleProjectInfo(gradleVersion: String, tasks: Seq[String], hasAndroidSubproject: Boolean = false) { diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/AstTests.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/AstTests.scala index 86fbb6c1860c..13d704a50c23 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/AstTests.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/AstTests.scala @@ -1,6 +1,6 @@ package io.joern.x2cpg -import io.shiftleft.codepropertygraph.generated.nodes.{AstNodeNew, NewCall, NewClosureBinding, NewIdentifier} +import io.shiftleft.codepropertygraph.generated.nodes.{AstNodeNew, Call, NewCall, NewClosureBinding, NewIdentifier} import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec import overflowdb.SchemaViolationException @@ -35,7 +35,7 @@ class AstTests extends AnyWordSpec with Matchers { copied.root match { case Some(root: NewCall) => root should not be Some(moo) - root.properties("NAME") shouldBe "moo" + root.properties(Call.PropertyNames.Name) shouldBe "moo" root.argumentIndex shouldBe 123 case _ => fail() } diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/SourceFilesTests.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/SourceFilesTests.scala index 2ebc2ffab906..337023202534 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/SourceFilesTests.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/SourceFilesTests.scala @@ -1,6 +1,6 @@ package io.joern.x2cpg -import better.files._ +import better.files.* import io.joern.x2cpg.utils.IgnoreInWindows import io.shiftleft.utils.ProjectRoot import org.scalatest.matchers.should.Matchers @@ -8,7 +8,7 @@ import org.scalatest.wordspec.AnyWordSpec import org.scalatest.Inside import java.nio.file.attribute.PosixFilePermissions -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.util.Try import java.io.FileNotFoundException diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/X2CpgTests.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/X2CpgTests.scala index 18ea217c43ef..d220842742d2 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/X2CpgTests.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/X2CpgTests.scala @@ -22,9 +22,9 @@ class X2CpgTests extends AnyWordSpec with Matchers { file.delete() file.exists shouldBe false val cpg = X2Cpg.newEmptyCpg(Some(file.path.toString)) + cpg.close() file.exists shouldBe true Files.size(file.path) should not be 0 - cpg.close() } "overwrite existing file to create empty CPG" in { @@ -34,9 +34,9 @@ class X2CpgTests extends AnyWordSpec with Matchers { val cpg = X2Cpg.newEmptyCpg(Some(file.path.toString)) cpg.graph.V.hasNext shouldBe false cpg.graph.E.hasNext shouldBe false + cpg.close() file.exists shouldBe true Files.size(file.path) should not be 0 - cpg.close() } } } diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/CfgDominatorFrontierTests.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/CfgDominatorFrontierTests.scala index 9b4d4e59c4d5..07c13d7a31b6 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/CfgDominatorFrontierTests.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/CfgDominatorFrontierTests.scala @@ -4,9 +4,9 @@ import io.shiftleft.OverflowDbTestInstance import io.joern.x2cpg.passes.controlflow.cfgdominator.{CfgAdapter, CfgDominator, CfgDominatorFrontier, DomTreeAdapter} import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import overflowdb._ +import overflowdb.* -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class CfgDominatorFrontierTests extends AnyWordSpec with Matchers { diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/CfgDominatorPassTests.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/CfgDominatorPassTests.scala index c8955335485a..59f92d169999 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/CfgDominatorPassTests.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/CfgDominatorPassTests.scala @@ -6,9 +6,9 @@ import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes} import io.joern.x2cpg.passes.controlflow.cfgdominator.CfgDominatorPass import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import overflowdb._ +import overflowdb.* -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class CfgDominatorPassTests extends AnyWordSpec with Matchers { "Have correct DOMINATE/POST_DOMINATE edges after CfgDominatorPass run." in { diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/ContainsEdgePassTest.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/ContainsEdgePassTest.scala index 329ccb09d32a..a88b49de7876 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/ContainsEdgePassTest.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/ContainsEdgePassTest.scala @@ -6,9 +6,9 @@ import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes} import io.joern.x2cpg.passes.base.ContainsEdgePass import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import overflowdb._ +import overflowdb.* -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class ContainsEdgePassTest extends AnyWordSpec with Matchers { diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/MemberAccessLinkerTests.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/MemberAccessLinkerTests.scala index cf9a848532ef..208e89d2850c 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/MemberAccessLinkerTests.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/MemberAccessLinkerTests.scala @@ -1,8 +1,8 @@ package io.joern.x2cpg.passes -import io.shiftleft.codepropertygraph.generated._ +import io.shiftleft.codepropertygraph.generated.* import io.shiftleft.codepropertygraph.generated.nodes.{NewCall, NewMember} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/MethodDecoratorPassTests.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/MethodDecoratorPassTests.scala index ac281490f0ee..1864a5952254 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/MethodDecoratorPassTests.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/MethodDecoratorPassTests.scala @@ -1,13 +1,13 @@ package io.joern.x2cpg.passes import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated._ +import io.shiftleft.codepropertygraph.generated.* import io.shiftleft.codepropertygraph.generated.nodes.MethodParameterIn import io.joern.x2cpg.passes.base.MethodDecoratorPass import io.joern.x2cpg.testfixtures.EmptyGraphFixture import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import overflowdb._ +import overflowdb.* class MethodDecoratorPassTests extends AnyWordSpec with Matchers { "MethodDecoratorTest" in EmptyGraphFixture { graph => diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/NamespaceCreatorTests.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/NamespaceCreatorTests.scala index 63e0d7ec1e86..d4e7d0a39a77 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/NamespaceCreatorTests.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/passes/NamespaceCreatorTests.scala @@ -2,12 +2,12 @@ package io.joern.x2cpg.passes import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.{NodeTypes, Properties} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.joern.x2cpg.passes.base.NamespaceCreator import io.joern.x2cpg.testfixtures.EmptyGraphFixture import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import overflowdb._ +import overflowdb.* class NamespaceCreatorTests extends AnyWordSpec with Matchers { "NamespaceCreateor test " in EmptyGraphFixture { graph => diff --git a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/testfixtures/CfgTestFixture.scala b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/testfixtures/CfgTestFixture.scala index 14c57a6fb97f..b8292db40bb4 100644 --- a/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/testfixtures/CfgTestFixture.scala +++ b/joern-cli/frontends/x2cpg/src/test/scala/io/joern/x2cpg/testfixtures/CfgTestFixture.scala @@ -4,7 +4,7 @@ import io.joern.x2cpg.passes.controlflow.CfgCreationPass import io.joern.x2cpg.passes.controlflow.cfgcreation.Cfg.CfgEdgeType import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{CfgNode, Method} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* abstract class CfgTestCpg extends TestCpg { override protected def applyPasses(): Unit = { @@ -30,7 +30,7 @@ class CfgTestFixture[T <: CfgTestCpg](testCpgFactory: () => T) extends Code2CpgF ExpectationInfo(pair._1, pair._2, pair._3) } - def expected(pairs: ExpectationInfo*)(implicit cpg: Cpg): Set[String] = { + def expected(pairs: ExpectationInfo*)(implicit cpg: Cpg): List[String] = { pairs.map { case ExpectationInfo(code, index, _) => cpg.method.ast.isCfgNode.toVector .collect { @@ -38,11 +38,11 @@ class CfgTestFixture[T <: CfgTestCpg](testCpgFactory: () => T) extends Code2CpgF } .lift(index) .getOrElse(fail(s"No node found for code = '$code' and index '$index'!")) - }.toSet + }.toList } // index is zero based and describes which node to take if multiple node match the code string. - def succOf(code: String, index: Int = 0)(implicit cpg: Cpg): Set[String] = { + def succOf(code: String, index: Int = 0)(implicit cpg: Cpg): List[String] = { cpg.method.ast.isCfgNode.toVector .collect { case node if matchCode(node, code) => node @@ -52,10 +52,10 @@ class CfgTestFixture[T <: CfgTestCpg](testCpgFactory: () => T) extends Code2CpgF ._cfgOut .cast[CfgNode] .code - .toSetImmutable + .toList } - def succOf(code: String, nodeType: String)(implicit cpg: Cpg): Set[String] = { + def succOf(code: String, nodeType: String)(implicit cpg: Cpg): List[String] = { cpg.method.ast.isCfgNode .label(nodeType) .toVector @@ -66,6 +66,6 @@ class CfgTestFixture[T <: CfgTestCpg](testCpgFactory: () => T) extends Code2CpgF ._cfgOut .cast[CfgNode] .code - .toSetImmutable + .toList } } diff --git a/joern-cli/src/main/scala/io/joern/joerncli/CpgBasedTool.scala b/joern-cli/src/main/scala/io/joern/joerncli/CpgBasedTool.scala index d40ae3550443..ba82da57fed9 100644 --- a/joern-cli/src/main/scala/io/joern/joerncli/CpgBasedTool.scala +++ b/joern-cli/src/main/scala/io/joern/joerncli/CpgBasedTool.scala @@ -6,7 +6,7 @@ import io.joern.dataflowengineoss.semanticsloader.Semantics import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.cpgloading.CpgLoaderConfig import io.shiftleft.semanticcpg.layers.LayerCreatorContext -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* object CpgBasedTool { diff --git a/joern-cli/src/main/scala/io/joern/joerncli/DefaultOverlays.scala b/joern-cli/src/main/scala/io/joern/joerncli/DefaultOverlays.scala index 4cc406f104d5..920bb131f49b 100644 --- a/joern-cli/src/main/scala/io/joern/joerncli/DefaultOverlays.scala +++ b/joern-cli/src/main/scala/io/joern/joerncli/DefaultOverlays.scala @@ -3,7 +3,7 @@ package io.joern.joerncli import io.joern.dataflowengineoss.layers.dataflows.{OssDataFlow, OssDataFlowOptions} import io.joern.x2cpg.X2Cpg.applyDefaultOverlays import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.layers._ +import io.shiftleft.semanticcpg.layers.* object DefaultOverlays { diff --git a/joern-cli/src/main/scala/io/joern/joerncli/JoernParse.scala b/joern-cli/src/main/scala/io/joern/joerncli/JoernParse.scala index 34e2ff7a2889..3173559d7e02 100644 --- a/joern-cli/src/main/scala/io/joern/joerncli/JoernParse.scala +++ b/joern-cli/src/main/scala/io/joern/joerncli/JoernParse.scala @@ -7,7 +7,7 @@ import io.joern.joerncli.CpgBasedTool.newCpgCreatedString import io.shiftleft.codepropertygraph.generated.Languages import scala.collection.mutable -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.util.{Failure, Success, Try} object JoernParse { diff --git a/joern-cli/src/main/scala/io/joern/joerncli/JoernScan.scala b/joern-cli/src/main/scala/io/joern/joerncli/JoernScan.scala index c5728589c15a..5b7c2232f102 100644 --- a/joern-cli/src/main/scala/io/joern/joerncli/JoernScan.scala +++ b/joern-cli/src/main/scala/io/joern/joerncli/JoernScan.scala @@ -15,7 +15,7 @@ import java.io.PrintStream import org.json4s.native.Serialization import org.json4s.{Formats, NoTypeHints} import scala.collection.mutable -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* object JoernScanConfig { val defaultDbVersion: String = "latest" diff --git a/joern-cli/src/main/scala/io/joern/joerncli/console/JoernConsole.scala b/joern-cli/src/main/scala/io/joern/joerncli/console/JoernConsole.scala index 93b7ce1a7bc5..607e9a3074aa 100644 --- a/joern-cli/src/main/scala/io/joern/joerncli/console/JoernConsole.scala +++ b/joern-cli/src/main/scala/io/joern/joerncli/console/JoernConsole.scala @@ -1,6 +1,6 @@ package io.joern.joerncli.console -import better.files._ +import better.files.* import io.joern.console.defaultAvailableWidthProvider import io.joern.console.workspacehandling.{ProjectFile, WorkspaceLoader} import io.joern.console.{Console, ConsoleConfig, InstallConfig} diff --git a/joern-cli/src/test/scala/io/joern/joerncli/GenerationTests.scala b/joern-cli/src/test/scala/io/joern/joerncli/GenerationTests.scala index 6cf0a8e14e88..3f6ae67c4ba8 100644 --- a/joern-cli/src/test/scala/io/joern/joerncli/GenerationTests.scala +++ b/joern-cli/src/test/scala/io/joern/joerncli/GenerationTests.scala @@ -1,7 +1,7 @@ package io.joern.joerncli import better.files.File -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/joern-cli/src/universal/schema-extender/project/FileUtils.scala b/joern-cli/src/universal/schema-extender/project/FileUtils.scala index dc61c44afee2..4bd8aaae7980 100644 --- a/joern-cli/src/universal/schema-extender/project/FileUtils.scala +++ b/joern-cli/src/universal/schema-extender/project/FileUtils.scala @@ -1,6 +1,6 @@ import java.io.File import java.nio.file.Files -import scala.collection.JavaConverters._ +import scala.collection.JavaConverters.* object FileUtils { diff --git a/joern-cli/src/universal/schema-extender/schema/src/main/scala/CpgExtCodegen.scala b/joern-cli/src/universal/schema-extender/schema/src/main/scala/CpgExtCodegen.scala index a94cfedd5857..2b8cba9f6fd2 100644 --- a/joern-cli/src/universal/schema-extender/schema/src/main/scala/CpgExtCodegen.scala +++ b/joern-cli/src/universal/schema-extender/schema/src/main/scala/CpgExtCodegen.scala @@ -1,4 +1,4 @@ -import io.shiftleft.codepropertygraph.schema._ +import io.shiftleft.codepropertygraph.schema.* import overflowdb.codegen.CodeGen import overflowdb.schema.SchemaBuilder import overflowdb.schema.Property.ValueType diff --git a/joern-install.sh b/joern-install.sh index 487177c9cd0d..e3734fec69a9 100755 --- a/joern-install.sh +++ b/joern-install.sh @@ -190,7 +190,6 @@ else sudo ln -sf "$JOERN_INSTALL_DIR"/joern-cli/joern-export "$JOERN_LINK_DIR" || true sudo ln -sf "$JOERN_INSTALL_DIR"/joern-cli/joern-flow "$JOERN_LINK_DIR" || true sudo ln -sf "$JOERN_INSTALL_DIR"/joern-cli/joern-scan "$JOERN_LINK_DIR" || true - sudo ln -sf "$JOERN_INSTALL_DIR"/joern-cli/joern-stats "$JOERN_LINK_DIR" || true sudo ln -sf "$JOERN_INSTALL_DIR"/joern-cli/joern-slice "$JOERN_LINK_DIR" || true fi fi diff --git a/macros/src/main/scala/io/joern/console/QueryDatabase.scala b/macros/src/main/scala/io/joern/console/QueryDatabase.scala index 31ca139b5c13..54933ef15478 100644 --- a/macros/src/main/scala/io/joern/console/QueryDatabase.scala +++ b/macros/src/main/scala/io/joern/console/QueryDatabase.scala @@ -5,7 +5,7 @@ import org.reflections8.util.{ClasspathHelper, ConfigurationBuilder} import java.lang.reflect.{Method, Parameter} import scala.annotation.unused -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* trait QueryBundle diff --git a/macros/src/test/scala/io/joern/console/QueryDatabaseTests.scala b/macros/src/test/scala/io/joern/console/QueryDatabaseTests.scala index 6f026090c225..3dd84bca6ed0 100644 --- a/macros/src/test/scala/io/joern/console/QueryDatabaseTests.scala +++ b/macros/src/test/scala/io/joern/console/QueryDatabaseTests.scala @@ -1,7 +1,7 @@ package io.joern.console import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import org.scalatest.matchers.should import org.scalatest.wordspec.AnyWordSpec diff --git a/macros/src/test/scala/io/joern/macros/QueryMacroTests.scala b/macros/src/test/scala/io/joern/macros/QueryMacroTests.scala index 5476f9eaa48b..254a7cd3ae9d 100644 --- a/macros/src/test/scala/io/joern/macros/QueryMacroTests.scala +++ b/macros/src/test/scala/io/joern/macros/QueryMacroTests.scala @@ -4,8 +4,8 @@ import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec import io.joern.macros.QueryMacros.withStrRep -import io.joern.console._ -import io.shiftleft.semanticcpg.language._ +import io.joern.console.* +import io.shiftleft.semanticcpg.language.* class QueryMacroTests extends AnyWordSpec with Matchers { "Query macros" should { diff --git a/project/build.properties b/project/build.properties index 081fdbbc7625..ee4c672cd0d7 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.0 +sbt.version=1.10.1 diff --git a/querydb/src/main/scala/io/joern/scanners/android/ArbitraryFileWrites.scala b/querydb/src/main/scala/io/joern/scanners/android/ArbitraryFileWrites.scala index 97e78f177457..987085152d4f 100644 --- a/querydb/src/main/scala/io/joern/scanners/android/ArbitraryFileWrites.scala +++ b/querydb/src/main/scala/io/joern/scanners/android/ArbitraryFileWrites.scala @@ -1,12 +1,12 @@ package io.joern.scanners.android -import io.joern.scanners._ -import io.joern.console._ +import io.joern.scanners.* +import io.joern.console.* import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* object ArbitraryFileWrites extends QueryBundle { implicit val engineContext: EngineContext = EngineContext(Semantics.empty) diff --git a/querydb/src/main/scala/io/joern/scanners/android/Intents.scala b/querydb/src/main/scala/io/joern/scanners/android/Intents.scala index 2b8de93a286e..aa7876897324 100644 --- a/querydb/src/main/scala/io/joern/scanners/android/Intents.scala +++ b/querydb/src/main/scala/io/joern/scanners/android/Intents.scala @@ -1,12 +1,12 @@ package io.joern.scanners.android -import io.joern.scanners._ -import io.joern.console._ +import io.joern.scanners.* +import io.joern.console.* import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* object Intents extends QueryBundle { implicit val engineContext: EngineContext = EngineContext(Semantics.empty) diff --git a/querydb/src/main/scala/io/joern/scanners/android/RootDetection.scala b/querydb/src/main/scala/io/joern/scanners/android/RootDetection.scala index 4586fcccb094..587e1a08adce 100644 --- a/querydb/src/main/scala/io/joern/scanners/android/RootDetection.scala +++ b/querydb/src/main/scala/io/joern/scanners/android/RootDetection.scala @@ -1,12 +1,12 @@ package io.joern.scanners.android -import io.joern.scanners._ -import io.joern.console._ +import io.joern.scanners.* +import io.joern.console.* import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* object RootDetection extends QueryBundle { implicit val engineContext: EngineContext = EngineContext(Semantics.empty) diff --git a/querydb/src/main/scala/io/joern/scanners/android/UnsafeReflection.scala b/querydb/src/main/scala/io/joern/scanners/android/UnsafeReflection.scala index a9c3ec5c3d5b..1152afd803c4 100644 --- a/querydb/src/main/scala/io/joern/scanners/android/UnsafeReflection.scala +++ b/querydb/src/main/scala/io/joern/scanners/android/UnsafeReflection.scala @@ -1,11 +1,11 @@ package io.joern.scanners.android -import io.joern.scanners._ -import io.joern.console._ +import io.joern.scanners.* +import io.joern.console.* import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* object UnsafeReflection extends QueryBundle { implicit val engineContext: EngineContext = EngineContext(Semantics.empty) diff --git a/querydb/src/main/scala/io/joern/scanners/c/CopyLoops.scala b/querydb/src/main/scala/io/joern/scanners/c/CopyLoops.scala index 7b00fb2a9c5a..4495ece033a7 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/CopyLoops.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/CopyLoops.scala @@ -1,9 +1,9 @@ package io.joern.scanners.c -import io.joern.scanners._ -import io.joern.console._ -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ +import io.joern.scanners.* +import io.joern.console.* +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* object CopyLoops extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/CredentialDrop.scala b/querydb/src/main/scala/io/joern/scanners/c/CredentialDrop.scala index 966cc3d79022..c8d9cb07c5db 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/CredentialDrop.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/CredentialDrop.scala @@ -1,9 +1,9 @@ package io.joern.scanners.c -import io.joern.scanners._ -import io.joern.console._ -import io.shiftleft.semanticcpg.language._ -import io.joern.macros.QueryMacros._ +import io.joern.scanners.* +import io.joern.console.* +import io.shiftleft.semanticcpg.language.* +import io.joern.macros.QueryMacros.* object CredentialDrop extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/DangerousFunctions.scala b/querydb/src/main/scala/io/joern/scanners/c/DangerousFunctions.scala index 9ef4d463a9ee..cd54e9a76625 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/DangerousFunctions.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/DangerousFunctions.scala @@ -1,9 +1,9 @@ package io.joern.scanners.c -import io.joern.scanners._ -import io.joern.console._ -import io.shiftleft.semanticcpg.language._ -import io.joern.macros.QueryMacros._ +import io.joern.scanners.* +import io.joern.console.* +import io.shiftleft.semanticcpg.language.* +import io.joern.macros.QueryMacros.* object DangerousFunctions extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/HeapBasedOverflow.scala b/querydb/src/main/scala/io/joern/scanners/c/HeapBasedOverflow.scala index e7e58ca2933c..a85f2a7fc060 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/HeapBasedOverflow.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/HeapBasedOverflow.scala @@ -1,12 +1,12 @@ package io.joern.scanners.c -import io.joern.scanners._ +import io.joern.scanners.* import io.joern.dataflowengineoss.queryengine.EngineContext -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ -import io.joern.console._ +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* +import io.joern.console.* import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.joern.macros.QueryMacros._ +import io.joern.macros.QueryMacros.* object HeapBasedOverflow extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/IntegerTruncations.scala b/querydb/src/main/scala/io/joern/scanners/c/IntegerTruncations.scala index 3f5bfe035b2b..405bd68b7ebb 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/IntegerTruncations.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/IntegerTruncations.scala @@ -1,9 +1,9 @@ package io.joern.scanners.c -import io.joern.scanners._ -import io.shiftleft.semanticcpg.language._ -import io.joern.console._ -import io.joern.macros.QueryMacros._ +import io.joern.scanners.* +import io.shiftleft.semanticcpg.language.* +import io.joern.console.* +import io.joern.macros.QueryMacros.* object IntegerTruncations extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/Metrics.scala b/querydb/src/main/scala/io/joern/scanners/c/Metrics.scala index 7cc521612c18..96acd023b041 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/Metrics.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/Metrics.scala @@ -1,9 +1,9 @@ package io.joern.scanners.c -import io.joern.scanners._ -import io.joern.console._ -import io.shiftleft.semanticcpg.language._ -import io.joern.macros.QueryMacros._ +import io.joern.scanners.* +import io.joern.console.* +import io.shiftleft.semanticcpg.language.* +import io.joern.macros.QueryMacros.* object Metrics extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/MissingLengthCheck.scala b/querydb/src/main/scala/io/joern/scanners/c/MissingLengthCheck.scala index ed6b7d17dd92..f82855e5866f 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/MissingLengthCheck.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/MissingLengthCheck.scala @@ -1,14 +1,14 @@ package io.joern.scanners.c import io.shiftleft.semanticcpg.language.{ICallResolver, NoResolve} -import io.joern.scanners._ -import io.joern.console._ +import io.joern.scanners.* +import io.joern.console.* import io.shiftleft.codepropertygraph.generated.nodes import io.joern.dataflowengineoss.queryengine.EngineContext -import io.shiftleft.semanticcpg.language._ -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language.operatorextension._ -import QueryLangExtensions._ +import io.shiftleft.semanticcpg.language.* +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.operatorextension.* +import QueryLangExtensions.* object MissingLengthCheck extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/NullTermination.scala b/querydb/src/main/scala/io/joern/scanners/c/NullTermination.scala index 99bbc63a5b3d..301981588d03 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/NullTermination.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/NullTermination.scala @@ -1,12 +1,12 @@ package io.joern.scanners.c import io.joern.scanners.{Crew, QueryTags} -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ -import io.joern.console._ +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* +import io.joern.console.* import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.joern.macros.QueryMacros._ +import io.joern.macros.QueryMacros.* object NullTermination extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/RetvalChecks.scala b/querydb/src/main/scala/io/joern/scanners/c/RetvalChecks.scala index ca0c9e3eaf7d..479ea0c060f8 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/RetvalChecks.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/RetvalChecks.scala @@ -1,10 +1,10 @@ package io.joern.scanners.c import io.joern.scanners.{Crew, QueryTags} -import io.joern.console._ -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ -import QueryLangExtensions._ +import io.joern.console.* +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* +import QueryLangExtensions.* object RetvalChecks extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/SignedLeftShift.scala b/querydb/src/main/scala/io/joern/scanners/c/SignedLeftShift.scala index 232da036f815..7730e7236342 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/SignedLeftShift.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/SignedLeftShift.scala @@ -1,10 +1,10 @@ package io.joern.scanners.c -import io.joern.scanners._ +import io.joern.scanners.* import io.shiftleft.codepropertygraph.generated.Operators -import io.joern.console._ -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ +import io.joern.console.* +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* object SignedLeftShift extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/c/SocketApi.scala b/querydb/src/main/scala/io/joern/scanners/c/SocketApi.scala index 9fe1d3901450..db5cc5171738 100644 --- a/querydb/src/main/scala/io/joern/scanners/c/SocketApi.scala +++ b/querydb/src/main/scala/io/joern/scanners/c/SocketApi.scala @@ -1,11 +1,11 @@ package io.joern.scanners.c import io.joern.scanners.{Crew, QueryTags} -import io.joern.console._ +import io.joern.console.* import io.joern.dataflowengineoss.queryengine.EngineContext -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ -import QueryLangExtensions._ +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* +import QueryLangExtensions.* object SocketApi extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/ghidra/DangerousFunctions.scala b/querydb/src/main/scala/io/joern/scanners/ghidra/DangerousFunctions.scala index 16216093a627..0ccebc7be7ef 100644 --- a/querydb/src/main/scala/io/joern/scanners/ghidra/DangerousFunctions.scala +++ b/querydb/src/main/scala/io/joern/scanners/ghidra/DangerousFunctions.scala @@ -1,9 +1,9 @@ package io.joern.scanners.ghidra -import io.joern.scanners._ -import io.joern.console._ -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ +import io.joern.scanners.* +import io.joern.console.* +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* object DangerousFunctions extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/ghidra/UserInputIntoDangerousFunctions.scala b/querydb/src/main/scala/io/joern/scanners/ghidra/UserInputIntoDangerousFunctions.scala index 21310c543181..3c47d454a90c 100644 --- a/querydb/src/main/scala/io/joern/scanners/ghidra/UserInputIntoDangerousFunctions.scala +++ b/querydb/src/main/scala/io/joern/scanners/ghidra/UserInputIntoDangerousFunctions.scala @@ -1,10 +1,10 @@ package io.joern.scanners.ghidra -import io.joern.scanners._ -import io.joern.console._ -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ -import io.joern.dataflowengineoss.language._ +import io.joern.scanners.* +import io.joern.console.* +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.queryengine.EngineContext object UserInputIntoDangerousFunctions extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/java/CrossSiteScripting.scala b/querydb/src/main/scala/io/joern/scanners/java/CrossSiteScripting.scala index e7265c367e12..66cfe2fe7f28 100644 --- a/querydb/src/main/scala/io/joern/scanners/java/CrossSiteScripting.scala +++ b/querydb/src/main/scala/io/joern/scanners/java/CrossSiteScripting.scala @@ -1,10 +1,10 @@ package io.joern.scanners.java -import io.joern.scanners._ -import io.shiftleft.semanticcpg.language._ -import io.joern.console._ -import io.joern.macros.QueryMacros._ -import io.joern.dataflowengineoss.language._ +import io.joern.scanners.* +import io.shiftleft.semanticcpg.language.* +import io.joern.console.* +import io.joern.macros.QueryMacros.* +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.queryengine.EngineContext object CrossSiteScripting extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/java/CryptographyMisuse.scala b/querydb/src/main/scala/io/joern/scanners/java/CryptographyMisuse.scala index 1e43586657f0..5b96efcabfbb 100644 --- a/querydb/src/main/scala/io/joern/scanners/java/CryptographyMisuse.scala +++ b/querydb/src/main/scala/io/joern/scanners/java/CryptographyMisuse.scala @@ -1,10 +1,10 @@ package io.joern.scanners.java -import io.joern.scanners._ -import io.shiftleft.semanticcpg.language._ -import io.joern.console._ -import io.joern.macros.QueryMacros._ -import io.joern.dataflowengineoss.language._ +import io.joern.scanners.* +import io.shiftleft.semanticcpg.language.* +import io.joern.console.* +import io.joern.macros.QueryMacros.* +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.queryengine.EngineContext /** @see diff --git a/querydb/src/main/scala/io/joern/scanners/java/DangerousFunctions.scala b/querydb/src/main/scala/io/joern/scanners/java/DangerousFunctions.scala index cdfabc11b03f..ccee98ccbf3a 100644 --- a/querydb/src/main/scala/io/joern/scanners/java/DangerousFunctions.scala +++ b/querydb/src/main/scala/io/joern/scanners/java/DangerousFunctions.scala @@ -1,9 +1,9 @@ package io.joern.scanners.java -import io.joern.scanners._ -import io.shiftleft.semanticcpg.language._ -import io.joern.console._ -import io.joern.macros.QueryMacros._ +import io.joern.scanners.* +import io.shiftleft.semanticcpg.language.* +import io.joern.console.* +import io.joern.macros.QueryMacros.* object DangerousFunctions extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/java/SQLInjection.scala b/querydb/src/main/scala/io/joern/scanners/java/SQLInjection.scala index 67aebe735261..fa987cfd722e 100644 --- a/querydb/src/main/scala/io/joern/scanners/java/SQLInjection.scala +++ b/querydb/src/main/scala/io/joern/scanners/java/SQLInjection.scala @@ -1,10 +1,10 @@ package io.joern.scanners.java -import io.joern.scanners._ -import io.shiftleft.semanticcpg.language._ -import io.joern.console._ -import io.joern.macros.QueryMacros._ -import io.joern.dataflowengineoss.language._ +import io.joern.scanners.* +import io.shiftleft.semanticcpg.language.* +import io.joern.console.* +import io.joern.macros.QueryMacros.* +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.queryengine.EngineContext // The queries are tied to springframework diff --git a/querydb/src/main/scala/io/joern/scanners/kotlin/NetworkCommunication.scala b/querydb/src/main/scala/io/joern/scanners/kotlin/NetworkCommunication.scala index 2f31e6c2800d..34a71b4fe9c9 100644 --- a/querydb/src/main/scala/io/joern/scanners/kotlin/NetworkCommunication.scala +++ b/querydb/src/main/scala/io/joern/scanners/kotlin/NetworkCommunication.scala @@ -1,13 +1,13 @@ package io.joern.scanners.kotlin -import io.joern.scanners._ -import io.joern.console._ +import io.joern.scanners.* +import io.joern.console.* import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.joern.dataflowengineoss.language._ -import io.joern.macros.QueryMacros._ +import io.joern.dataflowengineoss.language.* +import io.joern.macros.QueryMacros.* import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* object NetworkCommunication extends QueryBundle { implicit val engineContext: EngineContext = EngineContext(Semantics.empty) diff --git a/querydb/src/main/scala/io/joern/scanners/kotlin/PathTraversals.scala b/querydb/src/main/scala/io/joern/scanners/kotlin/PathTraversals.scala index fe64c33c1203..c977a5c7795b 100644 --- a/querydb/src/main/scala/io/joern/scanners/kotlin/PathTraversals.scala +++ b/querydb/src/main/scala/io/joern/scanners/kotlin/PathTraversals.scala @@ -1,12 +1,12 @@ package io.joern.scanners.kotlin -import io.joern.scanners._ -import io.joern.console._ +import io.joern.scanners.* +import io.joern.console.* import io.joern.dataflowengineoss.queryengine.EngineContext import io.joern.dataflowengineoss.semanticsloader.Semantics -import io.joern.dataflowengineoss.language._ -import io.joern.macros.QueryMacros._ -import io.shiftleft.semanticcpg.language._ +import io.joern.dataflowengineoss.language.* +import io.joern.macros.QueryMacros.* +import io.shiftleft.semanticcpg.language.* object PathTraversals extends QueryBundle { implicit val engineContext: EngineContext = EngineContext(Semantics.empty) diff --git a/querydb/src/main/scala/io/joern/scanners/php/SQLInjection.scala b/querydb/src/main/scala/io/joern/scanners/php/SQLInjection.scala index 0829f18301c0..7fbaa232ad3d 100644 --- a/querydb/src/main/scala/io/joern/scanners/php/SQLInjection.scala +++ b/querydb/src/main/scala/io/joern/scanners/php/SQLInjection.scala @@ -1,12 +1,12 @@ package io.joern.scanners.php -import io.joern.console._ -import io.joern.dataflowengineoss.language._ +import io.joern.console.* +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.queryengine.EngineContext -import io.joern.macros.QueryMacros._ -import io.joern.scanners._ +import io.joern.macros.QueryMacros.* +import io.joern.scanners.* import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* object SQLInjection extends QueryBundle { diff --git a/querydb/src/main/scala/io/joern/scanners/php/ShellExec.scala b/querydb/src/main/scala/io/joern/scanners/php/ShellExec.scala index 923538116f84..cbf2854c4c56 100644 --- a/querydb/src/main/scala/io/joern/scanners/php/ShellExec.scala +++ b/querydb/src/main/scala/io/joern/scanners/php/ShellExec.scala @@ -1,12 +1,12 @@ package io.joern.scanners.php -import io.joern.console._ -import io.joern.dataflowengineoss.language._ +import io.joern.console.* +import io.joern.dataflowengineoss.language.* import io.joern.dataflowengineoss.queryengine.EngineContext -import io.joern.macros.QueryMacros._ -import io.joern.scanners._ +import io.joern.macros.QueryMacros.* +import io.joern.scanners.* import io.shiftleft.codepropertygraph.generated.Operators -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* object ShellExec extends QueryBundle { diff --git a/querydb/src/test/scala/io/joern/scanners/android/UnprotectedAppPartsTests.scala b/querydb/src/test/scala/io/joern/scanners/android/UnprotectedAppPartsTests.scala index 81d807064d2f..c013457a12fa 100644 --- a/querydb/src/test/scala/io/joern/scanners/android/UnprotectedAppPartsTests.scala +++ b/querydb/src/test/scala/io/joern/scanners/android/UnprotectedAppPartsTests.scala @@ -1,9 +1,9 @@ package io.joern.scanners.android -import io.joern.console.scan._ +import io.joern.console.scan.* import io.shiftleft.codepropertygraph.generated.nodes.CfgNode import io.joern.suites.KotlinQueryTestSuite -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class UnprotectedAppPartsTests extends KotlinQueryTestSuite(UnprotectedAppParts) { diff --git a/querydb/src/test/scala/io/joern/scanners/c/CopyLoopTests.scala b/querydb/src/test/scala/io/joern/scanners/c/CopyLoopTests.scala index 4c20bd6d4791..82520686a738 100644 --- a/querydb/src/test/scala/io/joern/scanners/c/CopyLoopTests.scala +++ b/querydb/src/test/scala/io/joern/scanners/c/CopyLoopTests.scala @@ -2,8 +2,8 @@ package io.joern.scanners.c import io.joern.suites.CQueryTestSuite import io.shiftleft.codepropertygraph.generated.nodes -import io.shiftleft.semanticcpg.language._ -import io.joern.console.scan._ +import io.shiftleft.semanticcpg.language.* +import io.joern.console.scan.* class CopyLoopTests extends CQueryTestSuite(CopyLoops) { diff --git a/querydb/src/test/scala/io/joern/scanners/c/HeapBasedOverflowTests.scala b/querydb/src/test/scala/io/joern/scanners/c/HeapBasedOverflowTests.scala index b583fc4ddf61..b28669fd07f0 100644 --- a/querydb/src/test/scala/io/joern/scanners/c/HeapBasedOverflowTests.scala +++ b/querydb/src/test/scala/io/joern/scanners/c/HeapBasedOverflowTests.scala @@ -2,7 +2,7 @@ package io.joern.scanners.c import io.joern.suites.CQueryTestSuite import io.shiftleft.codepropertygraph.generated.nodes -import io.joern.console.scan._ +import io.joern.console.scan.* class HeapBasedOverflowTests extends CQueryTestSuite(HeapBasedOverflow) { diff --git a/querydb/src/test/scala/io/joern/scanners/c/IntegerTruncationsTests.scala b/querydb/src/test/scala/io/joern/scanners/c/IntegerTruncationsTests.scala index b4fac1fd3913..9e3b5d177c99 100644 --- a/querydb/src/test/scala/io/joern/scanners/c/IntegerTruncationsTests.scala +++ b/querydb/src/test/scala/io/joern/scanners/c/IntegerTruncationsTests.scala @@ -2,8 +2,8 @@ package io.joern.scanners.c import io.joern.suites.CQueryTestSuite import io.shiftleft.codepropertygraph.generated.nodes -import io.shiftleft.semanticcpg.language._ -import io.joern.console.scan._ +import io.shiftleft.semanticcpg.language.* +import io.joern.console.scan.* class IntegerTruncationsTests extends CQueryTestSuite(IntegerTruncations) { diff --git a/querydb/src/test/scala/io/joern/scanners/c/MetricsTests.scala b/querydb/src/test/scala/io/joern/scanners/c/MetricsTests.scala index 91d0dd61d4eb..1815c24ba2e0 100644 --- a/querydb/src/test/scala/io/joern/scanners/c/MetricsTests.scala +++ b/querydb/src/test/scala/io/joern/scanners/c/MetricsTests.scala @@ -2,7 +2,7 @@ package io.joern.scanners.c import io.joern.suites.CQueryTestSuite import io.shiftleft.codepropertygraph.generated.nodes -import io.joern.console.scan._ +import io.joern.console.scan.* class MetricsTests extends CQueryTestSuite(Metrics) { diff --git a/querydb/src/test/scala/io/joern/scanners/c/NullTerminationTests.scala b/querydb/src/test/scala/io/joern/scanners/c/NullTerminationTests.scala index 139c01859aec..327618fd92f8 100644 --- a/querydb/src/test/scala/io/joern/scanners/c/NullTerminationTests.scala +++ b/querydb/src/test/scala/io/joern/scanners/c/NullTerminationTests.scala @@ -2,8 +2,8 @@ package io.joern.scanners.c import io.joern.suites.CQueryTestSuite import io.shiftleft.codepropertygraph.generated.nodes -import io.shiftleft.semanticcpg.language._ -import io.joern.console.scan._ +import io.shiftleft.semanticcpg.language.* +import io.joern.console.scan.* class NullTerminationTests extends CQueryTestSuite(NullTermination) { diff --git a/querydb/src/test/scala/io/joern/scanners/c/QueryWithReachableBy.scala b/querydb/src/test/scala/io/joern/scanners/c/QueryWithReachableBy.scala index 6a6d21b311df..6eff6c970a4f 100644 --- a/querydb/src/test/scala/io/joern/scanners/c/QueryWithReachableBy.scala +++ b/querydb/src/test/scala/io/joern/scanners/c/QueryWithReachableBy.scala @@ -1,10 +1,10 @@ package io.joern.scanners.c -import io.joern.scanners._ -import io.joern.console._ -import io.joern.dataflowengineoss.language._ -import io.shiftleft.semanticcpg.language._ -import io.joern.macros.QueryMacros._ +import io.joern.scanners.* +import io.joern.console.* +import io.joern.dataflowengineoss.language.* +import io.shiftleft.semanticcpg.language.* +import io.joern.macros.QueryMacros.* import io.joern.dataflowengineoss.queryengine.EngineContext /** Just to make sure that we support reachableBy queries, which did not work before diff --git a/querydb/src/test/scala/io/joern/scanners/c/UseAfterFreePostUsage.scala b/querydb/src/test/scala/io/joern/scanners/c/UseAfterFreePostUsage.scala index 568bb515c515..ed2611ddacbe 100644 --- a/querydb/src/test/scala/io/joern/scanners/c/UseAfterFreePostUsage.scala +++ b/querydb/src/test/scala/io/joern/scanners/c/UseAfterFreePostUsage.scala @@ -2,8 +2,8 @@ package io.joern.scanners.c import io.joern.suites.CQueryTestSuite import io.shiftleft.codepropertygraph.generated.nodes -import io.joern.console.scan._ -import io.shiftleft.semanticcpg.language._ +import io.joern.console.scan.* +import io.shiftleft.semanticcpg.language.* class UseAfterFreePostUsage extends CQueryTestSuite(UseAfterFree) { diff --git a/querydb/src/test/scala/io/joern/scanners/c/UseAfterFreeReturnTests.scala b/querydb/src/test/scala/io/joern/scanners/c/UseAfterFreeReturnTests.scala index 3ae07cc654f9..190be8f9bd57 100644 --- a/querydb/src/test/scala/io/joern/scanners/c/UseAfterFreeReturnTests.scala +++ b/querydb/src/test/scala/io/joern/scanners/c/UseAfterFreeReturnTests.scala @@ -2,8 +2,8 @@ package io.joern.scanners.c import io.joern.suites.CQueryTestSuite import io.shiftleft.codepropertygraph.generated.nodes -import io.joern.console.scan._ -import io.shiftleft.semanticcpg.language._ +import io.joern.console.scan.* +import io.shiftleft.semanticcpg.language.* class UseAfterFreeReturnTests extends CQueryTestSuite(UseAfterFree) { diff --git a/querydb/src/test/scala/io/joern/scanners/kotlin/NetworkProtocolsTests.scala b/querydb/src/test/scala/io/joern/scanners/kotlin/NetworkProtocolsTests.scala index 3c0bbfa01176..ae41b9d9d210 100644 --- a/querydb/src/test/scala/io/joern/scanners/kotlin/NetworkProtocolsTests.scala +++ b/querydb/src/test/scala/io/joern/scanners/kotlin/NetworkProtocolsTests.scala @@ -1,9 +1,9 @@ package io.joern.scanners.kotlin -import io.joern.console.scan._ +import io.joern.console.scan.* import io.joern.suites.KotlinQueryTestSuite import io.shiftleft.codepropertygraph.generated.nodes.Call -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class NetworkProtocolsTests extends KotlinQueryTestSuite(NetworkProtocols) { "should find calls relevant to insecure network protocol usage" in { diff --git a/querydb/src/test/scala/io/joern/suites/AllBundlesTestSuite.scala b/querydb/src/test/scala/io/joern/suites/AllBundlesTestSuite.scala index 9fc370a5284f..f35909393c30 100644 --- a/querydb/src/test/scala/io/joern/suites/AllBundlesTestSuite.scala +++ b/querydb/src/test/scala/io/joern/suites/AllBundlesTestSuite.scala @@ -2,7 +2,7 @@ package io.joern.suites import io.joern.console.QueryDatabase import org.scalatest.wordspec.AnyWordSpec -import org.scalatest.matchers.should.Matchers._ +import org.scalatest.matchers.should.Matchers.* class AllBundlesTestSuite extends AnyWordSpec { val argumentProvider = new QDBArgumentProvider(3) diff --git a/querydb/src/test/scala/io/joern/suites/AndroidQueryTestSuite.scala b/querydb/src/test/scala/io/joern/suites/AndroidQueryTestSuite.scala index 4be9b05268b7..f40e1d3f7529 100644 --- a/querydb/src/test/scala/io/joern/suites/AndroidQueryTestSuite.scala +++ b/querydb/src/test/scala/io/joern/suites/AndroidQueryTestSuite.scala @@ -1,12 +1,12 @@ package io.joern.suites -import io.joern.console.scan._ +import io.joern.console.scan.* import io.joern.console.{CodeSnippet, Query, QueryBundle} import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.joern.util.QueryUtil import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.ConfigFile -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class AndroidQueryTestSuite[QB <: QueryBundle](val queryBundle: QB) extends KotlinCode2CpgFixture(withOssDataflow = true, withDefaultJars = true) { diff --git a/querydb/src/test/scala/io/joern/suites/CQueryTestSuite.scala b/querydb/src/test/scala/io/joern/suites/CQueryTestSuite.scala index 93e5d618c08c..97e29744fd44 100644 --- a/querydb/src/test/scala/io/joern/suites/CQueryTestSuite.scala +++ b/querydb/src/test/scala/io/joern/suites/CQueryTestSuite.scala @@ -2,12 +2,12 @@ package io.joern.suites import io.joern.util.QueryUtil import io.shiftleft.codepropertygraph.generated.nodes -import io.joern.console.scan._ +import io.joern.console.scan.* import io.joern.console.QueryBundle import io.joern.console.Query import io.joern.c2cpg.testfixtures.DataFlowCodeToCpgSuite import io.joern.x2cpg.testfixtures.TestCpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class CQueryTestSuite[QB <: QueryBundle](val queryBundle: QB) extends DataFlowCodeToCpgSuite { diff --git a/querydb/src/test/scala/io/joern/suites/GhidraQueryTestSuite.scala b/querydb/src/test/scala/io/joern/suites/GhidraQueryTestSuite.scala index 1a6d1cc5eadc..81ea14d8af67 100644 --- a/querydb/src/test/scala/io/joern/suites/GhidraQueryTestSuite.scala +++ b/querydb/src/test/scala/io/joern/suites/GhidraQueryTestSuite.scala @@ -1,12 +1,12 @@ package io.joern.suites import io.joern.console.QueryBundle -import io.joern.console.scan._ +import io.joern.console.scan.* import io.joern.ghidra2cpg.fixtures.DataFlowBinToCpgSuite import io.joern.util.QueryUtil import io.shiftleft.codepropertygraph.generated.nodes import io.joern.console.Query -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.utils.ProjectRoot class GhidraQueryTestSuite[QB <: QueryBundle](val queryBundle: QB) extends DataFlowBinToCpgSuite { diff --git a/querydb/src/test/scala/io/joern/suites/JavaQueryTestSuite.scala b/querydb/src/test/scala/io/joern/suites/JavaQueryTestSuite.scala index 3407c2837ee8..141a3969ade1 100644 --- a/querydb/src/test/scala/io/joern/suites/JavaQueryTestSuite.scala +++ b/querydb/src/test/scala/io/joern/suites/JavaQueryTestSuite.scala @@ -1,6 +1,6 @@ package io.joern.suites -import io.joern.console.scan._ +import io.joern.console.scan.* import io.joern.console.{CodeSnippet, Query, QueryBundle} import io.joern.javasrc2cpg.testfixtures.JavaSrcCode2CpgFixture import io.joern.util.QueryUtil diff --git a/querydb/src/test/scala/io/joern/suites/KotlinQueryTestSuite.scala b/querydb/src/test/scala/io/joern/suites/KotlinQueryTestSuite.scala index 01c102334903..1c2419156035 100644 --- a/querydb/src/test/scala/io/joern/suites/KotlinQueryTestSuite.scala +++ b/querydb/src/test/scala/io/joern/suites/KotlinQueryTestSuite.scala @@ -6,7 +6,7 @@ import io.joern.kotlin2cpg.testfixtures.KotlinCode2CpgFixture import io.joern.x2cpg.testfixtures.TestCpg import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{Call, Method} -import io.joern.console.scan._ +import io.joern.console.scan.* import io.shiftleft.utils.ProjectRoot class KotlinQueryTestSuite[QB <: QueryBundle](val queryBundle: QB) diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/Overlays.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/Overlays.scala index d10dd2108cf0..7a62e226f138 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/Overlays.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/Overlays.scala @@ -1,9 +1,9 @@ package io.shiftleft.semanticcpg -import io.shiftleft.codepropertygraph.generated.Cpg +import io.shiftleft.codepropertygraph.generated.{Cpg, DiffGraphBuilder} import io.shiftleft.codepropertygraph.generated.Properties import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* object Overlays { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/accesspath/TrackedBase.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/accesspath/TrackedBase.scala index f1af0f8d8cd3..9172fb77b960 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/accesspath/TrackedBase.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/accesspath/TrackedBase.scala @@ -1,6 +1,6 @@ package io.shiftleft.semanticcpg.accesspath -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* trait TrackedBase case class TrackedNamedVariable(name: String) extends TrackedBase diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/AstGenerator.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/AstGenerator.scala index f68afc41afcb..52a649f52ffd 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/AstGenerator.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/AstGenerator.scala @@ -3,7 +3,7 @@ package io.shiftleft.semanticcpg.dotgenerator import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.{AstNode, MethodParameterOut} import io.shiftleft.semanticcpg.dotgenerator.DotSerializer.{Edge, Graph} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* class AstGenerator { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CallGraphGenerator.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CallGraphGenerator.scala index d1aecf60bb0e..dfee4db69a23 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CallGraphGenerator.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CallGraphGenerator.scala @@ -3,7 +3,7 @@ package io.shiftleft.semanticcpg.dotgenerator import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{Method, StoredNode} import io.shiftleft.semanticcpg.dotgenerator.DotSerializer.{Edge, Graph} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import scala.collection.mutable diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CdgGenerator.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CdgGenerator.scala index 2507bcf9e3d6..9223d7d98218 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CdgGenerator.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CdgGenerator.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.StoredNode import io.shiftleft.semanticcpg.dotgenerator.DotSerializer.Edge -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class CdgGenerator extends CfgGenerator { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CfgGenerator.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CfgGenerator.scala index 45999fbe46e8..067ce1302792 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CfgGenerator.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/CfgGenerator.scala @@ -1,10 +1,9 @@ package io.shiftleft.semanticcpg.dotgenerator import io.shiftleft.codepropertygraph.generated.EdgeTypes -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.dotgenerator.DotSerializer.{Edge, Graph} -import io.shiftleft.semanticcpg.language._ -import overflowdb.Node +import io.shiftleft.semanticcpg.language.* class CfgGenerator { @@ -44,12 +43,12 @@ class CfgGenerator { protected def expand(v: StoredNode): Iterator[Edge] = v._cfgOut.map(node => Edge(v, node, edgeType = edgeType)) - private def isConditionInControlStructure(v: Node): Boolean = v match { + private def isConditionInControlStructure(v: StoredNode): Boolean = v match { case id: Identifier => id.astParent.isControlStructure case _ => false } - private def cfgNodeShouldBeDisplayed(v: Node): Boolean = + private def cfgNodeShouldBeDisplayed(v: StoredNode): Boolean = isConditionInControlStructure(v) || !(v.isInstanceOf[Literal] || v.isInstanceOf[Identifier] || diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/TypeHierarchyGenerator.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/TypeHierarchyGenerator.scala index 25891f6e7c48..2ec4454d901f 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/TypeHierarchyGenerator.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/dotgenerator/TypeHierarchyGenerator.scala @@ -3,7 +3,7 @@ package io.shiftleft.semanticcpg.dotgenerator import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{StoredNode, Type, TypeDecl} import io.shiftleft.semanticcpg.dotgenerator.DotSerializer.{Edge, Graph} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import scala.collection.mutable diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/AccessPathHandling.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/AccessPathHandling.scala index 86944d6da608..131c904f1bfc 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/AccessPathHandling.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/AccessPathHandling.scala @@ -1,8 +1,8 @@ package io.shiftleft.semanticcpg.language import io.shiftleft.codepropertygraph.generated.{Operators, Properties, PropertyNames} -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.accesspath._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.accesspath.* import org.slf4j.LoggerFactory import scala.jdk.CollectionConverters.IteratorHasAsScala diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/LocationCreator.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/LocationCreator.scala index 0a00dd9c5586..b233ad2e0abb 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/LocationCreator.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/LocationCreator.scala @@ -1,8 +1,8 @@ package io.shiftleft.semanticcpg.language -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import org.slf4j.{Logger, LoggerFactory} -import overflowdb.traversal._ +import overflowdb.traversal.* import scala.annotation.tailrec diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NewNodeSteps.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NewNodeSteps.scala index 2a4384e9c7e1..dbcce1aa4807 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NewNodeSteps.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NewNodeSteps.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.language import io.shiftleft.codepropertygraph.generated.nodes.NewNode -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder trait HasStoreMethod { def store()(implicit diffBuilder: DiffGraphBuilder): Unit diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NewTagNodePairTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NewTagNodePairTraversal.scala index 9248f9e72b1d..44b52836c0ac 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NewTagNodePairTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NewTagNodePairTraversal.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.{NewNode, NewTagNodePair, StoredNode} -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder class NewTagNodePairTraversal(traversal: Iterator[NewTagNodePair]) extends HasStoreMethod { override def store()(implicit diffGraph: DiffGraphBuilder): Unit = { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeExtensionFinder.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeExtensionFinder.scala index 6c7c4024c26b..f0712ce1f87d 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeExtensionFinder.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeExtensionFinder.scala @@ -1,29 +1,8 @@ package io.shiftleft.semanticcpg.language -import io.shiftleft.codepropertygraph.generated.nodes.{ - Call, - Identifier, - Literal, - Local, - Method, - MethodParameterIn, - MethodParameterOut, - MethodRef, - MethodReturn, - StoredNode -} +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.NodeExtension -import io.shiftleft.semanticcpg.language.nodemethods.{ - CallMethods, - IdentifierMethods, - LiteralMethods, - LocalMethods, - MethodMethods, - MethodParameterInMethods, - MethodParameterOutMethods, - MethodRefMethods, - MethodReturnMethods -} +import io.shiftleft.semanticcpg.language.nodemethods.* trait NodeExtensionFinder { def apply(n: StoredNode): Option[NodeExtension] diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeSteps.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeSteps.scala index 71971d654828..000884a91267 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeSteps.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeSteps.scala @@ -1,12 +1,12 @@ package io.shiftleft.semanticcpg.language import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes} import io.shiftleft.semanticcpg.codedumper.CodeDumper import overflowdb.Node -import overflowdb.traversal._ -import overflowdb.traversal.help.Doc +import overflowdb.traversal.* +import io.shiftleft.codepropertygraph.generated.help.Doc /** Steps for all node types * diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeTypeStarters.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeTypeStarters.scala index daa8f1b82e23..89f6dab3532d 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeTypeStarters.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/NodeTypeStarters.scala @@ -1,11 +1,11 @@ package io.shiftleft.semanticcpg.language import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{NodeTypes, Properties} -import overflowdb._ +import overflowdb.* import overflowdb.traversal.help -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc import overflowdb.traversal.{InitialTraversal, TraversalSource} import scala.jdk.CollectionConverters.IteratorHasAsScala diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/Show.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/Show.scala index 0194d4dc571b..ea05112e7ba4 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/Show.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/Show.scala @@ -1,9 +1,8 @@ package io.shiftleft.semanticcpg.language -import io.shiftleft.codepropertygraph.generated.nodes.NewNode -import overflowdb.Node +import io.shiftleft.codepropertygraph.generated.nodes.{AbstractNode, NewNode, StoredNode} -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* /** Typeclass for (pretty) printing an object */ @@ -18,20 +17,20 @@ object Show { override def apply(a: Any): String = a match { case node: NewNode => val label = node.label - val properties = propsToString(node.properties.toList) + val properties = propsToString(node.properties) s"($label): $properties" - case node: Node => + case node: StoredNode => val label = node.label val id = node.id().toString - val properties = propsToString(node.propertiesMap.asScala.toList) + val properties = propsToString(node.propertiesMap.asScala.toMap) s"($label,$id): $properties" case other => other.toString } - private def propsToString(keyValues: List[(String, Any)]): String = { - keyValues + private def propsToString(properties: Map[String, Any]): String = { + properties .filter(_._2.toString.nonEmpty) .sortBy(_._1) .map { case (key, value) => s"$key: $value" } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/Steps.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/Steps.scala index 4aa0fce401d3..7046591a68f6 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/Steps.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/Steps.scala @@ -3,7 +3,7 @@ package io.shiftleft.semanticcpg.language import io.shiftleft.codepropertygraph.generated.nodes.AbstractNode import org.json4s.native.Serialization.{write, writePretty} import org.json4s.{CustomSerializer, Extraction, Formats} -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc import replpp.Colors import replpp.Operators.* diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/android/ConfigFileTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/android/ConfigFileTraversal.scala index 936cf1439df9..c2a8d6e5efc9 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/android/ConfigFileTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/android/ConfigFileTraversal.scala @@ -1,9 +1,10 @@ package io.shiftleft.semanticcpg.language.android import io.joern.semanticcpg.utils.SecureXmlParsing -import io.shiftleft.codepropertygraph.generated.nodes +import io.shiftleft.codepropertygraph.generated.nodes.ConfigFile +import io.shiftleft.semanticcpg.language.* -class ConfigFileTraversal(val traversal: Iterator[nodes.ConfigFile]) extends AnyVal { +class ConfigFileTraversal(val traversal: Iterator[ConfigFile]) extends AnyVal { def usesCleartextTraffic = traversal .filter(_.name.endsWith(Constants.androidManifestXml)) diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/callgraphextension/MethodTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/callgraphextension/MethodTraversal.scala index 6b627ae47e06..825c7fe793c3 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/callgraphextension/MethodTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/callgraphextension/MethodTraversal.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.callgraphextension import io.shiftleft.codepropertygraph.generated.nodes.{Call, Method} import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class MethodTraversal(val traversal: Iterator[Method]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/dotextension/AstNodeDot.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/dotextension/AstNodeDot.scala index aa10a624c79f..80f3622f27ae 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/dotextension/AstNodeDot.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/dotextension/AstNodeDot.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.dotextension import io.shiftleft.codepropertygraph.generated.nodes.AstNode import io.shiftleft.semanticcpg.dotgenerator.DotAstGenerator -import overflowdb.traversal.* +import io.shiftleft.semanticcpg.language.* class AstNodeDot[NodeType <: AstNode](val traversal: Iterator[NodeType]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/dotextension/CfgNodeDot.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/dotextension/CfgNodeDot.scala index 107b19037495..84d1bdf4647d 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/dotextension/CfgNodeDot.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/dotextension/CfgNodeDot.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.dotextension import io.shiftleft.codepropertygraph.generated.nodes.Method import io.shiftleft.semanticcpg.dotgenerator.{DotCdgGenerator, DotCfgGenerator} -import overflowdb.traversal.* +import io.shiftleft.semanticcpg.language.* class CfgNodeDot(val traversal: Iterator[Method]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/importresolver/ResolvedImportAsTagTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/importresolver/ResolvedImportAsTagTraversal.scala index 4400d389dcd9..7bc957d4d70a 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/importresolver/ResolvedImportAsTagTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/importresolver/ResolvedImportAsTagTraversal.scala @@ -3,7 +3,7 @@ package io.shiftleft.semanticcpg.language.importresolver import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{AstNode, Declaration, Member, Tag} import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class ResolvedImportAsTagExt(node: Tag) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/ModuleVariableAsNodeTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/ModuleVariableAsNodeTraversal.scala index c115d84a3883..bdf17212ea9a 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/ModuleVariableAsNodeTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/ModuleVariableAsNodeTraversal.scala @@ -5,7 +5,7 @@ import io.shiftleft.codepropertygraph.generated.{Cpg, Operators} import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.modulevariable.OpNodes import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.FieldAccess -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class ModuleVariableAsLocalTraversal(traversal: Iterator[Local]) extends AnyVal { @@ -30,7 +30,7 @@ class ModuleVariableAsFieldIdentifierTraversal(traversal: Iterator[FieldIdentifi @Doc(info = "Field identifiers representing module variables") def moduleVariables: Iterator[OpNodes.ModuleVariable] = { traversal.flatMap { fieldIdentifier => - Cpg(fieldIdentifier.graph()).method + Cpg(fieldIdentifier.graph).method .fullNameExact(fieldIdentifier.inFieldAccess.argument(1).isIdentifier.typeFullName.toSeq*) .isModule .local @@ -46,7 +46,7 @@ class ModuleVariableAsMemberTraversal(traversal: Iterator[Member]) extends AnyVa def moduleVariables: Iterator[OpNodes.ModuleVariable] = { val members = traversal.toList lazy val memberNames = members.name.toSeq - members.headOption.map(m => Cpg(m.graph())) match + members.headOption.map(m => Cpg(m.graph)) match case Some(cpg) => cpg.method .fullNameExact(members.typeDecl.fullName.toSeq*) diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/ModuleVariableTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/ModuleVariableTraversal.scala index 1c58587093c2..c53092ad6f7d 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/ModuleVariableTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/ModuleVariableTraversal.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.Assignment -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class ModuleVariableTraversal(traversal: Iterator[OpNodes.ModuleVariable]) extends AnyVal { @@ -32,7 +32,7 @@ class ModuleVariableTraversal(traversal: Iterator[OpNodes.ModuleVariable]) exten ) def references: Iterator[Identifier | FieldIdentifier] = { val variables = traversal.toList - variables.headOption.map(node => Cpg(node.graph())) match + variables.headOption.map(node => Cpg(node.graph)) match case Some(cpg) => val modules = cpg.method.isModule.l val variableNames = variables.name.toSet @@ -78,7 +78,7 @@ class ModuleVariableTraversal(traversal: Iterator[OpNodes.ModuleVariable]) exten val variables = traversal.toList lazy val moduleNames = variables.method.isModule.fullName.dedup.toSeq lazy val variableNames = variables.name.toSeq - variables.headOption.map(node => Cpg(node.graph())) match + variables.headOption.map(node => Cpg(node.graph)) match case Some(cpg) => cpg.typeDecl.fullNameExact(moduleNames*).member.nameExact(variableNames*) case None => Iterator.empty } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/OpNodes.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/OpNodes.scala index dd442178f8af..2c43a8bf567c 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/OpNodes.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/OpNodes.scala @@ -1,6 +1,6 @@ package io.shiftleft.semanticcpg.language.modulevariable -import io.shiftleft.codepropertygraph.generated.nodes.{Block, Local, Member, StaticType} +import io.shiftleft.codepropertygraph.generated.nodes.{Local, StaticType} trait ModuleVariableT object OpNodes { @@ -8,7 +8,6 @@ object OpNodes { /** Represents a module-level global variable. This kind of node behaves like both a local variable and a field access * and is common in languages such as Python/JavaScript. */ - type ModuleVariable = Local & StaticType[ModuleVariableT] } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/nodemethods/ModuleVariableAsNodeMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/nodemethods/ModuleVariableAsNodeMethods.scala index fb80d7092fa2..a9559ae38e4e 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/nodemethods/ModuleVariableAsNodeMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/nodemethods/ModuleVariableAsNodeMethods.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.modulevariable.nodemethods import io.shiftleft.codepropertygraph.generated.nodes.{Identifier, Local, Member} import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class ModuleVariableAsLocalMethods(node: Local) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/nodemethods/ModuleVariableMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/nodemethods/ModuleVariableMethods.scala index ee2a84c2e86d..87e0b62b8bee 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/nodemethods/ModuleVariableMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/modulevariable/nodemethods/ModuleVariableMethods.scala @@ -6,7 +6,7 @@ import io.shiftleft.semanticcpg.language.modulevariable.OpNodes import io.shiftleft.semanticcpg.language.operatorextension.OpNodes as OpExtNodes import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.importresolver.{ResolvedMember, ResolvedTypeDecl} -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class ModuleVariableMethods(node: OpNodes.ModuleVariable) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/AstNodeMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/AstNodeMethods.scala index 14ad5766be64..86da4ebfc776 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/AstNodeMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/AstNodeMethods.scala @@ -108,8 +108,7 @@ class AstNodeMethods(val node: AstNode) extends AnyVal with NodeExtension { case member: Member => member case node: MethodParameterIn => node.method - case node: MethodParameterOut => - node.method.methodReturn + case node: MethodParameterOut => node.method.methodReturn case node: Call if MemberAccess.isGenericMemberAccessName(node.name) => parentExpansion(node) diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CallMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CallMethods.scala index b124dcbd0c2e..0d228ce4be7c 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CallMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CallMethods.scala @@ -6,20 +6,27 @@ import io.shiftleft.semanticcpg.NodeExtension import io.shiftleft.semanticcpg.language.* class CallMethods(val node: Call) extends AnyVal with NodeExtension with HasLocation { + + def isStatic: Boolean = + node.dispatchType == "STATIC_DISPATCH" + + def isDynamic: Boolean = + node.dispatchType == "DYNAMIC_DISPATCH" + def receiver: Iterator[Expression] = - node.receiverOut + node.receiverOut.collectAll[Expression] def arguments(index: Int): Iterator[Expression] = - node._argumentOut - .collect { - case expr: Expression if expr.argumentIndex == index => expr - } + node._argumentOut.collect { + case expr: Expression if expr.argumentIndex == index => expr + } + // TODO define as named step in the schema def argument: Iterator[Expression] = node._argumentOut.collectAll[Expression] def argument(index: Int): Expression = - arguments(index).head + arguments(index).next def argumentOption(index: Int): Option[Expression] = node._argumentOut.collectFirst { @@ -32,7 +39,6 @@ class CallMethods(val node: Call) extends AnyVal with NodeExtension with HasLoca node.astChildren.isBlock.maxByOption(_.order).iterator.expressionDown } - override def location: NewLocation = { + override def location: NewLocation = LocationCreator(node, node.code, node.label, node.lineNumber, node.method) - } } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala index 08ee7d72a7e6..fa14297ad531 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/CfgNodeMethods.scala @@ -11,9 +11,8 @@ class CfgNodeMethods(val node: CfgNode) extends AnyVal with NodeExtension { /** Successors in the CFG */ - def cfgNext: Iterator[CfgNode] = { + def cfgNext: Iterator[CfgNode] = Iterator.single(node).cfgNext - } /** Maps each node in the traversal to a traversal returning its n successors. */ @@ -31,9 +30,8 @@ class CfgNodeMethods(val node: CfgNode) extends AnyVal with NodeExtension { /** Predecessors in the CFG */ - def cfgPrev: Iterator[CfgNode] = { + def cfgPrev: Iterator[CfgNode] = Iterator.single(node).cfgPrev - } /** Recursively determine all nodes on which this CFG node is control-dependent. */ diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/IdentifierMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/IdentifierMethods.scala index e04ff421b06a..134f42ae3397 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/IdentifierMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/IdentifierMethods.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.nodemethods import io.shiftleft.codepropertygraph.generated.nodes.{Declaration, Identifier, NewLocation} import io.shiftleft.semanticcpg.NodeExtension -import io.shiftleft.semanticcpg.language.{HasLocation, LocationCreator, *} +import io.shiftleft.semanticcpg.language.* class IdentifierMethods(val identifier: Identifier) extends AnyVal with NodeExtension with HasLocation { override def location: NewLocation = { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/LiteralMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/LiteralMethods.scala index 3bbc9892b5bc..8962c206ff4a 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/LiteralMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/LiteralMethods.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.nodemethods import io.shiftleft.codepropertygraph.generated.nodes.{Literal, NewLocation} import io.shiftleft.semanticcpg.NodeExtension -import io.shiftleft.semanticcpg.language.{HasLocation, LocationCreator, _} +import io.shiftleft.semanticcpg.language.* class LiteralMethods(val literal: Literal) extends AnyVal with NodeExtension with HasLocation { override def location: NewLocation = { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodMethods.scala index 52a2034ae28f..7141f8aa8af0 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodMethods.scala @@ -37,14 +37,14 @@ class MethodMethods(val method: Method) extends AnyVal with NodeExtension with H /** List of CFG nodes in reverse post order */ def reversePostOrder: Iterator[CfgNode] = { - def expand(x: CfgNode) = { x.cfgNext.iterator } + def expand(x: CfgNode) = x.cfgNext.iterator NodeOrdering.reverseNodeList(NodeOrdering.postOrderNumbering(method, expand).toList).iterator } /** List of CFG nodes in post order */ def postOrder: Iterator[CfgNode] = { - def expand(x: CfgNode) = { x.cfgNext.iterator } + def expand(x: CfgNode) = x.cfgNext.iterator NodeOrdering.nodeList(NodeOrdering.postOrderNumbering(method, expand).toList).iterator } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodParameterInMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodParameterInMethods.scala index 1f2a0c5420cc..1b39a89145c3 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodParameterInMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodParameterInMethods.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.nodemethods import io.shiftleft.codepropertygraph.generated.nodes.{MethodParameterIn, NewLocation} import io.shiftleft.semanticcpg.NodeExtension -import io.shiftleft.semanticcpg.language.{HasLocation, LocationCreator} +import io.shiftleft.semanticcpg.language.* class MethodParameterInMethods(val paramIn: MethodParameterIn) extends AnyVal with NodeExtension with HasLocation { override def location: NewLocation = { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodParameterOutMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodParameterOutMethods.scala index 851c5949abbb..29471342f6ca 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodParameterOutMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodParameterOutMethods.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.nodemethods import io.shiftleft.codepropertygraph.generated.nodes.{MethodParameterOut, NewLocation} import io.shiftleft.semanticcpg.NodeExtension -import io.shiftleft.semanticcpg.language.{HasLocation, LocationCreator} +import io.shiftleft.semanticcpg.language.* class MethodParameterOutMethods(val paramOut: MethodParameterOut) extends AnyVal with NodeExtension with HasLocation { override def location: NewLocation = { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodRefMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodRefMethods.scala index fc971fff51c9..03ea62a6dd3a 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodRefMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodRefMethods.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.nodemethods import io.shiftleft.codepropertygraph.generated.nodes.{MethodRef, NewLocation} import io.shiftleft.semanticcpg.NodeExtension -import io.shiftleft.semanticcpg.language.{HasLocation, LocationCreator} +import io.shiftleft.semanticcpg.language.* class MethodRefMethods(val methodRef: MethodRef) extends AnyVal with NodeExtension with HasLocation { override def location: NewLocation = { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodReturnMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodReturnMethods.scala index 4ea458735b3b..8d7494c63773 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodReturnMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/MethodReturnMethods.scala @@ -19,5 +19,6 @@ class MethodReturnMethods(val node: MethodReturn) extends AnyVal with NodeExtens callsites.collectAll[Call] } + // TODO define in schema as named step def typ: Iterator[Type] = node.evalTypeOut } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/NodeMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/NodeMethods.scala index 600fe2c1299a..1dc2a76f29fb 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/NodeMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/nodemethods/NodeMethods.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.nodemethods import io.shiftleft.codepropertygraph.generated.nodes.{NewLocation, StoredNode} import io.shiftleft.semanticcpg.NodeExtension -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import overflowdb.NodeOrDetachedNode class NodeMethods(val node: NodeOrDetachedNode) extends AnyVal with NodeExtension { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/ArrayAccessTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/ArrayAccessTraversal.scala index cc3b25194d16..15e6578550b6 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/ArrayAccessTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/ArrayAccessTraversal.scala @@ -1,8 +1,8 @@ package io.shiftleft.semanticcpg.language.operatorextension import io.shiftleft.codepropertygraph.generated.nodes.{Expression, Identifier} -import io.shiftleft.semanticcpg.language._ -import overflowdb.traversal.help.Doc +import io.shiftleft.semanticcpg.language.* +import io.shiftleft.codepropertygraph.generated.help.Doc class ArrayAccessTraversal(val traversal: Iterator[OpNodes.ArrayAccess]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/AssignmentTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/AssignmentTraversal.scala index f7751bedab93..3e7265e979e7 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/AssignmentTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/AssignmentTraversal.scala @@ -3,7 +3,7 @@ package io.shiftleft.semanticcpg.language.operatorextension import io.shiftleft.codepropertygraph.generated.nodes import io.shiftleft.semanticcpg.language.* import overflowdb.traversal.help -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc @help.Traversal(elementType = classOf[nodes.Call]) class AssignmentTraversal(val traversal: Iterator[OpNodes.Assignment]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/FieldAccessTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/FieldAccessTraversal.scala index 6bb06f0ce627..31bc44d8019a 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/FieldAccessTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/FieldAccessTraversal.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.operatorextension import io.shiftleft.codepropertygraph.generated.nodes.{FieldIdentifier, Member, TypeDecl} import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class FieldAccessTraversal(val traversal: Iterator[OpNodes.FieldAccess]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/Implicits.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/Implicits.scala index b3ef1b0ce155..6c0d692240ad 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/Implicits.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/Implicits.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.operatorextension import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes.{AstNode, Expression} -import io.shiftleft.semanticcpg.language.operatorextension.nodemethods._ +import io.shiftleft.semanticcpg.language.operatorextension.nodemethods.* trait Implicits { implicit def toNodeTypeStartersOperatorExtension(cpg: Cpg): NodeTypeStarters = new NodeTypeStarters(cpg) @@ -17,7 +17,8 @@ trait Implicits { implicit def toFieldAccessTrav(steps: Iterator[OpNodes.FieldAccess]): FieldAccessTraversal = new FieldAccessTraversal(steps) - implicit def toAssignmentExt(assignment: OpNodes.Assignment): AssignmentMethods = new AssignmentMethods(assignment) + implicit def toAssignmentExt(assignment: OpNodes.Assignment): AssignmentMethods = + new AssignmentMethods(assignment) implicit def toAssignmentTrav(steps: Iterator[OpNodes.Assignment]): AssignmentTraversal = new AssignmentTraversal(steps) diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/NodeTypeStarters.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/NodeTypeStarters.scala index 5ddf05c29036..7dfd24b8a884 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/NodeTypeStarters.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/NodeTypeStarters.scala @@ -4,8 +4,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.semanticcpg.language.* import overflowdb.traversal.help.{Doc, TraversalSource} -/** Steps that allow traversing from `cpg` to operators. - */ +/** Steps that allow traversing from `cpg` to operators. */ @TraversalSource class NodeTypeStarters(cpg: Cpg) { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/OpAstNodeTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/OpAstNodeTraversal.scala index d5c61829abb7..604317f19089 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/OpAstNodeTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/OpAstNodeTraversal.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.operatorextension import io.shiftleft.codepropertygraph.generated.nodes.AstNode import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class OpAstNodeTraversal[A <: AstNode](val traversal: Iterator[A]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/TargetTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/TargetTraversal.scala index 3a17608b98e3..1c7004083a5b 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/TargetTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/TargetTraversal.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.operatorextension import io.shiftleft.codepropertygraph.generated.nodes.Expression import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc class TargetTraversal(val traversal: Iterator[Expression]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/nodemethods/AssignmentMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/nodemethods/AssignmentMethods.scala index 4faa072246f2..d470dbe92a12 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/nodemethods/AssignmentMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/nodemethods/AssignmentMethods.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.language.operatorextension.nodemethods import io.shiftleft.codepropertygraph.generated.nodes.Expression -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes class AssignmentMethods(val assignment: OpNodes.Assignment) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/nodemethods/TargetMethods.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/nodemethods/TargetMethods.scala index 1a301475a3eb..dc633f06599b 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/nodemethods/TargetMethods.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/operatorextension/nodemethods/TargetMethods.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.operatorextension.nodemethods import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.{Call, Expression} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.{OpNodes, allArrayAccessTypes} class TargetMethods(val expr: Expression) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/CallTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/CallTraversal.scala index 33e47f74f375..5fc9724a0c34 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/CallTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/CallTraversal.scala @@ -5,19 +5,16 @@ import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.Assignment import io.shiftleft.semanticcpg.language.operatorextension.allAssignmentTypes -/** A call site - */ +/** A call site. */ class CallTraversal(val traversal: Iterator[Call]) extends AnyVal { - /** Only statically dispatched calls - */ + /** Only statically dispatched calls */ def isStatic: Iterator[Call] = - traversal.dispatchType("STATIC_DISPATCH") + traversal.filter(_.isStatic) - /** Only dynamically dispatched calls - */ + /** Only dynamically dispatched calls */ def isDynamic: Iterator[Call] = - traversal.dispatchType("DYNAMIC_DISPATCH") + traversal.filter(_.isDynamic) /** Only assignment calls */ diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/ControlStructureTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/ControlStructureTraversal.scala index f117e19b91e9..e72e5add6675 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/ControlStructureTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/ControlStructureTraversal.scala @@ -3,7 +3,7 @@ package io.shiftleft.semanticcpg.language.types.expressions import io.shiftleft.codepropertygraph.generated.nodes.{AstNode, ControlStructure, Expression} import io.shiftleft.codepropertygraph.generated.{ControlStructureTypes, Properties} import io.shiftleft.semanticcpg.language.* -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc object ControlStructureTraversal { val secondChildIndex = 2 diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/AstNodeTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/AstNodeTraversal.scala index 33bfa563f290..5b70766effa4 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/AstNodeTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/AstNodeTraversal.scala @@ -4,7 +4,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes} import io.shiftleft.semanticcpg.language.* import overflowdb.traversal.help -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc @help.Traversal(elementType = classOf[AstNode]) class AstNodeTraversal[A <: AstNode](val traversal: Iterator[A]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/CfgNodeTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/CfgNodeTraversal.scala index 3a3d22f7840f..7b48473afa13 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/CfgNodeTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/CfgNodeTraversal.scala @@ -1,9 +1,9 @@ package io.shiftleft.semanticcpg.language.types.expressions.generalizations -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* import overflowdb.traversal.help -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc @help.Traversal(elementType = classOf[CfgNode]) class CfgNodeTraversal[A <: CfgNode](val traversal: Iterator[A]) extends AnyVal { @@ -21,7 +21,6 @@ class CfgNodeTraversal[A <: CfgNode](val traversal: Iterator[A]) extends AnyVal /** Traverse to next expression in CFG. */ - @Doc(info = "Nodes directly reachable via outgoing CFG edges") def cfgNext: Iterator[CfgNode] = traversal._cfgOut diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/AnnotationTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/AnnotationTraversal.scala index a597e668bf1f..104ebab2ea2d 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/AnnotationTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/AnnotationTraversal.scala @@ -1,34 +1,34 @@ package io.shiftleft.semanticcpg.language.types.structure -import io.shiftleft.codepropertygraph.generated.nodes -import overflowdb.traversal._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* /** An (Java-) annotation, e.g., @Test. */ -class AnnotationTraversal(val traversal: Iterator[nodes.Annotation]) extends AnyVal { +class AnnotationTraversal(val traversal: Iterator[Annotation]) extends AnyVal { /** Traverse to parameter assignments */ - def parameterAssign: Iterator[nodes.AnnotationParameterAssign] = + def parameterAssign: Iterator[AnnotationParameterAssign] = traversal.flatMap(_._annotationParameterAssignViaAstOut) /** Traverse to methods annotated with this annotation. */ - def method: Iterator[nodes.Method] = + def method: Iterator[Method] = traversal.flatMap(_._methodViaAstIn) /** Traverse to type declarations annotated by this annotation */ - def typeDecl: Iterator[nodes.TypeDecl] = + def typeDecl: Iterator[TypeDecl] = traversal.flatMap(_._typeDeclViaAstIn) /** Traverse to member annotated by this annotation */ - def member: Iterator[nodes.Member] = + def member: Iterator[Member] = traversal.flatMap(_._memberViaAstIn) /** Traverse to parameter annotated by this annotation */ - def parameter: Iterator[nodes.MethodParameterIn] = + def parameter: Iterator[MethodParameterIn] = traversal.flatMap(_._methodParameterInViaAstIn) } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/DependencyTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/DependencyTraversal.scala index 36309ff44325..e08d885cd813 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/DependencyTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/DependencyTraversal.scala @@ -1,9 +1,9 @@ package io.shiftleft.semanticcpg.language.types.structure -import io.shiftleft.codepropertygraph.generated.nodes.Import -import io.shiftleft.codepropertygraph.generated.{EdgeTypes, nodes} +import io.shiftleft.codepropertygraph.generated.EdgeTypes +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* -class DependencyTraversal(val traversal: Iterator[nodes.Dependency]) extends AnyVal { +class DependencyTraversal(val traversal: Iterator[Dependency]) extends AnyVal { def imports: Iterator[Import] = traversal.in(EdgeTypes.IMPORTS).cast[Import] } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/FileTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/FileTraversal.scala index c9aec5674e6f..f520f09db339 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/FileTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/FileTraversal.scala @@ -1,6 +1,6 @@ package io.shiftleft.semanticcpg.language.types.structure -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* /** A compilation unit diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/LocalTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/LocalTraversal.scala index 26c73041412c..26ff08d2c77c 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/LocalTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/LocalTraversal.scala @@ -1,6 +1,6 @@ package io.shiftleft.semanticcpg.language.types.structure -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, NodeTypes} import io.shiftleft.semanticcpg.language.* diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MemberTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MemberTraversal.scala index d83a7062a256..5f45484923ea 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MemberTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MemberTraversal.scala @@ -1,7 +1,6 @@ package io.shiftleft.semanticcpg.language.types.structure -import io.shiftleft.codepropertygraph.generated._ -import io.shiftleft.codepropertygraph.generated.nodes.{Call, Member} +import io.shiftleft.codepropertygraph.generated.nodes.{Annotation, Call, Member} import io.shiftleft.semanticcpg.language.* /** A member variable of a class/type. @@ -10,7 +9,7 @@ class MemberTraversal(val traversal: Iterator[Member]) extends AnyVal { /** Traverse to annotations of member */ - def annotation: Iterator[nodes.Annotation] = + def annotation: Iterator[Annotation] = traversal.flatMap(_._annotationViaAstOut) /** Places where diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodParameterOutTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodParameterOutTraversal.scala index abb9778a1fd6..4643f9859546 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodParameterOutTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodParameterOutTraversal.scala @@ -7,7 +7,10 @@ import scala.jdk.CollectionConverters.* class MethodParameterOutTraversal(val traversal: Iterator[MethodParameterOut]) extends AnyVal { - def paramIn: Iterator[MethodParameterIn] = traversal.flatMap(_.parameterLinkIn.headOption) + def paramIn: Iterator[MethodParameterIn] = { + // TODO define a named step in schema + traversal.flatMap(_.parameterLinkIn.collectAll[MethodParameterIn]) + } /* method parameter indexes are based, i.e. first parameter has index (that's how java2cpg generates it) */ def index(num: Int): Iterator[MethodParameterOut] = @@ -27,9 +30,10 @@ class MethodParameterOutTraversal(val traversal: Iterator[MethodParameterOut]) e for { paramOut <- traversal method = paramOut.method - call <- method.callIn - arg <- call.argumentOut.collectAll[Expression] - if paramOut.parameterLinkIn.index.headOption.contains(arg.argumentIndex) + call <- method._callIn + arg <- call._argumentOut.collectAll[Expression] + // TODO define 'parameterLinkIn' as named step in schema + if paramOut.parameterLinkIn.collectAll[MethodParameterIn].index.headOption.contains(arg.argumentIndex) } yield arg } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodReturnTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodReturnTraversal.scala index a96b5fb9baf7..99a29873ef4d 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodReturnTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodReturnTraversal.scala @@ -3,7 +3,7 @@ package io.shiftleft.semanticcpg.language.types.structure import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* import overflowdb.traversal.help -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc @help.Traversal(elementType = classOf[MethodReturn]) class MethodReturnTraversal(val traversal: Iterator[MethodReturn]) extends AnyVal { diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodTraversal.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodTraversal.scala index ef31a200c906..4037bc4f40c8 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodTraversal.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/language/types/structure/MethodTraversal.scala @@ -5,7 +5,7 @@ import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.semanticcpg.language.* import overflowdb.* import overflowdb.traversal.help -import overflowdb.traversal.help.Doc +import io.shiftleft.codepropertygraph.generated.help.Doc /** A method, function, or procedure */ diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/testing/package.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/testing/package.scala index 1207a9efa669..254e0aad4e64 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/testing/package.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/testing/package.scala @@ -1,12 +1,11 @@ package io.shiftleft.semanticcpg import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.nodes.* import io.shiftleft.codepropertygraph.generated.{EdgeTypes, Languages, ModifierTypes} import io.shiftleft.passes.CpgPass -import io.shiftleft.semanticcpg.language._ -import overflowdb.BatchedUpdate -import overflowdb.BatchedUpdate.DiffGraphBuilder +import io.shiftleft.semanticcpg.language.* +import io.shiftleft.codepropertygraph.generated.DiffGraphBuilder package object testing { @@ -222,7 +221,7 @@ package object testing { val diffGraph = Cpg.newDiffGraphBuilder f(diffGraph, cpg) class MyPass extends CpgPass(cpg) { - override def run(builder: BatchedUpdate.DiffGraphBuilder): Unit = { + override def run(builder: DiffGraphBuilder): Unit = { builder.absorb(diffGraph) } } diff --git a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/utils/Statements.scala b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/utils/Statements.scala index e121e3830b91..78b76d838b71 100644 --- a/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/utils/Statements.scala +++ b/semanticcpg/src/main/scala/io/shiftleft/semanticcpg/utils/Statements.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.utils import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* object Statements { def countAll(cpg: Cpg): Long = diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/OverlaysTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/OverlaysTests.scala index f1fcf8098a71..f11d33aed67f 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/OverlaysTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/OverlaysTests.scala @@ -1,6 +1,6 @@ package io.shiftleft.semanticcpg -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/accesspath/AccessPathTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/accesspath/AccessPathTests.scala index 3cb15128a159..8a191132d0a8 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/accesspath/AccessPathTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/accesspath/AccessPathTests.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.accesspath -import io.shiftleft.semanticcpg.accesspath.MatchResult._ -import org.scalatest.matchers.should.Matchers._ +import io.shiftleft.semanticcpg.accesspath.MatchResult.* +import org.scalatest.matchers.should.Matchers.* import org.scalatest.wordspec.AnyWordSpec class AccessPathTests extends AnyWordSpec { diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/NewNodeStepsTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/NewNodeStepsTests.scala index d47661adee88..20792c91f7f2 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/NewNodeStepsTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/NewNodeStepsTests.scala @@ -1,12 +1,12 @@ package io.shiftleft.semanticcpg.language -import io.shiftleft.codepropertygraph.generated.Cpg -import io.shiftleft.codepropertygraph.generated.nodes._ +import io.shiftleft.codepropertygraph.generated.{Cpg, DiffGraphBuilder} +import io.shiftleft.codepropertygraph.generated.nodes.* import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec -import overflowdb.BatchedUpdate.{DiffGraphBuilder, applyDiff} +import overflowdb.BatchedUpdate.applyDiff -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* class NewNodeStepsTest extends AnyWordSpec with Matchers { import io.shiftleft.semanticcpg.language.NewNodeNodeStepsTest._ diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/bindingextension/BindingTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/bindingextension/BindingTests.scala index 76db43185dbb..195e5472f2d7 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/bindingextension/BindingTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/bindingextension/BindingTests.scala @@ -1,8 +1,8 @@ package io.shiftleft.semanticcpg.language.bindingextension import io.shiftleft.codepropertygraph.generated.EdgeTypes -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/operatorextension/OperatorExtensionTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/operatorextension/OperatorExtensionTests.scala index fe3c0938d0a6..650914868147 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/operatorextension/OperatorExtensionTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/operatorextension/OperatorExtensionTests.scala @@ -3,8 +3,7 @@ package io.shiftleft.semanticcpg.language.operatorextension import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.Operators import io.shiftleft.codepropertygraph.generated.nodes.Identifier -import io.shiftleft.semanticcpg.language._ -import io.shiftleft.semanticcpg.language.operatorextension.OpNodes.ArrayAccess +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/CfgNodeTraversalTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/CfgNodeTraversalTests.scala index 361bc45d222e..aedde1cb4dad 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/CfgNodeTraversalTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/CfgNodeTraversalTests.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.language.types.expressions.generalizations import io.shiftleft.codepropertygraph.generated.EdgeTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/ExpressionTraversalTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/ExpressionTraversalTests.scala index 1ec5f62bd598..0a9d459c5b48 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/ExpressionTraversalTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/expressions/generalizations/ExpressionTraversalTests.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.types.expressions.generalizations import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.Call -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/FileTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/FileTests.scala index 3c9a9728c270..c750f85b538a 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/FileTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/FileTests.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.language.types.structure import io.shiftleft.codepropertygraph.generated.nodes.{File, Namespace, TypeDecl} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.LoneElement import org.scalatest.matchers.should.Matchers diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MemberTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MemberTests.scala index a12a3a7edb2e..3972b43d70b5 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MemberTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MemberTests.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.language.types.structure import io.shiftleft.codepropertygraph.generated.ModifierTypes -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MethodParameterTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MethodParameterTests.scala index d98aa68f5811..5694017e9942 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MethodParameterTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MethodParameterTests.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.language.types.structure import io.shiftleft.codepropertygraph.generated.nodes.{Method, MethodParameterIn} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MethodTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MethodTests.scala index 908a6a3d8a16..c80baace6241 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MethodTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/MethodTests.scala @@ -2,7 +2,7 @@ package io.shiftleft.semanticcpg.language.types.structure import io.shiftleft.codepropertygraph.generated.EdgeTypes import io.shiftleft.codepropertygraph.generated.nodes.{CfgNode, Expression, Literal, Method, NamespaceBlock, TypeDecl} -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/NamespaceTests.scala b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/NamespaceTests.scala index 184c015a0ceb..2e29239b6f0f 100644 --- a/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/NamespaceTests.scala +++ b/semanticcpg/src/test/scala/io/shiftleft/semanticcpg/language/types/structure/NamespaceTests.scala @@ -1,7 +1,7 @@ package io.shiftleft.semanticcpg.language.types.structure -import io.shiftleft.codepropertygraph.generated.nodes._ -import io.shiftleft.semanticcpg.language._ +import io.shiftleft.codepropertygraph.generated.nodes.* +import io.shiftleft.semanticcpg.language.* import io.shiftleft.semanticcpg.testing.MockCpg import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec