Skip to content

Commit 2bcdc02

Browse files
committed
Merge pull request tomlokhorst#1 from mac-cain13/feature/support-project-related-paths
Support paths that are not relative to a group
2 parents 2c17859 + 49df90a commit 2bcdc02

File tree

1 file changed

+44
-5
lines changed

1 file changed

+44
-5
lines changed

Xcode/Xcode/XCProjectFile.swift

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func += <KeyType, ValueType> (inout left: Dictionary<KeyType, ValueType>, right:
2424

2525
public class AllObjects {
2626
var dict: [String: PBXObject] = [:]
27-
var fullFilePaths: [String: String] = [:]
27+
var fullFilePaths: [String: Path] = [:]
2828

2929
subscript(key: String) -> PBXObject? {
3030
get { return dict[key] }
@@ -126,11 +126,19 @@ public class XCProjectFile {
126126
return PBXObject(id: id, dict: dict, allObjects: allObjects)
127127
}
128128

129-
func paths(current: PBXGroup, prefix: String) -> [String: String] {
130-
var ps: [String: String] = [:]
129+
func paths(current: PBXGroup, prefix: String) -> [String: Path] {
130+
131+
var ps: [String: Path] = [:]
131132

132133
for file in current.fileRefs {
133-
ps[file.id] = prefix + "/" + file.path
134+
switch file.sourceTree {
135+
case .Group:
136+
ps[file.id] = .RelativeTo(.SourceRoot, prefix + "/" + file.path)
137+
case .Absolute:
138+
ps[file.id] = .Absolute(file.path)
139+
case let .RelativeTo(sourceTreeFolder):
140+
ps[file.id] = .RelativeTo(sourceTreeFolder, file.path)
141+
}
134142
}
135143

136144
for group in current.subGroups {
@@ -209,9 +217,40 @@ public class PBXGroup : PBXReference {
209217
public class PBXVariantGroup : PBXGroup {
210218
}
211219

220+
public enum SourceTree {
221+
case Absolute
222+
case Group
223+
case RelativeTo(SourceTreeFolder)
224+
225+
init?(sourceTreeString: String) {
226+
switch sourceTreeString {
227+
case "<absolute>":
228+
self = .Absolute
229+
case "<group>":
230+
self = .Group
231+
default:
232+
guard let sourceTreeFolder = SourceTreeFolder(rawValue: sourceTreeString) else { return nil }
233+
self = .RelativeTo(sourceTreeFolder)
234+
}
235+
}
236+
}
237+
238+
public enum SourceTreeFolder: String {
239+
case SourceRoot = "SOURCE_ROOT"
240+
case BuildProductsDir = "BUILT_PRODUCTS_DIR"
241+
case DeveloperDir = "DEVELOPER_DIR"
242+
case SDKRoot = "SDKROOT"
243+
}
244+
245+
public enum Path {
246+
case Absolute(String)
247+
case RelativeTo(SourceTreeFolder, String)
248+
}
249+
212250
public class PBXFileReference : PBXReference {
213251
public lazy var path: String = self.string("path")!
252+
public lazy var sourceTree: SourceTree = self.string("sourceTree").flatMap(SourceTree.init)!
214253

215254
// convenience accessor
216-
public lazy var fullPath: String = self.allObjects.fullFilePaths[self.id]!
255+
public lazy var fullPath: Path = self.allObjects.fullFilePaths[self.id]!
217256
}

0 commit comments

Comments
 (0)