blob: 843cb380670ceb808c974752f610a76a64ba547b [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef TOOLS_FIDLCAT_LIB_CODE_GENERATOR_CPP_VISITOR_H_
#define TOOLS_FIDLCAT_LIB_CODE_GENERATOR_CPP_VISITOR_H_
#include "src/lib/fidl_codec/visitor.h"
#include "src/lib/fidl_codec/wire_object.h"
#include "src/lib/fidl_codec/wire_types.h"
namespace fidl_codec {
class CppVariable {
public:
CppVariable(std::string_view name, const Value* value, const Type* for_type)
: name_(name), value_(value), for_type_(for_type) {}
virtual ~CppVariable() = default;
std::string name() const { return name_; }
const Value* value() const { return value_; }
const Type* for_type() const { return for_type_; }
virtual void GenerateDeclaration(PrettyPrinter& printer) const {
this->GenerateTypeAndName(printer);
printer << ";\n";
}
virtual void GenerateInitialization(PrettyPrinter& printer, const char* suffix = "") const {
this->GenerateTypeAndName(printer, suffix);
printer << " = ";
this->GenerateLiteralValue(printer);
printer << ";\n";
}
virtual void GenerateName(PrettyPrinter& printer, const char* suffix = "") const {
printer << name() << suffix;
}
virtual void GenerateType(PrettyPrinter& printer) const { printer << for_type()->CppName(); }
virtual void GenerateTypeAndName(PrettyPrinter& printer, const char* suffix = "") const {
this->GenerateType(printer);
printer << " ";
this->GenerateName(printer, suffix);
}
virtual void GenerateLiteralValue(PrettyPrinter& printer) const {
value_->PrettyPrint(for_type_, printer);
}
virtual inline std::string GTestAssert() const { return "ASSERT_EQ"; }
virtual void GenerateAssertStatement(PrettyPrinter& printer, bool prepend_new_line) const {
if (prepend_new_line) {
printer << '\n';
}
std::string old_name = name();
this->GenerateInitialization(printer, "_expected");
printer << this->GTestAssert() << "(";
this->GenerateName(printer);
printer << ", ";
this->GenerateName(printer, "_expected");
printer << ");\n";
}
private:
const std::string name_;
const Value* const value_;
const Type* const for_type_;
};
class CppVariableVector : public CppVariable {
public:
CppVariableVector(const std::string name, const Value* value, const Type* for_type)
: CppVariable(name, value, for_type) {}
void GenerateInitialization(PrettyPrinter& printer, const char* suffix = "") const override;
};
class CppVariableStruct : public CppVariable {
public:
CppVariableStruct(const std::string name, const Value* value, const Type* for_type)
: CppVariable(name, value, for_type) {}
void GenerateInitialization(PrettyPrinter& printer, const char* suffix = "") const override;
};
class CppVisitor : public Visitor {
public:
explicit CppVisitor(std::string_view name = "unnamed_value") : name_(name) {}
std::shared_ptr<CppVariable> result() { return result_; }
void VisitValue(const Value* node, const Type* for_type) override {
std::shared_ptr<CppVariable> value = std::make_shared<CppVariable>(name_, node, for_type);
result_ = std::move(value);
}
virtual void VisitVectorValue(const VectorValue* node, const Type* for_type) override {
std::shared_ptr<CppVariable> value = std::make_shared<CppVariableVector>(name_, node, for_type);
result_ = std::move(value);
}
virtual void VisitStructValue(const StructValue* node, const Type* for_type) override {
std::shared_ptr<CppVariable> value = std::make_shared<CppVariableStruct>(name_, node, for_type);
result_ = std::move(value);
}
private:
std::shared_ptr<CppVariable> result_;
const std::string name_;
};
} // namespace fidl_codec
#endif // TOOLS_FIDLCAT_LIB_CODE_GENERATOR_CPP_VISITOR_H_