UNPKG

@jqassistant/ts-lce

Version:

Tool to extract language concepts from a TypeScript codebase and export them to a JSON file.

84 lines (83 loc) 6.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SuperInterfaceDeclarationProcessor = exports.InterfaceDeclarationProcessor = void 0; const utils_1 = require("@typescript-eslint/utils"); const concept_1 = require("../concept"); const interface_declaration_concept_1 = require("../concepts/interface-declaration.concept"); const method_declaration_concept_1 = require("../concepts/method-declaration.concept"); const property_declaration_concept_1 = require("../concepts/property-declaration.concept"); const type_concept_1 = require("../concepts/type.concept"); const context_1 = require("../context"); const execution_condition_1 = require("../execution-condition"); const processor_1 = require("../processor"); const processor_utils_1 = require("../utils/processor.utils"); const interface_declaration_traverser_1 = require("../traversers/interface-declaration.traverser"); const dependency_resolution_processor_1 = require("./dependency-resolution.processor"); const type_utils_1 = require("./type.utils"); const code_coordinate_utils_1 = require("./code-coordinate.utils"); const accessor_declaration_concept_1 = require("../concepts/accessor-declaration.concept"); const context_keys_1 = require("../context.keys"); class InterfaceDeclarationProcessor extends processor_1.Processor { executionCondition = new execution_condition_1.ExecutionCondition([utils_1.AST_NODE_TYPES.TSInterfaceDeclaration], ({ node }) => { return (!!node.parent && (node.parent.type === utils_1.AST_NODE_TYPES.ExportNamedDeclaration || node.parent.type === utils_1.AST_NODE_TYPES.ExportDefaultDeclaration || node.parent.type === utils_1.AST_NODE_TYPES.Program)); }); preChildrenProcessing({ node, localContexts }) { if (node.type === utils_1.AST_NODE_TYPES.TSInterfaceDeclaration) { const fqnIdentifier = dependency_resolution_processor_1.DependencyResolutionProcessor.isDefaultDeclaration(localContexts, node, node.id.name) ? "default" : node.id.name; if (fqnIdentifier) { dependency_resolution_processor_1.DependencyResolutionProcessor.addScopeContext(localContexts, context_1.FQN.id(node.id.name)); dependency_resolution_processor_1.DependencyResolutionProcessor.createDependencyIndex(localContexts); } } localContexts.currentContexts.set(context_keys_1.CoreContextKeys.PROCESS_CLASS_LIKE_MEMBERS, 2); } postChildrenProcessing({ globalContext, localContexts, node, ...unusedProcessingContext }, childConcepts) { if (node.type === utils_1.AST_NODE_TYPES.TSInterfaceDeclaration) { const interfaceName = dependency_resolution_processor_1.DependencyResolutionProcessor.constructDeclarationIdentifier(localContexts, node, node.id.name); const fqn = dependency_resolution_processor_1.DependencyResolutionProcessor.constructScopeFQN(localContexts); dependency_resolution_processor_1.DependencyResolutionProcessor.registerDeclaration(localContexts, interfaceName, fqn, true); // merge accessor properties const childAccProps = (0, processor_utils_1.getAndDeleteChildConcepts)(interface_declaration_traverser_1.InterfaceDeclarationTraverser.BODY_PROP, accessor_declaration_concept_1.LCEAccessorProperty.conceptId, childConcepts); const accessorProperties = new Map(); for (const accProp of childAccProps) { if (accessorProperties.has(accProp.fqn.globalFqn)) { const existingAccProp = accessorProperties.get(accProp.fqn.globalFqn); if (!existingAccProp.getter) { existingAccProp.getter = accProp.getter; } if (!existingAccProp.setter) { existingAccProp.setter = accProp.setter; } } else { accessorProperties.set(accProp.fqn.globalFqn, accProp); } } const interfaceDecl = new interface_declaration_concept_1.LCEInterfaceDeclaration(interfaceName, fqn, (0, type_utils_1.parseClassLikeTypeParameters)({ globalContext, localContexts, node, ...unusedProcessingContext }, node), (0, processor_utils_1.getAndDeleteChildConcepts)(interface_declaration_traverser_1.InterfaceDeclarationTraverser.EXTENDS_PROP, type_concept_1.LCETypeDeclared.conceptId, childConcepts), (0, processor_utils_1.getAndDeleteChildConcepts)(interface_declaration_traverser_1.InterfaceDeclarationTraverser.BODY_PROP, property_declaration_concept_1.LCEPropertyDeclaration.conceptId, childConcepts), (0, processor_utils_1.getAndDeleteChildConcepts)(interface_declaration_traverser_1.InterfaceDeclarationTraverser.BODY_PROP, method_declaration_concept_1.LCEMethodDeclaration.conceptId, childConcepts), [...accessorProperties.values()], code_coordinate_utils_1.CodeCoordinateUtils.getCodeCoordinates(globalContext, node, true)); return (0, concept_1.mergeConceptMaps)((0, concept_1.singleEntryConceptMap)(interface_declaration_concept_1.LCEInterfaceDeclaration.conceptId, interfaceDecl), dependency_resolution_processor_1.DependencyResolutionProcessor.getRegisteredDependencies(localContexts)); } return new Map(); } } exports.InterfaceDeclarationProcessor = InterfaceDeclarationProcessor; class SuperInterfaceDeclarationProcessor extends processor_1.Processor { executionCondition = new execution_condition_1.ExecutionCondition([utils_1.AST_NODE_TYPES.Identifier], ({ node, localContexts }) => !!node.parent && node.parent.type === utils_1.AST_NODE_TYPES.TSInterfaceHeritage && (0, processor_utils_1.getParentPropName)(localContexts) === interface_declaration_traverser_1.InterfaceHeritageTraverser.EXPRESSION_PROP); postChildrenProcessing({ node, ...unusedProcessingContext }) { if (node.type === utils_1.AST_NODE_TYPES.Identifier && node.parent?.type === utils_1.AST_NODE_TYPES.TSInterfaceHeritage) { const superType = (0, type_utils_1.parseClassLikeBaseType)({ node, ...unusedProcessingContext, }, node, node.parent.typeArguments?.params); if (superType) { return (0, concept_1.singleEntryConceptMap)(type_concept_1.LCETypeDeclared.conceptId, superType); } } return new Map(); } } exports.SuperInterfaceDeclarationProcessor = SuperInterfaceDeclarationProcessor;