Blame SOURCES/0001-contextengine-clear-invalid-ranges-if-BOM-is-found.patch

1e994f
From ada3e0f4277028621d10d01fd6460b0dcc215f60 Mon Sep 17 00:00:00 2001
1e994f
From: Christian Hergert <chergert@redhat.com>
1e994f
Date: Sat, 20 Apr 2019 16:52:04 -0700
1e994f
Subject: [PATCH] contextengine: clear invalid ranges if BOM is found
1e994f
1e994f
If we came across a BOM at the beginning of a buffer, then we will have
1e994f
an invalid range before we check for BOM. In that case, we need to to
1e994f
clear it before we proceed or some assertions (such as invalid range == 1)
1e994f
will not be met.
1e994f
1e994f
Fixes #30
1e994f
---
1e994f
 gtksourceview/gtksourcecontextengine.c | 2 ++
1e994f
 1 file changed, 2 insertions(+)
1e994f
1e994f
diff --git a/gtksourceview/gtksourcecontextengine.c b/gtksourceview/gtksourcecontextengine.c
1e994f
index f74ec78e..062cca65 100644
1e994f
--- a/gtksourceview/gtksourcecontextengine.c
1e994f
+++ b/gtksourceview/gtksourcecontextengine.c
1e994f
@@ -5354,60 +5354,62 @@ update_syntax (GtkSourceContextEngine *ce,
1e994f
 	}
1e994f
 
1e994f
 	gtk_text_buffer_get_iter_at_offset (buffer, &start_iter, start_offset);
1e994f
 	gtk_text_buffer_get_iter_at_offset (buffer, &end_iter, end_offset);
1e994f
 
1e994f
 	if (!gtk_text_iter_starts_line (&start_iter))
1e994f
 	{
1e994f
 		gtk_text_iter_set_line_offset (&start_iter, 0);
1e994f
 		start_offset = gtk_text_iter_get_offset (&start_iter);
1e994f
 	}
1e994f
 
1e994f
 	if (!gtk_text_iter_starts_line (&end_iter))
1e994f
 	{
1e994f
 		gtk_text_iter_forward_line (&end_iter);
1e994f
 		end_offset = gtk_text_iter_get_offset (&end_iter);
1e994f
 	}
1e994f
 
1e994f
 	if (0 == start_offset)
1e994f
 	{
1e994f
 		gunichar c;
1e994f
 
1e994f
 		first_line = TRUE;
1e994f
 
1e994f
 		/* If it is the first line and it starts with BOM, skip it
1e994f
 		 * since regexes in lang files do not take it into account */
1e994f
 		c = gtk_text_iter_get_char (&start_iter);
1e994f
 		if (IS_BOM (c))
1e994f
 		{
1e994f
 			gtk_text_iter_forward_char (&start_iter);
1e994f
 			start_offset = gtk_text_iter_get_offset (&start_iter);
1e994f
+			segment_remove (ce, invalid);
1e994f
+			CHECK_TREE (ce);
1e994f
 		}
1e994f
 	}
1e994f
 
1e994f
 	/* This happens after deleting all text on last line. */
1e994f
 	if (start_offset == end_offset)
1e994f
 	{
1e994f
 		g_assert (end_offset == gtk_text_buffer_get_char_count (buffer));
1e994f
 		g_assert (g_slist_length (ce->priv->invalid) == 1);
1e994f
 		segment_remove (ce, invalid);
1e994f
 		CHECK_TREE (ce);
1e994f
 		goto out;
1e994f
 	}
1e994f
 
1e994f
 
1e994f
 	/* Main loop */
1e994f
 
1e994f
 	line_start = start_iter;
1e994f
 	line_start_offset = start_offset;
1e994f
 	line_end = line_start;
1e994f
 	gtk_text_iter_forward_line (&line_end);
1e994f
 	line_end_offset = gtk_text_iter_get_offset (&line_end);
1e994f
 	analyzed_end = line_end_offset;
1e994f
 
1e994f
 	timer = g_timer_new ();
1e994f
 
1e994f
 	while (TRUE)
1e994f
 	{
1e994f
 		LineInfo line;
1e994f
 		gboolean next_line_invalid = FALSE;
1e994f
 		gboolean need_invalidate_next = FALSE;
1e994f
-- 
1e994f
2.25.1
1e994f