1*73471bf0Spatrick#!/usr/bin/env python 209467b48Spatrick# 309467b48Spatrick# Checks C++ files to make sure they conform to LLVM standards, as specified in 409467b48Spatrick# http://llvm.org/docs/CodingStandards.html . 509467b48Spatrick# 609467b48Spatrick# TODO: add unittests for the verifier functions: 709467b48Spatrick# http://docs.python.org/library/unittest.html . 809467b48Spatrick 909467b48Spatrickfrom __future__ import print_function 1009467b48Spatrickimport common_lint 1109467b48Spatrickimport re 1209467b48Spatrickimport sys 1309467b48Spatrick 1409467b48Spatrickdef VerifyIncludes(filename, lines): 1509467b48Spatrick """Makes sure the #includes are in proper order and no disallows files are 1609467b48Spatrick #included. 1709467b48Spatrick 1809467b48Spatrick Args: 1909467b48Spatrick filename: the file under consideration as string 2009467b48Spatrick lines: contents of the file as string array 2109467b48Spatrick """ 2209467b48Spatrick lint = [] 2309467b48Spatrick 2409467b48Spatrick include_gtest_re = re.compile(r'^#include "gtest/(.*)"') 2509467b48Spatrick include_llvm_re = re.compile(r'^#include "llvm/(.*)"') 2609467b48Spatrick include_support_re = re.compile(r'^#include "(Support/.*)"') 2709467b48Spatrick include_config_re = re.compile(r'^#include "(Config/.*)"') 2809467b48Spatrick include_system_re = re.compile(r'^#include <(.*)>') 2909467b48Spatrick 3009467b48Spatrick DISALLOWED_SYSTEM_HEADERS = ['iostream'] 3109467b48Spatrick 3209467b48Spatrick line_num = 1 3309467b48Spatrick prev_config_header = None 3409467b48Spatrick prev_system_header = None 3509467b48Spatrick for line in lines: 3609467b48Spatrick # TODO: implement private headers 3709467b48Spatrick # TODO: implement gtest headers 3809467b48Spatrick # TODO: implement top-level llvm/* headers 3909467b48Spatrick # TODO: implement llvm/Support/* headers 4009467b48Spatrick 4109467b48Spatrick # Process Config/* headers 4209467b48Spatrick config_header = include_config_re.match(line) 4309467b48Spatrick if config_header: 4409467b48Spatrick curr_config_header = config_header.group(1) 4509467b48Spatrick if prev_config_header: 4609467b48Spatrick if prev_config_header > curr_config_header: 4709467b48Spatrick lint.append((filename, line_num, 4809467b48Spatrick 'Config headers not in order: "%s" before "%s"' % ( 4909467b48Spatrick prev_config_header, curr_config_header))) 5009467b48Spatrick 5109467b48Spatrick # Process system headers 5209467b48Spatrick system_header = include_system_re.match(line) 5309467b48Spatrick if system_header: 5409467b48Spatrick curr_system_header = system_header.group(1) 5509467b48Spatrick 56097a140dSpatrick # Is it disallowed? 5709467b48Spatrick if curr_system_header in DISALLOWED_SYSTEM_HEADERS: 5809467b48Spatrick lint.append((filename, line_num, 5909467b48Spatrick 'Disallowed system header: <%s>' % curr_system_header)) 6009467b48Spatrick elif prev_system_header: 6109467b48Spatrick # Make sure system headers are alphabetized amongst themselves 6209467b48Spatrick if prev_system_header > curr_system_header: 6309467b48Spatrick lint.append((filename, line_num, 6409467b48Spatrick 'System headers not in order: <%s> before <%s>' % ( 6509467b48Spatrick prev_system_header, curr_system_header))) 6609467b48Spatrick 6709467b48Spatrick prev_system_header = curr_system_header 6809467b48Spatrick 6909467b48Spatrick line_num += 1 7009467b48Spatrick 7109467b48Spatrick return lint 7209467b48Spatrick 7309467b48Spatrick 7409467b48Spatrickclass CppLint(common_lint.BaseLint): 7509467b48Spatrick MAX_LINE_LENGTH = 80 7609467b48Spatrick 7709467b48Spatrick def RunOnFile(self, filename, lines): 7809467b48Spatrick lint = [] 7909467b48Spatrick lint.extend(VerifyIncludes(filename, lines)) 8009467b48Spatrick lint.extend(common_lint.VerifyLineLength(filename, lines, 8109467b48Spatrick CppLint.MAX_LINE_LENGTH)) 8209467b48Spatrick lint.extend(common_lint.VerifyTabs(filename, lines)) 8309467b48Spatrick lint.extend(common_lint.VerifyTrailingWhitespace(filename, lines)) 8409467b48Spatrick return lint 8509467b48Spatrick 8609467b48Spatrick 8709467b48Spatrickdef CppLintMain(filenames): 8809467b48Spatrick all_lint = common_lint.RunLintOverAllFiles(CppLint(), filenames) 8909467b48Spatrick for lint in all_lint: 9009467b48Spatrick print('%s:%d:%s' % (lint[0], lint[1], lint[2])) 9109467b48Spatrick return 0 9209467b48Spatrick 9309467b48Spatrick 9409467b48Spatrickif __name__ == '__main__': 9509467b48Spatrick sys.exit(CppLintMain(sys.argv[1:])) 96