[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. |