xamarin-macios/tests/generator/bug53076.cs

42 строки
1.0 KiB
C#
Исходник Обычный вид История

[generator] Turn [Async] methods inside [Protocol] into extension methods Partial fix for: https://bugzilla.xamarin.com/show_bug.cgi?id=53076 We currently generate extension methods for optional members decorated with [Async] inside a [Protocol] but we ignore the required methods decorated with [Async]. This commit fixes this issue and we now generate extension methods for required members. Lets take the following API definition ```csharp [Protocol] interface MyFooProtocol { [Abstract] [Async] [Export ("requiredMethod:completion:")] void RequiredMethod (int arg1, Action<NSError> err); [Async] [Export ("optional:completion:")] void OptionalMethod (int arg1, Action<NSError> err); } ``` This generates: ```csharp public static partial class MyFooProtocol_Extensions { [CompilerGenerated] public unsafe static void OptionalMethod (this IMyFooProtocol This, int arg1, [BlockProxy (typeof (ObjCRuntime.Trampolines.NIDActionArity1V0))]global::System.Action<NSError> err) { if (err == null) throw new ArgumentNullException ("err"); BlockLiteral *block_ptr_err; BlockLiteral block_err; block_err = new BlockLiteral (); block_ptr_err = &block_err; block_err.SetupBlock (Trampolines.SDActionArity1V0.Handler, err); global::ApiDefinition.Messaging.void_objc_msgSend_int_IntPtr (This.Handle, Selector.GetHandle ("optional:completion:"), arg1, (IntPtr) block_ptr_err); block_ptr_err->CleanupBlock (); } [CompilerGenerated] public unsafe static Task OptionalMethodAsync (this IMyFooProtocol This, int arg1) { var tcs = new TaskCompletionSource<bool> (); This.OptionalMethod(arg1, (obj_) => { if (obj_ != null) tcs.SetException (new NSErrorException(obj_)); else tcs.SetResult (true); }); return tcs.Task; } [CompilerGenerated] public unsafe static Task RequiredMethodAsync (this IMyFooProtocol This, int arg1) { var tcs = new TaskCompletionSource<bool> (); This.RequiredMethod(arg1, (obj_) => { if (obj_ != null) tcs.SetException (new NSErrorException(obj_)); else tcs.SetResult (true); }); return tcs.Task; } } ``` Adds unit test Build diff: https://gist.github.com/dalexsoto/75290d1ffa1fdfb529cc30b9e66de5f2
2017-03-25 07:57:05 +03:00
using System;
using Foundation;
using ObjCRuntime;
namespace Bug53076Test {
[Protocol]
interface MyFooProtocol {
[Abstract]
[Async]
[Export ("requiredMethod:completion:")]
void RequiredMethod (int arg1, Action<NSError> err);
[Async]
[Export ("optional:completion:")]
void OptionalMethod (int arg1, Action<NSError> err);
[Abstract]
[Async]
[Export ("requiredReturnMethod:completion:")]
bool RequiredReturnMethod (int arg1, Action<NSError> err);
[Async]
[Export ("optionalReturn:completion:")]
bool OptionalReturnMethod (int arg1, Action<NSError> err);
[Abstract]
[Async (ResultTypeName = "RequiredReturnMethodObjResult")]
[Export ("requiredReturnMethodObj:completion:")]
bool RequiredReturnMethodObj (int arg1, Action<NSError,NSObject> err);
[Async (ResultTypeName = "RequiredReturnMethodObjResult")]
[Export ("optionalReturnObj:completion:")]
bool OptionalReturnMethodObj (int arg1, Action<NSError,NSObject> err);
}
[tests] Port the makefile-based generator tests to NUnit. (#3019) * [tests][generator] Port bindas1048error to NUnit. * [tests][generator] Port bindas1049error to NUnit. * [tests][generator] Port bindas1050modelerror to NUnit. * [tests][generator] Port bindas1050protocolerror to NUnit. * [tests][generator] Port bug42855 to NUnit. * [tests][generator] Port bug57070 to NUnit. * [tests][generator] Port bug52570classinternal to NUnit. * [tests][generator] Port bug52570methodinternal to NUnit. * [tests][generator] Port bug52570allowstaticmembers to NUnit. * [tests][generator] Port protocol-duplicate-abstract-error to NUnit. * [tests][generator] Port protocol-duplicate-method-diff-length to NUnit. * [tests][generator] Port protocol-duplicate-method-diff-out to NUnit. * [tests][generator] Port protocol-duplicate-method-diff-type to NUnit. * [tests][generator] Port protocol-duplicate-method-diff-return to NUnit. * [tests][generator] Port warnaserror to NUnit. * [tests][generator] Port nowarn to NUnit. * [tests][generator] Add support for inspecting/asserting the generated content. * [tests][generator] Port some Xamarin.Mac tests to NUnit. Ported: * bmac_smoke * bmac-with-hyphen-in-name * property-redefination-mac * NSApplicationPublicEnsureMethods * protocol-duplicate-abstract * [tests][generator] Point bgen to our local installation. * [tests][generator] Port the bug31788 test to a unit test. * [generator] Make the 'bgen' helper target more complete. * [tests][generator] Port non-custom iOS tests to unit tests. * [tests][generator] Add new test. * [tests][generator] Port the forum54078 test to a unit test. * [tests][generator] Port the desk63279 test to a unit test. * [tests][generator] Port the desk79124 test to a unit test. * [tests][generator] Port the multiple-api-definitions tests to unit tests. * [generator] Use mono code style. * [tests][generator] Port the bug29493 test to a unit test. * [tests][generator] Port the classNameCollision test to a unit test. * [tests][generator] Port the bi1036 test to a unit test. * [tests][generator] Port the bug37527 test to a unit test. Also fix BI1112 and BI1113 to show up as errors in the console output (since they're exceptions they're already treated as errors and would cause bgen to fail). * [tests][generator] Port the bug27986 test to a unit test. * [tests][generator] Port the bug35176 test to a unit test. * [tests][generator] Port the bi1046 test to a unit test. * [tests][generator] Port the virtualwrap test to a unit test. * [tests][generator] Port the bug42742 test to a unit test. * [tests][generator] Port the noasyncinternalwrapper test to a unit test. * [tests][generator] Port the noasyncwarningcs0219 test to a unit test. * [tests][generator] Port the bug53076 test to a unit test. * [tests][generator] Port the bug53076withmodel test to a unit test. * [tests][generator] Port the fieldenumtests test to a unit test. * [tests][generator] Port the smartenumwithframework test to a unit test. * [tests][generator] Port the forcedtype test to a unit test. * [tests][generator] Port the bug46292 test to a unit test. * [tests][generator] Build tests with MSBuild. There's no need to use xbuild for these tests. * [tests][generator] Remove dead code. * [xharness] Don't run the makefile-based generator tests anymore. Since there aren't any makefile-based generator tests anymore, they've all been ported to NUnit tests. * [tests][generator] Make the bug39614 test do what it was supposed to do: make sure a namespace isn't required (but recommended).
2017-11-20 16:55:16 +03:00
[BaseType (typeof (NSObject))]
interface RequiredReturnMethodObjResult {}
[generator] Turn [Async] methods inside [Protocol] into extension methods Partial fix for: https://bugzilla.xamarin.com/show_bug.cgi?id=53076 We currently generate extension methods for optional members decorated with [Async] inside a [Protocol] but we ignore the required methods decorated with [Async]. This commit fixes this issue and we now generate extension methods for required members. Lets take the following API definition ```csharp [Protocol] interface MyFooProtocol { [Abstract] [Async] [Export ("requiredMethod:completion:")] void RequiredMethod (int arg1, Action<NSError> err); [Async] [Export ("optional:completion:")] void OptionalMethod (int arg1, Action<NSError> err); } ``` This generates: ```csharp public static partial class MyFooProtocol_Extensions { [CompilerGenerated] public unsafe static void OptionalMethod (this IMyFooProtocol This, int arg1, [BlockProxy (typeof (ObjCRuntime.Trampolines.NIDActionArity1V0))]global::System.Action<NSError> err) { if (err == null) throw new ArgumentNullException ("err"); BlockLiteral *block_ptr_err; BlockLiteral block_err; block_err = new BlockLiteral (); block_ptr_err = &block_err; block_err.SetupBlock (Trampolines.SDActionArity1V0.Handler, err); global::ApiDefinition.Messaging.void_objc_msgSend_int_IntPtr (This.Handle, Selector.GetHandle ("optional:completion:"), arg1, (IntPtr) block_ptr_err); block_ptr_err->CleanupBlock (); } [CompilerGenerated] public unsafe static Task OptionalMethodAsync (this IMyFooProtocol This, int arg1) { var tcs = new TaskCompletionSource<bool> (); This.OptionalMethod(arg1, (obj_) => { if (obj_ != null) tcs.SetException (new NSErrorException(obj_)); else tcs.SetResult (true); }); return tcs.Task; } [CompilerGenerated] public unsafe static Task RequiredMethodAsync (this IMyFooProtocol This, int arg1) { var tcs = new TaskCompletionSource<bool> (); This.RequiredMethod(arg1, (obj_) => { if (obj_ != null) tcs.SetException (new NSErrorException(obj_)); else tcs.SetResult (true); }); return tcs.Task; } } ``` Adds unit test Build diff: https://gist.github.com/dalexsoto/75290d1ffa1fdfb529cc30b9e66de5f2
2017-03-25 07:57:05 +03:00
}