Skip to content

Commit 849de69

Browse files
authored
Merge pull request #87 from JoelGerboreLaser/master
XCGroup: modification to read and write correctly PBXVariantGroupType
2 parents dbd5ebb + 12b5743 commit 849de69

File tree

4 files changed

+113
-13
lines changed

4 files changed

+113
-13
lines changed

Source/XCGroup.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#import <Foundation/Foundation.h>
1414
#import "XcodeGroupMember.h"
1515
#import "XcodeSourceFileType.h"
16+
#import "XCBuildFile.h"
1617

1718
@class XCProject;
1819
@class XCClassDefinition;
@@ -29,7 +30,7 @@
2930
* Represents a _group container in an Xcode project. A group can contain members of type `XCSourceFile` or other
3031
* groups.
3132
*/
32-
@interface XCGroup : NSObject <XcodeGroupMember>
33+
@interface XCGroup : NSObject <XcodeGroupMember, XCBuildFile>
3334
{
3435

3536
NSString* _pathRelativeToParent;
@@ -42,8 +43,12 @@
4243
NSMutableArray* _children;
4344
NSMutableArray* _members;
4445

46+
NSNumber *_isBuildFile;
47+
NSString *_buildFileKey;
48+
4549
XCFileOperationQueue* _fileOperationQueue;
4650
XCProject* _project;
51+
XcodeMemberType _memberType;
4752

4853
}
4954

@@ -77,8 +82,12 @@
7782

7883
+ (XCGroup*)groupWithProject:(XCProject*)project key:(NSString*)key alias:(NSString*)alias path:(NSString*)path children:(NSArray<id<XcodeGroupMember>>*)children;
7984

85+
+ (XCGroup*)groupWithProject:(XCProject*)project key:(NSString*)key alias:(NSString*)alias path:(NSString*)path children:(NSArray<id<XcodeGroupMember>>*)children memberType:(XcodeMemberType)groupType;
86+
8087
- (id)initWithProject:(XCProject*)project key:(NSString*)key alias:(NSString*)alias path:(NSString*)path children:(NSArray<id<XcodeGroupMember>>*)children;
8188

89+
- (id)initWithProject:(XCProject*)project key:(NSString*)key alias:(NSString*)alias path:(NSString*)path children:(NSArray<id<XcodeGroupMember>>*)children memberType:(XcodeMemberType)groupType;
90+
8291
#pragma mark Parent group
8392

8493
- (void)removeFromParentGroup;
@@ -134,6 +143,11 @@
134143
*/
135144
- (XCGroup*)addGroupWithAlias:(NSString *)alias;
136145

146+
/**
147+
* Adds a _group with an alias to this _group and a particular type (only PBXGroupType and PBXVariantGroupType are valid)
148+
*/
149+
- (XCGroup*)addGroupWithAlias:(NSString *)alias groupType:(XcodeMemberType)type;
150+
137151
/**
138152
* Adds a version group with a path relative to this group.
139153
*/

Source/XCGroup.m

Lines changed: 89 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,24 @@ + (XCGroup *)groupWithProject:(XCProject *)project key:(NSString *)key alias:(NS
3737
children:(NSArray *)children
3838
{
3939

40-
return [[XCGroup alloc] initWithProject:project key:key alias:alias path:path children:children];
40+
return [[XCGroup alloc] initWithProject:project key:key alias:alias path:path children:children memberType:PBXGroupType];
41+
}
42+
43+
+ (XCGroup *)groupWithProject:(XCProject *)project key:(NSString *)key alias:(NSString *)alias path:(NSString *)path children:(NSArray<id<XcodeGroupMember>> *)children memberType:(XcodeMemberType)groupType
44+
{
45+
return [[XCGroup alloc]initWithProject:project key:key alias:alias path:path children:children memberType:groupType];
4146
}
4247

4348
//-------------------------------------------------------------------------------------------
4449
#pragma mark - Initialization & Destruction
4550
//-------------------------------------------------------------------------------------------
4651

47-
- (id)initWithProject:(XCProject *)project key:(NSString *)key alias:(NSString *)alias path:(NSString *)path
48-
children:(NSArray *)children
52+
- (id)initWithProject:(XCProject *)project key:(NSString *)key alias:(NSString *)alias path:(NSString *)path children:(NSArray<id<XcodeGroupMember>> *)children memberType:(XcodeMemberType)groupType
4953
{
5054
self = [super init];
55+
56+
assert(groupType == PBXGroupType || groupType == PBXVariantGroupType);
57+
5158
if (self) {
5259
_project = project;
5360
_fileOperationQueue = [_project fileOperationQueue];
@@ -59,10 +66,18 @@ - (id)initWithProject:(XCProject *)project key:(NSString *)key alias:(NSString *
5966
if (!_children) {
6067
_children = [[NSMutableArray alloc] init];
6168
}
69+
70+
_memberType = groupType;
6271
}
6372
return self;
6473
}
6574

75+
- (id)initWithProject:(XCProject *)project key:(NSString *)key alias:(NSString *)alias path:(NSString *)path
76+
children:(NSArray *)children
77+
{
78+
return [self initWithProject:project key:key alias:alias path:path children:children memberType:PBXGroupType];
79+
}
80+
6681
//-------------------------------------------------------------------------------------------
6782
#pragma mark - Interface Methods
6883
//-------------------------------------------------------------------------------------------
@@ -276,7 +291,12 @@ - (XCGroup *)addGroupWithPath:(NSString *)path
276291
return group;
277292
}
278293

279-
- (XCGroup*)addGroupWithAlias:(NSString *)alias
294+
- (XCGroup *)addGroupWithAlias:(NSString *)alias
295+
{
296+
return [self addGroupWithAlias:alias groupType:PBXGroupType];
297+
}
298+
299+
- (XCGroup*)addGroupWithAlias:(NSString *)alias groupType:(XcodeMemberType)type
280300
{
281301
NSString *groupKey = [[XCKeyBuilder forItemNamed:alias] build];
282302

@@ -290,7 +310,7 @@ - (XCGroup*)addGroupWithAlias:(NSString *)alias
290310
}
291311
}
292312

