| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | #include "clang/Driver/DarwinSDKInfo.h" |
| 10 | #include "llvm/Support/ErrorOr.h" |
| 11 | #include "llvm/Support/JSON.h" |
| 12 | #include "llvm/Support/MemoryBuffer.h" |
| 13 | #include "llvm/Support/Path.h" |
| 14 | |
| 15 | using namespace clang::driver; |
| 16 | using namespace clang; |
| 17 | |
| 18 | Expected<Optional<DarwinSDKInfo>> |
| 19 | driver::parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath) { |
| 20 | llvm::SmallString<256> Filepath = SDKRootPath; |
| 21 | llvm::sys::path::append(Filepath, "SDKSettings.json"); |
| 22 | llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File = |
| 23 | VFS.getBufferForFile(Filepath); |
| 24 | if (!File) { |
| 25 | |
| 26 | return None; |
| 27 | } |
| 28 | Expected<llvm::json::Value> Result = |
| 29 | llvm::json::parse(File.get()->getBuffer()); |
| 30 | if (!Result) |
| 31 | return Result.takeError(); |
| 32 | |
| 33 | if (const auto *Obj = Result->getAsObject()) { |
| 34 | auto VersionString = Obj->getString("Version"); |
| 35 | if (VersionString) { |
| 36 | VersionTuple Version; |
| 37 | if (!Version.tryParse(*VersionString)) |
| 38 | return DarwinSDKInfo(Version); |
| 39 | } |
| 40 | } |
| 41 | return llvm::make_error<llvm::StringError>("invalid SDKSettings.json", |
| 42 | llvm::inconvertibleErrorCode()); |
| 43 | } |
| 44 | |