@@ -160,6 +160,18 @@ public class CSharpToCppTransformer : TextTransformer
160160 // Count => GetSizeOrZero(Root);
161161 // Count() { return GetSizeOrZero(Root); }
162162 ( new Regex ( @"(\W)([A-Z][a-zA-Z]+)\s+=>\s+([^;\r\n]+);" ) , "$1$2() { return $3; }" , 0 ) ,
163+ // Insert scope borders.
164+ // interface IDisposable { ... }
165+ // interface IDisposable {/*~start~interface~IDisposable~*/ ... /*~end~interface~IDisposable~*/}
166+ ( new Regex ( @"(?<classDeclarationBegin>\r?\n(?<indent>[\t ]*)interface[\t ]*(?<type>[a-zA-Z][a-zA-Z0-9]*(<[^<>\n]*>)?)[^{}]*{)(?<middle>(.|\n)*)(?<beforeEnd>(?<=\r?\n)\k<indent>)(?<end>})" ) , "${classDeclarationBegin}/*~start~interface~${type}~*/${middle}${beforeEnd}/*~end~interface~${type}~*/${end}" , 0 ) ,
167+ // Inside scopes replace:
168+ // /*~start~interface~IDisposable~*/ ... bool IsDisposed { get; } ... /*~end~interface~IDisposable~*/
169+ // /*~start~interface~IDisposable~*/ ... virtual bool IsDisposed() = 0; /*~end~interface~IDisposable~*/
170+ ( new Regex ( @"(?<before>(?<typeScopeStart>/\*~start~interface~(?<type>[^~\n\*]+)~\*/)(.|\n)+?)(?<propertyDeclaration>(?<access>(private|protected|public): )?(?<propertyType>[a-zA-Z_][a-zA-Z0-9_:<>]*) (?<property>[a-zA-Z_][a-zA-Z0-9_]*)(?<blockOpen>[\n\s]*{[\n\s]*)(\[[^\n]+\][\n\s]*)?get;(?<blockClose>[\n\s]*}))(?<after>(.|\n)+?(?<typeScopeEnd>/\*~end~interface~\k<type>~\*/))" ) , "${before}virtual ${propertyType} ${property}() = 0;${after}" , 20 ) ,
171+ // Remove scope borders.
172+ // /*~start~interface~IDisposable~*/
173+ //
174+ ( new Regex ( @"/\*~[^~\*\n]+(~[^~\*\n]+)*~\*/" ) , "" , 0 ) ,
163175 // public: T Object { get; }
164176 // public: const T Object;
165177 ( new Regex ( @"(?<before>[^\r]\r?\n[ \t]*)(?<access>(private|protected|public): )?(?<type>[a-zA-Z_][a-zA-Z0-9_:<>]*) (?<property>[a-zA-Z_][a-zA-Z0-9_]*)(?<blockOpen>[\n\s]*{[\n\s]*)(\[[^\n]+\][\n\s]*)?get;(?<blockClose>[\n\s]*})(?<after>[\n\s]*)" ) , "${before}${access}const ${type} ${property};${after}" , 2 ) ,
@@ -552,8 +564,8 @@ public class CSharpToCppTransformer : TextTransformer
552564 // class Range<T> {/*~start~type~Range<T>~T~*/ ... /*~end~type~Range<T>~T~*/};
553565 ( new Regex ( @"(?<classDeclarationBegin>\r?\n(?<indent>[\t ]*)template <typename (?<typeParameter>[^\n]+)> (struct|class) (?<type>[a-zA-Z0-9]+<\k<typeParameter>>)(\s*:\s*[^{\n]+)?[\t ]*(\r?\n)?[\t ]*{)(?<middle>(.|\n)*)(?<endIndent>(?<=\r?\n)\k<indent>)(?<end>};)" ) , "${classDeclarationBegin}/*~start~type~${type}~${typeParameter}~*/${middle}${endIndent}/*~end~type~${type}~${typeParameter}~*/${end}" , 0 ) ,
554566 // Inside scopes replace:
555- // /*~start~namespace~Platform::Ranges~*/ ... /*~start~type~Range<T>~T~*/ ... public: override std::int32_t GetHashCode() { return {Minimum, Maximum}.GetHashCode(); } ... /*~start ~type~Range<T>~T~*/ ... /*~end~namespace~Platform::Ranges~*/
556- // /*~start~namespace~Platform::Ranges~*/ ... /*~start~type~Range<T>~T~*/ ... /*~start ~type~Range<T>~T~*/ ... /*~end~namespace~Platform::Ranges~*/ namespace std { template <typename T> struct hash<Platform::Ranges::Range<T>> { std::size_t operator()(const Platform::Ranges::Range<T> &obj) const { return {Minimum, Maximum}.GetHashCode(); } }; }
567+ // /*~start~namespace~Platform::Ranges~*/ ... /*~start~type~Range<T>~T~*/ ... public: override std::int32_t GetHashCode() { return {Minimum, Maximum}.GetHashCode(); } ... /*~end ~type~Range<T>~T~*/ ... /*~end~namespace~Platform::Ranges~*/
568+ // /*~start~namespace~Platform::Ranges~*/ ... /*~start~type~Range<T>~T~*/ ... /*~end ~type~Range<T>~T~*/ ... /*~end~namespace~Platform::Ranges~*/ namespace std { template <typename T> struct hash<Platform::Ranges::Range<T>> { std::size_t operator()(const Platform::Ranges::Range<T> &obj) const { return {Minimum, Maximum}.GetHashCode(); } }; }
557569 ( new Regex ( @"(?<namespaceScopeStart>/\*~start~namespace~(?<namespace>[^~\n\*]+)~\*/)(?<betweenStartScopes>(.|\n)+)(?<typeScopeStart>/\*~start~type~(?<type>[^~\n\*]+)~(?<typeParameter>[^~\n\*]+)~\*/)(?<before>(.|\n)+?)(?<hashMethodDeclaration>\r?\n[ \t]*(?<access>(private|protected|public): )override std::int32_t GetHashCode\(\)(\s|\n)*{\s*(?<methodBody>[^\s][^\n]+[^\s])\s*}\s*)(?<after>(.|\n)+?)(?<typeScopeEnd>/\*~end~type~\k<type>~\k<typeParameter>~\*/)(?<betweenEndScopes>(.|\n)+)(?<namespaceScopeEnd>/\*~end~namespace~\k<namespace>~\*/)}\r?\n" ) , "${namespaceScopeStart}${betweenStartScopes}${typeScopeStart}${before}${after}${typeScopeEnd}${betweenEndScopes}${namespaceScopeEnd}}" + Environment . NewLine + Environment . NewLine + "namespace std" + Environment . NewLine + "{" + Environment . NewLine + " template <typename ${typeParameter}>" + 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 ) ,
558570 // Inside scope of /*~start~method~*/ replace:
559571 // /*~start~method~*/ ... Minimum ... /*~end~method~*/
@@ -568,7 +580,7 @@ public class CSharpToCppTransformer : TextTransformer
568580 ( new Regex ( @"(?<before>(struct|class) (?<type>[a-zA-Z][a-zA-Z0-9]*)<[^<>\n]+> : (?<access>(private|protected|public) )?\k<type>)(?<after>\b(?!<))" ) , "${before}<>${after}" , 0 ) ,
569581 // Insert scope borders.
570582 // class Disposable<T> : public Disposable<> { ... };
571- // class Disposable<T> : public Disposable<> {/*~start~type~Disposable~Disposable<T>~Disposable~Disposable<>~*/ ... /*~start ~type~Disposable~Disposable<T>~Disposable~Disposable<>~*/};
583+ // class Disposable<T> : public Disposable<> {/*~start~type~Disposable~Disposable<T>~Disposable~Disposable<>~*/ ... /*~end ~type~Disposable~Disposable<T>~Disposable~Disposable<>~*/};
572584 ( new Regex ( @"(?<classDeclarationBegin>\r?\n(?<indent>[\t ]*)template[\t ]*<(?<typeParameters>[^\n]*)>[\t ]*(struct|class)[\t ]+(?<fullType>(?<type>[a-zA-Z][a-zA-Z0-9]*)(<[^<>\n]*>)?)[\t ]*:[\t ]*(?<access>(private|protected|public)[\t ]+)?(?<fullBaseType>(?<baseType>[a-zA-Z][a-zA-Z0-9]*)(<[^<>\n]*>)?)[\t ]*(\r?\n)?[\t ]*{)(?<middle>(.|\n)*)(?<beforeEnd>(?<=\r?\n)\k<indent>)(?<end>};)" ) , "${classDeclarationBegin}/*~start~type~${type}~${fullType}~${baseType}~${fullBaseType}~*/${middle}${beforeEnd}/*~end~type~${type}~${fullType}~${baseType}~${fullBaseType}~*/${end}" , 0 ) ,
573585 // Inside scopes replace:
574586 // /*~start~type~Disposable~Disposable<T>~Disposable~Disposable<>~*/ ... ) : base( ... /*~end~type~Disposable~Disposable<T>~Disposable~Disposable<>~*/
0 commit comments