blob: 6a824e8a4abd0593fb6a3e51cf0800d8a1f57c12 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright (C) 2015 Igalia S.L.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with this library; see the file COPYING.LIB. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
import os, sys
from webkitpy.common.host import Host
PLATFORM_GENERATED_HEADERS = ("HTTPHeaderNames.h")
def get_platform_headers(platform_dir):
platform_headers = ["config.h"]
for root, dirs, files in os.walk(platform_dir):
for file_name in files:
if file_name.endswith(".h"):
platform_headers.append(file_name)
return platform_headers
def check_source_file(source_file, checkout_root, platform_headers):
failures_found = 0
line_count = 0
f = open(source_file, 'r')
for line in f.readlines():
line_count += 1
if line[0] != '#':
continue
tokens = line.split(' ')
if tokens[0] not in ('#include', '#import'):
continue
header = tokens[1]
if header[0] != '"':
continue
header = header[1:header.rfind('"')]
if not header.endswith('.h'):
continue
if header not in platform_headers and header not in PLATFORM_GENERATED_HEADERS:
print("ERROR: %s:%d %s" % (source_file[len(checkout_root) + 1:], line_count, line.strip('\n')))
failures_found += 1
f.close()
return failures_found
host = Host()
host.initialize_scm()
checkout_root = host.scm().checkout_root
platform_dir = os.path.join(checkout_root, "Source", "WebCore", "platform")
platform_headers = get_platform_headers(platform_dir)
layering_violations_count = 0
for root, dirs, files in os.walk(platform_dir):
for file_name in files:
if os.path.splitext(file_name)[1] in ('.cpp', '.mm'):
layering_violations_count += check_source_file(os.path.join(root, file_name), checkout_root, platform_headers)
if layering_violations_count:
print("Total: %d layering violations found in %s" % (layering_violations_count, platform_dir[len(checkout_root) + 1:]))
sys.exit(1)
sys.exit(0)