From 4b62de6ce9ccf1f7c7e71d84cb0bc9ac06022585 Mon Sep 17 00:00:00 2001 From: Andrei Dreyer Date: Wed, 2 Oct 2024 09:17:24 +0200 Subject: [PATCH] [ruby] fixed double _astIn reference to identifier --- .../AstForControlStructuresCreator.scala | 2 +- .../querying/ControlStructureTests.scala | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForControlStructuresCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForControlStructuresCreator.scala index 7b142b5b6f77..4abb68005d5e 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForControlStructuresCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstForControlStructuresCreator.scala @@ -115,7 +115,7 @@ trait AstForControlStructuresCreator(implicit withSchemaValidation: ValidationMo private def astForForExpression(node: ForExpression): Ast = { val forEachNode = controlStructureNode(node, ControlStructureTypes.FOR, code(node)) - val collectionAst = astForExpression(node.iterableVariable) // iterableAst + def collectionAst = astForExpression(node.iterableVariable) val collectionNode = node.iterableVariable val iterIdentifier = 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 8edcc1914fbf..1a851c90ab5f 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 @@ -651,7 +651,7 @@ class ControlStructureTests extends RubyCode2CpgFixture { } } - "Something" in { + "ForEach loops" in { val cpg = code(""" |fibNumbers = [0, 1, 1, 2, 3, 5, 8, 13] |for num in fibNumbers @@ -659,6 +659,35 @@ class ControlStructureTests extends RubyCode2CpgFixture { |end |""".stripMargin) - cpg.method.isModule.dotAst.l.foreach(println) + inside(cpg.method.isModule.controlStructure.l) { + case forEachNode :: Nil => + forEachNode.controlStructureType shouldBe ControlStructureTypes.FOR + + inside(forEachNode.astChildren.l) { + case (idxLocal: Local) :: (numLocal: Local) :: (initAssign: Call) :: (cond: Call) :: (update: Call) :: (forBlock: Block) :: Nil => + idxLocal.name shouldBe "_idx_" + idxLocal.typeFullName shouldBe Defines.getBuiltInType(Defines.Integer) + + numLocal.name shouldBe "num" + + initAssign.code shouldBe "_idx_ = 0" + initAssign.name shouldBe Operators.assignment + initAssign.methodFullName shouldBe Operators.assignment + + cond.code shouldBe "_idx_ < fibNumbers.length" + cond.name shouldBe Operators.lessThan + cond.methodFullName shouldBe Operators.lessThan + + update.code shouldBe "num = fibNumbers[_idx_++]" + update.name shouldBe Operators.assignment + update.methodFullName shouldBe Operators.assignment + + val List(putsCall) = cpg.call.nameExact("puts").l + putsCall.astParent shouldBe forBlock + + case xs => fail(s"Expected 6 children for `forEachNode`, got [${xs.code.mkString(",")}]") + } + case xs => fail(s"Expected one node for `forEach` loop, got [${xs.code.mkString(",")}]") + } } }