Index: lldb/include/lldb/Utility/XcodeSDK.h =================================================================== --- lldb/include/lldb/Utility/XcodeSDK.h +++ lldb/include/lldb/Utility/XcodeSDK.h @@ -67,7 +67,10 @@ llvm::VersionTuple GetVersion() const; Type GetType() const; llvm::StringRef GetString() const; + /// Whether this Xcode SDK supports Swift. + bool SupportsSwift() const; + /// Whether LLDB feels confident importing Clang modules from this SDK. static bool SDKSupportsModules(Type type, llvm::VersionTuple version); static bool SDKSupportsModules(Type desired_type, const FileSpec &sdk_path); /// Return the canonical SDK name, such as "macosx" for the macOS SDK. Index: lldb/source/Utility/XcodeSDK.cpp =================================================================== --- lldb/source/Utility/XcodeSDK.cpp +++ lldb/source/Utility/XcodeSDK.cpp @@ -178,6 +178,27 @@ return false; } +bool XcodeSDK::SupportsSwift() const { + XcodeSDK::Info info = Parse(); + switch (info.type) { + case Type::MacOSX: + return info.version.empty() || info.version >= llvm::VersionTuple(10, 10); + case Type::iPhoneOS: + case Type::iPhoneSimulator: + return info.version.empty() || info.version >= llvm::VersionTuple(8); + case XcodeSDK::Type::AppleTVSimulator: + case XcodeSDK::Type::AppleTVOS: + return info.version.empty() || info.version >= llvm::VersionTuple(9); + case XcodeSDK::Type::WatchSimulator: + case XcodeSDK::Type::watchOS: + return info.version.empty() || info.version >= llvm::VersionTuple(2); + case XcodeSDK::Type::Linux: + return true; + default: + return false; + } +} + bool XcodeSDK::SDKSupportsModules(XcodeSDK::Type desired_type, const FileSpec &sdk_path) { ConstString last_path_component = sdk_path.GetLastPathComponent(); Index: lldb/unittests/Utility/XcodeSDKTest.cpp =================================================================== --- lldb/unittests/Utility/XcodeSDKTest.cpp +++ lldb/unittests/Utility/XcodeSDKTest.cpp @@ -85,6 +85,17 @@ } #endif +TEST(XcodeSDKTest, SDKSupportsSwift) { + EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.sdk").SupportsSwift()); + EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.Internal.sdk").SupportsSwift()); + EXPECT_FALSE(XcodeSDK("iPhoneSimulator7.2.sdk").SupportsSwift()); + EXPECT_TRUE(XcodeSDK("MacOSX10.10.sdk").SupportsSwift()); + EXPECT_FALSE(XcodeSDK("MacOSX10.9.sdk").SupportsSwift()); + EXPECT_TRUE(XcodeSDK("Linux.sdk").SupportsSwift()); + EXPECT_TRUE(XcodeSDK("MacOSX.sdk").SupportsSwift()); + EXPECT_FALSE(XcodeSDK("EverythingElse.sdk").SupportsSwift()); +} + TEST(XcodeSDKTest, GetCanonicalName) { XcodeSDK::Info info; info.type = XcodeSDK::Type::MacOSX;