[Monodevelop-devel] Working on the monodevelop dom after 2.2
Lluis Sanchez Gual
lluis at novell.com
Mon Sep 28 20:12:32 EDT 2009
El dt 29 de 09 de 2009 a les 00:09 +0200, en/na Mike Krüger va escriure:
> Hi
>
> > Why is it specific to .NET? I'm missing something here. The document
> > outline shows a hierarchy of items. It is so generic that it even works
> > for XML documents. The class pad is also just a hierarchy of items (for
> > the whole project in this case). The goto type dialog shows a list of
> > types in the solution.
> >
> > The quick member navigation shows types in the first combo, and members
> > of the types in the second one. It can easily be redefined to showing
> > 'first level items of the file' in the first combo, and 'children of the
> > active first level item' in the second combo. Or something like that.
> >
> > I don't see anything .NET specific in all this.
> >
>
> Ok I've looked a bit at the source code.
>
> Class pad:
>
> ClassNodeBuilder, FieldNodeBuilder, MethodNodeBuilder,
> NamespaceNodeBuilder etc.
>
> But it can be extended using the addin tree - but the things we have are
> very specific. For example: I've took a look at the MethodNodeBuilder -
> it doesn't build child nodes (yes there are languages with methods in
> methods). Taking this example it wouldn't even work if we had a new
> INewMethod interface for such a language to be build with the class pad,
> because the MethodNodeBuilder that takes care of building these objects
> would prevent building child nodes.
I feel there is some misunderstanding here. If we introduce a new set of
INew* interfaces we'll certainly have to track the changes in
MethodNodeBuilder and all the builders. And those changes will include
rendering child nodes, since any node can have child nodes.
>
> Quick Member navigation - it's not so easy to set the rules:
>
> 'showing first level items of the file' means:
> + Showing only the namespaces -> no containing types (they're first
> level, and will be part of the DOM as nodes)
> + Don't show inner types (they're second level at best)
>
> 'children of the active first level item' means:
> + Show the current inner type (should be in the type selector).
> + Show the current statement, if the DOM is extended and more specific
> than the monodevelop DOM.
This has a very simple solution:
interface IQuickMemberNavigationProvider
{
IEnumerable<INode> GetTypes ();
IEnumerable<INode> GetMembers (INode type);
}
to be implemented by language bindings.
>
> Then there are 3 navigators: types/members/regions. That doesn't make
> sense for some cases (think of C, there are no members/regions).
>
> Document outline:
> The document outline that shows the hierarchy requires that
> IOutlinedDocument is implemented. A XML and MD DOM get different
> implementations of this interface. It's very general:
>
> public interface IOutlinedDocument
> {
> Gtk.Widget GetOutlineWidget ();
> void ReleaseOutlineWidget ();
> }
>
> I would say that's one of the best components we have for extensibility.
> Because it doesn't 'lock' into a specific model. The downside is that it
> doesn't provide much to re-use. But I think we should have this sort of
> extensibility for all components and let the non-.NET languages a way to
> work around all pre defined structures and replace the components with
> an own way. This ensures that we can't make a mistake.
But that's not always possible. For example, a solution may contain C#
and C++ projects, and the class pad has to show all of them in a single
tree.
It might work in other cases, for example in the quick member navigation
toolbar.
>
> btw. another thing: All pads/output function currently build on ambience
> flags - but for other languages there may be different sets of flags
> required for displaying the information at that point.
>
> > Yes, that's currently possible (with some tweaks). But it means that the
> > language has to implement all the DOM interfaces: IField, IMethod,
> > IType, etc, which are full of .NET specific stuff. Yes, you can just
> > throw NotSupportedException of all .NET specific methods and properties,
> > but that's just unnecessary bloat. If anything, it would be better to
> > have:
>
> We've classes that implement the interfaces, no .NET specific
> implementation is required. But the other thing is that a new languages
> now would ALWAYS require to implement all DOM interfaces that are full
> of .NET specific stuff. (ok could use the same base class)
> You've still not told how to display a VB output, Boo output and c#
> output of a reflection source when putting the output code inside the
> DOM objects. I think that's not easily possible.
I showed it some posts ago:
class DomField: IMember, INewField
{
public string GetDescription (SomeContext ctx)
{
return ctx.Ambience.GetString (this, ctx.AmbienceOptions);
}
...
}
>
> MD side:
> Code Completion DB -> Data (in which DOM format)
>
> Language binding:
> Own Dom info + wants to display code completion data from the code
> completion db
>
> > That would work, although I don't see the benefit of separating data
> > from display data in non .NET languages, since there will be a 1 to 1
> > correspondence between data and display data.
> >
>
> The benefit is that the non .NET languages can communicate with
> MonoDevelop components to produce output. And that the .NET unspecific
> types/members etc. could be implemented today.
> Sometimes the output is altered (adding markup to names etc.) by
> consuming code. Outputting the text from the DOM isn't very easy and
> just a GetString () doesn't cut the edge. We've to display this
> information in various tooltips/lists with different options (short name
> vs. long name). Therefore the GetString () needs to get the same
> parameters as ambiences.
I think we have to look at this case by case. For the tooltip case,
maybe this is enough:
interface ITooltipProvider
{
string GetMarkup (INode node);
}
to be implemented in every non-.net language binding.
>
> I tend to make the monodevelop DOM stuff .NET dependent in the type
> model, generalize the object model so that other .NET languages can be
> supported that are more far from C#/VB.NET and have a way to do
> something like the IOutlinedDocument for each component. I don't want to
> make the life harder for .NET language implementors when the non .NET
> language implementors get little to no gain (See above - they need to
> implement their own widgets/infrastructure - regardless of what we try,
> more worse they can run into dead ends when trying to re-use the
> monodevelop DOM - see the class output pad method example).
No, what I'm proposing does not involve implementing additional
widgets/infrastructure. See above.
Lluis.
More information about the Monodevelop-devel-list
mailing list