12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- import { getDocblock } from '../utils/docblock.js';
- import isReactForwardRefCall from '../utils/isReactForwardRefCall.js';
- import resolveToValue from '../utils/resolveToValue.js';
- function getDocblockFromComponent(path) {
- let description = null;
- if (path.isClassDeclaration() || path.isClassExpression()) {
- const decorators = path.get('decorators');
- // If we have a class declaration or expression, then the comment might be
- // attached to the last decorator instead as trailing comment.
- if (decorators && decorators.length > 0) {
- description = getDocblock(decorators[decorators.length - 1], true);
- }
- }
- if (description == null) {
- // Find parent statement (e.g. var Component = React.createClass(<path>);)
- let searchPath = path;
- while (searchPath && !searchPath.isStatement()) {
- searchPath = searchPath.parentPath;
- }
- if (searchPath) {
- // If the parent is an export statement, we have to traverse one more up
- if (searchPath.parentPath.isExportNamedDeclaration() ||
- searchPath.parentPath.isExportDefaultDeclaration()) {
- searchPath = searchPath.parentPath;
- }
- description = getDocblock(searchPath);
- }
- }
- if (!description) {
- const searchPath = isReactForwardRefCall(path)
- ? path.get('arguments')[0]
- : path;
- const inner = resolveToValue(searchPath);
- if (inner.node !== path.node) {
- return getDocblockFromComponent(inner);
- }
- }
- return description;
- }
- /**
- * Finds the nearest block comment before the component definition.
- */
- const componentDocblockHandler = function (documentation, componentDefinition) {
- documentation.set('description', getDocblockFromComponent(componentDefinition) || '');
- };
- export default componentDocblockHandler;
|