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

  1. 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.