Skip to content

SwiftExtract: separate protocol requirements from default implementations and extension members - #1

Closed
Hokila wants to merge 1 commit into
mainfrom
fix-891-protocol-requirements-collection
Closed

Hokila wants to merge 1 commit into
mainfrom
fix-891-protocol-requirements-collection

Conversation

@Hokila

@Hokila Hokila commented Oct 15, 2026

Copy link
Copy Markdown
Owner

Summary

Fixes swiftlang#891 by distinguishing genuine protocol requirements from default implementations in SwiftExtract (at requirement collection time) rather than deduplicating during code generation:

  • Defer protocol extensions: Unconstrained protocol extensions are collected after all nominal declarations have been analyzed, guaranteeing that all protocol requirements are known before matching default implementations.
  • Separate storage in ExtractedNominalType:
    • methods and variables exclusively store true protocol requirements declared in the protocol definition.
    • Default implementations provided by protocol extensions are recorded in protocolDefaultImplementations.
    • Non-requirement extension methods and variables are recorded in protocolExtensionMethods / protocolExtensionVariables.
  • Requirement satisfaction matching:
    • Implemented ExtractedNominalType.satisfiesProtocolRequirement(candidate:requirement:) and findProtocolRequirement(satisfying:in:).
    • Matches based on function/property name, argument labels, parameter types, conventions, and result types, while ignoring parameter internal names and default argument expressions.
    • Allows non-throwing implementations to satisfy throwing requirements while preserving the throwing requirement on the protocol.
  • Inherited protocol deduplication:
    • In allProtocolRequirementMethods, deduplicate refined requirements across inherited protocols using breadth-first traversal and satisfiesProtocolRequirement.
  • Comprehensive testing:
    • Added 8 regression test cases in JNIProtocolTests covering unique existential box dispatch thunks, Java methods, differing parameter names, overloads, non-throwing default implementations, callback wrappers, non-requirement extension methods, and get-only property setters.

Testing

  • swift test --filter JNIProtocolTests (25/25 passed)
  • swift test --filter SwiftExtractTests (91/91 passed)
  • swift test --filter JExtractSwiftTests (607/607 passed)
  • xcrun swift-format lint --configuration .swift-format clean

…ions and extension members

- Fixes swiftlang#891 at collection time by distinguishing genuine protocol requirements
  from default implementations and extension members in SwiftExtract.
- Defer unconstrained protocol extensions until all nominal declarations are visited,
  ensuring all requirements are populated before matching default implementations.
- Record default implementations in ExtractedNominalType.protocolDefaultImplementations
  and non-requirement extension members in protocolExtensionMethods / protocolExtensionVariables.
- Deduplicate refined requirements across inherited protocols in allProtocolRequirementMethods.
- Add regression tests covering default implementations, differing parameter names,
  overloads, non-throwing default implementations, and non-requirement extension members.
@Hokila Hokila closed this Oct 15, 2026
@Hokila
Hokila deleted the fix-891-protocol-requirements-collection branch October 15, 2026 02:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Compilation error for default protocol function implementation: "invalid redeclaration of..."

1 participant