diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc index c1c63afb766..17189080888 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc @@ -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 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 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 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 vars; vars["name"] = properties[i]->simpleName; + vars["initVal"] = properties[i]->getInitValue(); printer->Print(vars, - "this.$name$ = $name$" + "this.$name$ = $initVal$" "\n" ); } diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h index 62b59c5d4a0..2d24c870bc4 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h @@ -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