Skip to content

Commit f78ec17

Browse files
committed
プライマリ宣言のリストを作成し、グローバル修飾リストにプライマリではないオーバーロード・特殊化が登録されたらエラーにするようにした
1 parent 63eebbd commit f78ec17

File tree

5 files changed

+232
-19
lines changed

5 files changed

+232
-19
lines changed

.github/workflows/check.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ jobs:
99
matrix:
1010
item:
1111
- {name: code_qualify}
12+
- {name: global_qualify}
1213
- {name: defined_word}
1314
- {name: display_error}
1415
- {name: meta_header}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# GLOBAL_QYALIFY_LIST.txtファイルについて、以下をチェックする:
2+
# 1. プライマリ宣言ではないオーバーロード・特殊化がないこと
3+
4+
import glob
5+
import os
6+
import sys
7+
import re
8+
9+
def convrert_qualify_list(qualify_list: str) -> list:
10+
ls: list(str, str) = []
11+
for line in qualify_list.split("\n"):
12+
stripped_line = line.strip()
13+
if not stripped_line or stripped_line.startswith("#"):
14+
continue
15+
m = re.fullmatch(r'[\*-] (.*?)\[link(.*?)\]', stripped_line)
16+
if m:
17+
ls.append((m.group(1), m.group(2).strip()))
18+
return ls
19+
20+
def check(global_qualify_list_str: str, primary_overload_specialization_list_str: str) -> bool:
21+
found_error: bool = False
22+
23+
global_qualify_list = convrert_qualify_list(global_qualify_list_str)
24+
primary_overload_specialization_list = convrert_qualify_list(primary_overload_specialization_list_str)
25+
26+
for name, link in global_qualify_list:
27+
for primary_name, primary_link in primary_overload_specialization_list:
28+
if name == primary_name:
29+
if not primary_link:
30+
print(f"global_qualify_check: {name} is defined at GLOBAL_QUALIFY_LIST.txt, but the link doe's not have primary declaration.")
31+
found_error = True
32+
elif link != primary_link:
33+
print(f"global_qualify_check: {name} is defined at GLOBAL_QUALIFY_LIST.txt, but the link is not for primary declaration.")
34+
found_error = True
35+
36+
return not found_error
37+
38+
if __name__ == '__main__':
39+
found_error = False
40+
with open("GLOBAL_QUALIFY_LIST.txt") as f:
41+
global_qualify_list = f.read()
42+
with open("PRIMARY_OVERLOAD_SPECIALIZATION.txt") as f:
43+
primary_overload_specialization_list = f.read()
44+
45+
if not check(global_qualify_list, primary_overload_specialization_list):
46+
found_error = True
47+
48+
if found_error:
49+
sys.exit(1)

GLOBAL_QUALIFY_LIST.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
# 7. オーバーロードされている名前は、優先度の高いプライマリ宣言をグローバル修飾リストに登録する
3838
# 7.1 ライブラリごとにオーバーロード・特殊化されているものはグローバル修飾リストに登録せず、個別ページで指定する
3939
# (std::begin/std::end、std::common_typeなど)
40+
# プライマリ宣言されている関数・クラスの一覧は、 PRIMARY_OVERLOAD_SPECIALIZATION.txt を参照
4041

4142
* floating-point-type[italic]
4243
* implementation-defined[italic]

