| # Tint diagnostic style guide |
| |
| This guide provides a set of best practices when writing code that emits |
| diagnostic messages in Tint. These diagnostics are messages presented to the |
| user in case of error or warning. |
| |
| The goal of this document is to have our diagnostic messages be clear and |
| understandable to our users, so that problems are easy to fix, and to try and |
| keep a consistent style. |
| |
| ## Message style |
| |
| * Start diagnostic messages with a lower-case letter |
| * Try to keep the message to a single sentence, if possible |
| * Do not end the message with punctuation (full stop, exclamation mark, etc) |
| |
| **Don't:** |
| |
| ``` |
| shader.wgsl:7:1 error: Cannot take the address of expression. |
| ``` |
| |
| **Do:** |
| |
| ``` |
| shader.wgsl:7:1 error: cannot take the address of expression |
| ``` |
| |
| **Justification:** |
| |
| Succinct messages are more important than grammatical correctness. \ |
| This style matches the style found in most other compilers. |
| |
| ## Prefer to use a `Source` location instead of quoting the code in the message |
| |
| **Don't:** |
| |
| ``` |
| shader.wgsl:5:7 error: cannot multiply 'expr_a * expr_b' with types i32 and f32 |
| |
| var res : f32 = expr_a * expr_b |
| ^^^^^^^^^^^^^^^ |
| ``` |
| |
| **Do:** |
| |
| ``` |
| shader.wgsl:5:7 error: cannot multiply types i32 and f32 |
| |
| var res : f32 = expr_a * expr_b |
| ^^^^^^^^^^^^^^^ |
| ``` |
| |
| **Justification:** |
| |
| The highlighted line provides even more contextual information than the quoted |
| source, and duplicating this information doesn't provide any more help to the |
| developer. \ |
| Quoting single word identifiers or keywords from the source is not discouraged. |
| |
| ## Use `note` diagnostics for providing additional links to relevant code |
| |
| **Don't:** |
| |
| ``` |
| shader.wgsl:5:11 error: type cannot be used in address space 'storage' as it is non-host-shareable |
| |
| cond : bool; |
| ^^^^ |
| ``` |
| |
| **Do:** |
| |
| ``` |
| shader.wgsl:5:11 error: type cannot be used in address space 'storage' as it is non-host-shareable |
| |
| cond : bool; |
| ^^^^ |
| |
| shader.wgsl:8:4 note: while instantiating variable 'StorageBuffer' |
| |
| var<storage> sb : StorageBuffer; |
| ^^ |
| ``` |
| |
| **Justification:** |
| |
| To properly understand some diagnostics requires looking at more than a single |
| line. \ |
| Multi-source links can greatly reduce the time it takes to properly |
| understand a diagnostic message. \ |
| This is especially important for diagnostics raised from complex whole-program |
| analysis, but can also greatly aid simple diagnostics like symbol collision errors. |
| |
| ## Use simple terminology |
| |
| **Don't:** |
| |
| ``` |
| shader.wgsl:7:1 error: the originating variable of the left-hand side of an assignment expression must not be declared with read access control. |
| ``` |
| |
| **Do:** |
| |
| ``` |
| shader.wgsl:7:1 error: cannot assign to variable with read access control |
| |
| x.y = 1; |
| ^^^^^^^ |
| |
| shader.wgsl:2:8 note: read access control declared here |
| |
| var<storage, read> x : i32; |
| ^^^^ |
| ``` |
| |
| **Justification:** |
| |
| Diagnostics will be read by Web developers who may not be native English |
| speakers and are unlikely to be familiar with WGSL specification terminology. |
| Too much technical jargon can be intimidating and confusing. \ |
| Diagnostics should give enough information to explain what's wrong, and most |
| importantly, give enough information so that a fix actionable. |
| |
| **Caution:** Be careful to not over simplify. Use the specification terminology |
| if there's potential ambiguity by not including it. |