diff --git a/lldb/include/lldb/Utility/XcodeSDK.h b/lldb/include/lldb/Utility/XcodeSDK.h --- a/lldb/include/lldb/Utility/XcodeSDK.h +++ b/lldb/include/lldb/Utility/XcodeSDK.h @@ -71,7 +71,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. diff --git a/lldb/source/Utility/XcodeSDK.cpp b/lldb/source/Utility/XcodeSDK.cpp --- a/lldb/source/Utility/XcodeSDK.cpp +++ b/lldb/source/Utility/XcodeSDK.cpp @@ -181,6 +181,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 Type::AppleTVSimulator: + case Type::AppleTVOS: + return info.version.empty() || info.version >= llvm::VersionTuple(9); + case Type::WatchSimulator: + case Type::watchOS: + return info.version.empty() || info.version >= llvm::VersionTuple(2); + case 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(); diff --git a/lldb/unittests/Utility/XcodeSDKTest.cpp b/lldb/unittests/Utility/XcodeSDKTest.cpp --- a/lldb/unittests/Utility/XcodeSDKTest.cpp +++ b/lldb/unittests/Utility/XcodeSDKTest.cpp @@ -86,6 +86,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;