From f46fa4adbfb474143999f7088427844ece6339c5 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 13 Sep 2025 12:36:09 +0300 Subject: [PATCH 1/3] Initial commit with task details for issue #60 Adding CLAUDE.md with task information for AI processing. This file will be removed when the task is complete. Issue: https://github.com/linksplatform/RegularExpressions.Transformer.CSharpToCpp/issues/60 --- CLAUDE.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..81a7af6 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,5 @@ +Issue to solve: https://github.com/linksplatform/RegularExpressions.Transformer.CSharpToCpp/issues/60 +Your prepared branch: issue-60-a25cbf31 +Your prepared working directory: /tmp/gh-issue-solver-1757756162550 + +Proceed. \ No newline at end of file From a9bf5fb955c844bd35f9a3e2116fca0b48fe50fa Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 13 Sep 2025 12:43:57 +0300 Subject: [PATCH 2/3] Use Stroustrup-style for C++ type identifiers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change reference patterns from 'Type &var' to 'Type& var' - Change pointer patterns from 'Type *var' to 'Type* var' - Apply consistent Stroustrup style across all C++ type transformations - Ensures generated C++ code follows modern style guidelines Fixes #60 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../CSharpToCppTransformer.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/csharp/Platform.RegularExpressions.Transformer.CSharpToCpp/CSharpToCppTransformer.cs b/csharp/Platform.RegularExpressions.Transformer.CSharpToCpp/CSharpToCppTransformer.cs index 2f5dceb..10cbeab 100644 --- a/csharp/Platform.RegularExpressions.Transformer.CSharpToCpp/CSharpToCppTransformer.cs +++ b/csharp/Platform.RegularExpressions.Transformer.CSharpToCpp/CSharpToCppTransformer.cs @@ -357,16 +357,16 @@ public class CSharpToCppTransformer : TextTransformer // TElement path[MaxPath] = { {0} }; (new Regex(@"(\r?\n[\t ]+)[a-zA-Z0-9]+ ([a-zA-Z0-9]+) = new ([a-zA-Z0-9]+)\[([_a-zA-Z0-9]+)\];"), "$1$3 $2[$4] = { {0} };", 0), // bool Equals(Range other) { ... } - // bool operator ==(const Key &other) const { ... } - (new Regex(@"(?\r?\n[^\n]+bool )Equals\((?[^\n{]+) (?[a-zA-Z0-9]+)\)(?(\s|\n)*{)"), "${before}operator ==(const ${type} &${variable}) const${after}", 0), + // bool operator ==(const Key& other) const { ... } + (new Regex(@"(?\r?\n[^\n]+bool )Equals\((?[^\n{]+) (?[a-zA-Z0-9]+)\)(?(\s|\n)*{)"), "${before}operator ==(const ${type}& ${variable}) const${after}", 0), // Insert scope borders. // class Range { ... public: override std::string ToString() { return ...; } // class Range {/*~Range~*/ ... public: override std::string ToString() { return ...; } (new Regex(@"(?\r?\n(?[\t ]*)template [^<>\n]+)> (struct|class) (?[a-zA-Z0-9]+<\k>)(\s*:\s*[^{\n]+)?[\t ]*(\r?\n)?[\t ]*{)(?((?!class|struct).|\n)+?)(?(?(private|protected|public): )override std::string ToString\(\))"), "${classDeclarationBegin}/*~${type}~*/${middle}${toStringDeclaration}", 0), // Inside the scope of ~!Range!~ replace: // public: override std::string ToString() { return ...; } - // public: operator std::string() const { return ...; }\n\npublic: friend std::ostream & operator <<(std::ostream &out, const A &obj) { return out << (std::string)obj; } - (new Regex(@"(?/\*~(?[_a-zA-Z0-9<>:]+)~\*/)(?.|\n)(?((?~\*/)(.|\n))*?)(?\r?\n(?[ \t]*)(?(private|protected|public): )override std::string ToString\(\) (?{[^}\n]+}))"), "${scope}${separator}${before}" + Environment.NewLine + "${indent}${access}operator std::string() const ${toStringMethodBody}" + Environment.NewLine + Environment.NewLine + "${indent}${access}friend std::ostream & operator <<(std::ostream &out, const ${type} &obj) { return out << (std::string)obj; }", 0), + // public: operator std::string() const { return ...; }\n\npublic: friend std::ostream& operator <<(std::ostream& out, const A& obj) { return out << (std::string)obj; } + (new Regex(@"(?/\*~(?[_a-zA-Z0-9<>:]+)~\*/)(?.|\n)(?((?~\*/)(.|\n))*?)(?\r?\n(?[ \t]*)(?(private|protected|public): )override std::string ToString\(\) (?{[^}\n]+}))"), "${scope}${separator}${before}" + Environment.NewLine + "${indent}${access}operator std::string() const ${toStringMethodBody}" + Environment.NewLine + Environment.NewLine + "${indent}${access}friend std::ostream& operator <<(std::ostream& out, const ${type}& obj) { return out << (std::string)obj; }", 0), // Remove scope borders. // /*~Range~*/ // @@ -578,8 +578,8 @@ public class CSharpToCppTransformer : TextTransformer (new Regex(@"(?\r?\n(?[\t ]*)template [^\n]+)> (struct|class) (?[a-zA-Z0-9]+<\k>)(\s*:\s*[^{\n]+)?[\t ]*(\r?\n)?[\t ]*{)(?(.|\n)*)(?(?<=\r?\n)\k)(?};)"), "${classDeclarationBegin}/*~start~type~${type}~${typeParameter}~*/${middle}${endIndent}/*~end~type~${type}~${typeParameter}~*/${end}", 0), // Inside the scope replace: // /*~start~namespace~Platform::Ranges~*/ ... /*~start~type~Range~T~*/ ... public: override std::int32_t GetHashCode() { return {Minimum, Maximum}.GetHashCode(); } ... /*~end~type~Range~T~*/ ... /*~end~namespace~Platform::Ranges~*/ - // /*~start~namespace~Platform::Ranges~*/ ... /*~start~type~Range~T~*/ ... /*~end~type~Range~T~*/ ... /*~end~namespace~Platform::Ranges~*/ namespace std { template struct hash> { std::size_t operator()(const Platform::Ranges::Range &obj) const { return {Minimum, Maximum}.GetHashCode(); } }; } - (new Regex(@"(?/\*~start~namespace~(?[^~\n\*]+)~\*/)(?(.|\n)+)(?/\*~start~type~(?[^~\n\*]+)~(?[^~\n\*]+)~\*/)(?(.|\n)+?)(?\r?\n[ \t]*(?(private|protected|public): )override std::int32_t GetHashCode\(\)(\s|\n)*{\s*(?[^\s][^\n]+[^\s])\s*}\s*)(?(.|\n)+?)(?/\*~end~type~\k~\k~\*/)(?(.|\n)+)(?/\*~end~namespace~\k~\*/)}\r?\n"), "${namespaceScopeStart}${betweenStartScopes}${typeScopeStart}${before}${after}${typeScopeEnd}${betweenEndScopes}${namespaceScopeEnd}}" + Environment.NewLine + Environment.NewLine + "namespace std" + Environment.NewLine + "{" + Environment.NewLine + " template " + Environment.NewLine + " struct hash<${namespace}::${type}>" + Environment.NewLine + " {" + Environment.NewLine + " std::size_t operator()(const ${namespace}::${type} &obj) const" + Environment.NewLine + " {" + Environment.NewLine + " /*~start~method~*/${methodBody}/*~end~method~*/" + Environment.NewLine + " }" + Environment.NewLine + " };" + Environment.NewLine + "}" + Environment.NewLine, 10), + // /*~start~namespace~Platform::Ranges~*/ ... /*~start~type~Range~T~*/ ... /*~end~type~Range~T~*/ ... /*~end~namespace~Platform::Ranges~*/ namespace std { template struct hash> { std::size_t operator()(const Platform::Ranges::Range& obj) const { return {Minimum, Maximum}.GetHashCode(); } }; } + (new Regex(@"(?/\*~start~namespace~(?[^~\n\*]+)~\*/)(?(.|\n)+)(?/\*~start~type~(?[^~\n\*]+)~(?[^~\n\*]+)~\*/)(?(.|\n)+?)(?\r?\n[ \t]*(?(private|protected|public): )override std::int32_t GetHashCode\(\)(\s|\n)*{\s*(?[^\s][^\n]+[^\s])\s*}\s*)(?(.|\n)+?)(?/\*~end~type~\k~\k~\*/)(?(.|\n)+)(?/\*~end~namespace~\k~\*/)}\r?\n"), "${namespaceScopeStart}${betweenStartScopes}${typeScopeStart}${before}${after}${typeScopeEnd}${betweenEndScopes}${namespaceScopeEnd}}" + Environment.NewLine + Environment.NewLine + "namespace std" + Environment.NewLine + "{" + Environment.NewLine + " template " + Environment.NewLine + " struct hash<${namespace}::${type}>" + Environment.NewLine + " {" + Environment.NewLine + " std::size_t operator()(const ${namespace}::${type}& obj) const" + Environment.NewLine + " {" + Environment.NewLine + " /*~start~method~*/${methodBody}/*~end~method~*/" + Environment.NewLine + " }" + Environment.NewLine + " };" + Environment.NewLine + "}" + Environment.NewLine, 10), // Inside scope of /*~start~method~*/ replace: // /*~start~method~*/ ... Minimum ... /*~end~method~*/ // /*~start~method~*/ ... obj.Minimum ... /*~end~method~*/ @@ -624,7 +624,7 @@ public class CSharpToCppTransformer : TextTransformer // /*~app-domain~_currentDomain~*/ ... /* No translation. It is not possible to unsubscribe from std::atexit. */ (new Regex(@"(?(?/\*~app-domain~(?[^~\n\*]+)~\*/)(.|\n)+?\r?\n[\t ]*)\k\.ProcessExit[\t ]*\-=[\t ]*(?[a-zA-Z_][a-zA-Z0-9_]*);"), "${before}/* No translation. It is not possible to unsubscribe from std::atexit. */", 20), // Inside the scope replace: - // /*~process-exit-handler~OnProcessExit~*/ ... static void OnProcessExit(void *sender, EventArgs e) + // /*~process-exit-handler~OnProcessExit~*/ ... static void OnProcessExit(void* sender, EventArgs e) // /*~process-exit-handler~OnProcessExit~*/ ... static void OnProcessExit() (new Regex(@"(?(?/\*~process-exit-handler~(?[^~\n\*]+)~\*/)(.|\n)+?static[\t ]+void[\t ]+\k\()[^()\n]+\)"), "${before})", 20), // Remove scope borders. @@ -645,11 +645,11 @@ public class CSharpToCppTransformer : TextTransformer public static readonly IList LastStage = new List { // IDisposable disposable) - // IDisposable &disposable) - (new Regex(@"(?I[A-Z][a-zA-Z0-9]+(<[^>\r\n]+>)?) (?[_a-zA-Z0-9]+)(?,|\))"), "${argumentAbstractType} &${argument}${after}", 0), + // IDisposable& disposable) + (new Regex(@"(?I[A-Z][a-zA-Z0-9]+(<[^>\r\n]+>)?) (?[_a-zA-Z0-9]+)(?,|\))"), "${argumentAbstractType}& ${argument}${after}", 0), // ICounter c1; // ICounter* c1; - (new Regex(@"(?I[A-Z][a-zA-Z0-9]+(<[^>\r\n]+>)?) (?[_a-zA-Z0-9]+)(? = null)?;"), "${abstractType} *${variable}${after};", 0), + (new Regex(@"(?I[A-Z][a-zA-Z0-9]+(<[^>\r\n]+>)?) (?[_a-zA-Z0-9]+)(? = null)?;"), "${abstractType}* ${variable}${after};", 0), // (expression) // expression (new Regex(@"(\(| )\(([a-zA-Z0-9_\*:]+)\)(,| |;|\))"), "$1$2$3", 0), @@ -684,8 +684,8 @@ public class CSharpToCppTransformer : TextTransformer // 0 (new Regex(@"(?\r?\n[^""\r\n]*(""(\\""|[^""\r\n])*""[^""\r\n]*)*)(?<=\W)default(?\W)"), "${before}0${after}", 10), // object x - // void *x - (new Regex(@"(?\r?\n[^""\r\n]*(""(\\""|[^""\r\n])*""[^""\r\n]*)*)(?<=\W)(?\w)"), "${before}void *${after}", 10), + // void* x + (new Regex(@"(?\r?\n[^""\r\n]*(""(\\""|[^""\r\n])*""[^""\r\n]*)*)(?<=\W)(?\w)"), "${before}void* ${after}", 10), // // (new Regex(@"(?\r?\n[^""\r\n]*(""(\\""|[^""\r\n])*""[^""\r\n]*)*)(?<=\W)(?\W)"), "${before}void*${after}", 10), From 372ef749e7ed4a7dc895043a103cbf6be603ffaa Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 13 Sep 2025 12:44:41 +0300 Subject: [PATCH 3/3] Remove CLAUDE.md - Claude command completed --- CLAUDE.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 81a7af6..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,5 +0,0 @@ -Issue to solve: https://github.com/linksplatform/RegularExpressions.Transformer.CSharpToCpp/issues/60 -Your prepared branch: issue-60-a25cbf31 -Your prepared working directory: /tmp/gh-issue-solver-1757756162550 - -Proceed. \ No newline at end of file