summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDieter Verfaillie <dieterv@optionexplicit.be>2013-07-24 16:56:20 +0200
committerDieter Verfaillie <dieterv@optionexplicit.be>2013-10-08 20:55:05 +0200
commit6d9022311b5d3bfb48895466880c2a15235b63a6 (patch)
tree5cf1c16e44b0fce7e74e4002b2585b54ca636679
parentdb34cca45f4a726e20f2452615068fe1e04bc428 (diff)
downloadgobject-introspection-6d9022311b5d3bfb48895466880c2a15235b63a6.tar.gz
giscanner: give message.ERROR a purpose
It's not yet being used but will be in the future by annotationparser.py to signal the difference between message.WARNING: something is wrong but the comment block can still be parsed and serialized back into a comment block without information being lost message.ERROR: something is wrong and the comment block can *not* be parsed and serialized back into a comment block without information being lost Different tools can then act accordingly. Nothing will change for g-ir-scanner but this will be important for the GTK-Doc comment block rewriting tool to prevent extremely broken input leading to even more broken output...
-rw-r--r--giscanner/message.py49
-rwxr-xr-xgiscanner/scannermain.py3
-rw-r--r--tests/scanner/annotationparser/test_parser.py4
-rw-r--r--tests/warn/warningtester.py4
4 files changed, 37 insertions, 23 deletions
diff --git a/giscanner/message.py b/giscanner/message.py
index 58908352..1a0a6c52 100644
--- a/giscanner/message.py
+++ b/giscanner/message.py
@@ -31,7 +31,8 @@ from . import utils
class Position(object):
- """Represents a position in the source file which we
+ """
+ Represents a position in the source file which we
want to inform about.
"""
@@ -47,10 +48,8 @@ class Position(object):
(other.filename, other.line, other.column))
def __repr__(self):
- return '<Position %s:%d:%d>' % (
- os.path.basename(self.filename),
- self.line or -1,
- self.column or -1)
+ return '<Position %s:%d:%d>' % (os.path.basename(self.filename), self.line or -1,
+ self.column or -1)
def format(self, cwd):
filename = os.path.realpath(self.filename)
@@ -76,8 +75,9 @@ class MessageLogger(object):
self._cwd = os.getcwd()
self._output = output
self._namespace = namespace
- self._enable_warnings = False
+ self._enable_warnings = []
self._warning_count = 0
+ self._error_count = 0
@classmethod
def get(cls, *args, **kwargs):
@@ -85,24 +85,27 @@ class MessageLogger(object):
cls._instance = cls(*args, **kwargs)
return cls._instance
- def enable_warnings(self, enable):
- self._enable_warnings = enable
+ def enable_warnings(self, log_types):
+ self._enable_warnings = log_types
def get_warning_count(self):
return self._warning_count
+ def get_error_count(self):
+ return self._error_count
+
def log(self, log_type, text, positions=None, prefix=None):
- """Log a warning, using optional file positioning information.
-If the warning is related to a ast.Node type, see log_node()."""
+ """
+ Log a warning, using optional file positioning information.
+ If the warning is related to a ast.Node type, see log_node().
+ """
utils.break_on_debug_flag('warning')
self._warning_count += 1
- if not self._enable_warnings and log_type != FATAL:
+ if not log_type in self._enable_warnings:
return
- # Always drop through on fatal
-
if type(positions) == set:
positions = list(positions)
if isinstance(positions, Position):
@@ -119,8 +122,10 @@ If the warning is related to a ast.Node type, see log_node()."""
error_type = "Warning"
elif log_type == ERROR:
error_type = "Error"
+ self._error_count += 1
elif log_type == FATAL:
error_type = "Fatal"
+
if prefix:
text = ('%s: %s: %s: %s: %s\n' % (last_position, error_type,
self._namespace.name, prefix, text))
@@ -132,16 +137,19 @@ If the warning is related to a ast.Node type, see log_node()."""
text = ('%s: %s: %s\n' % (last_position, error_type, text))
self._output.write(text)
+
if log_type == FATAL:
utils.break_on_debug_flag('fatal')
raise SystemExit(text)
def log_node(self, log_type, node, text, context=None, positions=None):
- """Log a warning, using information about file positions from
-the given node. The optional context argument, if given, should be
-another ast.Node type which will also be displayed. If no file position
-information is available from the node, the position data from the
-context will be used."""
+ """
+ Log a warning, using information about file positions from
+ the given node. The optional context argument, if given, should be
+ another ast.Node type which will also be displayed. If no file position
+ information is available from the node, the position data from the
+ context will be used.
+ """
if positions:
pass
elif getattr(node, 'file_positions', None):
@@ -185,6 +193,11 @@ def warn_symbol(symbol, text):
ml.log_symbol(WARNING, symbol, text)
+def error(text, positions=None, prefix=None):
+ ml = MessageLogger.get()
+ ml.log(ERROR, text, positions, prefix)
+
+
def fatal(text, positions=None, prefix=None):
ml = MessageLogger.get()
ml.log(FATAL, text, positions, prefix)
diff --git a/giscanner/scannermain.py b/giscanner/scannermain.py
index e4436b8c..ab8f5bbf 100755
--- a/giscanner/scannermain.py
+++ b/giscanner/scannermain.py
@@ -452,7 +452,8 @@ def scanner_main(args):
namespace = create_namespace(options)
logger = message.MessageLogger.get(namespace=namespace)
if options.warn_all:
- logger.enable_warnings(True)
+ logger.enable_warnings((message.WARNING, message.ERROR, message.FATAL))
+
transformer = create_transformer(namespace, options)
packages = set(options.packages)
diff --git a/tests/scanner/annotationparser/test_parser.py b/tests/scanner/annotationparser/test_parser.py
index adf4f657..1b82625b 100644
--- a/tests/scanner/annotationparser/test_parser.py
+++ b/tests/scanner/annotationparser/test_parser.py
@@ -35,7 +35,7 @@ import xml.etree.ElementTree as etree
from giscanner.annotationparser import GtkDocCommentBlockParser
from giscanner.ast import Namespace
-from giscanner.message import MessageLogger
+from giscanner.message import MessageLogger, WARNING, ERROR, FATAL
XML_NS = 'http://schemas.gnome.org/gobject-introspection/2013/test'
@@ -358,7 +358,7 @@ if __name__ == '__main__':
# Initialize message logger
namespace = Namespace('Test', '1.0')
logger = MessageLogger.get(namespace=namespace)
- logger.enable_warnings(True)
+ logger.enable_warnings((WARNING, ERROR, FATAL))
# Load test cases from disc
tests_dir = os.path.dirname(os.path.abspath(__file__))
diff --git a/tests/warn/warningtester.py b/tests/warn/warningtester.py
index c78f92a7..b2117910 100644
--- a/tests/warn/warningtester.py
+++ b/tests/warn/warningtester.py
@@ -14,7 +14,7 @@ from giscanner.annotationparser import GtkDocCommentBlockParser
from giscanner.ast import Include, Namespace
from giscanner.introspectablepass import IntrospectablePass
from giscanner.maintransformer import MainTransformer
-from giscanner.message import MessageLogger
+from giscanner.message import MessageLogger, WARNING, ERROR, FATAL
from giscanner.sourcescanner import SourceScanner
from giscanner.transformer import Transformer
from giscanner.scannermain import process_packages
@@ -97,7 +97,7 @@ def check(args):
output = ChunkedIO()
namespace = Namespace('Test', '1.0')
logger = MessageLogger.get(namespace=namespace, output=output)
- logger.enable_warnings(True)
+ logger.enable_warnings((WARNING, ERROR, FATAL))
transformer = Transformer(namespace)
transformer.set_include_paths([os.path.join(top_srcdir, 'gir'), top_builddir])