summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/tdtl
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/tdtl')
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt4
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp9
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h8
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp4
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h2
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp4
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h4
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp17
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h2
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp163
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h9
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp4
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h2
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h72
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h4
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp17
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h6
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp16
-rw-r--r--protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h21
19 files changed, 239 insertions, 129 deletions
diff --git a/protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt b/protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt
index b0f83cd98d..8b139ddc68 100644
--- a/protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt
+++ b/protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt
@@ -1,4 +1,6 @@
-cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR)
+if ((CMAKE_MAJOR_VERSION LESS 3) OR (CMAKE_VERSION VERSION_LESS "3.0.2"))
+ message(FATAL_ERROR "CMake >= 3.0.2 is required")
+endif()
#SOURCE SETS
set(TDTL_SOURCE
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp
index e796596760..871b7e22b3 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp
@@ -1,10 +1,10 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
-#include "tl_config.h"
+#include "td/tl/tl_config.h"
#include <cassert>
#include <cstdio>
@@ -40,7 +40,7 @@ void tl_config::add_type(tl_type *type) {
}
tl_type *tl_config::get_type(std::int32_t type_id) const {
- auto it = id_to_type.find(type_id);
+ std::map<std::int32_t, tl_type *>::const_iterator it = id_to_type.find(type_id);
assert(it != id_to_type.end());
return it->second;
}
@@ -327,7 +327,7 @@ tl_type *tl_config_parser::read_type() {
tl_config tl_config_parser::parse_config() {
schema_version = get_schema_version(try_parse_int());
if (schema_version < 2) {
- std::fprintf(stderr, "Unsupported tl-schema verdion %d\n", static_cast<int>(schema_version));
+ std::fprintf(stderr, "Unsupported tl-schema version %d\n", static_cast<int>(schema_version));
std::abort();
}
@@ -344,6 +344,7 @@ tl_config tl_config_parser::parse_config() {
std::int32_t constructors_n = try_parse_int();
assert(static_cast<std::size_t>(constructors_n) == constructors_total);
+ (void)constructors_total;
for (std::int32_t i = 0; i < constructors_n; i++) {
tl_combinator *constructor = read_combinator();
config.get_type(constructor->type_id)->add_constructor(constructor);
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h
index 6a25a9cd09..9735a83626 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h
@@ -1,13 +1,13 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once
-#include "tl_core.h"
-#include "tl_simple_parser.h"
+#include "td/tl/tl_core.h"
+#include "td/tl/tl_simple_parser.h"
#include <cstddef>
#include <cstdint>
@@ -77,7 +77,7 @@ class tl_config_parser {
std::string try_parse_string();
public:
- tl_config_parser(const char *s, std::size_t len) : p(s, len) {
+ tl_config_parser(const char *s, std::size_t len) : p(s, len), schema_version(-1) {
}
tl_config parse_config();
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp
index f8aa6eb10d..a77e7092f3 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp
@@ -1,10 +1,10 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
-#include "tl_core.h"
+#include "td/tl/tl_core.h"
#include <cassert>
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h
index 04fabe1168..edf7580a80 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h
@@ -1,5 +1,5 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp
index 046a1ce84e..6d52a27079 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp
@@ -1,10 +1,10 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
-#include "tl_file_outputer.h"
+#include "td/tl/tl_file_outputer.h"
#include <cassert>
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h
index 3b9c66caaf..7be40d5635 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h
@@ -1,12 +1,12 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once
-#include "tl_outputer.h"
+#include "td/tl/tl_outputer.h"
#include <cstdio>
#include <string>
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp
index bc79d7254e..5aa5d31942 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp
@@ -1,14 +1,13 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
-#include "tl_file_utils.h"
+#include "td/tl/tl_file_utils.h"
#include <cstdio>
#include <cstdlib>
-#include <cstring>
namespace td {
namespace tl {
@@ -32,11 +31,13 @@ std::string get_file_contents(const std::string &file_name, const std::string &m
std::size_t size = static_cast<std::size_t>(size_long);
std::string result(size, ' ');
- std::rewind(f);
- std::size_t fread_res = std::fread(&result[0], size, 1, f);
- if (size != 0 && fread_res != 1) {
- std::fprintf(stderr, "Can't read file \"%s\"", file_name.c_str());
- std::abort();
+ if (size != 0) {
+ std::rewind(f);
+ std::size_t fread_res = std::fread(&result[0], size, 1, f);
+ if (fread_res != 1) {
+ std::fprintf(stderr, "Can't read file \"%s\"", file_name.c_str());
+ std::abort();
+ }
}
std::fclose(f);
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h
index 50e40b4418..2854cdc9ea 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h
@@ -1,5 +1,5 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp
index 401d451cd6..d2d7528ea3 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp
@@ -1,17 +1,17 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
-#include "tl_generate.h"
+#include "td/tl/tl_generate.h"
-#include "tl_config.h"
-#include "tl_core.h"
-#include "tl_file_utils.h"
-#include "tl_outputer.h"
-#include "tl_string_outputer.h"
-#include "tl_writer.h"
+#include "td/tl/tl_config.h"
+#include "td/tl/tl_core.h"
+#include "td/tl/tl_file_utils.h"
+#include "td/tl/tl_outputer.h"
+#include "td/tl/tl_string_outputer.h"
+#include "td/tl/tl_writer.h"
#include <cassert>
#include <cstdint>
@@ -53,26 +53,26 @@ static bool is_reachable_for_storer(int storer_type, const std::string &name,
static void write_class_constructor(tl_outputer &out, const tl_combinator *t, const std::string &class_name,
bool is_default, const TL_writer &w) {
// std::fprintf(stderr, "Gen constructor %s\n", class_name.c_str());
- int fields_num = 0;
+ int field_count = 0;
for (std::size_t i = 0; i < t->args.size(); i++) {
- fields_num += !w.gen_constructor_parameter(0, class_name, t->args[i], is_default).empty();
+ field_count += !w.gen_constructor_parameter(field_count, class_name, t->args[i], is_default).empty();
}
- out.append(w.gen_constructor_begin(fields_num, class_name, is_default));
+ out.append(w.gen_constructor_begin(field_count, class_name, is_default));
int field_num = 0;
for (std::size_t i = 0; i < t->args.size(); i++) {
std::string parameter_init = w.gen_constructor_parameter(field_num, class_name, t->args[i], is_default);
- if (parameter_init.size()) {
+ if (!parameter_init.empty()) {
out.append(parameter_init);
field_num++;
}
}
- assert(field_num == fields_num);
+ assert(field_num == field_count);
field_num = 0;
for (std::size_t i = 0; i < t->args.size(); i++) {
std::string field_init = w.gen_constructor_field_init(field_num, class_name, t->args[i], is_default);
- if (field_init.size()) {
+ if (!field_init.empty()) {
out.append(field_init);
field_num++;
}
@@ -85,38 +85,37 @@ static void write_function_fetch(tl_outputer &out, const std::string &parser_nam
const std::string &class_name, const std::set<std::string> &request_types,
const std::set<std::string> &result_types, const TL_writer &w) {
// std::fprintf(stderr, "Write function fetch %s\n", class_name.c_str());
- std::vector<var_description> vars(t->var_count);
int parser_type = w.get_parser_type(t, parser_name);
if (!is_reachable_for_parser(parser_type, t->name, request_types, result_types, w)) {
return;
}
- out.append(w.gen_fetch_function_begin(parser_name, class_name, 0, vars, parser_type));
+ std::vector<var_description> vars(t->var_count);
+ out.append(w.gen_fetch_function_begin(parser_name, class_name, class_name, 0, static_cast<int>(t->args.size()), vars,
+ parser_type));
out.append(w.gen_vars(t, NULL, vars));
int field_num = 0;
for (std::size_t i = 0; i < t->args.size(); i++) {
std::string field_fetch = w.gen_field_fetch(field_num, t->args[i], vars, false, parser_type);
- if (field_fetch.size()) {
+ if (!field_fetch.empty()) {
out.append(field_fetch);
field_num++;
}
}
- out.append(w.gen_fetch_function_end(field_num, vars, parser_type));
+ out.append(w.gen_fetch_function_end(false, field_num, vars, parser_type));
}
-static std::vector<var_description> write_function_store(tl_outputer &out, const std::string &storer_name,
- const tl_combinator *t, const std::string &class_name,
- std::vector<var_description> &vars,
- const std::set<std::string> &request_types,
- const std::set<std::string> &result_types,
- const TL_writer &w) {
+static void write_function_store(tl_outputer &out, const std::string &storer_name, const tl_combinator *t,
+ const std::string &class_name, std::vector<var_description> &vars,
+ const std::set<std::string> &request_types, const std::set<std::string> &result_types,
+ const TL_writer &w) {
// std::fprintf(stderr, "Write function store %s\n", class_name.c_str());
int storer_type = w.get_storer_type(t, storer_name);
if (!is_reachable_for_storer(storer_type, t->name, request_types, result_types, w)) {
- return vars;
+ return;
}
out.append(w.gen_store_function_begin(storer_name, class_name, 0, vars, storer_type));
@@ -126,8 +125,6 @@ static std::vector<var_description> write_function_store(tl_outputer &out, const
}
out.append(w.gen_store_function_end(vars, storer_type));
-
- return vars;
}
static void write_function_result_fetch(tl_outputer &out, const std::string &parser_name, const tl_combinator *t,
@@ -167,31 +164,32 @@ static void write_function_result_fetch(tl_outputer &out, const std::string &par
}
static void write_constructor_fetch(tl_outputer &out, const std::string &parser_name, const tl_combinator *t,
- const std::string &class_name, const tl_tree_type *result_type, bool is_flat,
+ const std::string &class_name, const std::string &parent_class_name,
+ const tl_tree_type *result_type, bool is_flat,
const std::set<std::string> &request_types,
const std::set<std::string> &result_types, const TL_writer &w) {
- std::vector<var_description> vars(t->var_count);
-
int parser_type = w.get_parser_type(t, parser_name);
if (!is_reachable_for_parser(parser_type, t->name, request_types, result_types, w)) {
return;
}
- out.append(w.gen_fetch_function_begin(parser_name, class_name, static_cast<int>(result_type->children.size()), vars,
- parser_type));
+ std::vector<var_description> vars(t->var_count);
+ out.append(w.gen_fetch_function_begin(parser_name, class_name, parent_class_name,
+ static_cast<int>(result_type->children.size()),
+ static_cast<int>(t->args.size()), vars, parser_type));
out.append(w.gen_vars(t, result_type, vars));
out.append(w.gen_uni(result_type, vars, true));
int field_num = 0;
for (std::size_t i = 0; i < t->args.size(); i++) {
std::string field_fetch = w.gen_field_fetch(field_num, t->args[i], vars, is_flat, parser_type);
- if (field_fetch.size()) {
+ if (!field_fetch.empty()) {
out.append(field_fetch);
field_num++;
}
}
- out.append(w.gen_fetch_function_end(field_num, vars, parser_type));
+ out.append(w.gen_fetch_function_end(class_name != parent_class_name, field_num, vars, parser_type));
}
static void write_constructor_store(tl_outputer &out, const std::string &storer_name, const tl_combinator *t,
@@ -233,7 +231,7 @@ static int gen_field_definitions(tl_outputer &out, const tl_combinator *t, const
}
std::string type_name = w.gen_field_type(a);
- if (type_name.size()) {
+ if (!type_name.empty()) {
out.append(w.gen_field_definition(class_name, type_name, w.gen_field_name(a.name)));
}
}
@@ -247,16 +245,18 @@ static void write_function(tl_outputer &out, const tl_combinator *t, const std::
std::string class_name = w.gen_class_name(t->name);
- out.append(w.gen_class_begin(class_name, w.gen_base_function_class_name(), false));
+ out.append(w.gen_class_begin(class_name, w.gen_base_function_class_name(), false, t->result));
int required_args = gen_field_definitions(out, t, class_name, w);
- out.append(w.gen_flags_definitions(t));
+ out.append(w.gen_flags_definitions(t, true));
std::vector<var_description> vars(t->var_count);
out.append(w.gen_function_vars(t, vars));
- write_class_constructor(out, t, class_name, true, w);
- if (required_args) {
+ if (w.is_default_constructor_generated(t, false, true)) {
+ write_class_constructor(out, t, class_name, true, w);
+ }
+ if (required_args && w.is_full_constructor_generated(t, false, true)) {
write_class_constructor(out, t, class_name, false, w);
}
@@ -294,19 +294,50 @@ static void write_function(tl_outputer &out, const tl_combinator *t, const std::
out.append(w.gen_class_end());
}
-static void write_constructor(tl_outputer &out, const tl_combinator *t, const std::string &base_class, bool is_proxy,
+static void write_constructor(tl_outputer &out, const tl_combinator *t, const std::string &base_class,
+ const std::string &parent_class, bool is_proxy,
const std::set<std::string> &request_types, const std::set<std::string> &result_types,
const TL_writer &w) {
assert(w.is_combinator_supported(t));
std::string class_name = w.gen_class_name(t->name);
- out.append(w.gen_class_begin(class_name, base_class, is_proxy));
+ out.append(w.gen_class_begin(class_name, base_class, is_proxy, t->result));
int required_args = gen_field_definitions(out, t, class_name, w);
- out.append(w.gen_flags_definitions(t));
- write_class_constructor(out, t, class_name, true, w);
- if (required_args) {
+ bool can_be_parsed = false;
+ bool is_can_be_parsed_inited = false;
+ std::vector<std::string> parsers = w.get_parsers();
+ for (std::size_t i = 0; i < parsers.size(); i++) {
+ int parser_type = w.get_parser_type(t, parsers[i]);
+ if (w.get_parser_mode(parser_type) != TL_writer::All) {
+ can_be_parsed |= is_reachable_for_parser(parser_type, t->name, request_types, result_types, w);
+ is_can_be_parsed_inited = true;
+ }
+ }
+ if (!is_can_be_parsed_inited) {
+ can_be_parsed = true;
+ }
+
+ bool can_be_stored = false;
+ bool is_can_be_stored_inited = false;
+ std::vector<std::string> storers = w.get_storers();
+ for (std::size_t i = 0; i < storers.size(); i++) {
+ int storer_type = w.get_storer_type(t, storers[i]);
+ if (w.get_storer_mode(storer_type) != TL_writer::All) {
+ can_be_stored |= is_reachable_for_storer(storer_type, t->name, request_types, result_types, w);
+ is_can_be_stored_inited = true;
+ }
+ }
+ if (!is_can_be_stored_inited) {
+ can_be_stored = true;
+ }
+
+ out.append(w.gen_flags_definitions(t, can_be_stored));
+ if (w.is_default_constructor_generated(t, can_be_parsed, can_be_stored)) {
+ write_class_constructor(out, t, class_name, true, w);
+ }
+ if (required_args && w.is_full_constructor_generated(t, can_be_parsed, can_be_stored)) {
write_class_constructor(out, t, class_name, false, w);
}
@@ -316,15 +347,13 @@ static void write_constructor(tl_outputer &out, const tl_combinator *t, const st
assert(t->result->get_type() == NODE_TYPE_TYPE);
const tl_tree_type *result_type = static_cast<const tl_tree_type *>(t->result);
- std::vector<std::string> parsers = w.get_parsers();
for (std::size_t i = 0; i < parsers.size(); i++) {
- write_constructor_fetch(out, parsers[i], t, class_name, result_type,
+ write_constructor_fetch(out, parsers[i], t, class_name, parent_class, result_type,
required_args == 1 && result_type->type->simple_constructors == 1, request_types,
result_types, w);
}
// STORER
- std::vector<std::string> storers = w.get_storers();
for (std::size_t i = 0; i < storers.size(); i++) {
write_constructor_store(out, storers[i], t, class_name, result_type,
required_args == 1 && result_type->type->simple_constructors == 1, request_types,
@@ -357,7 +386,7 @@ void write_class(tl_outputer &out, const tl_type *t, const std::set<std::string>
std::vector<var_description> empty_vars;
bool optimize_one_constructor = (t->simple_constructors == 1);
if (!optimize_one_constructor) {
- out.append(w.gen_class_begin(class_name, base_class, true));
+ out.append(w.gen_class_begin(class_name, base_class, true, nullptr));
out.append(w.gen_get_id(class_name, 0, true));
@@ -367,7 +396,7 @@ void write_class(tl_outputer &out, const tl_type *t, const std::set<std::string>
continue;
}
- out.append(w.gen_fetch_function_begin(parsers[i], class_name, t->arity, empty_vars, -1));
+ out.append(w.gen_fetch_function_begin(parsers[i], class_name, class_name, t->arity, -1, empty_vars, -1));
out.append(w.gen_fetch_switch_begin());
for (std::size_t j = 0; j < t->constructors_num; j++) {
if (w.is_combinator_supported(t->constructors[j])) {
@@ -376,7 +405,7 @@ void write_class(tl_outputer &out, const tl_type *t, const std::set<std::string>
}
out.append(w.gen_fetch_switch_end());
- out.append(w.gen_fetch_function_end(-1, empty_vars, -1));
+ out.append(w.gen_fetch_function_end(false, -1, empty_vars, -1));
}
std::vector<std::string> storers = w.get_storers();
@@ -409,10 +438,11 @@ void write_class(tl_outputer &out, const tl_type *t, const std::set<std::string>
for (std::size_t i = 0; i < t->constructors_num; i++) {
if (w.is_combinator_supported(t->constructors[i])) {
if (optimize_one_constructor) {
- write_constructor(out, t->constructors[i], base_class, false, request_types, result_types, w);
+ write_constructor(out, t->constructors[i], base_class, w.gen_class_name(t->constructors[i]->name), false,
+ request_types, result_types, w);
out.append(w.gen_class_alias(w.gen_class_name(t->constructors[i]->name), class_name));
} else {
- write_constructor(out, t->constructors[i], class_name, false, request_types, result_types, w);
+ write_constructor(out, t->constructors[i], class_name, class_name, false, request_types, result_types, w);
}
written_constructors++;
} else {
@@ -479,7 +509,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
std::size_t types_n = config.get_type_count();
std::size_t functions_n = config.get_function_count();
- bool found_complex = false;
for (std::size_t type = 0; type < types_n; type++) {
tl_type *t = config.get_type_by_num(type);
assert(t->constructors_num == t->constructors.size());
@@ -487,7 +516,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
if (t->name == "Type") {
assert(t->id == ID_VAR_TYPE);
t->flags |= FLAG_COMPLEX;
- found_complex = true;
}
continue;
}
@@ -525,7 +553,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
b.exist_var_num != -1) {
if (!w.is_built_in_complex_type(t->name)) {
t->flags |= FLAG_COMPLEX;
- found_complex = true;
}
} else {
assert(b_arg_type == NODE_TYPE_TYPE);
@@ -545,14 +572,13 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
if (main_type == NODE_TYPE_VAR_TYPE) {
if (!w.is_built_in_complex_type(t->name)) {
t->flags |= FLAG_COMPLEX;
- found_complex = true;
}
}
}
}
- while (found_complex) {
- found_complex = false;
+ while (true) {
+ bool found_complex = false;
for (std::size_t type = 0; type < types_n; type++) {
tl_type *t = config.get_type_by_num(type);
if (t->constructors_num == 0 || w.is_built_in_complex_type(t->name)) { // built-in dummy or complex types
@@ -572,6 +598,9 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
// std::fprintf(stderr, "Found complex %s\n", t->name.c_str());
}
}
+ if (!found_complex) {
+ break;
+ }
}
std::set<std::string> request_types;
@@ -619,7 +648,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
// write base classes
std::vector<var_description> empty_vars;
for (int i = 0; i <= w.get_max_arity(); i++) {
- out.append(w.gen_class_begin(w.gen_base_type_class_name(i), w.gen_base_tl_class_name(), true));
+ out.append(w.gen_class_begin(w.gen_base_type_class_name(i), w.gen_base_tl_class_name(), true, nullptr));
out.append(w.gen_get_id(w.gen_base_type_class_name(i), 0, true));
@@ -648,7 +677,8 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
continue;
}
- out.append(w.gen_fetch_function_begin(parsers[j], w.gen_base_type_class_name(i), i, empty_vars, -1));
+ out.append(w.gen_fetch_function_begin(parsers[j], w.gen_base_type_class_name(i), w.gen_base_type_class_name(i), i,
+ -1, empty_vars, -1));
out.append(w.gen_fetch_switch_begin());
for (std::size_t type = 0; type < types_n; type++) {
tl_type *t = config.get_type_by_num(type);
@@ -668,7 +698,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
}
}
out.append(w.gen_fetch_switch_end());
- out.append(w.gen_fetch_function_end(-1, empty_vars, -1));
+ out.append(w.gen_fetch_function_end(false, -1, empty_vars, -1));
}
std::vector<std::string> additional_functions = w.get_additional_functions();
@@ -712,7 +742,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
}
{
- out.append(w.gen_class_begin(w.gen_base_function_class_name(), w.gen_base_tl_class_name(), true));
+ out.append(w.gen_class_begin(w.gen_base_function_class_name(), w.gen_base_tl_class_name(), true, nullptr));
out.append(w.gen_get_id(w.gen_base_function_class_name(), 0, true));
@@ -722,7 +752,8 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
continue;
}
- out.append(w.gen_fetch_function_begin(parsers[j], w.gen_base_function_class_name(), 0, empty_vars, -1));
+ out.append(w.gen_fetch_function_begin(parsers[j], w.gen_base_function_class_name(),
+ w.gen_base_function_class_name(), 0, -1, empty_vars, -1));
out.append(w.gen_fetch_switch_begin());
for (std::size_t function = 0; function < functions_n; function++) {
tl_combinator *t = config.get_function_by_num(function);
@@ -732,7 +763,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
}
}
out.append(w.gen_fetch_switch_end());
- out.append(w.gen_fetch_function_end(-1, empty_vars, -1));
+ out.append(w.gen_fetch_function_end(false, -1, empty_vars, -1));
}
std::vector<std::string> storers = w.get_storers();
@@ -790,7 +821,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) {
for (std::size_t function = 0; function < functions_n; function++) {
tl_combinator *t = config.get_function_by_num(function);
if (!w.is_combinator_supported(t)) {
- std::fprintf(stderr, "Function %s is too hard to store\n", t->name.c_str());
+ // std::fprintf(stderr, "Function %s is too hard to store\n", t->name.c_str());
continue;
}
@@ -826,7 +857,7 @@ bool write_tl_to_file(const tl_config &config, const std::string &file_name, con
tl_string_outputer out;
write_tl(config, out, w);
- auto old_file_contents = get_file_contents(file_name, "rb");
+ std::string old_file_contents = get_file_contents(file_name, "rb");
if (!w.is_documentation_generated()) {
old_file_contents = remove_documentation(old_file_contents);
}
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h
index 3523d1c828..d8588023a1 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h
@@ -1,14 +1,14 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once
-#include "tl_config.h"
-#include "tl_outputer.h"
-#include "tl_writer.h"
+#include "td/tl/tl_config.h"
+#include "td/tl/tl_outputer.h"
+#include "td/tl/tl_writer.h"
#include <string>
@@ -18,6 +18,7 @@ namespace tl {
void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w);
tl_config read_tl_config_from_file(const std::string &file_name);
+
bool write_tl_to_file(const tl_config &config, const std::string &file_name, const TL_writer &w);
} // namespace tl
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp
index fed4ceb818..f26a49abd0 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp
@@ -1,10 +1,10 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
-#include "tl_outputer.h"
+#include "td/tl/tl_outputer.h"
namespace td {
namespace tl {
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h
index 47c0ab4fed..6ddd156b56 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h
@@ -1,5 +1,5 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h
index bf4801f1e2..1762087a12 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h
@@ -1,5 +1,5 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -16,24 +16,25 @@
#include <string>
#include <vector>
+#include <iostream>
+
namespace td {
namespace tl {
namespace simple {
-// TL type is
-std::string gen_cpp_name(std::string name) {
- for (std::size_t i = 0; i < name.size(); i++) {
- if ((name[i] < '0' || '9' < name[i]) && (name[i] < 'a' || 'z' < name[i]) && (name[i] < 'A' || 'Z' < name[i])) {
- name[i] = '_';
+inline std::string gen_cpp_name(std::string name) {
+ for (auto &c : name) {
+ if ((c < '0' || '9' < c) && (c < 'a' || 'z' < c) && (c < 'A' || 'Z' < c)) {
+ c = '_';
}
}
- assert(name.size() > 0);
+ assert(!name.empty());
assert(name[name.size() - 1] != '_');
return name;
}
-std::string gen_cpp_field_name(std::string name) {
- return gen_cpp_name(name) + "_";
+inline std::string gen_cpp_field_name(std::string name) {
+ return gen_cpp_name(name) + '_';
}
struct CustomType;
@@ -46,7 +47,7 @@ struct Type {
// type == Vector
const Type *vector_value_type{nullptr};
-}; // namespace simple
+};
struct Arg {
const Type *type;
@@ -63,6 +64,9 @@ struct Constructor {
struct CustomType {
std::string name;
std::vector<const Constructor *> constructors;
+
+ mutable bool is_result_{false};
+ mutable bool is_query_{false};
};
struct Function {
@@ -91,6 +95,23 @@ class Schema {
auto *from_function = config.get_function_by_num(function_num);
functions.push_back(get_function(from_function));
}
+ for (auto &function : functions_) {
+ mark_result(function->type);
+ for (auto &arg : function->args) {
+ mark_query(arg.type);
+ }
+ }
+
+ //for (auto custom_type : custom_types) {
+ //std::cerr << custom_type->name;
+ //if (custom_type->is_result_) {
+ //std::cerr << " result";
+ //}
+ //if (custom_type->is_query_) {
+ //std::cerr << " query";
+ //}
+ //std::cerr << std::endl;
+ //}
}
std::vector<const CustomType *> custom_types;
@@ -107,6 +128,34 @@ class Schema {
std::map<std::int32_t, Constructor *> constructor_by_id;
std::map<std::int32_t, Function *> function_by_id;
+ void mark_result(const Type *type) {
+ do_mark(type, true);
+ }
+
+ void mark_query(const Type *type) {
+ do_mark(type, false);
+ }
+
+ void do_mark(const Type *type, bool is_result) {
+ if (type->type == Type::Vector) {
+ return do_mark(type->vector_value_type, is_result);
+ }
+ if (type->type != Type::Custom) {
+ return;
+ }
+ auto *custom = type->custom;
+ auto &was = is_result ? custom->is_result_ : custom->is_query_;
+ if (was) {
+ return;
+ }
+ was = true;
+ for (auto constructor : custom->constructors) {
+ for (auto &arg : constructor->args) {
+ do_mark(arg.type, is_result);
+ }
+ }
+ }
+
const Type *get_type(const tl_type *from_type) {
auto &type = type_by_id[from_type->id];
if (!type) {
@@ -142,6 +191,7 @@ class Schema {
}
return type;
}
+
const CustomType *get_custom_type(const tl_type *from_type) {
auto *type = get_type(from_type);
assert(type->type == Type::Custom);
@@ -165,6 +215,7 @@ class Schema {
}
return constructor;
}
+
const Function *get_function(const tl_combinator *from) {
auto &function = function_by_id[from->id];
if (!function) {
@@ -182,6 +233,7 @@ class Schema {
}
return function;
}
+
const Type *get_type(const tl_tree *tree) {
assert(tree->get_type() == NODE_TYPE_TYPE);
auto *type_tree = static_cast<const tl_tree_type *>(tree);
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h
index 9e612bf799..e5605cefe0 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h
@@ -1,5 +1,5 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -68,7 +68,7 @@ class tl_simple_parser {
std::int64_t fetch_long() {
check_len(sizeof(std::int64_t));
std::int64_t result;
- std::memcpy(reinterpret_cast<char *>(&result), data, sizeof(std::int64_t));
+ std::memcpy(&result, data, sizeof(std::int64_t));
data += sizeof(std::int64_t);
return result;
}
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp
index 4a72ecdccd..2981dc04c1 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp
@@ -1,10 +1,10 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
-#include "tl_string_outputer.h"
+#include "td/tl/tl_string_outputer.h"
namespace td {
namespace tl {
@@ -13,8 +13,19 @@ void tl_string_outputer::append(const std::string &str) {
result += str;
}
-const std::string &tl_string_outputer::get_result() const {
+std::string tl_string_outputer::get_result() const {
+#if defined(_WIN32)
+ std::string fixed_result;
+ for (std::size_t i = 0; i < result.size(); i++) {
+ if (result[i] == '\n') {
+ fixed_result += '\r';
+ }
+ fixed_result += result[i];
+ }
+ return fixed_result;
+#else
return result;
+#endif
}
} // namespace tl
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h
index f0936340da..b78617be09 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h
@@ -1,12 +1,12 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once
-#include "tl_outputer.h"
+#include "td/tl/tl_outputer.h"
#include <string>
@@ -19,7 +19,7 @@ class tl_string_outputer : public tl_outputer {
public:
virtual void append(const std::string &str);
- const std::string &get_result() const;
+ std::string get_result() const;
};
} // namespace tl
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp
index f1d8b2e18a..8800246ebe 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp
@@ -1,12 +1,12 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
-#include "tl_writer.h"
+#include "td/tl/tl_writer.h"
-#include "tl_core.h"
+#include "td/tl/tl_core.h"
#include <cassert>
#include <cstdio>
@@ -16,7 +16,7 @@ namespace tl {
std::string TL_writer::int_to_string(int x) {
char buf[15];
- std::sprintf(buf, "%d", x);
+ std::snprintf(buf, sizeof(buf), "%d", x);
return buf;
}
@@ -135,6 +135,14 @@ bool TL_writer::is_documentation_generated() const {
return false;
}
+bool TL_writer::is_default_constructor_generated(const tl_combinator *t, bool can_be_parsed, bool can_be_stored) const {
+ return true;
+}
+
+bool TL_writer::is_full_constructor_generated(const tl_combinator *t, bool can_be_parsed, bool can_be_stored) const {
+ return true;
+}
+
std::string TL_writer::gen_main_class_name(const tl_type *t) const {
if (t->simple_constructors == 1) {
for (std::size_t i = 0; i < t->constructors_num; i++) {
diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h
index 3c3847516b..dff8958aeb 100644
--- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h
+++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h
@@ -1,12 +1,12 @@
//
-// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once
-#include "tl_core.h"
+#include "td/tl/tl_core.h"
#include <cstdint>
#include <string>
@@ -56,6 +56,8 @@ class TL_writer {
virtual bool is_type_bare(const tl_type *t) const = 0;
virtual bool is_combinator_supported(const tl_combinator *constructor) const;
virtual bool is_documentation_generated() const;
+ virtual bool is_default_constructor_generated(const tl_combinator *t, bool can_be_parsed, bool can_be_stored) const;
+ virtual bool is_full_constructor_generated(const tl_combinator *t, bool can_be_parsed, bool can_be_stored) const;
virtual int get_parser_type(const tl_combinator *t, const std::string &parser_name) const;
virtual int get_storer_type(const tl_combinator *t, const std::string &storer_name) const;
@@ -86,15 +88,15 @@ class TL_writer {
virtual std::string gen_forward_class_declaration(const std::string &class_name, bool is_proxy) const = 0;
- virtual std::string gen_class_begin(const std::string &class_name, const std::string &base_class_name,
- bool is_proxy) const = 0;
+ virtual std::string gen_class_begin(const std::string &class_name, const std::string &base_class_name, bool is_proxy,
+ const tl_tree *result) const = 0;
virtual std::string gen_class_end() const = 0;
virtual std::string gen_class_alias(const std::string &class_name, const std::string &alias_name) const = 0;
virtual std::string gen_field_definition(const std::string &class_name, const std::string &type_name,
const std::string &field_name) const = 0;
- virtual std::string gen_flags_definitions(const tl_combinator *t) const {
+ virtual std::string gen_flags_definitions(const tl_combinator *t, bool can_be_stored) const {
return "";
}
@@ -118,9 +120,10 @@ class TL_writer {
virtual std::string gen_function_result_type(const tl_tree *result) const = 0;
- virtual std::string gen_fetch_function_begin(const std::string &parser_name, const std::string &class_name, int arity,
+ virtual std::string gen_fetch_function_begin(const std::string &parser_name, const std::string &class_name,
+ const std::string &parent_class_name, int arity, int field_count,
std::vector<var_description> &vars, int parser_type) const = 0;
- virtual std::string gen_fetch_function_end(int field_num, const std::vector<var_description> &vars,
+ virtual std::string gen_fetch_function_end(bool has_parent, int field_count, const std::vector<var_description> &vars,
int parser_type) const = 0;
virtual std::string gen_fetch_function_result_begin(const std::string &parser_name, const std::string &class_name,
@@ -138,12 +141,12 @@ class TL_writer {
virtual std::string gen_fetch_switch_case(const tl_combinator *t, int arity) const = 0;
virtual std::string gen_fetch_switch_end() const = 0;
- virtual std::string gen_constructor_begin(int fields_num, const std::string &class_name, bool is_default) const = 0;
+ virtual std::string gen_constructor_begin(int field_count, const std::string &class_name, bool is_default) const = 0;
virtual std::string gen_constructor_parameter(int field_num, const std::string &class_name, const arg &a,
bool is_default) const = 0;
virtual std::string gen_constructor_field_init(int field_num, const std::string &class_name, const arg &a,
bool is_default) const = 0;
- virtual std::string gen_constructor_end(const tl_combinator *t, int fields_num, bool is_default) const = 0;
+ virtual std::string gen_constructor_end(const tl_combinator *t, int field_count, bool is_default) const = 0;
virtual std::string gen_additional_function(const std::string &function_name, const tl_combinator *t,
bool is_function) const;