[gnome-builder] libide/code: keep range tree always in-sync
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide/code: keep range tree always in-sync
- Date: Tue, 11 Oct 2022 19:52:37 +0000 (UTC)
commit 295c65ecaf804b89c6172200c91797dee0cb3a2b
Author: Christian Hergert <chergert redhat com>
Date: Tue Oct 11 14:49:15 2022 -0500
libide/code: keep range tree always in-sync
Even if we aren't using this to do updates on the highlighting, we want to
keep it in sync with invalidations.
Also improve the situation with range extraction so that we handle a
situation where we get to the end of the buffer.
Fixes #1859
src/libide/code/ide-highlight-engine.c | 40 +++++++++++++++-------------------
1 file changed, 17 insertions(+), 23 deletions(-)
---
diff --git a/src/libide/code/ide-highlight-engine.c b/src/libide/code/ide-highlight-engine.c
index 1b5666178..8a77476ca 100644
--- a/src/libide/code/ide-highlight-engine.c
+++ b/src/libide/code/ide-highlight-engine.c
@@ -277,19 +277,16 @@ get_unchecked_start_cb (gsize offset,
{
GetUncheckedRange *range = user_data;
- if (range->offset == G_MAXSIZE)
- {
- if (run->data == RUN_UNCHECKED)
- {
- range->offset = offset;
- range->length = run->length;
- }
+ g_assert (run != NULL);
+ g_assert (run->length > 0);
- return FALSE;
- }
- else if (run->data == RUN_UNCHECKED &&
- range->offset + range->length == offset)
+ if (range->offset == G_MAXSIZE && run->data == RUN_CHECKED)
+ return FALSE;
+
+ if (run->data == RUN_UNCHECKED)
{
+ if (range->offset == G_MAXSIZE)
+ range->offset = offset;
range->length += run->length;
return FALSE;
}
@@ -303,17 +300,17 @@ get_next_range (CjhTextRegion *region,
GtkTextIter *begin,
GtkTextIter *end)
{
- GetUncheckedRange range = {G_MAXSIZE, G_MAXSIZE};
+ GetUncheckedRange range = {G_MAXSIZE, 0};
_cjh_text_region_foreach (region, get_unchecked_start_cb, &range);
- if (range.offset == G_MAXSIZE)
+ if (range.length == 0 || range.offset == G_MAXSIZE)
return FALSE;
gtk_text_buffer_get_iter_at_offset (buffer, begin, range.offset);
gtk_text_buffer_get_iter_at_offset (buffer, end, range.offset + range.length);
- return TRUE;
+ return !gtk_text_iter_equal (begin, end);
}
static gboolean
@@ -407,9 +404,10 @@ ide_highlight_engine_queue_work (IdeHighlightEngine *self)
{
g_autoptr(GtkTextBuffer) buffer = NULL;
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
- if (self->work_scheduled != 0 || self->highlighter == NULL)
+ if (!self->enabled || self->work_scheduled != 0 || self->highlighter == NULL)
return;
if (!(buffer = g_weak_ref_get (&self->buffer_wref)))
@@ -609,8 +607,7 @@ ide_highlight_engine_insert_before_cb (IdeBuffer *buffer,
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
- if (self->enabled)
- _cjh_text_region_insert (self->region, offset, length, RUN_UNCHECKED);
+ _cjh_text_region_insert (self->region, offset, length, RUN_UNCHECKED);
}
static void
@@ -623,8 +620,7 @@ ide_highlight_engine_insert_after_cb (IdeBuffer *buffer,
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
- if (self->enabled)
- mark_unchecked (self, buffer, offset, length);
+ mark_unchecked (self, buffer, offset, length);
}
static void
@@ -637,8 +633,7 @@ ide_highlight_engine_delete_before_cb (IdeBuffer *buffer,
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
- if (self->enabled)
- _cjh_text_region_remove (self->region, offset, length);
+ _cjh_text_region_remove (self->region, offset, length);
}
static void
@@ -651,8 +646,7 @@ ide_highlight_engine_delete_after_cb (IdeBuffer *buffer,
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
- if (self->enabled)
- mark_unchecked (self, buffer, offset, 0);
+ mark_unchecked (self, buffer, offset, 0);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]