Fix version group path handling

XCVersionGroup's paths should behave exactly like PBXGroup's paths,
meaning the groups should not contain path information while the file
references should contain all path information relative to the main
group.

--
PiperOrigin-RevId: 171723584
MOS_MIGRATED_REVID=171723584
diff --git a/src/TulsiGenerator/PBXObjects.swift b/src/TulsiGenerator/PBXObjects.swift
index c6ce373..d5eafb1 100644
--- a/src/TulsiGenerator/PBXObjects.swift
+++ b/src/TulsiGenerator/PBXObjects.swift
@@ -145,20 +145,6 @@
   }
   fileprivate weak var _parent: PBXReference?
 
-  /// Returns the path to this file reference relative to the source root group.
-  /// Access time is linear, depending on the number of parent groups.
-  var sourceRootRelativePath: String {
-    var parentHierarchy = [path!]
-    var group = parent
-    while (group != nil && group!.path != nil) {
-      parentHierarchy.append(group!.path!)
-      group = group!.parent
-    }
-
-    let fullPath = parentHierarchy.reversed().joined(separator: "/")
-    return fullPath
-  }
-
   init(name: String, path: String?, sourceTree: SourceTree, parent: PBXReference? = nil) {
     self.name = name;
     self.path = path
@@ -220,6 +206,21 @@
     return self.name.pbPathUTI
   }()
 
+  /// Returns the path to this file reference relative to the source root group.
+  /// Access time is linear, depending on the number of parent groups.
+  var sourceRootRelativePath: String {
+    var parentHierarchy = [path!]
+    var group = parent
+    while (group != nil && group!.path != nil) {
+      parentHierarchy.append(group!.path!)
+      group = group!.parent
+    }
+
+    let fullPath = parentHierarchy.reversed().joined(separator: "/")
+    return fullPath
+  }
+
+
   init(name: String, path: String?, sourceTree: SourceTree, parent: PBXGroup?) {
     super.init(name: name, path: path, sourceTree: sourceTree, parent: parent)
   }
@@ -402,6 +403,11 @@
     }
   }
 
+  /// Returns the (first) child file reference with the given name, if any.
+  func childFileReference(withName name: String) -> PBXFileReference? {
+    return fileReferencesBySourceTreePath.values.first { $0.name == name }
+  }
+
   override func serializeInto(_ serializer: PBXProjFieldSerializer) throws {
     try super.serializeInto(serializer)
     try serializer.addField("children", children.sorted(by: {$0.name < $1.name}))
@@ -456,8 +462,9 @@
   }
 
   func setCurrentVersionByName(_ name: String) -> Bool {
-    let sourceTreePath = SourceTreePath(sourceTree: .Group, path: name)
-    guard let value = fileReferencesBySourceTreePath[sourceTreePath] else {
+    // We have to go by name instead of path as PBXFileReferences' paths are relative to the
+    // mainGroup while the name is just the name of the file.
+    guard let value = childFileReference(withName: name) else {
       return false
     }
 
@@ -1231,7 +1238,7 @@
 
     let versionedGroupName = (path as NSString).lastPathComponent
     let versionedGroup = group.getOrCreateChildVersionGroupByName(versionedGroupName,
-                                                                  path: path)
+                                                                  path: nil)
     versionedGroup.versionGroupType = versionGroupType
     return versionedGroup
   }
diff --git a/src/TulsiGenerator/PBXTargetGenerator.swift b/src/TulsiGenerator/PBXTargetGenerator.swift
index 2cd6959..1962e7a 100644
--- a/src/TulsiGenerator/PBXTargetGenerator.swift
+++ b/src/TulsiGenerator/PBXTargetGenerator.swift
@@ -984,7 +984,7 @@
         groups[versionedGroupPath] = versionedGroup
       }
       let ref = versionedGroup.getOrCreateFileReferenceBySourceTree(.Group,
-                                                                    path: path.lastPathComponent)
+                                                                    path: path as String)
       ref.isInputFile = info.targetType == .sourceFile
     }
 
