Good Morning guys, me again :-)
So today I'm dealing with TFS, and trying to add a method to a CLR type, as
follows:

class Microsoft::TeamFoundation::Build::Client::BuildServer
def query_single_build(spec)
self.query_builds(spec).builds.first
end
end

I then get an instance of this class by doing

build_server = tfs.get_service IBuildServer.to_clr_type

however, some strange things happen.

Firstly, the query_single_build method isn't available, and secondly, the
class doesn't match. Here's an interesting paste from irb

>>> build_server
=> Microsoft.TeamFoundation.Build.Client.BuildServer

>>> build_server.class
=> Microsoft::TeamFoundation::Build::Client::BuildServer

>>> build_server.class ==
Microsoft::TeamFoundation::Build::Client::BuildServer
=> false

Microsoft::TeamFoundation::Build::Client::BuildServer.to_clr_type
=> nil

What appears to be happening here is
that Microsoft.TeamFoundation.Build.Client.BuildServer is an internal class
inside the TFS dll's, and so IronRuby is transparently creating a new
ruby-only Microsoft::TeamFoundation::Build::Client::BuildServer class.
Technically this is probably correct, but it's *incredibly* confusing. I
only came to this conclusion by digging around in reflector for a while, and
I'm not really sure if it's actually what's happening

So, is my guess correct, and is there anything that could be done to clarify
this in future? IIRC ruby 1.9 has a 'shadowing' warning that happens when
you shadow a method variable with a local variable - perhaps this could be
emitted when IronRuby is 'shadowing' a private clr class instead of
extending it?

For posterity, I solved it by extending the public IBuildServer interface
instead of the class.

module Microsoft::TeamFoundation::Build::Client::IBuildServer
   def ...
_______________________________________________
Ironruby-core mailing list
Ironruby-core@rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core

Reply via email to