[vala/staging] vala: Fix output of syntax errors reports



commit 77f31adac2e27e75f2f046019b6225d7acfa5881
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Thu Jan 5 09:47:09 2017 +0100

    vala: Fix output of syntax errors reports
    
    get_error() did not take printf-formatted strings, it expected fully
    populated ones for direct usage with Report.error().
    
    Output error message with report_parse_error() from try-catch-statements.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=776827

 vala/valagenieparser.vala |   47 ++++++++++++++++++-----------------
 vala/valaparser.vala      |   59 +++++++++++++++++++++++----------------------
 2 files changed, 54 insertions(+), 52 deletions(-)
---
diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala
index ce9a504..a72dead 100644
--- a/vala/valagenieparser.vala
+++ b/vala/valagenieparser.vala
@@ -148,11 +148,10 @@ public class Vala.Genie.Parser : CodeVisitor {
                return false;
        }
 
-       unowned string get_error ([FormatArg] string msg) {
+       void report_parse_error (ParseError e) {
                var begin = get_location ();
                next ();
-               Report.error (get_src (begin), "syntax error, " + msg);
-               return msg;
+               Report.error (get_src (begin), "syntax error, " + e.message);
        }
 
        inline bool expect (TokenType type) throws ParseError {
@@ -163,7 +162,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                TokenType cur = current ();
                TokenType pre =  tokens[index - 1].type;
 
-               throw new ParseError.SYNTAX (get_error ("expected %s but got %s with previous %s"), 
type.to_string (), cur.to_string (), pre.to_string());
+               throw new ParseError.SYNTAX ("expected %s but got %s with previous %s", type.to_string (), 
cur.to_string (), pre.to_string());
        }
 
        inline bool expect_terminator () throws ParseError {
@@ -173,7 +172,7 @@ public class Vala.Genie.Parser : CodeVisitor {
 
                TokenType cur = current ();
 
-               throw new ParseError.SYNTAX (get_error ("expected line end or semicolon but got %s"), 
cur.to_string());
+               throw new ParseError.SYNTAX ("expected line end or semicolon but got %s", cur.to_string());
        }
 
        inline SourceLocation get_location () {
@@ -319,7 +318,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                        }
                        break;
                default:
-                       throw new ParseError.SYNTAX (get_error ("expected identifier"));
+                       throw new ParseError.SYNTAX ("expected identifier");
                }       
        }
 
@@ -374,7 +373,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                        next ();
                        return new NullLiteral (get_src (begin));
                default:
-                       throw new ParseError.SYNTAX (get_error ("expected literal"));
+                       throw new ParseError.SYNTAX ("expected literal");
                }
        }
 
@@ -406,7 +405,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                        parse_using_directives (context.root);
                        parse_declarations (context.root, true);
                } catch (ParseError e) {
-                       // already reported
+                       report_parse_error (e);
                }
                
                scanner = null;