diff --git a/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/ComplexSingleProject.xcodeproj/project.pbxproj b/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/ComplexSingleProject.xcodeproj/project.pbxproj
index fa70950..c1531e1 100644
--- a/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/ComplexSingleProject.xcodeproj/project.pbxproj
+++ b/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/ComplexSingleProject.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		E6AF494706F127E800000000 /* Test.xcdatamodeld in tulsi_e2e_complex */ = {isa = PBXBuildFile; fileRef = C517CBBD06F127E800000000 /* Test.xcdatamodeld */; };
 		E6AF4947151F1CC400000000 /* non_propagated.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28151F1CC400000000 /* non_propagated.m */; };
 		E6AF49471A41382100000000 /* src.mm in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C281A41382100000000 /* src.mm */; };
 		E6AF49473148FC2600000000 /* src.mm in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C283148FC2600000000 /* src.mm */; };
@@ -26,7 +27,6 @@
 		E6AF4947BAE52D2E00000000 /* src4.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28BAE52D2E00000000 /* src4.m */; };
 		E6AF4947BAE52D2E00000001 /* src4.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28BAE52D2E00000000 /* src4.m */; };
 		E6AF4947CFB68C6700000000 /* memleaks.m in memleaks */ = {isa = PBXBuildFile; fileRef = 43D68C28CFB68C6700000000 /* memleaks.m */; };
-		E6AF4947D879895C00000000 /* Test.xcdatamodeld in tulsi_e2e_complex */ = {isa = PBXBuildFile; fileRef = C517CBBDD879895C00000000 /* Test.xcdatamodeld */; };
 		E6AF4947ED583D0500000000 /* today_extension_library.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28ED583D0500000000 /* today_extension_library.m */; };
 		E6AF4947F643652200000000 /* defaultTestSource.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28F643652200000000 /* defaultTestSource.m */; };
 		E6AF4947F643652200000001 /* defaultTestSource.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28F643652200000000 /* defaultTestSource.m */; };
@@ -85,11 +85,11 @@
 		43D68C281A41382100000000 /* src.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = src.mm; path = "tulsi-workspace/tulsi_e2e_complex/SubLibraryWithDefines/srcs/src.mm"; sourceTree = "<group>"; };
 		43D68C2829C9947000000000 /* ObjCBundle.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = ObjCBundle.bundle; path = "tulsi-workspace/tulsi_e2e_complex/ObjCBundle.bundle"; sourceTree = "<group>"; };
 		43D68C283148FC2600000000 /* src.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = src.mm; path = "tulsi-workspace/tulsi_e2e_complex/SubLibrary/srcs/src.mm"; sourceTree = "<group>"; };
+		43D68C283591DFD900000000 /* DataModelsTestv1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = DataModelsTestv1.xcdatamodel; path = tulsi_e2e_complex/Test.xcdatamodeld/DataModelsTestv1.xcdatamodel; sourceTree = "<group>"; };
 		43D68C283A3B027E00000000 /* TodayExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; name = TodayExtension.appex; path = TodayExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
 		43D68C28442EC9D700000000 /* SrcsHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SrcsHeader.h; path = "tulsi-workspace/tulsi_e2e_complex/Library/srcs/SrcsHeader.h"; sourceTree = "<group>"; };
 		43D68C2845AE2B9000000000 /* xib.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = xib.xib; path = "tulsi-workspace/tulsi_e2e_complex/Library/xib.xib"; sourceTree = "<group>"; };
 		43D68C284770519E00000000 /* lib_idx_Library_20EC2F4A.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_Library_20EC2F4A.a; path = lib_idx_Library_20EC2F4A.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		43D68C284B750D1A00000000 /* DataModelsTestv2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = DataModelsTestv2.xcdatamodel; path = "tulsi-workspace/DataModelsTestv2.xcdatamodel"; sourceTree = "<group>"; };
 		43D68C284C2792D600000000 /* lib_idx_TodayExtensionLibrary_CoreDataResources_NonPropagatedLibrary_TestLibrary_79AD2A0E.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_TodayExtensionLibrary_CoreDataResources_NonPropagatedLibrary_TestLibrary_79AD2A0E.a; path = lib_idx_TodayExtensionLibrary_CoreDataResources_NonPropagatedLibrary_TestLibrary_79AD2A0E.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		43D68C28520AA0DE00000000 /* output.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; name = output.m; path = "blaze-genfiles/tulsi_e2e_complex/SrcGenerator/outs/output.m"; sourceTree = "<group>"; };
 		43D68C2852C6516600000000 /* Localized.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Localized.strings; path = "tulsi-workspace/tulsi_e2e_complex/Application/es.lproj/Localized.strings"; sourceTree = "<group>"; };
@@ -99,7 +99,6 @@
 		43D68C285EBBC35700000000 /* One.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = One.storyboard; path = "tulsi-workspace/tulsi_e2e_complex/Application/Base.lproj/One.storyboard"; sourceTree = "<group>"; };
 		43D68C286266EC1F00000000 /* Localized.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Localized.strings; path = "tulsi-workspace/tulsi_e2e_complex/Application/en.lproj/Localized.strings"; sourceTree = "<group>"; };
 		43D68C28627DA73600000000 /* file2.file */ = {isa = PBXFileReference; lastKnownFileType = dyn.age80q4pqqy; name = file2.file; path = "tulsi-workspace/tulsi_e2e_complex/TodayExtension/resources/file2.file"; sourceTree = "<group>"; };
