summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMate Barany <[email protected]>2024-09-16 16:31:58 +0200
committerMate Barany <[email protected]>2024-10-17 19:03:18 +0200
commitc1ffb6e7515621a953b5ebf19c384b27df785d73 (patch)
tree47a3bb1683412d937dd6623cbd2b78b416c0cdbe
parent5be7b99a160a4cc973fcd82e3ab15e4272814b14 (diff)
Add type annotations to ByteArrayData, StringDataToken and StringData
Add some type hints to unicode2hex as well, it is used by ByteArrayData. Task-number: QTBUG-128634 Pick-to: 6.8 Change-Id: I86b7ce8567483bf8a4d4db78c9585652526cb90d Reviewed-by: Edward Welbourne <[email protected]>
-rw-r--r--util/locale_database/localetools.py10
-rwxr-xr-xutil/locale_database/qlocalexml2cpp.py57
2 files changed, 34 insertions, 33 deletions
diff --git a/util/locale_database/localetools.py b/util/locale_database/localetools.py
index 175b04e99c0..88f152c910a 100644
--- a/util/locale_database/localetools.py
+++ b/util/locale_database/localetools.py
@@ -42,15 +42,15 @@ def qtVersion(root = qtbase_root, pfx = 'set(QT_REPO_MODULE_VERSION '):
raise Error(f'Failed to find {pfx}...) line in {root.joinpath(".cmake.conf")}')
qtVersion = qtVersion()
-def unicode2hex(s):
- lst = []
+def unicode2hex(s: str) -> list[str]:
+ lst: list[str] = []
for x in s:
- v = ord(x)
+ v: int = ord(x)
if v > 0xFFFF:
# make a surrogate pair
# copied from qchar.h
- high = (v >> 10) + 0xd7c0
- low = (v % 0x400 + 0xdc00)
+ high: int = (v >> 10) + 0xd7c0
+ low: int = (v % 0x400 + 0xdc00)
lst.append(hex(high))
lst.append(hex(low))
else:
diff --git a/util/locale_database/qlocalexml2cpp.py b/util/locale_database/qlocalexml2cpp.py
index f0adabfcbf1..d77403ef95d 100755
--- a/util/locale_database/qlocalexml2cpp.py
+++ b/util/locale_database/qlocalexml2cpp.py
@@ -17,7 +17,7 @@ The ISO 639-3 data file can be downloaded from the SIL website:
import datetime
import argparse
from pathlib import Path
-from typing import Iterator, Optional
+from typing import Callable, Iterator, Optional
from qlocalexml import QLocaleXmlReader
from localetools import *
@@ -66,13 +66,14 @@ class LocaleKeySorter:
class ByteArrayData:
# Only for use with ASCII data, e.g. IANA IDs.
- def __init__(self):
- self.data, self.hash = [], {}
+ def __init__(self) -> None:
+ self.data: list[str] = []
+ self.hash: dict[str, int] = {}
- def lookup(self, s):
+ def lookup(self, s: str) -> int:
return self.append(s, False)
- def append(self, s, create = True):
+ def append(self, s: str, create: bool = True) -> int:
assert s.isascii(), s
s += '\0'
if s in self.hash:
@@ -80,21 +81,21 @@ class ByteArrayData:
if not create:
raise Error(f'Entry "{s[:-1]}" missing from reused table !')
- index = len(self.data)
+ index: int = len(self.data)
if index > 0xffff:
raise Error(f'Index ({index}) outside the uint16 range !')
self.hash[s] = index
self.data += unicode2hex(s)
return index
- def write(self, out, name):
+ def write(self, out: Callable[[str], int], name: str) -> None:
out(f'\nstatic constexpr char {name}[] = {{\n')
out(wrap_list(self.data, 16)) # 16 == 100 // len('0xhh, ')
# All data is ASCII, so only two-digit hex is ever needed.
out('\n};\n')
class StringDataToken:
- def __init__(self, index, length, lenbits, indbits):
+ def __init__(self, index: int, length: int, lenbits: int, indbits: int) -> None:
if index >= (1 << indbits):
raise ValueError(f'Start-index ({index}) exceeds the {indbits}-bit range!')
if length >= (1 << lenbits):
@@ -106,27 +107,27 @@ class StringDataToken:
# Would tables benefit from pre-population, one script at a time ?
# That might improve the chances of match-ups in store.
class StringData:
- def __init__(self, name, lenbits = 8, indbits = 16):
- self.data = []
- self.hash = {}
+ def __init__(self, name: str, lenbits: int = 8, indbits: int = 16) -> None:
+ self.data: list[str] = []
+ self.hash: dict[str, StringDataToken] = {}
self.name = name
self.text = '' # Used in quick-search for matches in data
- self.__bits = lenbits, indbits
+ self.__bits: tuple[int, int] = lenbits, indbits
- def end(self):
+ def end(self) -> StringDataToken:
return StringDataToken(len(self.data), 0, *self.__bits)
- def append(self, s):
+ def append(self, s: str) -> StringDataToken:
try:
- token = self.hash[s]
+ token: StringDataToken = self.hash[s]
except KeyError:
- token = self.__store(s)
+ token: StringDataToken = self.__store(s)
self.hash[s] = token
return token
# The longMetaZoneName table grows to c. 0xe061c bytes, making the
# searching here rather expensive.
- def __store(self, s):
+ def __store(self, s: str) -> StringDataToken:
"""Add string s to known data.
Seeks to avoid duplication, where possible.
@@ -134,9 +135,9 @@ class StringData:
"""
if not s:
return StringDataToken(0, 0, *self.__bits)
- ucs2 = unicode2hex(s)
+ ucs2: list[str] = unicode2hex(s)
try:
- index = self.text.index(s) - 1
+ index: int = self.text.index(s) - 1
matched = 0
while matched < len(ucs2):
index, matched = self.data.index(ucs2[0], index + 1), 1
@@ -156,17 +157,17 @@ class StringData:
e.args += (self.name, s)
raise
- def write(self, fd):
- indbits = self.__bits[1]
+ def write(self, out: Callable[[str], int]) -> None:
+ indbits: int = self.__bits[1]
if len(self.data) >= (1 << indbits):
raise ValueError(f'Data is too big ({len(self.data)}) '
f'for {indbits}-bit index to its end!',
self.name)
- fd.write(f"\nstatic constexpr char16_t {self.name}[] = {{\n")
- fd.write(wrap_list(self.data, 12)) # 12 == 100 // len('0xhhhh, ')
- fd.write("\n};\n")
+ out(f"\nstatic constexpr char16_t {self.name}[] = {{\n")
+ out(wrap_list(self.data, 12)) # 12 == 100 // len('0xhhhh, ')
+ out("\n};\n")
-def currencyIsoCodeData(s):
+def currencyIsoCodeData(s: str) -> str:
if s:
return '{' + ",".join(str(ord(x)) for x in s) + '}'
return "{0,0,0}"
@@ -583,7 +584,7 @@ class LocaleZoneDataWriter (LocaleSourceEditor):
self.__longZoneNameTable,
self.__shortMetaZoneNameTable,
self.__longMetaZoneNameTable):
- data.write(self.writer)
+ data.write(self.writer.write)
self.writer.write('\n')
@@ -765,7 +766,7 @@ class LocaleDataWriter (LocaleSourceEditor):
byte_unit_data, am_data, pm_data, currency_symbol_data,
currency_display_name_data, currency_format_data,
endonyms_data):
- data.write(self.writer)
+ data.write(self.writer.write)
@staticmethod
def __writeNameData(out, book, form):
@@ -883,7 +884,7 @@ class CalendarDataWriter (LocaleSourceEditor):
self.writer.write(self.formatCalendar(*( (0,) * (3 + 6 * 2) ))
+ '// trailing zeros\n')
self.writer.write('};\n')
- months_data.write(self.writer)
+ months_data.write(self.writer.write)
class TestLocaleWriter (LocaleSourceEditor):