From f26188fa8132aba35219af2ecb8904dc804234fe Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Sat, 19 Apr 2025 18:02:57 -0600 Subject: [PATCH 01/11] merge user output selection with default output selection and sort entries --- .../solidity/build-system/compilation-job.ts | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index 2006bac0e09..15b0c48d66e 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -113,9 +113,46 @@ export class CompilationJobImplementation implements CompilationJob { }, }; - // TODO: Deep merge the user output selection with the default one const outputSelection = defaultOutputSelection; + const configOutputSelection = settings.outputSelection ?? {}; + + for (const fileKey in configOutputSelection) { + if ( + !Object.prototype.hasOwnProperty.call(configOutputSelection, fileKey) + ) { + continue; + } + + const configFileOutputSelection = configOutputSelection[fileKey] ?? {}; + outputSelection[fileKey] ??= {}; + + for (const contractKey in configFileOutputSelection) { + if ( + !Object.prototype.hasOwnProperty.call( + configFileOutputSelection, + contractKey, + ) + ) { + continue; + } + + const configContractOutputSelection = + configFileOutputSelection[contractKey] ?? []; + outputSelection[fileKey][contractKey] ??= []; + + const values = Array.from( + new Set([ + ...outputSelection[fileKey][contractKey], + ...configContractOutputSelection, + ]), + ); + values.sort(); + + outputSelection[fileKey][contractKey] = values; + } + } + return { language: "Solidity", settings: { From ad8dc4dcef7d26dac591c4d2a64d212a418fcfbe Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 10:40:54 -0600 Subject: [PATCH 02/11] replace for-in pattern with Object.keys iteration Co-authored-by: Zoey --- .../solidity/build-system/compilation-job.ts | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index 15b0c48d66e..8d52ec8f527 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -117,25 +117,12 @@ export class CompilationJobImplementation implements CompilationJob { const configOutputSelection = settings.outputSelection ?? {}; - for (const fileKey in configOutputSelection) { - if ( - !Object.prototype.hasOwnProperty.call(configOutputSelection, fileKey) - ) { - continue; - } + for (const fileKey of Object.keys(configOutputSelection)) { const configFileOutputSelection = configOutputSelection[fileKey] ?? {}; outputSelection[fileKey] ??= {}; - for (const contractKey in configFileOutputSelection) { - if ( - !Object.prototype.hasOwnProperty.call( - configFileOutputSelection, - contractKey, - ) - ) { - continue; - } + for (const contractKey of Object.keys(configFileOutputSelection)) { const configContractOutputSelection = configFileOutputSelection[contractKey] ?? []; From 043ee180346cc45e832807e4cb24a67d24b2110a Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 10:41:32 -0600 Subject: [PATCH 03/11] format --- .../builtin-plugins/solidity/build-system/compilation-job.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index 8d52ec8f527..b9ae0a72ae6 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -118,12 +118,10 @@ export class CompilationJobImplementation implements CompilationJob { const configOutputSelection = settings.outputSelection ?? {}; for (const fileKey of Object.keys(configOutputSelection)) { - const configFileOutputSelection = configOutputSelection[fileKey] ?? {}; outputSelection[fileKey] ??= {}; for (const contractKey of Object.keys(configFileOutputSelection)) { - const configContractOutputSelection = configFileOutputSelection[contractKey] ?? []; outputSelection[fileKey][contractKey] ??= []; From a93907392722c8031dbc7c1232dcdb89fedc986d Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 10:42:46 -0600 Subject: [PATCH 04/11] sort inline --- .../builtin-plugins/solidity/build-system/compilation-job.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index b9ae0a72ae6..87e62246b23 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -131,8 +131,7 @@ export class CompilationJobImplementation implements CompilationJob { ...outputSelection[fileKey][contractKey], ...configContractOutputSelection, ]), - ); - values.sort(); + ).sort(); outputSelection[fileKey][contractKey] = values; } From 389da86514f190a92d3be6c05671fa78fd911b47 Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 10:44:20 -0600 Subject: [PATCH 05/11] sort keys of default output selection object --- .../builtin-plugins/solidity/build-system/compilation-job.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index 87e62246b23..fc989110756 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -102,6 +102,7 @@ export class CompilationJobImplementation implements CompilationJob { const defaultOutputSelection: CompilerInput["settings"]["outputSelection"] = { "*": { + "": ["ast"], "*": [ "abi", "evm.bytecode", @@ -109,7 +110,6 @@ export class CompilationJobImplementation implements CompilationJob { "evm.methodIdentifiers", "metadata", ], - "": ["ast"], }, }; From 9609c1e7aa02a759f1e07435fa2ab55e4e3a3a20 Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 10:56:11 -0600 Subject: [PATCH 06/11] sort output selection object keys --- .../builtin-plugins/solidity/build-system/compilation-job.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index fc989110756..f657fa3d560 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -117,11 +117,11 @@ export class CompilationJobImplementation implements CompilationJob { const configOutputSelection = settings.outputSelection ?? {}; - for (const fileKey of Object.keys(configOutputSelection)) { + for (const fileKey of Object.keys(configOutputSelection).sort()) { const configFileOutputSelection = configOutputSelection[fileKey] ?? {}; outputSelection[fileKey] ??= {}; - for (const contractKey of Object.keys(configFileOutputSelection)) { + for (const contractKey of Object.keys(configFileOutputSelection).sort()) { const configContractOutputSelection = configFileOutputSelection[contractKey] ?? []; outputSelection[fileKey][contractKey] ??= []; From 4156387f05b44389f7b98931326c8fc6d0b9bae6 Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 11:23:59 -0600 Subject: [PATCH 07/11] rearrange variables for readability --- .../solidity/build-system/compilation-job.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index f657fa3d560..195be2c87ce 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -114,26 +114,23 @@ export class CompilationJobImplementation implements CompilationJob { }; const outputSelection = defaultOutputSelection; - const configOutputSelection = settings.outputSelection ?? {}; for (const fileKey of Object.keys(configOutputSelection).sort()) { - const configFileOutputSelection = configOutputSelection[fileKey] ?? {}; outputSelection[fileKey] ??= {}; + const configFileOutputSelection = configOutputSelection[fileKey] ?? {}; for (const contractKey of Object.keys(configFileOutputSelection).sort()) { + outputSelection[fileKey][contractKey] ??= []; const configContractOutputSelection = configFileOutputSelection[contractKey] ?? []; - outputSelection[fileKey][contractKey] ??= []; - const values = Array.from( + outputSelection[fileKey][contractKey] = Array.from( new Set([ ...outputSelection[fileKey][contractKey], ...configContractOutputSelection, ]), ).sort(); - - outputSelection[fileKey][contractKey] = values; } } From d3557d1d3ae673b5d9b50532322459ce2cce179c Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 12:09:15 -0600 Subject: [PATCH 08/11] improve readability of output selection merge loops and ignore empty entries --- .../solidity/build-system/compilation-job.ts | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index 195be2c87ce..20245daf8d7 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -113,24 +113,38 @@ export class CompilationJobImplementation implements CompilationJob { }, }; - const outputSelection = defaultOutputSelection; const configOutputSelection = settings.outputSelection ?? {}; - - for (const fileKey of Object.keys(configOutputSelection).sort()) { - outputSelection[fileKey] ??= {}; - const configFileOutputSelection = configOutputSelection[fileKey] ?? {}; - - for (const contractKey of Object.keys(configFileOutputSelection).sort()) { - outputSelection[fileKey][contractKey] ??= []; - const configContractOutputSelection = - configFileOutputSelection[contractKey] ?? []; - - outputSelection[fileKey][contractKey] = Array.from( + const outputSelection: typeof defaultOutputSelection = {}; + + const fileKeys = Array.from( + new Set([ + ...Object.keys(defaultOutputSelection), + ...Object.keys(configOutputSelection), + ]), + ).sort(); + + for (const fileKey of fileKeys) { + const contractKeys = Array.from( + new Set([ + ...Object.keys(defaultOutputSelection[fileKey] ?? {}), + ...Object.keys(configOutputSelection[fileKey] ?? {}), + ]), + ).sort(); + + for (const contractKey of contractKeys) { + const values = Array.from( new Set([ - ...outputSelection[fileKey][contractKey], - ...configContractOutputSelection, + ...Object.keys( + defaultOutputSelection[fileKey]?.[contractKey] ?? [], + ), + ...Object.keys(configOutputSelection[fileKey]?.[contractKey] ?? []), ]), ).sort(); + + if (values.length > 0) { + outputSelection[fileKey] = {}; + outputSelection[fileKey][contractKey] = values; + } } } From 7f33160083c6c83b989e3eda32763bd8b6a1cd96 Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 12:20:57 -0600 Subject: [PATCH 09/11] wrap output selection merge logic in function --- .../solidity/build-system/compilation-job.ts | 85 ++++++++++--------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index 20245daf8d7..9555a5d12df 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -99,54 +99,56 @@ export class CompilationJobImplementation implements CompilationJob { // from other files (e.g. new Foo()), and it won't output its bytecode if // it's not asked for. This would prevent EDR from doing any runtime // analysis. - const defaultOutputSelection: CompilerInput["settings"]["outputSelection"] = - { - "*": { - "": ["ast"], - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - ], - }, - }; + type OutputSelection = CompilerInput["settings"]["outputSelection"]; + const defaultOutputSelection: OutputSelection = { + "*": { + "": ["ast"], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + ], + }, + }; + + // TODO: export this function somewhere as helper + const mergeOutputSelection = ( + selectionA: OutputSelection, + selectionB: OutputSelection, + ): OutputSelection => { + const result: OutputSelection = {}; - const configOutputSelection = settings.outputSelection ?? {}; - const outputSelection: typeof defaultOutputSelection = {}; - - const fileKeys = Array.from( - new Set([ - ...Object.keys(defaultOutputSelection), - ...Object.keys(configOutputSelection), - ]), - ).sort(); - - for (const fileKey of fileKeys) { - const contractKeys = Array.from( - new Set([ - ...Object.keys(defaultOutputSelection[fileKey] ?? {}), - ...Object.keys(configOutputSelection[fileKey] ?? {}), - ]), + const fileKeys = Array.from( + new Set([...Object.keys(selectionA), ...Object.keys(selectionB)]), ).sort(); - for (const contractKey of contractKeys) { - const values = Array.from( + for (const fileKey of fileKeys) { + const contractKeys = Array.from( new Set([ - ...Object.keys( - defaultOutputSelection[fileKey]?.[contractKey] ?? [], - ), - ...Object.keys(configOutputSelection[fileKey]?.[contractKey] ?? []), + ...Object.keys(selectionA[fileKey] ?? {}), + ...Object.keys(selectionB[fileKey] ?? {}), ]), ).sort(); - if (values.length > 0) { - outputSelection[fileKey] = {}; - outputSelection[fileKey][contractKey] = values; + for (const contractKey of contractKeys) { + const values = Array.from( + new Set([ + ...Object.keys(selectionA[fileKey]?.[contractKey] ?? []), + ...Object.keys(selectionB[fileKey]?.[contractKey] ?? []), + ]), + ).sort(); + + if (values.length > 0) { + result[fileKey] = {}; + result[fileKey][contractKey] = values; + } } } - } + + return result; + }; return { language: "Solidity", @@ -155,7 +157,10 @@ export class CompilationJobImplementation implements CompilationJob { evmVersion: settings.evmVersion ?? getEvmVersionFromSolcVersion(this.solcConfig.version), - outputSelection, + outputSelection: mergeOutputSelection( + defaultOutputSelection, + settings.outputSelection, + ), remappings: this.#remappings.map(formatRemapping), }, }; From e26cbeefeec1bb5e4aaba1e5585536798cb5b48c Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 12:22:03 -0600 Subject: [PATCH 10/11] fix array merge --- .../builtin-plugins/solidity/build-system/compilation-job.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index 9555a5d12df..f8a68f0e047 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -135,8 +135,8 @@ export class CompilationJobImplementation implements CompilationJob { for (const contractKey of contractKeys) { const values = Array.from( new Set([ - ...Object.keys(selectionA[fileKey]?.[contractKey] ?? []), - ...Object.keys(selectionB[fileKey]?.[contractKey] ?? []), + ...(selectionA[fileKey]?.[contractKey] ?? []), + ...(selectionB[fileKey]?.[contractKey] ?? []), ]), ).sort(); From 1590d4c6558944cfe07a52b7ba02083ddb3a8f27 Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Thu, 1 May 2025 12:30:37 -0600 Subject: [PATCH 11/11] set mergeOutputSlection default parameter values --- .../builtin-plugins/solidity/build-system/compilation-job.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts index f8a68f0e047..7f9a3a65e9d 100644 --- a/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +++ b/v-next/hardhat/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts @@ -115,8 +115,8 @@ export class CompilationJobImplementation implements CompilationJob { // TODO: export this function somewhere as helper const mergeOutputSelection = ( - selectionA: OutputSelection, - selectionB: OutputSelection, + selectionA: OutputSelection = {}, + selectionB: OutputSelection = {}, ): OutputSelection => { const result: OutputSelection = {};