From 5e0f3d66ae8b36c02cfed41022b4eea9397732d5 Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Sun, 19 Nov 2023 15:08:40 +0100 Subject: [PATCH] fix: incorrect "assignment/nothing-assigned" error if RHS is an expression lambda --- .../language/helpers/safe-ds-node-mapper.ts | 10 ++++++++++ .../assigneeToAssignedObject.test.ts | 18 ++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/safe-ds-lang/src/language/helpers/safe-ds-node-mapper.ts b/packages/safe-ds-lang/src/language/helpers/safe-ds-node-mapper.ts index 402107fb1..413201ea1 100644 --- a/packages/safe-ds-lang/src/language/helpers/safe-ds-node-mapper.ts +++ b/packages/safe-ds-lang/src/language/helpers/safe-ds-node-mapper.ts @@ -8,6 +8,7 @@ import { isSdsCallable, isSdsClass, isSdsEnumVariant, + isSdsExpressionLambda, isSdsNamedType, isSdsParameter, isSdsReference, @@ -121,6 +122,15 @@ export class SafeDsNodeMapper { } } + // If the RHS calls an expression lambda, the first assignee gets its result + if (isSdsExpressionLambda(callable)) { + if (assigneePosition === 0) { + return callable.result; + } else { + return undefined; + } + } + // Otherwise, the assignee gets the result at the same position const abstractResults = getAbstractResults(callable); return abstractResults[assigneePosition]; diff --git a/packages/safe-ds-lang/tests/language/helpers/safe-ds-node-mapper/assigneeToAssignedObject.test.ts b/packages/safe-ds-lang/tests/language/helpers/safe-ds-node-mapper/assigneeToAssignedObject.test.ts index 16a949c0d..59bf569ca 100644 --- a/packages/safe-ds-lang/tests/language/helpers/safe-ds-node-mapper/assigneeToAssignedObject.test.ts +++ b/packages/safe-ds-lang/tests/language/helpers/safe-ds-node-mapper/assigneeToAssignedObject.test.ts @@ -135,6 +135,18 @@ describe('SafeDsNodeMapper', () => { `, expected: ['r1', 'r2'], }, + { + name: 'expression lambda', + code: ` + segment mySegment() { + val f = () -> 1; + + val a, val b = f(); + }; + `, + expected: ['1', undefined], + index: 1, + }, { name: 'function (one result)', code: ` @@ -179,10 +191,12 @@ describe('SafeDsNodeMapper', () => { const abstractResultNameOrNull = (node: SdsAssignee): string | undefined => { const assignedObject = nodeMapper.assigneeToAssignedObject(node); - if (isSdsAbstractResult(assignedObject)) { + if (!assignedObject) { + return undefined; + } else if (isSdsAbstractResult(assignedObject)) { return assignedObject.name; } else { - return undefined; + return assignedObject.$cstNode?.text; } }; });