Protobuf: split primary constructor with default-arguments into empty primary constructor and secondary constructor
This commit is contained in:
+32
-7
@@ -31,8 +31,11 @@ void ClassGenerator::generateCode(io::Printer *printer, bool isBuilder) const {
|
||||
// Generate field for errors code
|
||||
printer->Print("var errorCode: Int = 0\n\n");
|
||||
|
||||
// Generate construction routines
|
||||
generateInitSection(printer);
|
||||
printer->Print("\n");
|
||||
generateConstructor(printer, isBuilder);
|
||||
printer->Print("\n");
|
||||
|
||||
|
||||
// enum declarations and nested classes declarations only for fair classes
|
||||
@@ -218,24 +221,45 @@ void ClassGenerator::generateWriteToMethod(io::Printer *printer) const {
|
||||
printer->Print("}\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ClassGenerator::generateHeader(io::Printer * printer, bool isBuilder) const {
|
||||
void ClassGenerator::generateConstructor(io::Printer * printer, bool isBuilder) const {
|
||||
// build list of arguments like 'field1: Type1, field2: Type2, ... '
|
||||
string argumentList = "";
|
||||
for (int i = 0; i < properties.size(); ++i) {
|
||||
argumentList += properties[i]->simpleName + ": " + properties[i]->getFullType() + " = " + properties[i]->getInitValue();
|
||||
argumentList += properties[i]->simpleName + ": " + properties[i]->getFullType();
|
||||
if (i + 1 != properties.size()) {
|
||||
argumentList += ", ";
|
||||
}
|
||||
}
|
||||
|
||||
map <string, string> vars;
|
||||
vars["name"] = isBuilder ? getBuidlerSimpleType() : getSimpleType();
|
||||
vars["private"] = isBuilder ? "" : "private ";
|
||||
vars["arguments"] = argumentList;
|
||||
printer->Print(vars, "$private$constructor ($arguments$) : this() {\n");
|
||||
printer->Indent();
|
||||
|
||||
for (int i = 0; i < properties.size(); ++i) {
|
||||
map <string, string> vars;
|
||||
vars["name"] = properties[i]->simpleName;
|
||||
vars["initVal"] = properties[i]->getInitValue();
|
||||
printer->Print(vars,
|
||||
"this.$name$ = $name$"
|
||||
"\n"
|
||||
);
|
||||
}
|
||||
|
||||
printer->Outdent();
|
||||
printer->Print("}\n");
|
||||
}
|
||||
|
||||
void ClassGenerator::generateHeader(io::Printer * printer, bool isBuilder) const {
|
||||
|
||||
|
||||
map<string, string> vars;
|
||||
vars["name"] = isBuilder? getBuidlerSimpleType() : getSimpleType();
|
||||
vars["argumentList"] = argumentList;
|
||||
vars["maybePrivate"] = isBuilder? "" : " private";
|
||||
printer->Print(vars,
|
||||
"class $name$$maybePrivate$ constructor ($argumentList$) {"
|
||||
"class $name$$maybePrivate$ constructor () {"
|
||||
"\n"
|
||||
);
|
||||
}
|
||||
@@ -268,8 +292,9 @@ void ClassGenerator::generateInitSection(io::Printer * printer) const {
|
||||
for (int i = 0; i < properties.size(); ++i) {
|
||||
map <string, string> vars;
|
||||
vars["name"] = properties[i]->simpleName;
|
||||
vars["initVal"] = properties[i]->getInitValue();
|
||||
printer->Print(vars,
|
||||
"this.$name$ = $name$"
|
||||
"this.$name$ = $initVal$"
|
||||
"\n"
|
||||
);
|
||||
}
|
||||
|
||||
+11
-11
@@ -37,23 +37,23 @@ public:
|
||||
|
||||
void generateCode (io::Printer * printer, bool isBuilder = false) const;
|
||||
private:
|
||||
Descriptor const * descriptor;
|
||||
NameResolver * nameResolver;
|
||||
void generateBuilder (io::Printer * printer) const;
|
||||
void generateBuildMethod (io::Printer * printer) const;
|
||||
void generateInitSection (io::Printer * printer) const;
|
||||
|
||||
/**
|
||||
* Flag isBuilder used for reducing code repeating, as code for class itself
|
||||
* and for its inner builder are structurally very alike and can be generated
|
||||
* with very little differences (like changing 'val's to 'var's and etc.)
|
||||
*/
|
||||
void generateHeader(io::Printer * printer, bool isBuilder = false) const;
|
||||
Descriptor const * descriptor;
|
||||
NameResolver * nameResolver;
|
||||
|
||||
void generateWriteToMethod(io::Printer *printer) const;
|
||||
void generateMergeMethods(io::Printer *printer) const;
|
||||
void generateParseMethods(io::Printer * printer) const;
|
||||
void generateGetSizeMethod(io::Printer * printer) const;
|
||||
void generateHeader (io::Printer * printer, bool isBuilder = false) const;
|
||||
void generateConstructor (io::Printer * printer, bool isBuilder = false) const;
|
||||
void generateBuilder (io::Printer * printer) const;
|
||||
void generateBuildMethod (io::Printer * printer) const;
|
||||
void generateInitSection (io::Printer * printer) const;
|
||||
void generateWriteToMethod (io::Printer * printer) const;
|
||||
void generateMergeMethods (io::Printer * printer) const;
|
||||
void generateParseMethods (io::Printer * printer) const;
|
||||
void generateGetSizeMethod (io::Printer * printer) const;
|
||||
};
|
||||
|
||||
} // namespace kotlin
|
||||
|
||||
Reference in New Issue
Block a user