293-
XCGroup *group = [[XCGroup alloc] initWithProject:_project key:groupKey alias:alias path:nil children:nil];
313+
XCGroup *group = [[XCGroup alloc] initWithProject:_project key:groupKey alias:alias path:nil children:nil memberType:type];
294314
NSDictionary *groupDict = [group asDictionary];
295315

296316
[_project objects][groupKey] = groupDict;
@@ -591,6 +611,68 @@ - (NSString *)pathRelativeToProjectRoot
591611
return _pathRelativeToProjectRoot;
592612
}
593613

614+
//-------------------------------------------------------------------------------------------
615+
#pragma mark - XCBuildFile Methods
616+
617+
- (BOOL) canBecomeBuildFile
618+
{
619+
return _memberType == PBXVariantGroupType;
620+
}
621+
622+
- (XcodeMemberType)buildPhase
623+
{
624+
if (_memberType == PBXVariantGroupType)
625+
return PBXResourcesBuildPhaseType;
626+
627+
return PBXNilType;
628+
}
629+
630+
- (NSString *)buildFileKey
631+
{
632+
if (_buildFileKey == nil) {
633+
[[_project objects] enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSDictionary *obj, BOOL *stop) {
634+
if ([[obj valueForKey:@"isa"] xce_hasBuildFileType]) {
635+
if ([[obj valueForKey:@"fileRef"] isEqualToString:_key]) {
636+
_buildFileKey = [key copy];
637+
}
638+
}
639+
}];
640+
}
641+
return [_buildFileKey copy];
642+
643+
}
644+
645+
646+
- (void)becomeBuildFile
647+
{
648+
if (![self isBuildFile]) {
649+
if ([self canBecomeBuildFile]) {
650+
NSMutableDictionary *sourceBuildFile = [NSMutableDictionary dictionary];
651+
sourceBuildFile[@"isa"] = [NSString xce_stringFromMemberType:PBXBuildFileType];
652+
sourceBuildFile[@"fileRef"] = _key;
653+
NSString *buildFileKey = [[XCKeyBuilder forItemNamed:[self.displayName stringByAppendingString:@".buildFile"]] build];
654+
[_project objects][buildFileKey] = sourceBuildFile;
655+
}
656+
}
657+
}
658+
659+
- (BOOL)isBuildFile
660+
{
661+
if ([self canBecomeBuildFile] && _isBuildFile == nil) {
662+
_isBuildFile = @NO;
663+
[[_project objects] enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSDictionary *obj, BOOL *stop) {
664+
if ([[obj valueForKey:@"isa"] xce_hasBuildFileType]) {
665+
if ([[obj valueForKey:@"fileRef"] isEqualToString:_key]) {
666+
_isBuildFile = nil;
667+
668+
_isBuildFile = @YES;
669+
}
670+
}
671+
}];
672+
}
673+
return [_isBuildFile boolValue];
674+
}
675+
594676
//-------------------------------------------------------------------------------------------
595677
#pragma mark - Utility Methods
596678

@@ -828,7 +910,7 @@ - (NSDictionary *)makeFileReferenceWithPath:(NSString *)path name:(NSString *)na
828910
- (NSDictionary *)asDictionary
829911
{
830912
NSMutableDictionary *groupData = [NSMutableDictionary dictionary];
831-
groupData[@"isa"] = [NSString xce_stringFromMemberType:PBXGroupType];
913+
groupData[@"isa"] = [NSString xce_stringFromMemberType:_memberType];
832914
groupData[@"sourceTree"] = @"<group>";
833915

834916
if (_alias != nil) {
@@ -859,4 +941,4 @@ - (void)addSourceFile:(XCSourceFile *)sourceFile toTargets:(NSArray *)targets
859941
}
860942
}
861943

862-
@end
944+
@end

Source/XCProject.m

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,12 @@ - (XCGroup *)groupWithPathFromRoot:(NSString *)path
300300

301301
- (XCGroup *)createGroupWithDictionary:(NSDictionary *)dictionary forKey:(NSString *)key
302302
{
303-
return [XCGroup groupWithProject:self key:key alias:[dictionary valueForKey:@"name"]
304-
path:[dictionary valueForKey:@"path"] children:[dictionary valueForKey:@"children"]];
303+
return [XCGroup groupWithProject:self
304+
key:key
305+
alias:[dictionary valueForKey:@"name"]
306+
path:[dictionary valueForKey:@"path"]
307+
children:[dictionary valueForKey:@"children"]
308+
memberType:[[dictionary valueForKey:@"isa"] xce_asMemberType]];
305309
}
306310

307311
//-------------------------------------------------------------------------------------------
@@ -535,4 +539,4 @@ - (BOOL)doPruneEmptyGroups
535539
return hadEmptyGroups;
536540
}
537541

538-
@end
542+
@end

XcodeEditorTests/XCGroupTests.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ @interface XCFrameworkPath : NSObject
2727
@implementation XCFrameworkPath
2828

2929
static const NSString *SDK_PATH =
30-
@"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.1.sdk";
30+
@"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk";
3131

3232
+ (NSString *)eventKitUIPath
3333
{
@@ -488,4 +488,4 @@ - (void)test_allows_deleting_a_group_after_adding_contents
488488
}
489489

490490

491-
@end
491+
@end

0 commit comments

Comments
 (0)