diff options
Diffstat (limited to 'chromium/third_party/node/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js')
-rw-r--r-- | chromium/third_party/node/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/chromium/third_party/node/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js b/chromium/third_party/node/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js new file mode 100644 index 00000000000..de9464d1672 --- /dev/null +++ b/chromium/third_party/node/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js @@ -0,0 +1,78 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = removeTypeDuplicates; + +var _generated = require("../../validators/generated"); + +function getQualifiedName(node) { + return (0, _generated.isIdentifier)(node) ? node.name : `${node.id.name}.${getQualifiedName(node.qualification)}`; +} + +function removeTypeDuplicates(nodes) { + const generics = {}; + const bases = {}; + const typeGroups = new Set(); + const types = []; + + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!node) continue; + + if (types.indexOf(node) >= 0) { + continue; + } + + if ((0, _generated.isAnyTypeAnnotation)(node)) { + return [node]; + } + + if ((0, _generated.isFlowBaseAnnotation)(node)) { + bases[node.type] = node; + continue; + } + + if ((0, _generated.isUnionTypeAnnotation)(node)) { + if (!typeGroups.has(node.types)) { + nodes = nodes.concat(node.types); + typeGroups.add(node.types); + } + + continue; + } + + if ((0, _generated.isGenericTypeAnnotation)(node)) { + const name = getQualifiedName(node.id); + + if (generics[name]) { + let existing = generics[name]; + + if (existing.typeParameters) { + if (node.typeParameters) { + existing.typeParameters.params = removeTypeDuplicates(existing.typeParameters.params.concat(node.typeParameters.params)); + } + } else { + existing = node.typeParameters; + } + } else { + generics[name] = node; + } + + continue; + } + + types.push(node); + } + + for (const type of Object.keys(bases)) { + types.push(bases[type]); + } + + for (const name of Object.keys(generics)) { + types.push(generics[name]); + } + + return types; +}
\ No newline at end of file |