From c84f44d6c7af954f4efde14dbba72093e9cbe5a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Wagner?= Date: Mon, 29 Jun 2020 22:13:53 +0200 Subject: [PATCH 1/5] Show multiple diagnostics on same line --- src/libide/code/ide-diagnostics.c | 10 +- src/libide/code/ide-diagnostics.h | 2 +- src/libide/sourceview/ide-source-view.c | 99 ++++++++++--------- .../editor/gbp-editor-hover-provider.c | 29 +++--- 4 files changed, 78 insertions(+), 62 deletions(-) diff --git a/src/libide/code/ide-diagnostics.c b/src/libide/code/ide-diagnostics.c index 0bb462465..b067029e6 100644 --- a/src/libide/code/ide-diagnostics.c +++ b/src/libide/code/ide-diagnostics.c @@ -452,16 +452,19 @@ ide_diagnostics_foreach_line_in_range (IdeDiagnostics *self, * * Since: 3.32 */ -IdeDiagnostic * +GPtrArray * ide_diagnostics_get_diagnostic_at_line (IdeDiagnostics *self, GFile *file, guint line) { IdeDiagnosticsPrivate *priv = ide_diagnostics_get_instance_private (self); + GPtrArray *valid_diag = NULL; g_return_val_if_fail (IDE_IS_DIAGNOSTICS (self), NULL); g_return_val_if_fail (G_IS_FILE (file), NULL); + valid_diag = g_ptr_array_new (); + for (guint i = 0; i < priv->items->len; i++) { IdeDiagnostic *diag = g_ptr_array_index (priv->items, i); @@ -476,9 +479,12 @@ ide_diagnostics_get_diagnostic_at_line (IdeDiagnostics *self, loc_line = ide_location_get_line (loc); if (loc_line == line && g_file_equal (file, loc_file)) - return diag; + g_ptr_array_add (valid_diag, diag); } + if (valid_diag->len != 0) + return valid_diag; + return NULL; } diff --git a/src/libide/code/ide-diagnostics.h b/src/libide/code/ide-diagnostics.h index 5fbc47d97..0db06861f 100644 --- a/src/libide/code/ide-diagnostics.h +++ b/src/libide/code/ide-diagnostics.h @@ -88,7 +88,7 @@ void ide_diagnostics_foreach_line_in_range (IdeDiagnostics IdeDiagnosticsLineCallback callback, gpointer user_data); IDE_AVAILABLE_IN_3_32 -IdeDiagnostic *ide_diagnostics_get_diagnostic_at_line (IdeDiagnostics *self, +GPtrArray *ide_diagnostics_get_diagnostic_at_line (IdeDiagnostics *self, GFile *file, guint line); diff --git a/src/libide/sourceview/ide-source-view.c b/src/libide/sourceview/ide-source-view.c index e27dafcff..dbabc7426 100644 --- a/src/libide/sourceview/ide-source-view.c +++ b/src/libide/sourceview/ide-source-view.c @@ -3402,11 +3402,12 @@ ide_source_view_real_move_error (IdeSourceView *self, wrapped: while (movement (&iter)) { - IdeDiagnostic *diag; + GPtrArray *line_diags; guint line = gtk_text_iter_get_line (&iter); - if ((diag = ide_diagnostics_get_diagnostic_at_line (diagnostics, file, line))) + if ((line_diags = ide_diagnostics_get_diagnostic_at_line (diagnostics, file, line))) { + IdeDiagnostic *diag = g_ptr_array_index (line_diags, 0); IdeLocation *location; location = ide_diagnostic_get_location (diag); @@ -4491,7 +4492,7 @@ ide_source_view_real_populate_popup (GtkTextView *text_view, IdeSourceView *self = (IdeSourceView *)text_view; GtkSeparatorMenuItem *sep; IdeDiagnostics *diagnostics; - IdeDiagnostic *diagnostic = NULL; + GPtrArray *line_diags = NULL; GtkTextBuffer *buffer; GtkMenuItem *menu_item; GtkTextMark *insert; @@ -4529,60 +4530,64 @@ ide_source_view_real_populate_popup (GtkTextView *text_view, * If so, display the "Apply TextEdit" menu item with available fixits. */ if ((diagnostics = ide_buffer_get_diagnostics (IDE_BUFFER (buffer)))) - diagnostic = ide_diagnostics_get_diagnostic_at_line (diagnostics, + line_diags = ide_diagnostics_get_diagnostic_at_line (diagnostics, ide_buffer_get_file (IDE_BUFFER (buffer)), gtk_text_iter_get_line (&iter)); - if (diagnostic != NULL) + if (line_diags != NULL) { - guint num_fixits; + for (int j = 0; j < line_diags->len; j++) + { + IdeDiagnostic *diag = g_ptr_array_index (line_diags, j); + guint num_fixits; - num_fixits = ide_diagnostic_get_n_fixits (diagnostic); + num_fixits = ide_diagnostic_get_n_fixits (diag); - if (num_fixits > 0) - { - GtkWidget *parent; - GtkWidget *submenu; - guint i; + if (num_fixits > 0) + { + GtkWidget *parent; + GtkWidget *submenu; + guint i; - sep = g_object_new (GTK_TYPE_SEPARATOR_MENU_ITEM, - "visible", TRUE, - NULL); - gtk_menu_shell_prepend (GTK_MENU_SHELL (popup), GTK_WIDGET (sep)); + sep = g_object_new (GTK_TYPE_SEPARATOR_MENU_ITEM, + "visible", TRUE, + NULL); + gtk_menu_shell_prepend (GTK_MENU_SHELL (popup), GTK_WIDGET (sep)); - submenu = gtk_menu_new (); + submenu = gtk_menu_new (); - parent = g_object_new (GTK_TYPE_MENU_ITEM, - "label", _("Apply Fix-It"), - "submenu", submenu, - "visible", TRUE, - NULL); - gtk_menu_shell_prepend (GTK_MENU_SHELL (popup), parent); + parent = g_object_new (GTK_TYPE_MENU_ITEM, + "label", _("Apply Fix-It"), + "submenu", submenu, + "visible", TRUE, + NULL); + gtk_menu_shell_prepend (GTK_MENU_SHELL (popup), parent); - for (i = 0; i < num_fixits; i++) - { - IdeTextEdit *fixit; - gchar *label; - - fixit = ide_diagnostic_get_fixit (diagnostic, i); - label = ide_source_view_get_fixit_label (self, fixit); - - menu_item = g_object_new (GTK_TYPE_MENU_ITEM, - "label", label, - "visible", TRUE, - NULL); - gtk_menu_shell_append (GTK_MENU_SHELL (submenu), GTK_WIDGET (menu_item)); - - g_object_set_data_full (G_OBJECT (menu_item), - "IDE_FIXIT", - g_object_ref (fixit), - (GDestroyNotify)g_object_unref); - - g_signal_connect_object (menu_item, - "activate", - G_CALLBACK (ide_source_view__fixit_activate), - self, - G_CONNECT_SWAPPED); + for (i = 0; i < num_fixits; i++) + { + IdeTextEdit *fixit; + gchar *label; + + fixit = ide_diagnostic_get_fixit (diag, i); + label = ide_source_view_get_fixit_label (self, fixit); + + menu_item = g_object_new (GTK_TYPE_MENU_ITEM, + "label", label, + "visible", TRUE, + NULL); + gtk_menu_shell_append (GTK_MENU_SHELL (submenu), GTK_WIDGET (menu_item)); + + g_object_set_data_full (G_OBJECT (menu_item), + "IDE_FIXIT", + g_object_ref (fixit), + (GDestroyNotify)g_object_unref); + + g_signal_connect_object (menu_item, + "activate", + G_CALLBACK (ide_source_view__fixit_activate), + self, + G_CONNECT_SWAPPED); + } } } } diff --git a/src/plugins/editor/gbp-editor-hover-provider.c b/src/plugins/editor/gbp-editor-hover-provider.c index b4319775d..e60d69440 100644 --- a/src/plugins/editor/gbp-editor-hover-provider.c +++ b/src/plugins/editor/gbp-editor-hover-provider.c @@ -62,21 +62,26 @@ gbp_editor_hover_provider_hover_async (IdeHoverProvider *provider, GFile *file = ide_buffer_get_file (IDE_BUFFER (buffer)); guint line = gtk_text_iter_get_line (iter); IdeDiagnostics *diagnostics; - IdeDiagnostic *diag; + GPtrArray *line_diags; if ((diagnostics = ide_buffer_get_diagnostics (IDE_BUFFER (buffer))) && - (diag = ide_diagnostics_get_diagnostic_at_line (diagnostics, file, line))) + (line_diags = ide_diagnostics_get_diagnostic_at_line (diagnostics, file, line))) { - g_autoptr(IdeMarkedContent) content = NULL; - g_autofree gchar *text = ide_diagnostic_get_text_for_display (diag); - - content = ide_marked_content_new_from_data (text, - strlen (text), - IDE_MARKED_KIND_PLAINTEXT); - ide_hover_context_add_content (context, - DIAGNOSTICS_HOVER_PRIORITY, - _("Diagnostics"), - content); + for (int i = 0; i < line_diags->len; i++) + { + IdeDiagnostic *diag = g_ptr_array_index (line_diags, i); + g_autoptr(IdeMarkedContent) content = NULL; + g_autofree gchar *text = ide_diagnostic_get_text_for_display (diag); + + content = ide_marked_content_new_from_data (text, + strlen (text), + IDE_MARKED_KIND_PLAINTEXT); + ide_hover_context_add_content (context, + DIAGNOSTICS_HOVER_PRIORITY, + _("Diagnostics"), + content); + + } } } -- GitLab From e1b6530ed709cb2136b7f73a33d414ce6c320931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Wagner?= Date: Tue, 30 Jun 2020 07:54:20 +0200 Subject: [PATCH 2/5] Reserve API and transfer full for diagnostics --- src/libide/code/ide-diagnostics.c | 52 +++++++++++++++++-- src/libide/code/ide-diagnostics.h | 6 ++- src/libide/sourceview/ide-source-view.c | 16 +++--- .../editor/gbp-editor-hover-provider.c | 9 ++-- 4 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/libide/code/ide-diagnostics.c b/src/libide/code/ide-diagnostics.c index b067029e6..ec430b5ee 100644 --- a/src/libide/code/ide-diagnostics.c +++ b/src/libide/code/ide-diagnostics.c @@ -452,18 +452,60 @@ ide_diagnostics_foreach_line_in_range (IdeDiagnostics *self, * * Since: 3.32 */ -GPtrArray * +IdeDiagnostic * ide_diagnostics_get_diagnostic_at_line (IdeDiagnostics *self, GFile *file, guint line) { IdeDiagnosticsPrivate *priv = ide_diagnostics_get_instance_private (self); - GPtrArray *valid_diag = NULL; g_return_val_if_fail (IDE_IS_DIAGNOSTICS (self), NULL); g_return_val_if_fail (G_IS_FILE (file), NULL); - valid_diag = g_ptr_array_new (); + for (guint i = 0; i < priv->items->len; i++) + { + IdeDiagnostic *diag = g_ptr_array_index (priv->items, i); + IdeLocation *loc = ide_diagnostic_get_location (diag); + GFile *loc_file; + guint loc_line; + + if (loc == NULL) + continue; + + loc_file = ide_location_get_file (loc); + loc_line = ide_location_get_line (loc); + + if (loc_line == line && g_file_equal (file, loc_file)) + return diag; + } + + return NULL; +} + +/** + * ide_diagnostics_get_diagnostics_at_line: + * @self: a #IdeDiagnostics + * @file: the target file + * @line: a line number + * + * Locates all #IdeDiagnostic in @file at @line. + * + * Returns: (transfer full) (element-type IdeDiagnostic) (nullable): an #GPtrArray or %NULL + * + * Since: 3.38 + */ +GPtrArray * +ide_diagnostics_get_diagnostics_at_line (IdeDiagnostics *self, + GFile *file, + guint line) +{ + IdeDiagnosticsPrivate *priv = ide_diagnostics_get_instance_private (self); + g_autoptr(GPtrArray) valid_diag = NULL; + + g_return_val_if_fail (IDE_IS_DIAGNOSTICS (self), NULL); + g_return_val_if_fail (G_IS_FILE (file), NULL); + + valid_diag = g_ptr_array_new_with_free_func (g_object_unref); for (guint i = 0; i < priv->items->len; i++) { @@ -479,11 +521,11 @@ ide_diagnostics_get_diagnostic_at_line (IdeDiagnostics *self, loc_line = ide_location_get_line (loc); if (loc_line == line && g_file_equal (file, loc_file)) - g_ptr_array_add (valid_diag, diag); + g_ptr_array_add (valid_diag, g_object_ref(diag)); } if (valid_diag->len != 0) - return valid_diag; + return IDE_PTR_ARRAY_STEAL_FULL (&valid_diag); return NULL; } diff --git a/src/libide/code/ide-diagnostics.h b/src/libide/code/ide-diagnostics.h index 0db06861f..1d50202e6 100644 --- a/src/libide/code/ide-diagnostics.h +++ b/src/libide/code/ide-diagnostics.h @@ -88,7 +88,11 @@ void ide_diagnostics_foreach_line_in_range (IdeDiagnostics IdeDiagnosticsLineCallback callback, gpointer user_data); IDE_AVAILABLE_IN_3_32 -GPtrArray *ide_diagnostics_get_diagnostic_at_line (IdeDiagnostics *self, +IdeDiagnostic *ide_diagnostics_get_diagnostic_at_line (IdeDiagnostics *self, + GFile *file, + guint line); +IDE_AVAILABLE_IN_3_36 +GPtrArray *ide_diagnostics_get_diagnostics_at_line (IdeDiagnostics *self, GFile *file, guint line); diff --git a/src/libide/sourceview/ide-source-view.c b/src/libide/sourceview/ide-source-view.c index dbabc7426..9d76912a8 100644 --- a/src/libide/sourceview/ide-source-view.c +++ b/src/libide/sourceview/ide-source-view.c @@ -3402,12 +3402,11 @@ ide_source_view_real_move_error (IdeSourceView *self, wrapped: while (movement (&iter)) { - GPtrArray *line_diags; + IdeDiagnostic *diag; guint line = gtk_text_iter_get_line (&iter); - if ((line_diags = ide_diagnostics_get_diagnostic_at_line (diagnostics, file, line))) + if ((diag = ide_diagnostics_get_diagnostic_at_line (diagnostics, file, line))) { - IdeDiagnostic *diag = g_ptr_array_index (line_diags, 0); IdeLocation *location; location = ide_diagnostic_get_location (diag); @@ -4530,13 +4529,16 @@ ide_source_view_real_populate_popup (GtkTextView *text_view, * If so, display the "Apply TextEdit" menu item with available fixits. */ if ((diagnostics = ide_buffer_get_diagnostics (IDE_BUFFER (buffer)))) - line_diags = ide_diagnostics_get_diagnostic_at_line (diagnostics, - ide_buffer_get_file (IDE_BUFFER (buffer)), - gtk_text_iter_get_line (&iter)); + { + line_diags = ide_diagnostics_get_diagnostics_at_line (diagnostics, + ide_buffer_get_file (IDE_BUFFER (buffer)), + gtk_text_iter_get_line (&iter)); + IDE_PTR_ARRAY_SET_FREE_FUNC (line_diags, g_object_unref); + } if (line_diags != NULL) { - for (int j = 0; j < line_diags->len; j++) + for (guint j = 0; j < line_diags->len; j++) { IdeDiagnostic *diag = g_ptr_array_index (line_diags, j); guint num_fixits; diff --git a/src/plugins/editor/gbp-editor-hover-provider.c b/src/plugins/editor/gbp-editor-hover-provider.c index e60d69440..ef3962b6a 100644 --- a/src/plugins/editor/gbp-editor-hover-provider.c +++ b/src/plugins/editor/gbp-editor-hover-provider.c @@ -64,10 +64,13 @@ gbp_editor_hover_provider_hover_async (IdeHoverProvider *provider, IdeDiagnostics *diagnostics; GPtrArray *line_diags; - if ((diagnostics = ide_buffer_get_diagnostics (IDE_BUFFER (buffer))) && - (line_diags = ide_diagnostics_get_diagnostic_at_line (diagnostics, file, line))) + diagnostics = ide_buffer_get_diagnostics (IDE_BUFFER (buffer)); + line_diags = ide_diagnostics_get_diagnostics_at_line (diagnostics, file, line); + IDE_PTR_ARRAY_SET_FREE_FUNC (line_diags, g_object_unref); + + if (diagnostics && line_diags) { - for (int i = 0; i < line_diags->len; i++) + for (guint i = 0; i < line_diags->len; i++) { IdeDiagnostic *diag = g_ptr_array_index (line_diags, i); g_autoptr(IdeMarkedContent) content = NULL; -- GitLab From b29ba43ca6357da3b1ade699d01944fb77557ae0 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Mon, 29 Jun 2020 16:50:22 -0700 Subject: [PATCH 3/5] style-schemes: add selection/debugger colors --- data/style-schemes/Adwaita.style-scheme.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/style-schemes/Adwaita.style-scheme.xml b/data/style-schemes/Adwaita.style-scheme.xml index 4a474f818..ba8c10667 100644 --- a/data/style-schemes/Adwaita.style-scheme.xml +++ b/data/style-schemes/Adwaita.style-scheme.xml @@ -62,10 +62,14 @@ + + +