| # 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. |