-		43D68C2862B9551400000000 /* DataModelsTestv1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = DataModelsTestv1.xcdatamodel; path = "tulsi-workspace/DataModelsTestv1.xcdatamodel"; sourceTree = "<group>"; };
 		43D68C2864E4F83800000000 /* Two.storyboard */ = {isa = PBXFileReference; explicitFileType = file.storyboard; name = Two.storyboard; path = "blaze-genfiles/tulsi_e2e_complex/StoryboardGenerator/outs/Two.storyboard"; sourceTree = "<group>"; };
 		43D68C286A36B02900000000 /* src.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = src.mm; path = "tulsi-workspace/tulsi_e2e_complex/SubLibraryWithDifferentDefines/srcs/src.mm"; sourceTree = "<group>"; };
 		43D68C286E7B37CF00000000 /* NonLocalized.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = NonLocalized.strings; path = "tulsi-workspace/tulsi_e2e_complex/Application/NonLocalized.strings"; sourceTree = "<group>"; };
@@ -124,6 +123,7 @@
 		43D68C28C005AE4600000000 /* lib_idx_SubLibraryWithIdenticalDefines_SubLibraryWithDefines_EC7E0D8E.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_SubLibraryWithIdenticalDefines_SubLibraryWithDefines_EC7E0D8E.a; path = lib_idx_SubLibraryWithIdenticalDefines_SubLibraryWithDefines_EC7E0D8E.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		43D68C28CF36936300000000 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Localizable.strings; path = "tulsi-workspace/tulsi_e2e_complex/Application/Base.lproj/Localizable.strings"; sourceTree = "<group>"; };
 		43D68C28CFB68C6700000000 /* memleaks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = memleaks.m; path = tools/objc/memleaks/memleaks.m; sourceTree = "<group>"; };
+		43D68C28DACF7BDE00000000 /* DataModelsTestv2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = DataModelsTestv2.xcdatamodel; path = tulsi_e2e_complex/Test.xcdatamodeld/DataModelsTestv2.xcdatamodel; sourceTree = "<group>"; };
 		43D68C28DC6A997500000000 /* NonARCFile.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = NonARCFile.mm; path = "tulsi-workspace/tulsi_e2e_complex/Application/non_arc_srcs/NonARCFile.mm"; sourceTree = "<group>"; };
 		43D68C28ED583D0500000000 /* today_extension_library.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = today_extension_library.m; path = "tulsi-workspace/tulsi_e2e_complex/TodayExtension/srcs/today_extension_library.m"; sourceTree = "<group>"; };
 		43D68C28EEE1AA8400000000 /* file1 */ = {isa = PBXFileReference; lastKnownFileType = text; name = file1; path = "tulsi-workspace/tulsi_e2e_complex/TodayExtension/resources/file1"; sourceTree = "<group>"; };
@@ -442,7 +442,7 @@
 				966FB6DE1FF9DE4F00000000 /* SubLibraryWithDefines */,
 				966FB6DE6FB7342F00000000 /* SubLibraryWithDifferentDefines */,
 				966FB6DE4467252500000000 /* SubLibraryWithIdenticalDefines */,
