Launching Rider on macOS

* Fixing issues where when the editor would try and launch rider on an M1/2 machine it would not properly open because it was the wrong architecture which is now resolved because open will do the right thing
* Making the ParseArgs function a little more resilient against escaped arguments
This commit is contained in:
Andrew Spiering
2023-09-20 23:16:38 -07:00
parent da7ba0ecba
commit d4c71b5fd9
2 changed files with 36 additions and 15 deletions

View File

@@ -268,8 +268,16 @@ void RiderCodeEditor::OpenFile(const String& path, int32 line)
// Open file // Open file
line = line > 0 ? line : 1; line = line > 0 ? line : 1;
CreateProcessSettings procSettings; CreateProcessSettings procSettings;
#if !PLATFORM_MAC
procSettings.FileName = _execPath; procSettings.FileName = _execPath;
procSettings.Arguments = String::Format(TEXT("\"{0}\" --line {2} \"{1}\""), _solutionPath, path, line); procSettings.Arguments = String::Format(TEXT("\"{0}\" --line {2} \"{1}\""), _solutionPath, path, line);
#else
// This follows pretty much how all the other engines open rider which deals with cross architecture issues
procSettings.FileName = "/usr/bin/open";
procSettings.Arguments = String::Format(TEXT("-n -a \"{0}\" --args \"{1}\" --line {3} \"{2}\""), _execPath, _solutionPath, path, line);
#endif
procSettings.HiddenWindow = false; procSettings.HiddenWindow = false;
procSettings.WaitForEnd = false; procSettings.WaitForEnd = false;
procSettings.LogOutput = false; procSettings.LogOutput = false;
@@ -287,8 +295,14 @@ void RiderCodeEditor::OpenSolution()
// Open solution // Open solution
CreateProcessSettings procSettings; CreateProcessSettings procSettings;
#if !PLATFORM_MAC
procSettings.FileName = _execPath; procSettings.FileName = _execPath;
procSettings.Arguments = String::Format(TEXT("\"{0}\""), _solutionPath); procSettings.Arguments = String::Format(TEXT("\"{0}\""), _solutionPath);
#else
// This follows pretty much how all the other engines open rider which deals with cross architecture issues
procSettings.FileName = "/usr/bin/open";
procSettings.Arguments = String::Format(TEXT("-n -a \"{0}\" \"{1}\""), _execPath, _solutionPath);
#endif
procSettings.HiddenWindow = false; procSettings.HiddenWindow = false;
procSettings.WaitForEnd = false; procSettings.WaitForEnd = false;
procSettings.LogOutput = false; procSettings.LogOutput = false;

View File

@@ -85,27 +85,34 @@ NSString* AppleUtils::ToNSString(const char* string)
NSArray* AppleUtils::ParseArguments(NSString* argsString) { NSArray* AppleUtils::ParseArguments(NSString* argsString) {
NSMutableArray *argsArray = [NSMutableArray array]; NSMutableArray *argsArray = [NSMutableArray array];
NSScanner *scanner = [NSScanner scannerWithString:argsString]; NSMutableString *currentArg = [NSMutableString string];
NSString *currentArg = nil;
BOOL insideQuotes = NO; BOOL insideQuotes = NO;
while (![scanner isAtEnd]) { for (NSInteger i = 0; i < argsString.length; ++i) {
if (insideQuotes) { unichar c = [argsString characterAtIndex:i];
[scanner scanUpToString:@"\"" intoString:&currentArg];
[scanner scanString:@"\"" intoString:NULL];
insideQuotes = NO;
} else {
[scanner scanUpToString:@" " intoString:&currentArg];
[scanner scanString:@" " intoString:NULL];
}
if ([currentArg isEqualToString:@"\""]) { if (c == '\"') {
insideQuotes = YES; if (insideQuotes) {
} else if (currentArg) { [argsArray addObject:[currentArg copy]];
[argsArray addObject:currentArg]; [currentArg setString:@""];
insideQuotes = NO;
} else {
insideQuotes = YES;
}
} else if (c == ' ' && !insideQuotes) {
if (currentArg.length > 0) {
[argsArray addObject:[currentArg copy]];
[currentArg setString:@""];
}
} else {
[currentArg appendFormat:@"%C", c];
} }
} }
if (currentArg.length > 0) {
[argsArray addObject:[currentArg copy]];
}
return [argsArray copy]; return [argsArray copy];
} }