[Generator] BindAs attribute for smart enums of an array of nullable values generates code that doesn't compile, Fixes bug 57797 (#2954)
* [Generator] BindAs attribute for smart enums of an array of nullable values generates code that doesn't compile, Fixes bug 57797 https://bugzilla.xamarin.com/show_bug.cgi?id=57797 We now correctly compiles the array nullabe types * Disable Nullable array types in BindAs until we add registrar support
This commit is contained in:
Родитель
84d63144f0
Коммит
ee19c79feb
|
@ -1307,13 +1307,13 @@ public partial class Generator : IMemberGatherer {
|
|||
var arrRetType = TypeManager.GetUnderlyingNullableType (retType.GetElementType ()) ?? retType.GetElementType ();
|
||||
var valueConverter = string.Empty;
|
||||
|
||||
if (arrType == TypeManager.NSString) {
|
||||
if (arrType == TypeManager.NSString && !isNullable) {
|
||||
valueConverter = isNullable ? "o == null ? null : " : string.Empty;
|
||||
valueConverter += $"{FormatType (retType.DeclaringType, arrRetType)}Extensions.GetConstant (o), {parameterName});";
|
||||
} else if (arrType == TypeManager.NSNumber) {
|
||||
valueConverter += $"{FormatType (retType.DeclaringType, arrRetType)}Extensions.GetConstant ({(isNullable ? "o.Value" : "o")}), {parameterName});";
|
||||
} else if (arrType == TypeManager.NSNumber && !isNullable) {
|
||||
var cast = arrRetType.IsEnum ? "(int)" : string.Empty;
|
||||
valueConverter = $"new NSNumber ({cast}o{denullify}), {parameterName});";
|
||||
} else if (arrType == TypeManager.NSValue) {
|
||||
} else if (arrType == TypeManager.NSValue && !isNullable) {
|
||||
var typeStr = string.Empty;
|
||||
if (!NSValueCreateMap.TryGetValue (arrRetType, out typeStr)) {
|
||||
if (arrRetType.Name == "RectangleF" || arrRetType.Name == "SizeF" || arrRetType.Name == "PointF")
|
||||
|
@ -1323,7 +1323,7 @@ public partial class Generator : IMemberGatherer {
|
|||
}
|
||||
valueConverter = $"NSValue.From{typeStr} (o{denullify}), {parameterName});";
|
||||
} else
|
||||
throw new BindingException (1048, true, "Unsupported type {0} decorated with [BindAs]", retType.Name);
|
||||
throw new BindingException (1048, true, "Unsupported type {0} decorated with [BindAs]", isNullable ? arrRetType.Name + "?[]" : retType.Name);
|
||||
temp = $"NSArray.FromNSObjects (o => {valueConverter}";
|
||||
} else
|
||||
throw new BindingException (1048, true, "Unsupported type {0} decorated with [BindAs]", retType.Name);
|
||||
|
@ -1449,16 +1449,16 @@ public partial class Generator : IMemberGatherer {
|
|||
var arrIsNullable = nullableElementType != null;
|
||||
var arrRetType = arrIsNullable ? nullableElementType : retType.GetElementType ();
|
||||
var valueFetcher = string.Empty;
|
||||
if (arrType == TypeManager.NSString)
|
||||
if (arrType == TypeManager.NSString && !arrIsNullable)
|
||||
append = $"ptr => {{\n\tusing (var str = Runtime.GetNSObject<NSString> (ptr)) {{\n\t\treturn {FormatType (arrRetType.DeclaringType, arrRetType)}Extensions.GetValue (str);\n\t}}\n}}";
|
||||
else if (arrType == TypeManager.NSNumber) {
|
||||
else if (arrType == TypeManager.NSNumber && !arrIsNullable) {
|
||||
if (NSNumberReturnMap.TryGetValue (arrRetType, out valueFetcher) || arrRetType.IsEnum) {
|
||||
var getterStr = string.Format ("{0}{1}", arrIsNullable ? "?" : string.Empty, arrRetType.IsEnum ? ".Int32Value" : valueFetcher);
|
||||
append = string.Format ("ptr => {{\n\tusing (var num = Runtime.GetNSObject<NSNumber> (ptr)) {{\n\t\treturn ({1}) num{0};\n\t}}\n}}", getterStr, FormatType (arrRetType.DeclaringType, arrRetType));
|
||||
}
|
||||
else
|
||||
throw new BindingException (1049, true, GetBindAsExceptionString ("unbox", retType.Name, arrType.Name, "array", minfo.mi));
|
||||
} else if (arrType == TypeManager.NSValue) {
|
||||
} else if (arrType == TypeManager.NSValue && !arrIsNullable) {
|
||||
if (arrRetType.Name == "RectangleF" || arrRetType.Name == "SizeF" || arrRetType.Name == "PointF")
|
||||
valueFetcher = $"{(arrIsNullable ? "?" : string.Empty)}.{arrRetType.Name}Value";
|
||||
else if (!NSValueReturnMap.TryGetValue (arrRetType, out valueFetcher))
|
||||
|
@ -1466,7 +1466,7 @@ public partial class Generator : IMemberGatherer {
|
|||
|
||||
append = string.Format ("ptr => {{\n\tusing (var val = Runtime.GetNSObject<NSValue> (ptr)) {{\n\t\treturn val{0};\n\t}}\n}}", valueFetcher);
|
||||
} else
|
||||
throw new BindingException (1048, true, "Unsupported type {0} decorated with [BindAs]", retType.Name);
|
||||
throw new BindingException (1048, true, "Unsupported type {0} decorated with [BindAs]", arrIsNullable ? arrRetType.Name + "?[]" : retType.Name);
|
||||
} else
|
||||
throw new BindingException (1048, true, "Unsupported type {0} decorated with [BindAs]", retType.Name);
|
||||
return append;
|
||||
|
|
|
@ -23,6 +23,7 @@ namespace Xamarin.Tests
|
|||
class BGenTool : Tool
|
||||
{
|
||||
public Profile Profile;
|
||||
public bool ProcessEnums;
|
||||
|
||||
public List<string> ApiDefinitions = new List<string> ();
|
||||
public string TmpDirectory;
|
||||
|
@ -73,6 +74,9 @@ namespace Xamarin.Tests
|
|||
if (!string.IsNullOrEmpty (TmpDirectory))
|
||||
sb.Append (" --tmpdir=").Append (StringUtils.Quote (TmpDirectory));
|
||||
|
||||
if (ProcessEnums)
|
||||
sb.Append (" --process-enums");
|
||||
|
||||
return sb.ToString ();
|
||||
}
|
||||
|
||||
|
|
|
@ -71,5 +71,99 @@ namespace Bug57795Tests {
|
|||
bgen.AssertExecuteError ("build");
|
||||
bgen.AssertError (1048, "Unsupported type AVMediaTypes[,] decorated with [BindAs]");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BindAsNullableNSStringArrayError ()
|
||||
{
|
||||
// https://bugzilla.xamarin.com/show_bug.cgi?id=57797
|
||||
|
||||
var bgen = new BGenTool {
|
||||
Profile = Profile.iOS
|
||||
};
|
||||
bgen.CreateTemporaryBinding (@"
|
||||
using System;
|
||||
using Foundation;
|
||||
using ObjCRuntime;
|
||||
using AVFoundation;
|
||||
using CoreAnimation;
|
||||
|
||||
namespace Bug57797Tests {
|
||||
|
||||
[BaseType (typeof (NSObject))]
|
||||
interface FooObject {
|
||||
|
||||
[BindAs (typeof (AVMediaTypes? []))]
|
||||
[Export (""strongNullableAVMediaTypesProperties"")]
|
||||
NSString [] StrongNullableAVMediaTypesProperties { get; set; }
|
||||
}
|
||||
}");
|
||||
bgen.AssertExecuteError ("build");
|
||||
bgen.AssertError (1048, "Unsupported type AVMediaTypes?[] decorated with [BindAs]");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BindAsNullableNSValueArrayError ()
|
||||
{
|
||||
// https://bugzilla.xamarin.com/show_bug.cgi?id=57797
|
||||
|
||||
var bgen = new BGenTool {
|
||||
Profile = Profile.iOS
|
||||
};
|
||||
bgen.CreateTemporaryBinding (@"
|
||||
using System;
|
||||
using Foundation;
|
||||
using ObjCRuntime;
|
||||
using AVFoundation;
|
||||
using CoreAnimation;
|
||||
|
||||
namespace Bug57797Tests {
|
||||
|
||||
[BaseType (typeof (NSObject))]
|
||||
interface FooObject {
|
||||
|
||||
[BindAs (typeof (CATransform3D? []))]
|
||||
[Export (""PCATransform3DNullableArray"")]
|
||||
NSValue [] PCATransform3DNullableArrayValue { get; set; }
|
||||
}
|
||||
}");
|
||||
bgen.AssertExecuteError ("build");
|
||||
bgen.AssertError (1048, "Unsupported type CATransform3D?[] decorated with [BindAs]");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BindAsNullableNSNumberArrayError ()
|
||||
{
|
||||
// https://bugzilla.xamarin.com/show_bug.cgi?id=57797
|
||||
|
||||
var bgen = new BGenTool {
|
||||
Profile = Profile.iOS,
|
||||
ProcessEnums = true
|
||||
};
|
||||
bgen.CreateTemporaryBinding (@"
|
||||
using System;
|
||||
using Foundation;
|
||||
using ObjCRuntime;
|
||||
using AVFoundation;
|
||||
using CoreAnimation;
|
||||
|
||||
namespace Bug57797Tests {
|
||||
|
||||
[Native]
|
||||
enum Foo : long {
|
||||
One,
|
||||
Two
|
||||
}
|
||||
|
||||
[BaseType (typeof (NSObject))]
|
||||
interface FooObject {
|
||||
|
||||
[BindAs (typeof (Foo? []))]
|
||||
[Export (""strongNullableAVMediaTypesProperties"")]
|
||||
NSNumber[] StrongNullableFoo { get; set; }
|
||||
}
|
||||
}");
|
||||
bgen.AssertExecuteError ("build");
|
||||
bgen.AssertError (1048, "Unsupported type Foo?[] decorated with [BindAs]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче