Skip to content

Conversation

bripeticca
Copy link
Contributor

@bripeticca bripeticca commented Sep 16, 2025

  • Explanation:
    Addresses multiple traits issues:
    • Changes the check for trait-guarded target dependencies to determine whether the package dependency from which it derives is used in the parent package; prior to this change, the check was asserting that all traits in the when condition of a target dependency were enabled for the dependency to be considered unguarded, but now the check confirms that at least one trait in the condition is enabled.
    • Fixes some errors in trait computation that hadn't considered when default traits ["default"] were being appended to the EnabledTraitsMap, which should only consider a list of flattened traits + explicitly enabled traits by a user/parent package. The inclusion of default in this dictionary was resulting in an inaccurate computation of which traits were enabled, since pre-computation serves to flatten the list of transitively enabled traits for future reference.
      There were also cases where we were re-computing transitively enabled traits in areas where we had already filled out the enabledTraitsMap, so we now default to simply fetching the entry from the dictionary instead of computing the traits all over again.
  • Scope:
    Package resolution stage; particularly affects pre-computation of transitively enabled traits when determining which target dependencies are/aren't guarded by traits. Also allows for multiple traits to be considered in a target dependency's when condition, any of which being enabled would then include said target dependency.
  • Issues:
  • Original PRs:
    Fix for .when(traits:) condition not working for multiple traits #9015
    Fix pre-computation of traits when loading dependency manifests #9057
  • Risk:
    Low risk; fixes trait-related issues.
  • Testing:
    Fixtures added for end-to-end testing of the issue; regression tests added to multiple suites
  • Reviewers:
    @FranzBusch @jakepetroules @dschaefer2

…ftlang#9015)

The culprit here is the fact that we were essentially doing an AND
boolean check across all the traits in the target dependency condition,
when we should be doing an OR boolean check.

If at least one trait is enabled in the list of traits in the target
dependency condition, then the target dependecy should be considered
enabled as well.
@bripeticca
Copy link
Contributor Author

@swift-ci please test

…tlang#9057)

This fix addresses some issues that arose with trait-based dependency
resolution on Linux and, found through development, a related issue
found involving the `swift package show-dependencies` command. It fixes
an error that was thrown as a discrepancy in state when executing `swift
package show-dependencies` if traits were guarding a dependency and was
omitted from the package graph.

Additionally, this will assure that the `EnabledTraitsMap` guards
against explicitly adding "default" traits to the stored dictionary,
since this wrapper is a mechanism to determine whether traits have been
explicitly set (and therefore have overridden "default" or have
flattened the list of default traits).
@bripeticca
Copy link
Contributor Author

@swift-ci please test

@bripeticca bripeticca changed the title [6.2.1] Cherry-pick: Fix for .when(traits:) condition not working for multiple traits (#9015) [6.2.1] Cherry-pick: Fix traits .when(traits:) condition; pre-computation when loading dependency manifests Sep 16, 2025
@bripeticca
Copy link
Contributor Author

@swift-ci please test windows

@bripeticca bripeticca marked this pull request as ready for review September 18, 2025 17:44
@bripeticca bripeticca requested a review from a team as a code owner September 18, 2025 17:44
@bripeticca bripeticca merged commit 0b6969e into swiftlang:release/6.2.1 Sep 19, 2025
6 checks passed
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.

2 participants