diff --git a/gsk/gskslcompiler.c b/gsk/gskslcompiler.c index 1e9cfead17..b473cecf1d 100644 --- a/gsk/gskslcompiler.c +++ b/gsk/gskslcompiler.c @@ -196,7 +196,9 @@ gsk_sl_compiler_compile (GskSlCompiler *compiler, preproc = gsk_sl_preprocessor_new (compiler, source); - if (!gsk_sl_program_parse (program, preproc)) + gsk_sl_program_parse (program, preproc); + + if (gsk_sl_preprocessor_has_fatal_error (preproc)) { g_object_unref (program); program = NULL; diff --git a/gsk/gskslpreprocessor.c b/gsk/gskslpreprocessor.c index 98c2fd5fce..ca39e79d43 100644 --- a/gsk/gskslpreprocessor.c +++ b/gsk/gskslpreprocessor.c @@ -39,6 +39,7 @@ struct _GskSlPreprocessor GskSlTokenizer *tokenizer; GArray *tokens; GHashTable *defines; + gboolean fatal_error; }; /* API */ @@ -111,6 +112,12 @@ gsk_sl_preprocessor_unref (GskSlPreprocessor *preproc) g_slice_free (GskSlPreprocessor, preproc); } +gboolean +gsk_sl_preprocessor_has_fatal_error (GskSlPreprocessor *preproc) +{ + return preproc->fatal_error; +} + static gboolean gsk_sl_preprocessor_next_token (GskSlPreprocessor *preproc, GskSlPpToken *pp, @@ -375,6 +382,8 @@ gsk_sl_preprocessor_emit_error (GskSlPreprocessor *preproc, const GskCodeLocation *location, const GError *error) { + preproc->fatal_error |= fatal; + g_printerr ("%3zu:%2zu: %s: %s\n", location->lines + 1, location->line_bytes, fatal ? "error" : "warn", diff --git a/gsk/gskslpreprocessorprivate.h b/gsk/gskslpreprocessorprivate.h index 8fcb429c3d..b6544cca73 100644 --- a/gsk/gskslpreprocessorprivate.h +++ b/gsk/gskslpreprocessorprivate.h @@ -31,6 +31,7 @@ GskSlPreprocessor * gsk_sl_preprocessor_new (GskSlCompiler GskSlPreprocessor * gsk_sl_preprocessor_ref (GskSlPreprocessor *preproc); void gsk_sl_preprocessor_unref (GskSlPreprocessor *preproc); +gboolean gsk_sl_preprocessor_has_fatal_error (GskSlPreprocessor *preproc); const GskSlToken * gsk_sl_preprocessor_get (GskSlPreprocessor *preproc); const GskCodeLocation * gsk_sl_preprocessor_get_location (GskSlPreprocessor *preproc); void gsk_sl_preprocessor_consume (GskSlPreprocessor *preproc, diff --git a/gsk/gskslprogram.c b/gsk/gskslprogram.c index 8f9c3edb60..d1dea506cb 100644 --- a/gsk/gskslprogram.c +++ b/gsk/gskslprogram.c @@ -136,7 +136,7 @@ gsk_sl_program_parse_variable (GskSlProgram *program, return TRUE; } -static gboolean +static void gsk_sl_program_parse_declaration (GskSlProgram *program, GskSlScope *scope, GskSlPreprocessor *preproc) @@ -155,7 +155,7 @@ gsk_sl_program_parse_declaration (GskSlProgram *program, if (type == NULL) { gsk_sl_preprocessor_consume (preproc, program); - return FALSE; + return; } token = gsk_sl_preprocessor_get (preproc); @@ -170,13 +170,13 @@ gsk_sl_program_parse_declaration (GskSlProgram *program, gsk_sl_preprocessor_consume (preproc, program); } gsk_sl_type_unref (type); - return success; + return; } else if (!gsk_sl_token_is (token, GSK_SL_TOKEN_IDENTIFIER)) { gsk_sl_preprocessor_error (preproc, SYNTAX, "Expected a variable name"); gsk_sl_type_unref (type); - return FALSE; + return; } name = g_strdup (token->str); @@ -204,24 +204,21 @@ gsk_sl_program_parse_declaration (GskSlProgram *program, g_free (name); - return success; + return; } -gboolean +void gsk_sl_program_parse (GskSlProgram *program, GskSlPreprocessor *preproc) { const GskSlToken *token; - gboolean success = TRUE; for (token = gsk_sl_preprocessor_get (preproc); !gsk_sl_token_is (token, GSK_SL_TOKEN_EOF); token = gsk_sl_preprocessor_get (preproc)) { - success &= gsk_sl_program_parse_declaration (program, program->scope, preproc); + gsk_sl_program_parse_declaration (program, program->scope, preproc); } - - return success; } void diff --git a/gsk/gskslprogramprivate.h b/gsk/gskslprogramprivate.h index 9b24b8eda5..4d9ec97c7b 100644 --- a/gsk/gskslprogramprivate.h +++ b/gsk/gskslprogramprivate.h @@ -24,7 +24,7 @@ G_BEGIN_DECLS -gboolean gsk_sl_program_parse (GskSlProgram *program, +void gsk_sl_program_parse (GskSlProgram *program, GskSlPreprocessor *preproc); G_END_DECLS