こんにちは、高木です。
前回は関数宣言をPHPで自動生成しました。以前にも関数宣言の自動生成をやりましたが、前回はそれをさらに進歩させてC++にも対応しました。今回は関数宣言に生成したのと同じ配列を使って、関数ヘッダーのコメントを自動生成したいと思います。
関数ヘッダーのコメントを生成するためには、前回の情報を多少は拡張する必要があります。前回の構造体だけでは、その関数がどんな機能を持つかの説明は前回のデータだけでは不十分です。そこで、今回は構造体を次のように拡張することにします。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php $all_of_info = [ 'name' => 'all_off', 'specifier' => 'constexpr', 'template' => [ 'InputIterator' => [ 'class', '反復子の型' ], 'Predicate' => [ 'class', '述語の型' ], ], 'type' => [ [ 'first' => [ 'InputIterator', '先頭要素を指す反復子' ], 'last' => [ 'InputIterator', '末尾要素の次を指す反復子' ], 'pred' => [ 'Predicate', '述語' ], ], [ 'bool', '条件を満たす場合はtrue、それ以外はfalse' ], ], 'doc' => [ 'brief' => '範囲の全要素が条件を満たすかの判定', 'detail' => '範囲[first, last]が空、または全反復子iに対してpred(*i)がtrueのときtrueを、それ以外はfalseを返す。', ], ]; ?> |
配列の最後のキー’doc’が今回拡張した部分です。今回はこの構造体を使って、Doxygenに対応したコメントを生成させます。
さっそくコメントを生成するコードを見ていきましょう。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php function make_doxygen_function_comment(array $info): string { $type = $info['type']; // ドキュメント情報 if (array_key_exists('doc', $info)) $doc = $info['doc']; else $doc = []; $comment = '/**' . PHP_EOL; // 概要 if (array_key_exists('brief', $doc)) $comment .= " * @brief {$doc['brief']}" . PHP_EOL; // テンプレート if (array_key_exists('template', $info)) { foreach ($info['template'] as $key => $value) $comment .= " * @tparam $key {$value[1]}" . PHP_EOL; } // 仮引数 foreach ($type[0] as $key => $value) $comment .= " * @param $key {$value[1]}" . PHP_EOL; // 返却値型の生成 if (count($type) > 1) $comment .= " * @return {$type[1][1]}" . PHP_EOL; if (array_key_exists('detail', $doc)) $comment .= " * {$doc['detail']}" . PHP_EOL; $comment .= ' */' . PHP_EOL; return $comment; } ?> |
make_doxygen_function_comment関数というちょっと長い名前ですが、必要な情報を詰め込むとこんな感じになってしまいます。今回も前回と同様、見通しをよくするためにエラーチェックは行っていません。あらかじめご了承ください。
コメントの形式は /**~*/ を使っていますが、/// を1行ごとに並べてもいいでしょう。その場合はmake_doxygen_function_comment関数を修正する必要がありますが、そうした変更も簡単にできるはずです。
前回と今回作った関数を使って、次のように並べてあげればDoxygenのコメント付きの関数宣言を生成できます。
0 1 2 3 |
<?= make_doxygen_function_comment($all_of_info);?> <?= make_function_declaration($all_of_info);?>; |
せっかくなので生成結果も掲載しておきますね。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * @brief 範囲の全要素が条件を満たすかの判定 * @tparam InputIterator 反復子の型 * @tparam Predicate 述語の型 * @param first 先頭要素を指す反復子 * @param last 末尾要素の次を指す反復子 * @param pred 述語 * @return 条件を満たす場合はtrue、それ以外はfalse * 範囲[first, last]が空、または全反復子iに対してpred(*i)がtrueのときtrueを、それ以外はfalseを返す。 */ template <class InputIterator, class Predicate> constexpr bool all_off(InputIterator first, InputIterator last, Predicate pred); |
こんな感じで、PHPを使った前処理でかなりたくさんのことができます。