xref: /xnu-8019.80.24/tools/lldbmacros/core/syntax_checker.py (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
1*a325d9c4SApple OSS Distributions#!/usr/bin/env python
2*a325d9c4SApple OSS Distributions
3*a325d9c4SApple OSS Distributionshelpdoc = """
4*a325d9c4SApple OSS DistributionsA simple utility that verifies the syntax for python scripts.
5*a325d9c4SApple OSS DistributionsThe checks it does are :
6*a325d9c4SApple OSS Distributions  * Check for 'tab' characters in .py files
7*a325d9c4SApple OSS Distributions  * Compile errors in py sources
8*a325d9c4SApple OSS DistributionsUsage:
9*a325d9c4SApple OSS Distributions  python syntax_checker.py <python_source_file> [<python_source_file> ..]
10*a325d9c4SApple OSS Distributions"""
11*a325d9c4SApple OSS Distributionsimport py_compile
12*a325d9c4SApple OSS Distributionsimport sys
13*a325d9c4SApple OSS Distributionsimport os
14*a325d9c4SApple OSS Distributionsimport re
15*a325d9c4SApple OSS Distributions
16*a325d9c4SApple OSS Distributionstabs_search_rex = re.compile("^\s*\t+",re.MULTILINE|re.DOTALL)
17*a325d9c4SApple OSS Distributions
18*a325d9c4SApple OSS Distributionsdef find_non_ascii(s):
19*a325d9c4SApple OSS Distributions    for c in s:
20*a325d9c4SApple OSS Distributions        if ord(c) >= 0x80: return True
21*a325d9c4SApple OSS Distributions    return False
22*a325d9c4SApple OSS Distributions
23*a325d9c4SApple OSS Distributionsif __name__ == "__main__":
24*a325d9c4SApple OSS Distributions    if len(sys.argv) < 2:
25*a325d9c4SApple OSS Distributions        print >>sys.stderr, "Error: Unknown arguments"
26*a325d9c4SApple OSS Distributions        print helpdoc
27*a325d9c4SApple OSS Distributions        sys.exit(1)
28*a325d9c4SApple OSS Distributions    for fname in sys.argv[1:]:
29*a325d9c4SApple OSS Distributions        if not os.path.exists(fname):
30*a325d9c4SApple OSS Distributions            print >>sys.stderr, "Error: Cannot recognize %s as a file" % fname
31*a325d9c4SApple OSS Distributions            sys.exit(1)
32*a325d9c4SApple OSS Distributions        if fname.split('.')[-1] != 'py':
33*a325d9c4SApple OSS Distributions            print "Note: %s is not a valid python file. Skipping." % fname
34*a325d9c4SApple OSS Distributions            continue
35*a325d9c4SApple OSS Distributions        fh = open(fname)
36*a325d9c4SApple OSS Distributions        strdata = fh.readlines()
37*a325d9c4SApple OSS Distributions        lineno = 0
38*a325d9c4SApple OSS Distributions        syntax_fail = False
39*a325d9c4SApple OSS Distributions        for linedata in strdata:
40*a325d9c4SApple OSS Distributions            lineno += 1
41*a325d9c4SApple OSS Distributions            if len(tabs_search_rex.findall(linedata)) > 0 :
42*a325d9c4SApple OSS Distributions                print >>sys.stderr, "Error: Found a TAB character at %s:%d" % (fname, lineno)
43*a325d9c4SApple OSS Distributions                syntax_fail = True
44*a325d9c4SApple OSS Distributions	    if find_non_ascii(linedata):
45*a325d9c4SApple OSS Distributions                print >>sys.stderr, "Error: Found a non ascii character at %s:%d" % (fname, lineno)
46*a325d9c4SApple OSS Distributions                syntax_fail = True
47*a325d9c4SApple OSS Distributions        if syntax_fail:
48*a325d9c4SApple OSS Distributions            print >>sys.stderr, "Error: Syntax check failed. Please fix the errors and try again."
49*a325d9c4SApple OSS Distributions            sys.exit(1)
50*a325d9c4SApple OSS Distributions        #now check for error in compilation
51*a325d9c4SApple OSS Distributions        try:
52*a325d9c4SApple OSS Distributions            compile_result = py_compile.compile(fname, cfile="/dev/null", doraise=True)
53*a325d9c4SApple OSS Distributions        except py_compile.PyCompileError as exc:
54*a325d9c4SApple OSS Distributions            print >>sys.stderr, str(exc)
55*a325d9c4SApple OSS Distributions            print >>sys.stderr, "Error: Compilation failed. Please fix the errors and try again."
56*a325d9c4SApple OSS Distributions            sys.exit(1)
57*a325d9c4SApple OSS Distributions        print "Success: Checked %s. No syntax errors found." % fname
58*a325d9c4SApple OSS Distributions    sys.exit(0)
59*a325d9c4SApple OSS Distributions
60