From 6e22e4286f82e4dace1720aaa44fe1805450807a Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Wed, 8 Dec 2021 09:23:29 +0200 Subject: [PATCH] Fixed referencing `variable.description` in a calculation Whether the description's inline calculations are calculated or not is not defined. --- .../computation/buildComputation/parseCalculationFields.js | 7 +++++-- app/imports/parser/parseTree/accessor.js | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/imports/api/engine/computation/buildComputation/parseCalculationFields.js b/app/imports/api/engine/computation/buildComputation/parseCalculationFields.js index d49ce9b7..d8a7cdba 100644 --- a/app/imports/api/engine/computation/buildComputation/parseCalculationFields.js +++ b/app/imports/api/engine/computation/buildComputation/parseCalculationFields.js @@ -26,6 +26,10 @@ function discoverInlineCalculationFields(prop, schemas){ unset(prop, calcKey); return; } + + // Set the value to the uncomputed string for use in calculations + inlineCalcObj.value = string; + // Has the text, if it matches the existing hash, stop const inlineCalcHash = cyrb53(inlineCalcObj.text); if (inlineCalcHash === inlineCalcObj.hash){ @@ -33,10 +37,9 @@ function discoverInlineCalculationFields(prop, schemas){ } inlineCalcObj.hash = inlineCalcHash; inlineCalcObj.inlineCalculations = []; - // Set the value to the uncomputed string for use in calculations + // It will be re set including the embedded calculation at the end of // the computation - inlineCalcObj.value = string; let matches = string.matchAll(INLINE_CALCULATION_REGEX); for (let match of matches){ let calculation = match[1]; diff --git a/app/imports/parser/parseTree/accessor.js b/app/imports/parser/parseTree/accessor.js index 8c5b3773..855f9044 100644 --- a/app/imports/parser/parseTree/accessor.js +++ b/app/imports/parser/parseTree/accessor.js @@ -16,6 +16,12 @@ const accessor = { value = value[name]; }); let valueType = typeof value; + // If the accessor returns an objet, get the object's value instead + while (valueType === 'object'){ + value = value.value; + valueType = typeof value; + } + // Return a parse node based on the type returned if (valueType === 'string' || valueType === 'number' || valueType === 'boolean'){ return { result: constant.create({ @@ -34,6 +40,7 @@ const accessor = { }; } else { context.error(`${node.name} returned an unexpected type`); + context.error(JSON.stringify(value, null, 2)); return { result: accessor.create({ name: node.name,