diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs index b39f2f066..42c0e73b2 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs @@ -691,6 +691,28 @@ namespace Flax.Build.Bindings else propertyInfo.Setter = functionInfo; + if (propertyInfo.Getter != null && propertyInfo.Setter != null) + { + // Check if getter and setter types are matching (const and ref specifiers are skipped) + var getterType = propertyInfo.Getter.ReturnType; + var setterType = propertyInfo.Setter.Parameters[0].Type; + if (!string.Equals(getterType.Type, setterType.Type) || + getterType.IsPtr != setterType.IsPtr || + getterType.IsArray != setterType.IsArray || + getterType.IsBitField != setterType.IsBitField || + getterType.ArraySize != setterType.ArraySize || + getterType.BitSize != setterType.BitSize || + !TypeInfo.Equals(getterType.GenericArgs, setterType.GenericArgs)) + { + // Skip compatible types + if (getterType.Type == "String" && setterType.Type == "StringView") + return propertyInfo; + if (getterType.Type == "Array" && setterType.Type == "Span" && getterType.GenericArgs?.Count == 1 && setterType.GenericArgs?.Count == 1 && getterType.GenericArgs[0].Equals(setterType.GenericArgs[0])) + return propertyInfo; + throw new Exception($"Property {propertyName} in class {classInfo.Name} (line {context.Tokenizer.CurrentLine}) has mismatching getter return type ({getterType}) and setter parameter type ({setterType}). Both getter and setter methods must use the same value type used for property."); + } + } + return propertyInfo; } diff --git a/Source/Tools/Flax.Build/Bindings/TypeInfo.cs b/Source/Tools/Flax.Build/Bindings/TypeInfo.cs index 8af061200..962aa9523 100644 --- a/Source/Tools/Flax.Build/Bindings/TypeInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/TypeInfo.cs @@ -83,7 +83,7 @@ namespace Flax.Build.Bindings return sb.ToString(); } - private static bool Equals(List a, List b) + public static bool Equals(List a, List b) { if (a == null && b == null) return true;