| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = removeTypeDuplicates; |
| |
| var _generated = require("../../validators/generated"); |
| |
| function removeTypeDuplicates(nodes) { |
| const generics = {}; |
| const bases = {}; |
| const typeGroups = []; |
| 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.indexOf(node.types) < 0) { |
| nodes = nodes.concat(node.types); |
| typeGroups.push(node.types); |
| } |
| |
| continue; |
| } |
| |
| if ((0, _generated.isGenericTypeAnnotation)(node)) { |
| const name = node.id.name; |
| |
| 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; |
| } |