inter-plugin dependencies and BC
Roberto Raggi
roberto at kdevelop.org
Thu Sep 8 14:39:06 UTC 2005
Hi!
On Thursday 08 September 2005 12:53, Alexander Dymo wrote:
> Hi!
> This mail summarises what we've discussed with Ian Geiser at aKademy.
> Current policy in KDevelop is to put all public interfaces people may use
> to lib/interfaces (libkdevelop.so) and implement them somewhere in shell.
> This obviously means that we have lots of interfaces in the core but not
> all of them are necessary for platform applications.
this is impossible :-) we will create a *huge* set of interfaces. Things about
the C++ programming language support. I'd love to be able to write a plugin
that extends the C++ support. Of course such plugin needs to know a lot about
the classes *exposed* by the C++ support(e.g. the C++ AST, the way the C++
support store the informations in the Code model, the way the C++ support
creates new classes, methods, ...).. We can generalize many things in
libkdevelop.so but not everything.
> The solution is to allow individual plugins to define their interfaces and
> link other plugins to those interfaces. Basically, we'd like to introduce
> inter-plugin dependencies (like Eclipse ;)). The only problem is that we'd
I like it.
> be forced then to keep BC not only in the core interfaces, but in plugins
> as well. And this is not good for us.
we need some sort of versioning.
>
> But there's a way to introduce inter-plugin dependencies and at the same
> time do not care about BC. The solutions is simple - we can use
> QMetaObject::invoke and some kind of IDL compiler.
> Please take a look at attachment where a simple model of kdevelop
> architecture is implemented and two plugins (plugin1 and plugin2) are
> created.
I'm not 100% sure it is a good idea to create/use such tool.
> What do you think about exposing interfaces in that way?
> PS: If we do that, we could move more interfaces from the core to plugins
> (like in Eclipse where you have runtime plugin, resources plugin, etc.).
I'm all for it. I think we already discussed something like that one or two
years ago. In Qt Designer 4 I *solved* the problem with a library called
"extension framework". The extension framework is an implementation of the
adaptor pattern (eclipse uses the same patter to extend the resources..
IAdatable, IAdapter, IAdapterFactory, IAdapterManager and so on).
With the extension framework is possible to extend an existing object at
runtime. This is very useful for extening an object without breaking the BC,
of for introducing a new version of the interface. For instance suppose you
have two version of an interface
struct MyInterfaceV1
{ ...
virtual void method1() = 0;
};
Q_DECLARE_EXTENSION_INTERFACE(MyInterfaceV1, "org.kdevelop.iface.v1")
struct MyInterfaceV2
{ ...
virtual void method1() = 0;
virtual void method2() = 0;
};
Q_DECLARE_EXTENSION_INTERFACE(MyInterfaceV2, "org.kdevelop.iface.v2")
now you can ask which extension your instance support. Of course the instance
can support both extension.
if (MyInterfaceV1 *v1 = qt_extension<MyInterfaceV1*>(m, instance))
{
// do something
}
else if (MyInterfaceV2 *v2 = qt_extension<MyInterfaceV2*>(m, instance))
{
// do something else
}
the qt_extension<> uses strings as typeid. So if you change the declaration
Q_DECLARE_EXTENSION_INTERFACE(MyInterfaceV2, "org.kdevelop.iface.v2")
with
Q_DECLARE_EXTENSION_INTERFACE(MyInterfaceV2, "org.kdevelop.iface.v2-abi2")
the qt_extension<MyInterfaceV2*>(..) will fail and return a 0x0 pointer.. so
there is no crash and we can show a message saying the plugin doesn't support
the extension *whatever*.
an instance can implement more then one type of extension.. And the cool thing
about the extension framework is that different instances comunicate using
"abstract classes" (handles). So they don't have to link with a library. If
you're interesting I can write a small example that show how to use the
extension framework from two different plugins.
ciao robe
More information about the KDevelop-devel
mailing list