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 (
.qllfiles) 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
toStringas/** Gets a textual representation of this element. */ string toString() { ... }
-
Always document
hasLocationInfoas/** * 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.