mirror of
https://git.proxmox.com/git/pve-eslint
synced 2025-10-04 22:50:57 +00:00

includes a (minimal) working wrapper Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
387 lines
9.9 KiB
Markdown
387 lines
9.9 KiB
Markdown
# ScopeManager
|
|
|
|
This document was written based on the implementation of [eslint-scope](https://github.com/eslint/eslint-scope), a fork of [escope](https://github.com/estools/escope), and deprecates some members ESLint is not using.
|
|
|
|
----
|
|
|
|
## ScopeManager interface
|
|
|
|
`ScopeManager` object has all variable scopes.
|
|
|
|
### Fields
|
|
|
|
#### scopes
|
|
|
|
* **Type:** `Scope[]`
|
|
* **Description:** All scopes.
|
|
|
|
#### globalScope
|
|
|
|
* **Type:** `Scope`
|
|
* **Description:** The root scope.
|
|
|
|
### Methods
|
|
|
|
#### acquire(node, inner = false)
|
|
|
|
* **Parameters:**
|
|
* `node` (`ASTNode`) ... An AST node to get their scope.
|
|
* `inner` (`boolean`) ... If the node has multiple scope, this returns the outermost scope normally. If `inner` is `true` then this returns the innermost scope. Default is `false`.
|
|
* **Return type:** `Scope | null`
|
|
* **Description:** Get the scope of a given AST node. The gotten scope's `block` property is the node. This method never returns `function-expression-name` scope. If the node does not have their scope, this returns `null`.
|
|
|
|
#### getDeclaredVariables(node)
|
|
|
|
* **Parameters:**
|
|
* `node` (`ASTNode`) ... An AST node to get their variables.
|
|
* **Return type:** `Variable[]`
|
|
* **Description:** Get the variables that a given AST node defines. The gotten variables' `def[].node`/`def[].parent` property is the node. If the node does not define any variable, this returns an empty array.
|
|
|
|
### Deprecated members
|
|
|
|
Those members are defined but not used in ESLint.
|
|
|
|
#### isModule()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this program is module.
|
|
|
|
#### isImpliedStrict()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this program is strict mode implicitly. I.e., `options.impliedStrict === true`.
|
|
|
|
#### isStrictModeSupported()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this program supports strict mode. I.e., `options.ecmaVersion >= 5`.
|
|
|
|
#### acquireAll(node)
|
|
|
|
* **Parameters:**
|
|
* `node` (`ASTNode`) ... An AST node to get their scope.
|
|
* **Return type:** `Scope[] | null`
|
|
* **Description:** Get the scopes of a given AST node. The gotten scopes' `block` property is the node. If the node does not have their scope, this returns `null`.
|
|
|
|
----
|
|
|
|
## Scope interface
|
|
|
|
`Scope` object has all variables and references in the scope.
|
|
|
|
### Fields
|
|
|
|
#### type
|
|
|
|
* **Type:** `string`
|
|
* **Description:** The type of this scope. This is one of `"block"`, `"catch"`, `"class"`, `"for"`, `"function"`, `"function-expression-name"`, `"global"`, `"module"`, `"switch"`, `"with"`
|
|
|
|
#### isStrict
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** `true` if this scope is strict mode.
|
|
|
|
#### upper
|
|
|
|
* **Type:** `Scope | null`
|
|
* **Description:** The parent scope. If this is the global scope then this property is `null`.
|
|
|
|
#### childScopes
|
|
|
|
* **Type:** `Scope[]`
|
|
* **Description:** The array of child scopes. This does not include grandchild scopes.
|
|
|
|
#### variableScope
|
|
|
|
* **Type:** `Scope`
|
|
* **Description:** The scope which hosts variables which are defined by `var` declarations.
|
|
|
|
#### block
|
|
|
|
* **Type:** `ASTNode`
|
|
* **Description:** The AST node which created this scope.
|
|
|
|
#### variables
|
|
|
|
* **Type:** `Variable[]`
|
|
* **Description:** The array of all variables which are defined on this scope. This does not include variables which are defined in child scopes.
|
|
|
|
#### set
|
|
|
|
* **Type:** `Map<string, Variable>`
|
|
* **Description:** The map from variable names to variable objects.
|
|
|
|
> I hope to rename `set` field or replace by a method.
|
|
|
|
#### references
|
|
|
|
* **Type:** `Reference[]`
|
|
* **Description:** The array of all references on this scope. This does not include references in child scopes.
|
|
|
|
#### through
|
|
|
|
* **Type:** `Reference[]`
|
|
* **Description:** The array of references which could not be resolved in this scope.
|
|
|
|
#### functionExpressionScope
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** `true` if this scope is `"function-expression-name"` scope.
|
|
|
|
> I hope to deprecate `functionExpressionScope` field as replacing by `scope.type === "function-expression-name"`.
|
|
|
|
### Deprecated members
|
|
|
|
Those members are defined but not used in ESLint.
|
|
|
|
#### taints
|
|
|
|
* **Type:** `Map<string, boolean>`
|
|
* **Description:** The map from variable names to `tainted` flag.
|
|
|
|
#### dynamic
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** `true` if this scope is dynamic. I.e., the type of this scope is `"global"` or `"with"`.
|
|
|
|
#### directCallToEvalScope
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** `true` if this scope contains `eval()` invocations.
|
|
|
|
#### thisFound
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** `true` if this scope contains `this`.
|
|
|
|
#### resolve(node)
|
|
|
|
* **Parameters:**
|
|
* `node` (`ASTNode`) ... An AST node to get their reference object. The type of the node must be `"Identifier"`.
|
|
* **Return type:** `Reference | null`
|
|
* **Description:** Returns `this.references.find(r => r.identifier === node)`.
|
|
|
|
#### isStatic()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** Returns `!this.dynamic`.
|
|
|
|
#### isArgumentsMaterialized()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this is a `"function"` scope which has used `arguments` variable.
|
|
|
|
#### isThisMaterialized()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** Returns `this.thisFound`.
|
|
|
|
#### isUsedName(name)
|
|
|
|
* **Parameters:**
|
|
* `name` (`string`) ... The name to check.
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if a given name is used in variable names or reference names.
|
|
|
|
----
|
|
|
|
## Variable interface
|
|
|
|
`Variable` object is variable's information.
|
|
|
|
### Fields
|
|
|
|
#### name
|
|
|
|
* **Type:** `string`
|
|
* **Description:** The name of this variable.
|
|
|
|
#### identifiers
|
|
|
|
* **Type:** `ASTNode[]`
|
|
* **Description:** The array of `Identifier` nodes which define this variable. If this variable is redeclared, this array includes two or more nodes.
|
|
|
|
> I hope to deprecate `identifiers` field as replacing by `defs[].name` field.
|
|
|
|
#### references
|
|
|
|
* **Type:** `Reference[]`
|
|
* **Description:** The array of the references of this variable.
|
|
|
|
#### defs
|
|
|
|
* **Type:** `Definition[]`
|
|
* **Description:** The array of the definitions of this variable.
|
|
|
|
### Deprecated members
|
|
|
|
Those members are defined but not used in ESLint.
|
|
|
|
#### tainted
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** The `tainted` flag. (always `false`)
|
|
|
|
#### stack
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** The `stack` flag. (I'm not sure what this means.)
|
|
|
|
----
|
|
|
|
## Reference interface
|
|
|
|
`Reference` object is reference's information.
|
|
|
|
### Fields
|
|
|
|
#### identifier
|
|
|
|
* **Type:** `ASTNode`
|
|
* **Description:** The `Identifier` node of this reference.
|
|
|
|
#### from
|
|
|
|
* **Type:** `Scope`
|
|
* **Description:** The `Scope` object that this reference is on.
|
|
|
|
#### resolved
|
|
|
|
* **Type:** `Variable | null`
|
|
* **Description:** The `Variable` object that this reference refers. If such variable was not defined, this is `null`.
|
|
|
|
#### writeExpr
|
|
|
|
* **Type:** `ASTNode | null`
|
|
* **Description:** The ASTNode object which is right-hand side.
|
|
|
|
#### init
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** `true` if this writing reference is a variable initializer or a default value.
|
|
|
|
### Methods
|
|
|
|
#### isWrite()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this reference is writing.
|
|
|
|
#### isRead()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this reference is reading.
|
|
|
|
#### isWriteOnly()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this reference is writing but not reading.
|
|
|
|
#### isReadOnly()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this reference is reading but not writing.
|
|
|
|
#### isReadWrite()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this reference is reading and writing.
|
|
|
|
### Deprecated members
|
|
|
|
Those members are defined but not used in ESLint.
|
|
|
|
#### tainted
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** The `tainted` flag. (always `false`)
|
|
|
|
#### flag
|
|
|
|
* **Type:** `number`
|
|
* **Description:** `1` is reading, `2` is writing, `3` is reading/writing.
|
|
|
|
#### partial
|
|
|
|
* **Type:** `boolean`
|
|
* **Description:** The `partial` flag.
|
|
|
|
#### isStatic()
|
|
|
|
* **Parameters:**
|
|
* **Return type:** `boolean`
|
|
* **Description:** `true` if this reference is resolved statically.
|
|
|
|
----
|
|
|
|
## Definition interface
|
|
|
|
`Definition` object is variable definition's information.
|
|
|
|
### Fields
|
|
|
|
#### type
|
|
|
|
* **Type:** `string`
|
|
* **Description:** The type of this definition. One of `"CatchClause"`, `"ClassName"`, `"FunctionName"`, `"ImplicitGlobalVariable"`, `"ImportBinding"`, `"Parameter"`, and `"Variable"`.
|
|
|
|
#### name
|
|
|
|
* **Type:** `ASTNode`
|
|
* **Description:** The `Identifier` node of this definition.
|
|
|
|
#### node
|
|
|
|
* **Type:** `ASTNode`
|
|
* **Description:** The enclosing node of the name.
|
|
|
|
| type | node |
|
|
|:---------------------------|:-----|
|
|
| `"CatchClause"` | `CatchClause`
|
|
| `"ClassName"` | `ClassDeclaration` or `ClassExpression`
|
|
| `"FunctionName"` | `FunctionDeclaration` or `FunctionExpression`
|
|
| `"ImplicitGlobalVariable"` | `Program`
|
|
| `"ImportBinding"` | `ImportSpecifier`, `ImportDefaultSpecifier`, or `ImportNamespaceSpecifier`
|
|
| `"Parameter"` | `FunctionDeclaration`, `FunctionExpression`, or `ArrowFunctionExpression`
|
|
| `"Variable"` | `VariableDeclarator`
|
|
|
|
#### parent
|
|
|
|
* **Type:** `ASTNode | undefined | null`
|
|
* **Description:** The enclosing statement node of the name.
|
|
|
|
| type | parent |
|
|
|:---------------------------|:-------|
|
|
| `"CatchClause"` | `null`
|
|
| `"ClassName"` | `null`
|
|
| `"FunctionName"` | `null`
|
|
| `"ImplicitGlobalVariable"` | `null`
|
|
| `"ImportBinding"` | `ImportDeclaration`
|
|
| `"Parameter"` | `null`
|
|
| `"Variable"` | `VariableDeclaration`
|
|
|
|
### Deprecated members
|
|
|
|
Those members are defined but not used in ESLint.
|
|
|
|
#### index
|
|
|
|
* **Type:** `number | undefined | null`
|
|
* **Description:** The index in the declaration statement.
|
|
|
|
#### kind
|
|
|
|
* **Type:** `string | undefined | null`
|
|
* **Description:** The kind of the declaration statement.
|