* Parses calculated string. * @param {Expression} expression expression * @returns {CalculatedStringResult} result
(expression)
| 4887 | * @returns {CalculatedStringResult} result |
| 4888 | */ |
| 4889 | parseCalculatedString(expression) { |
| 4890 | switch (expression.type) { |
| 4891 | case "BinaryExpression": |
| 4892 | if (expression.operator === "+") { |
| 4893 | const left = this.parseCalculatedString( |
| 4894 | /** @type {Expression} */ |
| 4895 | (expression.left) |
| 4896 | ); |
| 4897 | const right = this.parseCalculatedString(expression.right); |
| 4898 | if (left.code) { |
| 4899 | return { |
| 4900 | range: left.range, |
| 4901 | value: left.value, |
| 4902 | code: true, |
| 4903 | conditional: false |
| 4904 | }; |
| 4905 | } else if (right.code) { |
| 4906 | return { |
| 4907 | range: [ |
| 4908 | /** @type {Range} */ |
| 4909 | (left.range)[0], |
| 4910 | right.range |
| 4911 | ? right.range[1] |
| 4912 | : /** @type {Range} */ (left.range)[1] |
| 4913 | ], |
| 4914 | value: left.value + right.value, |
| 4915 | code: true, |
| 4916 | conditional: false |
| 4917 | }; |
| 4918 | } |
| 4919 | return { |
| 4920 | range: [ |
| 4921 | /** @type {Range} */ |
| 4922 | (left.range)[0], |
| 4923 | /** @type {Range} */ |
| 4924 | (right.range)[1] |
| 4925 | ], |
| 4926 | value: left.value + right.value, |
| 4927 | code: false, |
| 4928 | conditional: false |
| 4929 | }; |
| 4930 | } |
| 4931 | break; |
| 4932 | case "ConditionalExpression": { |
| 4933 | const consequent = this.parseCalculatedString(expression.consequent); |
| 4934 | const alternate = this.parseCalculatedString(expression.alternate); |
| 4935 | /** @type {CalculatedStringResult[]} */ |
| 4936 | const items = []; |
| 4937 | if (consequent.conditional) { |
| 4938 | items.push(...consequent.conditional); |
| 4939 | } else if (!consequent.code) { |
| 4940 | items.push(consequent); |
| 4941 | } else { |
| 4942 | break; |
| 4943 | } |
| 4944 | if (alternate.conditional) { |
| 4945 | items.push(...alternate.conditional); |
| 4946 | } else if (!alternate.code) { |
no test coverage detected