Skip to content

Commit 4da8aaf

Browse files
committed
Fix nested tag reference merging
1 parent 08eebff commit 4da8aaf

2 files changed

Lines changed: 32 additions & 3 deletions

File tree

Sources/Cadova/Abstract Layer/Environment/Values/Environment+Anchors.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,15 @@ internal extension EnvironmentValues {
1717
}
1818

1919
func withDefinedReferences(_ referenceState: ReferenceState) -> Self {
20-
setting(key: Self.environmentKey, value: UpstreamReferences(
21-
anchors: referenceState.definedAnchors,
22-
tags: referenceState.definedTags
20+
let existingReferences = upstreamReferences
21+
let mergedAnchors = (existingReferences?.anchors ?? [:])
22+
.merging(referenceState.definedAnchors) { $0.union($1) }
23+
let mergedTags = (existingReferences?.tags ?? [:])
24+
.merging(referenceState.definedTags) { $0 + $1 }
25+
26+
return setting(key: Self.environmentKey, value: UpstreamReferences(
27+
anchors: mergedAnchors,
28+
tags: mergedTags
2329
))
2430
}
2531

Tests/Tests/Tags.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,27 @@ struct TagTests {
3434
#expect(try await geometry.bounds .init(minimum: [-5, -5, 0], maximum: [5, 5, 17]))
3535
#expect(try await geometry.measurements.volume 567.631)
3636
}
37+
38+
@Test func `tag references include definitions from nested and outer booleans`() async throws {
39+
let sharedTag = Tag("shared tag")
40+
41+
let geometry = Box(x: 21, y: 1, z: 1)
42+
.subtracting {
43+
sharedTag
44+
}
45+
.adding {
46+
Box(1)
47+
.tagged(sharedTag)
48+
.subtracting { Box(1) }
49+
.translated(x: 5)
50+
}
51+
.adding {
52+
Box(1)
53+
.tagged(sharedTag)
54+
.subtracting { Box(1) }
55+
.translated(x: 15)
56+
}
57+
58+
#expect(try await geometry.measurements.volume 19)
59+
}
3760
}

0 commit comments

Comments
 (0)