UNPKG

hardhat

Version:

Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.

72 lines (55 loc) 1.82 kB
import type SolidityAnalyzerT from "@nomicfoundation/solidity-analyzer"; import { SolidityFilesCache } from "../../builtin-tasks/utils/solidity-files-cache"; import { requireNapiRsModule } from "../../common/napi-rs"; interface ParsedData { imports: string[]; versionPragmas: string[]; } export class Parser { private _cache = new Map<string, ParsedData>(); private _solidityFilesCache: SolidityFilesCache; constructor(_solidityFilesCache?: SolidityFilesCache) { this._solidityFilesCache = _solidityFilesCache ?? SolidityFilesCache.createEmpty(); } public parse( fileContent: string, absolutePath: string, contentHash: string ): ParsedData { const cacheResult = this._getFromCache(absolutePath, contentHash); if (cacheResult !== null) { return cacheResult; } const { analyze } = requireNapiRsModule( "@nomicfoundation/solidity-analyzer" ) as typeof SolidityAnalyzerT; const result = analyze(fileContent); this._cache.set(contentHash, result); return result; } /** * Get parsed data from the internal cache, or from the solidity files cache. * * Returns null if cannot find it in either one. */ private _getFromCache( absolutePath: string, contentHash: string ): ParsedData | null { const internalCacheEntry = this._cache.get(contentHash); if (internalCacheEntry !== undefined) { return internalCacheEntry; } const solidityFilesCacheEntry = this._solidityFilesCache.getEntry(absolutePath); if (solidityFilesCacheEntry === undefined) { return null; } const { imports, versionPragmas } = solidityFilesCacheEntry; if (solidityFilesCacheEntry.contentHash !== contentHash) { return null; } return { imports, versionPragmas }; } }