[NFC] SPMBuildCore: make BuildSystemProvider.Provider
a protocol
#6984
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation:
When requirements are expressed as a closure type (
BuildSystemProvider.Provider
in this case), it confuses the type checker when working on any related code. Multi-line closure type inference has been known to be suboptimal in Swift, and converting it to a protocol localizes "Type of expression is ambiguous without a type annotation" to a specific line that causes the error instead of attaching it to the whole closure.Modifications:
Created a new
protocol BuildSystemFactory
with amakeBuildSystem
method that replaces the previousBuildSystemProvider.Provider
closure typealias. Added newprivate struct NativeBuildSystemFactory
andprivate struct XcodeBuildSystemFactory
inBuildSystemSupport.swift
, which conform to the new protocol and are used in the implementation ofdefaultBuildSystemProvider
computed property.Result:
It's much easier to work with
BuildSystemFactory
protocol: it no longer confuses the type checker when changes to the closure body are made or need to be made. Additionally, the new protocol method can use named function arguments instead of unnamed ones, since closures don't support the former.