summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2019-04-10 18:01:56 +0200
committerBenjamin Otte <otte@redhat.com>2019-04-12 19:34:28 +0200
commit37671d2bd0802dca8822b096c90064911eee9f58 (patch)
tree1076352bf1da7f643683e9847c0af20406bf3755 /gtk
parent04d24b7cd2df5ded8a82afe70edb9c4bcae3eef4 (diff)
downloadgtk+-37671d2bd0802dca8822b096c90064911eee9f58.tar.gz
cssprovider: Redo error emission
Emit all errors via the parser, don't try to have a custom error handling machinery. The only exception is the initial file load error - we need to do that one directly, because there is no parser.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/css/gtkcssparser.c29
-rw-r--r--gtk/css/gtkcssparserprivate.h3
-rw-r--r--gtk/gtkcssprovider.c167
3 files changed, 53 insertions, 146 deletions
diff --git a/gtk/css/gtkcssparser.c b/gtk/css/gtkcssparser.c
index 1ddad5712f..1a4a7567a7 100644
--- a/gtk/css/gtkcssparser.c
+++ b/gtk/css/gtkcssparser.c
@@ -539,6 +539,26 @@ gtk_css_parser_error_value (GtkCssParser *self,
}
void
+gtk_css_parser_error_import (GtkCssParser *self,
+ const char *format,
+ ...)
+{
+ va_list args;
+ GError *error;
+
+ va_start (args, format);
+ error = g_error_new_valist (GTK_CSS_PARSER_ERROR,
+ GTK_CSS_PARSER_ERROR_IMPORT,
+ format, args);
+ gtk_css_parser_emit_error (self,
+ &self->location,
+ gtk_css_tokenizer_get_location (self->tokenizer),
+ error);
+ g_error_free (error);
+ va_end (args);
+}
+
+void
gtk_css_parser_warn_syntax (GtkCssParser *self,
const char *format,
...)
@@ -923,15 +943,8 @@ gtk_css_parser_consume_url (GtkCssParser *self)
result = gtk_css_parser_resolve_url (self, url);
if (result == NULL)
{
- GError *error = g_error_new (GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_IMPORT,
- "Could not resolve \"%s\" to a valid URL", url);
- gtk_css_parser_emit_error (self,
- &self->location,
- gtk_css_tokenizer_get_location (self->tokenizer),
- error);
+ gtk_css_parser_error_import (self, "Could not resolve \"%s\" to a valid URL", url);
g_free (url);
- g_error_free (error);
return NULL;
}
g_free (url);
diff --git a/gtk/css/gtkcssparserprivate.h b/gtk/css/gtkcssparserprivate.h
index fa6b5757fb..2942bb86f1 100644
--- a/gtk/css/gtkcssparserprivate.h
+++ b/gtk/css/gtkcssparserprivate.h
@@ -93,6 +93,9 @@ void gtk_css_parser_error_syntax (GtkCssParser
void gtk_css_parser_error_value (GtkCssParser *self,
const char *format,
...) G_GNUC_PRINTF(2, 3);
+void gtk_css_parser_error_import (GtkCssParser *self,
+ const char *format,
+ ...) G_GNUC_PRINTF(2, 3);
void gtk_css_parser_warn_syntax (GtkCssParser *self,
const char *format,
...) G_GNUC_PRINTF(2, 3);
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index 8f1bb22f3d..59ce98701e 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -323,16 +323,6 @@ gtk_css_style_provider_emit_error (GtkStyleProvider *provider,
}
static void
-gtk_css_provider_emit_error (GtkCssProvider *provider,
- GtkCssScanner *scanner,
- const GError *error)
-{
- gtk_css_style_provider_emit_error (GTK_STYLE_PROVIDER (provider),
- NULL /* FIXME */,
- error);
-}
-
-static void
gtk_css_scanner_parser_error (GtkCssParser *parser,
const GtkCssLocation *start,
const GtkCssLocation *end,
@@ -631,67 +621,6 @@ gtk_css_provider_new (void)
}
static void
-gtk_css_provider_take_error (GtkCssProvider *provider,
- GtkCssScanner *scanner,
- GError *error)
-{
- gtk_css_provider_emit_error (provider, scanner, error);
- g_error_free (error);
-}
-
-static void
-gtk_css_provider_error_literal (GtkCssProvider *provider,
- GtkCssScanner *scanner,
- GQuark domain,
- gint code,
- const char *message)
-{
- gtk_css_provider_take_error (provider,
- scanner,
- g_error_new_literal (domain, code, message));
-}
-
-static void
-gtk_css_provider_error (GtkCssProvider *provider,
- GtkCssScanner *scanner,
- GQuark domain,
- gint code,
- const char *format,
- ...) G_GNUC_PRINTF (5, 6);
-static void
-gtk_css_provider_error (GtkCssProvider *provider,
- GtkCssScanner *scanner,
- GQuark domain,
- gint code,
- const char *format,
- ...)
-{
- GError *error;
- va_list args;
-
- gtk_internal_return_if_fail (GTK_IS_CSS_PROVIDER (provider));
- gtk_internal_return_if_fail (scanner != NULL);
-
- va_start (args, format);
- error = g_error_new_valist (domain, code, format, args);
- va_end (args);
-
- gtk_css_provider_take_error (provider, scanner, error);
-}
-
-static void
-gtk_css_provider_invalid_token (GtkCssProvider *provider,
- GtkCssScanner *scanner,
- const char *expected)
-{
- gtk_css_provider_error (provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_SYNTAX,
- "expected %s", expected);
-}
-
-static void
css_provider_commit (GtkCssProvider *css_provider,
GSList *selectors,
GtkCssRuleset *ruleset)
@@ -758,12 +687,9 @@ parse_import (GtkCssScanner *scanner)
file = gtk_css_parser_resolve_url (scanner->parser, url);
if (file == NULL)
{
- gtk_css_provider_error (scanner->provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_IMPORT,
- "Could not resolve \"%s\" to a valid URL",
- url);
+ gtk_css_parser_error_import (scanner->parser,
+ "Could not resolve \"%s\" to a valid URL",
+ url);
}
g_free (url);
}
@@ -781,17 +707,14 @@ parse_import (GtkCssScanner *scanner)
}
else if (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
{
- gtk_css_provider_invalid_token (scanner->provider, scanner, "semicolon");
+ gtk_css_parser_error_syntax (scanner->parser, "Expected ';'");
}
else if (gtk_css_scanner_would_recurse (scanner, file))
{
char *path = g_file_get_path (file);
- gtk_css_provider_error (scanner->provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_IMPORT,
- "Loading '%s' would recurse",
- path);
+ gtk_css_parser_error_import (scanner->parser,
+ "Loading '%s' would recurse",
+ path);
g_free (path);
}
else
@@ -832,11 +755,8 @@ parse_color_definition (GtkCssScanner *scanner)
{
g_free (name);
_gtk_css_value_unref (color);
- gtk_css_provider_error_literal (scanner->provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_SYNTAX,
- "Missing semicolon at end of color definition");
+ gtk_css_parser_error_syntax (scanner->parser,
+ "Missing semicolon at end of color definition");
return TRUE;
}
@@ -861,11 +781,7 @@ parse_keyframes (GtkCssScanner *scanner)
if (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
{
- gtk_css_provider_error_literal (scanner->provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_SYNTAX,
- "Expected '{' for keyframes");
+ gtk_css_parser_error_syntax (scanner->parser, "Expected '{' for keyframes");
return FALSE;
}
@@ -876,13 +792,7 @@ parse_keyframes (GtkCssScanner *scanner)
g_hash_table_insert (priv->keyframes, name, keyframes);
if (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
- {
- gtk_css_provider_error_literal (scanner->provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_SYNTAX,
- "expected '}' after declarations");
- }
+ gtk_css_parser_error_syntax (scanner->parser, "Expected '}' after declarations");
return TRUE;
}
@@ -896,11 +806,7 @@ parse_at_keyword (GtkCssScanner *scanner)
!parse_color_definition (scanner) &&
!parse_keyframes (scanner))
{
- gtk_css_provider_error_literal (scanner->provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_SYNTAX,
- "unknown @ rule");
+ gtk_css_parser_error_syntax (scanner->parser, "Unknown @ rule");
}
gtk_css_parser_end_block (scanner->parser);
@@ -975,11 +881,7 @@ parse_declaration (GtkCssScanner *scanner,
if (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_EOF))
{
- gtk_css_provider_error (scanner->provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_SYNTAX,
- "Junk at end of value for %s", property->name);
+ gtk_css_parser_error_syntax (scanner->parser, "Junk at end of value for %s", property->name);
gtk_css_parser_end_block (scanner->parser);
return;
}
@@ -1057,11 +959,7 @@ parse_ruleset (GtkCssScanner *scanner)
if (!gtk_css_parser_has_token (scanner->parser, GTK_CSS_TOKEN_OPEN_CURLY))
{
- gtk_css_provider_error_literal (scanner->provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_SYNTAX,
- "expected '{' after selectors");
+ gtk_css_parser_error_syntax (scanner->parser, "Expected '{' after selectors");
g_slist_free_full (selectors, (GDestroyNotify) _gtk_css_selector_free);
gtk_css_parser_skip_until (scanner->parser, GTK_CSS_TOKEN_OPEN_CURLY);
gtk_css_parser_skip (scanner->parser);
@@ -1157,13 +1055,11 @@ gtk_css_provider_postprocess (GtkCssProvider *css_provider)
}
static void
-gtk_css_provider_load_internal (GtkCssProvider *css_provider,
+gtk_css_provider_load_internal (GtkCssProvider *self,
GtkCssScanner *parent,
GFile *file,
GBytes *bytes)
{
- GtkCssScanner *scanner;
-
if (bytes == NULL)
{
GError *load_error = NULL;
@@ -1174,31 +1070,26 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
{
if (parent == NULL)
{
- GBytes *tmp_bytes = g_bytes_new_static ("", 0);
- scanner = gtk_css_scanner_new (css_provider,
- NULL,
- file,
- tmp_bytes);
- g_bytes_unref (tmp_bytes);
+ GtkCssLocation empty = { 0, };
+ GtkCssSection *section = gtk_css_section_new (file, &empty, &empty);
+
+ gtk_css_style_provider_emit_error (GTK_STYLE_PROVIDER (self), section, load_error);
+ gtk_css_section_unref (section);
}
else
- scanner = parent;
-
- gtk_css_provider_error (css_provider,
- scanner,
- GTK_CSS_PARSER_ERROR,
- GTK_CSS_PARSER_ERROR_IMPORT,
- "Failed to import: %s",
- load_error->message);
-
- if (parent == NULL)
- gtk_css_scanner_destroy (scanner);
+ {
+ gtk_css_parser_error_import (parent->parser,
+ "Failed to import: %s",
+ load_error->message);
+ }
}
}
if (bytes)
{
- scanner = gtk_css_scanner_new (css_provider,
+ GtkCssScanner *scanner;
+
+ scanner = gtk_css_scanner_new (self,
parent,
file,
bytes);
@@ -1208,7 +1099,7 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider,
gtk_css_scanner_destroy (scanner);
if (parent == NULL)
- gtk_css_provider_postprocess (css_provider);
+ gtk_css_provider_postprocess (self);
}
}