@@ -24,7 +24,7 @@ func += <KeyType, ValueType> (inout left: Dictionary<KeyType, ValueType>, right:
24
24
25
25
public class AllObjects {
26
26
var dict : [ String : PBXObject ] = [ : ]
27
- var fullFilePaths : [ String : String ] = [ : ]
27
+ var fullFilePaths : [ String : Path ] = [ : ]
28
28
29
29
subscript( key: String ) -> PBXObject ? {
30
30
get { return dict [ key] }
@@ -126,11 +126,19 @@ public class XCProjectFile {
126
126
return PBXObject ( id: id, dict: dict, allObjects: allObjects)
127
127
}
128
128
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 ] = [ : ]
131
132
132
133
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
+ }
134
142
}
135
143
136
144
for group in current. subGroups {
@@ -209,9 +217,40 @@ public class PBXGroup : PBXReference {
209
217
public class PBXVariantGroup : PBXGroup {
210
218
}
211
219
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
+
212
250
public class PBXFileReference : PBXReference {
213
251
public lazy var path : String = self . string ( " path " ) !
252
+ public lazy var sourceTree : SourceTree = self . string ( " sourceTree " ) . flatMap ( SourceTree . init) !
214
253
215
254
// convenience accessor
216
- public lazy var fullPath : String = self . allObjects. fullFilePaths [ self . id] !
255
+ public lazy var fullPath : Path = self . allObjects. fullFilePaths [ self . id] !
217
256
}
0 commit comments