mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
108 lines
2.6 KiB
JavaScript
108 lines
2.6 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
*/
|
|
|
|
import type {Fiber} from './ReactFiber';
|
|
|
|
import ReactSharedInternals from 'shared/ReactSharedInternals';
|
|
import {
|
|
HostRoot,
|
|
HostPortal,
|
|
HostText,
|
|
Fragment,
|
|
ContextProvider,
|
|
ContextConsumer,
|
|
} from 'shared/ReactWorkTags';
|
|
import describeComponentFrame from 'shared/describeComponentFrame';
|
|
import getComponentName from 'shared/getComponentName';
|
|
|
|
const ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
|
|
|
|
type LifeCyclePhase = 'render' | 'getChildContext';
|
|
|
|
function describeFiber(fiber: Fiber): string {
|
|
switch (fiber.tag) {
|
|
case HostRoot:
|
|
case HostPortal:
|
|
case HostText:
|
|
case Fragment:
|
|
case ContextProvider:
|
|
case ContextConsumer:
|
|
return '';
|
|
default:
|
|
const owner = fiber._debugOwner;
|
|
const source = fiber._debugSource;
|
|
const name = getComponentName(fiber.type);
|
|
let ownerName = null;
|
|
if (owner) {
|
|
ownerName = getComponentName(owner.type);
|
|
}
|
|
return describeComponentFrame(name, source, ownerName);
|
|
}
|
|
}
|
|
|
|
export function getStackByFiberInDevAndProd(workInProgress: Fiber): string {
|
|
let info = '';
|
|
let node = workInProgress;
|
|
do {
|
|
info += describeFiber(node);
|
|
node = node.return;
|
|
} while (node);
|
|
return info;
|
|
}
|
|
|
|
export let current: Fiber | null = null;
|
|
export let phase: LifeCyclePhase | null = null;
|
|
|
|
export function getCurrentFiberOwnerNameInDevOrNull(): string | null {
|
|
if (__DEV__) {
|
|
if (current === null) {
|
|
return null;
|
|
}
|
|
const owner = current._debugOwner;
|
|
if (owner !== null && typeof owner !== 'undefined') {
|
|
return getComponentName(owner.type);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function getCurrentFiberStackInDev(): string {
|
|
if (__DEV__) {
|
|
if (current === null) {
|
|
return '';
|
|
}
|
|
// Safe because if current fiber exists, we are reconciling,
|
|
// and it is guaranteed to be the work-in-progress version.
|
|
return getStackByFiberInDevAndProd(current);
|
|
}
|
|
return '';
|
|
}
|
|
|
|
export function resetCurrentFiber() {
|
|
if (__DEV__) {
|
|
ReactDebugCurrentFrame.getCurrentStack = null;
|
|
current = null;
|
|
phase = null;
|
|
}
|
|
}
|
|
|
|
export function setCurrentFiber(fiber: Fiber) {
|
|
if (__DEV__) {
|
|
ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackInDev;
|
|
current = fiber;
|
|
phase = null;
|
|
}
|
|
}
|
|
|
|
export function setCurrentPhase(lifeCyclePhase: LifeCyclePhase | null) {
|
|
if (__DEV__) {
|
|
phase = lifeCyclePhase;
|
|
}
|
|
}
|