@@ -1056,7 +1055,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                                // array of arrays: new T[][42]
                                
                                if (size_specified) {
-                                       throw new ParseError.SYNTAX (get_error ("size of inner arrays must 
not be specified in array creation expression"));
+                                       throw new ParseError.SYNTAX ("size of inner arrays must not be 
specified in array creation expression");
                                }
                                
                                etype = new ArrayType (etype, size_specifier_list.size, 
etype.source_reference);
@@ -1792,6 +1791,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                                        block.add_statement (stmt);
                                }
                        } catch (ParseError e) {
+                               report_parse_error (e);
                                if (recover () != RecoveryState.STATEMENT_BEGIN) {
                                        // beginning of next declaration or end of file reached
                                        // return what we have so far
@@ -1870,7 +1870,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                case TokenType.DELETE:  return parse_delete_statement ();
                case TokenType.VAR:
                case TokenType.CONST:
-                       throw new ParseError.SYNTAX (get_error ("embedded statement cannot be declaration "));
+                       throw new ParseError.SYNTAX ("embedded statement cannot be declaration ");
                case TokenType.OP_INC:
                case TokenType.OP_DEC:
                case TokenType.SUPER:
@@ -1883,7 +1883,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                        if (is_expression ()) {
                                return parse_expression_statement ();
                        } else {
-                               throw new ParseError.SYNTAX (get_error ("embedded statement cannot be 
declaration"));
+                               throw new ParseError.SYNTAX ("embedded statement cannot be declaration");
                        }
                }
        }
@@ -2333,10 +2333,10 @@ public class Vala.Genie.Parser : CodeVisitor {
                                next ();
                                return "-" + get_last_string ();
                        default:
-                               throw new ParseError.SYNTAX (get_error ("expected number"));
+                               throw new ParseError.SYNTAX ("expected number");
                        }
                default:
-                       throw new ParseError.SYNTAX (get_error ("expected literal"));
+                       throw new ParseError.SYNTAX ("expected literal");
                }
        }
 
@@ -2436,7 +2436,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                TokenType cur = current ();
                TokenType pre =  tokens[index-1].type;
 
-               throw new ParseError.SYNTAX (get_error ("expected declaration  but got %s with previous %s"), 
cur.to_string (), pre.to_string());
+               throw new ParseError.SYNTAX ("expected declaration  but got %s with previous %s", 
cur.to_string (), pre.to_string());
        }
 
        void parse_declarations (Symbol parent, bool root = false) throws ParseError {
@@ -2455,6 +2455,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                                        parse_interface_member ((Interface) parent);
                                }
                        } catch (ParseError e) {
+                               report_parse_error (e);
                                int r;
                                do {
                                        r = recover ();
@@ -2978,13 +2979,13 @@ public class Vala.Genie.Parser : CodeVisitor {
                        if ((method.is_abstract && method.is_virtual)
                                || (method.is_abstract && method.overrides)
                                || (method.is_virtual && method.overrides)) {
-                               throw new ParseError.SYNTAX (get_error ("only one of `abstract', `virtual', 
or `override' may be specified"));
+                               throw new ParseError.SYNTAX ("only one of `abstract', `virtual', or 
`override' may be specified");
                        }
                } else {
                        if (ModifierFlags.ABSTRACT in flags
                                || ModifierFlags.VIRTUAL in flags
                                || ModifierFlags.OVERRIDE in flags) {
-                               throw new ParseError.SYNTAX (get_error ("the modifiers `abstract', `virtual', 
and `override' are not valid for static methods"));
+                               throw new ParseError.SYNTAX ("the modifiers `abstract', `virtual', and 
`override' are not valid for static methods");
                        }
                }
 
@@ -3114,7 +3115,7 @@ public class Vala.Genie.Parser : CodeVisitor {
 
                                if (accept (TokenType.GET)) {
                                        if (prop.get_accessor != null) {
-                                               throw new ParseError.SYNTAX (get_error ("property get 
accessor already defined"));
+                                               throw new ParseError.SYNTAX ("property get accessor already 
defined");
                                        }
                                        Block block = null;
                                        if (accept_block ()) {
@@ -3128,17 +3129,17 @@ public class Vala.Genie.Parser : CodeVisitor {
                                        bool _construct = false;
                                        if (accept (TokenType.SET)) {
                                                if (readonly) {
-                                                       throw new ParseError.SYNTAX (get_error ("set block 
not allowed for a read only property"));
+                                                       throw new ParseError.SYNTAX ("set block not allowed 
for a read only property");
                                                }
                                                _construct = accept (TokenType.CONSTRUCT);
                                        } else if (accept (TokenType.CONSTRUCT)) {
                                                _construct = true;
                                        } else if (!accept (TokenType.EOL)) {
-                                               throw new ParseError.SYNTAX (get_error ("expected get, set, 
or construct"));
+                                               throw new ParseError.SYNTAX ("expected get, set, or 
construct");
                                        }
 
                                        if (prop.set_accessor != null) {
-                                               throw new ParseError.SYNTAX (get_error ("property set 
accessor already defined"));
+                                               throw new ParseError.SYNTAX ("property set accessor already 
defined");
                                        }
 
                                        Block block = null;
@@ -3232,9 +3233,9 @@ public class Vala.Genie.Parser : CodeVisitor {
                }
                
                if (ModifierFlags.STATIC in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`static' modifier not allowed on signals"));
+                       throw new ParseError.SYNTAX ("`static' modifier not allowed on signals");
                } else if (ModifierFlags.CLASS in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`class' modifier not allowed on signals"));
+                       throw new ParseError.SYNTAX ("`class' modifier not allowed on signals");
                }
 
                set_attributes (sig, attrs);
@@ -3711,7 +3712,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                var type_param_list = parse_type_parameter_list ();
                
                if (ModifierFlags.NEW in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`new' modifier not allowed on delegates"));
+                       throw new ParseError.SYNTAX ("`new' modifier not allowed on delegates");
                }
 
                var params = new ArrayList<Parameter> ();
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index 6f41fc9..3c47dbe 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -114,11 +114,10 @@ public class Vala.Parser : CodeVisitor {
                return false;
        }
 
-       unowned string get_error ([FormatArg] string msg) {
+       void report_parse_error (ParseError e) {
                var begin = get_location ();
                next ();
-               Report.error (get_src (begin), "syntax error, " + msg);
-               return msg;
+               Report.error (get_src (begin), "syntax error, " + e.message);
        }
 
        inline bool expect (TokenType type) throws ParseError {
@@ -126,7 +125,7 @@ public class Vala.Parser : CodeVisitor {
                        return true;
                }
 
-               throw new ParseError.SYNTAX (get_error ("expected %s"), type.to_string ());
+               throw new ParseError.SYNTAX ("expected %s", type.to_string ());
        }
 
        inline SourceLocation get_location () {
@@ -262,7 +261,7 @@ public class Vala.Parser : CodeVisitor {
                        }
                        break;
                default:
-                       throw new ParseError.SYNTAX (get_error ("expected identifier"));
+                       throw new ParseError.SYNTAX ("expected identifier");
                }
        }
 
@@ -317,7 +316,7 @@ public class Vala.Parser : CodeVisitor {
                        next ();
                        return new NullLiteral (get_src (begin));
                default:
-                       throw new ParseError.SYNTAX (get_error ("expected literal"));
+                       throw new ParseError.SYNTAX ("expected literal");
                }
        }
 
@@ -341,7 +340,7 @@ public class Vala.Parser : CodeVisitor {
                                }
                        }
                } catch (ParseError e) {
-                       // already reported
+                       report_parse_error (e);
                }
                
                scanner = null;
@@ -867,7 +866,7 @@ public class Vala.Parser : CodeVisitor {
                                var expr = parse_array_creation_expression ();
                                return expr;
                        } else {
-                               throw new ParseError.SYNTAX (get_error ("expected ( or ["));
+                               throw new ParseError.SYNTAX ("expected ( or [");
                        }
                }
        }