-				C517CBBDD879895C00000000 /* Test.xcdatamodeld */,
+				C517CBBD06F127E800000000 /* Test.xcdatamodeld */,
 				966FB6DE0F90C7ED00000000 /* TodayExtension */,
 				966FB6DE77973FA000000000 /* XCTest */,
 			);
@@ -820,7 +820,7 @@
 			buildActionMask = 0;
 			files = (
 				E6AF4947ED583D0500000000 /* today_extension_library.m in srcs */,
-				E6AF4947D879895C00000000 /* Test.xcdatamodeld in tulsi_e2e_complex */,
+				E6AF494706F127E800000000 /* Test.xcdatamodeld in tulsi_e2e_complex */,
 				E6AF4947151F1CC400000000 /* non_propagated.m in srcs */,
 				E6AF4947F643652200000001 /* defaultTestSource.m in srcs */,
 			);
@@ -1607,15 +1607,14 @@
 /* End XCConfigurationList section */
 
 /* Begin XCVersionGroup section */
-		C517CBBDD879895C00000000 /* Test.xcdatamodeld */ = {
+		C517CBBD06F127E800000000 /* Test.xcdatamodeld */ = {
 			isa = XCVersionGroup;
 			children = (
-				43D68C2862B9551400000000 /* DataModelsTestv1.xcdatamodel */,
-				43D68C284B750D1A00000000 /* DataModelsTestv2.xcdatamodel */,
+				43D68C283591DFD900000000 /* DataModelsTestv1.xcdatamodel */,
+				43D68C28DACF7BDE00000000 /* DataModelsTestv2.xcdatamodel */,
 			);
-			currentVersion = 43D68C284B750D1A00000000 /* DataModelsTestv2.xcdatamodel */;
+			currentVersion = 43D68C28DACF7BDE00000000 /* DataModelsTestv2.xcdatamodel */;
 			name = Test.xcdatamodeld;
-			path = tulsi_e2e_complex/Test.xcdatamodeld;
 			sourceTree = "<group>";
 			versionGroupType = wrapper.xcdatamodel;
 		};
diff --git a/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/SimpleProject.xcodeproj/project.pbxproj b/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/SimpleProject.xcodeproj/project.pbxproj
index 87d0d68..9e73249 100644
--- a/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/SimpleProject.xcodeproj/project.pbxproj
+++ b/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/SimpleProject.xcodeproj/project.pbxproj
@@ -9,10 +9,10 @@
 /* Begin PBXBuildFile section */
 		E6AF494719E313D100000000 /* src1.mm in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C2819E313D100000000 /* src1.mm */; };
 		E6AF494719E313D100000001 /* src1.mm in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C2819E313D100000000 /* src1.mm */; };
-		E6AF494734A293E700000000 /* SimpleTest.xcdatamodeld in tulsi_e2e_simple */ = {isa = PBXBuildFile; fileRef = C517CBBD34A293E700000000 /* SimpleTest.xcdatamodeld */; };
 		E6AF494741E053A700000000 /* main.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C2841E053A700000000 /* main.m */; };
 		E6AF49478B9856D200000000 /* src1.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C288B9856D200000000 /* src1.m */; };
 		E6AF4947AD49D31000000000 /* src2.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28AD49D31000000000 /* src2.m */; };
+		E6AF4947BA33721800000000 /* SimpleTest.xcdatamodeld in tulsi_e2e_simple */ = {isa = PBXBuildFile; fileRef = C517CBBDBA33721800000000 /* SimpleTest.xcdatamodeld */; };
 		E6AF4947CD6F6F5600000000 /* src3.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28CD6F6F5600000000 /* src3.m */; };
 		E6AF4947CFB68C6700000000 /* memleaks.m in memleaks */ = {isa = PBXBuildFile; fileRef = 43D68C28CFB68C6700000000 /* memleaks.m */; };
 		E6AF4947ED1C8B9400000000 /* src4.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28ED1C8B9400000000 /* src4.m */; };
