================ @@ -0,0 +1,132 @@ +//===- JSONFormat.h ---------------------------------------------*- 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 +// +//===----------------------------------------------------------------------===// +// +// JSON serialization format implementation +// +//===----------------------------------------------------------------------===// + +#ifndef CLANG_ANALYSIS_SCALABLE_SERIALIZATION_JSONFORMAT_H +#define CLANG_ANALYSIS_SCALABLE_SERIALIZATION_JSONFORMAT_H + +#include "clang/Analysis/Scalable/Serialization/SerializationFormat.h" +#include "llvm/ADT/STLFunctionalExtras.h" +#include "llvm/Support/JSON.h" + +namespace clang::ssaf { + +class EntitySummary; +class EntityIdTable; +class SummaryName; + +class JSONFormat : public SerializationFormat { +public: + // Helper class to provide limited access to EntityId conversion methods + // Only exposes EntityId serialization/deserialization to format handlers + class EntityIdConverter { + public: + EntityId fromJSON(uint64_t EntityIdIndex) const { + return Format.entityIdFromJSON(EntityIdIndex); + } + + uint64_t toJSON(EntityId EI) const { return Format.entityIdToJSON(EI); } + + private: + friend class JSONFormat; + EntityIdConverter(const JSONFormat &Format) : Format(Format) {} + const JSONFormat &Format; + }; + + explicit JSONFormat(llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS); + + ~JSONFormat() = default; + + llvm::Expected<TUSummary> readTUSummary(llvm::StringRef Path) override; + + llvm::Error writeTUSummary(const TUSummary &Summary, + llvm::StringRef Path) override; + + using SerializerFn = llvm::function_ref<llvm::json::Object( + const EntitySummary &, const EntityIdConverter &)>; + using DeserializerFn = + llvm::function_ref<llvm::Expected<std::unique_ptr<EntitySummary>>( + const llvm::json::Object &, EntityIdTable &, + const EntityIdConverter &)>; + + using FormatInfo = FormatInfoEntry<SerializerFn, DeserializerFn>; + +private: + std::map<SummaryName, FormatInfo> FormatInfos; + + EntityId entityIdFromJSON(const uint64_t EntityIdIndex) const; + uint64_t entityIdToJSON(EntityId EI) const; + + llvm::Expected<BuildNamespaceKind> + buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr) const; + + llvm::Expected<BuildNamespace> + buildNamespaceFromJSON(const llvm::json::Object &BuildNamespaceObject) const; ---------------- steakhal wrote:
I'd expect that the qualification `llvm::json` would repeat quite a bit in this header and the implementation. I think it's safe include those names within the `JSONFormat` decl context by `using llvm::json;` This should improve readability. Or at least do this selectively for the most common types, like `json::Object`, `json::Array`. Maybe this approach would be even better, so we have precise control over what names are brought into this decl context. https://github.com/llvm/llvm-project/pull/180021 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
