UNPKG

@slippy-lint/slippy

Version:

A simple but powerful linter for Solidity

49 lines 1.76 kB
import { NonterminalKind, TerminalKind } from "@nomicfoundation/slang/cst"; import * as z from "zod"; const DEFAULT_MAX_STATE_VARIABLES = 15; const ConfigSchema = z .optional(z.number()) .default(DEFAULT_MAX_STATE_VARIABLES); export const MaxStateVars = { name: "max-state-vars", recommended: true, parseConfig: (config) => { return ConfigSchema.parse(config); }, create: function (config) { return new MaxStateVarsRule(this.name, config); }, }; class MaxStateVarsRule { constructor(name, config) { this.name = name; this.config = config; } run({ file }) { const diagnostics = []; const cursor = file.createTreeCursor(); while (cursor.goToNextNonterminalWithKind(NonterminalKind.ContractDefinition)) { const contractCursor = cursor.spawn(); if (!contractCursor.goToNextTerminalWithKind(TerminalKind.Identifier)) { continue; } const contractName = contractCursor.node.unparse(); const contractRange = contractCursor.textRange; let count = 0; while (contractCursor.goToNextNonterminalWithKind(NonterminalKind.StateVariableDefinition)) { count++; } if (count > this.config) { diagnostics.push({ sourceId: file.id, rule: this.name, message: `Contract '${contractName}' has more than ${this.config} state variables`, line: contractRange.start.line, column: contractRange.start.column, }); } } return diagnostics; } } //# sourceMappingURL=max-state-vars.js.map