From e7b0c3e46e1e8d63b69bf8129b7ddd272b1e810f Mon Sep 17 00:00:00 2001 From: Aadityavardhan Singh Date: Tue, 13 Jan 2026 11:23:45 +0530 Subject: [PATCH 1/2] 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; From 77672c3a807fdfd372121247e8e0a34fda1075ab Mon Sep 17 00:00:00 2001 From: Matt Roberts <7544022+mttrbrts@users.noreply.github.com> Date: Sat, 21 Mar 2026 21:34:13 +0000 Subject: [PATCH 2/2] Update lib/codegen/fromcto/rust/rustvisitor.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Matt Roberts <7544022+mttrbrts@users.noreply.github.com> --- lib/codegen/fromcto/rust/rustvisitor.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/codegen/fromcto/rust/rustvisitor.js b/lib/codegen/fromcto/rust/rustvisitor.js index 4cb2dda..8bebd77 100644 --- a/lib/codegen/fromcto/rust/rustvisitor.js +++ b/lib/codegen/fromcto/rust/rustvisitor.js @@ -1348,8 +1348,15 @@ class RustVisitor { // 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()}`); + // Preserve leading whitespace (important for Markdown), + // but trim trailing whitespace. For blank lines, emit + // "///" without a trailing space. + const trimmedEnd = line.replace(/\s+$/, ''); + if (trimmedEnd === '') { + parameters.fileWriter.writeLine(indent, '///'); + } else { + parameters.fileWriter.writeLine(indent, `/// ${trimmedEnd}`); + } }); } }