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;
}