Re: Code completion proposal for GtkSourceView

Emmanuele Bassi <[email protected]>
Newsgroups gmane.comp.gnome.devtools
Message-ID <[email protected]>
* Paolo Maggi <[email protected]>:

> I have read your specification but I'm unable to comment on it since I
> have not understood how your GtkSourceCompletionEngine is going to
> interact with GtkSourceBuffer. Could you please try to be more clear
> about this really important aspect?

Right now, and as a first implementation of my specs, I was planning
little or no interaction; basically, the GtkSourceCompletionEngine class
will hold a reference to the GtkSourceBuffer.

> Why complete takes two GtkTextIter as parameters and can_complete does
> not?

The ::complete vfunc is were the magic happens, i.e.:
	
	GtkSourceBuffer *sb;
	GtkSourceCompletionEngine *sce;
	GSList *alternatives;
	
	sce = my_code_completion_engine ();
	
	gtk_source_completion_engine_set_buffer (sce, GTK_TEXT_BUFFER (sb));
	alternatives = gtk_source_completion_engine (sce);
	...

A basic form of code completion feature should be implemented like this.

The ::can_complete method is a flag setter like GtkSourceUndoManager::can_undo.
Imagine a completion engine implemented upon CTags: if ctags has not
been found on the system, code completion will be disabled at runtime; the
code above would become:

	GtkSourceBuffer *sb;
	GtkSourceCompletionEngine *sce;
	GSList *alternatives;

	sce = my_code_completion_engine ();

+	if (! gtk_source_completion_engine_can_complete (sce))
+	{
+		error_message_dialog ("No code completion available");
+		return;
+	}
+
	gtk_source_completion_engine_set_buffer (sce, GTK_TEXT_BUFFER (sb));
	alternatives = gtk_source_completion_engine (sce);
	...

> I'm not sure that complete should return a list of strings. I think you
> should return some more complex object. For example, you would have to
> show the user the visibility (public/private/protected) of the function
> you are going to complete and eventually some form of documentation.

This would mean creating a CompletionMeta object, which could contain
some user stuff.  Something along these lines:

/* visibility flags */
typedef enum {
	GTK_SOURCE_META_PUBLIC = 1<<0,
	GTK_SOURCE_META_PRIVATE = 1<<1,
	GTK_SOURCE_META_PROTECTED = 1<<2,
	...
} GtkSourceMetaVisibility;

/* function */
struct _GtkSourceFunctionMeta
{
	gint visibility : 1;
	
	gchar *name;
	
	gint args_num;
	gchar **args_types;

	gchar *return_type;
};

/* variable */
struct _GtkSourceVariableMeta
{
	gint visibility : 1;

	gchar *name;
	gchar *type;
};

/* symbolic stuff (label, macro, etc.) */
struct _GtkSourceSymbolicMeta
{
	gchar *name;
}

/* opaque container types */
typedef enum {
	GTK_SOURCE_META_FUNCTION = 0,
	GTK_SOURCE_META_VARIABLE,
	GTK_SOURCE_META_SYMBOL,
	...
} GtkSourceMetaType;

/* the opaque container for metadata */
struct _GtkSourceCompletionMeta
{
	GtkSourceMetaType type;

	union {
		GtkSourceFunctionMeta *function;
		GtkSourceVariableMeta *variable;
		GtkSourceSymbolicMeta *symbol;
		...
	} d;
};

> I gave the problem of displaying an autocompletion list some thought
> last year and I should have a prototype on one of my PC... I will send
> you it if I will be able to find it.

That would be most useful.

Regards,
 Emmanuele.

-- 
Emmanuele Bassi (Zefram)                 [ http://www.emmanuelebassi.net ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.