Skip to content

Commit 1581405

Browse files
bpmutternzakas
andauthored
docs: improve context.getScope() docs (#16417)
* docs: improve context.getScope() docs add some more detail and clarity to the context.getScope() docs. Fixes #16148 * draft copy updates * add links to examples * find more relevant rule examples * Apply suggestions from NZ code review Co-authored-by: Nicholas C. Zakas <[email protected]> * draft explanation of usage * copy edit Co-authored-by: Nicholas C. Zakas <[email protected]>
1 parent b797149 commit 1581405

1 file changed

Lines changed: 23 additions & 6 deletions

File tree

docs/src/developer-guide/working-with-rules.md

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,11 @@ Additionally, the `context` object has the following methods:
160160

161161
### context.getScope()
162162

163-
This method returns the scope which has the following types:
163+
This method returns the scope of the current node. It is a useful method for finding information about the variables in a given scope, and how they are used in other scopes.
164+
165+
#### Scope types
166+
167+
The following table contains a list of AST node types and the scope type that they correspond to. For more information about the scope types, refer to the [`Scope` object documentation](./scope-manager-interface.md#scope-interface).
164168

165169
| AST Node Type | Scope Type |
166170
|:--------------------------|:-----------|
@@ -183,12 +187,25 @@ This method returns the scope which has the following types:
183187
**※2** Only if the `for` statement defines the iteration variable as a block-scoped variable (E.g., `for (let i = 0;;) {}`).<br>
184188
**※3** The scope of the closest ancestor node which has own scope. If the closest ancestor node has multiple scopes then it chooses the innermost scope (E.g., the `Program` node has a `global` scope and a `module` scope if `Program#sourceType` is `"module"`. The innermost scope is the `module` scope.).
185189

186-
The returned value is a [`Scope` object](scope-manager-interface) defined by the `eslint-scope` package. The `Variable` objects of global variables have some additional properties.
190+
#### Scope Variables
191+
192+
The `Scope#variables` property contains an array of [`Variable` objects](./scope-manager-interface#variable-interface). These are the variables declared in current scope. You can use these `Variable` objects to track references to a variable throughout the entire module.
193+
194+
Inside of each `Variable`, the `Variable#references` property contains an array of [`Reference` objects](./scope-manager-interface#reference-interface). The `Reference` array contains all the locations where the variable is referenced in the module's source code.
195+
196+
Also inside of each `Variable`, the `Variable#defs` property contains an array of [`Definition` objects](./scope-manager-interface#definition-interface). You can use the `Definitions` to find where the variable was defined.
197+
198+
Global variables have the following additional properties:
199+
200+
* `Variable#writeable` (`boolean | undefined`) ... If `true`, this global variable can be assigned arbitrary value. If `false`, this global variable is read-only.
201+
* `Variable#eslintExplicitGlobal` (`boolean | undefined`) ... If `true`, this global variable was defined by a `/* globals */` directive comment in the source code file.
202+
* `Variable#eslintExplicitGlobalComments` (`Comment[] | undefined`) ... The array of `/* globals */` directive comments which defined this global variable in the source code file. This property is `undefined` if there are no `/* globals */` directive comments.
203+
* `Variable#eslintImplicitGlobalSetting` (`"readonly" | "writable" | undefined`) ... The configured value in config files. This can be different from `variable.writeable` if there are `/* globals */` directive comments.
204+
205+
For examples of using `context.getScope()` to track variables, refer to the source code for the following built-in rules:
187206

188-
* `variable.writeable` (`boolean | undefined`) ... If `true`, this global variable can be assigned arbitrary value. If `false`, this global variable is read-only.
189-
* `variable.eslintExplicitGlobal` (`boolean | undefined`) ... If `true`, this global variable was defined by a `/* globals */` directive comment in the source code file.
190-
* `variable.eslintExplicitGlobalComments` (`Comment[] | undefined`) ... The array of `/* globals */` directive comments which defined this global variable in the source code file. This property is `undefined` if there are no `/* globals */` directive comments.
191-
* `variable.eslintImplicitGlobalSetting` (`"readonly" | "writable" | undefined`) ... The configured value in config files. This can be different from `variable.writeable` if there are `/* globals */` directive comments.
207+
* [no-shadow](https://github.com/eslint/eslint/blob/main/lib/rules/no-shadow.js): Calls `context.getScopes()` at the global scope and parses all child scopes to make sure a variable name is not reused at a lower scope. ([no-shadow](../rules/no-shadow) documentation)
208+
* [no-redeclare](https://github.com/eslint/eslint/blob/main/lib/rules/no-redeclare.js): Calls `context.getScope()` at each scope to make sure that a variable is not declared twice at that scope. ([no-redeclare](../rules/no-redeclare) documentation)
192209

193210
### context.report()
194211

0 commit comments

Comments
 (0)