@jqassistant/ts-lce
Version:
Tool to extract language concepts from a TypeScript codebase and export them to a JSON file.
67 lines (66 loc) • 5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EnumMemberProcessor = exports.EnumDeclarationProcessor = void 0;
const utils_1 = require("@typescript-eslint/utils");
const concept_1 = require("../concept");
const enum_declaration_concept_1 = require("../concepts/enum-declaration.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 enum_traverser_1 = require("../traversers/enum.traverser");
const dependency_resolution_processor_1 = require("./dependency-resolution.processor");
const code_coordinate_utils_1 = require("./code-coordinate.utils");
const context_keys_1 = require("../context.keys");
class EnumDeclarationProcessor extends processor_1.Processor {
executionCondition = new execution_condition_1.ExecutionCondition([utils_1.AST_NODE_TYPES.TSEnumDeclaration], ({ 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 }) {
localContexts.currentContexts.set(context_keys_1.CoreContextKeys.ENUM_MEMBERS_PROCESSING_FLAG, true);
if (node.type === utils_1.AST_NODE_TYPES.TSEnumDeclaration) {
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(fqnIdentifier));
dependency_resolution_processor_1.DependencyResolutionProcessor.createDependencyIndex(localContexts);
}
}
}
postChildrenProcessing({ node, localContexts, globalContext }, childConcepts) {
if (node.type === utils_1.AST_NODE_TYPES.TSEnumDeclaration) {
const enumName = 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, enumName, fqn, true);
const members = (0, processor_utils_1.getAndDeleteChildConcepts)(enum_traverser_1.EnumDeclarationTraverser.BODY_PROP, enum_declaration_concept_1.LCEEnumMember.conceptId, childConcepts);
const enumeration = new enum_declaration_concept_1.LCEEnumDeclaration(enumName, fqn, members, node.const ?? false, node.declare ?? false, code_coordinate_utils_1.CodeCoordinateUtils.getCodeCoordinates(globalContext, node, true));
return (0, concept_1.singleEntryConceptMap)(enum_declaration_concept_1.LCEEnumDeclaration.conceptId, enumeration);
}
return new Map();
}
}
exports.EnumDeclarationProcessor = EnumDeclarationProcessor;
class EnumMemberProcessor extends processor_1.Processor {
executionCondition = new execution_condition_1.ExecutionCondition([utils_1.AST_NODE_TYPES.TSEnumMember], ({ localContexts }) => {
const context = localContexts.getNextContext(context_keys_1.CoreContextKeys.ENUM_MEMBERS_PROCESSING_FLAG);
return !!context && context[1] === 2;
});
preChildrenProcessing({ node, localContexts }) {
if (node.type === utils_1.AST_NODE_TYPES.TSEnumMember && node.initializer)
localContexts.currentContexts.set(context_keys_1.CoreContextKeys.VALUE_PROCESSING_FLAG, true);
}
postChildrenProcessing({ node, localContexts, globalContext }, childConcepts) {
if (node.type === utils_1.AST_NODE_TYPES.TSEnumMember && !node.computed) {
const init = (0, processor_utils_1.getAndDeleteAllValueChildConcepts)(enum_traverser_1.EnumMemberTraverser.INIT_PROP, childConcepts);
const memberName = node.id.type === utils_1.AST_NODE_TYPES.Identifier ? node.id.name : node.id.raw;
const fqnPrefix = dependency_resolution_processor_1.DependencyResolutionProcessor.constructFQNPrefix(localContexts);
const member = new enum_declaration_concept_1.LCEEnumMember(memberName, new context_1.FQN(fqnPrefix.globalFqn + memberName, fqnPrefix.localFqn + memberName), code_coordinate_utils_1.CodeCoordinateUtils.getCodeCoordinates(globalContext, node), init.length === 1 ? init[0] : undefined);
return (0, concept_1.singleEntryConceptMap)(enum_declaration_concept_1.LCEEnumMember.conceptId, member);
}
// TODO: add enum member with computed names
return new Map();
}
}
exports.EnumMemberProcessor = EnumMemberProcessor;