Valid QL comments are known as QLDoc. This document describes the recommended styles and conventions you should use when writing QLDoc for code contributions in this repository. If there is a conflict between any of the recommendations in this guide and clarity, then clarity should take precedence.
- Documentation must adhere to the QLDoc specification.
- Documentation comments should be appropriate for users of the code.
- Documentation for maintainers of the code must use normal comments.
- Use
/** ... */
for documentation, even for single line comments.- For single-line documentation, the
/**
and*/
are written on the same line as the comment. - For multi-line documentation, the
/**
and*/
are written on separate lines. There is a*
preceding each comment line, aligned on the first*
.
- For single-line documentation, the
- Use code formatting (backticks) within comments for code from the source language, and also for QL code (for example, names of classes, predicates, and variables).
- Give explanatory examples of code in the target language, enclosed in
```<target language>
or`
.
- Use American English.
- Use full sentences, with capital letters and periods, except for the initial sentence of the comment, which may be fragmentary as described below.
- Use simple sentence structures and avoid complex or academic language.
- Avoid colloquialisms and contractions.
- Use words that are in common usage.
- Public declarations must be documented.
- Non-public declarations should be documented.
- Declarations in query files should be documented.
- Library files (
.qll
files) should have a documentation comment at the top of the file. - Query files, except for tests, must have a QLDoc query documentation comment at the top of the file.
- Refer to all predicate parameters in the predicate documentation.
- Reference names, such as types and parameters, using backticks
`
. - Give examples of code in the target language, enclosed in
```<target language>
or`
. - Predicates that override a single predicate don't need QLDoc, as they will inherit it.
- Use a third-person verb phrase of the form
Holds if `arg` has <property>.
- Avoid:
/** Whether ... */
/**" Relates ... */
- Question forms:
/** Is `x` a foo? */
/** Does `x` have a bar? */
/**
* Holds if the qualifier of this call has type `qualifierType`.
* `isExactType` indicates whether the type is exact, that is, whether
* the qualifier is guaranteed not to be a subtype of `qualifierType`.
*/
- Use a third-person verb phrase of the form
Gets (a|the) <thing>.
- Use "if any" if the item is usually unique but might be missing. For example
Gets the body of this method, if any.
- If the predicate has more complex behaviour, for example multiple arguments are conceptually "outputs", it can be described like a predicate without a result. For example
Holds if `result` is a child of this expression.
- Avoid:
Get a ...
The ...
Results in ...
- Any use of
return
/**
* Gets the expression denoting the super class of this class,
* or nothing if this is an interface or a class without an `extends` clause.
*/
The documentation for deprecated predicates should be updated to emphasize the deprecation and specify what predicate to use as an alternative.
Insert a sentence of the form DEPRECATED: Use <other predicate> instead.
at the start of the QLDoc comment.
/** DEPRECATED: Use `getAnExpr()` instead. */
deprecated Expr getInitializer()
Some predicates are internal-only declarations that cannot be made private. The documentation for internal predicates should begin with INTERNAL: Do not use.
/**
* INTERNAL: Do not use.
*/
Certain special predicates should be documented consistently.
-
Always document
toString
as/** Gets a textual representation of this element. */ string toString() { ... }
-
Always document
hasLocationInfo
as/** * Holds if this element is at the specified location. * The location spans column `startcolumn` of line `startline` to * column `endcolumn` of line `endline` in file `filepath`. * For more information, see * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ predicate hasLocationInfo(string filepath, int startline, int startcolumn, int endline, int endcolumn) { ... }
- Document classes using a noun phrase of the form
A <domain element> that <has property>.
- Use "that", not "which".
- Refer to member elements in the singular.
- Where a class denotes a generic concept with subclasses, list those subclasses.
/**
* A delegate declaration, for example
* ```
* delegate void Logger(string text);
* ```
*/
class Delegate extends ...
/**
* An element that can be called.
*
* Either a method (`Method`), a constructor (`Constructor`), a destructor
* (`Destructor`), an operator (`Operator`), an accessor (`Accessor`),
* an anonymous function (`AnonymousFunctionExpr`), or a local function
* (`LocalFunction`).
*/
class Callable extends ...
Modules should be documented using a third-person verb phrase of the form Provides <classes and predicates to do something>.
/** Provides logic for determining constant expressions. */
/** Provides classes representing the control flow graph within functions. */
When referring to this
, you may either refer to it as `this`
or this <type>
. For example:
Holds if `this` is static.
Holds if this method is static.
When referring to result
, you may either refer to it as `result`
or as the result
. For example:
Holds if `result` is a child of this expression.
Holds if the result is a child of this expression.