{"record":{"id":"285114553ae283d5","repo":"quarkusio/quarkus","slug":"more-than-1-parameter-of-type-classinfo-methodinf","errorCode":null,"errorMessage":"More than 1 parameter of type ClassInfo, MethodInfo, FieldInfo, ClassConfig, MethodConfig, or FieldConfig for method \" + method","messagePattern":"More than 1 parameter of type ClassInfo, MethodInfo, FieldInfo, ClassConfig, MethodConfig, or FieldConfig for method \" \\+ method","errorType":"exception","errorClass":"DefinitionException","httpStatus":null,"severity":"error","filePath":"independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/bcextensions/ExtensionPhaseEnhancement.java","lineNumber":46,"sourceCode":"        List<ExtensionMethodParameter> parameters = new ArrayList<>(method.parametersCount());\n        for (org.jboss.jandex.Type parameterType : method.parameterTypes()) {\n            ExtensionMethodParameter parameter = ExtensionMethodParameter.of(parameterType);\n            parameters.add(parameter);\n\n            if (parameter.isQuery()) {\n                numQueryParameters++;\n            }\n\n            parameter.verifyAvailable(ExtensionPhase.ENHANCEMENT, method);\n        }\n\n        if (numQueryParameters == 0) {\n            throw new DefinitionException(\"No parameter of type ClassInfo, MethodInfo, FieldInfo, \"\n                    + \"ClassConfig, MethodConfig, or FieldConfig for method \" + method);\n        }\n\n        if (numQueryParameters > 1) {\n            throw new DefinitionException(\"More than 1 parameter of type ClassInfo, MethodInfo, FieldInfo, \"\n                    + \"ClassConfig, MethodConfig, or FieldConfig for method \" + method);\n        }\n\n        ExtensionMethodParameter query = parameters.stream()\n                .filter(ExtensionMethodParameter::isQuery)\n                .findAny()\n                .get(); // guaranteed to be there\n\n        List<org.jboss.jandex.ClassInfo> matchingClasses = matchingClasses(method.jandex);\n        List<?> allValuesForQueryParameter;\n        if (query == ExtensionMethodParameter.CLASS_INFO) {\n            allValuesForQueryParameter = matchingClasses.stream()\n                    .map(it -> new ClassInfoImpl(index, annotationOverlay, it))\n                    .toList();\n        } else if (query == ExtensionMethodParameter.METHOD_INFO) {\n            allValuesForQueryParameter = matchingClasses.stream()\n                    .map(it -> new ClassInfoImpl(index, annotationOverlay, it))\n                    .flatMap(it -> Stream.concat(it.constructors().stream(), it.methods().stream()))","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/bcextensions/ExtensionPhaseEnhancement.java#L28-L64","documentation":"A build-time @Enhancement extension method must target exactly one thing, identified by a single query parameter (ClassInfo, MethodInfo, FieldInfo, ClassConfig, MethodConfig, or FieldConfig). ExtensionPhaseEnhancement.runExtensionMethod() throws DefinitionException when it finds more than one such parameter, since the processor cannot decide which one selects the enhancement target.","triggerScenarios":"Declaring an @Enhancement method with two or more parameters of the six query types (e.g. both ClassInfo and MethodInfo, or ClassConfig and MethodConfig), making numQueryParameters > 1 during processing.","commonSituations":"Combining a class-level and member-level enhancement in one method expecting them to be filled together; adding an extra info parameter 'for convenience' to also see the declaring class; copy-pasting signatures from different extension methods.","solutions":["Keep exactly one query parameter; drop the extra one.","If you need both the class and a member, use a single MethodInfo/FieldInfo parameter and navigate to its declaring ClassInfo from the metadata.","Split into two separate @Enhancement methods, one per target."],"exampleFix":"// before\n@Enhancement\nvoid enhance(ClassConfig clazz, MethodConfig method) { ... }\n\n// after\n@Enhancement\nvoid enhance(MethodConfig method) {\n    ClassConfig clazz = method.declaringClass();\n}","handlingStrategy":"validation","validationCode":"long queries = Arrays.stream(method.getParameters())\n    .map(p -> p.type().name().withoutPackagePrefix())\n    .filter(n -> Set.of(\"ClassInfo\",\"MethodInfo\",\"FieldInfo\",\"ClassConfig\",\"MethodConfig\",\"FieldConfig\").contains(n))\n    .count();\nif (queries > 1) throw new IllegalStateException(\"@Enhancement method must have exactly one query parameter\");","typeGuard":"static boolean isSingleQueryMethod(MethodInfo m) {\n    return Arrays.stream(m.parameters()).filter(ExtensionPhaseEnhancement::isQueryType).count() == 1;\n}","tryCatchPattern":"try {\n    processor.run(extensionClass);\n} catch (DefinitionException e) {\n    fail(\"Too many query parameters: \" + e.getMessage());\n}","preventionTips":["Exactly one query parameter per @Enhancement method — navigate to related metadata (e.g. declaringClass()) instead of adding parameters.","Split multi-target enhancements into separate methods.","Code-review extension signatures with the phase rules at hand."],"tags":["arc","cdi","build-time-extension","quarkus"],"backgroundTag":"duplicate-extension-query-parameter","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}