From a6e87fd33a2b260bcc9d2a6858e376668a6a6423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Leuth=C3=A4user?= <1417198+max-leuthaeuser@users.noreply.github.com> Date: Thu, 2 Feb 2023 14:50:56 +0100 Subject: [PATCH] Fixed creation of locals from destructed params. (#245) --- .../js2cpg/astcreation/AstCreator.scala | 17 ++++++++++++----- .../js2cpg/passes/AstCreationPassTest.scala | 7 +++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/scala/io/shiftleft/js2cpg/astcreation/AstCreator.scala b/src/main/scala/io/shiftleft/js2cpg/astcreation/AstCreator.scala index 1fb96fb5..b48a9aeb 100644 --- a/src/main/scala/io/shiftleft/js2cpg/astcreation/AstCreator.scala +++ b/src/main/scala/io/shiftleft/js2cpg/astcreation/AstCreator.scala @@ -227,11 +227,14 @@ class AstCreator(diffGraph: DiffGraphBuilder, source: JsSource, usedIdentNodes: astEdgeBuilder.addAstEdge(destructingAssignmentId, blockId, blockOrder) case None => paramComponents.foreach { param => - val paramName = param.getName - val localParamId = createIdentifierNode(paramName, param) - val paramId = createIdentifierNode(name, param) - val keyId = astNodeBuilder.createFieldIdentifierNode(paramName, param) - val accessId = astNodeBuilder.createFieldAccessNode(paramId, keyId, astNodeBuilder.lineAndColumn(param)) + val paramName = param.getName + val localParamId = createIdentifierNode(paramName, param) + val paramId = createIdentifierNode(name, param) + val localParamLocal = astNodeBuilder.createLocalNode(paramName, Defines.ANY.label) + addLocalToAst(localParamLocal) + scope.addVariable(paramName, localParamLocal, MethodScope) + val keyId = astNodeBuilder.createFieldIdentifierNode(paramName, param) + val accessId = astNodeBuilder.createFieldAccessNode(paramId, keyId, astNodeBuilder.lineAndColumn(param)) val assignmentCallId = astNodeBuilder.createAssignmentNode(localParamId, accessId, astNodeBuilder.lineAndColumn(param)) astEdgeBuilder.addAstEdge(assignmentCallId, blockId, blockOrder) @@ -276,6 +279,10 @@ class AstCreator(diffGraph: DiffGraphBuilder, source: JsSource, usedIdentNodes: val localParamId = createIdentifierNode(paramName, parameter) + val localParamLocal = astNodeBuilder.createLocalNode(paramName, Defines.ANY.label) + addLocalToAst(localParamLocal) + scope.addVariable(paramName, localParamLocal, MethodScope) + val paramId = createIdentifierNode(name, parameter) val keyId = astNodeBuilder.createFieldIdentifierNode(paramName, parameter) diff --git a/src/test/scala/io/shiftleft/js2cpg/passes/AstCreationPassTest.scala b/src/test/scala/io/shiftleft/js2cpg/passes/AstCreationPassTest.scala index e19f3e7c..e5785c14 100644 --- a/src/test/scala/io/shiftleft/js2cpg/passes/AstCreationPassTest.scala +++ b/src/test/scala/io/shiftleft/js2cpg/passes/AstCreationPassTest.scala @@ -2011,6 +2011,13 @@ class AstCreationPassTest extends AbstractPassTest { outerLocalXViaRef.head shouldBe outerLocalX.head } + "have correct closure binding (destructing parameter)" in AstFixture(""" + |const WindowOpen = ({ value }) => { + | return () => windowOpenButton(value); + |};""".stripMargin) { cpg => + cpg.local.name("value").closureBindingId.l shouldBe List("test.js::program:anonymous:anonymous:value") + } + "have correct closure binding (single variable)" in AstFixture(""" | function foo() | {