[javascriptlint-commit] SF.net SVN: javascriptlint:[365] trunk
Status: Beta
Brought to you by:
matthiasmiller
From: <mat...@us...> - 2016-12-23 23:55:20
|
Revision: 365 http://sourceforge.net/p/javascriptlint/code/365 Author: matthiasmiller Date: 2016-12-23 23:55:18 +0000 (Fri, 23 Dec 2016) Log Message: ----------- Use exceptions instead of a callback for parse errors. Modified Paths: -------------- trunk/javascriptlint/jsparse.py trunk/javascriptlint/lint.py trunk/jsengine/parser/__init__.py Modified: trunk/javascriptlint/jsparse.py =================================================================== --- trunk/javascriptlint/jsparse.py 2016-12-23 23:46:55 UTC (rev 364) +++ trunk/javascriptlint/jsparse.py 2016-12-23 23:55:18 UTC (rev 365) @@ -4,6 +4,7 @@ import re import unittest +from jsengine import JSSyntaxError import jsengine.parser from jsengine.parser import kind as tok from jsengine.parser import op @@ -51,15 +52,14 @@ # this one was within a string or a regexp. pos = match.start()+1 -def parse(script, jsversion, error_callback, start_offset=0): +def parse(script, jsversion, start_offset=0): """ All node positions will be relative to start_offset. This allows scripts to be embedded in a file (for example, HTML). """ assert not start_offset is None jsversion = jsversion or JSVersion.default() assert isvalidversion(jsversion), jsversion - return jsengine.parser.parse(script, jsversion.version, - error_callback, start_offset) + return jsengine.parser.parse(script, jsversion.version, start_offset) def filtercomments(possible_comments, root_node): comment_ignore_ranges = NodeRanges() @@ -126,15 +126,18 @@ _dump_node(node, node_positions, depth+1) def dump_tree(script): - def error_callback(line, col, msg, msg_args): - print '(%i, %i): %s', (line, col, msg) - node = parse(script, None, error_callback) node_positions = NodePositions(script) + try: + node = parse(script, None) + except JSSyntaxError, error: + pos = node_positions.from_offset(error.offset) + print 'Line %i, Column %i: %s' % (pos.line+1, pos.col+1, error.msg) + return _dump_node(node, node_positions) class TestComments(unittest.TestCase): def _test(self, script, expected_comments): - root = parse(script, None, lambda line, col, msg: None) + root = parse(script, None) comments = findcomments(script, root) encountered_comments = [node.atom for node in comments] self.assertEquals(encountered_comments, list(expected_comments)) @@ -239,19 +242,18 @@ class TestLineOffset(unittest.TestCase): def testErrorPos(self): def geterror(script, start_offset): - errors = [] - def onerror(offset, msg, msg_args): - errors.append((offset, msg, msg_args)) - parse(script, None, onerror, start_offset) - self.assertEquals(len(errors), 1) - return errors[0] + try: + parse(script, None, start_offset) + except JSSyntaxError, error: + return (error.offset, error.msg, error.msg_args) + assert False self.assertEquals(geterror(' ?', 0), (1, 'syntax_error', {})) self.assertEquals(geterror('\n ?', 0), (2, 'syntax_error', {})) self.assertEquals(geterror(' ?', 2), (3, 'syntax_error', {})) self.assertEquals(geterror('\n ?', 2), (4, 'syntax_error', {})) def testNodePos(self): def getnodepos(script, start_offset): - root = parse(script, None, None, start_offset) + root = parse(script, None, start_offset) self.assertEquals(root.kind, tok.LC) var, = root.kids self.assertEquals(var.kind, tok.VAR) @@ -264,7 +266,7 @@ self.assertEquals(getnodepos('\n\n var x;', 7), 10) def testComments(self): def testcomment(comment, startpos, expected_offset): - root = parse(comment, None, None, startpos) + root = parse(comment, None, startpos) comment, = findcomments(comment, root, startpos) self.assertEquals(comment.start_offset, expected_offset) for comment in ('/*comment*/', '//comment'): Modified: trunk/javascriptlint/lint.py =================================================================== --- trunk/javascriptlint/lint.py 2016-12-23 23:46:55 UTC (rev 364) +++ trunk/javascriptlint/lint.py 2016-12-23 23:55:18 UTC (rev 365) @@ -351,9 +351,6 @@ def _lint_script_part(script_offset, jsversion, script, script_cache, conf, report_parse_error, report_lint, import_callback): - def parse_error(offset, msg, msg_args): - parse_errors.append((offset, msg, msg_args)) - def report(node, errname, offset=0, **errargs): if errname == 'empty_statement' and node.kind == tok.LC: for pass_ in passes: @@ -387,7 +384,6 @@ report_lint(node, errname, offset, **errargs) - parse_errors = [] declares = [] unused_identifiers = [] import_paths = [] @@ -421,11 +417,11 @@ report_lint(None, 'e4x_deprecated', jsversionnode.start_offset if jsversionnode else script_offset) - root = jsparse.parse(script, jsversion, parse_error, script_offset) - if not root: + try: + root = jsparse.parse(script, jsversion, script_offset) + except jsparse.JSSyntaxError, error: # Report errors and quit. - for offset, msg, msg_args in parse_errors: - report_parse_error(offset, msg, msg_args) + report_parse_error(error.offset, error.msg, error.msg_args) return comments = jsparse.filtercomments(possible_comments, root) @@ -487,10 +483,6 @@ if start_ignore: report(start_ignore, 'mismatch_ctrl_comments') - # Wait to report parse errors until loading jsl:ignore directives. - for offset, msg in parse_errors: - report_parse_error(offset, msg) - # Find all visitors and convert them into "onpush" callbacks that call "report" visitors = { 'push': lintwarnings.make_visitors(conf) Modified: trunk/jsengine/parser/__init__.py =================================================================== --- trunk/jsengine/parser/__init__.py 2016-12-23 23:46:55 UTC (rev 364) +++ trunk/jsengine/parser/__init__.py 2016-12-23 23:55:18 UTC (rev 365) @@ -814,7 +814,9 @@ nodes = _sourceelements(t, tok.EOF) lc_end_offset = t.expect(tok.EOF).end_offset lc_start_offset = nodes[-1].start_offset if nodes else lc_end_offset - return ParseNode(kind.LC, None, lc_start_offset, lc_end_offset, None, nodes) + root = ParseNode(kind.LC, None, lc_start_offset, lc_end_offset, None, nodes) + _validate(root) + return root def is_valid_version(version): return version in _VERSIONS @@ -825,16 +827,10 @@ assert kid.parent is node _validate(kid, depth+1) -def parse(script, jsversion, error_callback, start_offset): +def parse(script, jsversion, start_offset): # TODO: respect version assert is_valid_version(jsversion) - try: - root = parsestring(script, start_offset) - except JSSyntaxError as error: - error_callback(error.offset, error.msg, error.msg_args) - return None - _validate(root) - return root + return parsestring(script, start_offset) def is_compilable_unit(script, jsversion): # TODO: respect version This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |