* [generator] Fixes WrapAttribute usage with interface protocols Fixes xamarin/xamarin-macios#3869 We need to support the scenario where `WrapAttribute` is used to wrap an interface protocol type declaration like: ```csharp [Wrap ("WeakDelegate")] [NullAllowed] ICLSDataStoreDelegate Delegate { get; set; } [NullAllowed, Export ("delegate", ArgumentSemantic.Weak)] NSObject WeakDelegate { get; set; } ``` We generated invalid code for the setter that needed an explicit cast and ended up with a CS0266 compiler error: Bad generated code: ```csharp [CompilerGenerated] public ICLSDataStoreDelegate Delegate { get { return WeakDelegate as ICLSDataStoreDelegate; } set { WeakDelegate = value; } } ``` Good generated code: ```csharp [CompilerGenerated] public ICLSDataStoreDelegate Delegate { get { return WeakDelegate as ICLSDataStoreDelegate; } set { var rvalue = value as NSObject; if (value != null && rvalue == null) throw new ArgumentException ("The object passed of type " + value.GetType () + " does not derive from NSObject"); WeakDelegate = rvalue; } } ```
This commit is contained in:
Родитель
45ae4c53ce
Коммит
02e8a2d7a3
|
@ -4604,7 +4604,9 @@ public partial class Generator : IMemberGatherer {
|
||||||
print ("set {");
|
print ("set {");
|
||||||
indent++;
|
indent++;
|
||||||
|
|
||||||
if (minfo.protocolize){
|
var is_protocol_wrapper = UnifiedAPI && IsProtocolInterface (pi.PropertyType, false);
|
||||||
|
|
||||||
|
if (minfo.protocolize || is_protocol_wrapper){
|
||||||
print ("var rvalue = value as NSObject;");
|
print ("var rvalue = value as NSObject;");
|
||||||
print ("if (value != null && rvalue == null)");
|
print ("if (value != null && rvalue == null)");
|
||||||
print ("\tthrow new ArgumentException (\"The object passed of type \" + value.GetType () + \" does not derive from NSObject\");");
|
print ("\tthrow new ArgumentException (\"The object passed of type \" + value.GetType () + \" does not derive from NSObject\");");
|
||||||
|
@ -4616,7 +4618,7 @@ public partial class Generator : IMemberGatherer {
|
||||||
if (IsArrayOfWrappedType (pi.PropertyType))
|
if (IsArrayOfWrappedType (pi.PropertyType))
|
||||||
print ("{0} = NSArray.FromNSObjects (value);", wrap);
|
print ("{0} = NSArray.FromNSObjects (value);", wrap);
|
||||||
else
|
else
|
||||||
print ("{0} = {1}value;", wrap, minfo.protocolize ? "r" : "");
|
print ("{0} = {1}value;", wrap, minfo.protocolize || is_protocol_wrapper ? "r" : "");
|
||||||
}
|
}
|
||||||
indent--;
|
indent--;
|
||||||
print ("}");
|
print ("}");
|
||||||
|
|
|
@ -525,6 +525,9 @@ namespace GeneratorTests
|
||||||
[Test]
|
[Test]
|
||||||
public void Bug57870 () => BuildFile (Profile.iOS, true, true, "bug57870.cs");
|
public void Bug57870 () => BuildFile (Profile.iOS, true, true, "bug57870.cs");
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GHIssue3869 () => BuildFile (Profile.iOS, "ghissue3869.cs");
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCase ("issue3875.cs", "AProtocol")]
|
[TestCase ("issue3875.cs", "AProtocol")]
|
||||||
[TestCase ("issue3875B.cs", "BProtocol")]
|
[TestCase ("issue3875B.cs", "BProtocol")]
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
using Foundation;
|
||||||
|
using ObjCRuntime;
|
||||||
|
|
||||||
|
namespace GHIssue3869 {
|
||||||
|
interface IFooDelegate { }
|
||||||
|
|
||||||
|
[Protocol, Model]
|
||||||
|
[BaseType (typeof (NSObject))]
|
||||||
|
interface FooDelegate {
|
||||||
|
|
||||||
|
[Abstract]
|
||||||
|
[Export ("doSomethingForIdentifier:parentContext:parentIdentifierPath:")]
|
||||||
|
NSObject DoSomething (string identifier, NSObject parentContext, string [] parentIdentifierPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
[BaseType (typeof (NSObject))]
|
||||||
|
interface Foo {
|
||||||
|
|
||||||
|
[Wrap ("WeakDelegate")]
|
||||||
|
[NullAllowed]
|
||||||
|
IFooDelegate Delegate { get; set; }
|
||||||
|
|
||||||
|
[NullAllowed, Export ("delegate", ArgumentSemantic.Weak)]
|
||||||
|
NSObject WeakDelegate { get; set; }
|
||||||
|
}
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче