text: /**
   * Copyright (c) 2013-present, Facebook, Inc.
   *
   * 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 'react-reconciler/src/ReactFiber';
  
  import {
    REACT_ASYNC_MODE_TYPE,
    REACT_CONTEXT_TYPE,
    REACT_FORWARD_REF_TYPE,
    REACT_FRAGMENT_TYPE,
    REACT_PORTAL_TYPE,
    REACT_PROFILER_TYPE,
    REACT_PROVIDER_TYPE,
    REACT_STRICT_MODE_TYPE,
    REACT_PLACEHOLDER_TYPE,
  } from 'shared/ReactSymbols';
  
  function getComponentName(fiber: Fiber): string | null {
    const {type} = fiber;
    if (typeof type === 'function') {
      return type.displayName || type.name;
    }
    if (typeof type === 'string') {
      return type;
    }
    switch (type) {
      case REACT_ASYNC_MODE_TYPE:
        return 'AsyncMode';
      case REACT_CONTEXT_TYPE:
        return 'Context.Consumer';
      case REACT_FRAGMENT_TYPE:
        return 'ReactFragment';
      case REACT_PORTAL_TYPE:
        return 'ReactPortal';
      case REACT_PROFILER_TYPE:
        return `Profiler(${fiber.pendingProps.id})`;
      case REACT_PROVIDER_TYPE:
        return 'Context.Provider';
      case REACT_STRICT_MODE_TYPE:
        return 'StrictMode';
      case REACT_PLACEHOLDER_TYPE:
        return 'Placeholder';
    }
    if (typeof type === 'object' && type !== null) {
      switch (type.$$typeof) {
        case REACT_FORWARD_REF_TYPE:
          const functionName = type.render.displayName || type.render.name || '';
          return functionName !== ''
            ? `ForwardRef(${functionName})`
            : 'ForwardRef';
      }
    }
    return null;
  }
  
  export default getComponentName;
  