UNPKG

@slippy-lint/slippy

Version:

A simple but powerful linter for Solidity

55 lines 2.62 kB
import { StateVariableDefinition } from "@nomicfoundation/slang/ast"; import { NonterminalKind, TerminalKind } from "@nomicfoundation/slang/cst"; import { isImmutable } from "../slang/state-variables.js"; export const NoUninitializedImmutableReference = { name: "no-uninitialized-immutable-references", recommended: true, create: function () { return new NoUninitializedImmutableReferenceRule(this.name); }, }; class NoUninitializedImmutableReferenceRule { constructor(name) { this.name = name; } run({ file, unit }) { const diagnostics = []; const cursor = file.createTreeCursor(); while (cursor.goToNextNonterminalWithKind(NonterminalKind.StateVariableDefinition)) { const definedStateVariableCursor = cursor.spawn(); if (!cursor.goToNextNonterminalWithKind(NonterminalKind.StateVariableDefinitionValue)) continue; const valueCursor = cursor.spawn(); while (valueCursor.goToNextTerminalWithKind(TerminalKind.Identifier)) { const reference = unit.bindingGraph.referenceAt(valueCursor); if (reference === undefined) continue; const definitions = reference.definitions(); if (definitions.length !== 1) continue; const definition = definitions[0]; const definiens = definition.definiensLocation; if (!definiens.isUserFileLocation()) continue; if (definiens.cursor.node.kind !== NonterminalKind.StateVariableDefinition) continue; const referencedStateVariable = new StateVariableDefinition(definiens.cursor.node); if (!isImmutable(referencedStateVariable)) continue; const definedOffset = definedStateVariableCursor.textOffset.utf8; const referencedOffset = definiens.cursor.textOffset.utf8; if (referencedOffset > definedOffset) { diagnostics.push({ rule: this.name, sourceId: file.id, message: `Immutable variable '${valueCursor.node.unparse()}' cannot be referenced before it is initialized`, line: valueCursor.textRange.start.line, column: valueCursor.textRange.start.column, }); } } } return diagnostics; } } //# sourceMappingURL=no-uninitialized-immutable-reference.js.map