From 0d7c04682dec3fd5e5269ba79289b1d4ae963b7e Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 16 Jan 2026 12:48:58 +0100 Subject: [PATCH] Fix parsing `else` preprocessor and `&&` conditions in bindings generator --- Source/Engine/Graphics/Graphics.cpp | 2 +- .../Bindings/BindingsGenerator.Parsing.cs | 1 + .../Flax.Build/Bindings/BindingsGenerator.cs | 48 +++++++++++++++++-- Source/Tools/Flax.Build/Bindings/FieldInfo.cs | 2 + 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/Source/Engine/Graphics/Graphics.cpp b/Source/Engine/Graphics/Graphics.cpp index 8ba17479a..05f52769e 100644 --- a/Source/Engine/Graphics/Graphics.cpp +++ b/Source/Engine/Graphics/Graphics.cpp @@ -29,7 +29,7 @@ bool Graphics::GICascadesBlending = false; PostProcessSettings Graphics::PostProcessSettings; bool Graphics::GammaColorSpace = true; bool Graphics::SpreadWorkload = true; -#if !BUILD_RELEASE && !USE_EDITOR +#if !BUILD_RELEASE || USE_EDITOR float Graphics::TestValue = 0.0f; #endif bool Graphics::PostProcessing::ColorGradingVolumeLUT = true; diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs index c22f28212..a2016c8cb 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs @@ -18,6 +18,7 @@ namespace Flax.Build.Bindings public Stack ScopeTypeStack; public Stack ScopeAccessStack; public Dictionary PreprocessorDefines; + public bool PreprocessorWaitForElse; public List StringCache; public ApiTypeInfo ValidScopeInfoFromStack diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.cs index 16d41b32e..0f23c7332 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.cs @@ -459,7 +459,7 @@ namespace Flax.Build.Bindings tokenValue = tokenValue.Replace("false", "0"); tokenValue = tokenValue.Replace("true", "1"); tokenValue = tokenValue.Replace("||", "|"); - if (tokenValue.Length != 0 && tokenValue != "1" && tokenValue != "0" && tokenValue != "|") + if (tokenValue.Length != 0 && tokenValue != "1" && tokenValue != "0" && tokenValue != "|" && tokenValue != "&") tokenValue = "0"; if (negate) tokenValue = tokenValue == "1" ? "0" : "1"; @@ -469,6 +469,7 @@ namespace Flax.Build.Bindings } // Filter condition + condition = condition.Replace("&&", "&"); bool modified; do { @@ -488,16 +489,53 @@ namespace Flax.Build.Bindings condition = condition.Replace("0|1", "1"); modified = true; } + if (condition.Contains("0|0")) + { + condition = condition.Replace("0|0", "0"); + modified = true; + } + if (condition.Contains("1&1")) + { + condition = condition.Replace("1&1", "1"); + modified = true; + } + if (condition.Contains("1&0")) + { + condition = condition.Replace("1&0", "0"); + modified = true; + } + if (condition.Contains("0&1")) + { + condition = condition.Replace("0&1", "0"); + modified = true; + } + if (condition.Contains("0&0")) + { + condition = condition.Replace("0&0", "0"); + modified = true; + } } while (modified); // Skip chunk of code of condition fails - if (condition != "1") + bool skip = condition != "1"; + context.PreprocessorWaitForElse = !skip; + if (skip) { ParsePreprocessorIf(context.File, tokenizer, ref token); } break; } + case "else": + { + // Skip chunk of code if one of the previous conditions was taken (if/elif) + if (context.PreprocessorWaitForElse) + { + context.PreprocessorWaitForElse = false; + ParsePreprocessorIf(context.File, tokenizer, ref token); + } + break; + } case "ifdef": { // Parse condition @@ -511,8 +549,11 @@ namespace Flax.Build.Bindings // Check condition define = define.Trim(); - if (!context.PreprocessorDefines.ContainsKey(define) && !context.ModuleOptions.CompileEnv.PreprocessorDefinitions.Contains(define)) + bool skip = !context.PreprocessorDefines.ContainsKey(define) && !context.ModuleOptions.CompileEnv.PreprocessorDefinitions.Contains(define); + context.PreprocessorWaitForElse = !skip; + if (skip) { + context.PreprocessorWaitForElse = true; ParsePreprocessorIf(context.File, tokenizer, ref token); } @@ -520,6 +561,7 @@ namespace Flax.Build.Bindings } case "endif": { + context.PreprocessorWaitForElse = false; token = tokenizer.NextToken(true); break; } diff --git a/Source/Tools/Flax.Build/Bindings/FieldInfo.cs b/Source/Tools/Flax.Build/Bindings/FieldInfo.cs index 8d7f7e812..76ade2c24 100644 --- a/Source/Tools/Flax.Build/Bindings/FieldInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/FieldInfo.cs @@ -57,6 +57,8 @@ namespace Flax.Build.Bindings var result = string.Empty; if (IsStatic) result += "static "; + if (IsConstexpr) + result += "constexpr "; result += Type + " " + Name; if (HasDefaultValue) result += " = " + DefaultValue;