[gnome-builder/0-codesearch-debian-net] add symbol hover support for codesearch.debian.net
- From: Nelson Benítez León <nbenitez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/0-codesearch-debian-net] add symbol hover support for codesearch.debian.net
- Date: Sun, 23 Dec 2018 00:04:07 +0000 (UTC)
commit ddb1f7d5c51e47ab2dbf88131d18f6640b4f4b3c
Author: Nelson Benítez León <nbenitezl gmail com>
Date: Sat Dec 22 23:36:51 2018 +0000
add symbol hover support for codesearch.debian.net
When we are showing symbol info for a macro or a function
in a c file, then add a link to search the source code
of that macro/function in codesearch.debian.net .
It uses the codesearch.debian.net regex search with the
following regex which looks up source definitions for C
macros and functions:
(?mi:^(?:#define\s+)?func_name)\s*\((?m:([^;]+)$)
.../symbol-tree/gbp-symbol-hover-provider.c | 39 +++++++++++++++++++++-
1 file changed, 38 insertions(+), 1 deletion(-)
---
diff --git a/src/plugins/symbol-tree/gbp-symbol-hover-provider.c
b/src/plugins/symbol-tree/gbp-symbol-hover-provider.c
index 0af699874..f5c317511 100644
--- a/src/plugins/symbol-tree/gbp-symbol-hover-provider.c
+++ b/src/plugins/symbol-tree/gbp-symbol-hover-provider.c
@@ -74,6 +74,8 @@ gbp_symbol_hover_provider_get_symbol_cb (GObject *object,
IdeHoverContext *context;
const gchar *name;
GtkWidget *box;
+ IdeSymbolKind kind;
+ gboolean suggest_web_search = FALSE;
struct {
const gchar *kind;
IdeSourceLocation *loc;
@@ -104,7 +106,12 @@ gbp_symbol_hover_provider_get_symbol_cb (GObject *object,
loc[1].loc = ide_symbol_get_definition_location (symbol);
loc[2].loc = ide_symbol_get_canonical_location (symbol);
- if (!loc[0].loc && !loc[1].loc && !loc[2].loc)
+ kind = ide_symbol_get_kind (symbol);
+ if ((kind == IDE_SYMBOL_FUNCTION || kind == IDE_SYMBOL_MACRO) &&
+ dzl_str_equal0 (ide_buffer_get_language_id (buffer), "c"))
+ suggest_web_search = TRUE;
+
+ if (!loc[0].loc && !loc[1].loc && !loc[2].loc && !suggest_web_search)
{
ide_task_return_boolean (task, TRUE);
return;
@@ -159,6 +166,36 @@ gbp_symbol_hover_provider_get_symbol_cb (GObject *object,
}
}
+ if (suggest_web_search)
+ {
+ GtkWidget *label;
+ g_autofree gchar *url = NULL;
+ g_autofree gchar *escaped = NULL;
+ g_autofree gchar *markup = NULL;
+ g_autofree gchar *sym = NULL;
+ const gchar *txt_search = _("Look up source definition");
+ const gchar *txt_at = _("at codesearch.debian.net");
+ char *p = strchr (name, '(');
+ size_t sym_len = p ? p - name : strlen (name);
+ sym = g_strndup (name, sym_len);
+ /* Regex is (?mi:^(?:#define\s+)?text)\s*\((?m:([^;]+)$)
+ * It matches both function and macro definitions */
+ url = g_strconcat
("https://codesearch.debian.net/search?q=%28%3Fmi%3A%5E%28%3F%3A%23define%5Cs%2B%29%3F",
+ sym, "%29%5Cs*%5C%28%28%3Fm%3A%28%5B%5E%3B%5D%2B%29%24%29", NULL);
+
+ escaped = g_markup_escape_text (url, -1);
+ markup = g_strdup_printf ("<a href='%s'>%s</a> <span size='smaller'>%s</span>",
+ escaped, txt_search, txt_at);
+ label = g_object_new (GTK_TYPE_LABEL,
+ "visible", TRUE,
+ "xalign", 0.0f,
+ "margin-top", 10,
+ "use-markup", TRUE,
+ "label", markup,
+ NULL);
+ gtk_container_add (GTK_CONTAINER (box), label);
+ }
+
ide_hover_context_add_widget (context, SYMBOL_TREE_HOVER_PRIORITY, _("Symbol"), box);
ide_task_return_boolean (task, TRUE);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]