From f3c662845bc43f0f4f5d449fdce1081b164e0174 Mon Sep 17 00:00:00 2001 From: Joe Savona Date: Mon, 6 Mar 2023 14:51:18 -0800 Subject: [PATCH] Support string literal keys for object expressions For ObjectExpression, we now support computed keys where the key is a string literal. --- compiler/forget/src/HIR/BuildHIR.ts | 9 ++++-- ...ct-expression-string-literal-key.expect.md | 31 +++++++++++++++++++ .../object-expression-string-literal-key.js | 4 +++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 compiler/forget/src/__tests__/fixtures/hir/object-expression-string-literal-key.expect.md create mode 100644 compiler/forget/src/__tests__/fixtures/hir/object-expression-string-literal-key.js diff --git a/compiler/forget/src/HIR/BuildHIR.ts b/compiler/forget/src/HIR/BuildHIR.ts index b90ff15337..c4c200a53e 100644 --- a/compiler/forget/src/HIR/BuildHIR.ts +++ b/compiler/forget/src/HIR/BuildHIR.ts @@ -809,7 +809,12 @@ function lowerExpression( continue; } const key = propertyPath.node.key; - if (key.type !== "Identifier") { + let keyName: string; + if (key.type === "Identifier") { + keyName = key.name; + } else if (key.type === "StringLiteral") { + keyName = key.value; + } else { builder.errors.push({ reason: `(BuildHIR::lowerExpression) Expected Identifier, got ${key.type} key in ObjectExpression`, severity: ErrorSeverity.InvalidInput, @@ -827,7 +832,7 @@ function lowerExpression( continue; } const value = lowerExpressionToTemporary(builder, valuePath); - properties.set(key.name, value); + properties.set(keyName, value); } return { kind: "ObjectExpression", diff --git a/compiler/forget/src/__tests__/fixtures/hir/object-expression-string-literal-key.expect.md b/compiler/forget/src/__tests__/fixtures/hir/object-expression-string-literal-key.expect.md new file mode 100644 index 0000000000..2cdc211ac5 --- /dev/null +++ b/compiler/forget/src/__tests__/fixtures/hir/object-expression-string-literal-key.expect.md @@ -0,0 +1,31 @@ + +## Input + +```javascript +function Component(props) { + const x = { ["foo"]: props.foo }; + return x; +} + +``` + +## Code + +```javascript +function Component(props) { + const $ = React.unstable_useMemoCache(2); + const c_0 = $[0] !== props.foo; + let t0; + if (c_0) { + t0 = { foo: props.foo }; + $[0] = props.foo; + $[1] = t0; + } else { + t0 = $[1]; + } + const x = t0; + return x; +} + +``` + \ No newline at end of file diff --git a/compiler/forget/src/__tests__/fixtures/hir/object-expression-string-literal-key.js b/compiler/forget/src/__tests__/fixtures/hir/object-expression-string-literal-key.js new file mode 100644 index 0000000000..0eaafcac24 --- /dev/null +++ b/compiler/forget/src/__tests__/fixtures/hir/object-expression-string-literal-key.js @@ -0,0 +1,4 @@ +function Component(props) { + const x = { ["foo"]: props.foo }; + return x; +}