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 | |