PRIMARY_OVERLOAD_SPECIALIZATION.txt

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
# オーバーロード・特殊化されている関数・クラスのプライマリ宣言を列挙する。
2+
# これら識別子のうち、ここで定義されているリンク以外は、GLOBAL_QUALIFY_LIST.txtに登録してはならない。
3+
# このファイルへの登録ルールとしては、
4+
# 1. ヘッダごとにアルファベット順
5+
# 2. ただし、長い名前を優先して登録する
6+
# 3. プライマリ宣言をどれかひとつに特定できない場合、[link]のように空リンクにする
7+
8+
# <algorithm>
9+
* std::erase_if[link /reference/algorithm/erase_if.md]
10+
# dequeとflat_mapとflat_setとforward_listとlistとmapとsetとstringとunordered_mapとunordered_setとvectorでオーバーロードされている
11+
* std::erase[link /reference/algorithm/erase.md]
12+
# dequeとforward_listとlistとstringとvectorでオーバーロードされている
13+
* std::iter_swap[link /reference/algorithm/iter_swap.md]
14+
# iteratorにもある
15+
* std::swap[link /reference/algorithm/swap.md]
16+
17+
# <atomic>
18+
* std::atomic_compare_exchange_strong_explicit[link /reference/atomic/atomic_compare_exchange_strong_explicit.md]
19+
# memoryでオーバーロードされている
20+
* std::atomic_compare_exchange_strong[link /reference/atomic/atomic_compare_exchange_strong.md]
21+
# memoryでオーバーロードされている
22+
* std::atomic_compare_exchange_weak_explicit[link /reference/atomic/atomic_compare_exchange_weak_explicit.md]
23+
* std::atomic_compare_exchange_weak[link /reference/atomic/atomic_compare_exchange_weak.md]
24+
* std::atomic_exchange[link /reference/atomic/atomic_exchange.md]
25+
* std::atomic_exchange_explicit[link /reference/atomic/atomic_exchange_explicit.md]
26+
* std::atomic_is_lock_free[link /reference/atomic/atomic_is_lock_free.md]
27+
* std::atomic_load_explicit[link /reference/atomic/atomic_load_explicit.md]
28+
* std::atomic_load[link /reference/atomic/atomic_load.md]
29+
* std::atomic_store_explicit[link /reference/atomic/atomic_store_explicit.md]
30+
* std::atomic_store[link /reference/atomic/atomic_store.md]
31+
* std::atomic[link /reference/atomic/atomic.md]
32+
33+
# <cctype>
34+
* std::tolower[link /reference/cctype/tolower.md]
35+
* std::toupper[link /reference/cctype/toupper.md]
36+
37+
# <cmath>
38+
* std::acosh[link /reference/cmath/acosh.md]
39+
# complexでオーバーロードされている
40+
* std::acos[link /reference/cmath/acos.md]
41+
# valarrayとcomplexでオーバーロードされている
42+
* std::asinh[link /reference/cmath/asinh.md]
43+
# complexでオーバーロードされている
44+
* std::asin[link /reference/cmath/asin.md]
45+
# valarrayとcomplexでオーバーロードされている
46+
* std::atan2[link /reference/cmath/atan2.md]
47+
# valarrayでオーバーロードされている
48+
* std::atanh[link /reference/cmath/atanh.md]
49+
# complexでオーバーロードされている
50+
* std::atan (valarrayとcomplexでオーバーロードされている。プライマリはcmath)
51+
* std::ceil[link /reference/cmath/ceil.md]
52+
# chronoでオーバーロードされている
53+
* std::cosh[link /reference/cmath/cosh.md]
54+
# valarrayとcomplexでオーバーロードされている
55+
* std::cos[link /reference/cmath/cos.md]
56+
# valarrayとcomplexでオーバーロードされている
57+
* std::exp[link /reference/cmath/exp.md]
58+
# valarrayとcomplexでオーバーロードされている
59+
* std::floor[link /reference/cmath/floor.md]
60+
# chronoでオーバーロードされている
61+
* std::log10[link /reference/cmath/log10.md]
62+
# valarrayとcomplexでオーバーロードされている
63+
* std::log[link /reference/cmath/log.md]
64+
# valarrayとcomplexでオーバーロードされている
65+
* std::pow[link /reference/cmath/pow.md]
66+
# valarrayとcomplexでオーバーロードされている
67+
* std::round[link /reference/cmath/round.md]
68+
# chronoでオーバーロードされている
69+
* std::sinh[link /reference/cmath/sinh.md]
70+
# complexでオーバーロードされている
71+
* std::sin[link /reference/cmath/sinh.md]
72+
# valarrayとcomplexでオーバーロードされている
73+
* std::sqrt[link /reference/cmath/sqrt.md]
74+
# valarrayとcomplexでオーバーロードされている
75+
* std::tanh[link /reference/cmath/tanh.md]
76+
# valarrayとcomplexでオーバーロードされている
77+
* std::tan[link /reference/cmath/tan.md]
78+
# valarrayとcomplexでオーバーロードされている
79+
80+
# <cstdio>
81+
* std::remove[link /reference/cstdio/remove.md]
82+
# algorithmでオーバーロードされている
83+
84+
# <cstdlib>
85+
* std::abs[link /reference/cstdlib/abs.md]
86+
# cmathとvalarrayとcomplexでオーバーロードされている
87+
88+
# <expected>
89+
* std::unexpected[link /reference/expected/unexpected.md]
90+
# exceptionにもある。先に登録されたのはそちらだが、すでに機能削除されている
91+
92+
# <format>
93+
* std::formatter (いろんなところで特殊化されている。プライマリはformat)
94+
* std::enable_nonlocking_formatter_optimization (chronoで特殊化されている。プライマリはformat)
95+
96+
# <istream>
97+
* operator>>[link /reference/istream/basic_istream/op_istream_free.md]
98+
* あちこちでオーバーロードされている
99+
100+
# <iterator>
101+
* std::begin[link /reference/iterator/begin.md]
102+
* std::end[link /reference/iterator/end.md]
103+
104+
# <memory>
105+
* std::uses_allocator[link /reference/memory/uses_allocator.md]
106+
* flat_mapとflat_setとfutureで特殊化されている
107+
108+
# <ostream>
109+
* operator<<[link /reference/ostream/basic_ostream/op_ostream_free.md]
110+
* あちこちでオーバーロードされている
111+
112+
# <print>
113+
* std::println[link /reference/print/println.md]
114+
* ostreamでオーバーロードされている
115+
* std::print[link /reference/print/print.md]
116+
* ostreamでオーバーロードされている
117+
* std::vprint_unicode[link /reference/print/vprint_unicode.md]
118+
* ostreamでオーバーロードされている
119+
* std::vprint_nonunicode[link /reference/print/vprint_nonunicode.md]
120+
121+
# <system_error>
122+
* is_error_code_enum[link /reference/system_error/is_error_code_enum.md]
123+
# futureで特殊化されている
124+
* make_error_code[link /reference/system_error/make_error_code.md]
125+
# futureでオーバーロードされている
126+
* make_error_condition[link /reference/system_error/make_error_condition.md]
127+
# futureでオーバーロードされている
128+
129+
# <tuple>
130+
* std::tuple_size[link /reference/tuple/tuple_size.md]
131+
# std::arrayとstd::complexが特殊化している
132+
* std::tuple_element[link /reference/tuple/tuple_element.md]
133+
# std::arrayとstd::complexが特殊化している
134+
* std::get[link /reference/tuple/get.md]
135+
# std::arrayとstd::complexとstd::variantがオーバーロードしている
136+
137+
# <type_traits>
138+
* std::basic_common_reference[link /reference/type_traits/basic_common_reference.md]
139+
# tupleとutilityで特殊化されている
140+
* std::common_type[link /reference/type_traits/common_type.md]
141+
# chronoで特殊化されている
142+
143+
# <utility>
144+
* std::move[link /reference/utility/move.md]
145+
146+
147+
* operator==[link]
148+
* operator!=[link]
149+
* operator<=>[link]
150+
* operator<=[link]
151+
* operator<[link]
152+
* operator>=[link]
153+
* operator>[link]
154+
* std::sorted_equivalent_t[link]
155+
# flat_mapとflat_setにある
156+
* std::sorted_unique_t[link]
157+
# flat_mapとflat_setにある
158+
* std::this_thread[link]
159+
# executionとthreadにある

