diff options
Diffstat (limited to 'scripts/ScintillaAPIFacer.py')
| -rw-r--r-- | scripts/ScintillaAPIFacer.py | 107 | 
1 files changed, 107 insertions, 0 deletions
| diff --git a/scripts/ScintillaAPIFacer.py b/scripts/ScintillaAPIFacer.py new file mode 100644 index 000000000..1d8463f18 --- /dev/null +++ b/scripts/ScintillaAPIFacer.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +# ScintillaAPIFacer.py - regenerate the ScintillaTypes.h, and ScintillaMessages.h +# from the Scintilla.iface interface definition file. +# Implemented 2019 by Neil Hodgson neilh@scintilla.org +# Requires Python 3.6 or later + +import Face +import FileGenerator + +def HMessages(f): +	out = ["enum class Message {"] +	for name in f.order: +		v = f.features[name] +		if v["Category"] != "Deprecated": +			if v["FeatureType"] in ["fun", "get", "set"]: +				out.append("\t" + name + " = " + v["Value"] + ",") +	out.append("};") +	return out + +deadValues = [ +	"INDIC_CONTAINER", +	"INDIC_IME", +	"INDIC_IME_MAX", +	"INDIC_MAX", +] + +def HEnumerations(f): +	out = [] +	for name in f.order: +		v = f.features[name] +		if v["Category"] != "Deprecated": +			# Only want non-deprecated enumerations and lexers are not part of Scintilla API +			if v["FeatureType"] in ["enu"] and name != "Lexer": +				out.append("") +				prefixes = v["Value"].split() +				#out.append("enum class " + name + " {" + " // " + ",".join(prefixes)) +				out.append("enum class " + name + " {") +				for valueName in f.order: +					prefixMatched = "" +					for p in prefixes: +						if valueName.startswith(p) and valueName not in deadValues: +							prefixMatched = p +					if prefixMatched: +						vEnum = f.features[valueName] +						valueNameNoPrefix = "" +						if valueName in f.aliases: +							valueNameNoPrefix = f.aliases[valueName] +						else: +							valueNameNoPrefix = valueName[len(prefixMatched):] +							if not valueNameNoPrefix:	# Removed whole name +								valueNameNoPrefix = valueName +							if valueNameNoPrefix.startswith("SC_"): +								valueNameNoPrefix = valueNameNoPrefix[len("SC_"):] +						pascalName = Face.PascalCase(valueNameNoPrefix) +						out.append("\t" + pascalName + " = " + vEnum["Value"] + ",") +				out.append("};") + +	out.append("") +	out.append("enum class Notification {") +	for name in f.order: +		v = f.features[name] +		if v["Category"] != "Deprecated": +			if v["FeatureType"] in ["evt"]: +				out.append("\t" + name + " = " + v["Value"] + ",") +	out.append("};") + +	return out + +def HConstants(f): +	# Constants not in an eumeration +	out = [] +	allEnumPrefixes = [ +		"SCE_", # Lexical styles +		"SCI_", # Message number allocation +		"SCEN_", # Notifications sent with WM_COMMAND +	] +	for _n, v in f.features.items(): +		if v["Category"] != "Deprecated": +			# Only want non-deprecated enumerations and lexers are not part of Scintilla API +			if v["FeatureType"] in ["enu"]: +				allEnumPrefixes.extend(v["Value"].split()) +	for name in f.order: +		v = f.features[name] +		if v["Category"] != "Deprecated": +			# Only want non-deprecated enumerations and lexers are not part of Scintilla API +			if v["FeatureType"] in ["val"]: +				hasPrefix = False +				for prefix in allEnumPrefixes: +					if name.startswith(prefix): +						hasPrefix = True +				if not hasPrefix: +					if name.startswith("SC_"): +						name = name[3:] +					type = "int" +					if name == "INVALID_POSITION": +						type = "Position" +					out.append("constexpr " + type + " " + Face.PascalCase(name) + " = " + v["Value"] + ";") +	return out + +def RegenerateAll(root): +	f = Face.Face() +	f.ReadFromFile(root + "include/Scintilla.iface") +	FileGenerator.Regenerate(root + "include/ScintillaMessages.h", "//", HMessages(f)) +	FileGenerator.Regenerate(root + "include/ScintillaTypes.h", "//", HEnumerations(f), HConstants(f)) + +if __name__ == "__main__": +	RegenerateAll("../") | 
