Skip to content

Periphery Issue: Redundant public accessibility false positive for @resultBuilder #1112

@juicyfru1t

Description

@juicyfru1t

Description

Periphery produces contradictory diagnostics for a public @resultBuilder that is used as a parameter attribute in a public initializer.

Environment

  • Periphery: 3.7.2

Setup

// Module A

@resultBuilder
public struct ValidationErrorBuilder {
    // ... buildBlock, buildOptional, etc.
}

public struct ValidationError {
    public init(@ValidationErrorBuilder _ content: () -> [ValidationItem]) {
        // ...
    }
}

ValidationErrorBuilder is not referenced directly by name outside the module — consumers simply use the DSL syntax enabled by the @resultBuilder attribute on the public init. However, its public access level is required because it is used as a parameter attribute in a public initializer.

Problem

Same contradictory cycle as described in the constrained extension case:

  1. Without // periphery:ignore — Periphery reports:

    ValidationErrorBuilder is declared public is declared public, but not used outside of

    This is a false positive because removing public would cause a compiler error: a @resultBuilder used as a parameter attribute in a public function/init must itself be public.

  2. With // periphery:ignore — Periphery reports that the ignore annotation is unnecessary.

Expected Behavior

Periphery should recognize that a @resultBuilder type used as a parameter attribute in a public function or initializer requires public accessibility, and should not flag it as "redundant public".

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions