notepad-plus-plus/scintilla/scripts/HeaderCheck.py

93 lines
3.2 KiB
Python

# Script to check that headers are in a consistent order
# Requires Python 2.6 or later
from __future__ import print_function
import codecs, glob, os, platform, sys, unicodedata
def ciCompare(a,b):
return cmp(a.lower(), b.lower())
def ciKey(a):
return a.lower()
def SortListInsensitive(l):
try: # Try key function
l.sort(key=ciKey)
except TypeError: # Earlier version of Python, so use comparison function
l.sort(ciCompare)
def IsHeader(x):
return x.strip().startswith("#") and ("include" in x or "import" in x)
def ExtractHeaders(filename):
with codecs.open(filename, "r", "UTF-8") as infile:
includeLines = [x.strip()[1:].strip()[7:].strip() for x in infile.readlines() if \
IsHeader(x)]
if '.' not in filename:
print(filename)
for n in includeLines:
print(n)
print()
return includeLines
def CheckFiles(root):
# Find all the lexer source code files
filePaths = glob.glob(root + "/include/*.h")
filePaths += glob.glob(root + "/src/*.cxx")
SortListInsensitive(filePaths)
filePaths += glob.glob(root + "/lexlib/*.cxx")
filePaths += glob.glob(root + "/lexers/*.cxx")
filePaths += glob.glob(root + "/win32/*.cxx")
filePaths += glob.glob(root + "/gtk/*.cxx")
filePaths += glob.glob(root + "/cocoa/*.mm")
filePaths += glob.glob(root + "/cocoa/*.h")
filePaths += glob.glob(root + "/test/unit/*.cxx")
# The Qt platform code interleaves system and Scintilla headers
#~ filePaths += glob.glob(root + "/qt/ScintillaEditBase/*.cpp")
#~ filePaths += glob.glob(root + "/qt/ScintillaEdit/*.cpp")
#~ print(filePaths)
masterHeaderList = ExtractHeaders(root + "/scripts/HeaderOrder.txt")
for f in filePaths:
if "LexCaml" in f:
continue
print(" File ", f)
try:
incs = ExtractHeaders(f)
except UnicodeDecodeError:
#~ print("UnicodeDecodeError\n")
continue
#~ print("\n".join(incs))
news = set(incs) - set(masterHeaderList)
#~ print("")
#~ print("\n".join(incs))
#~ print("")
ended = False
m = 0
i = 0
while i < len(incs):
if m == len(masterHeaderList):
print("**** extend", incs[i:])
masterHeaderList.extend(incs[i:])
break
if masterHeaderList[m] == incs[i]:
#~ print("equal", masterHeaderList[m])
i += 1
m += 1
else:
if masterHeaderList[m] not in incs:
#~ print("skip", masterHeaderList[m])
m += 1
elif incs[i] not in masterHeaderList:
print(f + ":1: Add master", incs[i])
masterHeaderList.insert(m, incs[i])
i += 1
m += 1
else:
print(f + ":1: Header out of order", incs[i], masterHeaderList[m])
print("incs", " ".join(incs))
i += 1
#~ return
#print("Master header list", " ".join(masterHeaderList))
CheckFiles("..")