Skip to content

Commit

Permalink
Add type annotations to LocaleDataWriter
Browse files Browse the repository at this point in the history
Task-number: QTBUG-128634
Pick-to: 6.8
Change-Id: I63e4db06d92e7c2457a802f93372545f9ae749f1
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
  • Loading branch information
Mate Barany committed Oct 21, 2024
1 parent beda65b commit 001f8b3
Showing 1 changed file with 21 additions and 17 deletions.
38 changes: 21 additions & 17 deletions util/locale_database/qlocalexml2cpp.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

from qlocalexml import Locale, QLocaleXmlReader
from localetools import *
from iso639_3 import LanguageCodeData
from iso639_3 import LanguageCodeData, LanguageCodeEntry
from zonedata import utcIdList, windowsIdList


Expand Down Expand Up @@ -603,23 +603,25 @@ def writeTables(self) -> None:


class LocaleDataWriter (LocaleSourceEditor):
def likelySubtags(self, likely):
def likelySubtags(self, likely: Iterator[tuple[str, tuple, str, tuple]]) -> None:
# Sort order of likely is taken care of upstream.
self.writer.write('static constexpr QLocaleId likely_subtags[] = {\n')
# have and give are both triplets of ints
for had, have, got, give in likely:
self.writer.write(' {{ {:3d}, {:3d}, {:3d} }}'.format(*have))
self.writer.write(', {{ {:3d}, {:3d}, {:3d} }},'.format(*give))
self.writer.write(f' // {had} -> {got}\n')
self.writer.write('};\n\n')

def localeIndex(self, indices):
def localeIndex(self, indices: Iterator[tuple[int, str]]) -> None:
self.writer.write('static constexpr quint16 locale_index[] = {\n')
for index, name in indices:
self.writer.write(f'{index:6d}, // {name}\n')
self.writer.write(' 0 // trailing 0\n')
self.writer.write('};\n\n')

def localeData(self, locales, names):
def localeData(self, locales: dict[tuple[int, int, int], Locale],
names: list[tuple[int, int, int]]) -> None:
list_pattern_part_data = StringData('list_pattern_part_data')
single_character_data = StringData('single_character_data')
date_format_data = StringData('date_format_data')
Expand Down Expand Up @@ -724,9 +726,10 @@ def localeData(self, locales, names):
',{:6d}' * 3,
' }}')).format
for key in names:
locale = locales[key]
locale: Locale = locales[key]
# Sequence of StringDataToken:
ranges = (tuple(list_pattern_part_data.append(p) for p in # 5 entries:
ranges: tuple[StringDataToken, ...] = (
tuple(list_pattern_part_data.append(p) for p in # 5 entries:
(locale.listPatternPartStart, locale.listPatternPartMiddle,
locale.listPatternPartEnd, locale.listPatternPartTwo,
locale.listDelim)) +
Expand Down Expand Up @@ -783,7 +786,7 @@ def localeData(self, locales, names):
data.write(self.writer.write)

@staticmethod
def __writeNameData(out, book, form):
def __writeNameData(out, book: dict[int, tuple[str, str, str]], form: str) -> None:
out(f'static constexpr char {form}_name_list[] =\n')
out('"Default\\0"\n')
for key, value in book.items():
Expand All @@ -807,47 +810,48 @@ def __writeNameData(out, book, form):
out('};\n\n')

@staticmethod
def __writeCodeList(out, book, form, width):
def __writeCodeList(out, book: dict[int, tuple[str, str, str]], form: str, width: int) -> None:
out(f'static constexpr unsigned char {form}_code_list[] =\n')
for key, value in book.items():
code = value[1]
code += r'\0' * max(width - len(code), 0)
out(f'"{code}" // {value[0]}\n')
out(';\n\n')

def languageNaming(self, languages, code_data: LanguageCodeData):
def languageNaming(self, languages: dict[int, tuple[str, str, str]],
code_data: LanguageCodeData) -> None:
self.__writeNameData(self.writer.write, languages, 'language')
out = self.writer.write
out: Callable[[str], int] = self.writer.write

out(f'constexpr std::array<LanguageCodeEntry, {len(languages)}> languageCodeList {{\n')

def q(val: Optional[str], size: int) -> str:
"""Quote the value and adjust the result for tabular view."""
s = '' if val is None else ', '.join(f"'{c}'" for c in val)
s: str = '' if val is None else ', '.join(f"'{c}'" for c in val)
return f'{{{s}}}' if size == 0 else f'{{{s}}},'.ljust(size * 5 + 2)

for key, value in languages.items():
code = value[1]
code: str = value[1]
if key < 2:
result = code_data.query('und')
result: LanguageCodeEntry = code_data.query('und')
else:
result = code_data.query(code)
result: LanguageCodeEntry = code_data.query(code)
assert code == result.id()
assert result is not None

codeString = q(result.part1Code, 2)
codeString: str = q(result.part1Code, 2)
codeString += q(result.part2BCode, 3)
codeString += q(result.part2TCode, 3)
codeString += q(result.part3Code, 0)
out(f' LanguageCodeEntry {{{codeString}}}, // {value[0]}\n')

out('};\n\n')

def scriptNaming(self, scripts):
def scriptNaming(self, scripts: dict[int, tuple[str, str, str]]) -> None:
self.__writeNameData(self.writer.write, scripts, 'script')
self.__writeCodeList(self.writer.write, scripts, 'script', 4)

def territoryNaming(self, territories):
def territoryNaming(self, territories: dict[int, tuple[str, str, str]]) -> None:
self.__writeNameData(self.writer.write, territories, 'territory')
self.__writeCodeList(self.writer.write, territories, 'territory', 3)

Expand Down

0 comments on commit 001f8b3

Please sign in to comment.