@@ -45,13 +45,13 @@
 		43D68C2819E313D100000000 /* src1.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = src1.mm; path = "tulsi-workspace/tulsi_e2e_simple/XCTest/srcs/src1.mm"; sourceTree = "<group>"; };
 		43D68C2841E053A700000000 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "tulsi-workspace/tulsi_e2e_simple/ApplicationLibrary/srcs/main.m"; sourceTree = "<group>"; };
 		43D68C284759C53900000000 /* PCHFile.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PCHFile.pch; path = "tulsi-workspace/tulsi_e2e_simple/Library/pch/PCHFile.pch"; sourceTree = "<group>"; };
-		43D68C284819A7D200000000 /* SimpleDataModelsTestv2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = SimpleDataModelsTestv2.xcdatamodel; path = "tulsi-workspace/SimpleDataModelsTestv2.xcdatamodel"; sourceTree = "<group>"; };
 		43D68C2854A2185400000000 /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Launch.storyboard; path = "tulsi-workspace/tulsi_e2e_simple/Application/Launch.storyboard"; sourceTree = "<group>"; };
 		43D68C28594CBB3F00000000 /* BUILD */ = {isa = PBXFileReference; lastKnownFileType = text; name = BUILD; path = tulsi_e2e_simple/BUILD; sourceTree = "<group>"; };
 		43D68C285A65770D00000000 /* xib.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = xib.xib; path = "tulsi-workspace/tulsi_e2e_simple/Library/xibs/xib.xib"; sourceTree = "<group>"; };
 		43D68C285E266A6000000000 /* XCTest.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; name = XCTest.xctest; path = XCTest.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		43D68C287E5CAD8600000000 /* lib_idx_Library_1A8360DD.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_Library_1A8360DD.a; path = lib_idx_Library_1A8360DD.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		43D68C288B9856D200000000 /* src1.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = src1.m; path = "tulsi-workspace/tulsi_e2e_simple/Library/srcs/src1.m"; sourceTree = "<group>"; };
+		43D68C28A556FB7A00000000 /* SimpleDataModelsTestv1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = SimpleDataModelsTestv1.xcdatamodel; path = tulsi_e2e_simple/SimpleTest.xcdatamodeld/SimpleDataModelsTestv1.xcdatamodel; sourceTree = "<group>"; };
 		43D68C28AC13992A00000000 /* SrcsHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SrcsHeader.h; path = "tulsi-workspace/tulsi_e2e_simple/Library/srcs/SrcsHeader.h"; sourceTree = "<group>"; };
 		43D68C28AD49D31000000000 /* src2.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = src2.m; path = "tulsi-workspace/tulsi_e2e_simple/Library/srcs/src2.m"; sourceTree = "<group>"; };
 		43D68C28B6B94D0C00000000 /* HdrsHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HdrsHeader.h; path = "tulsi-workspace/tulsi_e2e_simple/Library/hdrs/HdrsHeader.h"; sourceTree = "<group>"; };
@@ -65,7 +65,7 @@
 		43D68C28ECA2D00200000000 /* One.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = One.storyboard; path = "tulsi-workspace/tulsi_e2e_simple/ApplicationLibrary/Base.lproj/One.storyboard"; sourceTree = "<group>"; };
 		43D68C28ED1C8B9400000000 /* src4.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = src4.m; path = "tulsi-workspace/tulsi_e2e_simple/Library/srcs/src4.m"; sourceTree = "<group>"; };
 		43D68C28EF16FD1000000000 /* lib_idx_ApplicationLibrary_BB2F88FA.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_ApplicationLibrary_BB2F88FA.a; path = lib_idx_ApplicationLibrary_BB2F88FA.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		43D68C28EFA24FC800000000 /* SimpleDataModelsTestv1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = SimpleDataModelsTestv1.xcdatamodel; path = "tulsi-workspace/SimpleDataModelsTestv1.xcdatamodel"; sourceTree = "<group>"; };
+		43D68C28EFB26B8400000000 /* SimpleDataModelsTestv2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = SimpleDataModelsTestv2.xcdatamodel; path = tulsi_e2e_simple/SimpleTest.xcdatamodeld/SimpleDataModelsTestv2.xcdatamodel; sourceTree = "<group>"; };
 		43D68C28F49055A600000000 /* Application.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; name = Application.app; path = Application.app; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -160,7 +160,7 @@
 				966FB6DEC4D81E7A00000000 /* ApplicationLibrary */,
 				43D68C28594CBB3F00000000 /* BUILD */,
 				966FB6DE94E444FD00000000 /* Library */,
