Sfoglia il codice sorgente

Add global enums generator

Alexey Edelev 6 anni fa
parent
commit
1d2b356425

+ 1 - 1
CMakeLists.txt

@@ -4,7 +4,7 @@ project(qtprotobuf)
 
 find_package(Protobuf)
 
-add_executable(${PROJECT_NAME} "src/generator/main.cpp" "src/generator/generator.cpp")
+add_executable(${PROJECT_NAME} "src/generator/main.cpp" "src/generator/generator.cpp" "src/generator/enumsgenerator.cpp")
 target_link_libraries(${PROJECT_NAME} ${Protobuf_LIBRARIES} "-lprotoc")
 
 install(TARGETS ${PROJECT_NAME}

+ 48 - 0
src/generator/enumsgenerator.cpp

@@ -0,0 +1,48 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2019 Alexey Edelev <semlanik@gmail.com>
+ *
+ * This file is part of qtprotobuf project https://git.semlanik.org/semlanik/qtprotobuf
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this
+ * software and associated documentation files (the "Software"), to deal in the Software
+ * without restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and
+ * to permit persons to whom the Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies
+ * or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "enumsgenerator.h"
+
+#include <google/protobuf/io/zero_copy_stream.h>
+
+using namespace qtprotobuf;
+using namespace google::protobuf;
+using namespace google::protobuf::io;
+
+GlobalEnumsGenerator::GlobalEnumsGenerator(std::unique_ptr<ZeroCopyOutputStream> out) : mOutput(std::move(out))
+  , mPrinter(mOutput.get(), '$')
+{
+}
+
+void GlobalEnumsGenerator::run(const FileDescriptor* file)
+{
+    if (file->enum_type_count() <= 0) {
+        return;
+    }
+//TODO:
+    for(int i = 0; i < file->enum_type_count(); i++) {
+
+    }
+}

+ 50 - 0
src/generator/enumsgenerator.h

@@ -0,0 +1,50 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2019 Alexey Edelev <semlanik@gmail.com>
+ *
+ * This file is part of qtprotobuf project https://git.semlanik.org/semlanik/qtprotobuf
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this
+ * software and associated documentation files (the "Software"), to deal in the Software
+ * without restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and
+ * to permit persons to whom the Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies
+ * or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#pragma once
+
+#include <string>
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/io/printer.h>
+
+namespace google { namespace protobuf {
+class FileDescriptor;
+namespace io {
+class ZeroCopyOutputStream;
+}
+}}
+
+namespace qtprotobuf {
+
+class GlobalEnumsGenerator
+{
+    std::unique_ptr<::google::protobuf::io::ZeroCopyOutputStream> mOutput;
+    ::google::protobuf::io::Printer mPrinter;
+public:
+    GlobalEnumsGenerator(std::unique_ptr<::google::protobuf::io::ZeroCopyOutputStream> out);
+    void run(const ::google::protobuf::FileDescriptor* file);
+};
+
+}

+ 6 - 3
src/generator/generator.cpp

@@ -25,8 +25,7 @@
 
 #include "generator.h"
 #include "templates.h"
-
-#include <google/protobuf/descriptor.pb.h>
+#include "enumsgenerator.h"
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
@@ -81,7 +80,7 @@ static std::unordered_map<FieldDescriptor::Type, std::string> TypeReflection = {
 
 class QtClassGenerator {
     std::unique_ptr<io::ZeroCopyOutputStream> mOutput;
-    string mPackage;
+    std::string mPackage;
     const Descriptor* mMessage;
     int mNamespaceCount;
     io::Printer mPrinter;
@@ -123,6 +122,7 @@ private:
             {"property_name_cap", capProperty}};
         return true;
     }
+
     void printPreamble() {
         mPrinter.Print("#pragma once\n"
                        "#include <QObject>\n");
@@ -300,5 +300,8 @@ bool QtGenerator::Generate(const FileDescriptor* file,
         classGen.run();
     }
 
+    std::string globalEnumsFilename = file->package() + "globalenums.h";
+    GlobalEnumsGenerator enumGen(std::move(std::unique_ptr<io::ZeroCopyOutputStream>(generator_context->Open(globalEnumsFilename))));
+    enumGen.run(file);
     return true;
 }