From 663bb906b3dffabfc7c0f5e82eba68f5074bafa9 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 12 Sep 2025 15:45:38 +0000 Subject: [PATCH 1/4] feat: Add option to convert array notation to pointers Co-authored-by: deme3.iot --- code-generator.js | 44 +++++++++++++++++++++++++++++++------ main.js | 3 +++ preferences/preference.json | 6 +++++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/code-generator.js b/code-generator.js index 7521167..e41bd79 100644 --- a/code-generator.js +++ b/code-generator.js @@ -572,10 +572,10 @@ class CppCodeGenerator { if (_modifiers.length > 0) { terms.push(_modifiers.join(" ")); } - // type - terms.push(this.getType(elem)); - // name - terms.push(elem.name); + // type and name (apply name-based array to pointer conversion if enabled) + var _norm = this.normalizeArrayNameAndType(elem, this.getType(elem)); + terms.push(_norm.type); + terms.push(_norm.name); // initial value if (elem.defaultValue && elem.defaultValue.length > 0) { terms.push("= " + elem.defaultValue); @@ -613,10 +613,12 @@ class CppCodeGenerator { var inputParamStrings = []; for (i = 0; i < inputParams.length; i++) { var inputParam = inputParams[i]; - inputParamStrings.push( - this.getType(inputParam) + " " + inputParam.name, + var _normParam = this.normalizeArrayNameAndType( + inputParam, + this.getType(inputParam), ); - docs += "\n@param " + inputParam.name; + inputParamStrings.push(_normParam.type + " " + _normParam.name); + docs += "\n@param " + _normParam.name; } methodStr += @@ -740,6 +742,34 @@ class CppCodeGenerator { return modifiers; } + /** + * Normalize name-based static array declarations (e.g., myList[], myList[10]) + * into pointer types when the option convertBracketArrayToPointer is enabled. + * Returns adjusted type and name. + * + * @param {Object} elem + * @param {string} typeStr + * @return {{type: string, name: string}} + */ + normalizeArrayNameAndType(elem, typeStr) { + var shouldConvert = + this.genOptions && this.genOptions.convertBracketArrayToPointer === true; + var nameStr = typeof elem.name === "string" ? elem.name : ""; + if (!shouldConvert || nameStr.indexOf("[") === -1) { + return { type: typeStr, name: nameStr }; + } + + var matches = nameStr.match(/\[[^\]]*\]/g); + if (!matches || matches.length === 0) { + return { type: typeStr, name: nameStr }; + } + + var pointerDepth = matches.length; + var cleanedName = nameStr.replace(/\[[^\]]*\]/g, ""); + var adjustedType = typeStr + new Array(pointerDepth + 1).join("*"); + return { type: adjustedType, name: cleanedName }; + } + /** * parsing type from element * diff --git a/main.js b/main.js index e5f980e..79fabba 100644 --- a/main.js +++ b/main.js @@ -29,6 +29,9 @@ function getGenOptions() { useTab: app.preferences.get("cpp.gen.useTab"), indentSpaces: app.preferences.get("cpp.gen.indentSpaces"), useVector: app.preferences.get("cpp.gen.useVector"), + convertBracketArrayToPointer: app.preferences.get( + "cpp.gen.convertBracketArrayToPointer", + ), includeHeader: app.preferences.get("cpp.gen.includeHeader"), genCpp: app.preferences.get("cpp.gen.genCpp"), }; diff --git a/preferences/preference.json b/preferences/preference.json index 1a2d8b7..1782b41 100644 --- a/preferences/preference.json +++ b/preferences/preference.json @@ -30,6 +30,12 @@ "type": "check", "default": true }, + "cpp.gen.convertBracketArrayToPointer": { + "text": "Convert [] arrays in names to pointers", + "description": "If an attribute or parameter name includes brackets (e.g., myList[]), generate a pointer type (e.g., int* myList) instead of a static array.", + "type": "check", + "default": false + }, "cpp.gen.genCpp": { "text": "Generate *.cpp file", "description": "Generate cpp file", From aabf2d310fd747f37b9383eac59f68adae05a9c5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 12 Sep 2025 16:00:54 +0000 Subject: [PATCH 2/4] feat: Add option to generate docs only in headers Co-authored-by: deme3.iot --- code-generator.js | 15 +++++++++++++-- main.js | 1 + preferences/preference.json | 6 ++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/code-generator.js b/code-generator.js index e41bd79..48b27fe 100644 --- a/code-generator.js +++ b/code-generator.js @@ -382,11 +382,18 @@ class CppCodeGenerator { */ writeBodySkeletonCode(elem, options, funct) { var codeWriter = new codegen.CodeWriter(this.getIndentString(options)); - codeWriter.writeLine(copyrightHeader); - codeWriter.writeLine(); + // Suppress documentation in .cpp when docsInHeadersOnly is enabled + var suppressDocs = options && options.docsInHeadersOnly === true; + this._suppressBodyDocs = suppressDocs; + if (!suppressDocs) { + codeWriter.writeLine(copyrightHeader); + codeWriter.writeLine(); + } codeWriter.writeLine('#include "' + elem.name + '.h"'); codeWriter.writeLine(); funct(codeWriter, elem, this); + // Reset for safety + this._suppressBodyDocs = false; return codeWriter.getData(); } @@ -691,6 +698,10 @@ class CppCodeGenerator { * @return {Object} string */ getDocuments(text) { + // When generating .cpp body and docsInHeadersOnly is enabled, skip docs + if (this._suppressBodyDocs === true) { + return ""; + } var docs = ""; if (typeof text === "string" && text.length !== 0) { var lines = text.trim().split("\n"); diff --git a/main.js b/main.js index 79fabba..f24eafe 100644 --- a/main.js +++ b/main.js @@ -34,6 +34,7 @@ function getGenOptions() { ), includeHeader: app.preferences.get("cpp.gen.includeHeader"), genCpp: app.preferences.get("cpp.gen.genCpp"), + docsInHeadersOnly: app.preferences.get("cpp.gen.docsInHeadersOnly"), }; } diff --git a/preferences/preference.json b/preferences/preference.json index 1782b41..63e925f 100644 --- a/preferences/preference.json +++ b/preferences/preference.json @@ -42,6 +42,12 @@ "type": "check", "default": true }, + "cpp.gen.docsInHeadersOnly": { + "text": "Documentation only in headers", + "description": "Suppress Doxygen comments in .cpp and generate them only in .h files.", + "type": "check", + "default": true + }, "cpp.rev": { "text": "C++ Reverse Engineering", "type": "section" From 9c53d42feb73c0e723737e688b46ded6cb98d633 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 12 Sep 2025 16:02:30 +0000 Subject: [PATCH 3/4] Refactor: Always write copyright and header in .cpp files Co-authored-by: deme3.iot --- code-generator.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code-generator.js b/code-generator.js index 48b27fe..9e8b836 100644 --- a/code-generator.js +++ b/code-generator.js @@ -382,13 +382,11 @@ class CppCodeGenerator { */ writeBodySkeletonCode(elem, options, funct) { var codeWriter = new codegen.CodeWriter(this.getIndentString(options)); - // Suppress documentation in .cpp when docsInHeadersOnly is enabled + // Suppress only Doxygen in .cpp when docsInHeadersOnly is enabled, but always include the file header var suppressDocs = options && options.docsInHeadersOnly === true; this._suppressBodyDocs = suppressDocs; - if (!suppressDocs) { - codeWriter.writeLine(copyrightHeader); - codeWriter.writeLine(); - } + codeWriter.writeLine(copyrightHeader); + codeWriter.writeLine(); codeWriter.writeLine('#include "' + elem.name + '.h"'); codeWriter.writeLine(); funct(codeWriter, elem, this); From 7525435dda0863077d892c6cd818d10e1c6d411a Mon Sep 17 00:00:00 2001 From: Demetrio Battaglia Date: Fri, 12 Sep 2025 16:12:35 +0000 Subject: [PATCH 4/4] docs: review ai code (lgtm), write better comments --- code-generator.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code-generator.js b/code-generator.js index 9e8b836..f287278 100644 --- a/code-generator.js +++ b/code-generator.js @@ -382,15 +382,19 @@ class CppCodeGenerator { */ writeBodySkeletonCode(elem, options, funct) { var codeWriter = new codegen.CodeWriter(this.getIndentString(options)); - // Suppress only Doxygen in .cpp when docsInHeadersOnly is enabled, but always include the file header + + // Check if the "Docs in headerfile only" option is active var suppressDocs = options && options.docsInHeadersOnly === true; this._suppressBodyDocs = suppressDocs; + codeWriter.writeLine(copyrightHeader); codeWriter.writeLine(); codeWriter.writeLine('#include "' + elem.name + '.h"'); codeWriter.writeLine(); funct(codeWriter, elem, this); - // Reset for safety + + // Reset for safety, this should not leak to other codegen + // but each time a .cpp is encountered it is set again. this._suppressBodyDocs = false; return codeWriter.getData(); } @@ -700,6 +704,7 @@ class CppCodeGenerator { if (this._suppressBodyDocs === true) { return ""; } + var docs = ""; if (typeof text === "string" && text.length !== 0) { var lines = text.trim().split("\n");