[clang] [clang][ssaf] Add JSONFormat support for WPASuite (PR #187403)
Aviral Goel via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 6 10:16:12 PDT 2026
================
@@ -0,0 +1,209 @@
+//===- WPASuite.cpp -------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "JSONFormatImpl.h"
+
+#include "clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/WPASuite.h"
+
+namespace clang::ssaf {
+
+//----------------------------------------------------------------------------
+// AnalysisResultMapEntry
+//----------------------------------------------------------------------------
+
+llvm::Expected<std::pair<AnalysisName, std::unique_ptr<AnalysisResult>>>
+JSONFormat::analysisResultMapEntryFromJSON(const Object &Entry) const {
+ auto OptName = Entry.getString("analysis_name");
+ if (!OptName) {
+ return ErrorBuilder::create(std::errc::invalid_argument,
+ ErrorMessages::FailedToReadObjectAtField,
+ "AnalysisName", "analysis_name", "string")
+ .build();
+ }
+
+ AnalysisName Name = analysisNameFromJSON(*OptName);
+
+ auto ExpectedFns = AnalysisResultRegistry::lookup(Name);
+ if (!ExpectedFns) {
+ return ExpectedFns.takeError();
+ }
+
+ const Object *ResultObj = Entry.getObject("result");
+ if (!ResultObj) {
+ return ErrorBuilder::create(std::errc::invalid_argument,
+ ErrorMessages::FailedToReadObjectAtField,
+ "AnalysisResult", "result", "object")
+ .build();
+ }
+
+ auto ExpectedResult =
+ ExpectedFns->second(*ResultObj, &entityIdFromJSONObject);
+ if (!ExpectedResult) {
+ return ExpectedResult.takeError();
+ }
+
+ return std::make_pair(std::move(Name), std::move(*ExpectedResult));
+}
+
+llvm::Expected<Object> JSONFormat::analysisResultMapEntryToJSON(
+ const AnalysisName &Name,
+ const std::unique_ptr<AnalysisResult> &Result) const {
+ auto ExpectedFns = AnalysisResultRegistry::lookup(Name);
+ if (!ExpectedFns) {
+ return ExpectedFns.takeError();
+ }
+
+ Object Entry;
+ Entry["analysis_name"] = analysisNameToJSON(Name);
+ Entry["result"] = ExpectedFns->first(*Result, &entityIdToJSONObject);
+ return Entry;
+}
+
+//----------------------------------------------------------------------------
+// AnalysisResultMap
+//----------------------------------------------------------------------------
+
+llvm::Expected<std::map<AnalysisName, std::unique_ptr<AnalysisResult>>>
+JSONFormat::analysisResultMapFromJSON(const Array &ResultsArray) const {
+ std::map<AnalysisName, std::unique_ptr<AnalysisResult>> Results;
+ for (size_t I = 0; I < ResultsArray.size(); ++I) {
+ const Object *Entry = ResultsArray[I].getAsObject();
----------------
aviralg wrote:
Fixed.
https://github.com/llvm/llvm-project/pull/187403
More information about the cfe-commits
mailing list