1*a7dea167SDimitry Andric //== Yaml.h ---------------------------------------------------- -*- C++ -*--=// 2*a7dea167SDimitry Andric // 3*a7dea167SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*a7dea167SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*a7dea167SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*a7dea167SDimitry Andric // 7*a7dea167SDimitry Andric //===----------------------------------------------------------------------===// 8*a7dea167SDimitry Andric // 9*a7dea167SDimitry Andric // This file defines convenience functions for handling YAML configuration files 10*a7dea167SDimitry Andric // for checkers/packages. 11*a7dea167SDimitry Andric // 12*a7dea167SDimitry Andric //===----------------------------------------------------------------------===// 13*a7dea167SDimitry Andric 14*a7dea167SDimitry Andric #ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKER_YAML_H 15*a7dea167SDimitry Andric #define LLVM_CLANG_LIB_STATICANALYZER_CHECKER_YAML_H 16*a7dea167SDimitry Andric 17*a7dea167SDimitry Andric #include "clang/StaticAnalyzer/Core/CheckerManager.h" 18*a7dea167SDimitry Andric #include "llvm/Support/YAMLTraits.h" 19*a7dea167SDimitry Andric 20*a7dea167SDimitry Andric namespace clang { 21*a7dea167SDimitry Andric namespace ento { 22*a7dea167SDimitry Andric 23*a7dea167SDimitry Andric /// Read the given file from the filesystem and parse it as a yaml file. The 24*a7dea167SDimitry Andric /// template parameter must have a yaml MappingTraits. 25*a7dea167SDimitry Andric /// Emit diagnostic error in case of any failure. 26*a7dea167SDimitry Andric template <class T, class Checker> 27*a7dea167SDimitry Andric llvm::Optional<T> getConfiguration(CheckerManager &Mgr, Checker *Chk, 28*a7dea167SDimitry Andric StringRef Option, StringRef ConfigFile) { 29*a7dea167SDimitry Andric if (ConfigFile.trim().empty()) 30*a7dea167SDimitry Andric return None; 31*a7dea167SDimitry Andric 32*a7dea167SDimitry Andric llvm::vfs::FileSystem *FS = llvm::vfs::getRealFileSystem().get(); 33*a7dea167SDimitry Andric llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer = 34*a7dea167SDimitry Andric FS->getBufferForFile(ConfigFile.str()); 35*a7dea167SDimitry Andric 36*a7dea167SDimitry Andric if (std::error_code ec = Buffer.getError()) { 37*a7dea167SDimitry Andric Mgr.reportInvalidCheckerOptionValue(Chk, Option, 38*a7dea167SDimitry Andric "a valid filename instead of '" + 39*a7dea167SDimitry Andric std::string(ConfigFile) + "'"); 40*a7dea167SDimitry Andric return None; 41*a7dea167SDimitry Andric } 42*a7dea167SDimitry Andric 43*a7dea167SDimitry Andric llvm::yaml::Input Input(Buffer.get()->getBuffer()); 44*a7dea167SDimitry Andric T Config; 45*a7dea167SDimitry Andric Input >> Config; 46*a7dea167SDimitry Andric 47*a7dea167SDimitry Andric if (std::error_code ec = Input.error()) { 48*a7dea167SDimitry Andric Mgr.reportInvalidCheckerOptionValue(Chk, Option, 49*a7dea167SDimitry Andric "a valid yaml file: " + ec.message()); 50*a7dea167SDimitry Andric return None; 51*a7dea167SDimitry Andric } 52*a7dea167SDimitry Andric 53*a7dea167SDimitry Andric return Config; 54*a7dea167SDimitry Andric } 55*a7dea167SDimitry Andric 56*a7dea167SDimitry Andric } // namespace ento 57*a7dea167SDimitry Andric } // namespace clang 58*a7dea167SDimitry Andric 59*a7dea167SDimitry Andric #endif // LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MOVE_H 60