|  | //===- ExtractAPI/APIIgnoresList.cpp -------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | /// | 
|  | /// \file | 
|  | /// This file implements APIIgnoresList that allows users to specifiy a file | 
|  | /// containing symbols to ignore during API extraction. | 
|  | /// | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "clang/ExtractAPI/APIIgnoresList.h" | 
|  | #include "clang/Basic/FileManager.h" | 
|  | #include "llvm/ADT/STLExtras.h" | 
|  | #include "llvm/Support/Error.h" | 
|  |  | 
|  | using namespace clang; | 
|  | using namespace clang::extractapi; | 
|  | using namespace llvm; | 
|  |  | 
|  | char IgnoresFileNotFound::ID; | 
|  |  | 
|  | void IgnoresFileNotFound::log(llvm::raw_ostream &os) const { | 
|  | os << "Could not find API ignores file " << Path; | 
|  | } | 
|  |  | 
|  | std::error_code IgnoresFileNotFound::convertToErrorCode() const { | 
|  | return llvm::inconvertibleErrorCode(); | 
|  | } | 
|  |  | 
|  | Expected<APIIgnoresList> | 
|  | APIIgnoresList::create(const FilePathList &IgnoresFilePathList, | 
|  | FileManager &FM) { | 
|  | SmallVector<StringRef, 32> Lines; | 
|  | BufferList symbolBufferList; | 
|  |  | 
|  | for (const auto &CurrentIgnoresFilePath : IgnoresFilePathList) { | 
|  | auto BufferOrErr = FM.getBufferForFile(CurrentIgnoresFilePath); | 
|  |  | 
|  | if (!BufferOrErr) | 
|  | return make_error<IgnoresFileNotFound>(CurrentIgnoresFilePath); | 
|  |  | 
|  | auto Buffer = std::move(BufferOrErr.get()); | 
|  | Buffer->getBuffer().split(Lines, '\n', /*MaxSplit*/ -1, | 
|  | /*KeepEmpty*/ false); | 
|  | symbolBufferList.push_back(std::move(Buffer)); | 
|  | } | 
|  |  | 
|  | // Symbol names don't have spaces in them, let's just remove these in case | 
|  | // the input is slighlty malformed. | 
|  | transform(Lines, Lines.begin(), [](StringRef Line) { return Line.trim(); }); | 
|  | sort(Lines); | 
|  | return APIIgnoresList(std::move(Lines), std::move(symbolBufferList)); | 
|  | } | 
|  |  | 
|  | bool APIIgnoresList::shouldIgnore(StringRef SymbolName) const { | 
|  | auto It = lower_bound(SymbolsToIgnore, SymbolName); | 
|  | return (It != SymbolsToIgnore.end()) && (*It == SymbolName); | 
|  | } |