aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/HeaderCheck.py64
-rw-r--r--scripts/HeaderOrder.txt53
2 files changed, 48 insertions, 69 deletions
diff --git a/scripts/HeaderCheck.py b/scripts/HeaderCheck.py
index 29dc4fba3..1349c3b20 100644
--- a/scripts/HeaderCheck.py
+++ b/scripts/HeaderCheck.py
@@ -1,23 +1,9 @@
#!/usr/bin/env python3
# Script to check that headers are in a consistent order
-# Canonical header order is defined in scripts/HeaderOrder.txt
+# Canonical header order is defined in a file, normally scripts/HeaderOrder.txt
# Requires Python 3.6 or later
-import pathlib
-
-patterns = [
- "include/*.h",
- "src/*.cxx",
- "lexlib/*.cxx",
- "lexers/*.cxx",
- "win32/*.cxx",
- "gtk/*.cxx",
- "cocoa/*.mm",
- "cocoa/*.h",
- "test/unit/*.cxx",
- "lexilla/src/*.cxx",
- "lexilla/test/*.cxx",
-]
+import pathlib, sys
def IsHeader(x):
return x.strip().startswith("#") and \
@@ -28,32 +14,41 @@ def HeaderFromIncludeLine(s):
#\s*#\s*(include|import)\s+\S+\s*
return s.strip()[1:].strip()[7:].strip()
-def ExtractHeaders(filename):
- with filename.open(encoding="cp437") as infile:
+def ExtractHeaders(file):
+ with file.open(encoding="cp437") as infile:
return [HeaderFromIncludeLine(l) for l in infile if IsHeader(l)]
-def ExcludeName(name):
- # LexCaml adds system headers in #if to be an external lexer
- # moc_ files are generated by Qt and follow its rules
- return "LexCaml" in name or "moc_" in name
+def ExtractWithPrefix(file, prefix):
+ with file.open(encoding="cp437") as infile:
+ return [l.strip()[len(prefix):] for l in infile if l.startswith(prefix)]
+
+def ExcludeName(name, excludes):
+ return any(exclude in name for exclude in excludes)
def SortLike(incs, order):
return sorted(incs, key = lambda i: order.index(i))
-def CheckFiles(root):
- # Find all the lexer source code files
+basePrefix = "//base:"
+sourcePrefix = "//source:"
+excludePrefix = "//exclude:"
+
+def CheckFiles(headerOrderTxt):
+ headerOrderFile = pathlib.Path(headerOrderTxt).resolve()
+ bases = ExtractWithPrefix(headerOrderFile, basePrefix)
+ base = bases[0] if len(bases) > 0 else ".."
+ orderDirectory = headerOrderFile.parent
+ root = (orderDirectory / base).resolve()
+
+ # Find all the source code files
+ patterns = ExtractWithPrefix(headerOrderFile, sourcePrefix)
+ excludes = ExtractWithPrefix(headerOrderFile, excludePrefix)
+
filePaths = []
for p in patterns:
filePaths += root.glob(p)
- # The Qt platform code interleaves system and Scintilla headers
- #~ filePaths += root.glob("qt/ScintillaEditBase/*.cpp")
- #~ filePaths += root.glob("qt/ScintillaEdit/*.cpp")
- #~ print(filePaths)
- scriptDirectory = root / "scripts"
- headerOrderFile = scriptDirectory / "HeaderOrder.txt"
headerOrder = ExtractHeaders(headerOrderFile)
originalOrder = headerOrder[:]
- orderedPaths = [p for p in sorted(filePaths) if not ExcludeName(str(p))]
+ orderedPaths = [p for p in sorted(filePaths) if not ExcludeName(str(p), excludes)]
allIncs = set()
for f in orderedPaths:
print(" File ", f.relative_to(root))
@@ -105,7 +100,7 @@ def CheckFiles(root):
if headerOrder != originalOrder:
newIncludes = set(headerOrder) - set(originalOrder)
- headerOrderNew = scriptDirectory / "NewOrder.txt"
+ headerOrderNew = orderDirectory / "NewOrder.txt"
print(f"{headerOrderFile}:1: changed to {headerOrderNew}")
print(f" Added {', '.join(newIncludes)}.")
with headerOrderNew.open("w") as headerOut:
@@ -117,4 +112,7 @@ def CheckFiles(root):
print("In HeaderOrder.txt but not used")
print("\n".join(unused))
-CheckFiles(pathlib.Path(__file__).resolve().parent.parent)
+if len(sys.argv) > 1:
+ CheckFiles(sys.argv[1])
+else:
+ CheckFiles("HeaderOrder.txt")
diff --git a/scripts/HeaderOrder.txt b/scripts/HeaderOrder.txt
index 1f61d5440..23aaad9f8 100644
--- a/scripts/HeaderOrder.txt
+++ b/scripts/HeaderOrder.txt
@@ -2,15 +2,26 @@
// All platform headers should be included before Scintilla headers
// and each of these groups are then divided into directory groups.
+// Base of the repository relative to this file
+
+//base:..
+
+// File patterns to check:
+//source:include/*.h
+//source:src/*.cxx
+//source:lexlib/*.cxx
+//source:lexers/*.cxx
+//source:win32/*.cxx
+//source:gtk/*.cxx
+//source:cocoa/*.mm
+//source:cocoa/*.h
+//source:test/unit/*.cxx
+//source:lexilla/src/*.cxx
+//source:lexilla/test/*.cxx
+
// C standard library
#include <stddef.h>
-#include <stdlib.h>
#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <ctype.h>
// C++ wrappers of C standard library
#include <cstddef>
@@ -18,7 +29,6 @@
#include <cstdint>
#include <cassert>
#include <cstring>
-#include <cctype>
#include <cstdio>
#include <cstdarg>
#include <ctime>
@@ -28,12 +38,10 @@
// C++ standard library
#include <stdexcept>
#include <new>
-#include <utility>
#include <string>
#include <string_view>
#include <vector>
#include <map>
-#include <set>
#include <forward_list>
#include <algorithm>
#include <iterator>
@@ -44,9 +52,7 @@
#include <regex>
#include <iostream>
#include <sstream>
-#include <fstream>
#include <mutex>
-#include <filesystem>
// POSIX
#include <dlfcn.h>
@@ -91,30 +97,11 @@
#include "Scintilla.h"
#include "ScintillaWidget.h"
-#include "SciLexer.h"
-
// lexlib
-#include "StringCopy.h"
-#include "PropSetSimple.h"
-#include "WordList.h"
-#include "LexAccessor.h"
-#include "Accessor.h"
-#include "StyleContext.h"
#include "CharacterSet.h"
#include "CharacterCategory.h"
-#include "LexerModule.h"
-#include "CatalogueModules.h"
-#include "OptionSet.h"
-#include "SparseState.h"
-#include "SubStyles.h"
-#include "DefaultLexer.h"
-#include "LexerBase.h"
-#include "LexerSimple.h"
-#include "LexerNoExceptions.h"
// src
-#include "Catalogue.h"
-
#include "Position.h"
#include "IntegerRectangle.h"
#include "UniqueString.h"
@@ -152,12 +139,6 @@
#include "AutoComplete.h"
#include "ScintillaBase.h"
-#include "ExternalLexer.h"
-
-#include "Lexilla.h"
-#include "TestDocument.h"
-#include "LexillaAccess.h"
-
// Platform-specific headers
// win32