blob: 185e834757572b486b64e81ee764f1d7deca2fa2 [file] [log] [blame]
// Copyright 2018 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 ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_FLAT_AST_H_
#define ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_FLAT_AST_H_
#include <stdint.h>
#include <memory>
#include <vector>
#include "ast.h"
namespace fidl {
namespace flat {
struct Ordinal {
Ordinal(std::unique_ptr<ast::NumericLiteral> literal, uint32_t value)
: literal_(std::move(literal)), value_(value) {}
uint32_t Value() const { return value_; }
private:
std::unique_ptr<ast::NumericLiteral> literal_;
uint32_t value_;
};
// TODO(TO-701) Handle multipart names.
struct Name {
Name()
: name_(nullptr) {}
explicit Name(std::unique_ptr<ast::Identifier> name)
: name_(std::move(name)) {}
const ast::Identifier* get() const { return name_.get(); }
bool operator<(const Name& other) const {
return name_ < other.name_;
}
private:
std::unique_ptr<ast::Identifier> name_;
};
struct Const {
Const(Name name, std::unique_ptr<ast::Type> type, std::unique_ptr<ast::Constant> value)
: name(std::move(name)), type(std::move(type)), value(std::move(value)) {}
Name name;
std::unique_ptr<ast::Type> type;
std::unique_ptr<ast::Constant> value;
};
struct Enum {
struct Member {
Member(Name name, std::unique_ptr<ast::Constant> value)
: name(std::move(name)), value(std::move(value)) {}
Name name;
std::unique_ptr<ast::Constant> value;
};
Enum(Name name, std::unique_ptr<ast::PrimitiveType> type, std::vector<Member> members)
: name(std::move(name)), type(std::move(type)), members(std::move(members)) {}
Name name;
std::unique_ptr<ast::PrimitiveType> type;
std::vector<Member> members;
};
struct Interface {
struct Method {
struct Parameter {
Parameter(std::unique_ptr<ast::Type> type, std::unique_ptr<ast::Identifier> name)
: type(std::move(type)), name(std::move(name)) {}
std::unique_ptr<ast::Type> type;
std::unique_ptr<ast::Identifier> name;
// TODO(TO-758) Compute this.
uint64_t offset = 0u;
};
Method(Method&&) = default;
Method& operator=(Method&&) = default;
Method(Ordinal ordinal, std::unique_ptr<ast::Identifier> name, bool has_request,
std::vector<Parameter> maybe_request, bool has_response,
std::vector<Parameter> maybe_response)
: ordinal(std::move(ordinal)), name(std::move(name)), has_request(has_request),
maybe_request(std::move(maybe_request)), has_response(has_response),
maybe_response(std::move(maybe_response)) {
assert(has_request || has_response);
}
Ordinal ordinal;
std::unique_ptr<ast::Identifier> name;
bool has_request;
std::vector<Parameter> maybe_request;
// TODO(TO-758) Compute this.
uint64_t maybe_request_size = 0;
bool has_response;
std::vector<Parameter> maybe_response;
// TODO(TO-758) Compute this.
uint64_t maybe_response_size = 0;
};
Interface(Name name, std::vector<Method> methods)
: name(std::move(name)), methods(std::move(methods)) {}
Name name;
std::vector<Method> methods;
};
struct Struct {
struct Member {
Member(std::unique_ptr<ast::Type> type, std::unique_ptr<ast::Identifier> name,
std::unique_ptr<ast::Constant> maybe_default_value)
: type(std::move(type)), name(std::move(name)),
maybe_default_value(std::move(maybe_default_value)) {}
std::unique_ptr<ast::Type> type;
std::unique_ptr<ast::Identifier> name;
std::unique_ptr<ast::Constant> maybe_default_value;
// TODO(TO-758) Compute this.
uint64_t offset = 0;
};
Struct(Name name, std::vector<Member> members)
: name(std::move(name)), members(std::move(members)) {}
Name name;
std::vector<Member> members;
// TODO(TO-758) Compute this.
uint64_t size = 8;
};
struct Union {
struct Member {
Member(std::unique_ptr<ast::Type> type, std::unique_ptr<ast::Identifier> name)
: type(std::move(type)), name(std::move(name)) {}
std::unique_ptr<ast::Type> type;
std::unique_ptr<ast::Identifier> name;
// TODO(TO-758) Compute this.
uint64_t offset = 0;
};
Union(Name name, std::vector<Member> members)
: name(std::move(name)), members(std::move(members)) {}
Name name;
std::vector<Member> members;
// TODO(TO-758) Compute this.
uint64_t size = 8;
};
} // namespace flat
} // namespace fidl
#endif // ZIRCON_SYSTEM_HOST_FIDL_INCLUDE_FIDL_FLAT_AST_H_