diff --git a/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts b/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts index d33bfb2694..b42f3daba1 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts @@ -2407,6 +2407,10 @@ function lowerExpression( loc: expr.node.loc ?? GeneratedSource, }; } + case "TSNonNullExpression": { + let expr = exprPath as NodePath; + return lowerExpression(builder, expr.get("expression")); + } default: { builder.errors.push({ reason: `(BuildHIR::lowerExpression) Handle ${exprPath.type} expressions`, diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/non-null-assertion.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/non-null-assertion.expect.md new file mode 100644 index 0000000000..11b8e50c6d --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/non-null-assertion.expect.md @@ -0,0 +1,49 @@ + +## Input + +```javascript +interface ComponentProps { + name?: string; +} + +function Component(props: ComponentProps) { + return props.name!.toUpperCase(); +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ name: "Alice" }], +}; + +``` + +## Code + +```javascript +import { c as _c } from "react/compiler-runtime"; +interface ComponentProps { + name?: string; +} + +function Component(props) { + const $ = _c(2); + let t0; + if ($[0] !== props.name) { + t0 = props.name.toUpperCase(); + $[0] = props.name; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ name: "Alice" }], +}; + +``` + +### Eval output +(kind: ok) "ALICE" \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/non-null-assertion.ts b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/non-null-assertion.ts new file mode 100644 index 0000000000..986b9a9a47 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/non-null-assertion.ts @@ -0,0 +1,12 @@ +interface ComponentProps { + name?: string; +} + +function Component(props: ComponentProps) { + return props.name!.toUpperCase(); +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ name: "Alice" }], +};