Skip to content

Commit 0f008b4

Browse files
committed
グローバル修飾リストの自動ソートスクリプトを追加
1 parent 9127cd7 commit 0f008b4

File tree

3 files changed

+281
-157
lines changed

3 files changed

+281
-157
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# グローバル修飾リストと、プライマリオーバーロード特殊化リストをソートするスクリプト
2+
# トップディレクトリで以下を実行する:
3+
# python3 .github/workflows/script/sort_global_qualify.py
4+
#
5+
# GLOBAL_QUALIFY_LIST.txtのソートルール:
6+
# 1. コメントグループと修飾グループに分ける
7+
# 2. コメントグループはそのままの順序で、修飾グループはヘッダの辞書順にソートする
8+
# 3. 修飾グループ内では、以下のルールでソートする:
9+
# 3.1. 名前空間が深い順にソートする (::の数が多い順)
10+
# 3.2. 長い名前順にソートする ("abc"と"abcdef"では後者を優先)
11+
# 3.3. 大文字・小文字を区別する
12+
#
13+
# PRIMARY_OVERLOAD_SPECIALIZATION.txtのソートルール:
14+
# 1. 空行でグループを分ける
15+
# 1.1. 先頭行が`# header`で始まらないグループはコメントグループとみなし、位置を維持する
16+
# 1.2. そうではないグループは、修飾グループとみなす
17+
# 2. 修飾グループ内では、GLOBAL_QUALIFY_LIST.txtと同様のルールでソートする
18+
19+
from enum import Enum
20+
import os
21+
22+
class Group(Enum):
23+
NONE = 0
24+
COMMENT = 1
25+
QUALIFY = 2
26+
27+
def flatten(arr: list[list[str]]) -> list[str]:
28+
return sum(arr, [])
29+
30+
def load_global_qualify_list() -> list[list[str]]:
31+
ls: list[list[str]] = []
32+
with open('GLOBAL_QUALIFY_LIST.txt', 'r', encoding='utf-8') as f:
33+
file = f.read()
34+
group_type = Group.NONE
35+
group: list[str] = []
36+
for line in file.split("\n"):
37+
if not line:
38+
continue
39+
40+
if line.startswith("#"):
41+
if group_type != Group.COMMENT:
42+
group_type = Group.COMMENT
43+
if len(group) > 0:
44+
ls.append(group)
45+
group = []
46+
group.append(line)
47+
else:
48+
if group_type != Group.QUALIFY:
49+
group_type = Group.QUALIFY
50+
if len(group) > 0:
51+
ls.append(group)
52+
group = []
53+
elif not line.startswith(" "):
54+
if len(group) > 0:
55+
ls.append(group)
56+
group = []
57+
group.append(line)
58+
59+
if len(group) > 0:
60+
ls.append(group)
61+
return ls
62+
63+
def get_inner_sort_key(x: str) -> tuple:
64+
y = x.split("[")[0]
65+
return (y.startswith(" "), -y.count("::"), -len(y), y)
66+
67+
def sort_global_qualify_list():
68+
ls = load_global_qualify_list()
69+
70+
outer_sorted = sorted(ls, key=lambda x: (not x[0].startswith("#"), x[0]))
71+
inner_sorted = []
72+
for group in outer_sorted:
73+
if group[0].startswith("#"):
74+
inner_sorted.append(group)
75+
else:
76+
inner_sorted.append(sorted(group, key=get_inner_sort_key))
77+
return flatten(inner_sorted)
78+
79+
def execute_sort_global_qualify_list():
80+
sorted_ls = sort_global_qualify_list()
81+
with open('GLOBAL_QUALIFY_LIST.txt', 'w', encoding='utf-8') as f:
82+
f.write("\n".join(sorted_ls))
83+
84+
def load_primary_list() -> list[list[str]]:
85+
ls: list[list[str]] = []
86+
with open('PRIMARY_OVERLOAD_SPECIALIZATION.txt', 'r', encoding='utf-8') as f:
87+
file = f.read()
88+
group_type = Group.NONE
89+
group: list[str] = []
90+
for line in file.split("\n"):
91+
if not line:
92+
if len(group) > 0:
93+
ls.append(group)
94+
group = []
95+
continue
96+
97+
group.append(line)
98+
99+
if len(group) > 0:
100+
ls.append(group)
101+
return ls
102+
103+
def sort_primary_list():
104+
ls = load_primary_list()
105+
106+
outer_sorted = sorted(ls, key=lambda x: (x[0].startswith("# header"), x[0]))
107+
inner_sorted = []
108+
for group in outer_sorted:
109+
if group[0].startswith("#"):
110+
inner_sorted.append(group)
111+
else:
112+
inner_sorted.append(sorted(group, key=get_inner_sort_key))
113+
inner_sorted.append([""])
114+
return flatten(inner_sorted)
115+
116+
def execute_sort_primary_list():
117+
sorted_ls = sort_primary_list()
118+
with open('PRIMARY_OVERLOAD_SPECIALIZATION.txt', 'w', encoding='utf-8') as f:
119+
f.write("\n".join(sorted_ls))
120+
121+
if __name__ == '__main__':
122+
execute_sort_global_qualify_list()
123+
execute_sort_primary_list()

0 commit comments

Comments
 (0)