@slippy-lint/slippy
Version:
A simple but powerful linter for Solidity
64 lines (55 loc) • 1.63 kB
text/typescript
import { StateVariableDefinition } from "@nomicfoundation/slang/ast";
import {
Diagnostic,
RuleContext,
RuleWithoutConfig,
RuleDefinitionWithoutConfig,
} from "./types.js";
import {
assertNonterminalNode,
NonterminalKind,
} from "@nomicfoundation/slang/cst";
import {
isConstant,
isImmutable,
isPrivate,
} from "../slang/state-variables.js";
export const PrivateVars: RuleDefinitionWithoutConfig = {
name: "private-vars",
recommended: false,
create: function () {
return new PrivateVarsRule(this.name);
},
};
class PrivateVarsRule implements RuleWithoutConfig {
constructor(public name: string) {}
public run({ file }: RuleContext): Diagnostic[] {
const diagnostics: Diagnostic[] = [];
const cursor = file.createTreeCursor();
while (
cursor.goToNextNonterminalWithKind(
NonterminalKind.StateVariableDefinition,
)
) {
assertNonterminalNode(cursor.node);
const stateVariable = new StateVariableDefinition(cursor.node);
while (cursor.node.id !== stateVariable.name.id && cursor.goToNext()) {
// Move to the next node until we find the name of the state variable
}
if (
!isConstant(stateVariable) &&
!isImmutable(stateVariable) &&
!isPrivate(stateVariable)
) {
diagnostics.push({
rule: this.name,
sourceId: file.id,
message: `State variable '${stateVariable.name.unparse()}' should be private`,
line: cursor.textRange.start.line,
column: cursor.textRange.start.column,
});
}
}
return diagnostics;
}
}