From 5142affc26d61aa32f2088541e6c93f08f21a79f Mon Sep 17 00:00:00 2001 From: Lauren Tan Date: Thu, 15 Feb 2024 17:44:44 -0500 Subject: [PATCH] Allow module level "use no forget" Currently we only allow adding the directive to function bodies, but there may be cases where we want to always opt out an entire module from being compiled by Forget --- .../src/Entrypoint/Program.ts | 5 ++++ .../use-no-forget-module-level.expect.md | 29 +++++++++++++++++++ .../compiler/use-no-forget-module-level.js | 8 +++++ .../packages/sprout/src/SproutTodoFilter.ts | 1 + 4 files changed, 43 insertions(+) create mode 100644 compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/use-no-forget-module-level.expect.md create mode 100644 compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/use-no-forget-module-level.js diff --git a/compiler/packages/babel-plugin-react-forget/src/Entrypoint/Program.ts b/compiler/packages/babel-plugin-react-forget/src/Entrypoint/Program.ts index 934ca5fa74..f2572dd77c 100644 --- a/compiler/packages/babel-plugin-react-forget/src/Entrypoint/Program.ts +++ b/compiler/packages/babel-plugin-react-forget/src/Entrypoint/Program.ts @@ -188,6 +188,11 @@ export function compileProgram( program: NodePath, pass: CompilerPass ): void { + // Top level "use no forget", skip this file entirely + if (findUseNoForgetDirective(program.node.directives) != null) { + return; + } + const options = parsePluginOptions(pass.opts); const environment = parseEnvironmentConfig(pass.opts.environment ?? {}); diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/use-no-forget-module-level.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/use-no-forget-module-level.expect.md new file mode 100644 index 0000000000..b749b15e64 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/use-no-forget-module-level.expect.md @@ -0,0 +1,29 @@ + +## Input + +```javascript +"use no forget"; + +export default function foo(x, y) { + if (x) { + return foo(false, y); + } + return [y * 10]; +} + +``` + +## Code + +```javascript +"use no forget"; + +export default function foo(x, y) { + if (x) { + return foo(false, y); + } + return [y * 10]; +} + +``` + \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/use-no-forget-module-level.js b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/use-no-forget-module-level.js new file mode 100644 index 0000000000..802ea035e8 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/use-no-forget-module-level.js @@ -0,0 +1,8 @@ +"use no forget"; + +export default function foo(x, y) { + if (x) { + return foo(false, y); + } + return [y * 10]; +} diff --git a/compiler/packages/sprout/src/SproutTodoFilter.ts b/compiler/packages/sprout/src/SproutTodoFilter.ts index c319e42ad8..d7ce84f7dc 100644 --- a/compiler/packages/sprout/src/SproutTodoFilter.ts +++ b/compiler/packages/sprout/src/SproutTodoFilter.ts @@ -384,6 +384,7 @@ const skipFilter = new Set([ "useMemo-named-function", "useMemo-return-empty", "useMemo-simple", + "use-no-forget-module-level", // defines multiple functions "alias-while", "babel-existing-react-import",