| # Tint style guide | |
| * Generally, follow the [Chromium style guide for C++](https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++.md) | |
| which itself is built on the [Google C++ style guide](https://google.github.io/styleguide/cppguide.html). | |
| * Overall try to use the same style and convention as code around your change. | |
| * Code must be formatted. Use `clang-format` with the provided [.clang-format](../.clang-format) | |
| file. The `tools/format` script runs the formatter. | |
| * Code should not have linting errors. | |
| The `tools/lint` script runs the linter. So does `git cl upload`. | |
| * Do not use C++ exceptions | |
| * Do not use C++ RTTI. | |
| Instead, use `tint::Castable::As<T>()` from | |
| [src/castable.h](../src/castable.h) | |
| * Generally, avoid `assert`. Instead, issue a [diagnostic](../src/diagnostic.h) | |
| and fail gracefully, possibly by returning an error sentinel value. | |
| Code that should not be reachable should call `TINT_UNREACHABLE` macro | |
| and other internal error conditions should call the `TINT_ICE` macro. | |
| See [src/debug.h](../src/debug.h) | |
| * Use `type` as part of a name only when the name refers to a type | |
| in WGSL or another shader language processed by Tint. If the concept you are | |
| trying to name is about distinguishing between alternatives, use `kind` instead. | |
| * Forward declarations: | |
| * Use forward declarations where possible, instead of using `#include`'s. | |
| * Place forward declarations in their own **un-nested** namespace declarations. \ | |
| Example: \ | |
| to forward-declare `struct X` in namespace `A` and `struct Y` | |
| in namespace `A::B`, you'd write: | |
| ```c++ | |
| // Forward declarations | |
| namespace A { | |
| struct X; | |
| } // namespace A | |
| namespace A::B { | |
| struct Y; | |
| } // namespace A::B | |
| // rest of the header code is declared below ... | |
| ``` | |
| ## Compiler support | |
| Tint requires C++20. | |
| Tint uses the Chromium build system and will stay synchronized with that system. | |
| Compiler configurations beyond that baseline is on a best-effort basis. | |
| We strive to support recent GCC and MSVC compilers. | |
| ## Test code | |
| We might relax the above rules for test code, since test code | |
| shouldn't ship to users. | |
| However, test code should still be readable and maintainable. | |
| For test code, the tradeoff between readability and maintainability | |
| and other factors is weighted even more strongly toward readability | |
| and maintainability. | |
| ## Infra/Tooling | |
| Tint has infra scripts and tooling written in two primary languages | |
| Python and Go. | |
| The general advice when making changes to existing code is to use the | |
| language that the existing implementation uses, since there is no | |
| ongoing effort to migrate to a single common language, i.e. don't go | |
| rewriting things just for the sake of rewriting things. | |
| If you are looking at writing a new tool or script, where and how this | |
| code is going to be used should guide your choice. | |
| For example if it is a standalone tool that primarily lives in the | |
| Dawn repo, especially for something like a CLI dev tool, etc, the | |
| preference is to use Go, since there is a substantial existing body of | |
| support code already. | |
| If it is something that needs to directly interface with Chromium | |
| tooling, e.g. interacts with GN or other support libraries/tools will | |
| be accessing it, the preference would be to use Python. | |
| That being said for many Chromium infrastructure tasks, i.e. running | |
| in a build recipe, the integration there is via exec, even for Python | |
| scripts. For integration there is no significant difference between | |
| call into a Python script vs a Go one. | |
| The primary driver in this case to using Python instead of Go would be | |
| either something else written in Python that needs to import your code | |
| as a library (and not just treat it like a standalone binary) or your | |
| code needs to import Chromium specific Python code/libraries. | |
| Often tooling for Tint does double duty, being a CLI for devs and also | |
| how the bots do a similar task. Due to the above considerations, | |
| i.e. existing support for CLI in Go and needing to fork regardless of | |
| the language, the preference in these cases tends to be use Go if | |
| possible. | |
| Another way to view the decision is looking at the number of execs or | |
| similar calls that need to occur. If you are designing something and | |
| seeing that your code is going to be ping ponging between the two | |
| languages via execs, it is probably worthwhile seeing if it is | |
| feasible to implement everything as a library in one language. |