summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2009-02-20 15:04:57 +0000
committerJürg Billeter <juergbi@src.gnome.org>2009-02-20 15:04:57 +0000
commitc4820129afadf99b643e41bbf8a27ecb782c704c (patch)
tree360952991d5497de63eef322a6f7b8458e18b611
parent55ddcd8abd49dc404cd3ff424493d1c67798364d (diff)
downloadvala-c4820129afadf99b643e41bbf8a27ecb782c704c.tar.gz
Support context-specific error reporting and add a context stack, based on
2009-02-20 Jürg Billeter <j@bitron.ch> * vala/valacodecontext.vala: * vala/valareport.vala: Support context-specific error reporting and add a context stack, based on patch by Abderrahim Kitouni, fixes bug 542920 * vala/valagenieparser.vala: * vala/valaparser.vala: * gobject/valaccodebasemodule.vala: * compiler/valacompiler.vala: * vapigen/valavapigen.vala: Adapt to interface changes svn path=/trunk/; revision=2461
-rw-r--r--ChangeLog16
-rw-r--r--compiler/valacompiler.vala27
-rw-r--r--gobject/valaccodebasemodule.vala2
-rw-r--r--vala/valacodecontext.vala28
-rw-r--r--vala/valagenieparser.vala4
-rw-r--r--vala/valaparser.vala4
-rw-r--r--vala/valareport.vala24
-rw-r--r--vapigen/valavapigen.vala21
8 files changed, 90 insertions, 36 deletions
diff --git a/ChangeLog b/ChangeLog
index ca5e2c0da..f67903491 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
2009-02-20 Jürg Billeter <j@bitron.ch>
+ * vala/valacodecontext.vala:
+ * vala/valareport.vala:
+
+ Support context-specific error reporting and add a context stack,
+ based on patch by Abderrahim Kitouni, fixes bug 542920
+
+ * vala/valagenieparser.vala:
+ * vala/valaparser.vala:
+ * gobject/valaccodebasemodule.vala:
+ * compiler/valacompiler.vala:
+ * vapigen/valavapigen.vala:
+
+ Adapt to interface changes
+
+2009-02-20 Jürg Billeter <j@bitron.ch>
+
* vapi/Makefile.am:
* vapi/libdaemon.vapi:
diff --git a/compiler/valacompiler.vala b/compiler/valacompiler.vala
index 2ac8f73ca..200cc4001 100644
--- a/compiler/valacompiler.vala
+++ b/compiler/valacompiler.vala
@@ -91,17 +91,17 @@ class Vala.Compiler {
};
private int quit () {
- if (Report.get_errors () == 0 && Report.get_warnings () == 0) {
+ if (context.report.get_errors () == 0 && context.report.get_warnings () == 0) {
return 0;
}
- if (Report.get_errors () == 0) {
+ if (context.report.get_errors () == 0) {
if (!quiet_mode) {
- stdout.printf ("Compilation succeeded - %d warning(s)\n", Report.get_warnings ());
+ stdout.printf ("Compilation succeeded - %d warning(s)\n", context.report.get_warnings ());
}
return 0;
} else {
if (!quiet_mode) {
- stdout.printf ("Compilation failed: %d error(s), %d warning(s)\n", Report.get_errors (), Report.get_warnings ());
+ stdout.printf ("Compilation failed: %d error(s), %d warning(s)\n", context.report.get_errors (), context.report.get_warnings ());
}
return 1;
}
@@ -146,6 +146,7 @@ class Vala.Compiler {
private int run () {
context = new CodeContext ();
+ CodeContext.push (context);
// default to build executable
if (!ccode_only && !compile_only && output == null) {
@@ -164,7 +165,7 @@ class Vala.Compiler {
context.experimental = experimental;
context.non_null_experimental = non_null_experimental;
context.dbus_transformation = !disable_dbus_transformation;
- Report.set_verbose_errors (!quiet_mode);
+ context.report.set_verbose_errors (!quiet_mode);
context.ccode_only = ccode_only;
context.compile_only = compile_only;
@@ -213,7 +214,7 @@ class Vala.Compiler {
packages = null;
}
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
@@ -240,7 +241,7 @@ class Vala.Compiler {
}
sources = null;
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
@@ -250,14 +251,14 @@ class Vala.Compiler {
var genie_parser = new Genie.Parser ();
genie_parser.parse (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
var resolver = new SymbolResolver ();
resolver.resolve (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
@@ -269,14 +270,14 @@ class Vala.Compiler {
code_writer.write_file (context, dump_tree);
}
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
var flow_analyzer = new FlowAnalyzer ();
flow_analyzer.analyze (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
@@ -284,14 +285,14 @@ class Vala.Compiler {
var null_checker = new NullChecker ();
null_checker.check (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
}
context.codegen.emit (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
diff --git a/gobject/valaccodebasemodule.vala b/gobject/valaccodebasemodule.vala
index bbb3d669b..d4413971f 100644
--- a/gobject/valaccodebasemodule.vala
+++ b/gobject/valaccodebasemodule.vala
@@ -374,7 +374,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
source_file.accept_children (codegen);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return;
}
diff --git a/vala/valacodecontext.vala b/vala/valacodecontext.vala
index 0dcc2168a..c74097d4b 100644
--- a/vala/valacodecontext.vala
+++ b/vala/valacodecontext.vala
@@ -158,6 +158,8 @@ public class Vala.CodeContext {
get { return save_csources || null != library; }
}
+ public Report report { get; set; default = new Report ();}
+
private Gee.List<SourceFile> source_files = new ArrayList<SourceFile> ();
private Gee.List<string> c_source_files = new ArrayList<string> ();
private Namespace _root = new Namespace (null);
@@ -166,6 +168,8 @@ public class Vala.CodeContext {
private Gee.List<string> packages = new ArrayList<string> (str_equal);
+ static Gee.List<CodeContext> context_stack;
+
/**
* The root namespace of the symbol tree.
*
@@ -184,6 +188,30 @@ public class Vala.CodeContext {
}
/**
+ * Return the topmost context from the context stack.
+ */
+ public static CodeContext get () {
+ return context_stack[context_stack.size - 1];
+ }
+
+ /**
+ * Push the specified context to the context stack.
+ */
+ public static void push (CodeContext context) {
+ if (context_stack == null) {
+ context_stack = new ArrayList<CodeContext> ();
+ }
+ context_stack.add (context);
+ }
+
+ /**
+ * Remove the topmost context from the context stack.
+ */
+ public static void pop () {
+ context_stack.remove_at (context_stack.size - 1);
+ }
+
+ /**
* Returns a copy of the list of source files.
*
* @return list of source files
diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala
index 3734a692c..b90acb92b 100644
--- a/vala/valagenieparser.vala
+++ b/vala/valagenieparser.vala
@@ -1660,7 +1660,7 @@ public class Vala.Genie.Parser : CodeVisitor {
parse_statements (block);
if (!accept (TokenType.DEDENT)) {
// only report error if it's not a secondary error
- if (Report.get_errors () == 0) {
+ if (context.report.get_errors () == 0) {
Report.error (get_current_src (), "tab indentation is incorrect");
}
}
@@ -2199,7 +2199,7 @@ public class Vala.Genie.Parser : CodeVisitor {
if (!root) {
if (!accept (TokenType.DEDENT)) {
// only report error if it's not a secondary error
- if (Report.get_errors () == 0) {
+ if (context.report.get_errors () == 0) {
Report.error (get_current_src (), "expected dedent");
}
}
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index e7cf088a0..ee9e696ef 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -1378,7 +1378,7 @@ public class Vala.Parser : CodeVisitor {
parse_statements (block);
if (!accept (TokenType.CLOSE_BRACE)) {
// only report error if it's not a secondary error
- if (Report.get_errors () == 0) {
+ if (context.report.get_errors () == 0) {
Report.error (get_current_src (), "expected `}'");
}
}
@@ -1830,7 +1830,7 @@ public class Vala.Parser : CodeVisitor {
if (!root) {
if (!accept (TokenType.CLOSE_BRACE)) {
// only report error if it's not a secondary error
- if (Report.get_errors () == 0) {
+ if (context.report.get_errors () == 0) {
Report.error (get_current_src (), "expected `}'");
}
}
diff --git a/vala/valareport.vala b/vala/valareport.vala
index c77c8975d..0e839a3c9 100644
--- a/vala/valareport.vala
+++ b/vala/valareport.vala
@@ -25,12 +25,12 @@ using GLib;
/**
* Namespace to centralize reporting warnings and errors.
*/
-namespace Vala.Report {
- public int warnings;
- public int errors;
+public class Vala.Report : Object {
+ int warnings;
+ int errors;
+
+ bool verbose_errors;
- public bool verbose_errors;
-
/**
* Set the error verbosity.
*/
@@ -55,7 +55,7 @@ namespace Vala.Report {
/**
* Pretty-print the actual line of offending code if possible.
*/
- public void report_source (SourceReference source) {
+ static void report_source (SourceReference source) {
if (source.first_line != source.last_line) {
// FIXME Cannot report multi-line issues currently
return;
@@ -96,7 +96,7 @@ namespace Vala.Report {
* @param source reference to source code
* @param message warning message
*/
- public void warning (SourceReference? source, string message) {
+ public virtual void warn (SourceReference? source, string message) {
warnings++;
if (source == null) {
stderr.printf ("warning: %s\n", message);
@@ -114,7 +114,7 @@ namespace Vala.Report {
* @param source reference to source code
* @param message error message
*/
- public void error (SourceReference? source, string message) {
+ public virtual void err (SourceReference? source, string message) {
errors++;
if (source == null) {
stderr.printf ("error: %s\n", message);
@@ -125,4 +125,12 @@ namespace Vala.Report {
}
}
}
+
+ /* Convenience methods calling warn and err on correct instance */
+ public static void warning (SourceReference? source, string message) {
+ CodeContext.get ().report.warn (source, message);
+ }
+ public static void error (SourceReference? source, string message) {
+ CodeContext.get ().report.err (source, message);
+ }
}
diff --git a/vapigen/valavapigen.vala b/vapigen/valavapigen.vala
index 410d45df4..416030200 100644
--- a/vapigen/valavapigen.vala
+++ b/vapigen/valavapigen.vala
@@ -52,14 +52,14 @@ class Vala.VAPIGen : Object {
};
private int quit () {
- if (Report.get_errors () == 0) {
+ if (context.report.get_errors () == 0) {
if (!quiet_mode) {
- stdout.printf ("Generation succeeded - %d warning(s)\n", Report.get_warnings ());
+ stdout.printf ("Generation succeeded - %d warning(s)\n", context.report.get_warnings ());
}
return 0;
} else {
if (!quiet_mode) {
- stdout.printf ("Generation failed: %d error(s), %d warning(s)\n", Report.get_errors (), Report.get_warnings ());
+ stdout.printf ("Generation failed: %d error(s), %d warning(s)\n", context.report.get_errors (), context.report.get_warnings ());
}
return 1;
}
@@ -97,6 +97,7 @@ class Vala.VAPIGen : Object {
private int run () {
context = new CodeContext ();
+ CodeContext.push (context);
/* default package */
if (!add_package ("glib-2.0")) {
@@ -134,7 +135,7 @@ class Vala.VAPIGen : Object {
packages = null;
}
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
@@ -147,14 +148,14 @@ class Vala.VAPIGen : Object {
}
sources = null;
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
var parser = new Parser ();
parser.parse (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
@@ -164,28 +165,28 @@ class Vala.VAPIGen : Object {
}
girparser.parse (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
var gidlparser = new GIdlParser ();
gidlparser.parse (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
var resolver = new SymbolResolver ();
resolver.resolve (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}
var analyzer = new SemanticAnalyzer ();
analyzer.analyze (context);
- if (Report.get_errors () > 0) {
+ if (context.report.get_errors () > 0) {
return quit ();
}