gradle/gradle · error · Failure
The interceptor's @CallerClassName parameter should be last
Error message
The interceptor's @CallerClassName parameter should be last or just before @InjectVisitorContext if that parameter is present
What it means
Error "The interceptor's @CallerClassName parameter should be last or just before @InjectVisitorContext if that parameter is present" thrown in gradle/gradle.
Source
Thrown at platforms/core-runtime/internal-instrumentation-processor/src/main/java/org/gradle/internal/instrumentation/processor/codegen/jvmbytecode/InterceptJvmCallsGenerator.java:550
boolean hasInjectVisitorContext = callable.hasInjectVisitorContextParam();
if (hasInjectVisitorContext) {
ParameterInfo lastParameter = callable.getParameters().get(callable.getParameters().size() - 1);
if (lastParameter.getKind() != ParameterKindInfo.INJECT_VISITOR_CONTEXT) {
throw new Failure("The interceptor's @" + ParameterKind.InjectVisitorContext.class.getSimpleName() + " parameter should be last parameter");
}
if (!lastParameter.getParameterType().getClassName().equals(BytecodeInterceptorFilter.class.getName())) {
throw new Failure("The interceptor's @" + ParameterKind.InjectVisitorContext.class.getSimpleName() + " parameter should be of type " + BytecodeInterceptorFilter.class.getName() + " but was " + lastParameter.getParameterType().getClassName());
}
if (callable.getParameters().stream().filter(it -> it.getKind() == ParameterKindInfo.INJECT_VISITOR_CONTEXT).count() > 1) {
throw new Failure("An interceptor may not have more than one @" + ParameterKind.InjectVisitorContext.class.getSimpleName() + " parameter");
}
}
boolean hasCallerClassName = callable.hasCallerClassNameParam();
if (hasCallerClassName) {
int expectedIndex = hasInjectVisitorContext ? callable.getParameters().size() - 2 : callable.getParameters().size() - 1;
if (callable.getParameters().get(expectedIndex).getKind() != ParameterKindInfo.CALLER_CLASS_NAME) {
throw new Failure("The interceptor's @" + ParameterKind.CallerClassName.class.getSimpleName() + " parameter should be last or just before @" + ParameterKind.InjectVisitorContext.class.getSimpleName() + " if that parameter is present");
}
if (callable.getParameters().stream().filter(it -> it.getKind() == ParameterKindInfo.CALLER_CLASS_NAME).count() > 1) {
throw new Failure("An interceptor may not have more than one @" + ParameterKind.CallerClassName.class.getSimpleName() + " parameter");
}
}
if (callable.hasKotlinDefaultMaskParam()) {
// TODO support @AfterConstructor with Kotlin default mask? Kotlin constructors have a special DefaultConstructorMarker as the last argument
if (callable.getKind() != CallableKindInfo.STATIC_METHOD && callable.getKind() != CallableKindInfo.INSTANCE_METHOD) {
throw new Failure(
"Only @" + CallableKind.StaticMethod.class.getSimpleName() + " or @" + CallableKind.InstanceMethod.class.getSimpleName() + " can use Kotlin default parameters"
);
}
int expectedKotlinDefaultMaskIndex = callable.getParameters().size() - (hasCallerClassName ? 2 : 1);
if (callable.getParameters().get(expectedKotlinDefaultMaskIndex).getKind() != ParameterKindInfo.KOTLIN_DEFAULT_MASK) {
throw new Failure(
"@" + ParameterKind.KotlinDefaultMask.class.getSimpleName() + " should be the last parameter of may be followed only by @" + ParameterKind.CallerClassName.class.getSimpleName()View on GitHub (pinned to 534f27719b)
Solutions
- Move the @CallerClassName parameter to the last position, or just before the @InjectVisitorContext parameter if one is present.
When it happens
Trigger: An @CallerClassName parameter is placed somewhere other than last (or just before @InjectVisitorContext).
Common situations: Ordering mistakes when declaring interceptor parameters.
AI-assisted analysis of gradle/gradle@534f27719b (2026-08-22).
Data as JSON: /api/errors/2252268bdcbf5bde.
Report an issue: GitHub.