{"version":3,"sources":["assembly/assembler/structured.ts"],"names":["PrimitiveStringP8N","OSI","FunctionDefinition","ClassDefinitionMethod","ExceptionInvalid","AssemblyAssembler","AssemblyAssemblerStructured","constructor","assemble","ast","assembles","asts","osi","rootAST","length","blocks","instructions","_assembleGroupStatementsList","map","statements","_assembleAssertNoInstructions","blocksByID","_assembleIdentifierMappedBlocks","blockMetadata","_assembleIdentifierMappedBlocksConsumeOne","blockStrings","_assembleIdentifierMappedBlocksConsumeOneOptional","blockGlobals","blockSymbols","blockSources","blocksFunctions","_assembleIdentifierMappedBlocksConsume","blocksClasses","blocksSubroutines","_assembleAssertBlockByIdentifierEmpty","assembleMetadata","assembleStrings","assembleGlobals","assembleSymbols","assembleSources","assembleStructuredFunctions","assembleStructuredClasses","assembleStructuredSubroutines","updateOffsets","header","functionTable","entries","assembleStructuredFunction","_assembleAssertArgumentCount","begin","arguments","definition","name","_assembleDecodeArgument","argc","offset","assembleSubroutineBody","push","nameToStructure","Map","structureToExtends","symbolToIndex","_assembleSymbolToIndex","classTable","extend","structure","assembleStructuredClass","existing","get","value","s","stringEncode","set","extending","extends","_assembleAssertArgumentCountRange","_assembleGroupStatements","instructionsByID","_assembleIdentifierMappedInstructions","instructionProperties","_assembleIdentifierMappedInstructionsConsume","blockMethods","_assembleAssertInstructionByIdentifierEmpty","ClassDefinition","instruction","assembleClassProperty","block","assembleStructuredClassMethod","classDefinition","method","argName","symbol","_assembleConvertArgumentToSymbol","classMethodTable","assembleStructuredSubroutine"],"mappings":"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","sourcesContent":["import {PrimitiveStringP8N} from '@sage-js/core';\nimport {\n\tOSI,\n\tFunctionDefinition,\n\tClassDefinition,\n\tClassDefinitionMethod\n} from '@sage-js/res-osi';\n\nimport {ExceptionInvalid} from '../../exception/invalid';\nimport {SymbolToIndex} from '../../types';\nimport {ASTNodeFile} from '../../ast/node/file';\nimport {ASTNodeStatementBlock} from '../../ast/node/statement/block';\n\nimport {AssemblyAssembler} from './class';\n\n/**\n * AssemblyAssemblerStructured constructor.\n */\nexport class AssemblyAssemblerStructured extends AssemblyAssembler {\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Assemble AST to OSI.\n\t *\n\t * @param ast AST file.\n\t * @returns OSI instance.\n\t */\n\tpublic assemble(ast: ASTNodeFile) {\n\t\treturn this.assembles([ast]);\n\t}\n\n\t/**\n\t * Assemble AST to OSI.\n\t *\n\t * @param asts AST files.\n\t * @returns OSI instance.\n\t */\n\tpublic assembles(asts: ASTNodeFile[]) {\n\t\tconst osi = new OSI();\n\n\t\tconst rootAST = asts.length === 1 ? asts[0] : null;\n\n\t\t// Sort top level statements.\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatementsList(asts.map(ast => ast.statements));\n\t\tthis._assembleAssertNoInstructions(instructions);\n\n\t\t// Sort blocks by identifier.\n\t\tconst blocksByID = this._assembleIdentifierMappedBlocks(blocks);\n\n\t\t// Read the expected ones.\n\t\tconst blockMetadata =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOne(\n\t\t\t\tblocksByID,\n\t\t\t\t'metadata',\n\t\t\t\trootAST\n\t\t\t);\n\n\t\t// Read the optional ones.\n\t\tconst blockStrings =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'strings'\n\t\t\t);\n\t\tconst blockGlobals =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'globals'\n\t\t\t);\n\t\tconst blockSymbols =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'symbols'\n\t\t\t);\n\t\tconst blockSources =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'sources'\n\t\t\t);\n\t\tconst blocksFunctions = this._assembleIdentifierMappedBlocksConsume(\n\t\t\tblocksByID,\n\t\t\t'function'\n\t\t);\n\t\tconst blocksClasses = this._assembleIdentifierMappedBlocksConsume(\n\t\t\tblocksByID,\n\t\t\t'class'\n\t\t);\n\t\tconst blocksSubroutines = this._assembleIdentifierMappedBlocksConsume(\n\t\t\tblocksByID,\n\t\t\t'subroutine'\n\t\t);\n\n\t\t// Make sure no unexpected blocks remain.\n\t\tthis._assembleAssertBlockByIdentifierEmpty(blocksByID);\n\n\t\t// Read the metadata to init the OSI.\n\t\tthis.assembleMetadata(blockMetadata, osi);\n\n\t\t// Assemble the strings tables if present.\n\t\tif (blockStrings) {\n\t\t\tthis.assembleStrings(blockStrings, osi);\n\t\t}\n\t\tif (blockGlobals) {\n\t\t\tthis.assembleGlobals(blockGlobals, osi);\n\t\t}\n\t\tif (blockSymbols) {\n\t\t\tthis.assembleSymbols(blockSymbols, osi);\n\t\t}\n\t\tif (blockSources) {\n\t\t\tthis.assembleSources(blockSources, osi);\n\t\t}\n\n\t\t// Assemble all functions, classes, and subroutines.\n\t\tthis.assembleStructuredFunctions(blocksFunctions, osi);\n\t\tthis.assembleStructuredClasses(blocksClasses, osi);\n\t\tthis.assembleStructuredSubroutines(blocksSubroutines, osi);\n\n\t\t// Update offsets to their real values.\n\t\tosi.updateOffsets();\n\n\t\treturn osi;\n\t}\n\n\t/**\n\t * Assemble structured function AST blocks into OSI.\n\t *\n\t * @param asts AST blocks.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleStructuredFunctions(\n\t\tasts: ASTNodeStatementBlock[],\n\t\tosi: OSI\n\t) {\n\t\tosi.header.functionTable.entries = [];\n\t\tfor (const ast of asts) {\n\t\t\tthis.assembleStructuredFunction(ast, osi);\n\t\t}\n\t}\n\n\t/**\n\t * Assemble structured function AST block into table.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleStructuredFunction(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 2);\n\t\tconst definition = new FunctionDefinition();\n\n\t\tdefinition.name = this._assembleDecodeArgument(\n\t\t\tdefinition.name,\n\t\t\tast.begin.arguments.entries[0]\n\t\t);\n\t\tdefinition.argc = this._assembleDecodeArgument(\n\t\t\tdefinition.argc,\n\t\t\tast.begin.arguments.entries[1]\n\t\t);\n\n\t\t// Assemble body into subroutine, remember the temporary offset.\n\t\tdefinition.offset = this.assembleSubroutineBody(ast, osi);\n\n\t\tosi.header.functionTable.entries.push(definition);\n\t}\n\n\t/**\n\t * Assemble structured class AST blocks into OSI.\n\t *\n\t * @param asts AST blocks.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleStructuredClasses(\n\t\tasts: ASTNodeStatementBlock[],\n\t\tosi: OSI\n\t) {\n\t\t// Mappings for class extending.\n\t\tconst nameToStructure = new Map<string, ClassDefinition>();\n\t\tconst structureToExtends =\n\t\t\tnew Map<ClassDefinition, PrimitiveStringP8N>();\n\n\t\t// Function to get or add an existing symbol.\n\t\tconst symbolToIndex = this._assembleSymbolToIndex(osi);\n\n\t\t// Disassemble classes.\n\t\tosi.header.classTable.entries = [];\n\t\tfor (const ast of asts) {\n\t\t\tconst {\n\t\t\t\textend,\n\t\t\t\tname,\n\t\t\t\tstructure\n\t\t\t} = this.assembleStructuredClass(ast, osi, symbolToIndex);\n\n\t\t\t// Check unique, then add to map.\n\t\t\tconst existing = nameToStructure.get(name.value) || null;\n\t\t\tif (existing) {\n\t\t\t\tconst s = name.stringEncode();\n\t\t\t\tthrow new ExceptionInvalid(`Class name not unique: ${s}`);\n\t\t\t}\n\t\t\tnameToStructure.set(name.value, structure);\n\n\t\t\t// If extending another class, remember which for later.\n\t\t\tif (extend) {\n\t\t\t\tstructureToExtends.set(structure, extend);\n\t\t\t}\n\t\t}\n\n\t\t// Populate the extends data once all classes exist.\n\t\tfor (const [structure, extend] of structureToExtends) {\n\t\t\tconst extending = nameToStructure.get(extend.value) || null;\n\t\t\tif (!extending) {\n\t\t\t\tconst s = extend.stringEncode();\n\t\t\t\tthrow new ExceptionInvalid(`Class name unknown: ${s}`);\n\t\t\t}\n\t\t\tstructure.extends = extending;\n\t\t}\n\t}\n\n\t/**\n\t * Assemble structured class AST block into table.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t * @param symbolToIndex Get symbol or add.\n\t * @returns The entend, name, and class structure.\n\t */\n\tpublic assembleStructuredClass(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI,\n\t\tsymbolToIndex: SymbolToIndex\n\t) {\n\t\tthis._assembleAssertArgumentCountRange(ast.begin.arguments, 1, 2);\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatements(ast.statements);\n\n\t\tconst instructionsByID =\n\t\t\tthis._assembleIdentifierMappedInstructions(instructions);\n\t\tconst blocksByID =\n\t\t\tthis._assembleIdentifierMappedBlocks(blocks);\n\n\t\tconst instructionProperties =\n\t\t\tthis._assembleIdentifierMappedInstructionsConsume(\n\t\t\t\tinstructionsByID,\n\t\t\t\t'property'\n\t\t\t);\n\t\tconst blockMethods =\n\t\t\tthis._assembleIdentifierMappedBlocksConsume(\n\t\t\t\tblocksByID,\n\t\t\t\t'method'\n\t\t\t);\n\n\t\tthis._assembleAssertInstructionByIdentifierEmpty(instructionsByID);\n\t\tthis._assembleAssertBlockByIdentifierEmpty(blocksByID);\n\n\t\tconst structure = new osi.header.classTable.ClassDefinition();\n\t\tconst name = this._assembleDecodeArgument(\n\t\t\tnew PrimitiveStringP8N(),\n\t\t\tast.begin.arguments.entries[0]\n\t\t);\n\n\t\tfor (const instruction of instructionProperties) {\n\t\t\tthis.assembleClassProperty(\n\t\t\t\tinstruction,\n\t\t\t\tstructure,\n\t\t\t\tsymbolToIndex\n\t\t\t);\n\t\t}\n\t\tfor (const block of blockMethods) {\n\t\t\tthis.assembleStructuredClassMethod(\n\t\t\t\tblock,\n\t\t\t\tosi,\n\t\t\t\tstructure,\n\t\t\t\tsymbolToIndex\n\t\t\t);\n\t\t}\n\n\t\tosi.header.classTable.entries.push({\n\t\t\tname,\n\t\t\tstructure\n\t\t});\n\n\t\tlet extend: PrimitiveStringP8N | null = null;\n\t\tif (ast.begin.arguments.entries.length > 1) {\n\t\t\textend = this._assembleDecodeArgument(\n\t\t\t\tnew PrimitiveStringP8N(),\n\t\t\t\tast.begin.arguments.entries[1]\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\textend,\n\t\t\tname,\n\t\t\tstructure\n\t\t};\n\t}\n\n\t/**\n\t * Assemble structured class method AST block into definition.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t * @param classDefinition Definition instance.\n\t * @param symbolToIndex Get symbol or add.\n\t */\n\tpublic assembleStructuredClassMethod(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI,\n\t\tclassDefinition: ClassDefinition,\n\t\tsymbolToIndex: SymbolToIndex\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 1);\n\n\t\tconst method = new ClassDefinitionMethod();\n\n\t\tconst [argName] = ast.begin.arguments.entries;\n\t\tmethod.symbol = this._assembleConvertArgumentToSymbol(\n\t\t\targName,\n\t\t\tsymbolToIndex\n\t\t);\n\n\t\t// Assemble body into subroutine, remember the temporary offset.\n\t\tmethod.offset = this.assembleSubroutineBody(ast, osi);\n\n\t\tclassDefinition.classMethodTable.entries.push(method);\n\t}\n\n\t/**\n\t * Assemble structured subroutine AST blocks into OSI.\n\t *\n\t * @param asts AST blocks.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleStructuredSubroutines(\n\t\tasts: ASTNodeStatementBlock[],\n\t\tosi: OSI\n\t) {\n\t\tfor (const ast of asts) {\n\t\t\tthis.assembleStructuredSubroutine(ast, osi);\n\t\t}\n\t}\n\n\t/**\n\t * Assemble structured subroutine AST block into table.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleStructuredSubroutine(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 0);\n\n\t\t// Assemble body into subroutine, discard offset.\n\t\tthis.assembleSubroutineBody(ast, osi);\n\t}\n}\n"],"file":"structured.mjs","sourceRoot":"../../../src"}