Skip to content

Commit ffae5e4

Browse files
authored
Merge pull request #5370 from NomicFoundation/validate-clashes-pos-param
Add validation for positional parameter clashes with global parameters
2 parents 3a3de6b + cb1ef17 commit ffae5e4

File tree

3 files changed

+51
-7
lines changed

3 files changed

+51
-7
lines changed

v-next/core/src/internal/tasks/task-manager.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -189,20 +189,26 @@ export class TaskManagerImplementation implements TaskManager {
189189
taskDefinition: NewTaskDefinition | TaskOverrideDefinition,
190190
pluginId?: string,
191191
) {
192-
for (const namedParamName of Object.keys(taskDefinition.namedParameters)) {
193-
const globalParamEntry = globalParameterIndex.get(namedParamName);
192+
const namedParamNames = Object.keys(taskDefinition.namedParameters);
193+
const positionalParamNames =
194+
"positionalParameters" in taskDefinition
195+
? taskDefinition.positionalParameters.map(({ name }) => name)
196+
: [];
197+
198+
[...namedParamNames, ...positionalParamNames].forEach((paramName) => {
199+
const globalParamEntry = globalParameterIndex.get(paramName);
194200
if (globalParamEntry !== undefined) {
195201
throw new HardhatError(
196202
HardhatError.ERRORS.TASK_DEFINITIONS.TASK_PARAMETER_ALREADY_DEFINED,
197203
{
198204
actorFragment: getActorFragment(pluginId),
199205
task: formatTaskId(taskDefinition.id),
200-
namedParamName,
206+
parameter: paramName,
201207
globalParamPluginId: globalParamEntry.pluginId,
202208
},
203209
);
204210
}
205-
}
211+
});
206212
}
207213

208214
#processTaskOverride(

v-next/core/test/internal/tasks/task-manager.ts

+39-1
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,45 @@ describe("TaskManagerImplementation", () => {
407407
{
408408
actorFragment: "Plugin plugin1 is",
409409
task: "task1",
410-
namedParamName: "param1",
410+
parameter: "param1",
411+
globalParamPluginId: "plugin2",
412+
},
413+
),
414+
);
415+
});
416+
417+
it("should throw if there's a global parameter with the same name as a task positional parameter", async () => {
418+
await assert.rejects(
419+
createHardhatRuntimeEnvironment({
420+
plugins: [
421+
{
422+
id: "plugin1",
423+
tasks: [
424+
new NewTaskDefinitionBuilderImplementation("task1")
425+
.addPositionalParameter({ name: "param1" })
426+
.setAction(() => {})
427+
.build(),
428+
],
429+
},
430+
{
431+
id: "plugin2",
432+
globalParameters: [
433+
buildGlobalParameterDefinition({
434+
name: "param1",
435+
description: "",
436+
parameterType: ParameterType.STRING,
437+
defaultValue: "",
438+
}),
439+
],
440+
},
441+
],
442+
}),
443+
new HardhatError(
444+
HardhatError.ERRORS.TASK_DEFINITIONS.TASK_PARAMETER_ALREADY_DEFINED,
445+
{
446+
actorFragment: "Plugin plugin1 is",
447+
task: "task1",
448+
parameter: "param1",
411449
globalParamPluginId: "plugin2",
412450
},
413451
),

v-next/hardhat-errors/src/descriptors.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -247,10 +247,10 @@ Please ensure that an action is defined for each task.`,
247247
TASK_PARAMETER_ALREADY_DEFINED: {
248248
number: 209,
249249
messageTemplate:
250-
"{actorFragment} trying to define task {task} with the named parameter {namedParamName} but it is already defined as a global parameter by plugin {globalParamPluginId}",
250+
"{actorFragment} trying to define task {task} with the parameter {parameter} but it is already defined as a global parameter by plugin {globalParamPluginId}",
251251
websiteTitle: "Task parameter already defined",
252252
websiteDescription:
253-
"The task named parameter is already defined as a global parameter by another plugin. Please ensure that task parameters are uniquely named to avoid conflicts.",
253+
"The task parameter is already defined as a global parameter by another plugin. Please ensure that task parameters are uniquely named to avoid conflicts.",
254254
},
255255
TASK_OVERRIDE_PARAMETER_ALREADY_DEFINED: {
256256
number: 210,

0 commit comments

Comments
 (0)