Files
cappuccino/Tools/XcodeCapp/XcodeCapp/XCCOperationError.m
T
Antoine Mercadal 47611b7615 NEW: XcodeCapp 4.0
XcodeCapp 4.0 is a major release of our beloved tool. In a nutshell it:

- allows to manage multiple projects simultaneously
- allows to follow operations and cancel them
- has a per project Error and Warning reporting
- supports capp_env as you can define additional paths and objj include path per project
- much more things
2015-08-04 10:35:23 -07:00

189 lines
6.1 KiB
Objective-C

//
// OperationError.m
// XcodeCapp
//
// Created by Alexandre Wilhelm on 5/21/15.
// Copyright (c) 2015 cappuccino-project. All rights reserved.
//
#import "XCCOperationError.h"
static NSCharacterSet * XCCOperationErrorNonASCIICharactersSet;
NSArray * parseCommandXMLString(NSString * aString)
{
if (!XCCOperationErrorNonASCIICharactersSet)
{
NSMutableString *ASCIICharacters = [NSMutableString string];
for (NSInteger i = 32; i < 127; i++)
[ASCIICharacters appendFormat:@"%c", (char)i];
[ASCIICharacters appendString:@"\n\t"];
XCCOperationErrorNonASCIICharactersSet = [[NSCharacterSet characterSetWithCharactersInString:ASCIICharacters] invertedSet];
}
aString = [[aString componentsSeparatedByCharactersInSet:XCCOperationErrorNonASCIICharactersSet] componentsJoinedByString:@""];
aString = [aString stringByReplacingOccurrencesOfString:@"[0m" withString:@""];
NSInteger i = 0;
while ((i < [aString length]) && [[NSCharacterSet newlineCharacterSet] characterIsMember:[aString characterAtIndex:i]])
i++;
NSArray *info;
@try
{
info = [aString propertyList];
}
@catch (NSException *exception)
{
info = @[
@{
@"lineNumber": @"0",
@"sourcePath": @"/Unknown",
@"message": [NSString stringWithFormat:@"Unable to parse: %@", aString]
}
];
}
return info;
}
@implementation XCCOperationError
#pragma mark - Class Methods
+ (instancetype)_operationErrorWithInfo:(NSDictionary*)info type:(int)type
{
XCCOperationError *operationError = [self new];
operationError.fileName = info[@"sourcePath"];
operationError.errorType = type;
switch (type)
{
case XCCObjj2ObjcSkeletonOperationErrorType:
operationError.command = @"objj2objc2skeleton";
operationError.lineNumber = info[@"line"];
operationError.message = info[@"message"];
break;
case XCCObjjOperationErrorType:
operationError.command = @"objj";
operationError.lineNumber = info[@"line"];
operationError.message = info[@"message"];
break;
case XCCNib2CibOperationErrorType:
operationError.command = @"nib2cib";
operationError.message = info[@"errors"];
break;
case XCCCappLintOperationErrorType:
operationError.command = @"capp_lint";
operationError.message = info[@"message"];
operationError.lineNumber = info[@"line"];
break;
}
return operationError;
}
+ (NSArray*)operationErrorsFromObjj2ObjcSkeletonInfo:(NSDictionary*)info
{
NSArray *errors = parseCommandXMLString(info[@"errors"]);
NSMutableArray *ret = [@[] mutableCopy];
for (NSDictionary *error in errors)
[ret addObject:[XCCOperationError _operationErrorWithInfo:error type:XCCObjj2ObjcSkeletonOperationErrorType]];
return ret;
}
+ (NSArray*)operationErrorsFromObjjInfo:(NSDictionary*)info
{
NSArray *errors = parseCommandXMLString(info[@"errors"]);
NSMutableArray *ret = [@[] mutableCopy];
for (NSDictionary *error in errors)
[ret addObject:[XCCOperationError _operationErrorWithInfo:error type:XCCObjjOperationErrorType]];
return ret;
}
+ (NSArray*)operationErrorsFromCappLintInfo:(NSDictionary *)info
{
NSString *response = info[@"errors"];
NSString *sourcePath = info[@"sourcePath"];
NSMutableArray *operationErrors = [@[] mutableCopy];
NSMutableArray *errors = [[response componentsSeparatedByString:@"\n\n"] mutableCopy];
// We need to remove the first object who is the number of errors and the last object who is an empty line
[errors removeLastObject];
[errors removeObjectAtIndex:0];
for (int i = 0; i < [errors count]; i++)
{
NSString *line;
NSMutableString *error = (NSMutableString*)errors[i];
NSString *firstChar = [NSString stringWithFormat:@"%c" ,[error characterAtIndex:0]];
if ([[NSScanner scannerWithString:firstChar] scanInt:nil])
error = (NSMutableString*)[NSString stringWithFormat:@"%@:%@", sourcePath, error];
NSInteger positionOfFirstColon = [error rangeOfString:@":"].location;
NSString *errorWithoutPath = [error substringFromIndex:(positionOfFirstColon + 1)];
NSInteger positionOfSecondColon = [errorWithoutPath rangeOfString:@":"].location;
line = [errorWithoutPath substringToIndex:positionOfSecondColon];
NSString *message = [NSString stringWithFormat:@"Code style issue at line %@ of file %@:\n%@", line, sourcePath.lastPathComponent, errorWithoutPath];
NSDictionary *info = @{@"line": line,
@"message": message,
@"sourcePath": sourcePath};
XCCOperationError *operationError = [XCCOperationError _operationErrorWithInfo:info type:XCCCappLintOperationErrorType];
[operationErrors addObject:operationError];
}
return operationErrors;
}
+ (XCCOperationError *)operationErrorFromNib2CibInfo:(NSDictionary*)info
{
return [XCCOperationError _operationErrorWithInfo:info type:XCCNib2CibOperationErrorType];
}
#pragma mark - Overrides
- (BOOL)isEqualTo:(XCCOperationError*)object
{
return object.errorType == self.errorType && [object.fileName isEqualToString:self.fileName];
}
- (NSString*)description
{
if (self.errorType == XCCNib2CibOperationErrorType)
return @"Converting Interface Files has failed";
if (self.errorType == XCCObjjOperationErrorType)
return @"Verifying compilation Warnings has failed";
if (self.errorType == XCCCappLintOperationErrorType)
return @"Verifying coding style has failed";
if (self.errorType == XCCObjj2ObjcSkeletonOperationErrorType)
return @"Creating Objective-C Class Pair has failed";
return @"An Unknown Error has been caught";
}
@end