#pragma once #include #include "ASTNode.h" #include "Module.h" #include "Function.h" #include "Variable.h" #include "Parameter.h" #include "Statement.h" #include "Expression.h" #include "Type.h" #include "Annotation.h" #include "HostBoundary.h" #include "../EnvironmentSpec.h" #include "Import.h" #include "ExternalModule.h" #include "TypeSignature.h" #include "ClassDeclaration.h" #include "GenericType.h" #include "AsyncNodes.h" #include "PreprocessorNodes.h" #include "EnumNamespaceNodes.h" #include "SqlNodes.h" using json = nlohmann::json; inline json propertiesToJson(const ASTNode* node) { json props = json::object(); const auto& ct = node->conceptType; // Module if (ct == "Module") { auto* n = static_cast(node); props["name"] = n->name; props["targetLanguage"] = n->targetLanguage; } // Function else if (ct == "Function") { auto* n = static_cast(node); props["name"] = n->name; } // Variable else if (ct == "Variable") { auto* n = static_cast(node); props["name"] = n->name; } // Parameter else if (ct == "Parameter") { auto* n = static_cast(node); props["name"] = n->name; } // Statements else if (ct == "ForLoop") { auto* n = static_cast(node); props["iteratorName"] = n->iteratorName; } // Expressions else if (ct == "BinaryOperation") { auto* n = static_cast(node); props["op"] = n->op; } else if (ct == "UnaryOperation") { auto* n = static_cast(node); props["op"] = n->op; } else if (ct == "FunctionCall") { auto* n = static_cast(node); props["functionName"] = n->functionName; } else if (ct == "VariableReference") { auto* n = static_cast(node); props["variableName"] = n->variableName; } else if (ct == "IntegerLiteral") { auto* n = static_cast(node); props["value"] = n->value; } else if (ct == "FloatLiteral") { auto* n = static_cast(node); props["value"] = n->value; } else if (ct == "StringLiteral") { auto* n = static_cast(node); props["value"] = n->value; } else if (ct == "BooleanLiteral") { auto* n = static_cast(node); props["value"] = n->value; } else if (ct == "MemberAccess") { auto* n = static_cast(node); props["memberName"] = n->memberName; } // Types else if (ct == "PrimitiveType") { auto* n = static_cast(node); props["kind"] = n->kind; } else if (ct == "CustomType") { auto* n = static_cast(node); props["typeName"] = n->typeName; } // Imports / External modules else if (ct == "Import") { auto* n = static_cast(node); props["moduleName"] = n->moduleName; if (!n->alias.empty()) props["alias"] = n->alias; if (!n->importKind.empty()) props["importKind"] = n->importKind; } else if (ct == "ExternalModule") { auto* n = static_cast(node); props["name"] = n->name; if (!n->version.empty()) props["version"] = n->version; if (!n->language.empty()) props["language"] = n->language; if (!n->semanticTags.empty()) props["semanticTags"] = n->semanticTags; } else if (ct == "TypeSignature") { auto* n = static_cast(node); props["name"] = n->name; props["variadic"] = n->variadic; if (!n->semanticTags.empty()) props["semanticTags"] = n->semanticTags; } // Annotations else if (ct == "DerefStrategy") { auto* n = static_cast(node); props["strategy"] = n->strategy; if (!n->derefLocation.empty()) props["derefLocation"] = n->derefLocation; if (!n->owner.empty()) props["owner"] = n->owner; } else if (ct == "OptimizationLock") { auto* n = static_cast(node); props["lockedBy"] = n->lockedBy; props["lockReason"] = n->lockReason; props["lockLevel"] = n->lockLevel; if (!n->affectedStrategies.empty()) props["affectedStrategies"] = n->affectedStrategies; if (!n->timestamp.empty()) props["timestamp"] = n->timestamp; } else if (ct == "LangSpecific") { auto* n = static_cast(node); props["language"] = n->language; props["idiomType"] = n->idiomType; props["rawSyntax"] = n->rawSyntax; if (!n->semanticHint.empty()) props["semanticHint"] = n->semanticHint; if (!n->position.empty()) props["position"] = n->position; } // Semantic annotations (Sprint 10) else if (ct == "IntentAnnotation") { auto* n = static_cast(node); if (!n->summary.empty()) props["summary"] = n->summary; if (!n->category.empty()) props["category"] = n->category; } else if (ct == "ComplexityAnnotation") { auto* n = static_cast(node); if (!n->timeComplexity.empty()) props["timeComplexity"] = n->timeComplexity; props["cognitiveComplexity"] = n->cognitiveComplexity; props["linesOfLogic"] = n->linesOfLogic; } else if (ct == "RiskAnnotation") { auto* n = static_cast(node); if (!n->level.empty()) props["level"] = n->level; if (!n->reason.empty()) props["reason"] = n->reason; props["dependentCount"] = n->dependentCount; } else if (ct == "ContractAnnotation") { auto* n = static_cast(node); if (!n->preconditions.empty()) props["preconditions"] = n->preconditions; if (!n->postconditions.empty()) props["postconditions"] = n->postconditions; if (!n->returnShape.empty()) props["returnShape"] = n->returnShape; if (!n->sideEffects.empty()) props["sideEffects"] = n->sideEffects; } else if (ct == "SemanticTagAnnotation") { auto* n = static_cast(node); if (!n->tags.empty()) props["tags"] = n->tags; } // Type System — Layout & Constraints (Step 272) else if (ct == "BitWidthAnnotation") { auto* n = static_cast(node); props["width"] = n->width; } else if (ct == "EndianAnnotation") { auto* n = static_cast(node); if (!n->order.empty()) props["order"] = n->order; } else if (ct == "LayoutAnnotation") { auto* n = static_cast(node); if (!n->mode.empty()) props["mode"] = n->mode; props["alignment"] = n->alignment; } else if (ct == "NullabilityAnnotation") { auto* n = static_cast(node); props["nullable"] = n->nullable; if (!n->strategy.empty()) props["strategy"] = n->strategy; } else if (ct == "VarianceAnnotation") { auto* n = static_cast(node); if (!n->variance.empty()) props["variance"] = n->variance; } // Type System — Identity & Mutability (Step 273) else if (ct == "IdentityAnnotation") { auto* n = static_cast(node); if (!n->mode.empty()) props["mode"] = n->mode; } else if (ct == "MutAnnotation") { auto* n = static_cast(node); if (!n->depth.empty()) props["depth"] = n->depth; } else if (ct == "TypeStateAnnotation") { auto* n = static_cast(node); if (!n->state.empty()) props["state"] = n->state; } // Concurrency — Primitives & Memory Model (Step 274) else if (ct == "AtomicAnnotation") { auto* n = static_cast(node); if (!n->consistency.empty()) props["consistency"] = n->consistency; } else if (ct == "SyncAnnotation") { auto* n = static_cast(node); if (!n->primitive.empty()) props["primitive"] = n->primitive; } else if (ct == "ThreadModelAnnotation") { auto* n = static_cast(node); if (!n->model.empty()) props["model"] = n->model; } // MemoryBarrierAnnotation has no extra fields // Async, Parallelism & Error Handling (Step 275) else if (ct == "ExecAnnotation") { auto* n = static_cast(node); if (!n->mode.empty()) props["mode"] = n->mode; if (!n->runtimeHint.empty()) props["runtimeHint"] = n->runtimeHint; } else if (ct == "BlockingAnnotation") { auto* n = static_cast(node); if (!n->kind.empty()) props["kind"] = n->kind; } else if (ct == "ParallelAnnotation") { auto* n = static_cast(node); if (!n->kind.empty()) props["kind"] = n->kind; } else if (ct == "TrapAnnotation") { auto* n = static_cast(node); if (!n->signal.empty()) props["signal"] = n->signal; } else if (ct == "ExceptionAnnotation") { auto* n = static_cast(node); if (!n->style.empty()) props["style"] = n->style; } else if (ct == "PanicAnnotation") { auto* n = static_cast(node); if (!n->behavior.empty()) props["behavior"] = n->behavior; } // Scope & Namespace (Step 276) else if (ct == "BindingAnnotation") { auto* n = static_cast(node); if (!n->time.empty()) props["time"] = n->time; } else if (ct == "LookupAnnotation") { auto* n = static_cast(node); if (!n->mode.empty()) props["mode"] = n->mode; } else if (ct == "CaptureAnnotation") { auto* n = static_cast(node); if (!n->strategy.empty()) props["strategy"] = n->strategy; } else if (ct == "VisibilityAnnotation") { auto* n = static_cast(node); if (!n->level.empty()) props["level"] = n->level; } else if (ct == "NamespaceAnnotation") { auto* n = static_cast(node); if (!n->style.empty()) props["style"] = n->style; } else if (ct == "ScopeAnnotation") { auto* n = static_cast(node); if (!n->kind.empty()) props["kind"] = n->kind; } // Shim & Escape Hatch (Step 278) else if (ct == "IntrinsicAnnotation") { auto* n = static_cast(node); if (!n->instruction.empty()) props["instruction"] = n->instruction; if (!n->arch.empty()) props["arch"] = n->arch; } else if (ct == "RawAnnotation") { auto* n = static_cast(node); if (!n->language.empty()) props["language"] = n->language; if (!n->code.empty()) props["code"] = n->code; } else if (ct == "CallingConvAnnotation") { auto* n = static_cast(node); if (!n->convention.empty()) props["convention"] = n->convention; } else if (ct == "LinkAnnotation") { auto* n = static_cast(node); if (!n->symbolName.empty()) props["symbolName"] = n->symbolName; if (!n->library.empty()) props["library"] = n->library; } else if (ct == "ShimAnnotation") { auto* n = static_cast(node); if (!n->strategy.empty()) props["strategy"] = n->strategy; } // PointerArithmeticAnnotation — marker, no fields else if (ct == "OpaqueAnnotation") { auto* n = static_cast(node); if (!n->reason.empty()) props["reason"] = n->reason; } // Platform & Provenance (Step 279) else if (ct == "TargetAnnotation") { auto* n = static_cast(node); if (!n->platform.empty()) props["platform"] = n->platform; if (!n->arch.empty()) props["arch"] = n->arch; } else if (ct == "FeatureAnnotation") { auto* n = static_cast(node); if (!n->flag.empty()) props["flag"] = n->flag; props["enabled"] = n->enabled; } else if (ct == "OriginalAnnotation") { auto* n = static_cast(node); if (!n->sourceCode.empty()) props["sourceCode"] = n->sourceCode; if (!n->sourceLanguage.empty()) props["sourceLanguage"] = n->sourceLanguage; } else if (ct == "MappingAnnotation") { auto* n = static_cast(node); if (!n->history.empty()) props["history"] = n->history; } // Optimization Completion (Step 280) // TailCallAnnotation — marker, no fields else if (ct == "LoopAnnotation") { auto* n = static_cast(node); if (!n->hint.empty()) props["hint"] = n->hint; if (n->factor > 0) props["factor"] = n->factor; } else if (ct == "DataAnnotation") { auto* n = static_cast(node); if (!n->hint.empty()) props["hint"] = n->hint; } else if (ct == "AlignAnnotation") { auto* n = static_cast(node); props["bytes"] = n->bytes; } // PackAnnotation — marker, no fields else if (ct == "BoundsCheckAnnotation") { auto* n = static_cast(node); props["enabled"] = n->enabled; } else if (ct == "OverflowAnnotation") { auto* n = static_cast(node); if (!n->behavior.empty()) props["behavior"] = n->behavior; } // Meta-Programming (Step 281) else if (ct == "MetaAnnotation") { auto* n = static_cast(node); if (!n->state.empty()) props["state"] = n->state; if (!n->phase.empty()) props["phase"] = n->phase; } else if (ct == "SymbolAnnotation") { auto* n = static_cast(node); if (!n->mode.empty()) props["mode"] = n->mode; } else if (ct == "EvaluateAnnotation") { auto* n = static_cast(node); if (!n->phase.empty()) props["phase"] = n->phase; } else if (ct == "TemplateAnnotation") { auto* n = static_cast(node); if (!n->specialization.empty()) props["specialization"] = n->specialization; } else if (ct == "SyntheticAnnotation") { auto* n = static_cast(node); if (!n->generator.empty()) props["generator"] = n->generator; props["isStructuralRisk"] = n->isStructuralRisk; } // Strategy & Policy (Step 282) else if (ct == "PolicyAnnotation") { auto* n = static_cast(node); if (!n->strictness.empty()) props["strictness"] = n->strictness; if (!n->perf.empty()) props["perf"] = n->perf; if (!n->style.empty()) props["style"] = n->style; props["binaryStable"] = n->binaryStable; } else if (ct == "AmbiguityAnnotation") { auto* n = static_cast(node); if (!n->intent.empty()) props["intent"] = n->intent; if (!n->options.empty()) props["options"] = n->options; if (!n->level.empty()) props["level"] = n->level; if (!n->description.empty()) props["description"] = n->description; } else if (ct == "CandidateAnnotation") { auto* n = static_cast(node); if (!n->inferredTypes.empty()) props["inferredTypes"] = n->inferredTypes; } else if (ct == "TradeoffAnnotation") { auto* n = static_cast(node); if (!n->reason.empty()) props["reason"] = n->reason; if (!n->safetyCost.empty()) props["safetyCost"] = n->safetyCost; if (!n->perfCost.empty()) props["perfCost"] = n->perfCost; } else if (ct == "ChoiceAnnotation") { auto* n = static_cast(node); if (!n->choiceId.empty()) props["choiceId"] = n->choiceId; if (!n->options.empty()) props["options"] = n->options; } else if (ct == "DecisionAnnotation") { auto* n = static_cast(node); if (!n->choiceId.empty()) props["choiceId"] = n->choiceId; if (!n->selection.empty()) props["selection"] = n->selection; if (!n->author.empty()) props["author"] = n->author; if (!n->reason.empty()) props["reason"] = n->reason; } // Subject 9: Workflow Routing (Step 315) else if (ct == "ContextWidthAnnotation") { auto* n = static_cast(node); if (!n->width.empty()) props["width"] = n->width; } else if (ct == "ReviewAnnotation") { auto* n = static_cast(node); props["required"] = n->required; if (!n->reviewer.empty()) props["reviewer"] = n->reviewer; if (!n->reason.empty()) props["reason"] = n->reason; } else if (ct == "AutomatabilityAnnotation") { auto* n = static_cast(node); if (!n->strategy.empty()) props["strategy"] = n->strategy; if (n->confidence > 0.0) props["confidence"] = n->confidence; } else if (ct == "PriorityAnnotation") { auto* n = static_cast(node); if (!n->level.empty()) props["level"] = n->level; if (!n->blockedBy.empty()) props["blockedBy"] = n->blockedBy; } else if (ct == "ImplementationStatusAnnotation") { auto* n = static_cast(node); if (!n->status.empty()) props["status"] = n->status; if (!n->assignee.empty()) props["assignee"] = n->assignee; } // Host Boundary (Step 288) else if (ct == "HostCall") { auto* n = static_cast(node); if (!n->capability.empty()) props["capability"] = n->capability; if (!n->name.empty()) props["name"] = n->name; } else if (ct == "ScheduleTask") { auto* n = static_cast(node); if (!n->queue.empty()) props["queue"] = n->queue; } else if (ct == "ModuleLoad") { auto* n = static_cast(node); if (!n->moduleName.empty()) props["moduleName"] = n->moduleName; if (!n->mode.empty()) props["mode"] = n->mode; } // Environment Layer (Step 284-285) else if (ct == "CapabilityRequirement") { auto* n = static_cast(node); if (!n->capability.empty()) props["capability"] = n->capability; props["required"] = n->required; } // New AST nodes (Sprint 11c) else if (ct == "ClassDeclaration") { auto* n = static_cast(node); props["name"] = n->name; if (!n->superClass.empty()) props["superClass"] = n->superClass; props["isAbstract"] = n->isAbstract; if (!n->baseClasses.empty()) { json bases = json::array(); for (const auto& bc : n->baseClasses) { json bj; bj["name"] = bc.name; bj["accessSpecifier"] = bc.accessSpecifier; bj["isVirtual"] = bc.isVirtual; bases.push_back(bj); } props["baseClasses"] = bases; } } else if (ct == "InterfaceDeclaration") { auto* n = static_cast(node); props["name"] = n->name; } else if (ct == "MethodDeclaration") { auto* n = static_cast(node); props["name"] = n->name; if (!n->className.empty()) props["className"] = n->className; props["isStatic"] = n->isStatic; if (!n->visibility.empty()) props["visibility"] = n->visibility; props["isOverride"] = n->isOverride; props["isVirtual"] = n->isVirtual; } else if (ct == "GenericType") { auto* n = static_cast(node); props["baseName"] = n->baseName; if (n->isClassTemplate) props["isClassTemplate"] = n->isClassTemplate; } else if (ct == "TypeParameter") { auto* n = static_cast(node); props["name"] = n->name; if (!n->constraint.empty()) props["constraint"] = n->constraint; if (n->isVariadic) props["isVariadic"] = n->isVariadic; } else if (ct == "AsyncFunction") { auto* n = static_cast(node); props["name"] = n->name; props["isAsync"] = n->isAsync; } // AwaitExpression — no extra properties else if (ct == "LambdaExpression") { auto* n = static_cast(node); if (!n->captureList.empty()) props["captureList"] = n->captureList; } else if (ct == "DecoratorAnnotation") { auto* n = static_cast(node); props["name"] = n->name; } // Preprocessor nodes (Step 337) else if (ct == "IncludeDirective") { auto* n = static_cast(node); props["path"] = n->path; if (n->isSystem) props["isSystem"] = n->isSystem; } else if (ct == "PragmaDirective") { auto* n = static_cast(node); props["directive"] = n->directive; } else if (ct == "MacroDefinition") { auto* n = static_cast(node); props["name"] = n->name; if (!n->body.empty()) props["body"] = n->body; if (n->isFunctionLike) props["isFunctionLike"] = n->isFunctionLike; if (!n->parameters.empty()) props["parameters"] = n->parameters; } // Enum/Namespace/TypeAlias nodes (Step 338) else if (ct == "EnumDeclaration") { auto* n = static_cast(node); props["name"] = n->name; if (n->isScoped) props["isScoped"] = n->isScoped; if (!n->underlyingType.empty()) props["underlyingType"] = n->underlyingType; } else if (ct == "EnumMember") { auto* n = static_cast(node); props["name"] = n->name; if (!n->value.empty()) props["value"] = n->value; } else if (ct == "NamespaceDeclaration") { auto* n = static_cast(node); props["name"] = n->name; } else if (ct == "TypeAlias") { auto* n = static_cast(node); props["aliasName"] = n->aliasName; props["targetType"] = n->targetType; if (!n->isUsing) props["isUsing"] = n->isUsing; } // SQL nodes (Step 410) else if (ct == "TableDeclaration") { auto* n = static_cast(node); if (!n->name.empty()) props["name"] = n->name; if (!n->schema.empty()) props["schema"] = n->schema; } else if (ct == "ColumnDefinition") { auto* n = static_cast(node); if (!n->name.empty()) props["name"] = n->name; if (!n->dataType.empty()) props["dataType"] = n->dataType; props["nullable"] = n->nullable; if (!n->defaultValue.empty()) props["defaultValue"] = n->defaultValue; } else if (ct == "SelectQuery") { auto* n = static_cast(node); if (n->distinct) props["distinct"] = n->distinct; } else if (ct == "InsertStatement") { auto* n = static_cast(node); if (!n->tableName.empty()) props["tableName"] = n->tableName; } else if (ct == "UpdateStatement") { auto* n = static_cast(node); if (!n->tableName.empty()) props["tableName"] = n->tableName; } else if (ct == "DeleteStatement") { auto* n = static_cast(node); if (!n->tableName.empty()) props["tableName"] = n->tableName; } else if (ct == "JoinClause") { auto* n = static_cast(node); if (!n->joinType.empty()) props["joinType"] = n->joinType; if (!n->tableName.empty()) props["tableName"] = n->tableName; } else if (ct == "WhereClause") { auto* n = static_cast(node); if (!n->expression.empty()) props["expression"] = n->expression; } else if (ct == "IndexDefinition") { auto* n = static_cast(node); if (!n->name.empty()) props["name"] = n->name; if (!n->tableName.empty()) props["tableName"] = n->tableName; if (n->unique) props["unique"] = n->unique; } // NullLiteral, ListLiteral, IndexAccess, Block, Assignment, IfStatement, // WhileLoop, Return, ExpressionStatement, ListType, SetType, MapType, // TupleType, ArrayType, OptionalType — no extra properties return props; } inline json toJson(const ASTNode* node) { json j; j["id"] = node->id; j["concept"] = node->conceptType; j["properties"] = propertiesToJson(node); if (node->hasSpan()) { j["span"] = { {"start", {{"line", node->spanStartLine}, {"col", node->spanStartCol}}}, {"end", {{"line", node->spanEndLine}, {"col", node->spanEndCol}}} }; } json children = json::object(); for (const auto& role : node->childRoles()) { json arr = json::array(); for (const auto* child : node->getChildren(role)) { arr.push_back(toJson(child)); } children[role] = arr; } j["children"] = children; return j; } // --- Deserialization --- inline ASTNode* createNode(const std::string& conceptName) { if (conceptName == "Module") return new Module(); if (conceptName == "Function") return new Function(); if (conceptName == "Variable") return new Variable(); if (conceptName == "Parameter") return new Parameter(); if (conceptName == "Block") return new Block(); if (conceptName == "Assignment") return new Assignment(); if (conceptName == "IfStatement") return new IfStatement(); if (conceptName == "WhileLoop") return new WhileLoop(); if (conceptName == "ForLoop") return new ForLoop(); if (conceptName == "Return") return new Return(); if (conceptName == "ExpressionStatement") return new ExpressionStatement(); if (conceptName == "BinaryOperation") return new BinaryOperation(); if (conceptName == "UnaryOperation") return new UnaryOperation(); if (conceptName == "FunctionCall") return new FunctionCall(); if (conceptName == "VariableReference") return new VariableReference(); if (conceptName == "IntegerLiteral") return new IntegerLiteral(); if (conceptName == "FloatLiteral") return new FloatLiteral(); if (conceptName == "StringLiteral") return new StringLiteral(); if (conceptName == "BooleanLiteral") return new BooleanLiteral(); if (conceptName == "NullLiteral") return new NullLiteral(); if (conceptName == "ListLiteral") return new ListLiteral(); if (conceptName == "IndexAccess") return new IndexAccess(); if (conceptName == "MemberAccess") return new MemberAccess(); if (conceptName == "PrimitiveType") return new PrimitiveType(); if (conceptName == "ListType") return new ListType(); if (conceptName == "SetType") return new SetType(); if (conceptName == "MapType") return new MapType(); if (conceptName == "TupleType") return new TupleType(); if (conceptName == "ArrayType") return new ArrayType(); if (conceptName == "OptionalType") return new OptionalType(); if (conceptName == "CustomType") return new CustomType(); if (conceptName == "Import") return new Import(); if (conceptName == "ExternalModule") return new ExternalModule(); if (conceptName == "TypeSignature") return new TypeSignature(); if (conceptName == "DerefStrategy") return new DerefStrategy(); if (conceptName == "OptimizationLock") return new OptimizationLock(); if (conceptName == "LangSpecific") return new LangSpecific(); if (conceptName == "IntentAnnotation") return new IntentAnnotation(); if (conceptName == "ComplexityAnnotation") return new ComplexityAnnotation(); if (conceptName == "RiskAnnotation") return new RiskAnnotation(); if (conceptName == "ContractAnnotation") return new ContractAnnotation(); if (conceptName == "SemanticTagAnnotation") return new SemanticTagAnnotation(); // Type System — Layout & Constraints (Step 272) if (conceptName == "BitWidthAnnotation") return new BitWidthAnnotation(); if (conceptName == "EndianAnnotation") return new EndianAnnotation(); if (conceptName == "LayoutAnnotation") return new LayoutAnnotation(); if (conceptName == "NullabilityAnnotation") return new NullabilityAnnotation(); if (conceptName == "VarianceAnnotation") return new VarianceAnnotation(); // Type System — Identity & Mutability (Step 273) if (conceptName == "IdentityAnnotation") return new IdentityAnnotation(); if (conceptName == "MutAnnotation") return new MutAnnotation(); if (conceptName == "TypeStateAnnotation") return new TypeStateAnnotation(); // Concurrency (Step 274) if (conceptName == "AtomicAnnotation") return new AtomicAnnotation(); if (conceptName == "SyncAnnotation") return new SyncAnnotation(); if (conceptName == "ThreadModelAnnotation") return new ThreadModelAnnotation(); if (conceptName == "MemoryBarrierAnnotation") return new MemoryBarrierAnnotation(); // Async, Parallelism & Error Handling (Step 275) if (conceptName == "ExecAnnotation") return new ExecAnnotation(); if (conceptName == "BlockingAnnotation") return new BlockingAnnotation(); if (conceptName == "ParallelAnnotation") return new ParallelAnnotation(); if (conceptName == "TrapAnnotation") return new TrapAnnotation(); if (conceptName == "ExceptionAnnotation") return new ExceptionAnnotation(); if (conceptName == "PanicAnnotation") return new PanicAnnotation(); // Scope & Namespace (Step 276) if (conceptName == "BindingAnnotation") return new BindingAnnotation(); if (conceptName == "LookupAnnotation") return new LookupAnnotation(); if (conceptName == "CaptureAnnotation") return new CaptureAnnotation(); if (conceptName == "VisibilityAnnotation") return new VisibilityAnnotation(); if (conceptName == "NamespaceAnnotation") return new NamespaceAnnotation(); if (conceptName == "ScopeAnnotation") return new ScopeAnnotation(); // Shim & Escape Hatch (Step 278) if (conceptName == "IntrinsicAnnotation") return new IntrinsicAnnotation(); if (conceptName == "RawAnnotation") return new RawAnnotation(); if (conceptName == "CallingConvAnnotation") return new CallingConvAnnotation(); if (conceptName == "LinkAnnotation") return new LinkAnnotation(); if (conceptName == "ShimAnnotation") return new ShimAnnotation(); if (conceptName == "PointerArithmeticAnnotation") return new PointerArithmeticAnnotation(); if (conceptName == "OpaqueAnnotation") return new OpaqueAnnotation(); // Platform & Provenance (Step 279) if (conceptName == "TargetAnnotation") return new TargetAnnotation(); if (conceptName == "FeatureAnnotation") return new FeatureAnnotation(); if (conceptName == "OriginalAnnotation") return new OriginalAnnotation(); if (conceptName == "MappingAnnotation") return new MappingAnnotation(); // Optimization Completion (Step 280) if (conceptName == "TailCallAnnotation") return new TailCallAnnotation(); if (conceptName == "LoopAnnotation") return new LoopAnnotation(); if (conceptName == "DataAnnotation") return new DataAnnotation(); if (conceptName == "AlignAnnotation") return new AlignAnnotation(); if (conceptName == "PackAnnotation") return new PackAnnotation(); if (conceptName == "BoundsCheckAnnotation") return new BoundsCheckAnnotation(); if (conceptName == "OverflowAnnotation") return new OverflowAnnotation(); // Meta-Programming (Step 281) if (conceptName == "MetaAnnotation") return new MetaAnnotation(); if (conceptName == "SymbolAnnotation") return new SymbolAnnotation(); if (conceptName == "EvaluateAnnotation") return new EvaluateAnnotation(); if (conceptName == "TemplateAnnotation") return new TemplateAnnotation(); if (conceptName == "SyntheticAnnotation") return new SyntheticAnnotation(); // Strategy & Policy (Step 282) if (conceptName == "PolicyAnnotation") return new PolicyAnnotation(); if (conceptName == "AmbiguityAnnotation") return new AmbiguityAnnotation(); if (conceptName == "CandidateAnnotation") return new CandidateAnnotation(); if (conceptName == "TradeoffAnnotation") return new TradeoffAnnotation(); if (conceptName == "ChoiceAnnotation") return new ChoiceAnnotation(); if (conceptName == "DecisionAnnotation") return new DecisionAnnotation(); // Subject 9: Workflow Routing (Step 315) if (conceptName == "ContextWidthAnnotation") return new ContextWidthAnnotation(); if (conceptName == "ReviewAnnotation") return new ReviewAnnotation(); if (conceptName == "AutomatabilityAnnotation") return new AutomatabilityAnnotation(); if (conceptName == "PriorityAnnotation") return new PriorityAnnotation(); if (conceptName == "ImplementationStatusAnnotation") return new ImplementationStatusAnnotation(); // Host Boundary (Step 288) if (conceptName == "HostCall") return new HostCall(); if (conceptName == "ScheduleTask") return new ScheduleTask(); if (conceptName == "ModuleLoad") return new ModuleLoad(); // Environment Layer (Step 284-285) if (conceptName == "EnvironmentSpec") return new EnvironmentSpec(); if (conceptName == "CapabilityRequirement") return new CapabilityRequirement(); // New AST nodes (Sprint 11c) if (conceptName == "ClassDeclaration") return new ClassDeclaration(); if (conceptName == "InterfaceDeclaration") return new InterfaceDeclaration(); if (conceptName == "MethodDeclaration") return new MethodDeclaration(); if (conceptName == "GenericType") return new GenericType(); if (conceptName == "TypeParameter") return new TypeParameter(); if (conceptName == "AsyncFunction") return new AsyncFunction(); if (conceptName == "AwaitExpression") return new AwaitExpression(); if (conceptName == "LambdaExpression") return new LambdaExpression(); if (conceptName == "DecoratorAnnotation") return new DecoratorAnnotation(); if (conceptName == "IncludeDirective") return new IncludeDirective(); if (conceptName == "PragmaDirective") return new PragmaDirective(); if (conceptName == "MacroDefinition") return new MacroDefinition(); if (conceptName == "EnumDeclaration") return new EnumDeclaration(); if (conceptName == "EnumMember") return new EnumMember(); if (conceptName == "NamespaceDeclaration") return new NamespaceDeclaration(); if (conceptName == "TypeAlias") return new TypeAlias(); if (conceptName == "TableDeclaration") return new TableDeclaration(); if (conceptName == "ColumnDefinition") return new ColumnDefinition(); if (conceptName == "SelectQuery") return new SelectQuery(); if (conceptName == "InsertStatement") return new InsertStatement(); if (conceptName == "UpdateStatement") return new UpdateStatement(); if (conceptName == "DeleteStatement") return new DeleteStatement(); if (conceptName == "JoinClause") return new JoinClause(); if (conceptName == "WhereClause") return new WhereClause(); if (conceptName == "IndexDefinition") return new IndexDefinition(); return nullptr; } inline void setPropertiesFromJson(ASTNode* node, const json& props) { const auto& ct = node->conceptType; if (ct == "Module") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("targetLanguage")) n->targetLanguage = props["targetLanguage"].get(); } else if (ct == "Function") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); } else if (ct == "Variable") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); } else if (ct == "Parameter") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); } else if (ct == "ForLoop") { auto* n = static_cast(node); if (props.contains("iteratorName")) n->iteratorName = props["iteratorName"].get(); } else if (ct == "BinaryOperation") { auto* n = static_cast(node); if (props.contains("op")) n->op = props["op"].get(); } else if (ct == "UnaryOperation") { auto* n = static_cast(node); if (props.contains("op")) n->op = props["op"].get(); } else if (ct == "FunctionCall") { auto* n = static_cast(node); if (props.contains("functionName")) n->functionName = props["functionName"].get(); } else if (ct == "VariableReference") { auto* n = static_cast(node); if (props.contains("variableName")) n->variableName = props["variableName"].get(); } else if (ct == "IntegerLiteral") { auto* n = static_cast(node); if (props.contains("value")) n->value = props["value"].get(); } else if (ct == "FloatLiteral") { auto* n = static_cast(node); if (props.contains("value")) n->value = props["value"].get(); } else if (ct == "StringLiteral") { auto* n = static_cast(node); if (props.contains("value")) n->value = props["value"].get(); } else if (ct == "BooleanLiteral") { auto* n = static_cast(node); if (props.contains("value")) n->value = props["value"].get(); } else if (ct == "MemberAccess") { auto* n = static_cast(node); if (props.contains("memberName")) n->memberName = props["memberName"].get(); } else if (ct == "PrimitiveType") { auto* n = static_cast(node); if (props.contains("kind")) n->kind = props["kind"].get(); } else if (ct == "CustomType") { auto* n = static_cast(node); if (props.contains("typeName")) n->typeName = props["typeName"].get(); } else if (ct == "Import") { auto* n = static_cast(node); if (props.contains("moduleName")) n->moduleName = props["moduleName"].get(); if (props.contains("alias")) n->alias = props["alias"].get(); if (props.contains("importKind")) n->importKind = props["importKind"].get(); } else if (ct == "ExternalModule") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("version")) n->version = props["version"].get(); if (props.contains("language")) n->language = props["language"].get(); if (props.contains("semanticTags") && props["semanticTags"].is_array()) { n->semanticTags.clear(); for (const auto& tag : props["semanticTags"]) { if (tag.is_string()) n->semanticTags.push_back(tag.get()); } } } else if (ct == "TypeSignature") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("variadic")) n->variadic = props["variadic"].get(); if (props.contains("semanticTags") && props["semanticTags"].is_array()) { n->semanticTags.clear(); for (const auto& tag : props["semanticTags"]) { if (tag.is_string()) n->semanticTags.push_back(tag.get()); } } } else if (ct == "DerefStrategy") { auto* n = static_cast(node); if (props.contains("strategy")) n->strategy = props["strategy"].get(); if (props.contains("derefLocation")) n->derefLocation = props["derefLocation"].get(); if (props.contains("owner")) n->owner = props["owner"].get(); } else if (ct == "OptimizationLock") { auto* n = static_cast(node); if (props.contains("lockedBy")) n->lockedBy = props["lockedBy"].get(); if (props.contains("lockReason")) n->lockReason = props["lockReason"].get(); if (props.contains("lockLevel")) n->lockLevel = props["lockLevel"].get(); if (props.contains("affectedStrategies")) n->affectedStrategies = props["affectedStrategies"].get(); if (props.contains("timestamp")) n->timestamp = props["timestamp"].get(); } else if (ct == "LangSpecific") { auto* n = static_cast(node); if (props.contains("language")) n->language = props["language"].get(); if (props.contains("idiomType")) n->idiomType = props["idiomType"].get(); if (props.contains("rawSyntax")) n->rawSyntax = props["rawSyntax"].get(); if (props.contains("semanticHint")) n->semanticHint = props["semanticHint"].get(); if (props.contains("position")) n->position = props["position"].get(); } // Semantic annotations (Sprint 10) else if (ct == "IntentAnnotation") { auto* n = static_cast(node); if (props.contains("summary")) n->summary = props["summary"].get(); if (props.contains("category")) n->category = props["category"].get(); } else if (ct == "ComplexityAnnotation") { auto* n = static_cast(node); if (props.contains("timeComplexity")) n->timeComplexity = props["timeComplexity"].get(); if (props.contains("cognitiveComplexity")) n->cognitiveComplexity = props["cognitiveComplexity"].get(); if (props.contains("linesOfLogic")) n->linesOfLogic = props["linesOfLogic"].get(); } else if (ct == "RiskAnnotation") { auto* n = static_cast(node); if (props.contains("level")) n->level = props["level"].get(); if (props.contains("reason")) n->reason = props["reason"].get(); if (props.contains("dependentCount")) n->dependentCount = props["dependentCount"].get(); } else if (ct == "ContractAnnotation") { auto* n = static_cast(node); if (props.contains("preconditions")) n->preconditions = props["preconditions"].get(); if (props.contains("postconditions")) n->postconditions = props["postconditions"].get(); if (props.contains("returnShape")) n->returnShape = props["returnShape"].get(); if (props.contains("sideEffects")) n->sideEffects = props["sideEffects"].get(); } else if (ct == "SemanticTagAnnotation") { auto* n = static_cast(node); if (props.contains("tags") && props["tags"].is_array()) { n->tags.clear(); for (const auto& tag : props["tags"]) { if (tag.is_string()) n->tags.push_back(tag.get()); } } } // Type System — Layout & Constraints (Step 272) else if (ct == "BitWidthAnnotation") { auto* n = static_cast(node); if (props.contains("width")) n->width = props["width"].get(); } else if (ct == "EndianAnnotation") { auto* n = static_cast(node); if (props.contains("order")) n->order = props["order"].get(); } else if (ct == "LayoutAnnotation") { auto* n = static_cast(node); if (props.contains("mode")) n->mode = props["mode"].get(); if (props.contains("alignment")) n->alignment = props["alignment"].get(); } else if (ct == "NullabilityAnnotation") { auto* n = static_cast(node); if (props.contains("nullable")) n->nullable = props["nullable"].get(); if (props.contains("strategy")) n->strategy = props["strategy"].get(); } else if (ct == "VarianceAnnotation") { auto* n = static_cast(node); if (props.contains("variance")) n->variance = props["variance"].get(); } // Type System — Identity & Mutability (Step 273) else if (ct == "IdentityAnnotation") { auto* n = static_cast(node); if (props.contains("mode")) n->mode = props["mode"].get(); } else if (ct == "MutAnnotation") { auto* n = static_cast(node); if (props.contains("depth")) n->depth = props["depth"].get(); } else if (ct == "TypeStateAnnotation") { auto* n = static_cast(node); if (props.contains("state")) n->state = props["state"].get(); } // Concurrency (Step 274) else if (ct == "AtomicAnnotation") { auto* n = static_cast(node); if (props.contains("consistency")) n->consistency = props["consistency"].get(); } else if (ct == "SyncAnnotation") { auto* n = static_cast(node); if (props.contains("primitive")) n->primitive = props["primitive"].get(); } else if (ct == "ThreadModelAnnotation") { auto* n = static_cast(node); if (props.contains("model")) n->model = props["model"].get(); } // MemoryBarrierAnnotation has no extra fields // Async, Parallelism & Error Handling (Step 275) else if (ct == "ExecAnnotation") { auto* n = static_cast(node); if (props.contains("mode")) n->mode = props["mode"].get(); if (props.contains("runtimeHint")) n->runtimeHint = props["runtimeHint"].get(); } else if (ct == "BlockingAnnotation") { auto* n = static_cast(node); if (props.contains("kind")) n->kind = props["kind"].get(); } else if (ct == "ParallelAnnotation") { auto* n = static_cast(node); if (props.contains("kind")) n->kind = props["kind"].get(); } else if (ct == "TrapAnnotation") { auto* n = static_cast(node); if (props.contains("signal")) n->signal = props["signal"].get(); } else if (ct == "ExceptionAnnotation") { auto* n = static_cast(node); if (props.contains("style")) n->style = props["style"].get(); } else if (ct == "PanicAnnotation") { auto* n = static_cast(node); if (props.contains("behavior")) n->behavior = props["behavior"].get(); } // Scope & Namespace (Step 276) else if (ct == "BindingAnnotation") { auto* n = static_cast(node); if (props.contains("time")) n->time = props["time"].get(); } else if (ct == "LookupAnnotation") { auto* n = static_cast(node); if (props.contains("mode")) n->mode = props["mode"].get(); } else if (ct == "CaptureAnnotation") { auto* n = static_cast(node); if (props.contains("strategy")) n->strategy = props["strategy"].get(); } else if (ct == "VisibilityAnnotation") { auto* n = static_cast(node); if (props.contains("level")) n->level = props["level"].get(); } else if (ct == "NamespaceAnnotation") { auto* n = static_cast(node); if (props.contains("style")) n->style = props["style"].get(); } else if (ct == "ScopeAnnotation") { auto* n = static_cast(node); if (props.contains("kind")) n->kind = props["kind"].get(); } // Shim & Escape Hatch (Step 278) else if (ct == "IntrinsicAnnotation") { auto* n = static_cast(node); if (props.contains("instruction")) n->instruction = props["instruction"].get(); if (props.contains("arch")) n->arch = props["arch"].get(); } else if (ct == "RawAnnotation") { auto* n = static_cast(node); if (props.contains("language")) n->language = props["language"].get(); if (props.contains("code")) n->code = props["code"].get(); } else if (ct == "CallingConvAnnotation") { auto* n = static_cast(node); if (props.contains("convention")) n->convention = props["convention"].get(); } else if (ct == "LinkAnnotation") { auto* n = static_cast(node); if (props.contains("symbolName")) n->symbolName = props["symbolName"].get(); if (props.contains("library")) n->library = props["library"].get(); } else if (ct == "ShimAnnotation") { auto* n = static_cast(node); if (props.contains("strategy")) n->strategy = props["strategy"].get(); } // PointerArithmeticAnnotation — no fields else if (ct == "OpaqueAnnotation") { auto* n = static_cast(node); if (props.contains("reason")) n->reason = props["reason"].get(); } // Platform & Provenance (Step 279) else if (ct == "TargetAnnotation") { auto* n = static_cast(node); if (props.contains("platform")) n->platform = props["platform"].get(); if (props.contains("arch")) n->arch = props["arch"].get(); } else if (ct == "FeatureAnnotation") { auto* n = static_cast(node); if (props.contains("flag")) n->flag = props["flag"].get(); if (props.contains("enabled")) n->enabled = props["enabled"].get(); } else if (ct == "OriginalAnnotation") { auto* n = static_cast(node); if (props.contains("sourceCode")) n->sourceCode = props["sourceCode"].get(); if (props.contains("sourceLanguage")) n->sourceLanguage = props["sourceLanguage"].get(); } else if (ct == "MappingAnnotation") { auto* n = static_cast(node); if (props.contains("history") && props["history"].is_array()) { n->history.clear(); for (const auto& h : props["history"]) if (h.is_string()) n->history.push_back(h.get()); } } // Optimization Completion (Step 280) // TailCallAnnotation — no fields else if (ct == "LoopAnnotation") { auto* n = static_cast(node); if (props.contains("hint")) n->hint = props["hint"].get(); if (props.contains("factor")) n->factor = props["factor"].get(); } else if (ct == "DataAnnotation") { auto* n = static_cast(node); if (props.contains("hint")) n->hint = props["hint"].get(); } else if (ct == "AlignAnnotation") { auto* n = static_cast(node); if (props.contains("bytes")) n->bytes = props["bytes"].get(); } // PackAnnotation — no fields else if (ct == "BoundsCheckAnnotation") { auto* n = static_cast(node); if (props.contains("enabled")) n->enabled = props["enabled"].get(); } else if (ct == "OverflowAnnotation") { auto* n = static_cast(node); if (props.contains("behavior")) n->behavior = props["behavior"].get(); } // Meta-Programming (Step 281) else if (ct == "MetaAnnotation") { auto* n = static_cast(node); if (props.contains("state")) n->state = props["state"].get(); if (props.contains("phase")) n->phase = props["phase"].get(); } else if (ct == "SymbolAnnotation") { auto* n = static_cast(node); if (props.contains("mode")) n->mode = props["mode"].get(); } else if (ct == "EvaluateAnnotation") { auto* n = static_cast(node); if (props.contains("phase")) n->phase = props["phase"].get(); } else if (ct == "TemplateAnnotation") { auto* n = static_cast(node); if (props.contains("specialization")) n->specialization = props["specialization"].get(); } else if (ct == "SyntheticAnnotation") { auto* n = static_cast(node); if (props.contains("generator")) n->generator = props["generator"].get(); if (props.contains("isStructuralRisk")) n->isStructuralRisk = props["isStructuralRisk"].get(); } // Strategy & Policy (Step 282) else if (ct == "PolicyAnnotation") { auto* n = static_cast(node); if (props.contains("strictness")) n->strictness = props["strictness"].get(); if (props.contains("perf")) n->perf = props["perf"].get(); if (props.contains("style")) n->style = props["style"].get(); if (props.contains("binaryStable")) n->binaryStable = props["binaryStable"].get(); } else if (ct == "AmbiguityAnnotation") { auto* n = static_cast(node); if (props.contains("intent")) n->intent = props["intent"].get(); if (props.contains("options") && props["options"].is_array()) { n->options.clear(); for (const auto& o : props["options"]) if (o.is_string()) n->options.push_back(o.get()); } if (props.contains("level")) n->level = props["level"].get(); if (props.contains("description")) n->description = props["description"].get(); } else if (ct == "CandidateAnnotation") { auto* n = static_cast(node); if (props.contains("inferredTypes") && props["inferredTypes"].is_array()) { n->inferredTypes.clear(); for (const auto& t : props["inferredTypes"]) if (t.is_string()) n->inferredTypes.push_back(t.get()); } } else if (ct == "TradeoffAnnotation") { auto* n = static_cast(node); if (props.contains("reason")) n->reason = props["reason"].get(); if (props.contains("safetyCost")) n->safetyCost = props["safetyCost"].get(); if (props.contains("perfCost")) n->perfCost = props["perfCost"].get(); } else if (ct == "ChoiceAnnotation") { auto* n = static_cast(node); if (props.contains("choiceId")) n->choiceId = props["choiceId"].get(); if (props.contains("options") && props["options"].is_array()) { n->options.clear(); for (const auto& o : props["options"]) if (o.is_string()) n->options.push_back(o.get()); } } else if (ct == "DecisionAnnotation") { auto* n = static_cast(node); if (props.contains("choiceId")) n->choiceId = props["choiceId"].get(); if (props.contains("selection")) n->selection = props["selection"].get(); if (props.contains("author")) n->author = props["author"].get(); if (props.contains("reason")) n->reason = props["reason"].get(); } // Subject 9: Workflow Routing (Step 315) else if (ct == "ContextWidthAnnotation") { auto* n = static_cast(node); if (props.contains("width")) n->width = props["width"].get(); } else if (ct == "ReviewAnnotation") { auto* n = static_cast(node); if (props.contains("required")) n->required = props["required"].get(); if (props.contains("reviewer")) n->reviewer = props["reviewer"].get(); if (props.contains("reason")) n->reason = props["reason"].get(); } else if (ct == "AutomatabilityAnnotation") { auto* n = static_cast(node); if (props.contains("strategy")) n->strategy = props["strategy"].get(); if (props.contains("confidence")) n->confidence = props["confidence"].get(); } else if (ct == "PriorityAnnotation") { auto* n = static_cast(node); if (props.contains("level")) n->level = props["level"].get(); if (props.contains("blockedBy") && props["blockedBy"].is_array()) { n->blockedBy.clear(); for (const auto& b : props["blockedBy"]) if (b.is_string()) n->blockedBy.push_back(b.get()); } } else if (ct == "ImplementationStatusAnnotation") { auto* n = static_cast(node); if (props.contains("status")) n->status = props["status"].get(); if (props.contains("assignee")) n->assignee = props["assignee"].get(); } // Host Boundary (Step 288) else if (ct == "HostCall") { auto* n = static_cast(node); if (props.contains("capability")) n->capability = props["capability"].get(); if (props.contains("name")) n->name = props["name"].get(); } else if (ct == "ScheduleTask") { auto* n = static_cast(node); if (props.contains("queue")) n->queue = props["queue"].get(); } else if (ct == "ModuleLoad") { auto* n = static_cast(node); if (props.contains("moduleName")) n->moduleName = props["moduleName"].get(); if (props.contains("mode")) n->mode = props["mode"].get(); } // Environment Layer (Step 284-285) else if (ct == "CapabilityRequirement") { auto* n = static_cast(node); if (props.contains("capability")) n->capability = props["capability"].get(); if (props.contains("required")) n->required = props["required"].get(); } // New AST nodes (Sprint 11c) else if (ct == "ClassDeclaration") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("superClass")) n->superClass = props["superClass"].get(); if (props.contains("isAbstract")) n->isAbstract = props["isAbstract"].get(); if (props.contains("baseClasses")) { n->baseClasses.clear(); for (const auto& bj : props["baseClasses"]) { BaseClass bc; bc.name = bj.value("name", ""); bc.accessSpecifier = bj.value("accessSpecifier", "public"); bc.isVirtual = bj.value("isVirtual", false); n->baseClasses.push_back(bc); } // Sync superClass from first base for backward compat if (!n->baseClasses.empty() && n->superClass.empty()) { n->superClass = n->baseClasses[0].name; } } } else if (ct == "InterfaceDeclaration") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); } else if (ct == "MethodDeclaration") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("className")) n->className = props["className"].get(); if (props.contains("isStatic")) n->isStatic = props["isStatic"].get(); if (props.contains("visibility")) n->visibility = props["visibility"].get(); if (props.contains("isOverride")) n->isOverride = props["isOverride"].get(); if (props.contains("isVirtual")) n->isVirtual = props["isVirtual"].get(); } else if (ct == "GenericType") { auto* n = static_cast(node); if (props.contains("baseName")) n->baseName = props["baseName"].get(); if (props.contains("isClassTemplate")) n->isClassTemplate = props["isClassTemplate"].get(); } else if (ct == "TypeParameter") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("constraint")) n->constraint = props["constraint"].get(); if (props.contains("isVariadic")) n->isVariadic = props["isVariadic"].get(); } else if (ct == "AsyncFunction") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("isAsync")) n->isAsync = props["isAsync"].get(); } // AwaitExpression — no extra properties else if (ct == "LambdaExpression") { auto* n = static_cast(node); if (props.contains("captureList") && props["captureList"].is_array()) { n->captureList.clear(); for (const auto& c : props["captureList"]) if (c.is_string()) n->captureList.push_back(c.get()); } } else if (ct == "DecoratorAnnotation") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); } // Preprocessor nodes (Step 337) else if (ct == "IncludeDirective") { auto* n = static_cast(node); if (props.contains("path")) n->path = props["path"].get(); if (props.contains("isSystem")) n->isSystem = props["isSystem"].get(); } else if (ct == "PragmaDirective") { auto* n = static_cast(node); if (props.contains("directive")) n->directive = props["directive"].get(); } else if (ct == "MacroDefinition") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("body")) n->body = props["body"].get(); if (props.contains("isFunctionLike")) n->isFunctionLike = props["isFunctionLike"].get(); if (props.contains("parameters") && props["parameters"].is_array()) { n->parameters.clear(); for (const auto& p : props["parameters"]) if (p.is_string()) n->parameters.push_back(p.get()); } } // Enum/Namespace/TypeAlias nodes (Step 338) else if (ct == "EnumDeclaration") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("isScoped")) n->isScoped = props["isScoped"].get(); if (props.contains("underlyingType")) n->underlyingType = props["underlyingType"].get(); } else if (ct == "EnumMember") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("value")) n->value = props["value"].get(); } else if (ct == "NamespaceDeclaration") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); } else if (ct == "TypeAlias") { auto* n = static_cast(node); if (props.contains("aliasName")) n->aliasName = props["aliasName"].get(); if (props.contains("targetType")) n->targetType = props["targetType"].get(); if (props.contains("isUsing")) n->isUsing = props["isUsing"].get(); } // SQL nodes (Step 410) else if (ct == "TableDeclaration") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("schema")) n->schema = props["schema"].get(); } else if (ct == "ColumnDefinition") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("dataType")) n->dataType = props["dataType"].get(); if (props.contains("nullable")) n->nullable = props["nullable"].get(); if (props.contains("defaultValue")) n->defaultValue = props["defaultValue"].get(); } else if (ct == "SelectQuery") { auto* n = static_cast(node); if (props.contains("distinct")) n->distinct = props["distinct"].get(); } else if (ct == "InsertStatement") { auto* n = static_cast(node); if (props.contains("tableName")) n->tableName = props["tableName"].get(); } else if (ct == "UpdateStatement") { auto* n = static_cast(node); if (props.contains("tableName")) n->tableName = props["tableName"].get(); } else if (ct == "DeleteStatement") { auto* n = static_cast(node); if (props.contains("tableName")) n->tableName = props["tableName"].get(); } else if (ct == "JoinClause") { auto* n = static_cast(node); if (props.contains("joinType")) n->joinType = props["joinType"].get(); if (props.contains("tableName")) n->tableName = props["tableName"].get(); } else if (ct == "WhereClause") { auto* n = static_cast(node); if (props.contains("expression")) n->expression = props["expression"].get(); } else if (ct == "IndexDefinition") { auto* n = static_cast(node); if (props.contains("name")) n->name = props["name"].get(); if (props.contains("tableName")) n->tableName = props["tableName"].get(); if (props.contains("unique")) n->unique = props["unique"].get(); } } inline std::string generateNodeId() { static int counter = 0; return "node_" + std::to_string(++counter); } inline ASTNode* fromJson(const json& j) { ASTNode* node = createNode(j["concept"].get()); if (!node) return nullptr; node->id = j.contains("id") ? j["id"].get() : generateNodeId(); if (j.contains("span")) { const auto& span = j["span"]; if (span.contains("start") && span.contains("end")) { const auto& s = span["start"]; const auto& e = span["end"]; if (s.contains("line") && s.contains("col") && e.contains("line") && e.contains("col")) { node->setSpan(s["line"].get(), s["col"].get(), e["line"].get(), e["col"].get()); } } } if (j.contains("properties")) { setPropertiesFromJson(node, j["properties"]); } if (j.contains("children")) { for (auto& [role, arr] : j["children"].items()) { for (auto& childJson : arr) { ASTNode* child = fromJson(childJson); if (child) node->addChild(role, child); } } } return node; } inline void deleteTree(ASTNode* node) { if (!node) return; for (auto* child : node->allChildren()) { deleteTree(child); } delete node; }