blob: fe52495b9900405cb24c83d9aaa0ebc0f8acc089 [file] [log] [blame]
#include "./fuzztest/internal/grammar.h"
#include <cstddef>
#include <type_traits>
#include <variant>
#include <vector>
#include "absl/container/flat_hash_map.h"
#include "./fuzztest/internal/domain.h"
#include "./fuzztest/internal/serialization.h"
namespace fuzztest::internal::grammar {
void GroupElementByASTType(
ASTNode& astnode,
absl::flat_hash_map<ASTTypeId, std::vector<ASTNode*>>& groups) {
groups[astnode.type_id].push_back(&astnode);
return std::visit(
[&groups](auto&& arg) {
if constexpr (std::is_same_v<std::decay_t<decltype(arg)>,
std::vector<ASTNode>>) {
for (ASTNode& child : arg) {
GroupElementByASTType(child, groups);
}
}
},
astnode.children);
}
size_t ASTNode::NodeCount() const {
return std::visit(
[](auto&& arg) {
size_t result = 1; // count self.
if constexpr (std::is_same_v<std::decay_t<decltype(arg)>,
std::vector<ASTNode>>) {
for (const ASTNode& child : arg) {
result += child.NodeCount();
}
}
return result;
},
children);
}
IRObject WrapASTIntoIRObject(const ASTNode& astnode, IRObject parsed_child) {
IRObject obj;
auto& subs = obj.MutableSubs();
subs.push_back(IRObject::FromCorpus(astnode.type_id));
subs.push_back(IRObject::FromCorpus(astnode.children.index()));
subs.emplace_back(parsed_child);
return obj;
}
} // namespace fuzztest::internal::grammar