Add check for C++ bindings generator for property getter and setter method value types to match

This commit is contained in:
Wojtek Figat
2021-02-02 23:14:21 +01:00
parent 5d535fad6a
commit fb74aef541
2 changed files with 23 additions and 1 deletions

View File

@@ -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;
}

View File

@@ -83,7 +83,7 @@ namespace Flax.Build.Bindings
return sb.ToString();
}
private static bool Equals(List<TypeInfo> a, List<TypeInfo> b)
public static bool Equals(List<TypeInfo> a, List<TypeInfo> b)
{
if (a == null && b == null)
return true;