Protobuf: split primary constructor with default-arguments into empty primary constructor and secondary constructor

This commit is contained in:
dsavvinov
2016-08-09 16:18:28 +03:00
parent 7e08333cde
commit 278a43750f
2 changed files with 43 additions and 18 deletions
@@ -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"
);
}
@@ -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