1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/python 2*9880d681SAndroid Build Coastguard Worker# 3*9880d681SAndroid Build Coastguard Worker# Common lint functions applicable to multiple types of files. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerimport re 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdef VerifyLineLength(filename, lines, max_length): 8*9880d681SAndroid Build Coastguard Worker """Checks to make sure the file has no lines with lines exceeding the length 9*9880d681SAndroid Build Coastguard Worker limit. 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker Args: 12*9880d681SAndroid Build Coastguard Worker filename: the file under consideration as string 13*9880d681SAndroid Build Coastguard Worker lines: contents of the file as string array 14*9880d681SAndroid Build Coastguard Worker max_length: maximum acceptable line length as number 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker Returns: 17*9880d681SAndroid Build Coastguard Worker A list of tuples with format [(filename, line number, msg), ...] with any 18*9880d681SAndroid Build Coastguard Worker violations found. 19*9880d681SAndroid Build Coastguard Worker """ 20*9880d681SAndroid Build Coastguard Worker lint = [] 21*9880d681SAndroid Build Coastguard Worker line_num = 1 22*9880d681SAndroid Build Coastguard Worker for line in lines: 23*9880d681SAndroid Build Coastguard Worker length = len(line.rstrip('\n')) 24*9880d681SAndroid Build Coastguard Worker if length > max_length: 25*9880d681SAndroid Build Coastguard Worker lint.append((filename, line_num, 26*9880d681SAndroid Build Coastguard Worker 'Line exceeds %d chars (%d)' % (max_length, length))) 27*9880d681SAndroid Build Coastguard Worker line_num += 1 28*9880d681SAndroid Build Coastguard Worker return lint 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdef VerifyTabs(filename, lines): 31*9880d681SAndroid Build Coastguard Worker """Checks to make sure the file has no tab characters. 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker Args: 34*9880d681SAndroid Build Coastguard Worker filename: the file under consideration as string 35*9880d681SAndroid Build Coastguard Worker lines: contents of the file as string array 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker Returns: 38*9880d681SAndroid Build Coastguard Worker A list of tuples with format [(line_number, msg), ...] with any violations 39*9880d681SAndroid Build Coastguard Worker found. 40*9880d681SAndroid Build Coastguard Worker """ 41*9880d681SAndroid Build Coastguard Worker lint = [] 42*9880d681SAndroid Build Coastguard Worker tab_re = re.compile(r'\t') 43*9880d681SAndroid Build Coastguard Worker line_num = 1 44*9880d681SAndroid Build Coastguard Worker for line in lines: 45*9880d681SAndroid Build Coastguard Worker if tab_re.match(line.rstrip('\n')): 46*9880d681SAndroid Build Coastguard Worker lint.append((filename, line_num, 'Tab found instead of whitespace')) 47*9880d681SAndroid Build Coastguard Worker line_num += 1 48*9880d681SAndroid Build Coastguard Worker return lint 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdef VerifyTrailingWhitespace(filename, lines): 52*9880d681SAndroid Build Coastguard Worker """Checks to make sure the file has no lines with trailing whitespace. 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker Args: 55*9880d681SAndroid Build Coastguard Worker filename: the file under consideration as string 56*9880d681SAndroid Build Coastguard Worker lines: contents of the file as string array 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker Returns: 59*9880d681SAndroid Build Coastguard Worker A list of tuples with format [(filename, line number, msg), ...] with any 60*9880d681SAndroid Build Coastguard Worker violations found. 61*9880d681SAndroid Build Coastguard Worker """ 62*9880d681SAndroid Build Coastguard Worker lint = [] 63*9880d681SAndroid Build Coastguard Worker trailing_whitespace_re = re.compile(r'\s+$') 64*9880d681SAndroid Build Coastguard Worker line_num = 1 65*9880d681SAndroid Build Coastguard Worker for line in lines: 66*9880d681SAndroid Build Coastguard Worker if trailing_whitespace_re.match(line.rstrip('\n')): 67*9880d681SAndroid Build Coastguard Worker lint.append((filename, line_num, 'Trailing whitespace')) 68*9880d681SAndroid Build Coastguard Worker line_num += 1 69*9880d681SAndroid Build Coastguard Worker return lint 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerclass BaseLint: 73*9880d681SAndroid Build Coastguard Worker def RunOnFile(filename, lines): 74*9880d681SAndroid Build Coastguard Worker raise Exception('RunOnFile() unimplemented') 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdef RunLintOverAllFiles(linter, filenames): 78*9880d681SAndroid Build Coastguard Worker """Runs linter over the contents of all files. 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker Args: 81*9880d681SAndroid Build Coastguard Worker lint: subclass of BaseLint, implementing RunOnFile() 82*9880d681SAndroid Build Coastguard Worker filenames: list of all files whose contents will be linted 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker Returns: 85*9880d681SAndroid Build Coastguard Worker A list of tuples with format [(filename, line number, msg), ...] with any 86*9880d681SAndroid Build Coastguard Worker violations found. 87*9880d681SAndroid Build Coastguard Worker """ 88*9880d681SAndroid Build Coastguard Worker lint = [] 89*9880d681SAndroid Build Coastguard Worker for filename in filenames: 90*9880d681SAndroid Build Coastguard Worker file = open(filename, 'r') 91*9880d681SAndroid Build Coastguard Worker if not file: 92*9880d681SAndroid Build Coastguard Worker print 'Cound not open %s' % filename 93*9880d681SAndroid Build Coastguard Worker continue 94*9880d681SAndroid Build Coastguard Worker lines = file.readlines() 95*9880d681SAndroid Build Coastguard Worker lint.extend(linter.RunOnFile(filename, lines)) 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker return lint 98