1 | """Check for errs in the AST.
|
2 |
|
3 | The Python parser does not catch all syntax errors. Others, like
|
4 | assignments with invalid targets, are caught in the code generation
|
5 | phase.
|
6 |
|
7 | The compiler package catches some errors in the transformer module.
|
8 | But it seems clearer to write checkers that use the AST to detect
|
9 | errors.
|
10 | """
|
11 |
|
12 |
|
13 | from .visitor import ASTVisitor
|
14 |
|
15 |
|
16 | class SyntaxErrorChecker(ASTVisitor):
|
17 | """A visitor to find syntax errors in the AST."""
|
18 |
|
19 | def __init__(self, multi=None):
|
20 | """Create new visitor object.
|
21 |
|
22 | If optional argument multi is not None, then print messages
|
23 | for each error rather than raising a SyntaxError for the
|
24 | first.
|
25 | """
|
26 | ASTVisitor.__init__(self)
|
27 | self.multi = multi
|
28 | self.errors = 0
|
29 |
|
30 | def error(self, node, msg):
|
31 | self.errors = self.errors + 1
|
32 | if self.multi is not None:
|
33 | print("%s:%s: %s" % (node.filename, node.lineno, msg))
|
34 | else:
|
35 | raise SyntaxError, "%s (%s:%s)" % (msg, node.filename, node.lineno)
|
36 |
|
37 | def visitAssign(self, node):
|
38 | # the transformer module handles many of these
|
39 | pass
|
40 | ## for target in node.nodes:
|
41 | ## if isinstance(target, ast.AssList):
|
42 | ## if target.lineno is None:
|
43 | ## target.lineno = node.lineno
|
44 | ## self.error(target, "can't assign to list comprehension")
|