-				C517CBBD34A293E700000000 /* SimpleTest.xcdatamodeld */,
+				C517CBBDBA33721800000000 /* SimpleTest.xcdatamodeld */,
 				966FB6DE77973FA000000000 /* XCTest */,
 			);
 			name = tulsi_e2e_simple;
@@ -469,7 +469,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 0;
 			files = (
-				E6AF494734A293E700000000 /* SimpleTest.xcdatamodeld in tulsi_e2e_simple */,
+				E6AF4947BA33721800000000 /* SimpleTest.xcdatamodeld in tulsi_e2e_simple */,
 				E6AF494741E053A700000000 /* main.m in srcs */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1113,15 +1113,14 @@
 /* End XCConfigurationList section */
 
 /* Begin XCVersionGroup section */
-		C517CBBD34A293E700000000 /* SimpleTest.xcdatamodeld */ = {
+		C517CBBDBA33721800000000 /* SimpleTest.xcdatamodeld */ = {
 			isa = XCVersionGroup;
 			children = (
-				43D68C28EFA24FC800000000 /* SimpleDataModelsTestv1.xcdatamodel */,
-				43D68C284819A7D200000000 /* SimpleDataModelsTestv2.xcdatamodel */,
+				43D68C28A556FB7A00000000 /* SimpleDataModelsTestv1.xcdatamodel */,
+				43D68C28EFB26B8400000000 /* SimpleDataModelsTestv2.xcdatamodel */,
 			);
-			currentVersion = 43D68C28EFA24FC800000000 /* SimpleDataModelsTestv1.xcdatamodel */;
+			currentVersion = 43D68C28A556FB7A00000000 /* SimpleDataModelsTestv1.xcdatamodel */;
 			name = SimpleTest.xcdatamodeld;
-			path = tulsi_e2e_simple/SimpleTest.xcdatamodeld;
 			sourceTree = "<group>";
 			versionGroupType = wrapper.xcdatamodel;
 		};
diff --git a/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/SimpleSkylarkProject.xcodeproj/project.pbxproj b/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/SimpleSkylarkProject.xcodeproj/project.pbxproj
index f1a8be3..969d230 100644
--- a/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/SimpleSkylarkProject.xcodeproj/project.pbxproj
+++ b/src/TulsiGeneratorIntegrationTests/Resources/GoldenProjects/SimpleSkylarkProject.xcodeproj/project.pbxproj
@@ -14,9 +14,9 @@
 		E6AF494744067B5100000001 /* XCUITests.mm in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C2844067B5100000000 /* XCUITests.mm */; };
 		E6AF49475AC5B07A00000000 /* src1.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C285AC5B07A00000000 /* src1.m */; };
 		E6AF49476C872CB800000000 /* src2.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C286C872CB800000000 /* src2.m */; };
-		E6AF49477130578F00000000 /* SimpleTest.xcdatamodeld in tulsi_e2e_simple_skylark */ = {isa = PBXBuildFile; fileRef = C517CBBD7130578F00000000 /* SimpleTest.xcdatamodeld */; };
 		E6AF49477C84C8BE00000000 /* src3.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C287C84C8BE00000000 /* src3.m */; };
 		E6AF49478C4244FC00000000 /* src4.m in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C288C4244FC00000000 /* src4.m */; };
+		E6AF4947BA33721800000000 /* SimpleTest.xcdatamodeld in tulsi_e2e_simple_skylark */ = {isa = PBXBuildFile; fileRef = C517CBBDBA33721800000000 /* SimpleTest.xcdatamodeld */; };
 		E6AF4947CFB68C6700000000 /* memleaks.m in memleaks */ = {isa = PBXBuildFile; fileRef = 43D68C28CFB68C6700000000 /* memleaks.m */; };
 		E6AF4947D035C16900000000 /* XCTests.mm in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28D035C16900000000 /* XCTests.mm */; };
 		E6AF4947D035C16900000001 /* XCTests.mm in srcs */ = {isa = PBXBuildFile; fileRef = 43D68C28D035C16900000000 /* XCTests.mm */; };
