From 34539324c722fc71c4a19f62ab6facf895a30069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=9D=A8=E5=B8=86?= <39647285+leno23@users.noreply.github.com> Date: Sat, 16 May 2026 16:41:16 +0800 Subject: [PATCH] fix(devtools): preserve compiler badge for nested Forget names --- .../src/__tests__/utils-test.js | 17 +++++++++++++++++ packages/react-devtools-shared/src/utils.js | 16 +++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/react-devtools-shared/src/__tests__/utils-test.js b/packages/react-devtools-shared/src/__tests__/utils-test.js index 9b9e82102cce..a6871e369b45 100644 --- a/packages/react-devtools-shared/src/__tests__/utils-test.js +++ b/packages/react-devtools-shared/src/__tests__/utils-test.js @@ -11,7 +11,9 @@ import { getDisplayName, getDisplayNameForReactElement, isPlainObject, + parseElementDisplayNameFromBackend, } from 'react-devtools-shared/src/utils'; +import {ElementTypeMemo} from 'react-devtools-shared/src/frontend/types'; import {stackToComponentLocations} from 'react-devtools-shared/src/devtools/utils'; import { formatConsoleArguments, @@ -82,6 +84,21 @@ describe('utils', () => { }); }); + describe('parseElementDisplayNameFromBackend', () => { + it('should identify Forget inside HOC wrappers', () => { + expect( + parseElementDisplayNameFromBackend( + 'Memo(Forget(Example))', + ElementTypeMemo, + ), + ).toEqual({ + formattedDisplayName: 'Example', + hocDisplayNames: ['Memo'], + compiledWithForget: true, + }); + }); + }); + describe('getDisplayNameForReactElement', () => { // @reactVersion >= 16.0 it('should return correct display name for an element with function type', () => { diff --git a/packages/react-devtools-shared/src/utils.js b/packages/react-devtools-shared/src/utils.js index aa7ba33dc595..38ad6f1a6058 100644 --- a/packages/react-devtools-shared/src/utils.js +++ b/packages/react-devtools-shared/src/utils.js @@ -596,11 +596,25 @@ export function parseElementDisplayNameFromBackend( break; } + let compiledWithForget = false; + if (hocDisplayNames !== null) { + const forgetIndex = hocDisplayNames.indexOf('Forget'); + if (forgetIndex >= 0) { + compiledWithForget = true; + hocDisplayNames = hocDisplayNames.filter( + hocDisplayName => hocDisplayName !== 'Forget', + ); + if (hocDisplayNames.length === 0) { + hocDisplayNames = null; + } + } + } + return { // $FlowFixMe[incompatible-return] formattedDisplayName: displayName, hocDisplayNames, - compiledWithForget: false, + compiledWithForget, }; }