$ErrorActionPreference = "Stop" Set-StrictMode -Version Latest $namespaceDefPattern = New-Object -TypeName System.Text.RegularExpressions.Regex -ArgumentList '(?:^\s*)namespace\s+(?[\w.]+)\b', 'Compiled,Multiline,Singleline' $usingPattern = New-Object -TypeName System.Text.RegularExpressions.Regex -ArgumentList '(?:^|;)\s*using\s+(?\w+)\s*;', 'Compiled,Multiline,Singleline' $classDefPattern = New-Object -TypeName System.Text.RegularExpressions.Regex -ArgumentList '(?^\s*)(?public\s+|internal\s+|protected\s+|private\s+)?(?static\s+)?(?unsafe\s+)?(?partial\s+)?(?class\s+|struct\s+)(?\w+)\b', 'Compiled,Multiline,Singleline' $methodPattern = New-Object -TypeName System.Text.RegularExpressions.Regex -ArgumentList '(?:^\s+?\[.*?\](?:\r\n|\r|\n))?(?^\s*)(?(?public\s+|internal\s+|protected\s+|private\s+)?(?static\s+)?(?unsafe\s+)?(?(?!public|internal|protected|private|static|unsafe)\w+(?:\s*<\s*\w+?(?:<\s*\w+\s*>?)?\s*>)?(?:\s*\*+)?\s+)(?\w+)(?\s*\([^)]*\)))(?:\r\n|\r|\n)[\s\S]+?(?:^\k}(?:\r\n|\r|\n))', 'Compiled,Multiline,Singleline' $referNativeFunction = New-Object -TypeName System.Text.RegularExpressions.Regex -ArgumentList '(?`r`n`r`nusing $([string]::Join(";`r`nusing ", $imports) );`r`n`r`n$husks" $husks | Set-Content -Path "$targetPath.gen.cs" -Encoding ascii } $husks = "// `r`n`r`nusing $([string]::Join(";`r`nusing ", $imports) );`r`n`r`nnamespace $namespace;`r`n`r`n" $sb = New-Object -TypeName "System.Text.StringBuilder" $discardMethods = New-Object -TypeName "System.Collections.Generic.SortedSet[string]" $null = $discardMethods.Add("ImFontAtlasBuildPackCustomRectsNative") foreach ($classDef in $classes.Keys) { $null = $sb.Clear().Append($husks).Append("public unsafe partial $classDef`r`n{`r`n") $className = $classDef.Split(" ")[1] $isNative = $className.EndsWith("Native") $discardMethods.Clear() if (!$isNative) { foreach ($methods in $classes[$classDef].Values) { $methodName = $methods[0].Groups["name"].Value; # discard Drag/Slider functions if ($methodName.StartsWith("Drag") -or $methodName.StartsWith("Slider") -or $methodName.StartsWith("VSlider") -or $methodName.StartsWith("InputFloat") -or $methodName.StartsWith("InputInt") -or $methodName.StartsWith("InputDouble") -or $methodName.StartsWith("InputScalar") -or $methodName.StartsWith("ColorEdit") -or $methodName.StartsWith("ColorPicker")) { $null = $discardMethods.Add($methodName) continue } # discard specific functions if ($methodName.StartsWith("ImGuiTextRange") -or $methodName.StartsWith("AddInputCharacter")) { $null = $discardMethods.Add($methodName) continue } # discard Get...Ref functions if ($methodName.StartsWith("Get") -And $methodName.EndsWith("Ref")) { $null = $discardMethods.Add($methodName) continue } foreach ($overload in $methods) { $returnType = $overload.Groups["return"].Value.Trim() $argDef = $overload.Groups["args"].Value # discard functions returning a string of some sort if ($returnType -eq "string" -and $methodName.EndsWith("S")) { $null = $discardMethods.Add($methodName.Substring(0, $methodName.Length - 1)) $null = $discardMethods.Add($methodName) break } # discard formatting functions or functions accepting (begin, end) or (data, size) pairs if ($argDef.Contains("fmt") -or $argDef -match "\btext\b" -or # $argDef.Contains("byte* textEnd") -or $argDef.Contains("str") -or # $argDef.Contains("byte* strEnd") -or # $argDef.Contains("byte* strIdEnd") -or $argDef.Contains("label") -or $argDef.Contains("name") -or $argDef.Contains("prefix") -or $argDef.Contains("byte* shortcut") -or $argDef.Contains("byte* type") -or $argDef.Contains("byte* iniData") -or $argDef.Contains("int dataSize") -or $argDef.Contains("values, int valuesCount") -or $argDef.Contains("data, int itemCount") -or $argDef.Contains("pData, int components") -or $argDef.Contains("ushort* glyphRanges") -or $argDef.Contains("nuint args")) { $null = $discardMethods.Add($methodName) break } } } } foreach ($methods in $classes[$classDef].Values) { $methodName = $methods[0].Groups["name"]; if ( $discardMethods.Contains($methodName)) { continue } foreach ($overload in $methods) { if ($isNative) { $null = $sb.Append($overload.Groups[0].Value.Replace("internal ", "public ").Replace("Native(", "(").Replace("funcTable", "$($className.Substring(0, $className.Length - 6) ).funcTable")) continue } $tmp = $overload.Groups[0].Value $tmp = $referNativeFunction.Replace($tmp, "$( $className )Native.`$1") $tmp = $referNativeFunctionQualified.Replace($tmp, '$1Native.$2') $tmp = $tmp -creplace '(?<=Get[A-Za-z0-9_]+\()ref ([A-Za-z*]+) self(?=, |\))', 'this scoped in $1 self' $tmp = $tmp -creplace '(?<=\()(ref )?([A-Za-z*]+) self(?=, |\))', 'this $1$2 self' $null = $sb.Append($tmp) } } $null = $sb.Append("}`r`n") $nativeMethods = $null if (!$classes.TryGetValue($classDef + "Native", [ref]$nativeMethods)) { $nativeMethods = $null } foreach ($methodName in $discardMethods) { if ($nativeMethods -ne $null) { $overloads = $null if ($nativeMethods.TryGetValue($methodName + "Native", [ref]$overloads)) { foreach ($overload in $overloads) { $null = $sb.Append("// DISCARDED: $( $overload.Groups["prototype"].Value )`r`n") } continue } } $null = $sb.Append("// DISCARDED: $methodName`r`n") } $sb.ToString() | Set-Content -Path "$targetPath/$className.gen.cs" -Encoding ascii } }