@@ -45,6 +45,7 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
+		43D68C28016874A200000000 /* SimpleDataModelsTestv1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = SimpleDataModelsTestv1.xcdatamodel; path = tulsi_e2e_simple_skylark/SimpleTest.xcdatamodeld/SimpleDataModelsTestv1.xcdatamodel; sourceTree = "<group>"; };
 		43D68C280363E91A00000000 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "tulsi-workspace/tulsi_e2e_simple_skylark/App/srcs/main.m"; sourceTree = "<group>"; };
 		43D68C2807AD023D00000000 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Tests.swift; path = "tulsi-workspace/tulsi_e2e_simple_skylark/XCTest/srcs/Tests.swift"; sourceTree = "<group>"; };
 		43D68C2815EBBAA000000000 /* lib_idx_JavaLibrary_C16E964B.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_JavaLibrary_C16E964B.a; path = lib_idx_JavaLibrary_C16E964B.a; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -56,7 +57,6 @@
 		43D68C283A0868B500000000 /* Stickers.xcstickers */ = {isa = PBXFileReference; lastKnownFileType = folder.stickers; name = Stickers.xcstickers; path = tulsi_e2e_simple_skylark/Stickers.xcstickers; sourceTree = "<group>"; };
 		43D68C283CBFF4DA00000000 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = "tulsi-workspace/tulsi_e2e_simple_skylark/Application/Info.plist"; sourceTree = "<group>"; };
 		43D68C2844067B5100000000 /* XCUITests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = XCUITests.mm; path = "tulsi-workspace/tulsi_e2e_simple_skylark/XCUITest/srcs/XCUITests.mm"; sourceTree = "<group>"; };
-		43D68C284819A7D200000000 /* SimpleDataModelsTestv2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = SimpleDataModelsTestv2.xcdatamodel; path = "tulsi-workspace/SimpleDataModelsTestv2.xcdatamodel"; sourceTree = "<group>"; };
 		43D68C284F2A6A6E00000000 /* _idx_XCTestCodeSwift_2FB5517B.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; name = _idx_XCTestCodeSwift_2FB5517B.framework; path = _idx_XCTestCodeSwift_2FB5517B.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		43D68C28594086D300000000 /* ProtoFile.proto */ = {isa = PBXFileReference; lastKnownFileType = dyn.age81a6xtsv1u; name = ProtoFile.proto; path = "tulsi-workspace/tulsi_e2e_simple_skylark/ProtoFile.proto"; sourceTree = "<group>"; };
 		43D68C285AC5B07A00000000 /* src1.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = src1.m; path = "tulsi-workspace/tulsi_e2e_simple_skylark/Library/srcs/src1.m"; sourceTree = "<group>"; };
@@ -66,6 +66,7 @@
 		43D68C2875414ABA00000000 /* SrcsHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SrcsHeader.h; path = "tulsi-workspace/tulsi_e2e_simple_skylark/Library/srcs/SrcsHeader.h"; sourceTree = "<group>"; };
 		43D68C287C84C8BE00000000 /* src3.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = src3.m; path = "tulsi-workspace/tulsi_e2e_simple_skylark/Library/srcs/src3.m"; sourceTree = "<group>"; };
 		43D68C2882EBA69000000000 /* lib_idx_MainLibrary_E33E600C.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_MainLibrary_E33E600C.a; path = lib_idx_MainLibrary_E33E600C.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		43D68C288BD42CAC00000000 /* SimpleDataModelsTestv2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = SimpleDataModelsTestv2.xcdatamodel; path = tulsi_e2e_simple_skylark/SimpleTest.xcdatamodeld/SimpleDataModelsTestv2.xcdatamodel; sourceTree = "<group>"; };
 		43D68C288C4244FC00000000 /* src4.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = src4.m; path = "tulsi-workspace/tulsi_e2e_simple_skylark/Library/srcs/src4.m"; sourceTree = "<group>"; };
 		43D68C288CE3D89000000000 /* lib_idx_XCUITestCode_XCTestCode_1D881332.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_XCUITestCode_XCTestCode_1D881332.a; path = lib_idx_XCUITestCode_XCTestCode_1D881332.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		43D68C288EA0254100000000 /* Ext-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = "Ext-Info.plist"; path = "tulsi_e2e_simple_skylark/Ext-Info.plist"; sourceTree = "<group>"; };
@@ -79,7 +80,6 @@
 		43D68C28CFB68C6700000000 /* memleaks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = memleaks.m; path = tools/objc/memleaks/memleaks.m; sourceTree = "<group>"; };
 		43D68C28D035C16900000000 /* XCTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = XCTests.mm; path = "tulsi-workspace/tulsi_e2e_simple_skylark/XCTest/srcs/XCTests.mm"; sourceTree = "<group>"; };
 		43D68C28D66ECB8200000000 /* lib_idx_Library_22D3B3D5.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; name = lib_idx_Library_22D3B3D5.a; path = lib_idx_Library_22D3B3D5.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		43D68C28EFA24FC800000000 /* SimpleDataModelsTestv1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; name = SimpleDataModelsTestv1.xcdatamodel; path = "tulsi-workspace/SimpleDataModelsTestv1.xcdatamodel"; sourceTree = "<group>"; };
 		43D68C28F44F077B00000000 /* file.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; name = file.java; path = "tulsi-workspace/tulsi_e2e_simple_skylark/file.java"; sourceTree = "<group>"; };
 		43D68C28FB7A74E700000000 /* BUILD */ = {isa = PBXFileReference; lastKnownFileType = text; name = BUILD; path = tulsi_e2e_simple_skylark/BUILD; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -288,7 +288,7 @@
 				966FB6DE94E444FD00000000 /* Library */,
 				43D68C28594086D300000000 /* ProtoFile.proto */,
 				43D68C281CB1D2D900000000 /* Settings.bundle */,
-				C517CBBD7130578F00000000 /* SimpleTest.xcdatamodeld */,
+				C517CBBDBA33721800000000 /* SimpleTest.xcdatamodeld */,
 				43D68C283A0868B500000000 /* Stickers.xcstickers */,
 				966FB6DE77973FA000000000 /* XCTest */,
 				966FB6DEDF67EFC000000000 /* XCUITest */,
@@ -654,7 +654,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 0;
 			files = (
-				E6AF49477130578F00000000 /* SimpleTest.xcdatamodeld in tulsi_e2e_simple_skylark */,
+				E6AF4947BA33721800000000 /* SimpleTest.xcdatamodeld in tulsi_e2e_simple_skylark */,
 				E6AF49470363E91A00000000 /* main.m in srcs */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1582,15 +1582,14 @@
 /* End XCConfigurationList section */
 
 /* Begin XCVersionGroup section */
-		C517CBBD7130578F00000000 /* SimpleTest.xcdatamodeld */ = {
+		C517CBBDBA33721800000000 /* SimpleTest.xcdatamodeld */ = {
 			isa = XCVersionGroup;
 			children = (
-				43D68C28EFA24FC800000000 /* SimpleDataModelsTestv1.xcdatamodel */,
-				43D68C284819A7D200000000 /* SimpleDataModelsTestv2.xcdatamodel */,
+				43D68C28016874A200000000 /* SimpleDataModelsTestv1.xcdatamodel */,
+				43D68C288BD42CAC00000000 /* SimpleDataModelsTestv2.xcdatamodel */,
 			);
-			currentVersion = 43D68C28EFA24FC800000000 /* SimpleDataModelsTestv1.xcdatamodel */;
+			currentVersion = 43D68C28016874A200000000 /* SimpleDataModelsTestv1.xcdatamodel */;
 			name = SimpleTest.xcdatamodeld;
-			path = tulsi_e2e_simple_skylark/SimpleTest.xcdatamodeld;
 			sourceTree = "<group>";
 			versionGroupType = wrapper.xcdatamodel;
 		};
diff --git a/src/TulsiGeneratorTests/PBXTargetGeneratorTests.swift b/src/TulsiGeneratorTests/PBXTargetGeneratorTests.swift
index 27aa170..e35f643 100644
--- a/src/TulsiGeneratorTests/PBXTargetGeneratorTests.swift
+++ b/src/TulsiGeneratorTests/PBXTargetGeneratorTests.swift
@@ -2790,7 +2790,10 @@
                      "Mismatch in file count in build phase:\n\(phase.files)\n\(fileSet)",
                      line: line)
       for buildFile in phase.files {
-        let path = buildFile.fileRef.sourceRootRelativePath
+        guard let fileRef = buildFile.fileRef as? PBXFileReference else {
+          continue
+        }
+        let path = fileRef.sourceRootRelativePath
         XCTAssert(fileSet.contains(path),
                   "Found unexpected file '\(path)' in build phase",
                   line: line)