@@ -26,10 +26,11 @@ import {
2626 inspectElement ,
2727} from 'react-devtools-shared/src/inspectedElementCache' ;
2828import {
29+ clearHookNamesCache ,
2930 hasAlreadyLoadedHookNames ,
3031 loadHookNames ,
3132} from 'react-devtools-shared/src/hookNamesCache' ;
32- import LoadHookNamesFunctionContext from 'react-devtools-shared/src/devtools/views/Components/LoadHookNamesFunctionContext ' ;
33+ import HookNamesContext from 'react-devtools-shared/src/devtools/views/Components/HookNamesContext ' ;
3334import { SettingsContext } from '../Settings/SettingsContext' ;
3435
3536import type { HookNames } from 'react-devtools-shared/src/types' ;
@@ -63,7 +64,10 @@ export type Props = {|
6364
6465export function InspectedElementContextController ( { children} : Props ) {
6566 const { selectedElementID} = useContext ( TreeStateContext ) ;
66- const loadHookNamesFunction = useContext ( LoadHookNamesFunctionContext ) ;
67+ const {
68+ loadHookNames : loadHookNamesFunction ,
69+ purgeCachedMetadata,
70+ } = useContext ( HookNamesContext ) ;
6771 const bridge = useContext ( BridgeContext ) ;
6872 const store = useContext ( StoreContext ) ;
6973 const { parseHookNames : parseHookNamesByDefault } = useContext ( SettingsContext ) ;
@@ -150,6 +154,24 @@ export function InspectedElementContextController({children}: Props) {
150154 [ setState , state ] ,
151155 ) ;
152156
157+ useEffect ( ( ) => {
158+ if ( enableHookNameParsing ) {
159+ if ( typeof purgeCachedMetadata === 'function' ) {
160+ // When Fast Refresh updates a component, any cached AST metadata may be invalid.
161+ const fastRefreshScheduled = ( ) => {
162+ startTransition ( ( ) => {
163+ clearHookNamesCache ( ) ;
164+ purgeCachedMetadata ( ) ;
165+ refresh ( ) ;
166+ } ) ;
167+ } ;
168+ bridge . addListener ( 'fastRefreshScheduled' , fastRefreshScheduled ) ;
169+ return ( ) =>
170+ bridge . removeListener ( 'fastRefreshScheduled' , fastRefreshScheduled ) ;
171+ }
172+ }
173+ } , [ bridge ] ) ;
174+
153175 // Reset path now that we've asked the backend to hydrate it.
154176 // The backend is stateful, so we don't need to remember this path the next time we inspect.
155177 useEffect ( ( ) => {
0 commit comments