[Mono-osx] MonoMac parser.cs
Michael Bluestein
mike.bluestein at gmail.com
Tue Apr 20 11:26:11 EDT 2010
categories are similar to extension methods perhaps
On Apr 20, 2010, at 10:59 AM, Duane Wandless <duane at wandless.net> wrote:
> In the particular case of NSArray and NSMutableArray our runtime has
> been extended to natively convert NSArrays to C# arrays and back so
> the only code that we bound is the required interop code for NSArray.
>
> That is an interesting strategy and is limiting (I think). How I
> use NSMutableArrays is to populate them in C# then send then to the
> native obj-c UI NSArrayControllers, etc. I then can manipulate the
> array in C# and the UI updates as expected. If the only bindings
> exposed are to convert from a List to NSArray then this use would
> not be possible.
>
> Many bits from Foundation make sense for Objective-C programmers as
> they are dealing with a low-level language and are redundant with C#.
>
> I believe this statement is not true, given how I use NSArrays. I
> need to be able to manipulate the underlying object so the UI is
> automatically updated.
>
> We do not currently support a mapping to categories as they do not
> really have a counter part in C#.
>
> I may be too simple... but I view a category as nothing but
> additional methods on the class. But I may be missing some nuance
> of a category.
>
> At a minimum I believe the bindings must expose the addObject,
> insertObject, remove etc selectors on the arrays.
>
> Duane
>
> On Tue, Apr 20, 2010 at 10:03 AM, Miguel de Icaza
> <miguel at novell.com> wrote:
> Hello Duane,
>
> I have taken parser.cs and extended it to handle categories. To
> start I tested parsing NSArray.h. This produced NSArray.cs and
> NSMutableArray.cs. I have "full" bindings for these obj-c classes.
>
> We do not currently support a mapping to categories as they do not
> really have a counter part in C#.
>
> They are *similar* to interfaces, but they can be interfaces with
> optional components so there is no direct mapping to them.
>
> For the delegate pattern we settled on classes that have been
> labeled as "Models" (read more about that on our binding page).
>
> NSMutableArray: http://monobin.com/__m335d328c
> NSArray: http://monobin.com/__m36c66b6e
>
> Nice. For the particular case of Foundation, we have taken an
> approach to only bind what is actually *required* as opposed to
> binding everything. Many bits from Foundation make sense for
> Objective-C programmers as they are dealing with a low-level
> language and are redundant with C#.
>
> In the particular case of NSArray and NSMutableArray our runtime has
> been extended to natively convert NSArrays to C# arrays and back so
> the only code that we bound is the required interop code for NSArray.
>
> So we suggest to work instead on the AppKit bindings.
>
> However not all the bindings generated are valid. For example I do
> not know how to generate a binding for this selector (note I do not
> use this selector, just an example):
> - (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare
> context:(void *)context;
>
> Correct, the parser does the heavy lifting, but requires human
> intervention to fix the output.
>
> Then comes the question of constructors. Take these two (the 2nd is
> not really a constructor I know) from NSMutableArray for example:
> + (id)arrayWithCapacity:(NSUInteger)numItems;
> - (id)initWithCapacity:(NSUInteger)numItems;
>
> My parser exposes these as:
>
> [Static]
> [Export ("arrayWithCapacity:")]
> IntPtr ArrayWithCapacity (uint numItems);
>
> [Export ("initWithCapacity:")]
> IntPtr InitWithCapacity (uint numItems);
>
> This is a great question.
>
> Factory methods should be declared as static methods, and we
> *typically* use the FromXXXX or CreateXXX naming pattern for them,
> so the above would look like this:
>
> [Static, Export ("arrayWithCapacity:")]
> NSArray CreateArray (int items);
>
> Notice that I took the liberty of changing the uint to int because
> that makes the method CLS compliant.
>
> In this case it is a debatable change as there could be arrays with
> more than 2 gig elements, but in many other places in the API this
> is not the case, uint has been used to get an extra bit that is not
> required.
>
> So how can we support the extra 2 gigs of elements while still
> allowing other languages the most common use case? We keep the
> signature as it was originally produced, and introduce a new overload:
>
> [Static, Export ("arrayWithCapacity:")]
> NSArray CreateArray (uint items);
>
> And then on a helper class in Foundation/NSArray.cs we would do:
>
> partial class NSArray {
> static NSArray CreateArray (int items){
> if (items < 0) throw new ArgumentException ();
> return CreateArray ((uint) items);
> }
> }
>
> Now to the second question:
>
> First I do not think returning an IntPtr is correct. It should
> return NSMutableArray. But IntPtr follows what was started with
> MT. Returning an IntPtr will require calling GetNSObject which
> seems cumbersome. Unless I'm missing something.
>
> In the specific case of *constructors* the binding generator
> recognizes the pattern:
>
> IntPtr Constructor (ARGS)
>
> As being the constructor for the class. This is required because
> constructors generate different code than regular method bindings.
>
> So you will see in all of our APIs that we expose that pattern, but
> that this is never translated into an actual exposed IntPtr, it is
> always translated into the correct method name.
>
> Miguel.
>
> _______________________________________________
> Mono-osx mailing list
> Mono-osx at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-osx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-osx/attachments/20100420/3c2b8f10/attachment-0001.html
More information about the Mono-osx
mailing list