Prechádzať zdrojové kódy

Move most of templates to header

- Move templates to template.h
- Fix couble generation issues
Alexey Edelev 6 rokov pred
rodič
commit
813294825c
2 zmenil súbory, kde vykonal 33 pridanie a 24 odobranie
  1. 16 13
      src/generator/classgeneratorbase.cpp
  2. 17 11
      src/generator/templates.h

+ 16 - 13
src/generator/classgeneratorbase.cpp

@@ -117,7 +117,7 @@ void ClassGeneratorBase::printNamespaces(const std::string &package)
 
 void ClassGeneratorBase::printClass()
 {
-    mPrinter.Print({{"classname", mClassName}}, StartTemplate);
+    mPrinter.Print({{"classname", mClassName}}, ClassDefinitionTemplate);
 }
 
 void ClassGeneratorBase::printProperties(const Descriptor *message)
@@ -148,7 +148,7 @@ void ClassGeneratorBase::printProperties(const Descriptor *message)
             printField(field, SetterTemplateSimpleType);
         }
     }
-    mPrinter.Print("\nsignals:\n");
+    mPrinter.Print(SignalsBlockTemplate);
     for (int i = 0; i < message->field_count(); i++) {
         printField(message->field(i), SignalTemplate);
     }
@@ -164,7 +164,7 @@ void ClassGeneratorBase::printField(const FieldDescriptor *field, const char *fi
 
 void ClassGeneratorBase::enclose()
 {
-    mPrinter.Print("};\n");
+    mPrinter.Print(SemicolonBlockEnclosureTemplate);
     while (mNamespaceCount > 0) {
         mPrinter.Print(SimpleBlockEnclosureTemplate);
         --mNamespaceCount;
@@ -203,28 +203,30 @@ std::string ClassGeneratorBase::getTypeName(const FieldDescriptor *field)
 void ClassGeneratorBase::printCopyFunctionality(const ::google::protobuf::Descriptor *message)
 {
     mPrinter.Print({{"classname", mClassName}},
-                   "    $classname$(const $classname$ &other) : QObject(other.parent()) {\n");
+                   CopyConstructorTemplate);
 
     for (int i = 0; i < message->field_count(); i++) {
-        printField(message->field(i), CopyClassFunctionalityTemplate);
+        printField(message->field(i), CopyFieldTemplate);
     }
 
-    mPrinter.Print("    }\n\n");
+    mPrinter.Print("    ");
+    mPrinter.Print(SimpleBlockEnclosureTemplate);
     mPrinter.Print({{"classname", mClassName}},
-                   "    $classname$ &operator =(const $classname$ &other) {\n");
+                   AssignmentOperatorTemplate);
 
     for (int i = 0; i < message->field_count(); i++) {
-        printField(message->field(i), CopyClassFunctionalityTemplate);
+        printField(message->field(i), CopyFieldTemplate);
     }
 
-    mPrinter.Print("    }\n\n");
+    mPrinter.Print("    ");
+    mPrinter.Print(SimpleBlockEnclosureTemplate);
 
 }
 
 void ClassGeneratorBase::printConstructor()
 {
     mPrinter.Print({{"classname", mClassName}},
-                   "    $classname$(QObject *parent = nullptr) : QObject(parent)\n");
+                   ConstructorTemplate);
 
     //FIXME: Explicit default values are not allowed in proto3 seems
     //this function is useless
@@ -272,14 +274,14 @@ void ClassGeneratorBase::printConstructor()
 
 void ClassGeneratorBase::printPublic()
 {
-    mPrinter.Print("\npublic:\n");
+    mPrinter.Print(PublicBlockTemplate);
 }
 
 void ClassGeneratorBase::printEqualOperator(const Descriptor *message)
 {
     bool isFirst = true;
     PropertyMap properties;
-    mPrinter.Print({{"type", message->name()}}, EqualOperatorTemplate);
+    mPrinter.Print({{"type", mClassName}}, EqualOperatorTemplate);
     for (int i = 1; i < message->field_count(); i++) {
         const FieldDescriptor* field = message->field(i);
         if (producePropertyMap(field, properties)) {
@@ -290,6 +292,7 @@ void ClassGeneratorBase::printEqualOperator(const Descriptor *message)
             mPrinter.Print(properties, EqualOperatorPropertyTemplate);
         }
     }
-    mPrinter.Print(";\n    ");
+    mPrinter.Print(";\n");
+    mPrinter.Print("    ");
     mPrinter.Print(SimpleBlockEnclosureTemplate);
 }

+ 17 - 11
src/generator/templates.h

@@ -35,16 +35,27 @@ static const char *PreambleTemplate = "/* This file is autogenerated. DO NOT CHA
                                       "#pragma once\n"
                                      "#include <QObject>\n";
 
-static const char *StartTemplate = "\nclass $classname$ : public QObject\n"
-                      "{\n"
-                      "    Q_OBJECT\n";
+static const char *InternalIncludeTemplate =  "#include \"$type_lower$.h\"\n";
+static const char *ExternalIncludeTemplate = "#include <$type$>\n";
 
 static const char *NamespaceTemplate = "\nnamespace $namespace$\n"
                                   "{\n\n";
 
-static const char *CopyClassFunctionalityTemplate = "        m_$property_name$ = other.m_$property_name$;\n";
+static const char *ClassDefinitionTemplate = "\nclass $classname$ : public QObject\n"
+                      "{\n"
+                      "    Q_OBJECT\n";
 
 static const char *PropertyTemplate = "    Q_PROPERTY($type$ $property_name$ READ $property_name$ WRITE set$property_name_cap$ NOTIFY $property_name$Changed)\n";
+static const char *MemberTemplate = "    $type$ m_$property_name$;\n";
+static const char *PublicBlockTemplate = "\npublic:\n";
+static const char *ConstructorTemplate = "    $classname$(QObject *parent = nullptr) : QObject(parent)\n";
+static const char *CopyConstructorTemplate = "    $classname$(const $classname$ &other) {\n";
+static const char *CopyFieldTemplate = "        m_$property_name$ = other.m_$property_name$;\n";
+static const char *AssignmentOperatorTemplate = "    $classname$ &operator =(const $classname$ &other) {\n";
+static const char *EqualOperatorTemplate = "    bool operator ==(const $type$ &other) {\n"
+                                          "        return ";
+static const char *EqualOperatorPropertyTemplate = "m_$property_name$ == other.m_$property_name$";
+
 static const char *GetterTemplate = "    $type$ $property_name$() const {\n"
                                     "        return m_$property_name$;\n"
                                     "    }\n";
@@ -63,19 +74,14 @@ static const char *SetterTemplateComplexType = "    void set$property_name_cap$(
                                               "        }\n"
                                               "    }\n";
 
+static const char *SignalsBlockTemplate = "\nsignals:\n";
 static const char *SignalTemplate = "    void $property_name$Changed();\n";
-static const char *MemberTemplate = "    $type$ m_$property_name$;\n";
-
-static const char *InternalIncludeTemplate =  "#include \"$type_lower$.h\"\n";
-static const char *ExternalIncludeTemplate = "#include <$type$>\n";
 
 static const char *EnumTemplate = "$type$";
 static const char *ModelClassTemplate = "using $type$Model = UniversalListModel<$type$>;\n";
 
-static const char *EqualOperatorTemplate = "    bool operator ==(const $type$ &other) {\n"
-                                          "        return ";
-static const char *EqualOperatorPropertyTemplate = "m_$property_name$ == other.m_$property_name$";
 static const char *SimpleBlockEnclosureTemplate = "}\n\n";
+static const char *SemicolonBlockEnclosureTemplate = "};\n";
 
 static const std::unordered_map<::google::protobuf::FieldDescriptor::Type, std::string> TypeReflection = {
     {::google::protobuf::FieldDescriptor::TYPE_DOUBLE, "qreal"},