[javascriptlint-commit] SF.net SVN: javascriptlint:[242] trunk/pyjsl
Status: Beta
Brought to you by:
matthiasmiller
|
From: <mat...@us...> - 2009-03-04 07:19:21
|
Revision: 242
http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=242&view=rev
Author: matthiasmiller
Date: 2009-03-04 07:19:18 +0000 (Wed, 04 Mar 2009)
Log Message:
-----------
expand the named parameters
Modified Paths:
--------------
trunk/pyjsl/lint.py
trunk/pyjsl/warnings.py
Modified: trunk/pyjsl/lint.py
===================================================================
--- trunk/pyjsl/lint.py 2009-03-04 06:52:38 UTC (rev 241)
+++ trunk/pyjsl/lint.py 2009-03-04 07:19:18 UTC (rev 242)
@@ -252,7 +252,7 @@
'redeclared_var', 'var_hides_arg'):
parse_errors.append((jsparse.NodePos(row, col), msg))
- def report(node, errname):
+ def report(node, errname, **errargs):
if errname == 'empty_statement' and node.kind == tok.LC:
for pass_ in passes:
if pass_.start_pos() > node.start_pos() and \
@@ -283,7 +283,7 @@
fallthrus.remove(fallthru)
return
- report_lint(node, errname)
+ report_lint(node, errname, **errargs)
parse_errors = []
declares = []
@@ -373,19 +373,19 @@
for name, node in declares:
declare_scope = script_cache.scope.find_scope(node)
if declare_scope.get_identifier(name):
- report(node, 'redeclared_var')
+ report(node, 'redeclared_var', name=name)
else:
declare_scope.add_declaration(name, node)
def _lint_script_parts(script_parts, script_cache, lint_error, conf, import_callback):
- def report_lint(node, errname):
+ def report_lint(node, errname, **errargs):
# TODO: This is ugly hardcoding to improve the error positioning of
# "missing_semicolon" errors.
if errname == 'missing_semicolon' or errname == 'missing_semicolon_for_lambda':
pos = node.end_pos()
else:
pos = node.start_pos()
- errdesc = warnings.warnings[errname]
+ errdesc = warnings.format_error(errname, **errargs)
_report(pos, errname, errdesc, True)
def report_native(pos, errname):
@@ -419,11 +419,11 @@
if name in _globals:
continue
if not script_cache.hasglobal(name):
- report_lint(node, 'undeclared_identifier')
+ report_lint(node, 'undeclared_identifier', name=name)
for ref_scope, name, node in unreferenced:
# Ignore the outer scope.
if ref_scope != scope:
- report_lint(node, 'unreferenced_identifier')
+ report_lint(node, 'unreferenced_identifier', name=name)
def _getreporter(visitor, report):
def onpush(node):
@@ -431,15 +431,15 @@
ret = visitor(node)
assert ret is None, 'visitor should raise an exception, not return a value'
except warnings.LintWarning, warning:
- report(warning.node, visitor.warning)
+ report(warning.node, visitor.warning, **warning.errargs)
return onpush
def _warn_or_declare(scope, name, node, report):
other = scope.get_identifier(name)
if other and other.kind == tok.FUNCTION and name in other.fn_args:
- report(node, 'var_hides_arg')
+ report(node, 'var_hides_arg', name=name)
elif other:
- report(node, 'redeclared_var')
+ report(node, 'redeclared_var', name=name)
else:
scope.add_declaration(name, node)
Modified: trunk/pyjsl/warnings.py
===================================================================
--- trunk/pyjsl/warnings.py 2009-03-04 06:52:38 UTC (rev 241)
+++ trunk/pyjsl/warnings.py 2009-03-04 07:19:18 UTC (rev 242)
@@ -72,13 +72,13 @@
'trailing_comma_in_array': 'extra comma is not recommended in array initializers',
'useless_quotes': 'the quotation marks are unnecessary',
'mismatch_ctrl_comments': 'mismatched control comment; "ignore" and "end" control comments must have a one-to-one correspondence',
- 'redeclared_var': 'redeclaration of {0} {1}',
- 'undeclared_identifier': 'undeclared identifier: {0}',
- 'unreferenced_identifier': 'identifier is declared but never referenced: {0}',
+ 'redeclared_var': 'redeclaration of {name}',
+ 'undeclared_identifier': 'undeclared identifier: {name}',
+ 'unreferenced_identifier': 'identifier is declared but never referenced: {name}',
'jsl_cc_not_understood': 'couldn\'t understand control comment using /*jsl:keyword*/ syntax',
'nested_comment': 'nested comment',
'legacy_cc_not_understood': 'couldn\'t understand control comment using /*@keyword@*/ syntax',
- 'var_hides_arg': 'variable {0} hides argument',
+ 'var_hides_arg': 'variable {name} hides argument',
'duplicate_formal': 'TODO',
'missing_semicolon': 'missing semicolon',
'missing_semicolon_for_lambda': 'missing semicolon for lambda assignment',
@@ -89,10 +89,18 @@
'invalid_fallthru': 'unexpected "fallthru" control comment',
'invalid_pass': 'unexpected "pass" control comment',
'want_assign_or_call': 'expected an assignment or function call',
- 'no_return_value': 'function {0} does not always return a value',
+ 'no_return_value': 'function {name} does not always return a value',
'anon_no_return_value': 'anonymous function does not always return value'
}
+def format_error(errname, **errargs):
+ errdesc = warnings[errname]
+ try:
+ errdesc = re.sub(r"{(\w+)}", lambda match: errargs[match.group(1)], errdesc)
+ except (TypeError, KeyError):
+ raise KeyError, 'Invalid keyword in error: ' + errdesc
+ return errdesc
+
_visitors = []
def lookfor(*args):
def decorate(fn):
@@ -104,8 +112,9 @@
return decorate
class LintWarning(Exception):
- def __init__(self, node):
+ def __init__(self, node, **errargs):
self.node = node
+ self.errargs = errargs
def _get_branch_in_for(node):
" Returns None if this is not one of the branches in a 'for' "
@@ -496,6 +505,8 @@
raise LintWarning, child
def _check_return_value(node):
+ name = node.fn_name or '(anonymous function)'
+
def is_return_with_val(node):
return node and node.kind == tok.RETURN and node.kids[0]
def is_return_without_val(node):
@@ -510,10 +521,10 @@
returns = filter(is_return_without_val, exit_points)
returns.sort(key=lambda node: node.start_pos())
if returns:
- raise LintWarning, returns[0]
+ raise LintWarning(returns[0], name=name)
# Warn if the function sometimes exits naturally.
if None in exit_points:
- raise LintWarning, node
+ raise LintWarning(node, name=name)
@lookfor(tok.FUNCTION)
def no_return_value(node):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|