summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/utils/expressions.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/src/utils/expressions.js')
-rw-r--r--devtools/client/debugger/src/utils/expressions.js67
1 files changed, 67 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/utils/expressions.js b/devtools/client/debugger/src/utils/expressions.js
new file mode 100644
index 0000000000..f30d0c089c
--- /dev/null
+++ b/devtools/client/debugger/src/utils/expressions.js
@@ -0,0 +1,67 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { correctIndentation } from "./indentation";
+import { getGrip, getFront } from "./evaluation-result";
+
+const UNAVAILABLE_GRIP = { unavailable: true };
+
+/*
+ * wrap the expression input in a try/catch so that it can be safely
+ * evaluated.
+ *
+ * NOTE: we add line after the expression to protect against comments.
+ */
+export function wrapExpression(input) {
+ return correctIndentation(`
+ try {
+ ${input}
+ } catch (e) {
+ e
+ }
+ `);
+}
+
+function isUnavailable(value) {
+ return (
+ value &&
+ !!value.isError &&
+ (value.class === "ReferenceError" || value.class === "TypeError")
+ );
+}
+
+/**
+ *
+ * @param {Object} expression: Expression item as stored in state.expressions in reducers/expressions.js
+ * @param {String} expression.input: evaluated expression string
+ * @param {Object} expression.value: evaluated expression result object as returned from ScriptCommand#execute
+ * @param {Object} expression.value.result: expression result, might be a primitive, a grip or a front
+ * @param {Object} expression.value.exception: expression result error, might be a primitive, a grip or a front
+ * @returns {Object} an object of the following shape:
+ * - expressionResultGrip: A primitive or a grip
+ * - expressionResultFront: An object front if it exists, or undefined
+ */
+export function getExpressionResultGripAndFront(expression) {
+ const { value } = expression;
+
+ if (!value) {
+ return { expressionResultGrip: UNAVAILABLE_GRIP };
+ }
+
+ const expressionResultReturn = value.exception || value.result;
+ const valueGrip = getGrip(expressionResultReturn);
+ if (!valueGrip || isUnavailable(valueGrip)) {
+ return { expressionResultGrip: UNAVAILABLE_GRIP };
+ }
+
+ if (valueGrip.isError) {
+ const { name, message } = valueGrip.preview;
+ return { expressionResultGrip: `${name}: ${message}` };
+ }
+
+ return {
+ expressionResultGrip: valueGrip,
+ expressionResultFront: getFront(expressionResultReturn),
+ };
+}