Ignore specific warnings and make the rest into errors (#3695)
This commit is contained in:
47
hardhat/ignore-unreachable-warnings.js
Normal file
47
hardhat/ignore-unreachable-warnings.js
Normal file
@ -0,0 +1,47 @@
|
||||
// Warnings about unreachable code are emitted with a source location that corresponds to the unreachable code.
|
||||
// We have some testing contracts that purposely cause unreachable code, but said code is in the library contracts, and
|
||||
// with hardhat-ignore-warnings we are not able to selectively ignore them without potentially ignoring relevant
|
||||
// warnings that we don't want to miss.
|
||||
// Thus, we need to handle these warnings separately. We force Hardhat to compile them in a separate compilation job and
|
||||
// then ignore the warnings about unreachable code that come from that compilation job.
|
||||
|
||||
const { task } = require('hardhat/config');
|
||||
const {
|
||||
TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE,
|
||||
TASK_COMPILE_SOLIDITY_COMPILE,
|
||||
} = require('hardhat/builtin-tasks/task-names');
|
||||
|
||||
const marker = Symbol('unreachable');
|
||||
const markedCache = new WeakMap();
|
||||
|
||||
task(TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, async (params, _, runSuper) => {
|
||||
const job = await runSuper(params);
|
||||
// If the file is in the unreachable directory, we make a copy of the config and mark it, which will cause it to get
|
||||
// compiled separately (along with the other marked files).
|
||||
if (params.file.sourceName.startsWith('contracts/mocks/') && /\bunreachable\b/.test(params.file.sourceName)) {
|
||||
const originalConfig = job.solidityConfig;
|
||||
let markedConfig = markedCache.get(originalConfig);
|
||||
if (markedConfig === undefined) {
|
||||
markedConfig = { ...originalConfig, [marker]: true };
|
||||
markedCache.set(originalConfig, markedConfig);
|
||||
}
|
||||
job.solidityConfig = markedConfig;
|
||||
}
|
||||
return job;
|
||||
});
|
||||
|
||||
const W_UNREACHABLE_CODE = '5740';
|
||||
|
||||
task(TASK_COMPILE_SOLIDITY_COMPILE, async (params, _, runSuper) => {
|
||||
const marked = params.compilationJob.solidityConfig[marker];
|
||||
const result = await runSuper(params);
|
||||
if (marked) {
|
||||
result.output = {
|
||||
...result.output,
|
||||
errors: result.output.errors?.filter(
|
||||
e => e.severity !== 'warning' || e.errorCode !== W_UNREACHABLE_CODE,
|
||||
),
|
||||
};
|
||||
}
|
||||
return result;
|
||||
});
|
||||
Reference in New Issue
Block a user