コードスタイルガイドライン

Godotのソースコードに投稿する場合は、以下に示すスタイルガイドラインに従ってください。一部のインテグレーションプロセスを介してチェックされ、レビュー担当者から潜在的な問題の修正を求める質問が表示されますので、以下に示すようにシステムをセットアップして、すべてのコミットがガイドラインに従うようにします。

C++およびObjective-C

文書化されたガイドラインはありませんが、開発者によって合意されたコードスタイルは、clang形式のコードビューティファイヤを介して適用されます。 いくつか例を挙げると:

  • インデントと配置は両方ともタブベースです(それぞれ1つと2つのタブ)
  • コンマの後だけでなく、数学演算子と代入演算子の周りに1つのスペース
  • ポインタ演算子と参照演算子は、型名ではなく変数識別子に貼り付けられます
  • ヘッダーのインクルードに関する詳細を参照してください

clang形式で使用されるルールは、Godotリポジトリの.clang形式ファイルで概説されています。

スタイルが周囲のコードと一致し、末尾の空白やスペースベースのインデントを導入しない限り、問題ありません。ただし、定期的に投稿する場合は、すべてのコミットをチェックして自動的に修正するために、clang形式をローカルに設定することを強くお勧めします。

警告

Godotのコードスタイルをサードパーティのコードに適用してはいけません。つまり、Godotのソースツリーには含まれていますが、私たちのプロジェクト用に特別に書かれたものではありません。そのようなコードは通常、独自のスタイルガイド(若しくはその欠如)を持つ異なる上流プロジェクトから来ており、上流リポジトリとの同期を難しくするような違いを導入したくありません。

通常、サードパーティのコードは thirdparty/ フォルダに含まれているため、フォーマットスクリプトから簡単に除外できます。 サードパーティのコードスニペットをGodotファイル内に直接含める必要があるまれなケースでは、 /*clang-format off*/ および /*clang-format on*/ を使用してclang-formatにコードのチャンクを無視させることができます。

clang形式をローカルで使用する

まず、clang-formatをインストールする必要があります。現時点では、Godotのフォーマットと互換性を保つために clang-format 8.x を使用する必要があります。後のバージョンが適している場合がありますが、以前のバージョンにはバグがあり、現在のコードベースのフォーマットが変更される可能性があります。

インストール手順

clang形式をインストールする方法は次のとおりです:

  • Linux: 通常、ディストリビューションによってパッケージ化されたclangツールチェーンですぐに使用できます。ディストリビューションのバージョンが必要なバージョンではない場合、コンパイル済みのバージョンを `LLVMウェブサイト<http://releases.llvm.org/download.html>`__からダウンロードできます。または、Debian派生物を使用している場合は、`upstream repos <http://apt.llvm.org/>`__を使用します。
  • macOSおよびWindows: プリコンパイルされたバイナリは、 LLVM Webサイト<http://releases.llvm.org/download.html>`__からダウンロードできます。バイナリのフォルダへのパスをシステムの ``PATH` 環境変数に追加して、clang-format をすぐに呼び出せるようにする必要があります。

変更にclang-formatを適用する方法はいくつかあります:

手動使用

次のコマンドを使用して、clang形式の1つ以上のファイルを手動で適用できます:

