From e7b0c3e46e1e8d63b69bf8129b7ddd272b1e810f Mon Sep 17 00:00:00 2001 From: Aadityavardhan Singh Date: Tue, 13 Jan 2026 11:23:45 +0530 Subject: [PATCH] feat: implement rustdoc comment generation support Signed-off-by: Aadityavardhan Singh --- lib/codegen/fromcto/rust/rustvisitor.js | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/codegen/fromcto/rust/rustvisitor.js b/lib/codegen/fromcto/rust/rustvisitor.js index 92d8956..4cb2dda 100644 --- a/lib/codegen/fromcto/rust/rustvisitor.js +++ b/lib/codegen/fromcto/rust/rustvisitor.js @@ -304,6 +304,7 @@ class RustVisitor { * @private */ visitClassDeclaration(classDeclaration, parameters) { + this.writeDescription(classDeclaration, parameters, 0); parameters.fileWriter.writeLine( 0, '#[derive(Debug, Clone, Serialize, Deserialize)]' @@ -513,6 +514,8 @@ class RustVisitor { if (field.isOptional?.()) { hashMapType = this.wrapAsOption(hashMapType); } + // Add description for HashMap fields + this.writeDescription(field, parameters, 1); // Generate serde attributes for HashMap with DateTime serialization support parameters.fileWriter.writeLine(1, '#[serde('); @@ -607,6 +610,10 @@ class RustVisitor { } // Handle regular (non-HashMap) fields + + // Add description for regular fields + this.writeDescription(field, parameters, 1); + parameters.fileWriter.writeLine(1, '#[serde('); parameters.fileWriter.writeLine(2, `rename = "${field.name}",`); if (field.isOptional?.()) { @@ -752,6 +759,7 @@ class RustVisitor { if (relationshipDeclaration.isOptional?.()) { type = `Option<${type}>`; } + this.writeDescription(relationshipDeclaration, parameters, 1); // Start serde attribute block parameters.fileWriter.writeLine(1, '#[serde('); @@ -1327,6 +1335,24 @@ class RustVisitor { parameters.fileWriter.closeFile(); } + /** + * Writes the description of a declaration or property as a Rust documentation comment. + * @param {Object} thing - the declaration or property + * @param {Object} parameters - the parameters + * @param {number} indent - the indentation level + * @private + */ + writeDescription(thing, parameters, indent) { + if (thing.getDescription && thing.getDescription()) { + const description = thing.getDescription(); + // Split by newline to handle multi-line comments cleanly + const lines = description.split(/\r?\n/); + lines.forEach(line => { + // Write '/// ' followed by the trimmed line + parameters.fileWriter.writeLine(indent, `/// ${line.trim()}`); + }); + } + } } module.exports = RustVisitor;