@@ -928,7 +927,7 @@ public class Vala.Parser : CodeVisitor {
                                // array of arrays: new T[][42]
 
                                if (size_specified) {
-                                       throw new ParseError.SYNTAX (get_error ("size of inner arrays must 
not be specified in array creation expression"));
+                                       throw new ParseError.SYNTAX ("size of inner arrays must not be 
specified in array creation expression");
                                }
 
                                element_type = new ArrayType (element_type, size_specifier_list.size, 
element_type.source_reference);
@@ -1599,6 +1598,7 @@ public class Vala.Parser : CodeVisitor {
                                        block.add_statement (stmt);
                                }
                        } catch (ParseError e) {
+                               report_parse_error (e);
                                if (recover () != RecoveryState.STATEMENT_BEGIN) {
                                        // beginning of next declaration or end of file reached
                                        // return what we have so far
@@ -1731,7 +1731,7 @@ public class Vala.Parser : CodeVisitor {
                case TokenType.DELETE:    return parse_delete_statement ();
                case TokenType.VAR:
                case TokenType.CONST:
-                       throw new ParseError.SYNTAX (get_error ("embedded statement cannot be declaration "));
+                       throw new ParseError.SYNTAX ("embedded statement cannot be declaration ");
                case TokenType.OP_INC:
                case TokenType.OP_DEC:
                case TokenType.BASE:
@@ -1744,7 +1744,7 @@ public class Vala.Parser : CodeVisitor {
                        if (is_expression ()) {
                                return parse_expression_statement ();
                        } else {
-                               throw new ParseError.SYNTAX (get_error ("embedded statement cannot be 
declaration"));
+                               throw new ParseError.SYNTAX ("embedded statement cannot be declaration");
                        }
                }
        }
@@ -2148,10 +2148,10 @@ public class Vala.Parser : CodeVisitor {
                                next ();
                                return "-" + get_last_string ();
                        default:
-                               throw new ParseError.SYNTAX (get_error ("expected number"));
+                               throw new ParseError.SYNTAX ("expected number");
                        }
                default:
-                       throw new ParseError.SYNTAX (get_error ("expected literal"));
+                       throw new ParseError.SYNTAX ("expected literal");
                }
        }
 
@@ -2260,10 +2260,10 @@ public class Vala.Parser : CodeVisitor {
                        // statement
                        if (attrs != null) {
                                // no attributes allowed before statements
-                               throw new ParseError.SYNTAX (get_error ("expected statement"));
+                               throw new ParseError.SYNTAX ("expected statement");
                        }
                        if (!root) {
-                               throw new ParseError.SYNTAX (get_error ("statements outside blocks allowed 
only in root namespace"));
+                               throw new ParseError.SYNTAX ("statements outside blocks allowed only in root 
namespace");
                        }
                        rollback (begin);
                        parse_main_block (parent);
@@ -2353,7 +2353,7 @@ public class Vala.Parser : CodeVisitor {
 
                rollback (begin);
 
-               throw new ParseError.SYNTAX (get_error ("expected declaration"));
+               throw new ParseError.SYNTAX ("expected declaration");
        }
 
        void parse_declarations (Symbol parent, bool root = false) throws ParseError {
@@ -2364,6 +2364,7 @@ public class Vala.Parser : CodeVisitor {
                        try {
                                parse_declaration (parent, (parent == context.root));
                        } catch (ParseError e) {
+                               report_parse_error (e);
                                int r;
                                do {
                                        r = recover ();
@@ -2692,13 +2693,13 @@ public class Vala.Parser : CodeVisitor {
                        if ((method.is_abstract && method.is_virtual)
                            || (method.is_abstract && method.overrides)
                            || (method.is_virtual && method.overrides)) {
-                               throw new ParseError.SYNTAX (get_error ("only one of `abstract', `virtual', 
or `override' may be specified"));
+                               throw new ParseError.SYNTAX ("only one of `abstract', `virtual', or 
`override' may be specified");
                        }
                } else {
                        if (ModifierFlags.ABSTRACT in flags
                            || ModifierFlags.VIRTUAL in flags
                            || ModifierFlags.OVERRIDE in flags) {
-                               throw new ParseError.SYNTAX (get_error ("the modifiers `abstract', `virtual', 
and `override' are not valid for %s methods"), (ModifierFlags.CLASS in flags) ? "class" : "static");
+                               throw new ParseError.SYNTAX ("the modifiers `abstract', `virtual', and 
`override' are not valid for %s methods", (ModifierFlags.CLASS in flags) ? "class" : "static");
                        }
                }
 
@@ -2786,7 +2787,7 @@ public class Vala.Parser : CodeVisitor {
                if ((prop.is_abstract && prop.is_virtual)
                        || (prop.is_abstract && prop.overrides)
                        || (prop.is_virtual && prop.overrides)) {
-                       throw new ParseError.SYNTAX (get_error ("only one of `abstract', `virtual', or 
`override' may be specified"));
+                       throw new ParseError.SYNTAX ("only one of `abstract', `virtual', or `override' may be 
specified");
                }
 
                if (accept (TokenType.THROWS)) {
@@ -2799,7 +2800,7 @@ public class Vala.Parser : CodeVisitor {
                while (current () != TokenType.CLOSE_BRACE) {
                        if (accept (TokenType.DEFAULT)) {
                                if (prop.initializer != null) {
-                                       throw new ParseError.SYNTAX (get_error ("property default value 
already defined"));
+                                       throw new ParseError.SYNTAX ("property default value already 
defined");
                                }
                                expect (TokenType.ASSIGN);
                                prop.initializer = parse_expression ();
@@ -2816,7 +2817,7 @@ public class Vala.Parser : CodeVisitor {
 
                                if (accept (TokenType.GET)) {
                                        if (prop.get_accessor != null) {
-                                               throw new ParseError.SYNTAX (get_error ("property get 
accessor already defined"));
+                                               throw new ParseError.SYNTAX ("property get accessor already 
defined");
                                        }
 
                                        if (getter_owned) {
@@ -2840,10 +2841,10 @@ public class Vala.Parser : CodeVisitor {
                                                _construct = true;
                                                writable = accept (TokenType.SET);
                                        } else {
-                                               throw new ParseError.SYNTAX (get_error ("expected get, set, 
or construct"));
+                                               throw new ParseError.SYNTAX ("expected get, set, or 
construct");
                                        }
                                        if (prop.set_accessor != null) {
-                                               throw new ParseError.SYNTAX (get_error ("property set 
accessor already defined"));
+                                               throw new ParseError.SYNTAX ("property set accessor already 
defined");
                                        }
                                        Block block = null;
                                        if (!accept (TokenType.SEMICOLON)) {
@@ -2894,9 +2895,9 @@ public class Vala.Parser : CodeVisitor {
                sig.access = access;
                set_attributes (sig, attrs);
                if (ModifierFlags.STATIC in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`static' modifier not allowed on signals"));
+                       throw new ParseError.SYNTAX ("`static' modifier not allowed on signals");
                } else if (ModifierFlags.CLASS in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`class' modifier not allowed on signals"));
+                       throw new ParseError.SYNTAX ("`class' modifier not allowed on signals");
                }
                if (ModifierFlags.VIRTUAL in flags) {
                        sig.is_virtual = true;
@@ -2924,7 +2925,7 @@ public class Vala.Parser : CodeVisitor {
                var flags = parse_member_declaration_modifiers ();
                expect (TokenType.CONSTRUCT);
                if (ModifierFlags.NEW in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`new' modifier not allowed on constructor"));
+                       throw new ParseError.SYNTAX ("`new' modifier not allowed on constructor");
                }
                var c = new Constructor (get_src (begin));
                if (ModifierFlags.STATIC in flags && ModifierFlags.CLASS in flags) {
@@ -2947,7 +2948,7 @@ public class Vala.Parser : CodeVisitor {
                expect (TokenType.OPEN_PARENS);
                expect (TokenType.CLOSE_PARENS);
                if (ModifierFlags.NEW in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`new' modifier not allowed on destructor"));
+                       throw new ParseError.SYNTAX ("`new' modifier not allowed on destructor");
                }
                var d = new Destructor (get_src (begin));
                if (identifier != parent.name) {
@@ -3295,7 +3296,7 @@ public class Vala.Parser : CodeVisitor {
                var flags = parse_member_declaration_modifiers ();
                var sym = parse_symbol_name ();
                if (ModifierFlags.NEW in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`new' modifier not allowed on creation 
method"));
+                       throw new ParseError.SYNTAX ("`new' modifier not allowed on creation method");
                }
                CreationMethod method;
                if (sym.inner == null) {
@@ -3354,7 +3355,7 @@ public class Vala.Parser : CodeVisitor {
                var flags = parse_member_declaration_modifiers ();
                expect (TokenType.DELEGATE);
                if (ModifierFlags.NEW in flags) {
-                       throw new ParseError.SYNTAX (get_error ("`new' modifier not allowed on delegates"));
+                       throw new ParseError.SYNTAX ("`new' modifier not allowed on delegates");
                }
                var type = parse_type (true, false);
                var sym = parse_symbol_name ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]