zignet
Version:
MCP server for Zig — AI-powered code analysis, validation, and documentation with fine-tuned LLM
1 lines • 26.3 kB
Source Map (JSON)
{"version":3,"file":"codegen.cjs","names":["DEFAULT_OPTIONS: Required<CodeGenOptions>"],"sources":["../src/codegen.ts"],"sourcesContent":["/**\n * Code Generator for ZigNet\n * Generates clean, formatted Zig code from AST\n */\n\nimport type {\n Program,\n Declaration,\n FunctionDeclaration,\n VariableDeclaration,\n StructDeclaration,\n Statement,\n BlockStatement,\n ReturnStatement,\n IfStatement,\n WhileStatement,\n ForStatement,\n ExpressionStatement,\n ComptimeStatement,\n Expression,\n BinaryExpression,\n UnaryExpression,\n CallExpression,\n MemberExpression,\n IndexExpression,\n AssignmentExpression,\n Identifier,\n NumberLiteral,\n StringLiteral,\n BooleanLiteral,\n TypeAnnotation,\n Parameter,\n StructField,\n} from './ast.js';\n\n/**\n * Code generator options\n */\nexport interface CodeGenOptions {\n indentSize?: number;\n useTabs?: boolean;\n newlineBeforeBrace?: boolean;\n trailingComma?: boolean;\n}\n\n/**\n * Default options\n */\nconst DEFAULT_OPTIONS: Required<CodeGenOptions> = {\n indentSize: 4,\n useTabs: false,\n newlineBeforeBrace: false,\n trailingComma: false,\n};\n\n/**\n * Code Generator class\n */\nexport class CodeGenerator {\n private options: Required<CodeGenOptions>;\n private indentLevel = 0;\n private output: string[] = [];\n\n constructor(options: CodeGenOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Generate code from AST\n */\n generate(program: Program): string {\n this.output = [];\n this.indentLevel = 0;\n\n for (let i = 0; i < program.body.length; i++) {\n this.generateDeclaration(program.body[i]);\n // Add blank line between top-level declarations (except last)\n if (i < program.body.length - 1) {\n this.output.push('');\n }\n }\n\n return this.output.join('\\n');\n }\n\n /**\n * Generate declaration\n */\n private generateDeclaration(declaration: Declaration): void {\n switch (declaration.type) {\n case 'FunctionDeclaration':\n this.generateFunctionDeclaration(declaration);\n break;\n case 'VariableDeclaration':\n this.generateVariableDeclaration(declaration);\n break;\n case 'StructDeclaration':\n this.generateStructDeclaration(declaration);\n break;\n default:\n // Handle other declaration types\n break;\n }\n }\n\n /**\n * Generate function declaration\n */\n private generateFunctionDeclaration(fn: FunctionDeclaration): void {\n let line = '';\n\n // Modifiers\n if (fn.isInline) {\n line += 'inline ';\n }\n if (fn.isComptime) {\n line += 'comptime ';\n }\n\n // Function signature\n line += `fn ${fn.name}(`;\n\n // Parameters\n const params = fn.parameters.map((param) => this.generateParameter(param));\n line += params.join(', ');\n\n line += ') ';\n\n // Error union\n if (fn.errorUnion) {\n line += '!';\n }\n\n // Return type\n line += this.generateTypeAnnotation(fn.returnType);\n\n // Opening brace\n if (this.options.newlineBeforeBrace) {\n this.writeLine(line);\n this.writeLine('{');\n } else {\n line += ' {';\n this.writeLine(line);\n }\n\n // Body\n this.indent();\n this.generateBlockStatements(fn.body.statements);\n this.dedent();\n\n // Closing brace\n this.writeLine('}');\n }\n\n /**\n * Generate parameter\n */\n private generateParameter(param: Parameter): string {\n let result = '';\n if (param.isComptime) {\n result += 'comptime ';\n }\n result += param.name;\n result += ': ';\n result += this.generateTypeAnnotation(param.typeAnnotation);\n return result;\n }\n\n /**\n * Generate variable declaration\n */\n private generateVariableDeclaration(varDecl: VariableDeclaration): void {\n let line = varDecl.isConst ? 'const ' : 'var ';\n line += varDecl.name;\n\n if (varDecl.typeAnnotation) {\n line += ': ';\n line += this.generateTypeAnnotation(varDecl.typeAnnotation);\n }\n\n if (varDecl.initializer) {\n line += ' = ';\n line += this.generateExpression(varDecl.initializer);\n }\n\n line += ';';\n this.writeLine(line);\n }\n\n /**\n * Generate struct declaration\n */\n private generateStructDeclaration(struct: StructDeclaration): void {\n let line = `const ${struct.name} = struct {`;\n this.writeLine(line);\n\n this.indent();\n for (const field of struct.fields) {\n this.generateStructField(field);\n }\n this.dedent();\n\n this.writeLine('};');\n }\n\n /**\n * Generate struct field\n */\n private generateStructField(field: StructField): void {\n let line = field.name;\n line += ': ';\n line += this.generateTypeAnnotation(field.typeAnnotation);\n line += ',';\n this.writeLine(line);\n }\n\n /**\n * Generate type annotation\n */\n private generateTypeAnnotation(typeAnnotation: TypeAnnotation): string {\n switch (typeAnnotation.type) {\n case 'PrimitiveType':\n case 'IdentifierType':\n return typeAnnotation.name;\n case 'PointerType':\n return '*' + this.generateTypeAnnotation(typeAnnotation.pointeeType);\n case 'ArrayType':\n const size =\n typeAnnotation.size !== undefined ? typeAnnotation.size.toString() : '';\n return `[${size}]${this.generateTypeAnnotation(typeAnnotation.elementType)}`;\n case 'ErrorUnionType':\n return '!' + this.generateTypeAnnotation(typeAnnotation.valueType);\n case 'OptionalType':\n return '?' + this.generateTypeAnnotation(typeAnnotation.valueType);\n default:\n return 'unknown';\n }\n }\n\n /**\n * Generate block statements\n */\n private generateBlockStatements(statements: Statement[]): void {\n for (const stmt of statements) {\n this.generateStatement(stmt);\n }\n }\n\n /**\n * Generate statement\n */\n private generateStatement(stmt: Statement): void {\n switch (stmt.type) {\n case 'VariableDeclaration':\n this.generateVariableDeclaration(stmt);\n break;\n case 'ReturnStatement':\n this.generateReturnStatement(stmt);\n break;\n case 'IfStatement':\n this.generateIfStatement(stmt);\n break;\n case 'WhileStatement':\n this.generateWhileStatement(stmt);\n break;\n case 'ForStatement':\n this.generateForStatement(stmt);\n break;\n case 'BreakStatement':\n this.writeLine('break;');\n break;\n case 'ContinueStatement':\n this.writeLine('continue;');\n break;\n case 'BlockStatement':\n this.generateBlockStatement(stmt);\n break;\n case 'ExpressionStatement':\n this.generateExpressionStatement(stmt);\n break;\n case 'ComptimeStatement':\n this.generateComptimeStatement(stmt);\n break;\n }\n }\n\n /**\n * Generate return statement\n */\n private generateReturnStatement(stmt: ReturnStatement): void {\n let line = 'return';\n if (stmt.value) {\n line += ' ';\n line += this.generateExpression(stmt.value);\n }\n line += ';';\n this.writeLine(line);\n }\n\n /**\n * Generate if statement\n */\n private generateIfStatement(stmt: IfStatement): void {\n let line = 'if (';\n line += this.generateExpression(stmt.condition);\n line += ') ';\n\n // Check if consequent is a block\n if (stmt.consequent.type === 'BlockStatement') {\n line += '{';\n this.writeLine(line);\n this.indent();\n this.generateBlockStatements(stmt.consequent.statements);\n this.dedent();\n this.write('}');\n } else {\n this.writeLine(line);\n this.indent();\n this.generateStatement(stmt.consequent);\n this.dedent();\n }\n\n // Else clause\n if (stmt.alternate) {\n if (stmt.consequent.type === 'BlockStatement') {\n this.output[this.output.length - 1] += ' else ';\n } else {\n this.write('else ');\n }\n\n if (stmt.alternate.type === 'IfStatement') {\n // else if\n this.generateIfStatement(stmt.alternate);\n } else if (stmt.alternate.type === 'BlockStatement') {\n this.output[this.output.length - 1] += '{';\n this.writeLine('');\n this.indent();\n this.generateBlockStatements(stmt.alternate.statements);\n this.dedent();\n this.writeLine('}');\n } else {\n this.writeLine('');\n this.indent();\n this.generateStatement(stmt.alternate);\n this.dedent();\n }\n } else {\n // No else, just end the line\n if (stmt.consequent.type === 'BlockStatement') {\n this.output[this.output.length - 1] += '';\n this.writeLine('');\n }\n }\n }\n\n /**\n * Generate while statement\n */\n private generateWhileStatement(stmt: WhileStatement): void {\n let line = 'while (';\n line += this.generateExpression(stmt.condition);\n line += ') ';\n\n if (stmt.body.type === 'BlockStatement') {\n line += '{';\n this.writeLine(line);\n this.indent();\n this.generateBlockStatements(stmt.body.statements);\n this.dedent();\n this.writeLine('}');\n } else {\n this.writeLine(line);\n this.indent();\n this.generateStatement(stmt.body);\n this.dedent();\n }\n }\n\n /**\n * Generate for statement\n */\n private generateForStatement(stmt: ForStatement): void {\n let line = 'for (';\n\n if (stmt.initializer) {\n if (stmt.initializer.type === 'VariableDeclaration') {\n // Special handling for var declaration in for loop\n const varDecl = stmt.initializer;\n line += varDecl.isConst ? 'const ' : 'var ';\n line += varDecl.name;\n if (varDecl.typeAnnotation) {\n line += ': ' + this.generateTypeAnnotation(varDecl.typeAnnotation);\n }\n if (varDecl.initializer) {\n line += ' = ' + this.generateExpression(varDecl.initializer);\n }\n } else {\n line += this.generateExpression(stmt.initializer);\n }\n }\n line += '; ';\n\n if (stmt.condition) {\n line += this.generateExpression(stmt.condition);\n }\n line += '; ';\n\n if (stmt.increment) {\n line += this.generateExpression(stmt.increment);\n }\n line += ') ';\n\n if (stmt.body.type === 'BlockStatement') {\n line += '{';\n this.writeLine(line);\n this.indent();\n this.generateBlockStatements(stmt.body.statements);\n this.dedent();\n this.writeLine('}');\n } else {\n this.writeLine(line);\n this.indent();\n this.generateStatement(stmt.body);\n this.dedent();\n }\n }\n\n /**\n * Generate block statement\n */\n private generateBlockStatement(stmt: BlockStatement): void {\n this.writeLine('{');\n this.indent();\n this.generateBlockStatements(stmt.statements);\n this.dedent();\n this.writeLine('}');\n }\n\n /**\n * Generate expression statement\n */\n private generateExpressionStatement(stmt: ExpressionStatement): void {\n const line = this.generateExpression(stmt.expression) + ';';\n this.writeLine(line);\n }\n\n /**\n * Generate comptime statement\n */\n private generateComptimeStatement(stmt: ComptimeStatement): void {\n this.writeLine('comptime {');\n this.indent();\n this.generateBlockStatements(stmt.body.statements);\n this.dedent();\n this.writeLine('}');\n }\n\n /**\n * Generate expression\n */\n private generateExpression(expr: Expression): string {\n switch (expr.type) {\n case 'NumberLiteral':\n return this.generateNumberLiteral(expr);\n case 'StringLiteral':\n return this.generateStringLiteral(expr);\n case 'BooleanLiteral':\n return this.generateBooleanLiteral(expr);\n case 'Identifier':\n return this.generateIdentifier(expr);\n case 'BinaryExpression':\n return this.generateBinaryExpression(expr);\n case 'UnaryExpression':\n return this.generateUnaryExpression(expr);\n case 'CallExpression':\n return this.generateCallExpression(expr);\n case 'MemberExpression':\n return this.generateMemberExpression(expr);\n case 'IndexExpression':\n return this.generateIndexExpression(expr);\n case 'AssignmentExpression':\n return this.generateAssignmentExpression(expr);\n case 'StructLiteral':\n return this.generateStructLiteral(expr);\n case 'ArrayLiteral':\n return this.generateArrayLiteral(expr);\n default:\n return 'unknown';\n }\n }\n\n /**\n * Generate number literal\n */\n private generateNumberLiteral(expr: NumberLiteral): string {\n return expr.value.toString();\n }\n\n /**\n * Generate string literal\n */\n private generateStringLiteral(expr: StringLiteral): string {\n // Escape special characters\n const escaped = expr.value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n return `\"${escaped}\"`;\n }\n\n /**\n * Generate boolean literal\n */\n private generateBooleanLiteral(expr: BooleanLiteral): string {\n return expr.value ? 'true' : 'false';\n }\n\n /**\n * Generate identifier\n */\n private generateIdentifier(expr: Identifier): string {\n return expr.name;\n }\n\n /**\n * Generate binary expression\n */\n private generateBinaryExpression(expr: BinaryExpression): string {\n const left = this.generateExpression(expr.left);\n const right = this.generateExpression(expr.right);\n return `${left} ${expr.operator} ${right}`;\n }\n\n /**\n * Generate unary expression\n */\n private generateUnaryExpression(expr: UnaryExpression): string {\n const operand = this.generateExpression(expr.operand);\n return `${expr.operator}${operand}`;\n }\n\n /**\n * Generate call expression\n */\n private generateCallExpression(expr: CallExpression): string {\n const callee = this.generateExpression(expr.callee);\n const args = expr.arguments.map((arg) => this.generateExpression(arg));\n return `${callee}(${args.join(', ')})`;\n }\n\n /**\n * Generate member expression\n */\n private generateMemberExpression(expr: MemberExpression): string {\n const object = this.generateExpression(expr.object);\n return `${object}.${expr.property}`;\n }\n\n /**\n * Generate index expression\n */\n private generateIndexExpression(expr: IndexExpression): string {\n const object = this.generateExpression(expr.object);\n const index = this.generateExpression(expr.index);\n return `${object}[${index}]`;\n }\n\n /**\n * Generate assignment expression\n */\n private generateAssignmentExpression(expr: AssignmentExpression): string {\n const left = this.generateExpression(expr.left);\n const right = this.generateExpression(expr.right);\n return `${left} ${expr.operator} ${right}`;\n }\n\n /**\n * Generate struct literal\n */\n private generateStructLiteral(expr: any): string {\n let result = expr.typeName + '{ ';\n const fields = expr.fields.map((field: any) => {\n return `.${field.name} = ${this.generateExpression(field.value)}`;\n });\n result += fields.join(', ');\n result += ' }';\n return result;\n }\n\n /**\n * Generate array literal\n */\n private generateArrayLiteral(expr: any): string {\n const elements = expr.elements.map((elem: any) => this.generateExpression(elem));\n return `[_]{ ${elements.join(', ')} }`;\n }\n\n /**\n * Write a line with proper indentation\n */\n private writeLine(text: string): void {\n if (text === '') {\n this.output.push('');\n } else {\n this.output.push(this.getIndent() + text);\n }\n }\n\n /**\n * Write without newline\n */\n private write(text: string): void {\n if (this.output.length === 0) {\n this.output.push(this.getIndent() + text);\n } else {\n this.output[this.output.length - 1] += text;\n }\n }\n\n /**\n * Get current indentation string\n */\n private getIndent(): string {\n if (this.options.useTabs) {\n return '\\t'.repeat(this.indentLevel);\n }\n return ' '.repeat(this.indentLevel * this.options.indentSize);\n }\n\n /**\n * Increase indentation level\n */\n private indent(): void {\n this.indentLevel++;\n }\n\n /**\n * Decrease indentation level\n */\n private dedent(): void {\n if (this.indentLevel > 0) {\n this.indentLevel--;\n }\n }\n}\n"],"mappings":"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"}