diff --git a/.gitignore b/.gitignore
index 54956470..4cb80c40 100755
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,7 @@
.DS_Store
## Xcode workspace
-*.xcworkspace
+#*.xcworkspace
## Build generated
build/
diff --git a/.watchOS/watchOS-App/App-1-Info.plist b/.watchOS/watchOS-App/App-1-Info.plist
new file mode 100644
index 00000000..1ec145d8
--- /dev/null
+++ b/.watchOS/watchOS-App/App-1-Info.plist
@@ -0,0 +1,29 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+
+ WKWatchKitApp
+
+
+
diff --git a/.watchOS/watchOS-App/Base.lproj/Interface.storyboard b/.watchOS/watchOS-App/Base.lproj/Interface.storyboard
new file mode 100644
index 00000000..e7869ede
--- /dev/null
+++ b/.watchOS/watchOS-App/Base.lproj/Interface.storyboard
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.watchOS/watchOS-Ext/Ext-1-Info.plist b/.watchOS/watchOS-Ext/Ext-1-Info.plist
new file mode 100644
index 00000000..d19652ef
--- /dev/null
+++ b/.watchOS/watchOS-Ext/Ext-1-Info.plist
@@ -0,0 +1,34 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ NSExtension
+
+ NSExtensionAttributes
+
+ WKAppBundleIdentifier
+ com.viewinspector.watchOS1.watchkitapp
+
+ NSExtensionPointIdentifier
+ com.apple.watchkit
+
+ WKWatchOnly
+
+
+
diff --git a/.watchOS/watchOS-Ext/Ext-2-Info.plist b/.watchOS/watchOS-Ext/Ext-2-Info.plist
new file mode 100644
index 00000000..e253fffe
--- /dev/null
+++ b/.watchOS/watchOS-Ext/Ext-2-Info.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ NSExtension
+
+ NSExtensionAttributes
+
+ WKAppBundleIdentifier
+ com.viewinspector.watchOS2.watchkitapp
+
+ NSExtensionPointIdentifier
+ com.apple.watchkit
+
+
+
diff --git a/.watchOS/watchOS-Ext/watchOSApp+Testable.swift b/.watchOS/watchOS-Ext/watchOSApp+Testable.swift
new file mode 100644
index 00000000..0fe66c45
--- /dev/null
+++ b/.watchOS/watchOS-Ext/watchOSApp+Testable.swift
@@ -0,0 +1,42 @@
+import SwiftUI
+import WatchKit
+import Combine
+
+#if !(os(watchOS) && DEBUG)
+
+typealias RootView = T
+typealias TestViewSubject = Set
+
+extension View {
+ @inline(__always)
+ func testable(_ injector: TestViewSubject) -> Self {
+ self
+ }
+}
+
+#else
+
+typealias RootView = ModifiedContent
+typealias TestViewSubject = CurrentValueSubject<[(String, AnyView)], Never>
+
+extension View {
+ func testable(_ injector: TestViewSubject) -> ModifiedContent {
+ modifier(TestViewHost(injector: injector))
+ }
+}
+
+struct TestViewHost: ViewModifier {
+
+ @State private var hostedViews: [(String, AnyView)] = []
+ let injector: TestViewSubject
+
+ func body(content: Content) -> some View {
+ ZStack {
+ content
+ ForEach(hostedViews, id: \.0) { $0.1 }
+ }
+ .onReceive(injector) { hostedViews = $0 }
+ }
+}
+
+#endif
diff --git a/.watchOS/watchOS-Ext/watchOSApp-1.swift b/.watchOS/watchOS-Ext/watchOSApp-1.swift
new file mode 100644
index 00000000..6136b5ae
--- /dev/null
+++ b/.watchOS/watchOS-Ext/watchOSApp-1.swift
@@ -0,0 +1,22 @@
+import SwiftUI
+
+@main
+struct watchOSApp: App {
+
+ // swiftlint:disable weak_delegate
+ @WKExtensionDelegateAdaptor(ExtensionDelegate.self) var extDelegate
+ // swiftlint:enable weak_delegate
+
+ var body: some Scene {
+ WindowGroup {
+ NavigationView {
+ Text("Hi")
+ }
+ .testable(extDelegate.testViewSubject)
+ }
+ }
+}
+
+final class ExtensionDelegate: NSObject, WKExtensionDelegate {
+ let testViewSubject = TestViewSubject([])
+}
diff --git a/.watchOS/watchOS-Ext/watchOSApp-2.swift b/.watchOS/watchOS-Ext/watchOSApp-2.swift
new file mode 100644
index 00000000..32071b39
--- /dev/null
+++ b/.watchOS/watchOS-Ext/watchOSApp-2.swift
@@ -0,0 +1,18 @@
+import WatchKit
+import SwiftUI
+
+final class RootInterfaceController: WKHostingController> {
+
+ let testViewSubject = TestViewSubject([])
+
+ override var body: RootView {
+ return ContentView()
+ .testable(testViewSubject)
+ }
+}
+
+struct ContentView: View {
+ var body: some View {
+ Text("Hi")
+ }
+}
diff --git a/.watchOS/watchOS.xcodeproj/project.pbxproj b/.watchOS/watchOS.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..96f546fb
--- /dev/null
+++ b/.watchOS/watchOS.xcodeproj/project.pbxproj
@@ -0,0 +1,1768 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 52;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 520DC60F26F60FBA00FCFFFD /* LazyGroupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58B26F60FBA00FCFFFD /* LazyGroupTests.swift */; };
+ 520DC61026F60FBA00FCFFFD /* ViewHostingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58C26F60FBA00FCFFFD /* ViewHostingTests.swift */; };
+ 520DC61126F60FBA00FCFFFD /* InspectionEmissaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58D26F60FBA00FCFFFD /* InspectionEmissaryTests.swift */; };
+ 520DC61226F60FBA00FCFFFD /* BaseTypesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58E26F60FBA00FCFFFD /* BaseTypesTests.swift */; };
+ 520DC61326F60FBA00FCFFFD /* ViewSearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58F26F60FBA00FCFFFD /* ViewSearchTests.swift */; };
+ 520DC61426F60FBA00FCFFFD /* HitTestingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59226F60FBA00FCFFFD /* HitTestingTests.swift */; };
+ 520DC61526F60FBA00FCFFFD /* GestureModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59326F60FBA00FCFFFD /* GestureModifierTests.swift */; };
+ 520DC61626F60FBA00FCFFFD /* GestureActionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59426F60FBA00FCFFFD /* GestureActionTests.swift */; };
+ 520DC61726F60FBA00FCFFFD /* HighPriorityGestureModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59526F60FBA00FCFFFD /* HighPriorityGestureModifierTests.swift */; };
+ 520DC61826F60FBA00FCFFFD /* SimultaneousGestureModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59626F60FBA00FCFFFD /* SimultaneousGestureModifierTests.swift */; };
+ 520DC61926F60FBA00FCFFFD /* ComposedGestureExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59726F60FBA00FCFFFD /* ComposedGestureExampleTests.swift */; };
+ 520DC61A26F60FBA00FCFFFD /* SequenceGestureChildrenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59826F60FBA00FCFFFD /* SequenceGestureChildrenTests.swift */; };
+ 520DC61B26F60FBA00FCFFFD /* RotationGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59926F60FBA00FCFFFD /* RotationGestureTests.swift */; };
+ 520DC61C26F60FBA00FCFFFD /* ExclusiveGestureChildrenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59A26F60FBA00FCFFFD /* ExclusiveGestureChildrenTests.swift */; };
+ 520DC61D26F60FBA00FCFFFD /* TapGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59B26F60FBA00FCFFFD /* TapGestureTests.swift */; };
+ 520DC61E26F60FBA00FCFFFD /* ExclusiveGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59C26F60FBA00FCFFFD /* ExclusiveGestureTests.swift */; };
+ 520DC61F26F60FBA00FCFFFD /* SimultaneousGestureChildrenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59D26F60FBA00FCFFFD /* SimultaneousGestureChildrenTests.swift */; };
+ 520DC62026F60FBA00FCFFFD /* SequenceGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59E26F60FBA00FCFFFD /* SequenceGestureTests.swift */; };
+ 520DC62126F60FBA00FCFFFD /* GestureExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59F26F60FBA00FCFFFD /* GestureExampleTests.swift */; };
+ 520DC62226F60FBA00FCFFFD /* DragGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A026F60FBA00FCFFFD /* DragGestureTests.swift */; };
+ 520DC62326F60FBA00FCFFFD /* CommonComposedGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A126F60FBA00FCFFFD /* CommonComposedGestureTests.swift */; };
+ 520DC62426F60FBA00FCFFFD /* CommonComposedGestureUpdatingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A226F60FBA00FCFFFD /* CommonComposedGestureUpdatingTests.swift */; };
+ 520DC62526F60FBB00FCFFFD /* SimultaneousGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A326F60FBA00FCFFFD /* SimultaneousGestureTests.swift */; };
+ 520DC62626F60FBB00FCFFFD /* CommonComposedGestureEndedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A426F60FBA00FCFFFD /* CommonComposedGestureEndedTests.swift */; };
+ 520DC62726F60FBB00FCFFFD /* CommonComposedGestureChangedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A526F60FBA00FCFFFD /* CommonComposedGestureChangedTests.swift */; };
+ 520DC62826F60FBB00FCFFFD /* LongPressGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A626F60FBA00FCFFFD /* LongPressGestureTests.swift */; };
+ 520DC62926F60FBB00FCFFFD /* CommonGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A726F60FBA00FCFFFD /* CommonGestureTests.swift */; };
+ 520DC62A26F60FBB00FCFFFD /* MagnificationGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A826F60FBA00FCFFFD /* MagnificationGestureTests.swift */; };
+ 520DC62B26F60FBB00FCFFFD /* Test.strings in Resources */ = {isa = PBXBuildFile; fileRef = 520DC5AA26F60FBA00FCFFFD /* Test.strings */; };
+ 520DC62C26F60FBB00FCFFFD /* InspectableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5AE26F60FBA00FCFFFD /* InspectableViewTests.swift */; };
+ 520DC62D26F60FBB00FCFFFD /* InspectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5AF26F60FBA00FCFFFD /* InspectorTests.swift */; };
+ 520DC62E26F60FBB00FCFFFD /* ZStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B126F60FBA00FCFFFD /* ZStackTests.swift */; };
+ 520DC62F26F60FBB00FCFFFD /* OptionalViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B226F60FBA00FCFFFD /* OptionalViewTests.swift */; };
+ 520DC63026F60FBB00FCFFFD /* MenuButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B326F60FBA00FCFFFD /* MenuButtonTests.swift */; };
+ 520DC63126F60FBB00FCFFFD /* TouchBarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B426F60FBA00FCFFFD /* TouchBarTests.swift */; };
+ 520DC63226F60FBB00FCFFFD /* GroupBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B526F60FBA00FCFFFD /* GroupBoxTests.swift */; };
+ 520DC63326F60FBB00FCFFFD /* SheetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B626F60FBA00FCFFFD /* SheetTests.swift */; };
+ 520DC63426F60FBB00FCFFFD /* RadialGradientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B726F60FBA00FCFFFD /* RadialGradientTests.swift */; };
+ 520DC63526F60FBB00FCFFFD /* ScrollViewReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B826F60FBA00FCFFFD /* ScrollViewReaderTests.swift */; };
+ 520DC63626F60FBB00FCFFFD /* MapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B926F60FBA00FCFFFD /* MapTests.swift */; };
+ 520DC63726F60FBB00FCFFFD /* SubscriptionViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BA26F60FBA00FCFFFD /* SubscriptionViewTests.swift */; };
+ 520DC63826F60FBB00FCFFFD /* MenuTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BB26F60FBA00FCFFFD /* MenuTests.swift */; };
+ 520DC63926F60FBB00FCFFFD /* LabelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BC26F60FBA00FCFFFD /* LabelTests.swift */; };
+ 520DC63A26F60FBB00FCFFFD /* TextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BD26F60FBA00FCFFFD /* TextTests.swift */; };
+ 520DC63B26F60FBB00FCFFFD /* OpaqueViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BE26F60FBA00FCFFFD /* OpaqueViewTests.swift */; };
+ 520DC63C26F60FBB00FCFFFD /* HStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BF26F60FBA00FCFFFD /* HStackTests.swift */; };
+ 520DC63D26F60FBB00FCFFFD /* TreeViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C026F60FBA00FCFFFD /* TreeViewTests.swift */; };
+ 520DC63E26F60FBB00FCFFFD /* EquatableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C126F60FBA00FCFFFD /* EquatableViewTests.swift */; };
+ 520DC63F26F60FBB00FCFFFD /* LinearGradientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C226F60FBA00FCFFFD /* LinearGradientTests.swift */; };
+ 520DC64026F60FBB00FCFFFD /* ToolbarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C326F60FBA00FCFFFD /* ToolbarTests.swift */; };
+ 520DC64126F60FBB00FCFFFD /* DisclosureGroupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C426F60FBA00FCFFFD /* DisclosureGroupTests.swift */; };
+ 520DC64226F60FBB00FCFFFD /* GeometryReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C526F60FBA00FCFFFD /* GeometryReaderTests.swift */; };
+ 520DC64326F60FBB00FCFFFD /* ProgressViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C626F60FBA00FCFFFD /* ProgressViewTests.swift */; };
+ 520DC64426F60FBB00FCFFFD /* EnvironmentObjectInjectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C726F60FBA00FCFFFD /* EnvironmentObjectInjectionTests.swift */; };
+ 520DC64526F60FBB00FCFFFD /* TabViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C826F60FBA00FCFFFD /* TabViewTests.swift */; };
+ 520DC64626F60FBB00FCFFFD /* PopoverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C926F60FBA00FCFFFD /* PopoverTests.swift */; };
+ 520DC64726F60FBB00FCFFFD /* EmptyViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CA26F60FBA00FCFFFD /* EmptyViewTests.swift */; };
+ 520DC64826F60FBB00FCFFFD /* CustomViewModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CB26F60FBA00FCFFFD /* CustomViewModifierTests.swift */; };
+ 520DC64926F60FBB00FCFFFD /* ImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CC26F60FBA00FCFFFD /* ImageTests.swift */; };
+ 520DC64A26F60FBB00FCFFFD /* EnvironmentReaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CD26F60FBA00FCFFFD /* EnvironmentReaderViewTests.swift */; };
+ 520DC64B26F60FBB00FCFFFD /* StepperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CE26F60FBA00FCFFFD /* StepperTests.swift */; };
+ 520DC64C26F60FBB00FCFFFD /* FormTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CF26F60FBA00FCFFFD /* FormTests.swift */; };
+ 520DC64D26F60FBB00FCFFFD /* TupleViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D026F60FBA00FCFFFD /* TupleViewTests.swift */; };
+ 520DC64E26F60FBB00FCFFFD /* ConfirmationDialogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D126F60FBA00FCFFFD /* ConfirmationDialogTests.swift */; };
+ 520DC64F26F60FBB00FCFFFD /* LazyVGridTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D226F60FBA00FCFFFD /* LazyVGridTests.swift */; };
+ 520DC65026F60FBB00FCFFFD /* LazyHStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D326F60FBA00FCFFFD /* LazyHStackTests.swift */; };
+ 520DC65126F60FBB00FCFFFD /* AlertTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D426F60FBA00FCFFFD /* AlertTests.swift */; };
+ 520DC65226F60FBB00FCFFFD /* TextAttributesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D526F60FBA00FCFFFD /* TextAttributesTests.swift */; };
+ 520DC65326F60FBB00FCFFFD /* PasteButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D626F60FBA00FCFFFD /* PasteButtonTests.swift */; };
+ 520DC65426F60FBB00FCFFFD /* DividerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D726F60FBA00FCFFFD /* DividerTests.swift */; };
+ 520DC65526F60FBB00FCFFFD /* ForEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D826F60FBA00FCFFFD /* ForEachTests.swift */; };
+ 520DC65626F60FBB00FCFFFD /* ActionSheetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D926F60FBA00FCFFFD /* ActionSheetTests.swift */; };
+ 520DC65726F60FBB00FCFFFD /* DelayedPreferenceViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DA26F60FBA00FCFFFD /* DelayedPreferenceViewTests.swift */; };
+ 520DC65826F60FBB00FCFFFD /* ButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DB26F60FBA00FCFFFD /* ButtonTests.swift */; };
+ 520DC65926F60FBB00FCFFFD /* LinkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DC26F60FBA00FCFFFD /* LinkTests.swift */; };
+ 520DC65A26F60FBB00FCFFFD /* SliderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DD26F60FBA00FCFFFD /* SliderTests.swift */; };
+ 520DC65B26F60FBB00FCFFFD /* CustomViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DE26F60FBA00FCFFFD /* CustomViewTests.swift */; };
+ 520DC65C26F60FBB00FCFFFD /* ColorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DF26F60FBA00FCFFFD /* ColorTests.swift */; };
+ 520DC65D26F60FBB00FCFFFD /* TextEditorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E026F60FBA00FCFFFD /* TextEditorTests.swift */; };
+ 520DC65E26F60FBB00FCFFFD /* MapAnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E126F60FBA00FCFFFD /* MapAnnotationTests.swift */; };
+ 520DC65F26F60FBB00FCFFFD /* AngularGradientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E226F60FBA00FCFFFD /* AngularGradientTests.swift */; };
+ 520DC66026F60FBB00FCFFFD /* ConditionalContentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E326F60FBA00FCFFFD /* ConditionalContentTests.swift */; };
+ 520DC66126F60FBB00FCFFFD /* VSplitViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E426F60FBA00FCFFFD /* VSplitViewTests.swift */; };
+ 520DC66226F60FBB00FCFFFD /* NavigationViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E526F60FBA00FCFFFD /* NavigationViewTests.swift */; };
+ 520DC66326F60FBB00FCFFFD /* EditButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E626F60FBA00FCFFFD /* EditButtonTests.swift */; };
+ 520DC66426F60FBB00FCFFFD /* IDViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E726F60FBA00FCFFFD /* IDViewTests.swift */; };
+ 520DC66526F60FBB00FCFFFD /* CustomViewBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E826F60FBA00FCFFFD /* CustomViewBuilderTests.swift */; };
+ 520DC66626F60FBB00FCFFFD /* TextFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E926F60FBA00FCFFFD /* TextFieldTests.swift */; };
+ 520DC66726F60FBB00FCFFFD /* FullScreenCoverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EA26F60FBA00FCFFFD /* FullScreenCoverTests.swift */; };
+ 520DC66826F60FBB00FCFFFD /* NavigationLinkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EB26F60FBA00FCFFFD /* NavigationLinkTests.swift */; };
+ 520DC66926F60FBB00FCFFFD /* VStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EC26F60FBA00FCFFFD /* VStackTests.swift */; };
+ 520DC66A26F60FBB00FCFFFD /* PickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5ED26F60FBA00FCFFFD /* PickerTests.swift */; };
+ 520DC66B26F60FBB00FCFFFD /* GroupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EE26F60FBA00FCFFFD /* GroupTests.swift */; };
+ 520DC66C26F60FBB00FCFFFD /* SectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EF26F60FBA00FCFFFD /* SectionTests.swift */; };
+ 520DC66D26F60FBB00FCFFFD /* ToggleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F026F60FBA00FCFFFD /* ToggleTests.swift */; };
+ 520DC66E26F60FBB00FCFFFD /* SpacerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F126F60FBA00FCFFFD /* SpacerTests.swift */; };
+ 520DC66F26F60FBB00FCFFFD /* DatePickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F226F60FBA00FCFFFD /* DatePickerTests.swift */; };
+ 520DC67026F60FBB00FCFFFD /* SafeAreaInsetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F326F60FBA00FCFFFD /* SafeAreaInsetTests.swift */; };
+ 520DC67126F60FBB00FCFFFD /* ColorPickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F426F60FBA00FCFFFD /* ColorPickerTests.swift */; };
+ 520DC67226F60FBB00FCFFFD /* OutlineGroupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F526F60FBA00FCFFFD /* OutlineGroupTests.swift */; };
+ 520DC67326F60FBB00FCFFFD /* ScrollViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F626F60FBA00FCFFFD /* ScrollViewTests.swift */; };
+ 520DC67426F60FBB00FCFFFD /* SecureFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F726F60FBA00FCFFFD /* SecureFieldTests.swift */; };
+ 520DC67526F60FBB00FCFFFD /* LazyHGridTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F826F60FBA00FCFFFD /* LazyHGridTests.swift */; };
+ 520DC67626F60FBB00FCFFFD /* ShapeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F926F60FBA00FCFFFD /* ShapeTests.swift */; };
+ 520DC67726F60FBB00FCFFFD /* ListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FA26F60FBA00FCFFFD /* ListTests.swift */; };
+ 520DC67826F60FBB00FCFFFD /* HSplitViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FB26F60FBA00FCFFFD /* HSplitViewTests.swift */; };
+ 520DC67926F60FBB00FCFFFD /* AnyViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FC26F60FBA00FCFFFD /* AnyViewTests.swift */; };
+ 520DC67A26F60FBB00FCFFFD /* LazyVStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FD26F60FBA00FCFFFD /* LazyVStackTests.swift */; };
+ 520DC67B26F60FBB00FCFFFD /* ConfigurationModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FF26F60FBA00FCFFFD /* ConfigurationModifiersTests.swift */; };
+ 520DC67C26F60FBB00FCFFFD /* PresentationModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60026F60FBA00FCFFFD /* PresentationModifiersTests.swift */; };
+ 520DC67D26F60FBB00FCFFFD /* InteractionModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60126F60FBA00FCFFFD /* InteractionModifiersTests.swift */; };
+ 520DC67E26F60FBB00FCFFFD /* EventsModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60226F60FBA00FCFFFD /* EventsModifiersTests.swift */; };
+ 520DC67F26F60FBB00FCFFFD /* SizingModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60326F60FBA00FCFFFD /* SizingModifiersTests.swift */; };
+ 520DC68026F60FBB00FCFFFD /* NestedModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60426F60FBA00FCFFFD /* NestedModifiersTests.swift */; };
+ 520DC68126F60FBB00FCFFFD /* PositioningModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60526F60FBA00FCFFFD /* PositioningModifiersTests.swift */; };
+ 520DC68226F60FBB00FCFFFD /* TextInputModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60626F60FBA00FCFFFD /* TextInputModifiersTests.swift */; };
+ 520DC68326F60FBB00FCFFFD /* CustomStyleModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60726F60FBA00FCFFFD /* CustomStyleModifiersTests.swift */; };
+ 520DC68426F60FBB00FCFFFD /* TransitiveModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60826F60FBA00FCFFFD /* TransitiveModifiersTests.swift */; };
+ 520DC68526F60FBB00FCFFFD /* AccessibilityModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60926F60FBA00FCFFFD /* AccessibilityModifiersTests.swift */; };
+ 520DC68626F60FBB00FCFFFD /* AnimationModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60A26F60FBA00FCFFFD /* AnimationModifiersTests.swift */; };
+ 520DC68726F60FBB00FCFFFD /* VisualEffectModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60B26F60FBA00FCFFFD /* VisualEffectModifiersTests.swift */; };
+ 520DC68826F60FBB00FCFFFD /* EnvironmentModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60C26F60FBA00FCFFFD /* EnvironmentModifiersTests.swift */; };
+ 520DC68926F60FBB00FCFFFD /* ViewPaddingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60D26F60FBA00FCFFFD /* ViewPaddingTests.swift */; };
+ 520DC68A26F60FBB00FCFFFD /* TransformingModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60E26F60FBA00FCFFFD /* TransformingModifiersTests.swift */; };
+ 520DC69026F60FF400FCFFFD /* AlertTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D426F60FBA00FCFFFD /* AlertTests.swift */; };
+ 520DC69126F60FF400FCFFFD /* InspectableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5AE26F60FBA00FCFFFD /* InspectableViewTests.swift */; };
+ 520DC69226F60FF400FCFFFD /* ExclusiveGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59C26F60FBA00FCFFFD /* ExclusiveGestureTests.swift */; };
+ 520DC69326F60FF400FCFFFD /* MenuButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B326F60FBA00FCFFFD /* MenuButtonTests.swift */; };
+ 520DC69426F60FF400FCFFFD /* EnvironmentObjectInjectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C726F60FBA00FCFFFD /* EnvironmentObjectInjectionTests.swift */; };
+ 520DC69526F60FF400FCFFFD /* LazyVStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FD26F60FBA00FCFFFD /* LazyVStackTests.swift */; };
+ 520DC69626F60FF400FCFFFD /* MapAnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E126F60FBA00FCFFFD /* MapAnnotationTests.swift */; };
+ 520DC69726F60FF400FCFFFD /* MenuTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BB26F60FBA00FCFFFD /* MenuTests.swift */; };
+ 520DC69826F60FF400FCFFFD /* PresentationModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60026F60FBA00FCFFFD /* PresentationModifiersTests.swift */; };
+ 520DC69926F60FF400FCFFFD /* SliderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DD26F60FBA00FCFFFD /* SliderTests.swift */; };
+ 520DC69A26F60FF400FCFFFD /* PopoverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C926F60FBA00FCFFFD /* PopoverTests.swift */; };
+ 520DC69B26F60FF400FCFFFD /* ActionSheetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D926F60FBA00FCFFFD /* ActionSheetTests.swift */; };
+ 520DC69C26F60FF400FCFFFD /* SpacerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F126F60FBA00FCFFFD /* SpacerTests.swift */; };
+ 520DC69D26F60FF400FCFFFD /* RadialGradientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B726F60FBA00FCFFFD /* RadialGradientTests.swift */; };
+ 520DC69E26F60FF400FCFFFD /* TextFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E926F60FBA00FCFFFD /* TextFieldTests.swift */; };
+ 520DC69F26F60FF400FCFFFD /* LinkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DC26F60FBA00FCFFFD /* LinkTests.swift */; };
+ 520DC6A026F60FF400FCFFFD /* EventsModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60226F60FBA00FCFFFD /* EventsModifiersTests.swift */; };
+ 520DC6A126F60FF400FCFFFD /* StepperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CE26F60FBA00FCFFFD /* StepperTests.swift */; };
+ 520DC6A226F60FF400FCFFFD /* ConfirmationDialogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D126F60FBA00FCFFFD /* ConfirmationDialogTests.swift */; };
+ 520DC6A326F60FF400FCFFFD /* HSplitViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FB26F60FBA00FCFFFD /* HSplitViewTests.swift */; };
+ 520DC6A426F60FF400FCFFFD /* CustomViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DE26F60FBA00FCFFFD /* CustomViewTests.swift */; };
+ 520DC6A526F60FF400FCFFFD /* ListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FA26F60FBA00FCFFFD /* ListTests.swift */; };
+ 520DC6A626F60FF400FCFFFD /* HitTestingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59226F60FBA00FCFFFD /* HitTestingTests.swift */; };
+ 520DC6A726F60FF400FCFFFD /* SectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EF26F60FBA00FCFFFD /* SectionTests.swift */; };
+ 520DC6A826F60FF400FCFFFD /* VSplitViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E426F60FBA00FCFFFD /* VSplitViewTests.swift */; };
+ 520DC6A926F60FF400FCFFFD /* EnvironmentModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60C26F60FBA00FCFFFD /* EnvironmentModifiersTests.swift */; };
+ 520DC6AA26F60FF400FCFFFD /* SecureFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F726F60FBA00FCFFFD /* SecureFieldTests.swift */; };
+ 520DC6AB26F60FF400FCFFFD /* VisualEffectModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60B26F60FBA00FCFFFD /* VisualEffectModifiersTests.swift */; };
+ 520DC6AC26F60FF400FCFFFD /* AnyViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FC26F60FBA00FCFFFD /* AnyViewTests.swift */; };
+ 520DC6AD26F60FF400FCFFFD /* AngularGradientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E226F60FBA00FCFFFD /* AngularGradientTests.swift */; };
+ 520DC6AE26F60FF400FCFFFD /* PickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5ED26F60FBA00FCFFFD /* PickerTests.swift */; };
+ 520DC6AF26F60FF400FCFFFD /* SimultaneousGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A326F60FBA00FCFFFD /* SimultaneousGestureTests.swift */; };
+ 520DC6B026F60FF400FCFFFD /* SizingModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60326F60FBA00FCFFFD /* SizingModifiersTests.swift */; };
+ 520DC6B126F60FF400FCFFFD /* CustomViewBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E826F60FBA00FCFFFD /* CustomViewBuilderTests.swift */; };
+ 520DC6B226F60FF400FCFFFD /* ZStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B126F60FBA00FCFFFD /* ZStackTests.swift */; };
+ 520DC6B326F60FF400FCFFFD /* CommonComposedGestureChangedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A526F60FBA00FCFFFD /* CommonComposedGestureChangedTests.swift */; };
+ 520DC6B426F60FF400FCFFFD /* EditButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E626F60FBA00FCFFFD /* EditButtonTests.swift */; };
+ 520DC6B526F60FF400FCFFFD /* OpaqueViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BE26F60FBA00FCFFFD /* OpaqueViewTests.swift */; };
+ 520DC6B626F60FF400FCFFFD /* EmptyViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CA26F60FBA00FCFFFD /* EmptyViewTests.swift */; };
+ 520DC6B726F60FF400FCFFFD /* OptionalViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B226F60FBA00FCFFFD /* OptionalViewTests.swift */; };
+ 520DC6B826F60FF400FCFFFD /* ConfigurationModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5FF26F60FBA00FCFFFD /* ConfigurationModifiersTests.swift */; };
+ 520DC6B926F60FF400FCFFFD /* InteractionModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60126F60FBA00FCFFFD /* InteractionModifiersTests.swift */; };
+ 520DC6BA26F60FF400FCFFFD /* PositioningModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60526F60FBA00FCFFFD /* PositioningModifiersTests.swift */; };
+ 520DC6BB26F60FF400FCFFFD /* NestedModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60426F60FBA00FCFFFD /* NestedModifiersTests.swift */; };
+ 520DC6BC26F60FF400FCFFFD /* TransitiveModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60826F60FBA00FCFFFD /* TransitiveModifiersTests.swift */; };
+ 520DC6BD26F60FF400FCFFFD /* AnimationModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60A26F60FBA00FCFFFD /* AnimationModifiersTests.swift */; };
+ 520DC6BE26F60FF400FCFFFD /* IDViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E726F60FBA00FCFFFD /* IDViewTests.swift */; };
+ 520DC6BF26F60FF400FCFFFD /* SubscriptionViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BA26F60FBA00FCFFFD /* SubscriptionViewTests.swift */; };
+ 520DC6C026F60FF400FCFFFD /* SequenceGestureChildrenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59826F60FBA00FCFFFD /* SequenceGestureChildrenTests.swift */; };
+ 520DC6C126F60FF400FCFFFD /* TextEditorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E026F60FBA00FCFFFD /* TextEditorTests.swift */; };
+ 520DC6C226F60FF400FCFFFD /* SimultaneousGestureModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59626F60FBA00FCFFFD /* SimultaneousGestureModifierTests.swift */; };
+ 520DC6C326F60FF400FCFFFD /* HighPriorityGestureModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59526F60FBA00FCFFFD /* HighPriorityGestureModifierTests.swift */; };
+ 520DC6C426F60FF400FCFFFD /* ShapeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F926F60FBA00FCFFFD /* ShapeTests.swift */; };
+ 520DC6C526F60FF400FCFFFD /* ToolbarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C326F60FBA00FCFFFD /* ToolbarTests.swift */; };
+ 520DC6C626F60FF400FCFFFD /* HStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BF26F60FBA00FCFFFD /* HStackTests.swift */; };
+ 520DC6C726F60FF400FCFFFD /* TouchBarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B426F60FBA00FCFFFD /* TouchBarTests.swift */; };
+ 520DC6C826F60FF400FCFFFD /* CustomViewModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CB26F60FBA00FCFFFD /* CustomViewModifierTests.swift */; };
+ 520DC6C926F60FF400FCFFFD /* TextInputModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60626F60FBA00FCFFFD /* TextInputModifiersTests.swift */; };
+ 520DC6CA26F60FF400FCFFFD /* GestureExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59F26F60FBA00FCFFFD /* GestureExampleTests.swift */; };
+ 520DC6CB26F60FF400FCFFFD /* SimultaneousGestureChildrenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59D26F60FBA00FCFFFD /* SimultaneousGestureChildrenTests.swift */; };
+ 520DC6CC26F60FF400FCFFFD /* GestureModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59326F60FBA00FCFFFD /* GestureModifierTests.swift */; };
+ 520DC6CD26F60FF400FCFFFD /* ImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CC26F60FBA00FCFFFD /* ImageTests.swift */; };
+ 520DC6CE26F60FF400FCFFFD /* ColorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DF26F60FBA00FCFFFD /* ColorTests.swift */; };
+ 520DC6CF26F60FF400FCFFFD /* ButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DB26F60FBA00FCFFFD /* ButtonTests.swift */; };
+ 520DC6D026F60FF400FCFFFD /* SheetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B626F60FBA00FCFFFD /* SheetTests.swift */; };
+ 520DC6D126F60FF400FCFFFD /* CommonComposedGestureUpdatingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A226F60FBA00FCFFFD /* CommonComposedGestureUpdatingTests.swift */; };
+ 520DC6D226F60FF400FCFFFD /* EnvironmentReaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CD26F60FBA00FCFFFD /* EnvironmentReaderViewTests.swift */; };
+ 520DC6D326F60FF400FCFFFD /* ColorPickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F426F60FBA00FCFFFD /* ColorPickerTests.swift */; };
+ 520DC6D426F60FF400FCFFFD /* OutlineGroupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F526F60FBA00FCFFFD /* OutlineGroupTests.swift */; };
+ 520DC6D526F60FF400FCFFFD /* InspectionEmissaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58D26F60FBA00FCFFFD /* InspectionEmissaryTests.swift */; };
+ 520DC6D626F60FF400FCFFFD /* ToggleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F026F60FBA00FCFFFD /* ToggleTests.swift */; };
+ 520DC6D726F60FF400FCFFFD /* DragGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A026F60FBA00FCFFFD /* DragGestureTests.swift */; };
+ 520DC6D826F60FF400FCFFFD /* ConditionalContentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E326F60FBA00FCFFFD /* ConditionalContentTests.swift */; };
+ 520DC6D926F60FF400FCFFFD /* TransformingModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60E26F60FBA00FCFFFD /* TransformingModifiersTests.swift */; };
+ 520DC6DA26F60FF400FCFFFD /* ProgressViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C626F60FBA00FCFFFD /* ProgressViewTests.swift */; };
+ 520DC6DB26F60FF400FCFFFD /* GroupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EE26F60FBA00FCFFFD /* GroupTests.swift */; };
+ 520DC6DC26F60FF400FCFFFD /* TupleViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D026F60FBA00FCFFFD /* TupleViewTests.swift */; };
+ 520DC6DD26F60FF400FCFFFD /* AccessibilityModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60926F60FBA00FCFFFD /* AccessibilityModifiersTests.swift */; };
+ 520DC6DE26F60FF400FCFFFD /* ScrollViewReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B826F60FBA00FCFFFD /* ScrollViewReaderTests.swift */; };
+ 520DC6DF26F60FF400FCFFFD /* LongPressGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A626F60FBA00FCFFFD /* LongPressGestureTests.swift */; };
+ 520DC6E026F60FF400FCFFFD /* SafeAreaInsetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F326F60FBA00FCFFFD /* SafeAreaInsetTests.swift */; };
+ 520DC6E126F60FF400FCFFFD /* ViewPaddingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60D26F60FBA00FCFFFD /* ViewPaddingTests.swift */; };
+ 520DC6E226F60FF400FCFFFD /* CustomStyleModifiersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC60726F60FBA00FCFFFD /* CustomStyleModifiersTests.swift */; };
+ 520DC6E326F60FF400FCFFFD /* InspectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5AF26F60FBA00FCFFFD /* InspectorTests.swift */; };
+ 520DC6E426F60FF400FCFFFD /* TextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BD26F60FBA00FCFFFD /* TextTests.swift */; };
+ 520DC6E526F60FF400FCFFFD /* TapGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59B26F60FBA00FCFFFD /* TapGestureTests.swift */; };
+ 520DC6E626F60FF400FCFFFD /* CommonComposedGestureEndedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A426F60FBA00FCFFFD /* CommonComposedGestureEndedTests.swift */; };
+ 520DC6E726F60FF400FCFFFD /* CommonGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A726F60FBA00FCFFFD /* CommonGestureTests.swift */; };
+ 520DC6E826F60FF400FCFFFD /* DatePickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F226F60FBA00FCFFFD /* DatePickerTests.swift */; };
+ 520DC6E926F60FF400FCFFFD /* FullScreenCoverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EA26F60FBA00FCFFFD /* FullScreenCoverTests.swift */; };
+ 520DC6EA26F60FF400FCFFFD /* MapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B926F60FBA00FCFFFD /* MapTests.swift */; };
+ 520DC6EB26F60FF400FCFFFD /* LinearGradientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C226F60FBA00FCFFFD /* LinearGradientTests.swift */; };
+ 520DC6EC26F60FF400FCFFFD /* FormTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5CF26F60FBA00FCFFFD /* FormTests.swift */; };
+ 520DC6ED26F60FF400FCFFFD /* EquatableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C126F60FBA00FCFFFD /* EquatableViewTests.swift */; };
+ 520DC6EE26F60FF400FCFFFD /* DelayedPreferenceViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5DA26F60FBA00FCFFFD /* DelayedPreferenceViewTests.swift */; };
+ 520DC6EF26F60FF400FCFFFD /* LazyHGridTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F826F60FBA00FCFFFD /* LazyHGridTests.swift */; };
+ 520DC6F026F60FF400FCFFFD /* GestureActionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59426F60FBA00FCFFFD /* GestureActionTests.swift */; };
+ 520DC6F126F60FF400FCFFFD /* ComposedGestureExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59726F60FBA00FCFFFD /* ComposedGestureExampleTests.swift */; };
+ 520DC6F226F60FF400FCFFFD /* PasteButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D626F60FBA00FCFFFD /* PasteButtonTests.swift */; };
+ 520DC6F326F60FF400FCFFFD /* ForEachTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D826F60FBA00FCFFFD /* ForEachTests.swift */; };
+ 520DC6F426F60FF400FCFFFD /* NavigationLinkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EB26F60FBA00FCFFFD /* NavigationLinkTests.swift */; };
+ 520DC6F526F60FF400FCFFFD /* DividerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D726F60FBA00FCFFFD /* DividerTests.swift */; };
+ 520DC6F626F60FF400FCFFFD /* LazyGroupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58B26F60FBA00FCFFFD /* LazyGroupTests.swift */; };
+ 520DC6F726F60FF400FCFFFD /* TabViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C826F60FBA00FCFFFD /* TabViewTests.swift */; };
+ 520DC6F826F60FF400FCFFFD /* BaseTypesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58E26F60FBA00FCFFFD /* BaseTypesTests.swift */; };
+ 520DC6F926F60FF400FCFFFD /* RotationGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59926F60FBA00FCFFFD /* RotationGestureTests.swift */; };
+ 520DC6FA26F60FF400FCFFFD /* NavigationViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5E526F60FBA00FCFFFD /* NavigationViewTests.swift */; };
+ 520DC6FB26F60FF400FCFFFD /* ExclusiveGestureChildrenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59A26F60FBA00FCFFFD /* ExclusiveGestureChildrenTests.swift */; };
+ 520DC6FC26F60FF400FCFFFD /* ViewHostingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58C26F60FBA00FCFFFD /* ViewHostingTests.swift */; };
+ 520DC6FD26F60FF400FCFFFD /* GroupBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5B526F60FBA00FCFFFD /* GroupBoxTests.swift */; };
+ 520DC6FE26F60FF400FCFFFD /* CommonComposedGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A126F60FBA00FCFFFD /* CommonComposedGestureTests.swift */; };
+ 520DC6FF26F60FF400FCFFFD /* LabelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5BC26F60FBA00FCFFFD /* LabelTests.swift */; };
+ 520DC70026F60FF400FCFFFD /* MagnificationGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5A826F60FBA00FCFFFD /* MagnificationGestureTests.swift */; };
+ 520DC70126F60FF400FCFFFD /* VStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5EC26F60FBA00FCFFFD /* VStackTests.swift */; };
+ 520DC70226F60FF400FCFFFD /* SequenceGestureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC59E26F60FBA00FCFFFD /* SequenceGestureTests.swift */; };
+ 520DC70326F60FF400FCFFFD /* TextAttributesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D526F60FBA00FCFFFD /* TextAttributesTests.swift */; };
+ 520DC70426F60FF400FCFFFD /* ScrollViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5F626F60FBA00FCFFFD /* ScrollViewTests.swift */; };
+ 520DC70526F60FF400FCFFFD /* TreeViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C026F60FBA00FCFFFD /* TreeViewTests.swift */; };
+ 520DC70626F60FF400FCFFFD /* LazyHStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D326F60FBA00FCFFFD /* LazyHStackTests.swift */; };
+ 520DC70726F60FF400FCFFFD /* DisclosureGroupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C426F60FBA00FCFFFD /* DisclosureGroupTests.swift */; };
+ 520DC70826F60FF400FCFFFD /* ViewSearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC58F26F60FBA00FCFFFD /* ViewSearchTests.swift */; };
+ 520DC70926F60FF400FCFFFD /* LazyVGridTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5D226F60FBA00FCFFFD /* LazyVGridTests.swift */; };
+ 520DC70A26F60FF400FCFFFD /* GeometryReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DC5C526F60FBA00FCFFFD /* GeometryReaderTests.swift */; };
+ 520DC70C26F60FF400FCFFFD /* ViewInspector in Frameworks */ = {isa = PBXBuildFile; productRef = 520DC68E26F60FF400FCFFFD /* ViewInspector */; };
+ 520DC70E26F60FF400FCFFFD /* Test.strings in Resources */ = {isa = PBXBuildFile; fileRef = 520DC5AA26F60FBA00FCFFFD /* Test.strings */; };
+ 520DC71526F6115D00FCFFFD /* watchOSApp+Testable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52CA301526ECD64400BFD568 /* watchOSApp+Testable.swift */; };
+ 5293010626EFC96600012E90 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5293010426EFC96600012E90 /* Interface.storyboard */; };
+ 5293010E26EFC96700012E90 /* watchOS-Ext-2.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 5293010D26EFC96700012E90 /* watchOS-Ext-2.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ 5293012726EFCBD300012E90 /* watchOSApp-2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5293011426EFC96700012E90 /* watchOSApp-2.swift */; };
+ 52CA301426ECC5D200BFD568 /* ViewInspector in Frameworks */ = {isa = PBXBuildFile; productRef = 52CA301326ECC5D200BFD568 /* ViewInspector */; };
+ 52CA301626ECD64400BFD568 /* watchOSApp+Testable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52CA301526ECD64400BFD568 /* watchOSApp+Testable.swift */; };
+ 52E3259B26C72E7900CCE47E /* watchOS-Ext-1.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 52E3259A26C72E7900CCE47E /* watchOS-Ext-1.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ 52E325A226C72E7900CCE47E /* watchOSApp-1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E325A126C72E7900CCE47E /* watchOSApp-1.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 520213A826ECB45D00E94C6E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 52E3258426C72E7800CCE47E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 52E3259926C72E7900CCE47E;
+ remoteInfo = "watchOS-Ext";
+ };
+ 520DC68D26F60FF400FCFFFD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 52E3258426C72E7800CCE47E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 52E3259926C72E7900CCE47E;
+ remoteInfo = "watchOS-Ext";
+ };
+ 520DC71326F6103300FCFFFD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 52E3258426C72E7800CCE47E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 5293010C26EFC96700012E90;
+ remoteInfo = "watchOS-Ext-2";
+ };
+ 5293010F26EFC96700012E90 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 52E3258426C72E7800CCE47E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 5293010C26EFC96700012E90;
+ remoteInfo = "watchOSApp-2 WatchKit Extension";
+ };
+ 52E3259C26C72E7900CCE47E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 52E3258426C72E7800CCE47E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 52E3259926C72E7900CCE47E;
+ remoteInfo = "watchOS WatchKit Extension";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 5293011E26EFC96800012E90 /* Embed App Extensions */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ 5293010E26EFC96700012E90 /* watchOS-Ext-2.appex in Embed App Extensions */,
+ );
+ name = "Embed App Extensions";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 52E325B026C72E7900CCE47E /* Embed App Extensions */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ 52E3259B26C72E7900CCE47E /* watchOS-Ext-1.appex in Embed App Extensions */,
+ );
+ name = "Embed App Extensions";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 520213A426ECB45D00E94C6E /* watchOS-1-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "watchOS-1-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 520DC58B26F60FBA00FCFFFD /* LazyGroupTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LazyGroupTests.swift; sourceTree = ""; };
+ 520DC58C26F60FBA00FCFFFD /* ViewHostingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewHostingTests.swift; sourceTree = ""; };
+ 520DC58D26F60FBA00FCFFFD /* InspectionEmissaryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InspectionEmissaryTests.swift; sourceTree = ""; };
+ 520DC58E26F60FBA00FCFFFD /* BaseTypesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseTypesTests.swift; sourceTree = ""; };
+ 520DC58F26F60FBA00FCFFFD /* ViewSearchTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewSearchTests.swift; sourceTree = ""; };
+ 520DC59226F60FBA00FCFFFD /* HitTestingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HitTestingTests.swift; sourceTree = ""; };
+ 520DC59326F60FBA00FCFFFD /* GestureModifierTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GestureModifierTests.swift; sourceTree = ""; };
+ 520DC59426F60FBA00FCFFFD /* GestureActionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GestureActionTests.swift; sourceTree = ""; };
+ 520DC59526F60FBA00FCFFFD /* HighPriorityGestureModifierTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HighPriorityGestureModifierTests.swift; sourceTree = ""; };
+ 520DC59626F60FBA00FCFFFD /* SimultaneousGestureModifierTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimultaneousGestureModifierTests.swift; sourceTree = ""; };
+ 520DC59726F60FBA00FCFFFD /* ComposedGestureExampleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposedGestureExampleTests.swift; sourceTree = ""; };
+ 520DC59826F60FBA00FCFFFD /* SequenceGestureChildrenTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SequenceGestureChildrenTests.swift; sourceTree = ""; };
+ 520DC59926F60FBA00FCFFFD /* RotationGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RotationGestureTests.swift; sourceTree = ""; };
+ 520DC59A26F60FBA00FCFFFD /* ExclusiveGestureChildrenTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExclusiveGestureChildrenTests.swift; sourceTree = ""; };
+ 520DC59B26F60FBA00FCFFFD /* TapGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TapGestureTests.swift; sourceTree = ""; };
+ 520DC59C26F60FBA00FCFFFD /* ExclusiveGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExclusiveGestureTests.swift; sourceTree = ""; };
+ 520DC59D26F60FBA00FCFFFD /* SimultaneousGestureChildrenTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimultaneousGestureChildrenTests.swift; sourceTree = ""; };
+ 520DC59E26F60FBA00FCFFFD /* SequenceGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SequenceGestureTests.swift; sourceTree = ""; };
+ 520DC59F26F60FBA00FCFFFD /* GestureExampleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GestureExampleTests.swift; sourceTree = ""; };
+ 520DC5A026F60FBA00FCFFFD /* DragGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DragGestureTests.swift; sourceTree = ""; };
+ 520DC5A126F60FBA00FCFFFD /* CommonComposedGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonComposedGestureTests.swift; sourceTree = ""; };
+ 520DC5A226F60FBA00FCFFFD /* CommonComposedGestureUpdatingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonComposedGestureUpdatingTests.swift; sourceTree = ""; };
+ 520DC5A326F60FBA00FCFFFD /* SimultaneousGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimultaneousGestureTests.swift; sourceTree = ""; };
+ 520DC5A426F60FBA00FCFFFD /* CommonComposedGestureEndedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonComposedGestureEndedTests.swift; sourceTree = ""; };
+ 520DC5A526F60FBA00FCFFFD /* CommonComposedGestureChangedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonComposedGestureChangedTests.swift; sourceTree = ""; };
+ 520DC5A626F60FBA00FCFFFD /* LongPressGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LongPressGestureTests.swift; sourceTree = ""; };
+ 520DC5A726F60FBA00FCFFFD /* CommonGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonGestureTests.swift; sourceTree = ""; };
+ 520DC5A826F60FBA00FCFFFD /* MagnificationGestureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MagnificationGestureTests.swift; sourceTree = ""; };
+ 520DC5AB26F60FBA00FCFFFD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Test.strings; sourceTree = ""; };
+ 520DC5AC26F60FBA00FCFFFD /* en-AU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-AU"; path = "en-AU.lproj/Test.strings"; sourceTree = ""; };
+ 520DC5AD26F60FBA00FCFFFD /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Test.strings; sourceTree = ""; };
+ 520DC5AE26F60FBA00FCFFFD /* InspectableViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InspectableViewTests.swift; sourceTree = ""; };
+ 520DC5AF26F60FBA00FCFFFD /* InspectorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InspectorTests.swift; sourceTree = ""; };
+ 520DC5B126F60FBA00FCFFFD /* ZStackTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZStackTests.swift; sourceTree = ""; };
+ 520DC5B226F60FBA00FCFFFD /* OptionalViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionalViewTests.swift; sourceTree = ""; };
+ 520DC5B326F60FBA00FCFFFD /* MenuButtonTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuButtonTests.swift; sourceTree = ""; };
+ 520DC5B426F60FBA00FCFFFD /* TouchBarTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TouchBarTests.swift; sourceTree = ""; };
+ 520DC5B526F60FBA00FCFFFD /* GroupBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupBoxTests.swift; sourceTree = ""; };
+ 520DC5B626F60FBA00FCFFFD /* SheetTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SheetTests.swift; sourceTree = ""; };
+ 520DC5B726F60FBA00FCFFFD /* RadialGradientTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadialGradientTests.swift; sourceTree = ""; };
+ 520DC5B826F60FBA00FCFFFD /* ScrollViewReaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollViewReaderTests.swift; sourceTree = ""; };
+ 520DC5B926F60FBA00FCFFFD /* MapTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapTests.swift; sourceTree = ""; };
+ 520DC5BA26F60FBA00FCFFFD /* SubscriptionViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubscriptionViewTests.swift; sourceTree = ""; };
+ 520DC5BB26F60FBA00FCFFFD /* MenuTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuTests.swift; sourceTree = ""; };
+ 520DC5BC26F60FBA00FCFFFD /* LabelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelTests.swift; sourceTree = ""; };
+ 520DC5BD26F60FBA00FCFFFD /* TextTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextTests.swift; sourceTree = ""; };
+ 520DC5BE26F60FBA00FCFFFD /* OpaqueViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpaqueViewTests.swift; sourceTree = ""; };
+ 520DC5BF26F60FBA00FCFFFD /* HStackTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HStackTests.swift; sourceTree = ""; };
+ 520DC5C026F60FBA00FCFFFD /* TreeViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TreeViewTests.swift; sourceTree = ""; };
+ 520DC5C126F60FBA00FCFFFD /* EquatableViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EquatableViewTests.swift; sourceTree = ""; };
+ 520DC5C226F60FBA00FCFFFD /* LinearGradientTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinearGradientTests.swift; sourceTree = ""; };
+ 520DC5C326F60FBA00FCFFFD /* ToolbarTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToolbarTests.swift; sourceTree = ""; };
+ 520DC5C426F60FBA00FCFFFD /* DisclosureGroupTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisclosureGroupTests.swift; sourceTree = ""; };
+ 520DC5C526F60FBA00FCFFFD /* GeometryReaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeometryReaderTests.swift; sourceTree = ""; };
+ 520DC5C626F60FBA00FCFFFD /* ProgressViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressViewTests.swift; sourceTree = ""; };
+ 520DC5C726F60FBA00FCFFFD /* EnvironmentObjectInjectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnvironmentObjectInjectionTests.swift; sourceTree = ""; };
+ 520DC5C826F60FBA00FCFFFD /* TabViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabViewTests.swift; sourceTree = ""; };
+ 520DC5C926F60FBA00FCFFFD /* PopoverTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PopoverTests.swift; sourceTree = ""; };
+ 520DC5CA26F60FBA00FCFFFD /* EmptyViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmptyViewTests.swift; sourceTree = ""; };
+ 520DC5CB26F60FBA00FCFFFD /* CustomViewModifierTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomViewModifierTests.swift; sourceTree = ""; };
+ 520DC5CC26F60FBA00FCFFFD /* ImageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageTests.swift; sourceTree = ""; };
+ 520DC5CD26F60FBA00FCFFFD /* EnvironmentReaderViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnvironmentReaderViewTests.swift; sourceTree = ""; };
+ 520DC5CE26F60FBA00FCFFFD /* StepperTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StepperTests.swift; sourceTree = ""; };
+ 520DC5CF26F60FBA00FCFFFD /* FormTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormTests.swift; sourceTree = ""; };
+ 520DC5D026F60FBA00FCFFFD /* TupleViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TupleViewTests.swift; sourceTree = ""; };
+ 520DC5D126F60FBA00FCFFFD /* ConfirmationDialogTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmationDialogTests.swift; sourceTree = ""; };
+ 520DC5D226F60FBA00FCFFFD /* LazyVGridTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LazyVGridTests.swift; sourceTree = ""; };
+ 520DC5D326F60FBA00FCFFFD /* LazyHStackTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LazyHStackTests.swift; sourceTree = ""; };
+ 520DC5D426F60FBA00FCFFFD /* AlertTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlertTests.swift; sourceTree = ""; };
+ 520DC5D526F60FBA00FCFFFD /* TextAttributesTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextAttributesTests.swift; sourceTree = ""; };
+ 520DC5D626F60FBA00FCFFFD /* PasteButtonTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasteButtonTests.swift; sourceTree = ""; };
+ 520DC5D726F60FBA00FCFFFD /* DividerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DividerTests.swift; sourceTree = ""; };
+ 520DC5D826F60FBA00FCFFFD /* ForEachTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ForEachTests.swift; sourceTree = ""; };
+ 520DC5D926F60FBA00FCFFFD /* ActionSheetTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionSheetTests.swift; sourceTree = ""; };
+ 520DC5DA26F60FBA00FCFFFD /* DelayedPreferenceViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelayedPreferenceViewTests.swift; sourceTree = ""; };
+ 520DC5DB26F60FBA00FCFFFD /* ButtonTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonTests.swift; sourceTree = ""; };
+ 520DC5DC26F60FBA00FCFFFD /* LinkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkTests.swift; sourceTree = ""; };
+ 520DC5DD26F60FBA00FCFFFD /* SliderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SliderTests.swift; sourceTree = ""; };
+ 520DC5DE26F60FBA00FCFFFD /* CustomViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomViewTests.swift; sourceTree = ""; };
+ 520DC5DF26F60FBA00FCFFFD /* ColorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorTests.swift; sourceTree = ""; };
+ 520DC5E026F60FBA00FCFFFD /* TextEditorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextEditorTests.swift; sourceTree = ""; };
+ 520DC5E126F60FBA00FCFFFD /* MapAnnotationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapAnnotationTests.swift; sourceTree = ""; };
+ 520DC5E226F60FBA00FCFFFD /* AngularGradientTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AngularGradientTests.swift; sourceTree = ""; };
+ 520DC5E326F60FBA00FCFFFD /* ConditionalContentTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionalContentTests.swift; sourceTree = ""; };
+ 520DC5E426F60FBA00FCFFFD /* VSplitViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VSplitViewTests.swift; sourceTree = ""; };
+ 520DC5E526F60FBA00FCFFFD /* NavigationViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationViewTests.swift; sourceTree = ""; };
+ 520DC5E626F60FBA00FCFFFD /* EditButtonTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditButtonTests.swift; sourceTree = ""; };
+ 520DC5E726F60FBA00FCFFFD /* IDViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IDViewTests.swift; sourceTree = ""; };
+ 520DC5E826F60FBA00FCFFFD /* CustomViewBuilderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomViewBuilderTests.swift; sourceTree = ""; };
+ 520DC5E926F60FBA00FCFFFD /* TextFieldTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldTests.swift; sourceTree = ""; };
+ 520DC5EA26F60FBA00FCFFFD /* FullScreenCoverTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullScreenCoverTests.swift; sourceTree = ""; };
+ 520DC5EB26F60FBA00FCFFFD /* NavigationLinkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationLinkTests.swift; sourceTree = ""; };
+ 520DC5EC26F60FBA00FCFFFD /* VStackTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VStackTests.swift; sourceTree = ""; };
+ 520DC5ED26F60FBA00FCFFFD /* PickerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PickerTests.swift; sourceTree = ""; };
+ 520DC5EE26F60FBA00FCFFFD /* GroupTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupTests.swift; sourceTree = ""; };
+ 520DC5EF26F60FBA00FCFFFD /* SectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionTests.swift; sourceTree = ""; };
+ 520DC5F026F60FBA00FCFFFD /* ToggleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToggleTests.swift; sourceTree = ""; };
+ 520DC5F126F60FBA00FCFFFD /* SpacerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpacerTests.swift; sourceTree = ""; };
+ 520DC5F226F60FBA00FCFFFD /* DatePickerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatePickerTests.swift; sourceTree = ""; };
+ 520DC5F326F60FBA00FCFFFD /* SafeAreaInsetTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SafeAreaInsetTests.swift; sourceTree = ""; };
+ 520DC5F426F60FBA00FCFFFD /* ColorPickerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorPickerTests.swift; sourceTree = ""; };
+ 520DC5F526F60FBA00FCFFFD /* OutlineGroupTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutlineGroupTests.swift; sourceTree = ""; };
+ 520DC5F626F60FBA00FCFFFD /* ScrollViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollViewTests.swift; sourceTree = ""; };
+ 520DC5F726F60FBA00FCFFFD /* SecureFieldTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecureFieldTests.swift; sourceTree = ""; };
+ 520DC5F826F60FBA00FCFFFD /* LazyHGridTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LazyHGridTests.swift; sourceTree = ""; };
+ 520DC5F926F60FBA00FCFFFD /* ShapeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShapeTests.swift; sourceTree = ""; };
+ 520DC5FA26F60FBA00FCFFFD /* ListTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListTests.swift; sourceTree = ""; };
+ 520DC5FB26F60FBA00FCFFFD /* HSplitViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HSplitViewTests.swift; sourceTree = ""; };
+ 520DC5FC26F60FBA00FCFFFD /* AnyViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyViewTests.swift; sourceTree = ""; };
+ 520DC5FD26F60FBA00FCFFFD /* LazyVStackTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LazyVStackTests.swift; sourceTree = ""; };
+ 520DC5FF26F60FBA00FCFFFD /* ConfigurationModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigurationModifiersTests.swift; sourceTree = ""; };
+ 520DC60026F60FBA00FCFFFD /* PresentationModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentationModifiersTests.swift; sourceTree = ""; };
+ 520DC60126F60FBA00FCFFFD /* InteractionModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InteractionModifiersTests.swift; sourceTree = ""; };
+ 520DC60226F60FBA00FCFFFD /* EventsModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventsModifiersTests.swift; sourceTree = ""; };
+ 520DC60326F60FBA00FCFFFD /* SizingModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizingModifiersTests.swift; sourceTree = ""; };
+ 520DC60426F60FBA00FCFFFD /* NestedModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NestedModifiersTests.swift; sourceTree = ""; };
+ 520DC60526F60FBA00FCFFFD /* PositioningModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PositioningModifiersTests.swift; sourceTree = ""; };
+ 520DC60626F60FBA00FCFFFD /* TextInputModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextInputModifiersTests.swift; sourceTree = ""; };
+ 520DC60726F60FBA00FCFFFD /* CustomStyleModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomStyleModifiersTests.swift; sourceTree = ""; };
+ 520DC60826F60FBA00FCFFFD /* TransitiveModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransitiveModifiersTests.swift; sourceTree = ""; };
+ 520DC60926F60FBA00FCFFFD /* AccessibilityModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibilityModifiersTests.swift; sourceTree = ""; };
+ 520DC60A26F60FBA00FCFFFD /* AnimationModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimationModifiersTests.swift; sourceTree = ""; };
+ 520DC60B26F60FBA00FCFFFD /* VisualEffectModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualEffectModifiersTests.swift; sourceTree = ""; };
+ 520DC60C26F60FBA00FCFFFD /* EnvironmentModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnvironmentModifiersTests.swift; sourceTree = ""; };
+ 520DC60D26F60FBA00FCFFFD /* ViewPaddingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewPaddingTests.swift; sourceTree = ""; };
+ 520DC60E26F60FBA00FCFFFD /* TransformingModifiersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransformingModifiersTests.swift; sourceTree = ""; };
+ 520DC71226F60FF400FCFFFD /* watchOS-2-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "watchOS-2-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 529300FF26EFC96600012E90 /* watchOS-App-2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "watchOS-App-2.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5293010526EFC96600012E90 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; };
+ 5293010D26EFC96700012E90 /* watchOS-Ext-2.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "watchOS-Ext-2.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5293011426EFC96700012E90 /* watchOSApp-2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "watchOSApp-2.swift"; sourceTree = ""; };
+ 5293011A26EFC96800012E90 /* Ext-2-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Ext-2-Info.plist"; sourceTree = ""; };
+ 52CA2F1026ECC56600BFD568 /* ViewInspector */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ViewInspector; path = ..; sourceTree = ""; };
+ 52CA301526ECD64400BFD568 /* watchOSApp+Testable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "watchOSApp+Testable.swift"; sourceTree = ""; };
+ 52E3258E26C72E7800CCE47E /* watchOS-App-1.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "watchOS-App-1.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 52E3259526C72E7900CCE47E /* App-1-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "App-1-Info.plist"; sourceTree = ""; };
+ 52E3259A26C72E7900CCE47E /* watchOS-Ext-1.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "watchOS-Ext-1.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 52E325A126C72E7900CCE47E /* watchOSApp-1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "watchOSApp-1.swift"; sourceTree = ""; };
+ 52E325AA26C72E7900CCE47E /* Ext-1-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Ext-1-Info.plist"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 520213A126ECB45D00E94C6E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 52CA301426ECC5D200BFD568 /* ViewInspector in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 520DC70B26F60FF400FCFFFD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 520DC70C26F60FF400FCFFFD /* ViewInspector in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5293010A26EFC96700012E90 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 52E3259726C72E7900CCE47E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 520DC58926F60FA600FCFFFD /* watchOS-Tests */ = {
+ isa = PBXGroup;
+ children = (
+ 520DC58A26F60FBA00FCFFFD /* ViewInspectorTests */,
+ );
+ path = "watchOS-Tests";
+ sourceTree = "";
+ };
+ 520DC58A26F60FBA00FCFFFD /* ViewInspectorTests */ = {
+ isa = PBXGroup;
+ children = (
+ 520DC58B26F60FBA00FCFFFD /* LazyGroupTests.swift */,
+ 520DC58C26F60FBA00FCFFFD /* ViewHostingTests.swift */,
+ 520DC58D26F60FBA00FCFFFD /* InspectionEmissaryTests.swift */,
+ 520DC58E26F60FBA00FCFFFD /* BaseTypesTests.swift */,
+ 520DC58F26F60FBA00FCFFFD /* ViewSearchTests.swift */,
+ 520DC59026F60FBA00FCFFFD /* Gestures */,
+ 520DC5A926F60FBA00FCFFFD /* TestResources */,
+ 520DC5AE26F60FBA00FCFFFD /* InspectableViewTests.swift */,
+ 520DC5AF26F60FBA00FCFFFD /* InspectorTests.swift */,
+ 520DC5B026F60FBA00FCFFFD /* SwiftUI */,
+ 520DC5FE26F60FBA00FCFFFD /* ViewModifiers */,
+ );
+ name = ViewInspectorTests;
+ path = ../../Tests/ViewInspectorTests;
+ sourceTree = "";
+ };
+ 520DC59026F60FBA00FCFFFD /* Gestures */ = {
+ isa = PBXGroup;
+ children = (
+ 520DC59126F60FBA00FCFFFD /* GestureModifiers */,
+ 520DC59726F60FBA00FCFFFD /* ComposedGestureExampleTests.swift */,
+ 520DC59826F60FBA00FCFFFD /* SequenceGestureChildrenTests.swift */,
+ 520DC59926F60FBA00FCFFFD /* RotationGestureTests.swift */,
+ 520DC59A26F60FBA00FCFFFD /* ExclusiveGestureChildrenTests.swift */,
+ 520DC59B26F60FBA00FCFFFD /* TapGestureTests.swift */,
+ 520DC59C26F60FBA00FCFFFD /* ExclusiveGestureTests.swift */,
+ 520DC59D26F60FBA00FCFFFD /* SimultaneousGestureChildrenTests.swift */,
+ 520DC59E26F60FBA00FCFFFD /* SequenceGestureTests.swift */,
+ 520DC59F26F60FBA00FCFFFD /* GestureExampleTests.swift */,
+ 520DC5A026F60FBA00FCFFFD /* DragGestureTests.swift */,
+ 520DC5A126F60FBA00FCFFFD /* CommonComposedGestureTests.swift */,
+ 520DC5A226F60FBA00FCFFFD /* CommonComposedGestureUpdatingTests.swift */,
+ 520DC5A326F60FBA00FCFFFD /* SimultaneousGestureTests.swift */,
+ 520DC5A426F60FBA00FCFFFD /* CommonComposedGestureEndedTests.swift */,
+ 520DC5A526F60FBA00FCFFFD /* CommonComposedGestureChangedTests.swift */,
+ 520DC5A626F60FBA00FCFFFD /* LongPressGestureTests.swift */,
+ 520DC5A726F60FBA00FCFFFD /* CommonGestureTests.swift */,
+ 520DC5A826F60FBA00FCFFFD /* MagnificationGestureTests.swift */,
+ );
+ path = Gestures;
+ sourceTree = "";
+ };
+ 520DC59126F60FBA00FCFFFD /* GestureModifiers */ = {
+ isa = PBXGroup;
+ children = (
+ 520DC59226F60FBA00FCFFFD /* HitTestingTests.swift */,
+ 520DC59326F60FBA00FCFFFD /* GestureModifierTests.swift */,
+ 520DC59426F60FBA00FCFFFD /* GestureActionTests.swift */,
+ 520DC59526F60FBA00FCFFFD /* HighPriorityGestureModifierTests.swift */,
+ 520DC59626F60FBA00FCFFFD /* SimultaneousGestureModifierTests.swift */,
+ );
+ path = GestureModifiers;
+ sourceTree = "";
+ };
+ 520DC5A926F60FBA00FCFFFD /* TestResources */ = {
+ isa = PBXGroup;
+ children = (
+ 520DC5AA26F60FBA00FCFFFD /* Test.strings */,
+ );
+ path = TestResources;
+ sourceTree = "";
+ };
+ 520DC5B026F60FBA00FCFFFD /* SwiftUI */ = {
+ isa = PBXGroup;
+ children = (
+ 520DC5B126F60FBA00FCFFFD /* ZStackTests.swift */,
+ 520DC5B226F60FBA00FCFFFD /* OptionalViewTests.swift */,
+ 520DC5B326F60FBA00FCFFFD /* MenuButtonTests.swift */,
+ 520DC5B426F60FBA00FCFFFD /* TouchBarTests.swift */,
+ 520DC5B526F60FBA00FCFFFD /* GroupBoxTests.swift */,
+ 520DC5B626F60FBA00FCFFFD /* SheetTests.swift */,
+ 520DC5B726F60FBA00FCFFFD /* RadialGradientTests.swift */,
+ 520DC5B826F60FBA00FCFFFD /* ScrollViewReaderTests.swift */,
+ 520DC5B926F60FBA00FCFFFD /* MapTests.swift */,
+ 520DC5BA26F60FBA00FCFFFD /* SubscriptionViewTests.swift */,
+ 520DC5BB26F60FBA00FCFFFD /* MenuTests.swift */,
+ 520DC5BC26F60FBA00FCFFFD /* LabelTests.swift */,
+ 520DC5BD26F60FBA00FCFFFD /* TextTests.swift */,
+ 520DC5BE26F60FBA00FCFFFD /* OpaqueViewTests.swift */,
+ 520DC5BF26F60FBA00FCFFFD /* HStackTests.swift */,
+ 520DC5C026F60FBA00FCFFFD /* TreeViewTests.swift */,
+ 520DC5C126F60FBA00FCFFFD /* EquatableViewTests.swift */,
+ 520DC5C226F60FBA00FCFFFD /* LinearGradientTests.swift */,
+ 520DC5C326F60FBA00FCFFFD /* ToolbarTests.swift */,
+ 520DC5C426F60FBA00FCFFFD /* DisclosureGroupTests.swift */,
+ 520DC5C526F60FBA00FCFFFD /* GeometryReaderTests.swift */,
+ 520DC5C626F60FBA00FCFFFD /* ProgressViewTests.swift */,
+ 520DC5C726F60FBA00FCFFFD /* EnvironmentObjectInjectionTests.swift */,
+ 520DC5C826F60FBA00FCFFFD /* TabViewTests.swift */,
+ 520DC5C926F60FBA00FCFFFD /* PopoverTests.swift */,
+ 520DC5CA26F60FBA00FCFFFD /* EmptyViewTests.swift */,
+ 520DC5CB26F60FBA00FCFFFD /* CustomViewModifierTests.swift */,
+ 520DC5CC26F60FBA00FCFFFD /* ImageTests.swift */,
+ 520DC5CD26F60FBA00FCFFFD /* EnvironmentReaderViewTests.swift */,
+ 520DC5CE26F60FBA00FCFFFD /* StepperTests.swift */,
+ 520DC5CF26F60FBA00FCFFFD /* FormTests.swift */,
+ 520DC5D026F60FBA00FCFFFD /* TupleViewTests.swift */,
+ 520DC5D126F60FBA00FCFFFD /* ConfirmationDialogTests.swift */,
+ 520DC5D226F60FBA00FCFFFD /* LazyVGridTests.swift */,
+ 520DC5D326F60FBA00FCFFFD /* LazyHStackTests.swift */,
+ 520DC5D426F60FBA00FCFFFD /* AlertTests.swift */,
+ 520DC5D526F60FBA00FCFFFD /* TextAttributesTests.swift */,
+ 520DC5D626F60FBA00FCFFFD /* PasteButtonTests.swift */,
+ 520DC5D726F60FBA00FCFFFD /* DividerTests.swift */,
+ 520DC5D826F60FBA00FCFFFD /* ForEachTests.swift */,
+ 520DC5D926F60FBA00FCFFFD /* ActionSheetTests.swift */,
+ 520DC5DA26F60FBA00FCFFFD /* DelayedPreferenceViewTests.swift */,
+ 520DC5DB26F60FBA00FCFFFD /* ButtonTests.swift */,
+ 520DC5DC26F60FBA00FCFFFD /* LinkTests.swift */,
+ 520DC5DD26F60FBA00FCFFFD /* SliderTests.swift */,
+ 520DC5DE26F60FBA00FCFFFD /* CustomViewTests.swift */,
+ 520DC5DF26F60FBA00FCFFFD /* ColorTests.swift */,
+ 520DC5E026F60FBA00FCFFFD /* TextEditorTests.swift */,
+ 520DC5E126F60FBA00FCFFFD /* MapAnnotationTests.swift */,
+ 520DC5E226F60FBA00FCFFFD /* AngularGradientTests.swift */,
+ 520DC5E326F60FBA00FCFFFD /* ConditionalContentTests.swift */,
+ 520DC5E426F60FBA00FCFFFD /* VSplitViewTests.swift */,
+ 520DC5E526F60FBA00FCFFFD /* NavigationViewTests.swift */,
+ 520DC5E626F60FBA00FCFFFD /* EditButtonTests.swift */,
+ 520DC5E726F60FBA00FCFFFD /* IDViewTests.swift */,
+ 520DC5E826F60FBA00FCFFFD /* CustomViewBuilderTests.swift */,
+ 520DC5E926F60FBA00FCFFFD /* TextFieldTests.swift */,
+ 520DC5EA26F60FBA00FCFFFD /* FullScreenCoverTests.swift */,
+ 520DC5EB26F60FBA00FCFFFD /* NavigationLinkTests.swift */,
+ 520DC5EC26F60FBA00FCFFFD /* VStackTests.swift */,
+ 520DC5ED26F60FBA00FCFFFD /* PickerTests.swift */,
+ 520DC5EE26F60FBA00FCFFFD /* GroupTests.swift */,
+ 520DC5EF26F60FBA00FCFFFD /* SectionTests.swift */,
+ 520DC5F026F60FBA00FCFFFD /* ToggleTests.swift */,
+ 520DC5F126F60FBA00FCFFFD /* SpacerTests.swift */,
+ 520DC5F226F60FBA00FCFFFD /* DatePickerTests.swift */,
+ 520DC5F326F60FBA00FCFFFD /* SafeAreaInsetTests.swift */,
+ 520DC5F426F60FBA00FCFFFD /* ColorPickerTests.swift */,
+ 520DC5F526F60FBA00FCFFFD /* OutlineGroupTests.swift */,
+ 520DC5F626F60FBA00FCFFFD /* ScrollViewTests.swift */,
+ 520DC5F726F60FBA00FCFFFD /* SecureFieldTests.swift */,
+ 520DC5F826F60FBA00FCFFFD /* LazyHGridTests.swift */,
+ 520DC5F926F60FBA00FCFFFD /* ShapeTests.swift */,
+ 520DC5FA26F60FBA00FCFFFD /* ListTests.swift */,
+ 520DC5FB26F60FBA00FCFFFD /* HSplitViewTests.swift */,
+ 520DC5FC26F60FBA00FCFFFD /* AnyViewTests.swift */,
+ 520DC5FD26F60FBA00FCFFFD /* LazyVStackTests.swift */,
+ );
+ path = SwiftUI;
+ sourceTree = "";
+ };
+ 520DC5FE26F60FBA00FCFFFD /* ViewModifiers */ = {
+ isa = PBXGroup;
+ children = (
+ 520DC5FF26F60FBA00FCFFFD /* ConfigurationModifiersTests.swift */,
+ 520DC60026F60FBA00FCFFFD /* PresentationModifiersTests.swift */,
+ 520DC60126F60FBA00FCFFFD /* InteractionModifiersTests.swift */,
+ 520DC60226F60FBA00FCFFFD /* EventsModifiersTests.swift */,
+ 520DC60326F60FBA00FCFFFD /* SizingModifiersTests.swift */,
+ 520DC60426F60FBA00FCFFFD /* NestedModifiersTests.swift */,
+ 520DC60526F60FBA00FCFFFD /* PositioningModifiersTests.swift */,
+ 520DC60626F60FBA00FCFFFD /* TextInputModifiersTests.swift */,
+ 520DC60726F60FBA00FCFFFD /* CustomStyleModifiersTests.swift */,
+ 520DC60826F60FBA00FCFFFD /* TransitiveModifiersTests.swift */,
+ 520DC60926F60FBA00FCFFFD /* AccessibilityModifiersTests.swift */,
+ 520DC60A26F60FBA00FCFFFD /* AnimationModifiersTests.swift */,
+ 520DC60B26F60FBA00FCFFFD /* VisualEffectModifiersTests.swift */,
+ 520DC60C26F60FBA00FCFFFD /* EnvironmentModifiersTests.swift */,
+ 520DC60D26F60FBA00FCFFFD /* ViewPaddingTests.swift */,
+ 520DC60E26F60FBA00FCFFFD /* TransformingModifiersTests.swift */,
+ );
+ path = ViewModifiers;
+ sourceTree = "";
+ };
+ 52CA2F0F26ECC56600BFD568 /* Packages */ = {
+ isa = PBXGroup;
+ children = (
+ 52CA2F1026ECC56600BFD568 /* ViewInspector */,
+ );
+ name = Packages;
+ sourceTree = "";
+ };
+ 52CA301226ECC5D200BFD568 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 52E3258326C72E7800CCE47E = {
+ isa = PBXGroup;
+ children = (
+ 52CA2F0F26ECC56600BFD568 /* Packages */,
+ 52E3259226C72E7800CCE47E /* watchOS-App */,
+ 52E3259E26C72E7900CCE47E /* watchOS-Ext */,
+ 520DC58926F60FA600FCFFFD /* watchOS-Tests */,
+ 52E3258B26C72E7800CCE47E /* Products */,
+ 52CA301226ECC5D200BFD568 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 52E3258B26C72E7800CCE47E /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 52E3258E26C72E7800CCE47E /* watchOS-App-1.app */,
+ 52E3259A26C72E7900CCE47E /* watchOS-Ext-1.appex */,
+ 520213A426ECB45D00E94C6E /* watchOS-1-Tests.xctest */,
+ 529300FF26EFC96600012E90 /* watchOS-App-2.app */,
+ 5293010D26EFC96700012E90 /* watchOS-Ext-2.appex */,
+ 520DC71226F60FF400FCFFFD /* watchOS-2-Tests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 52E3259226C72E7800CCE47E /* watchOS-App */ = {
+ isa = PBXGroup;
+ children = (
+ 52E3259526C72E7900CCE47E /* App-1-Info.plist */,
+ 5293010426EFC96600012E90 /* Interface.storyboard */,
+ );
+ path = "watchOS-App";
+ sourceTree = "";
+ };
+ 52E3259E26C72E7900CCE47E /* watchOS-Ext */ = {
+ isa = PBXGroup;
+ children = (
+ 52E325A126C72E7900CCE47E /* watchOSApp-1.swift */,
+ 5293011426EFC96700012E90 /* watchOSApp-2.swift */,
+ 52CA301526ECD64400BFD568 /* watchOSApp+Testable.swift */,
+ 52E325AA26C72E7900CCE47E /* Ext-1-Info.plist */,
+ 5293011A26EFC96800012E90 /* Ext-2-Info.plist */,
+ );
+ path = "watchOS-Ext";
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 520213A326ECB45D00E94C6E /* watchOS-1-Tests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 520213AC26ECB45D00E94C6E /* Build configuration list for PBXNativeTarget "watchOS-1-Tests" */;
+ buildPhases = (
+ 520213A026ECB45D00E94C6E /* Sources */,
+ 520213A126ECB45D00E94C6E /* Frameworks */,
+ 520213A226ECB45D00E94C6E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 520213A926ECB45D00E94C6E /* PBXTargetDependency */,
+ );
+ name = "watchOS-1-Tests";
+ packageProductDependencies = (
+ 52CA301326ECC5D200BFD568 /* ViewInspector */,
+ );
+ productName = "watchOS-Tests";
+ productReference = 520213A426ECB45D00E94C6E /* watchOS-1-Tests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 520DC68B26F60FF400FCFFFD /* watchOS-2-Tests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 520DC70F26F60FF400FCFFFD /* Build configuration list for PBXNativeTarget "watchOS-2-Tests" */;
+ buildPhases = (
+ 520DC68F26F60FF400FCFFFD /* Sources */,
+ 520DC70B26F60FF400FCFFFD /* Frameworks */,
+ 520DC70D26F60FF400FCFFFD /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 520DC68C26F60FF400FCFFFD /* PBXTargetDependency */,
+ 520DC71426F6103300FCFFFD /* PBXTargetDependency */,
+ );
+ name = "watchOS-2-Tests";
+ packageProductDependencies = (
+ 520DC68E26F60FF400FCFFFD /* ViewInspector */,
+ );
+ productName = "watchOS-Tests";
+ productReference = 520DC71226F60FF400FCFFFD /* watchOS-2-Tests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 529300FE26EFC96600012E90 /* watchOS-App-2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 5293011F26EFC96800012E90 /* Build configuration list for PBXNativeTarget "watchOS-App-2" */;
+ buildPhases = (
+ 529300FD26EFC96600012E90 /* Resources */,
+ 5293011E26EFC96800012E90 /* Embed App Extensions */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 5293011026EFC96700012E90 /* PBXTargetDependency */,
+ );
+ name = "watchOS-App-2";
+ productName = "watchOSApp-2 WatchKit App";
+ productReference = 529300FF26EFC96600012E90 /* watchOS-App-2.app */;
+ productType = "com.apple.product-type.application.watchapp2";
+ };
+ 5293010C26EFC96700012E90 /* watchOS-Ext-2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 5293011B26EFC96800012E90 /* Build configuration list for PBXNativeTarget "watchOS-Ext-2" */;
+ buildPhases = (
+ 5293010926EFC96700012E90 /* Sources */,
+ 5293010A26EFC96700012E90 /* Frameworks */,
+ 5293010B26EFC96700012E90 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "watchOS-Ext-2";
+ productName = "watchOSApp-2 WatchKit Extension";
+ productReference = 5293010D26EFC96700012E90 /* watchOS-Ext-2.appex */;
+ productType = "com.apple.product-type.watchkit2-extension";
+ };
+ 52E3258D26C72E7800CCE47E /* watchOS-App-1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 52E325B126C72E7900CCE47E /* Build configuration list for PBXNativeTarget "watchOS-App-1" */;
+ buildPhases = (
+ 52E3258C26C72E7800CCE47E /* Resources */,
+ 52E325B026C72E7900CCE47E /* Embed App Extensions */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 52E3259D26C72E7900CCE47E /* PBXTargetDependency */,
+ );
+ name = "watchOS-App-1";
+ productName = "watchOS WatchKit App";
+ productReference = 52E3258E26C72E7800CCE47E /* watchOS-App-1.app */;
+ productType = "com.apple.product-type.application.watchapp2";
+ };
+ 52E3259926C72E7900CCE47E /* watchOS-Ext-1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 52E325AD26C72E7900CCE47E /* Build configuration list for PBXNativeTarget "watchOS-Ext-1" */;
+ buildPhases = (
+ 52E3259626C72E7900CCE47E /* Sources */,
+ 52E3259726C72E7900CCE47E /* Frameworks */,
+ 52E3259826C72E7900CCE47E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "watchOS-Ext-1";
+ productName = "watchOS WatchKit Extension";
+ productReference = 52E3259A26C72E7900CCE47E /* watchOS-Ext-1.appex */;
+ productType = "com.apple.product-type.watchkit2-extension";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 52E3258426C72E7800CCE47E /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 1300;
+ LastUpgradeCheck = 1300;
+ TargetAttributes = {
+ 520213A326ECB45D00E94C6E = {
+ CreatedOnToolsVersion = 13.0;
+ TestTargetID = 52E3259926C72E7900CCE47E;
+ };
+ 520DC68B26F60FF400FCFFFD = {
+ TestTargetID = 5293010C26EFC96700012E90;
+ };
+ 529300FE26EFC96600012E90 = {
+ CreatedOnToolsVersion = 13.0;
+ };
+ 5293010C26EFC96700012E90 = {
+ CreatedOnToolsVersion = 13.0;
+ };
+ 52E3258D26C72E7800CCE47E = {
+ CreatedOnToolsVersion = 12.5.1;
+ };
+ 52E3259926C72E7900CCE47E = {
+ CreatedOnToolsVersion = 12.5.1;
+ };
+ };
+ };
+ buildConfigurationList = 52E3258726C72E7800CCE47E /* Build configuration list for PBXProject "watchOS" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ "en-AU",
+ ru,
+ );
+ mainGroup = 52E3258326C72E7800CCE47E;
+ productRefGroup = 52E3258B26C72E7800CCE47E /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 52E3258D26C72E7800CCE47E /* watchOS-App-1 */,
+ 529300FE26EFC96600012E90 /* watchOS-App-2 */,
+ 52E3259926C72E7900CCE47E /* watchOS-Ext-1 */,
+ 5293010C26EFC96700012E90 /* watchOS-Ext-2 */,
+ 520213A326ECB45D00E94C6E /* watchOS-1-Tests */,
+ 520DC68B26F60FF400FCFFFD /* watchOS-2-Tests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 520213A226ECB45D00E94C6E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 520DC62B26F60FBB00FCFFFD /* Test.strings in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 520DC70D26F60FF400FCFFFD /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 520DC70E26F60FF400FCFFFD /* Test.strings in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 529300FD26EFC96600012E90 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5293010626EFC96600012E90 /* Interface.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5293010B26EFC96700012E90 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 52E3258C26C72E7800CCE47E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 52E3259826C72E7900CCE47E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 520213A026ECB45D00E94C6E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 520DC65126F60FBB00FCFFFD /* AlertTests.swift in Sources */,
+ 520DC62C26F60FBB00FCFFFD /* InspectableViewTests.swift in Sources */,
+ 520DC61E26F60FBA00FCFFFD /* ExclusiveGestureTests.swift in Sources */,
+ 520DC63026F60FBB00FCFFFD /* MenuButtonTests.swift in Sources */,
+ 520DC64426F60FBB00FCFFFD /* EnvironmentObjectInjectionTests.swift in Sources */,
+ 520DC67A26F60FBB00FCFFFD /* LazyVStackTests.swift in Sources */,
+ 520DC65E26F60FBB00FCFFFD /* MapAnnotationTests.swift in Sources */,
+ 520DC63826F60FBB00FCFFFD /* MenuTests.swift in Sources */,
+ 520DC67C26F60FBB00FCFFFD /* PresentationModifiersTests.swift in Sources */,
+ 520DC65A26F60FBB00FCFFFD /* SliderTests.swift in Sources */,
+ 520DC64626F60FBB00FCFFFD /* PopoverTests.swift in Sources */,
+ 520DC65626F60FBB00FCFFFD /* ActionSheetTests.swift in Sources */,
+ 520DC66E26F60FBB00FCFFFD /* SpacerTests.swift in Sources */,
+ 520DC63426F60FBB00FCFFFD /* RadialGradientTests.swift in Sources */,
+ 520DC66626F60FBB00FCFFFD /* TextFieldTests.swift in Sources */,
+ 520DC65926F60FBB00FCFFFD /* LinkTests.swift in Sources */,
+ 520DC67E26F60FBB00FCFFFD /* EventsModifiersTests.swift in Sources */,
+ 520DC64B26F60FBB00FCFFFD /* StepperTests.swift in Sources */,
+ 520DC64E26F60FBB00FCFFFD /* ConfirmationDialogTests.swift in Sources */,
+ 520DC67826F60FBB00FCFFFD /* HSplitViewTests.swift in Sources */,
+ 520DC65B26F60FBB00FCFFFD /* CustomViewTests.swift in Sources */,
+ 520DC67726F60FBB00FCFFFD /* ListTests.swift in Sources */,
+ 520DC61426F60FBA00FCFFFD /* HitTestingTests.swift in Sources */,
+ 520DC66C26F60FBB00FCFFFD /* SectionTests.swift in Sources */,
+ 520DC66126F60FBB00FCFFFD /* VSplitViewTests.swift in Sources */,
+ 520DC68826F60FBB00FCFFFD /* EnvironmentModifiersTests.swift in Sources */,
+ 520DC67426F60FBB00FCFFFD /* SecureFieldTests.swift in Sources */,
+ 520DC68726F60FBB00FCFFFD /* VisualEffectModifiersTests.swift in Sources */,
+ 520DC67926F60FBB00FCFFFD /* AnyViewTests.swift in Sources */,
+ 520DC65F26F60FBB00FCFFFD /* AngularGradientTests.swift in Sources */,
+ 520DC66A26F60FBB00FCFFFD /* PickerTests.swift in Sources */,
+ 520DC62526F60FBB00FCFFFD /* SimultaneousGestureTests.swift in Sources */,
+ 520DC67F26F60FBB00FCFFFD /* SizingModifiersTests.swift in Sources */,
+ 520DC66526F60FBB00FCFFFD /* CustomViewBuilderTests.swift in Sources */,
+ 520DC62E26F60FBB00FCFFFD /* ZStackTests.swift in Sources */,
+ 520DC62726F60FBB00FCFFFD /* CommonComposedGestureChangedTests.swift in Sources */,
+ 520DC66326F60FBB00FCFFFD /* EditButtonTests.swift in Sources */,
+ 520DC63B26F60FBB00FCFFFD /* OpaqueViewTests.swift in Sources */,
+ 520DC64726F60FBB00FCFFFD /* EmptyViewTests.swift in Sources */,
+ 520DC62F26F60FBB00FCFFFD /* OptionalViewTests.swift in Sources */,
+ 520DC67B26F60FBB00FCFFFD /* ConfigurationModifiersTests.swift in Sources */,
+ 520DC67D26F60FBB00FCFFFD /* InteractionModifiersTests.swift in Sources */,
+ 520DC68126F60FBB00FCFFFD /* PositioningModifiersTests.swift in Sources */,
+ 520DC68026F60FBB00FCFFFD /* NestedModifiersTests.swift in Sources */,
+ 520DC68426F60FBB00FCFFFD /* TransitiveModifiersTests.swift in Sources */,
+ 520DC68626F60FBB00FCFFFD /* AnimationModifiersTests.swift in Sources */,
+ 520DC66426F60FBB00FCFFFD /* IDViewTests.swift in Sources */,
+ 520DC63726F60FBB00FCFFFD /* SubscriptionViewTests.swift in Sources */,
+ 520DC61A26F60FBA00FCFFFD /* SequenceGestureChildrenTests.swift in Sources */,
+ 520DC65D26F60FBB00FCFFFD /* TextEditorTests.swift in Sources */,
+ 520DC61826F60FBA00FCFFFD /* SimultaneousGestureModifierTests.swift in Sources */,
+ 520DC61726F60FBA00FCFFFD /* HighPriorityGestureModifierTests.swift in Sources */,
+ 520DC67626F60FBB00FCFFFD /* ShapeTests.swift in Sources */,
+ 520DC64026F60FBB00FCFFFD /* ToolbarTests.swift in Sources */,
+ 520DC63C26F60FBB00FCFFFD /* HStackTests.swift in Sources */,
+ 520DC63126F60FBB00FCFFFD /* TouchBarTests.swift in Sources */,
+ 520DC64826F60FBB00FCFFFD /* CustomViewModifierTests.swift in Sources */,
+ 520DC68226F60FBB00FCFFFD /* TextInputModifiersTests.swift in Sources */,
+ 520DC62126F60FBA00FCFFFD /* GestureExampleTests.swift in Sources */,
+ 520DC61F26F60FBA00FCFFFD /* SimultaneousGestureChildrenTests.swift in Sources */,
+ 520DC61526F60FBA00FCFFFD /* GestureModifierTests.swift in Sources */,
+ 520DC64926F60FBB00FCFFFD /* ImageTests.swift in Sources */,
+ 520DC65C26F60FBB00FCFFFD /* ColorTests.swift in Sources */,
+ 520DC65826F60FBB00FCFFFD /* ButtonTests.swift in Sources */,
+ 520DC63326F60FBB00FCFFFD /* SheetTests.swift in Sources */,
+ 520DC62426F60FBA00FCFFFD /* CommonComposedGestureUpdatingTests.swift in Sources */,
+ 520DC64A26F60FBB00FCFFFD /* EnvironmentReaderViewTests.swift in Sources */,
+ 520DC67126F60FBB00FCFFFD /* ColorPickerTests.swift in Sources */,
+ 520DC67226F60FBB00FCFFFD /* OutlineGroupTests.swift in Sources */,
+ 520DC61126F60FBA00FCFFFD /* InspectionEmissaryTests.swift in Sources */,
+ 520DC66D26F60FBB00FCFFFD /* ToggleTests.swift in Sources */,
+ 520DC62226F60FBA00FCFFFD /* DragGestureTests.swift in Sources */,
+ 520DC66026F60FBB00FCFFFD /* ConditionalContentTests.swift in Sources */,
+ 520DC68A26F60FBB00FCFFFD /* TransformingModifiersTests.swift in Sources */,
+ 520DC64326F60FBB00FCFFFD /* ProgressViewTests.swift in Sources */,
+ 520DC66B26F60FBB00FCFFFD /* GroupTests.swift in Sources */,
+ 520DC64D26F60FBB00FCFFFD /* TupleViewTests.swift in Sources */,
+ 520DC68526F60FBB00FCFFFD /* AccessibilityModifiersTests.swift in Sources */,
+ 520DC63526F60FBB00FCFFFD /* ScrollViewReaderTests.swift in Sources */,
+ 520DC62826F60FBB00FCFFFD /* LongPressGestureTests.swift in Sources */,
+ 520DC67026F60FBB00FCFFFD /* SafeAreaInsetTests.swift in Sources */,
+ 520DC68926F60FBB00FCFFFD /* ViewPaddingTests.swift in Sources */,
+ 520DC68326F60FBB00FCFFFD /* CustomStyleModifiersTests.swift in Sources */,
+ 520DC62D26F60FBB00FCFFFD /* InspectorTests.swift in Sources */,
+ 520DC63A26F60FBB00FCFFFD /* TextTests.swift in Sources */,
+ 520DC61D26F60FBA00FCFFFD /* TapGestureTests.swift in Sources */,
+ 520DC62626F60FBB00FCFFFD /* CommonComposedGestureEndedTests.swift in Sources */,
+ 520DC62926F60FBB00FCFFFD /* CommonGestureTests.swift in Sources */,
+ 520DC66F26F60FBB00FCFFFD /* DatePickerTests.swift in Sources */,
+ 520DC66726F60FBB00FCFFFD /* FullScreenCoverTests.swift in Sources */,
+ 520DC63626F60FBB00FCFFFD /* MapTests.swift in Sources */,
+ 520DC63F26F60FBB00FCFFFD /* LinearGradientTests.swift in Sources */,
+ 520DC64C26F60FBB00FCFFFD /* FormTests.swift in Sources */,
+ 520DC63E26F60FBB00FCFFFD /* EquatableViewTests.swift in Sources */,
+ 520DC65726F60FBB00FCFFFD /* DelayedPreferenceViewTests.swift in Sources */,
+ 520DC67526F60FBB00FCFFFD /* LazyHGridTests.swift in Sources */,
+ 520DC61626F60FBA00FCFFFD /* GestureActionTests.swift in Sources */,
+ 520DC61926F60FBA00FCFFFD /* ComposedGestureExampleTests.swift in Sources */,
+ 520DC65326F60FBB00FCFFFD /* PasteButtonTests.swift in Sources */,
+ 520DC65526F60FBB00FCFFFD /* ForEachTests.swift in Sources */,
+ 520DC66826F60FBB00FCFFFD /* NavigationLinkTests.swift in Sources */,
+ 520DC65426F60FBB00FCFFFD /* DividerTests.swift in Sources */,
+ 520DC60F26F60FBA00FCFFFD /* LazyGroupTests.swift in Sources */,
+ 520DC64526F60FBB00FCFFFD /* TabViewTests.swift in Sources */,
+ 520DC61226F60FBA00FCFFFD /* BaseTypesTests.swift in Sources */,
+ 520DC61B26F60FBA00FCFFFD /* RotationGestureTests.swift in Sources */,
+ 520DC66226F60FBB00FCFFFD /* NavigationViewTests.swift in Sources */,
+ 520DC61C26F60FBA00FCFFFD /* ExclusiveGestureChildrenTests.swift in Sources */,
+ 520DC61026F60FBA00FCFFFD /* ViewHostingTests.swift in Sources */,
+ 520DC63226F60FBB00FCFFFD /* GroupBoxTests.swift in Sources */,
+ 520DC62326F60FBA00FCFFFD /* CommonComposedGestureTests.swift in Sources */,
+ 520DC63926F60FBB00FCFFFD /* LabelTests.swift in Sources */,
+ 520DC62A26F60FBB00FCFFFD /* MagnificationGestureTests.swift in Sources */,
+ 520DC66926F60FBB00FCFFFD /* VStackTests.swift in Sources */,
+ 520DC62026F60FBA00FCFFFD /* SequenceGestureTests.swift in Sources */,
+ 520DC65226F60FBB00FCFFFD /* TextAttributesTests.swift in Sources */,
+ 520DC67326F60FBB00FCFFFD /* ScrollViewTests.swift in Sources */,
+ 520DC63D26F60FBB00FCFFFD /* TreeViewTests.swift in Sources */,
+ 520DC65026F60FBB00FCFFFD /* LazyHStackTests.swift in Sources */,
+ 520DC64126F60FBB00FCFFFD /* DisclosureGroupTests.swift in Sources */,
+ 520DC61326F60FBA00FCFFFD /* ViewSearchTests.swift in Sources */,
+ 520DC64F26F60FBB00FCFFFD /* LazyVGridTests.swift in Sources */,
+ 520DC64226F60FBB00FCFFFD /* GeometryReaderTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 520DC68F26F60FF400FCFFFD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 520DC69026F60FF400FCFFFD /* AlertTests.swift in Sources */,
+ 520DC69126F60FF400FCFFFD /* InspectableViewTests.swift in Sources */,
+ 520DC69226F60FF400FCFFFD /* ExclusiveGestureTests.swift in Sources */,
+ 520DC69326F60FF400FCFFFD /* MenuButtonTests.swift in Sources */,
+ 520DC69426F60FF400FCFFFD /* EnvironmentObjectInjectionTests.swift in Sources */,
+ 520DC69526F60FF400FCFFFD /* LazyVStackTests.swift in Sources */,
+ 520DC69626F60FF400FCFFFD /* MapAnnotationTests.swift in Sources */,
+ 520DC69726F60FF400FCFFFD /* MenuTests.swift in Sources */,
+ 520DC69826F60FF400FCFFFD /* PresentationModifiersTests.swift in Sources */,
+ 520DC69926F60FF400FCFFFD /* SliderTests.swift in Sources */,
+ 520DC69A26F60FF400FCFFFD /* PopoverTests.swift in Sources */,
+ 520DC69B26F60FF400FCFFFD /* ActionSheetTests.swift in Sources */,
+ 520DC69C26F60FF400FCFFFD /* SpacerTests.swift in Sources */,
+ 520DC69D26F60FF400FCFFFD /* RadialGradientTests.swift in Sources */,
+ 520DC69E26F60FF400FCFFFD /* TextFieldTests.swift in Sources */,
+ 520DC69F26F60FF400FCFFFD /* LinkTests.swift in Sources */,
+ 520DC6A026F60FF400FCFFFD /* EventsModifiersTests.swift in Sources */,
+ 520DC6A126F60FF400FCFFFD /* StepperTests.swift in Sources */,
+ 520DC6A226F60FF400FCFFFD /* ConfirmationDialogTests.swift in Sources */,
+ 520DC6A326F60FF400FCFFFD /* HSplitViewTests.swift in Sources */,
+ 520DC6A426F60FF400FCFFFD /* CustomViewTests.swift in Sources */,
+ 520DC6A526F60FF400FCFFFD /* ListTests.swift in Sources */,
+ 520DC6A626F60FF400FCFFFD /* HitTestingTests.swift in Sources */,
+ 520DC6A726F60FF400FCFFFD /* SectionTests.swift in Sources */,
+ 520DC6A826F60FF400FCFFFD /* VSplitViewTests.swift in Sources */,
+ 520DC6A926F60FF400FCFFFD /* EnvironmentModifiersTests.swift in Sources */,
+ 520DC6AA26F60FF400FCFFFD /* SecureFieldTests.swift in Sources */,
+ 520DC6AB26F60FF400FCFFFD /* VisualEffectModifiersTests.swift in Sources */,
+ 520DC6AC26F60FF400FCFFFD /* AnyViewTests.swift in Sources */,
+ 520DC6AD26F60FF400FCFFFD /* AngularGradientTests.swift in Sources */,
+ 520DC6AE26F60FF400FCFFFD /* PickerTests.swift in Sources */,
+ 520DC6AF26F60FF400FCFFFD /* SimultaneousGestureTests.swift in Sources */,
+ 520DC6B026F60FF400FCFFFD /* SizingModifiersTests.swift in Sources */,
+ 520DC6B126F60FF400FCFFFD /* CustomViewBuilderTests.swift in Sources */,
+ 520DC6B226F60FF400FCFFFD /* ZStackTests.swift in Sources */,
+ 520DC6B326F60FF400FCFFFD /* CommonComposedGestureChangedTests.swift in Sources */,
+ 520DC6B426F60FF400FCFFFD /* EditButtonTests.swift in Sources */,
+ 520DC6B526F60FF400FCFFFD /* OpaqueViewTests.swift in Sources */,
+ 520DC6B626F60FF400FCFFFD /* EmptyViewTests.swift in Sources */,
+ 520DC6B726F60FF400FCFFFD /* OptionalViewTests.swift in Sources */,
+ 520DC6B826F60FF400FCFFFD /* ConfigurationModifiersTests.swift in Sources */,
+ 520DC6B926F60FF400FCFFFD /* InteractionModifiersTests.swift in Sources */,
+ 520DC6BA26F60FF400FCFFFD /* PositioningModifiersTests.swift in Sources */,
+ 520DC6BB26F60FF400FCFFFD /* NestedModifiersTests.swift in Sources */,
+ 520DC6BC26F60FF400FCFFFD /* TransitiveModifiersTests.swift in Sources */,
+ 520DC6BD26F60FF400FCFFFD /* AnimationModifiersTests.swift in Sources */,
+ 520DC6BE26F60FF400FCFFFD /* IDViewTests.swift in Sources */,
+ 520DC6BF26F60FF400FCFFFD /* SubscriptionViewTests.swift in Sources */,
+ 520DC6C026F60FF400FCFFFD /* SequenceGestureChildrenTests.swift in Sources */,
+ 520DC6C126F60FF400FCFFFD /* TextEditorTests.swift in Sources */,
+ 520DC6C226F60FF400FCFFFD /* SimultaneousGestureModifierTests.swift in Sources */,
+ 520DC6C326F60FF400FCFFFD /* HighPriorityGestureModifierTests.swift in Sources */,
+ 520DC6C426F60FF400FCFFFD /* ShapeTests.swift in Sources */,
+ 520DC6C526F60FF400FCFFFD /* ToolbarTests.swift in Sources */,
+ 520DC6C626F60FF400FCFFFD /* HStackTests.swift in Sources */,
+ 520DC6C726F60FF400FCFFFD /* TouchBarTests.swift in Sources */,
+ 520DC6C826F60FF400FCFFFD /* CustomViewModifierTests.swift in Sources */,
+ 520DC6C926F60FF400FCFFFD /* TextInputModifiersTests.swift in Sources */,
+ 520DC6CA26F60FF400FCFFFD /* GestureExampleTests.swift in Sources */,
+ 520DC6CB26F60FF400FCFFFD /* SimultaneousGestureChildrenTests.swift in Sources */,
+ 520DC6CC26F60FF400FCFFFD /* GestureModifierTests.swift in Sources */,
+ 520DC6CD26F60FF400FCFFFD /* ImageTests.swift in Sources */,
+ 520DC6CE26F60FF400FCFFFD /* ColorTests.swift in Sources */,
+ 520DC6CF26F60FF400FCFFFD /* ButtonTests.swift in Sources */,
+ 520DC6D026F60FF400FCFFFD /* SheetTests.swift in Sources */,
+ 520DC6D126F60FF400FCFFFD /* CommonComposedGestureUpdatingTests.swift in Sources */,
+ 520DC6D226F60FF400FCFFFD /* EnvironmentReaderViewTests.swift in Sources */,
+ 520DC6D326F60FF400FCFFFD /* ColorPickerTests.swift in Sources */,
+ 520DC6D426F60FF400FCFFFD /* OutlineGroupTests.swift in Sources */,
+ 520DC6D526F60FF400FCFFFD /* InspectionEmissaryTests.swift in Sources */,
+ 520DC6D626F60FF400FCFFFD /* ToggleTests.swift in Sources */,
+ 520DC6D726F60FF400FCFFFD /* DragGestureTests.swift in Sources */,
+ 520DC6D826F60FF400FCFFFD /* ConditionalContentTests.swift in Sources */,
+ 520DC6D926F60FF400FCFFFD /* TransformingModifiersTests.swift in Sources */,
+ 520DC6DA26F60FF400FCFFFD /* ProgressViewTests.swift in Sources */,
+ 520DC6DB26F60FF400FCFFFD /* GroupTests.swift in Sources */,
+ 520DC6DC26F60FF400FCFFFD /* TupleViewTests.swift in Sources */,
+ 520DC6DD26F60FF400FCFFFD /* AccessibilityModifiersTests.swift in Sources */,
+ 520DC6DE26F60FF400FCFFFD /* ScrollViewReaderTests.swift in Sources */,
+ 520DC6DF26F60FF400FCFFFD /* LongPressGestureTests.swift in Sources */,
+ 520DC6E026F60FF400FCFFFD /* SafeAreaInsetTests.swift in Sources */,
+ 520DC6E126F60FF400FCFFFD /* ViewPaddingTests.swift in Sources */,
+ 520DC6E226F60FF400FCFFFD /* CustomStyleModifiersTests.swift in Sources */,
+ 520DC6E326F60FF400FCFFFD /* InspectorTests.swift in Sources */,
+ 520DC6E426F60FF400FCFFFD /* TextTests.swift in Sources */,
+ 520DC6E526F60FF400FCFFFD /* TapGestureTests.swift in Sources */,
+ 520DC6E626F60FF400FCFFFD /* CommonComposedGestureEndedTests.swift in Sources */,
+ 520DC6E726F60FF400FCFFFD /* CommonGestureTests.swift in Sources */,
+ 520DC6E826F60FF400FCFFFD /* DatePickerTests.swift in Sources */,
+ 520DC6E926F60FF400FCFFFD /* FullScreenCoverTests.swift in Sources */,
+ 520DC6EA26F60FF400FCFFFD /* MapTests.swift in Sources */,
+ 520DC6EB26F60FF400FCFFFD /* LinearGradientTests.swift in Sources */,
+ 520DC6EC26F60FF400FCFFFD /* FormTests.swift in Sources */,
+ 520DC6ED26F60FF400FCFFFD /* EquatableViewTests.swift in Sources */,
+ 520DC6EE26F60FF400FCFFFD /* DelayedPreferenceViewTests.swift in Sources */,
+ 520DC6EF26F60FF400FCFFFD /* LazyHGridTests.swift in Sources */,
+ 520DC6F026F60FF400FCFFFD /* GestureActionTests.swift in Sources */,
+ 520DC6F126F60FF400FCFFFD /* ComposedGestureExampleTests.swift in Sources */,
+ 520DC6F226F60FF400FCFFFD /* PasteButtonTests.swift in Sources */,
+ 520DC6F326F60FF400FCFFFD /* ForEachTests.swift in Sources */,
+ 520DC6F426F60FF400FCFFFD /* NavigationLinkTests.swift in Sources */,
+ 520DC6F526F60FF400FCFFFD /* DividerTests.swift in Sources */,
+ 520DC6F626F60FF400FCFFFD /* LazyGroupTests.swift in Sources */,
+ 520DC6F726F60FF400FCFFFD /* TabViewTests.swift in Sources */,
+ 520DC6F826F60FF400FCFFFD /* BaseTypesTests.swift in Sources */,
+ 520DC6F926F60FF400FCFFFD /* RotationGestureTests.swift in Sources */,
+ 520DC6FA26F60FF400FCFFFD /* NavigationViewTests.swift in Sources */,
+ 520DC6FB26F60FF400FCFFFD /* ExclusiveGestureChildrenTests.swift in Sources */,
+ 520DC6FC26F60FF400FCFFFD /* ViewHostingTests.swift in Sources */,
+ 520DC6FD26F60FF400FCFFFD /* GroupBoxTests.swift in Sources */,
+ 520DC6FE26F60FF400FCFFFD /* CommonComposedGestureTests.swift in Sources */,
+ 520DC6FF26F60FF400FCFFFD /* LabelTests.swift in Sources */,
+ 520DC70026F60FF400FCFFFD /* MagnificationGestureTests.swift in Sources */,
+ 520DC70126F60FF400FCFFFD /* VStackTests.swift in Sources */,
+ 520DC70226F60FF400FCFFFD /* SequenceGestureTests.swift in Sources */,
+ 520DC70326F60FF400FCFFFD /* TextAttributesTests.swift in Sources */,
+ 520DC70426F60FF400FCFFFD /* ScrollViewTests.swift in Sources */,
+ 520DC70526F60FF400FCFFFD /* TreeViewTests.swift in Sources */,
+ 520DC70626F60FF400FCFFFD /* LazyHStackTests.swift in Sources */,
+ 520DC70726F60FF400FCFFFD /* DisclosureGroupTests.swift in Sources */,
+ 520DC70826F60FF400FCFFFD /* ViewSearchTests.swift in Sources */,
+ 520DC70926F60FF400FCFFFD /* LazyVGridTests.swift in Sources */,
+ 520DC70A26F60FF400FCFFFD /* GeometryReaderTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5293010926EFC96700012E90 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5293012726EFCBD300012E90 /* watchOSApp-2.swift in Sources */,
+ 520DC71526F6115D00FCFFFD /* watchOSApp+Testable.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 52E3259626C72E7900CCE47E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 52E325A226C72E7900CCE47E /* watchOSApp-1.swift in Sources */,
+ 52CA301626ECD64400BFD568 /* watchOSApp+Testable.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 520213A926ECB45D00E94C6E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 52E3259926C72E7900CCE47E /* watchOS-Ext-1 */;
+ targetProxy = 520213A826ECB45D00E94C6E /* PBXContainerItemProxy */;
+ };
+ 520DC68C26F60FF400FCFFFD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 52E3259926C72E7900CCE47E /* watchOS-Ext-1 */;
+ targetProxy = 520DC68D26F60FF400FCFFFD /* PBXContainerItemProxy */;
+ };
+ 520DC71426F6103300FCFFFD /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 5293010C26EFC96700012E90 /* watchOS-Ext-2 */;
+ targetProxy = 520DC71326F6103300FCFFFD /* PBXContainerItemProxy */;
+ };
+ 5293011026EFC96700012E90 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 5293010C26EFC96700012E90 /* watchOS-Ext-2 */;
+ targetProxy = 5293010F26EFC96700012E90 /* PBXContainerItemProxy */;
+ };
+ 52E3259D26C72E7900CCE47E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 52E3259926C72E7900CCE47E /* watchOS-Ext-1 */;
+ targetProxy = 52E3259C26C72E7900CCE47E /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 520DC5AA26F60FBA00FCFFFD /* Test.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 520DC5AB26F60FBA00FCFFFD /* en */,
+ 520DC5AC26F60FBA00FCFFFD /* en-AU */,
+ 520DC5AD26F60FBA00FCFFFD /* ru */,
+ );
+ name = Test.strings;
+ sourceTree = "";
+ };
+ 5293010426EFC96600012E90 /* Interface.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 5293010526EFC96600012E90 /* Base */,
+ );
+ name = Interface.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 520213AA26ECB45D00E94C6E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.viewinspector.watchOS-Tests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/watchOS-Ext-1.appex/watchOS-Ext-1";
+ };
+ name = Debug;
+ };
+ 520213AB26ECB45D00E94C6E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.viewinspector.watchOS-Tests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/watchOS-Ext-1.appex/watchOS-Ext-1";
+ };
+ name = Release;
+ };
+ 520DC71026F60FF400FCFFFD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.viewinspector.watchOS-Tests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/watchOS-Ext-2.appex/watchOS-Ext-2";
+ };
+ name = Debug;
+ };
+ 520DC71126F60FF400FCFFFD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.viewinspector.watchOS-Tests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/watchOS-Ext-2.appex/watchOS-Ext-2";
+ };
+ name = Release;
+ };
+ 5293011C26EFC96800012E90 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/watchOS-Ext/Ext-2-Info.plist";
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INFOPLIST_KEY_WKExtensionDelegateClassName = watchOS_Ext_2.ExtensionDelegate;
+ INFOPLIST_KEY_WKWatchOnly = YES;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.viewinspector.watchOS2.watchkitapp.watchkitextension;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 4;
+ };
+ name = Debug;
+ };
+ 5293011D26EFC96800012E90 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/watchOS-Ext/Ext-2-Info.plist";
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INFOPLIST_KEY_WKExtensionDelegateClassName = watchOS_Ext_2.ExtensionDelegate;
+ INFOPLIST_KEY_WKWatchOnly = YES;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.viewinspector.watchOS2.watchkitapp.watchkitextension;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 4;
+ };
+ name = Release;
+ };
+ 5293012026EFC96800012E90 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ IBSC_MODULE = watchOS_App_2;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.viewinspector.watchOS2.watchkitapp;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 5293012126EFC96800012E90 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ IBSC_MODULE = watchOS_App_2;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.viewinspector.watchOS2.watchkitapp;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 52E325AB26C72E7900CCE47E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 7.0;
+ };
+ name = Debug;
+ };
+ 52E325AC26C72E7900CCE47E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = 4;
+ VALIDATE_PRODUCT = YES;
+ WATCHOS_DEPLOYMENT_TARGET = 7.0;
+ };
+ name = Release;
+ };
+ 52E325AE26C72E7900CCE47E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1.0;
+ ENABLE_PREVIEWS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/watchOS-Ext/Ext-1-Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.viewinspector.watchOS1.watchkitapp.watchkitextension;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 52E325AF26C72E7900CCE47E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1.0;
+ ENABLE_PREVIEWS = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/watchOS-Ext/Ext-1-Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.viewinspector.watchOS1.watchkitapp.watchkitextension;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 52E325B226C72E7900CCE47E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.viewinspector.watchOS1.watchkitapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 52E325B326C72E7900CCE47E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.viewinspector.watchOS1.watchkitapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 520213AC26ECB45D00E94C6E /* Build configuration list for PBXNativeTarget "watchOS-1-Tests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 520213AA26ECB45D00E94C6E /* Debug */,
+ 520213AB26ECB45D00E94C6E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 520DC70F26F60FF400FCFFFD /* Build configuration list for PBXNativeTarget "watchOS-2-Tests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 520DC71026F60FF400FCFFFD /* Debug */,
+ 520DC71126F60FF400FCFFFD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 5293011B26EFC96800012E90 /* Build configuration list for PBXNativeTarget "watchOS-Ext-2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 5293011C26EFC96800012E90 /* Debug */,
+ 5293011D26EFC96800012E90 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 5293011F26EFC96800012E90 /* Build configuration list for PBXNativeTarget "watchOS-App-2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 5293012026EFC96800012E90 /* Debug */,
+ 5293012126EFC96800012E90 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 52E3258726C72E7800CCE47E /* Build configuration list for PBXProject "watchOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 52E325AB26C72E7900CCE47E /* Debug */,
+ 52E325AC26C72E7900CCE47E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 52E325AD26C72E7900CCE47E /* Build configuration list for PBXNativeTarget "watchOS-Ext-1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 52E325AE26C72E7900CCE47E /* Debug */,
+ 52E325AF26C72E7900CCE47E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 52E325B126C72E7900CCE47E /* Build configuration list for PBXNativeTarget "watchOS-App-1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 52E325B226C72E7900CCE47E /* Debug */,
+ 52E325B326C72E7900CCE47E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 520DC68E26F60FF400FCFFFD /* ViewInspector */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = ViewInspector;
+ };
+ 52CA301326ECC5D200BFD568 /* ViewInspector */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = ViewInspector;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 52E3258426C72E7800CCE47E /* Project object */;
+}
diff --git a/.watchOS/watchOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/.watchOS/watchOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/.watchOS/watchOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/ViewInspector.xcscheme b/.watchOS/watchOS.xcodeproj/xcshareddata/xcschemes/watchOS-App-1.xcscheme
similarity index 60%
rename from .swiftpm/xcode/xcshareddata/xcschemes/ViewInspector.xcscheme
rename to .watchOS/watchOS.xcodeproj/xcshareddata/xcschemes/watchOS-App-1.xcscheme
index 0cec304d..3dc144f8 100644
--- a/.swiftpm/xcode/xcshareddata/xcschemes/ViewInspector.xcscheme
+++ b/.watchOS/watchOS.xcodeproj/xcshareddata/xcschemes/watchOS-App-1.xcscheme
@@ -1,6 +1,6 @@
+ buildForProfiling = "NO"
+ buildForArchiving = "NO"
+ buildForAnalyzing = "NO">
+ BlueprintIdentifier = "52E3258D26C72E7800CCE47E"
+ BuildableName = "watchOS-App-1.app"
+ BlueprintName = "watchOS-App-1"
+ ReferencedContainer = "container:watchOS.xcodeproj">
+ buildForAnalyzing = "NO">
+ BlueprintIdentifier = "520213A326ECB45D00E94C6E"
+ BuildableName = "watchOS-1-Tests.xctest"
+ BlueprintName = "watchOS-1-Tests"
+ ReferencedContainer = "container:watchOS.xcodeproj">
@@ -40,26 +40,16 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES"
- codeCoverageEnabled = "YES">
-
-
-
-
+ shouldUseLaunchSchemeArgsEnv = "YES">
+ BlueprintIdentifier = "520213A326ECB45D00E94C6E"
+ BuildableName = "watchOS-1-Tests.xctest"
+ BlueprintName = "watchOS-1-Tests"
+ ReferencedContainer = "container:watchOS.xcodeproj">
@@ -74,6 +64,16 @@
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
+
+
+
+
+ BlueprintIdentifier = "52E3258D26C72E7800CCE47E"
+ BuildableName = "watchOS-App-1.app"
+ BlueprintName = "watchOS-App-1"
+ ReferencedContainer = "container:watchOS.xcodeproj">
diff --git a/.watchOS/watchOS.xcodeproj/xcshareddata/xcschemes/watchOS-App-2.xcscheme b/.watchOS/watchOS.xcodeproj/xcshareddata/xcschemes/watchOS-App-2.xcscheme
new file mode 100644
index 00000000..33c5de47
--- /dev/null
+++ b/.watchOS/watchOS.xcodeproj/xcshareddata/xcschemes/watchOS-App-2.xcscheme
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Package.swift b/Package.swift
index b9dd8548..047daed4 100644
--- a/Package.swift
+++ b/Package.swift
@@ -7,7 +7,7 @@ let package = Package(
name: "ViewInspector",
defaultLocalization: "en",
platforms: [
- .macOS(.v10_15), .iOS(.v11), .tvOS(.v13)
+ .macOS(.v10_15), .iOS(.v11), .tvOS(.v13), .watchOS(.v7)
],
products: [
.library(
diff --git a/README.md b/README.md
index dce1d6f0..417930cf 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-![Platform](https://img.shields.io/badge/platform-iOS%20%7C%20tvOS%20%7C%20macOS-lightgrey) [![Build Status](https://travis-ci.com/nalexn/ViewInspector.svg?branch=master)](https://travis-ci.com/nalexn/ViewInspector) [![codecov](https://codecov.io/gh/nalexn/ViewInspector/branch/master/graph/badge.svg)](https://codecov.io/gh/nalexn/ViewInspector)
+![Platform](https://img.shields.io/badge/platform-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS-lightgrey) [![Build Status](https://travis-ci.com/nalexn/ViewInspector.svg?branch=master)](https://travis-ci.com/nalexn/ViewInspector) [![codecov](https://codecov.io/gh/nalexn/ViewInspector/branch/master/graph/badge.svg)](https://codecov.io/gh/nalexn/ViewInspector)
diff --git a/Sources/ViewInspector/BaseTypes.swift b/Sources/ViewInspector/BaseTypes.swift
index f39440a7..2db51bb3 100644
--- a/Sources/ViewInspector/BaseTypes.swift
+++ b/Sources/ViewInspector/BaseTypes.swift
@@ -104,11 +104,17 @@ public extension KnownViewType {
}
static var isTransitive: Bool { false }
static func inspectionCall(typeName: String) -> String {
- let baseName = typePrefix.prefix(1).lowercased() + typePrefix.dropFirst()
+ let baseName = typePrefix.firstLetterLowercased
return "\(baseName)(\(ViewType.indexPlaceholder))"
}
}
+internal extension String {
+ var firstLetterLowercased: String {
+ prefix(1).lowercased() + dropFirst()
+ }
+}
+
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
public struct ViewType { }
@@ -281,11 +287,11 @@ extension InspectionError: CustomStringConvertible, LocalizedError {
// MARK: - BinaryEquatable
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-internal protocol BinaryEquatable: Equatable { }
+public protocol BinaryEquatable: Equatable { }
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
extension BinaryEquatable {
- static func == (lhs: Self, rhs: Self) -> Bool {
+ public static func == (lhs: Self, rhs: Self) -> Bool {
withUnsafeBytes(of: lhs) { lhsBytes -> Bool in
withUnsafeBytes(of: rhs) { rhsBytes -> Bool in
lhsBytes.elementsEqual(rhsBytes)
@@ -293,83 +299,3 @@ extension BinaryEquatable {
}
}
}
-
-// MARK: - EnvironmentObject injection
-
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-internal extension Inspectable {
- var missingEnvironmentObjects: [String] {
- let prefix = "SwiftUI.EnvironmentObject<"
- let mirror = Mirror(reflecting: self)
- return mirror.children.compactMap {
- let fullName = Inspector.typeName(value: $0.value, namespaced: true)
- guard fullName.hasPrefix(prefix),
- (try? Inspector.attribute(path: "_store|some", value: $0.value)) == nil,
- let ivarName = $0.label
- else { return nil }
- var objName = Inspector.typeName(value: $0.value)
- objName = objName[18...size
- var offset = MemoryLayout.stride - envObjSize
- let step = MemoryLayout.alignment
- while offset + envObjSize > viewSize {
- offset -= step
- }
- withUnsafeBytes(of: EnvObject.Forgery(object: nil)) { reference in
- while offset >= 0 {
- var copy = self
- withUnsafeMutableBytes(of: ©) { bytes in
- guard bytes[offset..) -> String {
- let range = Range(uncheckedBounds: (lower: max(0, min(count, intRange.lowerBound)),
- upper: min(count, max(0, intRange.upperBound))))
- let start = index(startIndex, offsetBy: range.lowerBound)
- let end = index(start, offsetBy: range.upperBound - range.lowerBound)
- return String(self[start ..< end])
- }
-}
diff --git a/Sources/ViewInspector/EnvironmentInjection.swift b/Sources/ViewInspector/EnvironmentInjection.swift
new file mode 100644
index 00000000..4c6cb3d6
--- /dev/null
+++ b/Sources/ViewInspector/EnvironmentInjection.swift
@@ -0,0 +1,81 @@
+import SwiftUI
+
+// MARK: - EnvironmentObject injection
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+internal extension Inspectable {
+ var missingEnvironmentObjects: [String] {
+ let prefix = "SwiftUI.EnvironmentObject<"
+ let mirror = Mirror(reflecting: self)
+ return mirror.children.compactMap {
+ let fullName = Inspector.typeName(value: $0.value, namespaced: true)
+ guard fullName.hasPrefix(prefix),
+ (try? Inspector.attribute(path: "_store|some", value: $0.value)) == nil,
+ let ivarName = $0.label
+ else { return nil }
+ var objName = Inspector.typeName(value: $0.value)
+ objName = objName[18...size
+ var offset = MemoryLayout.stride - envObjSize
+ let step = MemoryLayout.alignment
+ while offset + envObjSize > viewSize {
+ offset -= step
+ }
+ withUnsafeBytes(of: EnvObject.Forgery(object: nil)) { reference in
+ while offset >= 0 {
+ var copy = self
+ withUnsafeMutableBytes(of: ©) { bytes in
+ guard bytes[offset..) -> String {
+ let range = Range(uncheckedBounds: (lower: max(0, min(count, intRange.lowerBound)),
+ upper: min(count, max(0, intRange.upperBound))))
+ let start = index(startIndex, offsetBy: range.lowerBound)
+ let end = index(start, offsetBy: range.upperBound - range.lowerBound)
+ return String(self[start ..< end])
+ }
+}
diff --git a/Sources/ViewInspector/Inspector.swift b/Sources/ViewInspector/Inspector.swift
index 13d0fc89..4da98e60 100644
--- a/Sources/ViewInspector/Inspector.swift
+++ b/Sources/ViewInspector/Inspector.swift
@@ -1,10 +1,10 @@
import SwiftUI
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-internal struct Inspector { }
+public struct Inspector { }
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-extension Inspector {
+internal extension Inspector {
static func attribute(label: String, value: Any) throws -> Any {
if label == "super", let superclass = Mirror(reflecting: value).superclassMirror {
@@ -52,14 +52,25 @@ extension Inspector {
prefixOnly: Bool = false) -> String {
let typeName = namespaced ? String(reflecting: type) : String(describing: type)
guard prefixOnly else { return typeName }
- return typeName.components(separatedBy: "<").first!
- }
+ let name = typeName.components(separatedBy: "<").first!
+ guard namespaced else { return name }
+ let string = NSMutableString(string: name)
+ let range = NSRange(location: 0, length: string.length)
+ namespaceSanitizeRegex.replaceMatches(in: string, options: [], range: range, withTemplate: "SwiftUI")
+ return String(string)
+ }
+
+ private static var namespaceSanitizeRegex: NSRegularExpression = {
+ guard let regex = try? NSRegularExpression(pattern: "SwiftUI.\\(unknown context at .*\\)", options: [])
+ else { fatalError() }
+ return regex
+ }()
}
// MARK: - Attributes lookup
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-extension Inspector {
+public extension Inspector {
/**
Use this function to lookup the struct content:
@@ -67,8 +78,8 @@ extension Inspector {
(lldb) po Inspector.print(view) as AnyObject
```
*/
- public static func print(_ value: Any) -> String {
- let tree = attributesTree(value: value, medium: .empty)
+ static func print(_ value: Any) -> String {
+ let tree = attributesTree(value: value, medium: .empty, visited: [])
return typeName(value: value) + print(tree, level: 1)
}
@@ -96,22 +107,35 @@ extension Inspector {
return needsNewLine ? "\n" : ""
}
- private static func attributesTree(value: Any, medium: Content.Medium) -> Any {
+ private static func attributesTree(value: Any, medium: Content.Medium, visited: [AnyObject]) -> Any {
+ var visited = visited
+ if type(of: value) is AnyClass {
+ let ref = value as AnyObject
+ guard !visited.contains(where: { $0 === ref })
+ else { return " = { cyclic reference }" }
+ visited.append(ref)
+ }
if let array = value as? [Any] {
- return array.map { attributesTree(value: $0, medium: medium) }
+ return array.map { attributesTree(value: $0, medium: medium, visited: visited) }
}
let medium = (try? unwrap(content: Content(value, medium: medium)).medium) ?? medium
- let mirror = Mirror(reflecting: value)
+ var mirror = Mirror(reflecting: value)
+ var children = Array(mirror.children)
+ while let superclass = mirror.superclassMirror {
+ mirror = superclass
+ children.append(contentsOf: superclass.children)
+ }
var dict: [String: Any] = [:]
- mirror.children.enumerated().forEach { child in
+ children.enumerated().forEach { child in
let childName = child.element.label ?? "[\(child.offset)]"
let childType = typeName(value: child.element.value)
- dict[childName + ": " + childType] = attributesTree(value: child.element.value, medium: medium)
+ dict[childName + ": " + childType] = attributesTree(
+ value: child.element.value, medium: medium, visited: visited)
}
if let inspectable = value as? Inspectable,
let content = try? inspectable.extractContent(environmentObjects: medium.environmentObjects) {
let childType = typeName(value: content)
- dict["body: " + childType] = attributesTree(value: content, medium: medium)
+ dict["body: " + childType] = attributesTree(value: content, medium: medium, visited: visited)
}
if dict.count == 0 {
return " = " + String(describing: value)
@@ -145,7 +169,7 @@ fileprivate extension Array {
// MARK: - View Inspection
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-extension Inspector {
+internal extension Inspector {
static func viewsInContainer(view: Any, medium: Content.Medium) throws -> LazyGroup {
let unwrappedContainer = try Inspector.unwrap(content: Content(view, medium: medium.resettingViewModifiers()))
@@ -163,6 +187,7 @@ extension Inspector {
return try unwrap(content: Content(view, medium: medium))
}
+ // swiftlint:disable cyclomatic_complexity
static func unwrap(content: Content) throws -> Content {
switch Inspector.typeName(value: content.view, prefixOnly: true) {
case "Tree":
@@ -177,6 +202,8 @@ extension Inspector {
return try ViewType.ViewModifier.child(content)
case "SubscriptionView":
return try ViewType.SubscriptionView.child(content)
+ case "_UnaryViewAdaptor":
+ return try ViewType.UnaryViewAdaptor.child(content)
case "_ConditionalContent":
return try ViewType.ConditionalContent.child(content)
case "EnvironmentReaderView":
@@ -187,26 +214,30 @@ extension Inspector {
return content
}
}
+ // swiftlint:enable cyclomatic_complexity
static func guardType(value: Any, namespacedPrefixes: [String], inspectionCall: String) throws {
- guard let firstPrefix = namespacedPrefixes.first
- else { return }
- let typeWithParams = typeName(type: type(of: value))
- let typePrefix = typeName(type: type(of: value), namespaced: true, prefixOnly: true)
- if typePrefix == "SwiftUI.EnvironmentReaderView" {
- if typeWithParams.contains("NavigationBarItemsKey") {
- throw InspectionError.notSupported(
- """
- Please insert '.navigationBarItems()' before \(inspectionCall) \
- for unwrapping the underlying view hierarchy.
- """)
- } else if typeWithParams.contains("_AnchorWritingModifier") {
- throw InspectionError.notSupported(
- "Unwrapping the view under popover is not supported on iOS 14.0 and 14.1")
+
+ for prefix in namespacedPrefixes {
+ let withGenericParams = prefix.contains("<")
+ let typePrefix = typeName(type: type(of: value), namespaced: true, prefixOnly: !withGenericParams)
+ if typePrefix == "SwiftUI.EnvironmentReaderView" {
+ let typeWithParams = typeName(type: type(of: value))
+ if typeWithParams.contains("NavigationBarItemsKey") {
+ throw InspectionError.notSupported(
+ """
+ Please insert '.navigationBarItems()' before \(inspectionCall) \
+ for unwrapping the underlying view hierarchy.
+ """)
+ }
+ }
+ if namespacedPrefixes.contains(typePrefix) {
+ return
}
}
- guard namespacedPrefixes.contains(typePrefix) else {
- throw InspectionError.typeMismatch(factual: typePrefix, expected: firstPrefix)
+ if let prefix = namespacedPrefixes.first {
+ let typePrefix = typeName(type: type(of: value), namespaced: true)
+ throw InspectionError.typeMismatch(factual: typePrefix, expected: prefix)
}
}
}
diff --git a/Sources/ViewInspector/Modifiers/AccessibilityModifiers.swift b/Sources/ViewInspector/Modifiers/AccessibilityModifiers.swift
index ca41c993..e91752c3 100644
--- a/Sources/ViewInspector/Modifiers/AccessibilityModifiers.swift
+++ b/Sources/ViewInspector/Modifiers/AccessibilityModifiers.swift
@@ -6,101 +6,301 @@ import SwiftUI
public extension InspectableView {
func accessibilityLabel() throws -> InspectableView {
- let text = try accessibilityElement(
- "LabelKey", type: Text.self, call: "accessibilityLabel")
+ let text: Text
+ let call = "accessibilityLabel"
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ text = try v3AccessibilityElement(
+ type: Text.self, call: call, { $0.accessibilityLabel("") })
+ } else {
+ text = try v2AccessibilityElement("LabelKey", type: Text.self, call: call)
+ }
let medium = content.medium.resettingViewModifiers()
return try .init(try Inspector.unwrap(content: Content(text, medium: medium)), parent: self)
}
func accessibilityValue() throws -> InspectableView {
- let text = try accessibilityElement(
- "TypedValueKey", path: "value|some|description|some",
- type: Text.self, call: "accessibilityValue")
+ let text: Text
+ let call = "accessibilityValue"
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ text = try v3AccessibilityElement(
+ path: "some|description|some", type: Text.self,
+ call: call, { $0.accessibilityValue("") })
+ } else {
+ text = try v2AccessibilityElement(
+ "TypedValueKey", path: "value|some|description|some", type: Text.self, call: call)
+ }
let medium = content.medium.resettingViewModifiers()
return try .init(try Inspector.unwrap(content: Content(text, medium: medium)), parent: self)
}
func accessibilityHint() throws -> InspectableView {
- let text = try accessibilityElement(
- "HintKey", type: Text.self, call: "accessibilityHint")
+ let text: Text
+ let call = "accessibilityHint"
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ text = try v3AccessibilityElement(
+ type: Text.self, call: call, { $0.accessibilityHint("") })
+ } else {
+ text = try v2AccessibilityElement("HintKey", type: Text.self, call: call)
+ }
let medium = content.medium.resettingViewModifiers()
return try .init(try Inspector.unwrap(content: Content(text, medium: medium)), parent: self)
}
func accessibilityHidden() throws -> Bool {
- let visibility = try accessibilityElement(
- "VisibilityKey", path: "value", type: (Any?).self, call: "accessibility(hidden:)")
- switch visibility {
- case let .some(value):
- return String(describing: value) == "hidden"
- case .none:
- return false
+ let call = "accessibilityHidden"
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ let value = try v3AccessibilityElement(
+ path: "value|rawValue", type: UInt32.self,
+ call: call, { $0.accessibilityHidden(true) })
+ return value != 0
+ } else {
+ let visibility = try v2AccessibilityElement(
+ "VisibilityKey", path: "value", type: (Any?).self, call: call)
+ switch visibility {
+ case let .some(value):
+ return String(describing: value) == "hidden"
+ case .none:
+ return false
+ }
}
}
func accessibilityIdentifier() throws -> String {
- return try accessibilityElement(
- "IdentifierKey", type: String.self, call: "accessibility(identifier:)")
+ let call = "accessibilityIdentifier"
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ return try v3AccessibilityElement(
+ type: String.self, call: call, { $0.accessibilityIdentifier("") })
+ } else {
+ return try v2AccessibilityElement("IdentifierKey", type: String.self, call: call)
+ }
+ }
+
+ func accessibilitySortPriority() throws -> Double {
+ let call = "accessibilitySortPriority"
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ return try v3AccessibilityElement(
+ type: Double.self, call: call, { $0.accessibilitySortPriority(0) })
+ } else {
+ return try v2AccessibilityElement("SortPriorityKey", type: Double.self, call: call)
+ }
}
+ @available(iOS, deprecated, introduced: 13.0)
+ @available(macOS, deprecated, introduced: 10.15)
+ @available(tvOS, deprecated, introduced: 13.0)
+ @available(watchOS, deprecated, introduced: 6)
func accessibilitySelectionIdentifier() throws -> AnyHashable {
- return try accessibilityElement(
+ return try v2AccessibilityElement(
"SelectionIdentifierKey", type: AnyHashable.self,
call: "accessibility(selectionIdentifier:)")
}
func accessibilityActivationPoint() throws -> UnitPoint {
- return try accessibilityElement(
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ return try v3AccessibilityElement(
+ path: "some|unitPoint", type: UnitPoint.self,
+ call: "accessibilityIdentifier", { $0.accessibilityActivationPoint(.center) })
+ } else {
+ return try v2AccessibilityElement(
"ActivationPointKey", path: "value|some|unitPoint",
type: UnitPoint.self, call: "accessibility(activationPoint:)")
+ }
+ }
+
+ func callAccessibilityAction(_ named: S) throws where S: StringProtocol {
+ try callAccessibilityAction(AccessibilityActionKind(named: Text(named)))
}
func callAccessibilityAction(_ kind: AccessibilityActionKind) throws {
- let kindString = String(describing: kind)
- let shortName = kindString
- .components(separatedBy: CharacterSet(charactersIn: ".)"))
- .filter { $0.count > 0 }.last!
- let call = "accessibilityAction(.\(shortName))"
+ let shortName: String = {
+ if let name = try? kind.name().string() {
+ return "named: \"\(name)\""
+ }
+ return "." + String(describing: kind)
+ .components(separatedBy: CharacterSet(charactersIn: ".)"))
+ .filter { $0.count > 0 }.last!
+ }()
+ let call = "accessibilityAction(\(shortName))"
typealias Callback = (()) -> Void
- let callback = try accessibilityAction(name: kindString, path: "box|action|kind",
- type: Callback.self, call: call)
+ let callback: Callback
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ callback = try v3AccessibilityAction(kind: kind, type: Callback.self, call: call)
+ } else {
+ callback = try v2AccessibilityAction(kind: kind, type: Callback.self, call: call)
+ }
callback(())
}
func callAccessibilityAdjustableAction(_ direction: AccessibilityAdjustmentDirection = .increment) throws {
typealias Callback = (AccessibilityAdjustmentDirection) -> Void
- let callback = try accessibilityAction(
- name: "AccessibilityAdjustableAction()", path: "box|action",
- type: Callback.self, call: "accessibilityAdjustableAction")
+ let callback: Callback
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ callback = try v3AccessibilityAction(
+ name: "AccessibilityAdjustableAction",
+ type: Callback.self,
+ call: "accessibilityAdjustableAction")
+ } else {
+ callback = try v2AccessibilityAction(
+ name: "AccessibilityAdjustableAction()",
+ type: Callback.self,
+ call: "accessibilityAdjustableAction")
+ }
callback(direction)
}
func callAccessibilityScrollAction(_ edge: Edge) throws {
typealias Callback = (Edge) -> Void
- let callback = try accessibilityAction(
- name: "AccessibilityScrollAction()", path: "box|action",
- type: Callback.self, call: "accessibilityScrollAction")
+ let callback: Callback
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ callback = try v3AccessibilityAction(
+ name: "AccessibilityScrollAction",
+ type: Callback.self,
+ call: "accessibilityScrollAction")
+ } else {
+ callback = try v2AccessibilityAction(
+ name: "AccessibilityScrollAction()",
+ type: Callback.self,
+ call: "accessibilityScrollAction")
+ }
callback(edge)
}
+}
+
+// MARK: - Private
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+private extension AccessibilityActionKind {
+ func name() throws -> InspectableView {
+ let view: Any = try {
+ if let view = try? Inspector.attribute(path: "kind|named", value: self) {
+ return view
+ }
+ return try Inspector.attribute(path: "kind|custom", value: self)
+ }()
+ return try .init(Content(view), parent: nil, index: nil)
+ }
- func accessibilitySortPriority() throws -> Double {
- return try accessibilityElement(
- "SortPriorityKey", type: Double.self, call: "accessibility(sortPriority:)")
+ func isEqual(to other: AccessibilityActionKind) -> Bool {
+ if let lhsName = try? self.name().string(),
+ let rhsName = try? other.name().string() {
+ return lhsName == rhsName
+ }
+ return self == other
}
}
-// MARK: - Private
+@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
+private struct AccessibilityProperty {
+
+ let keyPointerValue: UInt64
+ let value: Any
+
+ init(property: Any) throws {
+ self.keyPointerValue = try Inspector.attribute(
+ path: "super|key|rawValue|pointerValue", value: property, type: UInt64.self)
+ self.value = try Inspector.attribute(path: "super|value", value: property)
+ }
+
+ static var noisePointerValues: Set = {
+ let view1 = EmptyView().accessibility(label: Text(""))
+ let view2 = EmptyView().accessibility(hint: Text(""))
+ do {
+ let props1 = try view1.inspect()
+ .v3AccessibilityProperties(call: "")
+ .map { $0.keyPointerValue }
+ let props2 = try view2.inspect()
+ .v3AccessibilityProperties(call: "")
+ .map { $0.keyPointerValue }
+ return Set(props1).intersection(Set(props2))
+ } catch { return .init() }
+ }()
+}
+
+@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
+private extension InspectableView {
+ func v3AccessibilityElement(
+ path: String? = nil, type: T.Type, call: String, _ reference: (EmptyView) -> V
+ ) throws -> T where V: SwiftUI.View {
+ let noiseValues = AccessibilityProperty.noisePointerValues
+ guard let referenceValue = try reference(EmptyView()).inspect()
+ .v3AccessibilityProperties(call: call)
+ .map({ $0.keyPointerValue })
+ .first(where: { !noiseValues.contains($0) }),
+ let property = try v3AccessibilityProperties(call: call)
+ .first(where: { $0.keyPointerValue == referenceValue })
+ else {
+ throw InspectionError
+ .modifierNotFound(parent: Inspector.typeName(value: content.view),
+ modifier: call, index: 0)
+ }
+ if let path = path {
+ return try Inspector.attribute(path: path, value: property.value, type: T.self)
+ }
+ return try Inspector.cast(value: property.value, type: T.self)
+ }
+
+ func v3AccessibilityAction(kind: AccessibilityActionKind, type: T.Type, call: String) throws -> T {
+ return try v3AccessibilityAction(trait: { action in
+ try Inspector.attribute(
+ path: "action|kind", value: action, type: AccessibilityActionKind.self)
+ .isEqual(to: kind)
+ }, type: type, call: call)
+ }
+
+ func v3AccessibilityAction(name: String, type: T.Type, call: String) throws -> T {
+ return try v3AccessibilityAction(trait: { action in
+ Inspector.typeName(value: action).contains(name)
+ }, type: type, call: call)
+ }
+
+ func v3AccessibilityAction(trait: (Any) throws -> Bool, type: T.Type, call: String) throws -> T {
+ let actions = try v3AccessibilityActions(call: call)
+ guard let action = actions.first(where: { (try? trait($0)) == true }) else {
+ throw InspectionError
+ .modifierNotFound(parent: Inspector.typeName(value: content.view),
+ modifier: call, index: 0)
+ }
+ return try Inspector.attribute(label: "handler", value: action, type: T.self)
+ }
+
+ func v3AccessibilityActions(call: String) throws -> [Any] {
+ let noiseValues = AccessibilityProperty.noisePointerValues
+ guard let referenceValue = try EmptyView().accessibilityAction(.default, { })
+ .inspect()
+ .v3AccessibilityProperties(call: call)
+ .map({ $0.keyPointerValue })
+ .first(where: { !noiseValues.contains($0) })
+ else {
+ throw InspectionError
+ .modifierNotFound(parent: Inspector.typeName(value: content.view),
+ modifier: call, index: 0)
+ }
+ return try v3AccessibilityProperties(call: call)
+ .filter({ $0.keyPointerValue == referenceValue })
+ .compactMap { $0.value as? [Any] }
+ .flatMap { $0 }
+ .map { try Inspector.attribute(path: "base|base", value: $0) }
+ }
+
+ func v3AccessibilityProperties(call: String) throws -> [AccessibilityProperty] {
+ return try modifierAttribute(
+ modifierName: "AccessibilityAttachmentModifier",
+ path: "modifier|storage|propertiesComponent",
+ type: [Any].self, call: call)
+ .map { try AccessibilityProperty(property: $0) }
+ }
+}
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
private extension InspectableView {
- func accessibilityElement(_ name: String, path: String = "value|some",
- type: T.Type, call: String) throws -> T {
+ func v2AccessibilityElement(_ name: String, path: String = "value|some",
+ type: T.Type, call: String) throws -> T {
let item = try modifierAttribute(
modifierName: "AccessibilityAttachmentModifier",
path: "modifier|attachment|some|properties|plist|elements|some",
type: Any.self, call: call)
- guard let attribute = lookupAttributeWithName(name, item: item),
+ guard let attribute = v2LookupAttributeWithName(name, item: item),
let value = try? Inspector.attribute(path: path, value: attribute) as? T else {
throw InspectionError.modifierNotFound(parent:
Inspector.typeName(value: content.view), modifier: call, index: 0)
@@ -108,25 +308,35 @@ private extension InspectableView {
return value
}
- func lookupAttributeWithName(_ name: String, item: Any) -> Any? {
+ func v2LookupAttributeWithName(_ name: String, item: Any) -> Any? {
if Inspector.typeName(value: item).contains(name) {
return item
}
if let nextItem = try? Inspector.attribute(path: "super|after|some", value: item) {
- return lookupAttributeWithName(name, item: nextItem)
+ return v2LookupAttributeWithName(name, item: nextItem)
}
return nil
}
+
+ func v2AccessibilityAction(kind: AccessibilityActionKind, type: T.Type, call: String) throws -> T {
+ return try v2AccessibilityAction(type: type, call: call, trait: { handler in
+ try Inspector.attribute(path: "box|action|kind", value: handler, type: AccessibilityActionKind.self)
+ .isEqual(to: kind)
+ })
+ }
+ func v2AccessibilityAction(name: String, type: T.Type, call: String) throws -> T {
+ return try v2AccessibilityAction(type: type, call: call, trait: { handler in
+ let actionName = try Inspector.attribute(path: "box|action", value: handler)
+ return name == String(describing: actionName)
+ })
+ }
- func accessibilityAction(name: String, path: String, type: T.Type, call: String) throws -> T {
- let actionHandlers = try accessibilityElement(
+ func v2AccessibilityAction(type: T.Type, call: String, trait: (Any) throws -> Bool) throws -> T {
+ let actionHandlers = try v2AccessibilityElement(
"ActionsKey", path: "value",
type: [Any].self, call: call)
- guard let handler = actionHandlers.first(where: { handler -> Bool in
- guard let actionName = try? Inspector.attribute(path: path, value: handler)
- else { return false }
- return name == String(describing: actionName)
- }), let callback = try? Inspector.attribute(path: "box|handler", value: handler) as? T
+ guard let handler = actionHandlers.first(where: { (try? trait($0)) == true }),
+ let callback = try? Inspector.attribute(path: "box|handler", value: handler) as? T
else {
throw InspectionError.modifierNotFound(parent:
Inspector.typeName(value: content.view), modifier: call, index: 0)
diff --git a/Sources/ViewInspector/Modifiers/EnvironmentModifiers.swift b/Sources/ViewInspector/Modifiers/EnvironmentModifiers.swift
index b10b2796..1bbedfae 100644
--- a/Sources/ViewInspector/Modifiers/EnvironmentModifiers.swift
+++ b/Sources/ViewInspector/Modifiers/EnvironmentModifiers.swift
@@ -13,6 +13,11 @@ public extension InspectableView {
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
internal extension InspectableView {
func environment(_ reference: WritableKeyPath, call: String) throws -> T {
+ return try environment(reference, call: call, valueType: T.self)
+ }
+
+ func environment(_ reference: WritableKeyPath,
+ call: String, valueType: V.Type) throws -> V {
guard let modifier = content.medium.environmentModifiers.last(where: { modifier in
guard let keyPath = try? modifier.keyPath() as? WritableKeyPath
else { return false }
@@ -21,7 +26,7 @@ internal extension InspectableView {
throw InspectionError.modifierNotFound(
parent: Inspector.typeName(value: content.view), modifier: call, index: 0)
}
- return try Inspector.cast(value: try modifier.value(), type: T.self)
+ return try Inspector.cast(value: try modifier.value(), type: V.self)
}
}
@@ -33,8 +38,27 @@ internal extension Inspector {
}
}
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+internal protocol EnvironmentModifier {
+ static func qualifiesAsEnvironmentModifier() -> Bool
+ func keyPath() throws -> Any
+ func value() throws -> Any
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+extension EnvironmentModifier {
+ func qualifiesAsEnvironmentModifier() -> Bool {
+ return Self.qualifiesAsEnvironmentModifier()
+ }
+}
+
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
extension ModifiedContent: EnvironmentModifier where Modifier: EnvironmentModifier {
+
+ static func qualifiesAsEnvironmentModifier() -> Bool {
+ return Modifier.qualifiesAsEnvironmentModifier()
+ }
+
func keyPath() throws -> Any {
return try Inspector.attribute(label: "modifier", value: self,
type: Modifier.self).keyPath()
@@ -47,19 +71,39 @@ extension ModifiedContent: EnvironmentModifier where Modifier: EnvironmentModifi
}
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-internal protocol EnvironmentModifier {
- func keyPath() throws -> Any
- func value() throws -> Any
+extension _EnvironmentKeyWritingModifier: EnvironmentModifier {
+
+ static func qualifiesAsEnvironmentModifier() -> Bool {
+ return true
+ }
+
+ func keyPath() throws -> Any {
+ return try Inspector.attribute(label: "keyPath", value: self)
+ }
+
+ func value() throws -> Any {
+ return try Inspector.attribute(label: "value", value: self)
+ }
}
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-extension _EnvironmentKeyWritingModifier: EnvironmentModifier {
+extension _EnvironmentKeyTransformModifier: EnvironmentModifier {
+
+ static func qualifiesAsEnvironmentModifier() -> Bool {
+ #if !os(macOS) && !targetEnvironment(macCatalyst)
+ if #available(iOS 15.0, tvOS 15.0, watchOS 8.0, *),
+ Value.self == TextInputAutocapitalization.self {
+ return true
+ }
+ #endif
+ return false
+ }
func keyPath() throws -> Any {
return try Inspector.attribute(label: "keyPath", value: self)
}
func value() throws -> Any {
- return try Inspector.attribute(label: "value", value: self)
+ return try Inspector.attribute(label: "transform", value: self)
}
}
diff --git a/Sources/ViewInspector/Modifiers/SizingModifiers.swift b/Sources/ViewInspector/Modifiers/SizingModifiers.swift
index 2206546a..3039d1cd 100644
--- a/Sources/ViewInspector/Modifiers/SizingModifiers.swift
+++ b/Sources/ViewInspector/Modifiers/SizingModifiers.swift
@@ -75,78 +75,60 @@ public extension InspectableView {
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
public extension InspectableView {
- private struct PaddingAttributes {
- let edgeInsets: EdgeInsets?
- let edges: Edge.Set
- }
-
func padding() throws -> EdgeInsets {
- return try modifierAttribute(
- modifierName: "_PaddingLayout", path: "modifier|insets",
- type: EdgeInsets.self, call: "padding")
- }
-
- func padding(_ edge: Edge.Set) throws -> CGFloat {
- let attributes = try self.paddingAttributes()
- for attribute in attributes {
- if attribute.edges.contains(edge) {
- if let value = edgeValue(attribute: attribute, edge: edge) {
- return value
- }
- }
+ let attr = paddingAttributes()
+ guard attr.count > 0 else {
+ throw noPaddingModifierError()
}
- throw InspectionError.modifierNotFound(
- parent: Inspector.typeName(value: self), modifier: "padding", index: 0)
- }
-
- func hasPadding(_ edge: Edge.Set = .all) throws -> Bool {
- let attributes = try self.paddingAttributes()
- for attribute in attributes {
- if attribute.edges.contains(edge) {
- return true
+ do {
+ return .init(top: try attr.cumulativeValue(edge: .top) ?? 0,
+ leading: try attr.cumulativeValue(edge: .leading) ?? 0,
+ bottom: try attr.cumulativeValue(edge: .bottom) ?? 0,
+ trailing: try attr.cumulativeValue(edge: .trailing) ?? 0)
+ } catch let error {
+ if attr.allSatisfy({ $0.edges == .all }) {
+ throw InspectionError.notSupported(
+ "Please use `hasPadding(_:)` for inspecting padding without explicit value.")
}
+ throw error
}
- return false
}
- private func edgeValue(attribute: PaddingAttributes, edge: Edge.Set) -> CGFloat? {
- guard let edgeInsets = attribute.edgeInsets else {
- return nil
- }
- var result = [CGFloat]()
- if edge.contains(.top) {
- result.append(edgeInsets.top)
- }
- if edge.contains(.bottom) {
- result.append(edgeInsets.bottom)
- }
- if edge.contains(.trailing) {
- result.append(edgeInsets.trailing)
+ func padding(_ edge: Edge.Set) throws -> CGFloat {
+ let attr = paddingAttributes()
+ let edges = edge.individualEdges
+ guard edges.count > 0 else {
+ throw InspectionError.notSupported("No edge is specified")
}
- if edge.contains(.leading) {
- result.append(edgeInsets.leading)
+ let values = try edges.map { singleEdge -> CGFloat in
+ guard let value = try attr.cumulativeValue(edge: singleEdge.edgeSet) else {
+ throw noPaddingModifierError()
+ }
+ return value
}
- if hasSingleValue(result) {
- return result[0]
+ guard values.areAllEqual() else {
+ throw InspectionError.notSupported(
+ """
+ Insets for edges '\(edges)' have different values, \
+ consider calling `padding` individually per edge.
+ """
+ )
}
- return nil
+ return values[0]
}
- private func hasSingleValue(_ array: [CGFloat]) -> Bool {
- if array.count == 0 {
- return false
- }
- return array.dropLast().allSatisfy { $0 == array.last }
+ func hasPadding(_ edge: Edge.Set = .all) -> Bool {
+ return paddingAttributes().contains(where: { $0.edges.contains(edge) })
}
- private func paddingAttributes() throws -> [PaddingAttributes] {
-
- return try modifiersMatching({ $0.modifierType.contains("_PaddingLayout") })
+ private func paddingAttributes() -> [Inspector.PaddingAttributes] {
+ return modifiersMatching({ $0.modifierType.contains("_PaddingLayout") })
.enumerated()
- .map { index, modifier -> PaddingAttributes in
- let edges = try modifierAttribute(
+ .compactMap { index, modifier -> Inspector.PaddingAttributes? in
+ guard let edges = try? modifierAttribute(
modifierName: "_PaddingLayout", path: "modifier|edges",
type: SwiftUI.Edge.Set.self, call: "padding", index: index)
+ else { return nil }
let insets: EdgeInsets?
do {
insets = try modifierAttribute(
@@ -158,4 +140,82 @@ public extension InspectableView {
return .init(edgeInsets: insets, edges: edges)
}
}
+
+ private func noPaddingModifierError() -> Error {
+ return InspectionError.modifierNotFound(
+ parent: Inspector.typeName(value: content.view),
+ modifier: "padding", index: 0)
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+private extension Inspector {
+ struct PaddingAttributes {
+ let edgeInsets: EdgeInsets?
+ let edges: Edge.Set
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+private extension Edge.Set {
+ var individualEdges: [Edge] {
+ return [Edge.top, .bottom, .leading, .trailing]
+ .filter { contains($0.edgeSet) }
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+private extension Edge {
+ var edgeSet: Edge.Set {
+ switch self {
+ case .top: return .top
+ case .bottom: return .bottom
+ case .leading: return .leading
+ case .trailing: return .trailing
+ }
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+private extension RandomAccessCollection where Element == Inspector.PaddingAttributes {
+ func cumulativeValue(edge: Edge.Set) throws -> CGFloat? {
+ let undefinedInsetError: (Edge) -> Error = { edge in
+ return InspectionError.notSupported(
+ """
+ Undefined inset for '\(edge)' edge. Consider calling `hasPadding(_:)` \
+ instead to assure a default padding is applied.
+ """)
+ }
+ let insets = try compactMap { attr -> CGFloat? in
+ if edge == .top, attr.edges.contains(.top) {
+ guard let insets = attr.edgeInsets
+ else { throw undefinedInsetError(.top) }
+ return insets.top
+ }
+ if edge == .bottom, attr.edges.contains(.bottom) {
+ guard let insets = attr.edgeInsets
+ else { throw undefinedInsetError(.bottom) }
+ return insets.bottom
+ }
+ if edge == .trailing, attr.edges.contains(.trailing) {
+ guard let insets = attr.edgeInsets
+ else { throw undefinedInsetError(.trailing) }
+ return insets.trailing
+ }
+ if edge == .leading, attr.edges.contains(.leading) {
+ guard let insets = attr.edgeInsets
+ else { throw undefinedInsetError(.leading) }
+ return insets.leading
+ }
+ return nil
+ }
+ return insets.count == 0 ? nil : insets.reduce(0, +)
+ }
+}
+
+private extension RandomAccessCollection where Element: Equatable {
+ func areAllEqual() -> Bool {
+ guard let first = self.first else { return true }
+ return !contains(where: { $0 != first })
+ }
}
diff --git a/Sources/ViewInspector/Modifiers/TextInputModifiers.swift b/Sources/ViewInspector/Modifiers/TextInputModifiers.swift
index 2c4b6188..504afd67 100644
--- a/Sources/ViewInspector/Modifiers/TextInputModifiers.swift
+++ b/Sources/ViewInspector/Modifiers/TextInputModifiers.swift
@@ -2,19 +2,17 @@ import SwiftUI
// MARK: - Adjusting Text in a View
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public extension InspectableView {
- #if !os(macOS)
+ #if (os(iOS) || os(tvOS)) && !targetEnvironment(macCatalyst)
func textContentType() throws -> UITextContentType? {
let reference = EmptyView().textContentType(.emailAddress)
let keyPath = try Inspector.environmentKeyPath(Optional.self, reference)
let value = try environment(keyPath, call: "textContentType")
return value.flatMap { UITextContentType(rawValue: $0) }
}
- #endif
-
- #if os(iOS) || os(tvOS)
+
func keyboardType() throws -> UIKeyboardType {
let reference = EmptyView().keyboardType(.default)
let keyPath = try Inspector.environmentKeyPath(Int.self, reference)
@@ -24,6 +22,21 @@ public extension InspectableView {
func autocapitalization() throws -> UITextAutocapitalizationType {
let reference = EmptyView().autocapitalization(.none)
+ if #available(iOS 15.0, tvOS 15.0, watchOS 8.0, *) {
+ typealias Closure = (inout TextInputAutocapitalization) -> Void
+ if let keyPath = try? Inspector
+ .environmentKeyPath(TextInputAutocapitalization.self, reference) {
+ let closure = try environment(keyPath, call: "autocapitalization", valueType: Closure.self)
+ var value = TextInputAutocapitalization.never
+ closure(&value)
+ let behavior = try Inspector.attribute(label: "behavior", value: value)
+ let stringValue = String(describing: behavior)
+ guard let style = TextInputAutocapitalization.Behavior(rawValue: stringValue) else {
+ throw InspectionError.notSupported("Unknown TextInputAutocapitalization.Behavior: \(stringValue)")
+ }
+ return style.autocapitalizationType
+ }
+ }
let keyPath = try Inspector.environmentKeyPath(Int.self, reference)
let value = try environment(keyPath, call: "autocapitalization")
return UITextAutocapitalizationType(rawValue: value)!
@@ -91,6 +104,7 @@ public extension InspectableView {
return false
}
+ #if !os(watchOS)
func disableAutocorrection() -> Bool {
let reference = EmptyView().disableAutocorrection(false)
if let keyPath = try? Inspector.environmentKeyPath(Optional.self, reference),
@@ -99,6 +113,7 @@ public extension InspectableView {
}
return false
}
+ #endif
func flipsForRightToLeftLayoutDirection() -> Bool {
return modifiersMatching({ $0.modifierType == "_FlipForRTLEffect" },
@@ -109,3 +124,21 @@ public extension InspectableView {
.contains(true)
}
}
+
+#if (os(iOS) || os(tvOS)) && !targetEnvironment(macCatalyst)
+@available(iOS 15.0, tvOS 15.0, watchOS 8.0, *)
+extension TextInputAutocapitalization {
+ enum Behavior: String {
+ case never, words, sentences, characters
+
+ var autocapitalizationType: UITextAutocapitalizationType {
+ switch self {
+ case .never: return .none
+ case .words: return .words
+ case .sentences: return .sentences
+ case .characters: return .allCharacters
+ }
+ }
+ }
+}
+#endif
diff --git a/Sources/ViewInspector/Modifiers/VisualEffectModifiers.swift b/Sources/ViewInspector/Modifiers/VisualEffectModifiers.swift
index 7a9113f2..46c76d0a 100644
--- a/Sources/ViewInspector/Modifiers/VisualEffectModifiers.swift
+++ b/Sources/ViewInspector/Modifiers/VisualEffectModifiers.swift
@@ -127,20 +127,22 @@ public extension InspectableView {
return shape.cornerSize.width
}
- func mask() throws -> InspectableView {
- return try contentForModifierLookup.mask(parent: self)
+ func mask(_ index: Int? = nil) throws -> InspectableView {
+ return try contentForModifierLookup.mask(parent: self, index: index)
}
}
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
internal extension Content {
- func mask(parent: UnwrappedView) throws -> InspectableView {
+ func mask(parent: UnwrappedView, index: Int?) throws -> InspectableView {
let rootView = try modifierAttribute(
modifierName: "_MaskEffect", path: "modifier|mask",
- type: Any.self, call: "mask")
+ type: Any.self, call: "mask", index: index ?? 0)
let medium = self.medium.resettingViewModifiers()
+ let call = ViewType.inspectionCall(
+ base: "mask(\(ViewType.indexPlaceholder))", index: index)
return try .init(try Inspector.unwrap(content: Content(rootView, medium: medium)),
- parent: parent, call: "mask()")
+ parent: parent, call: call, index: index)
}
}
diff --git a/Sources/ViewInspector/PopupPresenter.swift b/Sources/ViewInspector/PopupPresenter.swift
new file mode 100644
index 00000000..c702457e
--- /dev/null
+++ b/Sources/ViewInspector/PopupPresenter.swift
@@ -0,0 +1,192 @@
+import SwiftUI
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public protocol BasePopupPresenter {
+ func buildPopup() throws -> Any
+ func dismissPopup()
+ func content() throws -> ViewInspector.Content
+ var isAlertPresenter: Bool { get }
+ var isActionSheetPresenter: Bool { get }
+ var isPopoverPresenter: Bool { get }
+ var isSheetPresenter: Bool { get }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public protocol PopupPresenter: BasePopupPresenter {
+ associatedtype Popup
+ var isPresented: Binding { get }
+ var popupBuilder: () -> Popup { get }
+ var onDismiss: (() -> Void)? { get }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public protocol ItemPopupPresenter: BasePopupPresenter {
+ associatedtype Popup
+ associatedtype Item: Identifiable
+ var item: Binding- { get }
+ var popupBuilder: (Item) -> Popup { get }
+ var onDismiss: (() -> Void)? { get }
+}
+
+// MARK: - Extensions
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+extension BasePopupPresenter {
+ func subject(_ type: T.Type) -> String {
+ if isPopoverPresenter { return "Popover" }
+ if isSheetPresenter { return "Sheet" }
+ return Inspector.typeName(type: T.self)
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension PopupPresenter {
+ func buildPopup() throws -> Any {
+ guard isPresented.wrappedValue else {
+ throw InspectionError.viewNotFound(parent: subject(Popup.self))
+ }
+ return popupBuilder()
+ }
+
+ func dismissPopup() {
+ isPresented.wrappedValue = false
+ onDismiss?()
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension ItemPopupPresenter {
+ func buildPopup() throws -> Any {
+ guard let value = item.wrappedValue else {
+ throw InspectionError.viewNotFound(parent: subject(Popup.self))
+ }
+ return popupBuilder(value)
+ }
+
+ func dismissPopup() {
+ item.wrappedValue = nil
+ onDismiss?()
+ }
+}
+
+// MARK: - Alert
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension PopupPresenter where Popup == Alert {
+ var isAlertPresenter: Bool { true }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension ItemPopupPresenter where Popup == Alert {
+ var isAlertPresenter: Bool { true }
+}
+
+// MARK: - ActionSheet
+
+@available(iOS 13.0, tvOS 13.0, *)
+@available(macOS, unavailable)
+public extension PopupPresenter where Popup == ActionSheet {
+ var isActionSheetPresenter: Bool { true }
+}
+
+@available(iOS 13.0, tvOS 13.0, *)
+@available(macOS, unavailable)
+public extension ItemPopupPresenter where Popup == ActionSheet {
+ var isActionSheetPresenter: Bool { true }
+}
+
+// MARK: - Popover, Sheet & FullScreenCover
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension ViewModifier where Self: BasePopupPresenter {
+ func content() throws -> ViewInspector.Content {
+ let view = body(content: _ViewModifier_Content())
+ return try view.inspect().viewModifierContent().content
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension ViewModifier where Self: PopupPresenter {
+ var isPopoverPresenter: Bool {
+ return (try? content().standardPopoverModifier()) != nil
+ }
+ var isSheetPresenter: Bool {
+ return (try? content().standardSheetModifier()) != nil
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension ViewModifier where Self: ItemPopupPresenter {
+ var isPopoverPresenter: Bool {
+ return (try? content().standardPopoverModifier()) != nil
+ }
+ var isSheetPresenter: Bool {
+ return (try? content().standardSheetModifier()) != nil
+ }
+}
+
+// MARK: - Default
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension BasePopupPresenter {
+ var isAlertPresenter: Bool { false }
+ var isActionSheetPresenter: Bool { false }
+ var isPopoverPresenter: Bool { false }
+ var isSheetPresenter: Bool { false }
+}
+
+// MARK: - PopupContainer
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+internal extension ViewType {
+ struct PopupContainer: CustomViewIdentityMapping {
+ let popup: Any
+ let presenter: BasePopupPresenter
+ var viewTypeForSearch: KnownViewType.Type { Popup.self }
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+internal extension ViewType.PopupContainer {
+ static var typePrefix: String {
+ "ViewInspector.ViewType.PopupContainer"
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+internal extension Content {
+ func popup(
+ parent: UnwrappedView, index: Int?,
+ name: String = Inspector.typeName(type: Popup.self),
+ modifierPredicate: ModifierLookupClosure,
+ standardPredicate: (String) throws -> Any
+ ) throws -> InspectableView {
+ guard let popupPresenter = try? self.modifierAttribute(
+ modifierLookup: modifierPredicate, path: "modifier",
+ type: BasePopupPresenter.self, call: "", index: index ?? 0)
+ else {
+ _ = try standardPredicate(name)
+ throw InspectionError.notSupported(
+ """
+ Please refer to the Guide for inspecting the \(name): \
+ https://github.com/nalexn/ViewInspector/blob/master/guide_popups.md#\(name.lowercased())
+ """)
+ }
+ let popup: Any = try {
+ do {
+ return try popupPresenter.buildPopup()
+ } catch {
+ if case InspectionError.viewNotFound = error {
+ throw InspectionError.viewNotFound(parent: name)
+ }
+ throw error
+ }
+ }()
+ let container = ViewType.PopupContainer(popup: popup, presenter: popupPresenter)
+ let medium = self.medium.resettingViewModifiers()
+ let content = Content(container, medium: medium)
+ let call = ViewType.inspectionCall(
+ base: Popup.inspectionCall(typeName: name), index: index)
+ return try .init(content, parent: parent, call: call, index: index)
+ }
+}
diff --git a/Sources/ViewInspector/SwiftUI/ActionSheet.swift b/Sources/ViewInspector/SwiftUI/ActionSheet.swift
index b6b4bfe3..9ff0bafc 100644
--- a/Sources/ViewInspector/SwiftUI/ActionSheet.swift
+++ b/Sources/ViewInspector/SwiftUI/ActionSheet.swift
@@ -6,10 +6,8 @@ import SwiftUI
public extension ViewType {
struct ActionSheet: KnownViewType {
- public static var typePrefix: String = "ViewType.ActionSheet.Container"
- public static var namespacedPrefixes: [String] {
- return ["ViewInspector." + typePrefix]
- }
+ public static var typePrefix: String = ViewType.PopupContainer.typePrefix
+ public static var namespacedPrefixes: [String] { [typePrefix] }
public static func inspectionCall(typeName: String) -> String {
return "actionSheet(\(ViewType.indexPlaceholder))"
}
@@ -32,32 +30,21 @@ public extension InspectableView {
internal extension Content {
func actionSheet(parent: UnwrappedView, index: Int?) throws -> InspectableView {
- guard let sheetBuilder = try? self.modifierAttribute(
- modifierLookup: { isActionSheetBuilder(modifier: $0) }, path: "modifier",
- type: ActionSheetBuilder.self, call: "", index: index ?? 0)
- else {
- _ = try self.modifier({
- $0.modifierType == "IdentifiedPreferenceTransformModifier"
- || $0.modifierType.contains("AlertTransformModifier")
- }, call: "actionSheet")
- throw InspectionError.notSupported(
- """
- Please refer to the Guide for inspecting the ActionSheet: \
- https://github.com/nalexn/ViewInspector/blob/master/guide.md#actionsheet
- """)
- }
- let sheet = try sheetBuilder.buildSheet()
- let container = ViewType.ActionSheet.Container(sheet: sheet, builder: sheetBuilder)
- let medium = self.medium.resettingViewModifiers()
- let content = Content(container, medium: medium)
- let call = ViewType.inspectionCall(
- base: ViewType.ActionSheet.inspectionCall(typeName: ""), index: index)
- return try .init(content, parent: parent, call: call, index: index)
+ return try popup(parent: parent, index: index,
+ modifierPredicate: isActionSheetBuilder(modifier:),
+ standardPredicate: standardActionSheetModifier)
+ }
+
+ func standardActionSheetModifier(_ name: String = "ActionSheet") throws -> Any {
+ return try self.modifier({
+ $0.modifierType == "IdentifiedPreferenceTransformModifier"
+ || $0.modifierType.contains("AlertTransformModifier")
+ }, call: name.firstLetterLowercased)
}
func actionSheetsForSearch() -> [ViewSearch.ModifierIdentity] {
let count = medium.viewModifiers
- .compactMap { isActionSheetBuilder(modifier: $0) }
+ .filter(isActionSheetBuilder(modifier:))
.count
return Array(0.. Bool {
- return (try? Inspector.attribute(
- label: "modifier", value: modifier, type: ActionSheetBuilder.self)) != nil
- }
-}
-
-@available(iOS 13.0, tvOS 13.0, *)
-@available(macOS, unavailable)
-internal extension ViewType.ActionSheet {
- struct Container: CustomViewIdentityMapping {
- let sheet: SwiftUI.ActionSheet
- let builder: ActionSheetBuilder
-
- var viewTypeForSearch: KnownViewType.Type { ViewType.ActionSheet.self }
+ let modifier = try? Inspector.attribute(
+ label: "modifier", value: modifier, type: BasePopupPresenter.self)
+ return modifier?.isActionSheetPresenter == true
}
}
@@ -106,6 +83,12 @@ public extension InspectableView where View == ViewType.ActionSheet {
return try allViews.element(at: index + 2)
.asInspectableView(ofType: ViewType.AlertButton.self)
}
+
+ func dismiss() throws {
+ let container = try Inspector.cast(
+ value: content.view, type: ViewType.PopupContainer.self)
+ container.presenter.dismissPopup()
+ }
}
// MARK: - Non Standard Children
@@ -114,18 +97,18 @@ public extension InspectableView where View == ViewType.ActionSheet {
extension ViewType.ActionSheet: SupplementaryChildren {
static func supplementaryChildren(_ parent: UnwrappedView) throws -> LazyGroup {
let buttons = try Inspector.attribute(
- path: "sheet|buttons", value: parent.content.view, type: [Any].self)
+ path: "popup|buttons", value: parent.content.view, type: [Any].self)
return .init(count: 2 + buttons.count) { index in
let medium = parent.content.medium.resettingViewModifiers()
switch index {
case 0:
- let view = try Inspector.attribute(path: "sheet|title", value: parent.content.view)
+ let view = try Inspector.attribute(path: "popup|title", value: parent.content.view)
let content = try Inspector.unwrap(content: Content(view, medium: medium))
return try InspectableView(
content, parent: parent, call: "title()")
case 1:
let maybeView = try Inspector.attribute(
- path: "sheet|message", value: parent.content.view, type: Text?.self)
+ path: "popup|message", value: parent.content.view, type: Text?.self)
guard let view = maybeView else {
throw InspectionError.viewNotFound(parent: "message")
}
@@ -145,56 +128,3 @@ extension ViewType.ActionSheet: SupplementaryChildren {
}
}
}
-
-// MARK: - ActionSheet inspection protocols
-
-@available(iOS 13.0, tvOS 13.0, *)
-@available(macOS, unavailable)
-public protocol ActionSheetBuilder: SystemPopupPresenter {
- func buildSheet() throws -> ActionSheet
-}
-
-@available(iOS 13.0, tvOS 13.0, *)
-@available(macOS, unavailable)
-public protocol ActionSheetProvider: ActionSheetBuilder {
- var isPresented: Binding { get }
- var sheetBuilder: () -> ActionSheet { get }
-}
-
-@available(iOS 13.0, tvOS 13.0, *)
-@available(macOS, unavailable)
-public protocol ActionSheetItemProvider: ActionSheetBuilder {
- associatedtype Item: Identifiable
- var item: Binding
- { get }
- var sheetBuilder: (Item) -> ActionSheet { get }
-}
-
-@available(iOS 13.0, tvOS 13.0, *)
-@available(macOS, unavailable)
-public extension ActionSheetProvider {
- func buildSheet() throws -> ActionSheet {
- guard isPresented.wrappedValue else {
- throw InspectionError.viewNotFound(parent: "ActionSheet")
- }
- return sheetBuilder()
- }
-
- func dismissPopup() {
- isPresented.wrappedValue = false
- }
-}
-
-@available(iOS 13.0, tvOS 13.0, *)
-@available(macOS, unavailable)
-public extension ActionSheetItemProvider {
- func buildSheet() throws -> ActionSheet {
- guard let value = item.wrappedValue else {
- throw InspectionError.viewNotFound(parent: "ActionSheet")
- }
- return sheetBuilder(value)
- }
-
- func dismissPopup() {
- item.wrappedValue = nil
- }
-}
diff --git a/Sources/ViewInspector/SwiftUI/Alert.swift b/Sources/ViewInspector/SwiftUI/Alert.swift
index d7822222..61141225 100644
--- a/Sources/ViewInspector/SwiftUI/Alert.swift
+++ b/Sources/ViewInspector/SwiftUI/Alert.swift
@@ -6,9 +6,10 @@ import SwiftUI
public extension ViewType {
struct Alert: KnownViewType {
- public static var typePrefix: String = "ViewType.Alert.Container"
+ public static var typePrefix: String = ViewType.PopupContainer.typePrefix
+ static var typePrefixIOS15: String = "AlertModifier"
public static var namespacedPrefixes: [String] {
- return ["ViewInspector." + typePrefix]
+ [typePrefix, "SwiftUI." + typePrefixIOS15]
}
public static func inspectionCall(typeName: String) -> String {
return "alert(\(ViewType.indexPlaceholder))"
@@ -30,32 +31,33 @@ public extension InspectableView {
internal extension Content {
func alert(parent: UnwrappedView, index: Int?) throws -> InspectableView {
- guard let alertBuilder = try? self.modifierAttribute(
- modifierLookup: { isAlertBuilder(modifier: $0) }, path: "modifier",
- type: AlertBuilder.self, call: "", index: index ?? 0)
- else {
- _ = try self.modifier({
- $0.modifierType == "IdentifiedPreferenceTransformModifier"
- || $0.modifierType.contains("AlertTransformModifier")
- }, call: "alert")
- throw InspectionError.notSupported(
- """
- Please refer to the Guide for inspecting the Alert: \
- https://github.com/nalexn/ViewInspector/blob/master/guide.md#alert-sheet-and-actionsheet
- """)
+ do {
+ return try popup(parent: parent, index: index,
+ modifierPredicate: isDeprecatedAlertPresenter(modifier:),
+ standardPredicate: deprecatedStandardAlertModifier)
+ } catch {
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *),
+ let alert = try? alertIOS15(parent: parent, index: index) {
+ return alert
+ } else {
+ throw error
+ }
}
- let alert = try alertBuilder.buildAlert()
- let container = ViewType.Alert.Container(alert: alert, builder: alertBuilder)
- let medium = self.medium.resettingViewModifiers()
- let content = Content(container, medium: medium)
- let call = ViewType.inspectionCall(
- base: ViewType.Alert.inspectionCall(typeName: ""), index: index)
- return try .init(content, parent: parent, call: call, index: index)
+ }
+
+ private func deprecatedStandardAlertModifier(_ name: String = "Alert") throws -> Any {
+ return try self.modifier({
+ $0.modifierType == "IdentifiedPreferenceTransformModifier"
+ || $0.modifierType.contains("AlertTransformModifier")
+ }, call: name.firstLetterLowercased)
}
func alertsForSearch() -> [ViewSearch.ModifierIdentity] {
let count = medium.viewModifiers
- .compactMap { isAlertBuilder(modifier: $0) }
+ .filter { modifier in
+ isDeprecatedAlertPresenter(modifier: modifier)
+ || isAlertIOS15(modifier: modifier)
+ }
.count
return Array(0.. Bool {
- return (try? Inspector.attribute(
- label: "modifier", value: modifier, type: AlertBuilder.self)) != nil
+ private func isDeprecatedAlertPresenter(modifier: Any) -> Bool {
+ let modifier = try? Inspector.attribute(
+ label: "modifier", value: modifier, type: BasePopupPresenter.self)
+ return modifier?.isAlertPresenter == true
}
-}
-
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-internal extension ViewType.Alert {
- struct Container: CustomViewIdentityMapping {
- let alert: SwiftUI.Alert
- let builder: AlertBuilder
-
- var viewTypeForSearch: KnownViewType.Type { ViewType.Alert.self }
+
+ // MARK: - iOS 15
+
+ var isIOS15Modifier: Bool {
+ let type = ViewType.PopupContainer.self
+ return (try? Inspector.cast(value: view, type: type)) == nil
+ }
+
+ @available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
+ func alertIOS15(parent: UnwrappedView, index: Int?) throws -> InspectableView {
+ let modifier = try self.modifierAttribute(
+ modifierLookup: isAlertIOS15(modifier:), path: "modifier",
+ type: Any.self, call: "alert", index: index ?? 0)
+ let medium = self.medium.resettingViewModifiers()
+ let content = Content(modifier, medium: medium)
+ let call = ViewType.inspectionCall(
+ base: ViewType.Alert.inspectionCall(typeName: ""), index: index)
+ let view = try InspectableView(
+ content, parent: parent, call: call, index: index)
+ guard try view.isPresentedBinding().wrappedValue else {
+ throw InspectionError.viewNotFound(parent: "Alert")
+ }
+ return view
+ }
+
+ private func isAlertIOS15(modifier: Any) -> Bool {
+ guard let modifier = modifier as? ModifierNameProvider
+ else { return false }
+ return modifier.modifierType.contains(ViewType.Alert.typePrefixIOS15)
}
}
@@ -90,9 +113,9 @@ public extension InspectableView where View == ViewType.Alert {
.asInspectableView(ofType: ViewType.Text.self)
}
- func message() throws -> InspectableView {
+ func message() throws -> InspectableView {
return try View.supplementaryChildren(self).element(at: 1)
- .asInspectableView(ofType: ViewType.Text.self)
+ .asInspectableView(ofType: ViewType.ClassifiedView.self)
}
func primaryButton() throws -> InspectableView {
@@ -104,6 +127,30 @@ public extension InspectableView where View == ViewType.Alert {
return try View.supplementaryChildren(self).element(at: 3)
.asInspectableView(ofType: ViewType.AlertButton.self)
}
+
+ func dismiss() throws {
+ do {
+ let container = try Inspector.cast(
+ value: content.view, type: ViewType.PopupContainer.self)
+ container.presenter.dismissPopup()
+ } catch {
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *),
+ let binding = try? isPresentedBinding() {
+ binding.wrappedValue = false
+ } else {
+ throw error
+ }
+ }
+ }
+}
+
+@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
+public extension InspectableView where View == ViewType.Alert {
+
+ func actions() throws -> InspectableView {
+ return try View.supplementaryChildren(self).element(at: 2)
+ .asInspectableView(ofType: ViewType.ClassifiedView.self)
+ }
}
// MARK: - Non Standard Children
@@ -111,31 +158,43 @@ public extension InspectableView where View == ViewType.Alert {
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
extension ViewType.Alert: SupplementaryChildren {
static func supplementaryChildren(_ parent: UnwrappedView) throws -> LazyGroup {
- return .init(count: 4) { index in
+ let iOS15Modifier = parent.content.isIOS15Modifier
+ return .init(count: iOS15Modifier ? 3 : 4) { index in
let medium = parent.content.medium.resettingViewModifiers()
switch index {
case 0:
- let view = try Inspector.attribute(path: "alert|title", value: parent.content.view)
+ let path = iOS15Modifier ? "title" : "popup|title"
+ let view = try Inspector.attribute(path: path, value: parent.content.view)
let content = try Inspector.unwrap(content: Content(view, medium: medium))
- return try InspectableView(
- content, parent: parent, call: "title()")
+ return try InspectableView(content, parent: parent, call: "title()")
case 1:
- let maybeView = try Inspector.attribute(
- path: "alert|message", value: parent.content.view, type: Text?.self)
- guard let view = maybeView else {
- throw InspectionError.viewNotFound(parent: "message")
+ let path = iOS15Modifier ? "message" : "popup|message"
+ do {
+ let view = try Inspector.attribute(path: path, value: parent.content.view)
+ let content = try Inspector.unwrap(content: Content(view, medium: medium))
+ return try InspectableView(
+ content, parent: parent, call: "message()")
+ } catch {
+ if let inspError = error as? InspectionError,
+ case .viewNotFound = inspError {
+ throw InspectionError.viewNotFound(parent: "message")
+ }
+ throw error
}
- let content = try Inspector.unwrap(content: Content(view, medium: medium))
- return try InspectableView(
- content, parent: parent, call: "message()")
case 2:
- let view = try Inspector.attribute(path: "alert|primaryButton", value: parent.content.view)
+ if iOS15Modifier {
+ let view = try Inspector.attribute(path: "actions", value: parent.content.view)
+ let content = try Inspector.unwrap(content: Content(view, medium: medium))
+ return try InspectableView(
+ content, parent: parent, call: "actions()")
+ }
+ let view = try Inspector.attribute(path: "popup|primaryButton", value: parent.content.view)
let content = try Inspector.unwrap(content: Content(view, medium: medium))
return try InspectableView(
content, parent: parent, call: "primaryButton()")
default:
let maybeView = try Inspector.attribute(
- path: "alert|secondaryButton", value: parent.content.view, type: Alert.Button?.self)
+ path: "popup|secondaryButton", value: parent.content.view, type: Alert.Button?.self)
guard let view = maybeView else {
throw InspectionError.viewNotFound(parent: "secondaryButton")
}
@@ -205,8 +264,8 @@ public extension InspectableView where View == ViewType.AlertButton {
func tap() throws {
guard let container = self.parentView?.content.view,
let presenter = try? Inspector.attribute(
- label: "builder", value: container,
- type: SystemPopupPresenter.self)
+ label: "presenter", value: container,
+ type: BasePopupPresenter.self)
else { throw InspectionError.parentViewNotFound(view: "Alert.Button") }
presenter.dismissPopup()
typealias Callback = () -> Void
@@ -216,55 +275,10 @@ public extension InspectableView where View == ViewType.AlertButton {
}
}
-// MARK: - Alert inspection protocols
-
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-public protocol SystemPopupPresenter {
- func dismissPopup()
-}
-
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-public protocol AlertBuilder: SystemPopupPresenter {
- func buildAlert() throws -> Alert
-}
-
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-public protocol AlertProvider: AlertBuilder {
- var isPresented: Binding { get }
- var alertBuilder: () -> Alert { get }
-}
-
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-public protocol AlertItemProvider: AlertBuilder {
- associatedtype Item: Identifiable
- var item: Binding
- { get }
- var alertBuilder: (Item) -> Alert { get }
-}
-
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-public extension AlertProvider {
- func buildAlert() throws -> Alert {
- guard isPresented.wrappedValue else {
- throw InspectionError.viewNotFound(parent: "Alert")
- }
- return alertBuilder()
- }
-
- func dismissPopup() {
- isPresented.wrappedValue = false
- }
-}
-
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
-public extension AlertItemProvider {
- func buildAlert() throws -> Alert {
- guard let value = item.wrappedValue else {
- throw InspectionError.viewNotFound(parent: "Alert")
- }
- return alertBuilder(value)
- }
-
- func dismissPopup() {
- item.wrappedValue = nil
+@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
+private extension InspectableView where View == ViewType.Alert {
+ func isPresentedBinding() throws -> Binding {
+ return try Inspector.attribute(
+ label: "isPresented", value: content.view, type: Binding.self)
}
}
diff --git a/Sources/ViewInspector/SwiftUI/Button.swift b/Sources/ViewInspector/SwiftUI/Button.swift
index 8be7c1b5..f1e0714f 100644
--- a/Sources/ViewInspector/SwiftUI/Button.swift
+++ b/Sources/ViewInspector/SwiftUI/Button.swift
@@ -32,7 +32,13 @@ public extension InspectableView where View: MultipleViewContent {
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
extension ViewType.Button: SupplementaryChildrenLabelView {
- static var labelViewPath: String { "_label" }
+ static var labelViewPath: String {
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ return "label"
+ } else {
+ return "_label"
+ }
+ }
}
// MARK: - Custom Attributes
@@ -52,6 +58,14 @@ public extension InspectableView where View == ViewType.Button {
.attribute(label: "action", value: content.view, type: Callback.self)
callback()
}
+
+ #if !os(macOS) && !targetEnvironment(macCatalyst) // requires macOS SDK 12.0
+ @available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
+ func role() throws -> ButtonRole? {
+ return try Inspector.attribute(
+ label: "role", value: content.view, type: ButtonRole?.self)
+ }
+ #endif
}
// MARK: - Global View Modifiers
@@ -93,23 +107,53 @@ public extension PrimitiveButtonStyle {
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
internal extension ButtonStyleConfiguration {
- private struct Allocator {
+ private struct Allocator3 {
+ let data: (Bool, Bool, Bool)
+ init(flag: Bool) {
+ data = (false, false, flag)
+ }
+ }
+ private struct Allocator24 {
let data: (Int64, Int64, Int64)
init(flag: Bool) {
data = (flag ? -1 : 0, 0, 0)
}
}
init(isPressed: Bool) {
- self = unsafeBitCast(Allocator(flag: isPressed), to: Self.self)
+ switch MemoryLayout.size {
+ case 3:
+ self = unsafeBitCast(Allocator3(flag: isPressed), to: Self.self)
+ case 24:
+ self = unsafeBitCast(Allocator24(flag: isPressed), to: Self.self)
+ default:
+ fatalError(MemoryLayout.actualSize())
+ }
}
}
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
public extension PrimitiveButtonStyleConfiguration {
- private struct Allocator {
+ private struct Allocator16 {
+ let onTrigger: () -> Void
+ }
+ private struct Allocator24 {
+ let buffer: Int8 = 0
let onTrigger: () -> Void
}
init(onTrigger: @escaping () -> Void) {
- self = unsafeBitCast(Allocator(onTrigger: onTrigger), to: Self.self)
+ switch MemoryLayout.size {
+ case 16:
+ self = unsafeBitCast(Allocator16(onTrigger: onTrigger), to: Self.self)
+ case 24:
+ self = unsafeBitCast(Allocator24(onTrigger: onTrigger), to: Self.self)
+ default:
+ fatalError(MemoryLayout.actualSize())
+ }
+ }
+}
+
+internal extension MemoryLayout {
+ static func actualSize() -> String {
+ fatalError("New size of \(String(describing: type(of: T.self))) is \(Self.size)")
}
}
diff --git a/Sources/ViewInspector/SwiftUI/Color.swift b/Sources/ViewInspector/SwiftUI/Color.swift
index 9ee94cd2..df9d08d5 100644
--- a/Sources/ViewInspector/SwiftUI/Color.swift
+++ b/Sources/ViewInspector/SwiftUI/Color.swift
@@ -40,7 +40,7 @@ public extension InspectableView where View == ViewType.Color {
func rgba() throws -> (red: Float, green: Float, blue: Float, alpha: Float) {
let colorProvider = try Inspector.attribute(path: "provider|base", value: content.view)
let providerName = Inspector.typeName(value: colorProvider)
- if providerName == "_Resolved" {
+ if ["_Resolved", "Resolved"].contains(providerName) {
let red = try Inspector.attribute(label: "linearRed", value: colorProvider, type: Float.self)
let green = try Inspector.attribute(label: "linearGreen", value: colorProvider, type: Float.self)
let blue = try Inspector.attribute(label: "linearBlue", value: colorProvider, type: Float.self)
diff --git a/Sources/ViewInspector/SwiftUI/ColorPicker.swift b/Sources/ViewInspector/SwiftUI/ColorPicker.swift
index 36e78de9..2ae2f103 100644
--- a/Sources/ViewInspector/SwiftUI/ColorPicker.swift
+++ b/Sources/ViewInspector/SwiftUI/ColorPicker.swift
@@ -46,7 +46,7 @@ public extension InspectableView where View == ViewType.ColorPicker {
.asInspectableView(ofType: ViewType.ClassifiedView.self)
}
- @available(tvOS 14.0, *)
+ @available(tvOS 14.0, watchOS 7.0, *)
func select(color: Color) throws {
try guardIsResponsive()
#if os(macOS)
@@ -101,7 +101,7 @@ public extension ViewType.ColorPicker {
#endif
}
- @available(tvOS 14.0, *)
+ @available(tvOS 14.0, watchOS 7.0, *)
init(color: Color) {
#if os(macOS)
self.init(color: NSColor(color))
diff --git a/Sources/ViewInspector/SwiftUI/ConditionalContent.swift b/Sources/ViewInspector/SwiftUI/ConditionalContent.swift
index 0c4dfbde..5f8b4f4a 100644
--- a/Sources/ViewInspector/SwiftUI/ConditionalContent.swift
+++ b/Sources/ViewInspector/SwiftUI/ConditionalContent.swift
@@ -12,7 +12,7 @@ extension ViewType.ConditionalContent: SingleViewContent {
static func child(_ content: Content) throws -> Content {
let storage = try Inspector.attribute(label: "storage", value: content.view)
- let medium = content.medium.resettingViewModifiers()
+ let medium = content.medium
if let trueContent = try? Inspector.attribute(label: "trueContent", value: storage) {
return try Inspector.unwrap(view: trueContent, medium: medium)
}
diff --git a/Sources/ViewInspector/SwiftUI/ConfirmationDialog.swift b/Sources/ViewInspector/SwiftUI/ConfirmationDialog.swift
new file mode 100644
index 00000000..05b4c6e1
--- /dev/null
+++ b/Sources/ViewInspector/SwiftUI/ConfirmationDialog.swift
@@ -0,0 +1,118 @@
+import SwiftUI
+
+// MARK: - Alert
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+public extension ViewType {
+
+ struct ConfirmationDialog: KnownViewType {
+ public static var typePrefix: String = "ConfirmationDialogModifier"
+ public static func inspectionCall(typeName: String) -> String {
+ return "confirmationDialog(\(ViewType.indexPlaceholder))"
+ }
+ }
+}
+
+// MARK: - Extraction
+
+@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
+public extension InspectableView {
+
+ func confirmationDialog(_ index: Int? = nil) throws -> InspectableView {
+ return try contentForModifierLookup.confirmationDialog(parent: self, index: index)
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+internal extension Content {
+
+ func confirmationDialog(parent: UnwrappedView, index: Int?) throws -> InspectableView {
+ let modifier = try self.modifierAttribute(
+ modifierLookup: isConfirmationDialog(modifier:), path: "modifier",
+ type: Any.self, call: "confirmationDialog", index: index ?? 0)
+ let medium = self.medium.resettingViewModifiers()
+ let content = Content(modifier, medium: medium)
+ let call = ViewType.inspectionCall(
+ base: ViewType.ConfirmationDialog.inspectionCall(typeName: ""), index: index)
+ let view = try InspectableView(
+ content, parent: parent, call: call, index: index)
+ guard try view.isPresentedBinding().wrappedValue else {
+ throw InspectionError.viewNotFound(parent: "ConfirmationDialog")
+ }
+ return view
+ }
+
+ private func isConfirmationDialog(modifier: Any) -> Bool {
+ guard let modifier = modifier as? ModifierNameProvider
+ else { return false }
+ return modifier.modifierType.contains(ViewType.ConfirmationDialog.typePrefix)
+ }
+}
+
+// MARK: - Non Standard Children
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+extension ViewType.ConfirmationDialog: SupplementaryChildren {
+ static func supplementaryChildren(_ parent: UnwrappedView) throws -> LazyGroup {
+ return .init(count: 3) { index in
+ let medium = parent.content.medium.resettingViewModifiers()
+ switch index {
+ case 0:
+ let view = try Inspector.attribute(path: "title", value: parent.content.view)
+ let content = try Inspector.unwrap(content: Content(view, medium: medium))
+ return try InspectableView(
+ content, parent: parent, call: "title()")
+ case 1:
+ let view = try Inspector.attribute(path: "message", value: parent.content.view)
+ let content = try Inspector.unwrap(content: Content(view, medium: medium))
+ return try InspectableView(
+ content, parent: parent, call: "message()")
+ default:
+ let view = try Inspector.attribute(path: "actions", value: parent.content.view)
+ let content = try Inspector.unwrap(content: Content(view, medium: medium))
+ return try InspectableView(
+ content, parent: parent, call: "actions()")
+ }
+ }
+ }
+}
+
+// MARK: - Custom Attributes
+
+@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
+public extension InspectableView where View == ViewType.ConfirmationDialog {
+
+ func title() throws -> InspectableView {
+ return try View.supplementaryChildren(self).element(at: 0)
+ .asInspectableView(ofType: ViewType.Text.self)
+ }
+
+ func message() throws -> InspectableView {
+ return try View.supplementaryChildren(self).element(at: 1)
+ .asInspectableView(ofType: ViewType.ClassifiedView.self)
+ }
+
+ func actions() throws -> InspectableView {
+ return try View.supplementaryChildren(self).element(at: 2)
+ .asInspectableView(ofType: ViewType.ClassifiedView.self)
+ }
+
+ #if !os(macOS) && !targetEnvironment(macCatalyst) // requires macOS SDK 12.0
+ func titleVisibility() throws -> Visibility {
+ return try Inspector.attribute(
+ label: "titleVisibility", value: content.view, type: Visibility.self)
+ }
+ #endif
+
+ func dismiss() throws {
+ try isPresentedBinding().wrappedValue = false
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+private extension InspectableView where View == ViewType.ConfirmationDialog {
+ func isPresentedBinding() throws -> Binding {
+ return try Inspector.attribute(
+ label: "isPresented", value: content.view, type: Binding.self)
+ }
+}
diff --git a/Sources/ViewInspector/SwiftUI/CustomView.swift b/Sources/ViewInspector/SwiftUI/CustomView.swift
index 3dac5507..6071a8c0 100644
--- a/Sources/ViewInspector/SwiftUI/CustomView.swift
+++ b/Sources/ViewInspector/SwiftUI/CustomView.swift
@@ -135,7 +135,7 @@ public extension Inspectable where Self: NSViewControllerRepresentable {
"Please use `.actualView().viewController()` for inspecting the contents of NSViewControllerRepresentable")
}
}
-#else
+#elseif os(iOS) || os(tvOS)
@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
public extension UIViewRepresentable where Self: Inspectable {
func uiView() throws -> UIViewType {
@@ -165,4 +165,23 @@ public extension Inspectable where Self: UIViewControllerRepresentable {
"Please use `.actualView().viewController()` for inspecting the contents of UIViewControllerRepresentable")
}
}
+#elseif os(watchOS)
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 7.0, *)
+public extension WKInterfaceObjectRepresentable where Self: Inspectable {
+ func interfaceObject() throws -> WKInterfaceObjectType {
+ return try ViewHosting.lookup(Self.self)
+ }
+}
+
+@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 7.0, *)
+public extension Inspectable where Self: WKInterfaceObjectRepresentable {
+ func extractContent(environmentObjects: [AnyObject]) throws -> Any {
+ throw InspectionError.notSupported(
+ """
+ Please use `.actualView().interfaceObject()` for inspecting \
+ the contents of WKInterfaceObjectRepresentable
+ """)
+ }
+}
#endif
diff --git a/Sources/ViewInspector/SwiftUI/CustomViewModifier.swift b/Sources/ViewInspector/SwiftUI/CustomViewModifier.swift
index 10dc8b30..5b0b6c3d 100644
--- a/Sources/ViewInspector/SwiftUI/CustomViewModifier.swift
+++ b/Sources/ViewInspector/SwiftUI/CustomViewModifier.swift
@@ -66,7 +66,8 @@ internal extension Content {
func unwrappedModifiedContent() throws -> Content {
let view = try Inspector.attribute(label: "content", value: self.view)
var medium: Content.Medium
- if let modifier = self.view as? EnvironmentModifier {
+ if let modifier = self.view as? EnvironmentModifier,
+ modifier.qualifiesAsEnvironmentModifier() {
if let value = try? modifier.value(),
let object = try? Inspector.attribute(label: "some", value: value, type: AnyObject.self),
!(object is NSObject) {
diff --git a/Sources/ViewInspector/SwiftUI/EnvironmentReaderView.swift b/Sources/ViewInspector/SwiftUI/EnvironmentReaderView.swift
index 4b899060..b8832472 100644
--- a/Sources/ViewInspector/SwiftUI/EnvironmentReaderView.swift
+++ b/Sources/ViewInspector/SwiftUI/EnvironmentReaderView.swift
@@ -17,13 +17,19 @@ extension ViewType.EnvironmentReaderView: SingleViewContent {
// MARK: - Extraction from SingleViewContent parent
-@available(iOS 13.0, macOS 10.15, tvOS 13.0, *)
+@available(iOS 13.0, tvOS 13.0, *)
+@available(macOS, unavailable)
+@available(watchOS, unavailable)
public extension InspectableView where View: SingleViewContent {
+ @available(iOS, deprecated: 100000.0, message: "Please use `toolbar()` for inspecting `navigationBarItems`")
+ @available(tvOS, deprecated: 100000.0, message: "Please use `toolbar()` for inspecting `navigationBarItems`")
func navigationBarItems() throws -> InspectableView {
return try navigationBarItems(AnyView.self)
}
+ @available(iOS, deprecated: 100000.0, message: "Please use `toolbar()` for inspecting `navigationBarItems`")
+ @available(tvOS, deprecated: 100000.0, message: "Please use `toolbar()` for inspecting `navigationBarItems`")
func navigationBarItems