clang-format -i <path/to/file(s)>
  • -i は、変更をファイルに直接書き込む必要があることを意味します(デフォルトではclang形式では、固定バージョンは端末にのみ出力されます)。
  • パスは、次々に、または典型的なUnixシェルのようにワイルドカードを使用して、複数のファイルを指すことができます。 グロブするときは、Godotのツリーにあるコンパイル済みオブジェクト(.oおよび.aファイル)でclang-formatを実行しないように注意してください。 そのため、 core/* よりも core/*.{cpp,h} を使用する方が適切です。

プレコミット フック

使いやすさのために、Gitのプレコミットフックを提供し、すべてのコミットで自動的にclang形式を実行してチェックし、最終的なコミットでその変更を適用できるようにします。

この「フック」は misc/hooks で見つけることができるスクリプトであり、インストール手順については、そのフォルダのREADME.mdを参照してください。

あなたのclang-formatが `` PATH`` にない場合、動作するために正しいバイナリを指すように pre-commit-clang-format を編集する必要があるかもしれません。 このフックはLinuxおよびmacOSでテストされましたが、WindowsのGitシェルでも動作するはずです。

IDEプラグイン

ほとんどのIDEまたはコードエディタには、ファイルを保存するたびに、clang形式を自動的に実行するように構成できる美しいプラグインがあります。

一部のIDE用の美しいプラグインの非網羅的なリストを以下に示します:

(プルリクエストは、テストされたプラグインでこのリストを拡張することを歓迎します。)

ヘッダーのインクルード

新しいC++またはObjective-Cファイルを追加するとき、または既存のファイルに新しいヘッダーを含めるときは、次の規則に従う必要があります:

  • ファイルの最初の行は、別のファイルからコピーアンドペーストされたGodotの著作権ヘッダーとMITライセンスでなければなりません。必ずファイル名を調整してください。
  • .h ヘッダーでは、インクルードガードを FILENAME_H の形式で使用する必要があります。
  • .cpp ファイル(たとえば filename.cpp)では、最初のインクルードはクラスが宣言されているもの(たとえば #include "filename.h")で、その後に分離のための空白行が続く必要があります。
  • 次に、Godot独自のコードベースからヘッダーを取得します。このヘッダーは、アルファベット順(clang-format で強制)に含まれ、ルートフォルダからの相対パスを持ちます。これらのインクルードは引用符で行う必要があります。#include "core/object.h"。 Godotヘッダーのインクルードブロックの後には、分離のために空白行が続く必要があります。
  • 最後に、サードパーティのヘッダー(サードパーティ またはシステムのインクルードパスのいずれか)が次に来るので、< と > をシンボルに含める必要があります。例: #include <png.h>。サードパーティヘッダーのブロックの後には、分離のために空白行が続く必要があります。
  • Godotおよびサードパーティのヘッダーは、それらを必要とするファイルに含める必要があります。つまり、宣言型コードで使用する場合は .h ヘッダーに、命令型コードでのみ使用する場合は ` .cpp` に含める必要があります。

例:

/*************************************************************************/
/*  my_new_file.h                                                        */
/*************************************************************************/
/*                       This file is part of:                           */
/*                           GODOT ENGINE                                */
/*                      https://godotengine.org                          */
/*************************************************************************/
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md)    */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the       */
/* "Software"), to deal in the Software without restriction, including   */
/* without limitation the rights to use, copy, modify, merge, publish,   */
/* distribute, sublicense, and/or sell copies of the Software, and to    */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions:                                             */
/*                                                                       */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/

#ifndef MY_NEW_FILE_H
#define MY_NEW_FILE_H

#include "core/hash_map.h"
#include "core/list.h"
#include "scene/gui/control.h

#include <png.h>

...

#endif // MY_NEW_FILE_H
/*************************************************************************/
/*  my_new_file.cpp                                                      */
/*************************************************************************/
/*                       This file is part of:                           */
/*                           GODOT ENGINE                                */
/*                      https://godotengine.org                          */
/*************************************************************************/
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md)    */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the       */
/* "Software"), to deal in the Software without restriction, including   */
/* without limitation the rights to use, copy, modify, merge, publish,   */
/* distribute, sublicense, and/or sell copies of the Software, and to    */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions:                                             */
/*                                                                       */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/

#include "my_new_file.h"

#include "core/math/math_funcs.h"
#include "scene/gui/line_edit.h

#include <zlib.h>
#include <zstd.h>

Java

GodotのJavaコード(ほとんどが platform/android にあります)も clang-format を介して適用されるため、上記の手順を参照して設定してください。このスタイルガイドはGodotによって記述および管理されるコードにのみ適用され、java/src/com/google サブフォルダなどのサードパーティコードには適用されないことに注意してください。

Python

GodotのSConsビルドシステムはPythonで書かれており、ソースツリーに含まれる様々なスクリプトもPythonを使用しています。

それらについては、`PEP-8スタイルガイド<https://www.python.org/dev/peps/pep-0008/>`__に従いますが、これはC++コードほど強力ではありません。そうしたい場合は、`autopep8 <https://pypi.org/project/autopep8/>`__を使用してPythonの変更を確認およびフォーマットできます。