From d4c71b5fd911cc04a2930022de99cdc43a5d49f5 Mon Sep 17 00:00:00 2001 From: Andrew Spiering Date: Wed, 20 Sep 2023 23:16:38 -0700 Subject: [PATCH] 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 --- .../Scripting/CodeEditors/RiderCodeEditor.cpp | 14 +++++++ .../Engine/Platform/Apple/ApplePlatform.cpp | 37 +++++++++++-------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/Source/Editor/Scripting/CodeEditors/RiderCodeEditor.cpp b/Source/Editor/Scripting/CodeEditors/RiderCodeEditor.cpp index 05608d71e..7f5ca6f17 100644 --- a/Source/Editor/Scripting/CodeEditors/RiderCodeEditor.cpp +++ b/Source/Editor/Scripting/CodeEditors/RiderCodeEditor.cpp @@ -268,8 +268,16 @@ void RiderCodeEditor::OpenFile(const String& path, int32 line) // Open file line = line > 0 ? line : 1; CreateProcessSettings procSettings; + +#if !PLATFORM_MAC procSettings.FileName = _execPath; 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.WaitForEnd = false; procSettings.LogOutput = false; @@ -287,8 +295,14 @@ void RiderCodeEditor::OpenSolution() // Open solution CreateProcessSettings procSettings; +#if !PLATFORM_MAC procSettings.FileName = _execPath; 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.WaitForEnd = false; procSettings.LogOutput = false; diff --git a/Source/Engine/Platform/Apple/ApplePlatform.cpp b/Source/Engine/Platform/Apple/ApplePlatform.cpp index eeef5b91f..473fc0987 100644 --- a/Source/Engine/Platform/Apple/ApplePlatform.cpp +++ b/Source/Engine/Platform/Apple/ApplePlatform.cpp @@ -85,27 +85,34 @@ NSString* AppleUtils::ToNSString(const char* string) NSArray* AppleUtils::ParseArguments(NSString* argsString) { NSMutableArray *argsArray = [NSMutableArray array]; - NSScanner *scanner = [NSScanner scannerWithString:argsString]; - NSString *currentArg = nil; + NSMutableString *currentArg = [NSMutableString string]; BOOL insideQuotes = NO; - while (![scanner isAtEnd]) { - if (insideQuotes) { - [scanner scanUpToString:@"\"" intoString:¤tArg]; - [scanner scanString:@"\"" intoString:NULL]; - insideQuotes = NO; - } else { - [scanner scanUpToString:@" " intoString:¤tArg]; - [scanner scanString:@" " intoString:NULL]; - } + for (NSInteger i = 0; i < argsString.length; ++i) { + unichar c = [argsString characterAtIndex:i]; - if ([currentArg isEqualToString:@"\""]) { - insideQuotes = YES; - } else if (currentArg) { - [argsArray addObject:currentArg]; + if (c == '\"') { + if (insideQuotes) { + [argsArray addObject:[currentArg copy]]; + [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]; }