start_editing.md

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,32 +38,35 @@ buildアクションで、MarkdownからHTMLへの変換と、GitHub Pagesへの
3838

3939

4040
#### 自動テスト
41-
- 禁止文字の検出 (detect forbidden charactersアクション)
42-
- ソフトハイフンやゼロ幅スペースなどの禁止された文字が使用されている場合に、エラーが発生する
43-
- 内部リンクの誤り検出 (inner link checkアクション)
44-
- サイト内のリンクが存在しない、または存在しているのに.nolinkを指定している場合にエラーが発生する
45-
- [GitHub Actionsの実行ログ](https://github.com/cpprefjp/site/actions/workflows/check.yml)で、どのページのどのリンクが不正かがわかるので、それを修正すること
41+
- checkアクション
42+
- 禁止文字の検出 (detect forbidden characters)
43+
- ソフトハイフンやゼロ幅スペースなどの禁止された文字が使用されている場合に、エラーが発生する
44+
- 内部リンクの誤り検出 (inner link check)
45+
- サイト内のリンクが存在しない、または存在しているのに.nolinkを指定している場合にエラーが発生する
46+
- [GitHub Actionsの実行ログ](https://github.com/cpprefjp/site/actions/workflows/check.yml)で、どのページのどのリンクが不正かがわかるので、それを修正すること
47+
- コード修飾の誤り検出 (code qualify check)
48+
- コードブロック中のコードを修飾しているのに、その修飾対象がない場合に、エラーが発生する
49+
- [GitHub Actionsの実行ログ](https://github.com/cpprefjp/site/actions/workflows/check.yml)で、どのページのどのコード修飾が不正かがわかるので、それを修正すること
50+
- グローバル修飾リストの誤り検出 (global qualify check)
51+
- `GLOBAL_QUALIFY_LIST.txt`に登録されている識別子のうち、`PRIMARY_OVERLOAD_SPECIALIZATION_LIST.txt`に登録されているプライマリ宣言へのリンク以外が登録されている場合に、エラーが発生する
52+
- 所属ヘッダメタ情報の誤り検出 (meta header check)
53+
- `[meta header]`または`[meta module]`指定が誤っている(ディレクトリ階層と一致しない)場合に、エラーが発生する
54+
- 導入経緯は [PR#1204](https://github.com/cpprefjp/site/issues/1204) を参照
55+
- NGワードの検出 (ngword check)
56+
- 日本語入力環境における典型的な誤入力・誤変換をエラーとして検知する
57+
- 具体的な対象ワードリストは[ngword_check.py](https://github.com/cpprefjp/site/blob/master/.github/workflows/script/ngword_check.py)を参照
58+
- 用語の誤った使い方を検出 (defined word check)
59+
- 用語の許可した使い方、許可しない使い方を列挙し、許可した使い方以外の使われ方をエラーとして検出する
60+
- 具体的な用語、許可した使い方、許可しない使い方は、[defined_word_check.py](https://github.com/cpprefjp/site/blob/master/.github/workflows/script/defined_word_check.py)を参照
61+
- 表示崩れする書き方を検出 (display error check)
62+
- 箇条書きのインデントが4の倍数でない行をエラーとして検出する
4663
- 外部リンク切れを検出 (outer link checkアクション)
4764
- 日本時間で日曜日の23:30に実行される
4865
- 外部リンクのページにアクセスできない (ページが消滅したか、一時的にアクセスできない、などの理由) 場合にエラーとなる
4966
- エラーが発生した場合は、本リポジトリにissueが発行される
5067
- ページが消滅した場合は、代替となるものがあれば差し替え、なければInternet Archiveに変更する
5168
- 一時的にアクセスできない場合は、時間を置いてアクセスできるようになったらissueを閉じる
5269
- 海外からのアクセス (GitHub Actions) を拒否しているページもあるため、そのようなページは個別にチェックから外す ([link_check.py](https://github.com/cpprefjp/site/blob/master/.github/workflows/script/link_check.py)`IGNORE_LIST`に追加する)
53-
- コード修飾の誤り検出 (code qualify checkアクション)
54-
- コードブロック中のコードを修飾しているのに、その修飾対象がない場合に、エラーが発生する
55-
- [GitHub Actionsの実行ログ](https://github.com/cpprefjp/site/actions/workflows/check.yml)で、どのページのどのコード修飾が不正かがわかるので、それを修正すること
56-
- 所属ヘッダメタ情報の誤り検出 (meta header checkアクション)
57-
- `[meta header]`または`[meta module]`指定が誤っている(ディレクトリ階層と一致しない)場合に、エラーが発生する
58-
- 導入経緯は [PR#1204](https://github.com/cpprefjp/site/issues/1204) を参照
59-
- NGワードの検出 (ngword checkアクション)
60-
- 日本語入力環境における典型的な誤入力・誤変換をエラーとして検知する
61-
- 具体的な対象ワードリストは[ngword_check.py](https://github.com/cpprefjp/site/blob/master/.github/workflows/script/ngword_check.py)を参照
62-
- 用語の誤った使い方を検出 (defined word checkアクション)
63-
- 用語の許可した使い方、許可しない使い方を列挙し、許可した使い方以外の使われ方をエラーとして検出する
64-
- 具体的な用語、許可した使い方、許可しない使い方は、[defined_word_check.py](https://github.com/cpprefjp/site/blob/master/.github/workflows/script/defined_word_check.py)を参照
65-
- 表示崩れする書き方を検出 (display error checkアクション)
66-
- 箇条書きのインデントが4の倍数でない行をエラーとして検出する
6770

6871

6972
### 自動反映ツール

0 commit comments

Comments
 (0)