@slippy-lint/slippy
Version:
A simple but powerful linter for Solidity
43 lines • 1.6 kB
JavaScript
import { NonterminalKind, TerminalKind } from "@nomicfoundation/slang/cst";
export const NoDuplicateImports = {
name: "no-duplicate-imports",
recommended: true,
create: function () {
return new NoDuplicateImportsRule(this.name);
},
};
class NoDuplicateImportsRule {
constructor(name) {
this.name = name;
}
run({ file }) {
const diagnostics = [];
const cursor = file.createTreeCursor();
const importPaths = new Set();
while (cursor.goToNextNonterminalWithKind(NonterminalKind.ImportDirective)) {
const importPathCursor = cursor.spawn();
if (!importPathCursor.goToNextNonterminalWithKind(NonterminalKind.StringLiteral)) {
continue;
}
const importPath = importPathCursor.node.unparse().trim().slice(1, -1);
const importKeywordCursor = cursor.spawn();
if (!importKeywordCursor.goToNextTerminalWithKind(TerminalKind.ImportKeyword)) {
continue;
}
if (importPaths.has(importPath)) {
diagnostics.push({
sourceId: file.id,
rule: this.name,
message: `Duplicate import of '${importPath}'`,
line: importKeywordCursor.textRange.start.line,
column: importKeywordCursor.textRange.start.column,
});
}
else {
importPaths.add(importPath);
}
}
return diagnostics;
}
}
//# sourceMappingURL=no-duplicate-imports.js.map