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

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

C++およびObjective-C

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

  • インデントと配置は両方ともタブベースです(それぞれ1つと2つのタブ)
  • コンマの後だけでなく、数学演算子と代入演算子の周りに1つのスペース
  • ポインタ演算子と参照演算子は、型名ではなく変数識別子に貼り付けられます
  • See further down regarding header includes

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

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

警告

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

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

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

First of all, you will need to install clang-format. As of now, you need to use clang-format 8.x to be compatible with Godot's format. Later versions might be suitable, but previous versions had bugs that will cause formatting changes to the current code base.

インストール手順

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

  • Linux: It will usually be available out-of-the-box with the clang toolchain packaged by your distribution. If your distro version is not the required one, you can download a pre-compiled version from the LLVM website, or if you are on a Debian derivative, use the upstream repos.
  • macOS and Windows: You can download precompiled binaries from the LLVM website. You may need to add the path to the binary's folder to your system's PATH environment variable to be able to call clang-format out of the box.

変更に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用の美しいプラグインの非網羅的なリストを以下に示します:

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

Header includes

When adding new C++ or Objective-C files or including new headers in existing ones, the following rules should be followed:

  • The first lines in the file should be Godot's copyright header and MIT license, copy-pasted from another file. Make sure to adjust the filename.
  • In a .h header, include guards should be used with the form FILENAME_H.
  • In a .cpp file (e.g. filename.cpp), the first include should be the one where the class is declared (e.g. #include "filename.h"), followed by an empty line for separation.
  • Then come headers from Godot's own code base, included in alphabetical order (enforced by clang-format) with paths relative to the root folder. Those includes should be done with quotes, e.g. #include "core/object.h". The block of Godot header includes should then be followed by an empty line for separation.
  • Finally, thirdparty headers (either from thirdparty or from the system's include paths) come next and should be included with the < and > symbols, e.g. #include <png.h>. The block of thirdparty headers should also be followed by an empty line for separation.
  • Godot and thirdparty headers should be included in the file that requires them, i.e. in the .h header if used in the declarative code or in the .cpp if used only in the imperative code.

例:

/*************************************************************************/
/*  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's Java code (mostly in platform/android) is also enforced via clang-format, so see the instructions above to set it up. Keep in mind that this style guide only applies to code written and maintained by Godot, not thirdparty code such as the java/src/com/google subfolder.

Python

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

For those, we follow the PEP-8 style guide, this is however not as strongly enforced as for the C++ code. If you are so inclined, you can check and format your Python changes using autopep8.