Am 30.08.2016 um 21:10 schrieb Jiří Techet:
Geany would then merge the tags, perhaps giving the plugin
ones more
weight, and store it in TM.
I think you underestimate how many tags we're talking here. The
example libclang ft-plugin would have to re-walk the entire AST
(which is absolutely massive, particularly for C++), convert it to
TM tag structures, and then Geany/TM would have to perform some
merging logic, would would be more complicated than now if it was
to support C++ properly, every single re-parse. My intuition tells
me that just won't be fast enough, Clang already jumps through
hoops and uses tricks to just build its own AST in-time.
I think it would be a disaster performance-wise. The number of AST
nodes can be easily 100x more than the amount of tags we have from
ctags (we get a single tag for a function now and AST will contain
complete tree for the function body) so just this might cost 100x
more. In addition all the necessary copies to TM internal
representation, having to maintain the tree structure (in TM we use
GPtrArrays for everything which are very efficient and during tag
merge we try to eliminate even pointer dereferences because those
start getting expensive when managing many tags) etc.
Let's not outright reject possible solutions based on performance
assumptions and guestimations. Performance can be evaluated on an actual
implementation. Until then it's simply an invalid argument for this
discussion. But FWIW, I don't think performance is the driving aspect.
What's needed from the AST is tags (as you and I mentioned elsewhere,
AST is the complete code representation, so much more than what's
required currently). Those can be extracted in one pass. I don't see
that tags need to be converted back to the original AST.
For any successful plugin operation, the AST has to be generated (and
probably re-generated regularly) and traversed at least once. Creating
tags in a traversal that's happening done anyway probably isn't even
going to add much overhead, if any.
As you say, we use a GPtrArray of tags because it's very efficient for
sorting and merging. I think any ft-plugin will also have to sort (at
least) for showing auto-completion and symbols tree - if it shows them
itself. So it may even have to create such array/lists that TM uses
anyway (you can't sort AST directly). So it might as well pass them to
TM for sorting.
And even if we did this, I don't know how we could handle ASTs of
different languages in a generic way because these will differ
significantly.
One more time, seems I wasn't clear enough yet: I'm *not* suggesting
that we create generic code inside Geany that handles any kind of AST.
What I suggest is that plugins that use AST internally (or not) pass
tag-like information to Geany, extracted and flattened from its internal
AST (or whatever it uses). Then Geany and other plugins can use that
information for their own purposes.
Anyway, if needed we can always add more elements to the TMTag
structure so plugins can add some more information.
Yes. I do want to be able to implement new tag-related features in Geany
or other plugins. So if an ft-plugin improves tags over Geany's builtin
abilities, then these should become generally available.
Otherwise we get into a situation where core features of Geany become
exclusive to individual plugins and cannot be improved upon again (get
stuck with a unmaintained plugin that isn't updated to newer Geany
features, anyone?).
Considering the poor quality and orphaned status of some G-P plugins, I
wouldn't want to give individual plugins exclusive access to otherwise
appreciated features which are mostly working in Geany core as of today.
I'd rather not use ft-plugins at all if they provoke such a situation.
Best regards.
_______________________________________________
Devel mailing list
Devel@lists.geany.org
https://lists.geany.org/cgi-bin/mailman/listinfo/devel