templates.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /*
  2. * MIT License
  3. *
  4. * Copyright (c) 2019 Alexey Edelev <semlanik@gmail.com>, Tatyana Borisova <tanusshhka@mail.ru>
  5. *
  6. * This file is part of qtprotobuf project https://git.semlanik.org/semlanik/qtprotobuf
  7. *
  8. * Permission is hereby granted, free of charge, to any person obtaining a copy of this
  9. * software and associated documentation files (the "Software"), to deal in the Software
  10. * without restriction, including without limitation the rights to use, copy, modify,
  11. * merge, publish, distribute, sublicense, and/or sell copies of the Software, and
  12. * to permit persons to whom the Software is furnished to do so, subject to the following
  13. * conditions:
  14. *
  15. * The above copyright notice and this permission notice shall be included in all copies
  16. * or substantial portions of the Software.
  17. *
  18. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  19. * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  20. * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
  21. * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  22. * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  23. * DEALINGS IN THE SOFTWARE.
  24. */
  25. #include "templates.h"
  26. using namespace qtprotobuf::generator;
  27. const char *Templates::DefaultProtobufIncludesTemplate = "#include <QMetaType>\n"
  28. "#include <QList>\n"
  29. "#include <QtQml/QQmlListProperty>\n"
  30. "#include <qprotobufobject.h>\n"
  31. "#include <qqmllistpropertyconstructor.h>\n"
  32. "#include <unordered_map>\n"
  33. "#include <QSharedPointer>\n\n";
  34. const char *Templates::GlobalEnumClassNameTemplate = "GlobalEnums";
  35. const char *Templates::DisclaimerTemplate = "/* This file is autogenerated. DO NOT CHANGE. All changes will be lost */\n\n";
  36. const char *Templates::PreambleTemplate = "#pragma once\n\n"
  37. "#include <QObject>\n";
  38. const char *Templates::InternalIncludeTemplate = "#include \"$include$.h\"\n";
  39. const char *Templates::ExternalIncludeTemplate = "#include <$include$>\n";
  40. const char *Templates::GlobalEnumIncludeTemplate = "#include <globalenums.h>\n";
  41. const char *Templates::UsingQtProtobufNamespaceTemplate = "\nusing namespace qtprotobuf;\n";
  42. const char *Templates::ComplexTypeRegistrationTemplate = "namespace $classname$Private {\n"
  43. "void registerTypes()\n{\n"
  44. " qRegisterMetaType<$classname$>(\"$classname$\");\n"
  45. " qRegisterMetaType<$classname$List>(\"$classname$List\");\n"
  46. " qRegisterMetaType<$classname$>(\"$namespaces$::$classname$\");\n"
  47. " qRegisterMetaType<$classname$List>(\"$namespaces$::$classname$List\");\n"
  48. "";
  49. const char *Templates::ComplexGlobalEnumRegistrationTemplate = "namespace $classname$Private {\n"
  50. "void registerTypes()\n{\n";
  51. const char *Templates::ComplexGlobalEnumFieldRegistrationTemplate = "qRegisterMetaType<$classname$::$enum$>(\"$namespaces$::$classname$::$enum$\");\n";
  52. const char *Templates::ComplexListTypeUsingTemplate = "using $classname$List = QList<QSharedPointer<$classname$>>;\n";
  53. const char *Templates::MapTypeUsingTemplate = "using $classname$ = QMap<$key$, $value$>;\n";
  54. const char *Templates::MessageMapTypeUsingTemplate = "using $classname$ = QMap<$key$, QSharedPointer<$value$>>;\n";
  55. const char *Templates::EnumTypeUsingTemplate = "using $enum$List = QList<$enum$>;\n";
  56. const char *Templates::NamespaceTemplate = "\nnamespace $namespace$ {\n";
  57. const char *Templates::UsingNamespaceTemplate = "using namespace $namespace$;\n";
  58. const char *Templates::NonProtoClassDefinitionTemplate = "\nclass $classname$ : public QObject\n"
  59. "{\n"
  60. " Q_OBJECT\n";
  61. const char *Templates::ProtoClassDefinitionTemplate = "\nclass $classname$ : public QObject\n"
  62. "{\n"
  63. " Q_OBJECT\n"
  64. " Q_PROTOBUF_OBJECT\n"
  65. " Q_DECLARE_PROTOBUF_SERIALIZERS($classname$)\n";
  66. const char *Templates::PropertyTemplate = "Q_PROPERTY($type$ $property_name$ READ $property_name$ WRITE set$property_name_cap$ NOTIFY $property_name$Changed)\n";
  67. const char *Templates::MessagePropertyTemplate = "Q_PROPERTY($type$ *$property_name$ READ $property_name$_p WRITE set$property_name_cap$_p NOTIFY $property_name$Changed)\n";
  68. const char *Templates::QmlListPropertyTemplate = "Q_PROPERTY(QQmlListProperty<$type_nolist$> $property_name$Data READ $property_name$_l NOTIFY $property_name$Changed)\n";
  69. const char *Templates::MemberTemplate = "$type$ m_$property_name$;\n";
  70. const char *Templates::EnumMemberTemplate = "::$type$ m_$property_name$;\n";
  71. const char *Templates::PublicBlockTemplate = "\npublic:\n";
  72. const char *Templates::PrivateBlockTemplate = "\nprivate:\n";
  73. const char *Templates::EnumDefinitionTemplate = "enum $enum$ {\n";
  74. const char *Templates::EnumFieldTemplate = "$enumvalue$ = $value$,\n";
  75. const char *Templates::ProtoConstructorTemplate = "$classname$($parameter_list$QObject *parent = nullptr);\n";
  76. const char *Templates::ProtoConstructorDefinitionTemplate = "$classname$::$classname$($parameter_list$QObject *parent) : QObject(parent)";
  77. const char *Templates::ConstructorTemplate = "$classname$();\n";
  78. const char *Templates::ConstructorHeaderTemplate = "$classname$(){}\n";
  79. const char *Templates::CopyConstructorTemplate = "$classname$(const $classname$ &other) : QObject() {\n";
  80. const char *Templates::MoveConstructorTemplate = "$classname$($classname$ &&other) : QObject() {\n";
  81. const char *Templates::DeletedCopyConstructorTemplate = "$classname$(const $classname$ &) = delete;\n";
  82. const char *Templates::DeletedMoveConstructorTemplate = "$classname$($classname$ &&) = delete;\n";
  83. const char *Templates::CopyFieldTemplate = "m_$property_name$ = other.m_$property_name$;\n";
  84. const char *Templates::MoveComplexFieldTemplate = "m_$property_name$ = std::move(other.m_$property_name$);\n";
  85. const char *Templates::MoveFieldTemplate = "m_$property_name$ = std::exchange(other.m_$property_name$, 0);\n";
  86. const char *Templates::EnumMoveFieldTemplate = "m_$property_name$ = other.m_$property_name$;\n";
  87. const char *Templates::AssignmentOperatorTemplate = "$classname$ &operator =(const $classname$ &other) {\n";
  88. const char *Templates::AssignmentOperatorReturnTemplate = "return *this;\n";
  89. const char *Templates::MoveAssignmentOperatorTemplate = "$classname$ &operator =($classname$ &&other) {\n";
  90. const char *Templates::EqualOperatorTemplate = "bool operator ==(const $type$ &other) const {\n"
  91. " return ";
  92. const char *Templates::EqualOperatorPropertyTemplate = "m_$property_name$ == other.m_$property_name$";
  93. const char *Templates::NotEqualOperatorTemplate = "bool operator !=(const $type$ &other) const {\n"
  94. " return !this->operator ==(other);\n"
  95. "}\n\n";
  96. const char *Templates::GetterMessageTemplate = "$type$ *$property_name$_p() const {\n" //formally const...
  97. " return const_cast<$type$*>(&m_$property_name$);\n"
  98. "}\n\n";
  99. const char *Templates::GetterTemplate = "$type$ $property_name$() const {\n"
  100. " return m_$property_name$;\n"
  101. "}\n\n";
  102. const char *Templates::GetterContainerExtraTemplate = "$type$ &$property_name$() {\n"
  103. " return m_$property_name$;\n"
  104. "}\n\n";
  105. const char *Templates::QmlListGetterTemplate = "QQmlListProperty<$type_nolist$> $property_name$_l() {\n"
  106. " return qtprotobuf::constructQmlListProperty<$type_nolist$>(this, &m_$property_name$);\n"
  107. "}\n\n";
  108. const char *Templates::SetterTemplateMessageType = "void set$property_name_cap$_p($type$ *$property_name$) {\n"
  109. " if ($property_name$ == nullptr) {\n"
  110. " m_$property_name$ = {};\n"
  111. " }\n"
  112. " if (m_$property_name$ != *$property_name$) {\n"
  113. " m_$property_name$ = *$property_name$;\n"
  114. " $property_name$Changed();\n"
  115. " }\n"
  116. " //NOTE: take ownership of value\n"
  117. " delete $property_name$;\n"
  118. "}\n\n";
  119. const char *Templates::SetterTemplateComplexType = "void set$property_name_cap$(const $type$ &$property_name$) {\n"
  120. " if (m_$property_name$ != $property_name$) {\n"
  121. " m_$property_name$ = $property_name$;\n"
  122. " $property_name$Changed();\n"
  123. " }\n"
  124. "}\n\n";
  125. const char *Templates::SetterTemplateSimpleType = "void set$property_name_cap$(const $type$ &$property_name$) {\n"
  126. " if (m_$property_name$ != $property_name$) {\n"
  127. " m_$property_name$ = $property_name$;\n"
  128. " $property_name$Changed();\n"
  129. " }\n"
  130. "}\n\n";
  131. const char *Templates::SignalsBlockTemplate = "\nsignals:\n";
  132. const char *Templates::SignalTemplate = "void $property_name$Changed();\n";
  133. const char *Templates::FieldsOrderingContainerTemplate = "const qtprotobuf::QProtobufPropertyOrdering $type$::propertyOrdering = {";
  134. const char *Templates::FieldOrderTemplate = "{$field_number$, $property_number$}";
  135. const char *Templates::EnumTemplate = "$type$";
  136. const char *Templates::SimpleBlockEnclosureTemplate = "}\n\n";
  137. const char *Templates::SemicolonBlockEnclosureTemplate = "};\n";
  138. const char *Templates::EmptyBlockTemplate = "{}\n\n";
  139. const char *Templates::PropertyInitializerTemplate = "\n , m_$property_name$($property_name$)";
  140. const char *Templates::ConstructorContentTemplate = "\n{\n}\n";
  141. const char *Templates::DeclareMetaTypeTemplate = "Q_DECLARE_METATYPE($namespaces$::$classname$)\n";
  142. const char *Templates::DeclareMetaTypeListTemplate = "Q_DECLARE_METATYPE($namespaces$::$classname$List)\n";
  143. const char *Templates::DeclareMessageMetaTypeTemplate = "Q_DECLARE_METATYPE($namespaces$::$classname$)\n"
  144. "Q_DECLARE_OPAQUE_POINTER($namespaces$::$classname$)\n";
  145. const char *Templates::DeclareComplexListTypeTemplate = "Q_DECLARE_METATYPE($namespaces$::$classname$List)\n"
  146. "Q_DECLARE_METATYPE(QQmlListProperty<$namespaces$::$classname$>)\n";
  147. const char *Templates::RegisterMetaTypeDefaultTemplate = "qRegisterMetaType<$namespaces$::$type$>();\n";
  148. const char *Templates::RegisterMetaTypeTemplateNoNamespace = "qRegisterMetaType<$namespaces$::$type$>(\"$type$\");\n";
  149. const char *Templates::RegisterMetaTypeTemplate = "qRegisterMetaType<$namespaces$::$type$>(\"$namespaces$::$type$\");\n";
  150. const char *Templates::RegisterQmlListPropertyMetaTypeTemplate = "qRegisterMetaType<QQmlListProperty<$namespaces$::$classname$>>(\"QQmlListProperty<$namespaces$::$classname$>\");\n"
  151. "qRegisterMetaType<QQmlListProperty<$namespaces$::$classname$>>(\"QQmlListProperty<$classname$>\");\n";
  152. const char *Templates::QEnumTemplate = "Q_ENUM($type$)\n";
  153. const char *Templates::MapSerializationRegisterTemplate = "qtprotobuf::QProtobufSerializerRegistry::registerMap<$key_type$, $value_type$>();\n";
  154. const char *Templates::ClassDefinitionTemplate = "\nclass $classname$ : public $parent_class$\n"
  155. "{\n";
  156. const char *Templates::QObjectMacro = "Q_OBJECT";
  157. const char *Templates::ClientMethodDeclarationSyncTemplate = "Q_INVOKABLE bool $method_name$(const $param_type$ &$param_name$, const QPointer<$return_type$> &$return_name$);\n";
  158. const char *Templates::ClientMethodDeclarationAsyncTemplate = "Q_INVOKABLE qtprotobuf::QGrpcAsyncReply *$method_name$(const $param_type$ &$param_name$);\n";
  159. const char *Templates::ClientMethodDeclarationAsync2Template = "Q_INVOKABLE void $method_name$(const $param_type$ &$param_name$, const QObject *context, const std::function<void(qtprotobuf::QGrpcAsyncReply *)> &callback);\n";
  160. const char *Templates::ServerMethodDeclarationTemplate = "Q_INVOKABLE virtual $return_type$ $method_name$(const $param_type$ &$param_name$) = 0;\n";
  161. const char *Templates::ConstructorDefinitionSyncTemplate = "\n$classname$::$classname$() : $parent_class$(\"$service_name$\")\n"
  162. "{\n"
  163. "}\n";
  164. const char *Templates::ClientMethodDefinitionSyncTemplate = "\nbool $classname$::$method_name$(const $param_type$ &$param_name$, const QPointer<$return_type$> &$return_name$)\n"
  165. "{\n"
  166. " return call(\"$method_name$\", $param_name$, $return_name$);\n"
  167. "}\n";
  168. const char *Templates::ClientMethodDefinitionAsyncTemplate = "\nqtprotobuf::QGrpcAsyncReply *$classname$::$method_name$(const $param_type$ &$param_name$)\n"
  169. "{\n"
  170. " return call(\"$method_name$\", $param_name$);\n"
  171. "}\n";
  172. const char *Templates::ClientMethodDefinitionAsync2Template = "\nvoid $classname$::$method_name$(const $param_type$ &$param_name$, const QObject *context, const std::function<void(QGrpcAsyncReply *)> &callback)\n"
  173. "{\n"
  174. " qtprotobuf::QGrpcAsyncReply *reply = call(\"$method_name$\", $param_name$);\n"
  175. " QObject::connect(reply, &qtprotobuf::QGrpcAsyncReply::finished, context, [reply, callback](){\n"
  176. " callback(reply);\n"
  177. " });\n"
  178. "}\n";
  179. const char *Templates::RegisterSerializersTemplate = "qtprotobuf::QProtobufSerializerRegistry::registerSerializers<$classname$>();\n";
  180. const char *Templates::RegistratorTemplate = "static qtprotobuf::QProtobufRegistrationHelper helper(registerTypes);\n";
  181. const char *Templates::QmlRegisterTypeTemplate = "qmlRegisterType<$namespaces$::$classname$>(\"$package$\", 1, 0, \"$classname$\");\n";
  182. const char *Templates::QmlRegisterTypeUncreatableTemplate = "qmlRegisterUncreatableType<$namespaces$::$classname$>(\"$package$\", 1, 0, \"$classname$\", \"$namespaces$::$classname$ Could not be created from qml context\");\n";
  183. const char *Templates::ClientMethodSignalDeclarationTemplate = "Q_SIGNAL void $method_name$Updated(const $return_type$ &);\n";
  184. const char *Templates::ClientMethodServerStreamDeclarationTemplate = "void subscribe$method_name_upper$Updates(const $param_type$ &$param_name$);\n";
  185. const char *Templates::ClientMethodServerStream2DeclarationTemplate = "void subscribe$method_name_upper$Updates(const $param_type$ &$param_name$, const QPointer<$return_type$> &$return_name$);\n";
  186. const char *Templates::ClientMethodServerStreamDefinitionTemplate = "void $classname$::subscribe$method_name_upper$Updates(const $param_type$ &$param_name$)\n"
  187. "{\n"
  188. " subscribe(\"$method_name$\", $param_name$, &$classname$::$method_name$Updated);\n"
  189. "}\n";
  190. const char *Templates::ClientMethodServerStream2DefinitionTemplate = "void $classname$::subscribe$method_name_upper$Updates(const $param_type$ &$param_name$, const QPointer<$return_type$> &$return_name$)\n"
  191. "{\n"
  192. " subscribe(\"$method_name$\", $param_name$, $return_name$);\n"
  193. " subscribe(\"$method_name$\", $param_name$, &$classname$::$method_name$Updated);\n"
  194. "}\n";
  195. const std::unordered_map<::google::protobuf::FieldDescriptor::Type, std::string> Templates::TypeReflection = {
  196. {::google::protobuf::FieldDescriptor::TYPE_DOUBLE, "double"},
  197. {::google::protobuf::FieldDescriptor::TYPE_FLOAT, "float"},
  198. {::google::protobuf::FieldDescriptor::TYPE_INT64, "int64"}, //Limited usage see https://doc.qt.io/qt-5/qtqml-typesystem-basictypes.html
  199. {::google::protobuf::FieldDescriptor::TYPE_UINT64,"uint64"}, //Limited usage see https://doc.qt.io/qt-5/qtqml-typesystem-basictypes.html
  200. {::google::protobuf::FieldDescriptor::TYPE_INT32, "int32"},
  201. {::google::protobuf::FieldDescriptor::TYPE_FIXED64, "fixed64"}, //Limited usage see https://doc.qt.io/qt-5/qtqml-typesystem-basictypes.html
  202. {::google::protobuf::FieldDescriptor::TYPE_FIXED32, "fixed32"},
  203. {::google::protobuf::FieldDescriptor::TYPE_BOOL, "bool"},
  204. {::google::protobuf::FieldDescriptor::TYPE_STRING, "QString"},
  205. {::google::protobuf::FieldDescriptor::TYPE_BYTES, "QByteArray"},
  206. {::google::protobuf::FieldDescriptor::TYPE_UINT32, "uint32"}, //Limited usage see https://doc.qt.io/qt-5/qtqml-typesystem-basictypes.html
  207. {::google::protobuf::FieldDescriptor::TYPE_SFIXED32, "sfixed32"},
  208. {::google::protobuf::FieldDescriptor::TYPE_SFIXED64, "sfixed64"}, //Limited usage see https://doc.qt.io/qt-5/qtqml-typesystem-basictypes.html
  209. {::google::protobuf::FieldDescriptor::TYPE_SINT32, "sint32"},
  210. {::google::protobuf::FieldDescriptor::TYPE_SINT64, "sint64"} //Limited usage see https://doc.qt.io/qt-5/qtqml-typesystem-basictypes.html
  211. };