123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /*
- * Copyright 2014 Google Inc. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- // independent from idl_parser, since this code is not needed for most clients
- #include "flatbuffers/flatbuffers.h"
- #include "flatbuffers/idl.h"
- #include "flatbuffers/util.h"
- namespace flatbuffers {
- static std::string GenType(const Type &type) {
- switch (type.base_type) {
- case BASE_TYPE_STRUCT: return type.struct_def->name;
- case BASE_TYPE_UNION: return type.enum_def->name;
- case BASE_TYPE_VECTOR: return "[" + GenType(type.VectorType()) + "]";
- default: return kTypeNames[type.base_type];
- }
- }
- // Generate a flatbuffer schema from the Parser's internal representation.
- std::string GenerateFBS(const Parser &parser, const std::string &file_name,
- const GeneratorOptions &opts) {
- std::string schema;
- schema += "// Generated from " + file_name + ".proto\n\n";
- if (opts.include_dependence_headers) {
- int num_includes = 0;
- for (auto it = parser.included_files_.begin();
- it != parser.included_files_.end(); ++it) {
- auto basename = flatbuffers::StripPath(
- flatbuffers::StripExtension(it->first));
- if (basename != file_name) {
- schema += "include \"" + basename + ".fbs\";\n";
- num_includes++;
- }
- }
- if (num_includes) schema += "\n";
- }
- schema += "namespace ";
- auto name_space = parser.namespaces_.back();
- for (auto it = name_space->components.begin();
- it != name_space->components.end(); ++it) {
- if (it != name_space->components.begin()) schema += ".";
- schema += *it;
- }
- schema += ";\n\n";
- // Generate code for all the enum declarations.
- for (auto it = parser.enums_.vec.begin();
- it != parser.enums_.vec.end(); ++it) {
- EnumDef &enum_def = **it;
- schema += "enum " + enum_def.name + " : ";
- schema += GenType(enum_def.underlying_type) + " {\n";
- for (auto it2 = enum_def.vals.vec.begin();
- it2 != enum_def.vals.vec.end(); ++it2) {
- auto &ev = **it2;
- schema += " " + ev.name + " = " + NumToString(ev.value) + ",\n";
- }
- schema += "}\n\n";
- }
- // Generate code for all structs/tables.
- for (auto it = parser.structs_.vec.begin();
- it != parser.structs_.vec.end(); ++it) {
- StructDef &struct_def = **it;
- schema += "table " + struct_def.name + " {\n";
- for (auto it2 = struct_def.fields.vec.begin();
- it2 != struct_def.fields.vec.end(); ++it2) {
- auto &field = **it2;
- schema += " " + field.name + ":" + GenType(field.value.type);
- if (field.value.constant != "0") schema += " = " + field.value.constant;
- if (field.required) schema += " (required)";
- schema += ";\n";
- }
- schema += "}\n\n";
- }
- return schema;
- }
- bool GenerateFBS(const Parser &parser,
- const std::string &path,
- const std::string &file_name,
- const GeneratorOptions &opts) {
- return SaveFile((path + file_name + ".fbs").c_str(),
- GenerateFBS(parser, file_name, opts), false);
- }
- } // namespace flatbuffers
|