* Fixed spelling

* Linters now return their information instead of printing it, to
  enable easier unittesting
* Added support for finding tabs in files, added to C++ linter


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65202 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Misha Brukman 2009-02-20 23:44:54 +00:00
parent 1ba519b726
commit 9259905f88
2 changed files with 70 additions and 19 deletions

View File

@ -5,36 +5,68 @@
import re import re
def VerifyLineLength(filename, lines, max_length): def VerifyLineLength(filename, lines, max_length):
"""Checkes to make sure the file has no lines with lines exceeding the length """Checks to make sure the file has no lines with lines exceeding the length
limit. limit.
Args: Args:
filename: the file under consideration as string filename: the file under consideration as string
lines: contents of the file as string array lines: contents of the file as string array
max_length: maximum acceptable line length as number max_length: maximum acceptable line length as number
Returns:
A list of tuples with format [(filename, line number, msg), ...] with any
violations found.
""" """
lint = []
line_num = 1 line_num = 1
for line in lines: for line in lines:
length = len(line.rstrip('\n')) length = len(line.rstrip('\n'))
if length > max_length: if length > max_length:
print '%s:%d:Line exceeds %d chars (%d)' % (filename, line_num, lint.append((filename, line_num,
max_length, length) 'Line exceeds %d chars (%d)' % (max_length, length)))
line_num += 1 line_num += 1
return lint
def VerifyTabs(filename, lines):
def VerifyTrailingWhitespace(filename, lines): """Checks to make sure the file has no tab characters.
"""Checkes to make sure the file has no lines with trailing whitespace.
Args: Args:
filename: the file under consideration as string filename: the file under consideration as string
lines: contents of the file as string array lines: contents of the file as string array
Returns:
A list of tuples with format [(line_number, msg), ...] with any violations
found.
""" """
lint = []
tab_re = re.compile(r'\t')
line_num = 1
for line in lines:
if tab_re.match(line.rstrip('\n')):
lint.append((filename, line_num, 'Tab found instead of whitespace'))
line_num += 1
return lint
def VerifyTrailingWhitespace(filename, lines):
"""Checks to make sure the file has no lines with trailing whitespace.
Args:
filename: the file under consideration as string
lines: contents of the file as string array
Returns:
A list of tuples with format [(filename, line number, msg), ...] with any
violations found.
"""
lint = []
trailing_whitespace_re = re.compile(r'\s+$') trailing_whitespace_re = re.compile(r'\s+$')
line_num = 1 line_num = 1
for line in lines: for line in lines:
if trailing_whitespace_re.match(line.rstrip('\n')): if trailing_whitespace_re.match(line.rstrip('\n')):
print '%s:%d:Trailing whitespace' % (filename, line_num) lint.append((filename, line_num, 'Trailing whitespace'))
line_num += 1 line_num += 1
return lint
class BaseLint: class BaseLint:
@ -42,17 +74,24 @@ class BaseLint:
raise Exception('RunOnFile() unimplemented') raise Exception('RunOnFile() unimplemented')
def RunLintOverAllFiles(lint, filenames): def RunLintOverAllFiles(linter, filenames):
"""Runs linter over the contents of all files. """Runs linter over the contents of all files.
Args: Args:
lint: subclass of BaseLint, implementing RunOnFile() lint: subclass of BaseLint, implementing RunOnFile()
filenames: list of all files whose contents will be linted filenames: list of all files whose contents will be linted
Returns:
A list of tuples with format [(filename, line number, msg), ...] with any
violations found.
""" """
lint = []
for filename in filenames: for filename in filenames:
file = open(filename, 'r') file = open(filename, 'r')
if not file: if not file:
print 'Cound not open %s' % filename print 'Cound not open %s' % filename
continue continue
lines = file.readlines() lines = file.readlines()
lint.RunOnFile(filename, lines) lint.extend(linter.RunOnFile(filename, lines))
return lint

View File

@ -18,6 +18,8 @@ def VerifyIncludes(filename, lines):
filename: the file under consideration as string filename: the file under consideration as string
lines: contents of the file as string array lines: contents of the file as string array
""" """
lint = []
include_gtest_re = re.compile(r'^#include "gtest/(.*)"') include_gtest_re = re.compile(r'^#include "gtest/(.*)"')
include_llvm_re = re.compile(r'^#include "llvm/(.*)"') include_llvm_re = re.compile(r'^#include "llvm/(.*)"')
include_support_re = re.compile(r'^#include "(Support/.*)"') include_support_re = re.compile(r'^#include "(Support/.*)"')
@ -41,8 +43,9 @@ def VerifyIncludes(filename, lines):
curr_config_header = config_header.group(1) curr_config_header = config_header.group(1)
if prev_config_header: if prev_config_header:
if prev_config_header > curr_config_header: if prev_config_header > curr_config_header:
print '%s:%d:Config headers not in order: "%s" before "%s" ' % ( lint.append((filename, line_num,
filename, line_num, prev_config_header, curr_config_header) 'Config headers not in order: "%s" before "%s"' % (
prev_config_header, curr_config_header)))
# Process system headers # Process system headers
system_header = include_system_re.match(line) system_header = include_system_re.match(line)
@ -51,30 +54,39 @@ def VerifyIncludes(filename, lines):
# Is it blacklisted? # Is it blacklisted?
if curr_system_header in DISALLOWED_SYSTEM_HEADERS: if curr_system_header in DISALLOWED_SYSTEM_HEADERS:
print '%s:%d:Disallowed system header: <%s>' % ( lint.append((filename, line_num,
filename, line_num, curr_system_header) 'Disallowed system header: <%s>' % curr_system_header))
elif prev_system_header: elif prev_system_header:
# Make sure system headers are alphabetized amongst themselves # Make sure system headers are alphabetized amongst themselves
if prev_system_header > curr_system_header: if prev_system_header > curr_system_header:
print '%s:%d:System headers not in order: <%s> before <%s>' % ( lint.append((filename, line_num,
filename, line_num, prev_system_header, curr_system_header) 'System headers not in order: <%s> before <%s>' % (
prev_system_header, curr_system_header)))
prev_system_header = curr_system_header prev_system_header = curr_system_header
line_num += 1 line_num += 1
return lint
class CppLint(common_lint.BaseLint): class CppLint(common_lint.BaseLint):
MAX_LINE_LENGTH = 80 MAX_LINE_LENGTH = 80
def RunOnFile(self, filename, lines): def RunOnFile(self, filename, lines):
VerifyIncludes(filename, lines) lint = []
common_lint.VerifyLineLength(filename, lines, CppLint.MAX_LINE_LENGTH) lint.extend(VerifyIncludes(filename, lines))
common_lint.VerifyTrailingWhitespace(filename, lines) lint.extend(common_lint.VerifyLineLength(filename, lines,
CppLint.MAX_LINE_LENGTH))
lint.extend(common_lint.VerifyTabs(filename, lines))
lint.extend(common_lint.VerifyTrailingWhitespace(filename, lines))
return lint
def CppLintMain(filenames): def CppLintMain(filenames):
common_lint.RunLintOverAllFiles(CppLint(), filenames) all_lint = common_lint.RunLintOverAllFiles(CppLint(), filenames)
for lint in all_lint:
print '%s:%d:%s' % (lint[0], lint[1], lint[2])
return 0 return 0