function buildFbtNodeMapForSameParam()

in packages/babel-plugin-fbt/src/fbt-nodes/FbtNodeUtil.js [232:284]


function buildFbtNodeMapForSameParam(
  fbtNode: FbtElementNode,
  argsMap: StringVariationArgsMap,
): {|[string]: FbtChildNode|} {
  // Importing this module only here to avoid dependency cycle
  const FbtImplicitParamNode = require('./FbtImplicitParamNode');
  const FbtSameParamNode = require('./FbtSameParamNode');
  const tokenNameToFbtNode = {};
  const tokenNameToSameParamNode: {[string]: FbtSameParamNode} = {};
  runOnNestedChildren(fbtNode, child => {
    if (child instanceof FbtSameParamNode) {
      tokenNameToSameParamNode[child.getTokenName(argsMap)] = child;
      return;
    } else if (
      // FbtImplicitParamNode token names appear redundant but
      // they'll be deduplicated via the token name mangling logic
      child instanceof FbtImplicitParamNode
    ) {
      return;
    }
    const tokenName = child.getTokenName(argsMap);
    if (tokenName != null) {
      const existingFbtNode = tokenNameToFbtNode[tokenName];
      invariant(
        existingFbtNode == null || existingFbtNode === child,
        "There's already a token called `%s` in this %s call. " +
          'Use %s.sameParam if you want to reuse the same token name or ' +
          'give this token a different name.\n' +
          'Existing FbtNode=%s\n' +
          'Redundant FbtNode=%s',
        tokenName,
        fbtNode.moduleName,
        fbtNode.moduleName,
        varDump(existingFbtNode),
        varDump(child),
      );
      tokenNameToFbtNode[tokenName] = child;
    }
  });

  const sameParamTokenNameToRealFbtNode = {};
  for (const sameParamTokenName in tokenNameToSameParamNode) {
    const realFbtNode = tokenNameToFbtNode[sameParamTokenName];
    invariant(
      realFbtNode != null,
      'Expected fbt `sameParam` construct with name=`%s` to refer to a ' +
        '`name` or `param` construct using the same token name',
      sameParamTokenName,
    );
    sameParamTokenNameToRealFbtNode[sameParamTokenName] = realFbtNode;
  }
  return sameParamTokenNameToRealFbtNode;
}