mirror of
https://github.com/protocolbuffers/protobuf
synced 2026-08-26 02:23:14 -04:00
Simplify has-bit template variable names in Java immutable generators.
Since builder and message bit indices are now unified (single bit_index_), suffixing has-bit template variables with `_builder` or `_message` is redundant. Simplify variable names across Java immutable field generators: - `set_has_field_bit_builder` -> `set_has_field_bit` - `get_has_field_bit_builder` -> `get_has_field_bit` - `clear_has_field_bit_builder` -> `clear_has_field_bit` - `is_field_present_message` -> `is_field_present` - `is_other_field_present_message` -> `is_other_field_present` - Remove unused `set_has_field_bit_message` in string_field.cc. PiperOrigin-RevId: 960593828
This commit is contained in:
parent
f23e709bcf
commit
2787402df4
5 changed files with 105 additions and 110 deletions
|
|
@ -75,24 +75,24 @@ void SetEnumVariables(
|
|||
// Note that these have a trailing ";".
|
||||
(*variables)["set_has_field_bit_to_local"] =
|
||||
GenerateSetBitToLocal(bit_index);
|
||||
(*variables)["is_field_present_message"] = GenerateGetBit(bit_index);
|
||||
(*variables)["is_field_present"] = GenerateGetBit(bit_index);
|
||||
} else {
|
||||
(*variables)["set_has_field_bit_to_local"] = "";
|
||||
variables->insert({"is_field_present_message",
|
||||
variables->insert({"is_field_present",
|
||||
absl::StrCat((*variables)["name"], "_ != ",
|
||||
(*variables)["default"], ".getNumber()")});
|
||||
}
|
||||
|
||||
// Always track the presence of a field explicitly in the builder, regardless
|
||||
// of syntax.
|
||||
(*variables)["get_has_field_bit_builder"] = GenerateGetBit(bit_index);
|
||||
(*variables)["get_has_field_bit"] = GenerateGetBit(bit_index);
|
||||
(*variables)["get_has_field_bit_from_local"] =
|
||||
GenerateGetBitFromLocal(bit_index);
|
||||
|
||||
// Note that these have a trailing ";".
|
||||
(*variables)["set_has_field_bit_builder"] =
|
||||
(*variables)["set_has_field_bit"] =
|
||||
absl::StrCat(GenerateSetBit(bit_index), ";");
|
||||
(*variables)["clear_has_field_bit_builder"] =
|
||||
(*variables)["clear_has_field_bit"] =
|
||||
absl::StrCat(GenerateClearBit(bit_index), ";");
|
||||
|
||||
(*variables)["unknown"] =
|
||||
|
|
@ -143,7 +143,7 @@ void ImmutableEnumFieldGenerator::GenerateMembers(io::Printer* printer) const {
|
|||
printer->Print(variables_,
|
||||
"@java.lang.Override $deprecation$public boolean "
|
||||
"${$has$capitalized_name$$}$() {\n"
|
||||
" return $is_field_present_message$;\n"
|
||||
" return $is_field_present$;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
}
|
||||
|
|
@ -177,7 +177,7 @@ void ImmutableEnumFieldGenerator::GenerateBuilderMembers(
|
|||
printer->Print(variables_,
|
||||
"@java.lang.Override $deprecation$public boolean "
|
||||
"${$has$capitalized_name$$}$() {\n"
|
||||
" return $get_has_field_bit_builder$;\n"
|
||||
" return $get_has_field_bit$;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
}
|
||||
|
|
@ -197,7 +197,7 @@ void ImmutableEnumFieldGenerator::GenerateBuilderMembers(
|
|||
"$deprecation$public Builder "
|
||||
"${$set$capitalized_name$Value$}$(int value) {\n"
|
||||
" $name$_ = value;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" onChanged();\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -219,7 +219,7 @@ void ImmutableEnumFieldGenerator::GenerateBuilderMembers(
|
|||
"$deprecation$public Builder "
|
||||
"${$set$capitalized_name$$}$($type$ value) {\n"
|
||||
" $null_check$\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $name$_ = value.getNumber();\n"
|
||||
" onChanged();\n"
|
||||
" return this;\n"
|
||||
|
|
@ -231,7 +231,7 @@ void ImmutableEnumFieldGenerator::GenerateBuilderMembers(
|
|||
printer->Print(
|
||||
variables_,
|
||||
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
|
||||
" $clear_has_field_bit_builder$\n"
|
||||
" $clear_has_field_bit$\n"
|
||||
" $name$_ = $default_number$;\n"
|
||||
" onChanged();\n"
|
||||
" return this;\n"
|
||||
|
|
@ -290,7 +290,7 @@ void ImmutableEnumFieldGenerator::GenerateBuilderParsingCode(
|
|||
if (SupportUnknownEnumValue(descriptor_)) {
|
||||
printer->Print(variables_,
|
||||
"$name$_ = input.readEnum();\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
} else {
|
||||
printer->Print(variables_,
|
||||
"int tmpRaw = input.readEnum();\n"
|
||||
|
|
@ -300,7 +300,7 @@ void ImmutableEnumFieldGenerator::GenerateBuilderParsingCode(
|
|||
" mergeUnknownVarintField($number$, tmpRaw);\n"
|
||||
"} else {\n"
|
||||
" $name$_ = tmpRaw;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
"}\n");
|
||||
}
|
||||
}
|
||||
|
|
@ -308,7 +308,7 @@ void ImmutableEnumFieldGenerator::GenerateBuilderParsingCode(
|
|||
void ImmutableEnumFieldGenerator::GenerateSerializationCode(
|
||||
io::Printer* printer) const {
|
||||
printer->Print(variables_,
|
||||
"if ($is_field_present_message$) {\n"
|
||||
"if ($is_field_present$) {\n"
|
||||
" output.writeEnum($number$, $name$_);\n"
|
||||
"}\n");
|
||||
}
|
||||
|
|
@ -316,7 +316,7 @@ void ImmutableEnumFieldGenerator::GenerateSerializationCode(
|
|||
void ImmutableEnumFieldGenerator::GenerateSerializedSizeCode(
|
||||
io::Printer* printer) const {
|
||||
printer->Print(variables_,
|
||||
"if ($is_field_present_message$) {\n"
|
||||
"if ($is_field_present$) {\n"
|
||||
" size += com.google.protobuf.CodedOutputStream\n"
|
||||
" .computeEnumSize($number$, $name$_);\n"
|
||||
"}\n");
|
||||
|
|
@ -681,7 +681,7 @@ void RepeatedImmutableEnumFieldGenerator::GenerateBuilderMembers(
|
|||
" if (!$name$_.isModifiable()) {\n"
|
||||
" $name$_ = makeMutableCopy($name$_, capacity);\n"
|
||||
" }\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
"}\n");
|
||||
|
||||
WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER,
|
||||
|
|
@ -761,7 +761,7 @@ void RepeatedImmutableEnumFieldGenerator::GenerateBuilderMembers(
|
|||
variables_,
|
||||
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
|
||||
" $name$_ = $empty_list$;\n"
|
||||
" $clear_has_field_bit_builder$\n"
|
||||
" $clear_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -855,7 +855,7 @@ void RepeatedImmutableEnumFieldGenerator::GenerateMergingCode(
|
|||
" if ($name$_.isEmpty()) {\n"
|
||||
" $name$_ = other.$name$_;\n"
|
||||
" $name_make_immutable$;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" } else {\n"
|
||||
" ensure$capitalized_name$IsMutable(/* capacity= */ -1);\n"
|
||||
" $name$_.addAll(other.$name$_);\n"
|
||||
|
|
|
|||
|
|
@ -162,12 +162,12 @@ void ImmutableMapFieldGenerator::SetMessageVariables(
|
|||
variables_["descriptor"] = absl::StrCat(
|
||||
name_resolver->GetImmutableClassName(descriptor_->file()), ".internal_",
|
||||
UniqueFileScopeIdentifier(descriptor_->message_type()), "_descriptor, ");
|
||||
variables_["get_has_field_bit_builder"] = GenerateGetBit(bit_index_);
|
||||
variables_["get_has_field_bit"] = GenerateGetBit(bit_index_);
|
||||
variables_["get_has_field_bit_from_local"] =
|
||||
GenerateGetBitFromLocal(bit_index_);
|
||||
variables_["set_has_field_bit_builder"] =
|
||||
variables_["set_has_field_bit"] =
|
||||
absl::StrCat(GenerateSetBit(bit_index_), ";");
|
||||
variables_["clear_has_field_bit_builder"] =
|
||||
variables_["clear_has_field_bit"] =
|
||||
absl::StrCat(GenerateClearBit(bit_index_), ";");
|
||||
}
|
||||
|
||||
|
|
@ -351,7 +351,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
" if (!$name$_.isMutable()) {\n"
|
||||
" $name$_ = $name$_.copy();\n"
|
||||
" }\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return $name$_;\n"
|
||||
"}\n");
|
||||
|
|
@ -359,7 +359,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
printer->Print(
|
||||
variables_,
|
||||
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
|
||||
" $clear_has_field_bit_builder$\n"
|
||||
" $clear_has_field_bit$\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap()\n"
|
||||
" .clear();\n"
|
||||
" return this;\n"
|
||||
|
|
@ -388,7 +388,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
"@java.lang.Deprecated\n"
|
||||
"public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
|
||||
" ${$getMutable$capitalized_name$$}$() {\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return internalGetAdapted$capitalized_name$Map(\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap());\n"
|
||||
"}\n");
|
||||
|
|
@ -404,7 +404,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
" $value_null_check$\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap()\n"
|
||||
" .put(key, $name$ValueConverter.doBackward(value));\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
|
|
@ -417,7 +417,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
" internalGetAdapted$capitalized_name$Map(\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap())\n"
|
||||
" .putAll(values);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
|
|
@ -432,7 +432,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
"@java.lang.Deprecated\n"
|
||||
"public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
|
||||
"${$getMutable$capitalized_name$Value$}$() {\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return internalGetMutable$capitalized_name$().getMutableMap();\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
|
|
@ -448,7 +448,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
" $value_null_check$\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap()\n"
|
||||
" .put(key, value);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
|
|
@ -460,7 +460,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
" java.util.Map<$boxed_key_type$, $boxed_value_type$> values) {\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap()\n"
|
||||
" .putAll(values);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
|
|
@ -475,7 +475,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
"@java.lang.Deprecated\n"
|
||||
"public java.util.Map<$type_parameters$>\n"
|
||||
" ${$getMutable$capitalized_name$$}$() {\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return internalGetMutable$capitalized_name$().getMutableMap();\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
|
|
@ -490,7 +490,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
" $value_null_check$\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap()\n"
|
||||
" .put(key, value);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
|
|
@ -502,7 +502,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderMembers(
|
|||
" java.util.Map<$type_parameters$> values) {\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap()\n"
|
||||
" .putAll(values);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
|
|
@ -758,7 +758,7 @@ void ImmutableMapFieldGenerator::GenerateMessageMapBuilderMembers(
|
|||
" $name$_ = new "
|
||||
"com.google.protobuf.MapFieldBuilder<>($name$Converter);\n"
|
||||
" }\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return $name$_;\n"
|
||||
"}\n");
|
||||
|
|
@ -766,7 +766,7 @@ void ImmutableMapFieldGenerator::GenerateMessageMapBuilderMembers(
|
|||
printer->Print(
|
||||
variables_,
|
||||
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
|
||||
" $clear_has_field_bit_builder$\n"
|
||||
" $clear_has_field_bit$\n"
|
||||
" internalGetMutable$capitalized_name$().clear();\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -792,7 +792,7 @@ void ImmutableMapFieldGenerator::GenerateMessageMapBuilderMembers(
|
|||
"@java.lang.Deprecated\n"
|
||||
"public java.util.Map<$type_parameters$>\n"
|
||||
" ${$getMutable$capitalized_name$$}$() {\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return internalGetMutable$capitalized_name$().ensureMessageMap();\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
|
|
@ -807,7 +807,7 @@ void ImmutableMapFieldGenerator::GenerateMessageMapBuilderMembers(
|
|||
" $value_null_check$\n"
|
||||
" internalGetMutable$capitalized_name$().ensureBuilderMap()\n"
|
||||
" .put(key, value);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
|
|
@ -823,7 +823,7 @@ void ImmutableMapFieldGenerator::GenerateMessageMapBuilderMembers(
|
|||
" }\n"
|
||||
" internalGetMutable$capitalized_name$().ensureBuilderMap()\n"
|
||||
" .putAll(values);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
|
|
@ -945,7 +945,7 @@ void ImmutableMapFieldGenerator::GenerateMergingCode(
|
|||
printer->Print(variables_,
|
||||
"internalGetMutable$capitalized_name$().mergeFrom(\n"
|
||||
" other.internalGet$capitalized_name$());\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
}
|
||||
|
||||
void ImmutableMapFieldGenerator::GenerateBuildingCode(
|
||||
|
|
@ -978,7 +978,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderParsingCode(
|
|||
" $default_entry$.getParserForType(), extensionRegistry);\n"
|
||||
"internalGetMutable$capitalized_name$().ensureBuilderMap().put(\n"
|
||||
" $name$__.getKey(), $name$__.getValue());\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
return;
|
||||
}
|
||||
if (!SupportUnknownEnumValue(value) && type == JAVATYPE_ENUM) {
|
||||
|
|
@ -992,7 +992,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderParsingCode(
|
|||
"} else {\n"
|
||||
" internalGetMutable$capitalized_name$().getMutableMap().put(\n"
|
||||
" $name$__.getKey(), $name$__.getValue());\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
"}\n");
|
||||
return;
|
||||
}
|
||||
|
|
@ -1002,7 +1002,7 @@ void ImmutableMapFieldGenerator::GenerateBuilderParsingCode(
|
|||
" $default_entry$.getParserForType(), extensionRegistry);\n"
|
||||
"internalGetMutable$capitalized_name$().getMutableMap().put(\n"
|
||||
" $name$__.getKey(), $name$__.getValue());\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
}
|
||||
void ImmutableMapFieldGenerator::GenerateSerializationCode(
|
||||
io::Printer* printer) const {
|
||||
|
|
|
|||
|
|
@ -62,11 +62,11 @@ void SetMessageVariables(
|
|||
(*variables)["set_has_field_bit_to_local"] =
|
||||
GenerateSetBitToLocal(bit_index);
|
||||
|
||||
(*variables)["is_field_present_message"] = GenerateGetBit(bit_index);
|
||||
(*variables)["is_field_present"] = GenerateGetBit(bit_index);
|
||||
} else {
|
||||
(*variables)["set_has_field_bit_to_local"] = "";
|
||||
variables->insert({"is_field_present_message",
|
||||
absl::StrCat((*variables)["name"], "_ != null")});
|
||||
variables->insert(
|
||||
{"is_field_present", absl::StrCat((*variables)["name"], "_ != null")});
|
||||
}
|
||||
|
||||
// For repeated builders, one bit is used for whether the array is immutable.
|
||||
|
|
@ -74,10 +74,10 @@ void SetMessageVariables(
|
|||
(*variables)["set_mutable_bit_builder"] = GenerateSetBit(bit_index);
|
||||
(*variables)["clear_mutable_bit_builder"] = GenerateClearBit(bit_index);
|
||||
|
||||
(*variables)["get_has_field_bit_builder"] = GenerateGetBit(bit_index);
|
||||
(*variables)["set_has_field_bit_builder"] =
|
||||
(*variables)["get_has_field_bit"] = GenerateGetBit(bit_index);
|
||||
(*variables)["set_has_field_bit"] =
|
||||
absl::StrCat(GenerateSetBit(bit_index), ";");
|
||||
(*variables)["clear_has_field_bit_builder"] =
|
||||
(*variables)["clear_has_field_bit"] =
|
||||
absl::StrCat(GenerateClearBit(bit_index), ";");
|
||||
(*variables)["get_has_field_bit_from_local"] =
|
||||
GenerateGetBitFromLocal(bit_index);
|
||||
|
|
@ -139,7 +139,7 @@ void ImmutableMessageFieldGenerator::GenerateHasMethod(
|
|||
printer->Print(variables_,
|
||||
"@java.lang.Override\n"
|
||||
"$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
|
||||
" return $is_field_present_message$;\n"
|
||||
" return $is_field_present$;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
}
|
||||
|
|
@ -218,7 +218,7 @@ void ImmutableMessageFieldGenerator::GenerateBuilderHasMethod(
|
|||
context_->options());
|
||||
printer->Print(variables_,
|
||||
"$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
|
||||
" return $get_has_field_bit_builder$;\n"
|
||||
" return $get_has_field_bit$;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
}
|
||||
|
|
@ -247,7 +247,7 @@ void ImmutableMessageFieldGenerator::GenerateBuilderSetMethod(
|
|||
|
||||
"$name$Builder_.setMessage(value);\n",
|
||||
|
||||
"$set_has_field_bit_builder$\n"
|
||||
"$set_has_field_bit$\n"
|
||||
"$on_changed$\n"
|
||||
"return this;\n",
|
||||
Semantic::kSet);
|
||||
|
|
@ -273,7 +273,7 @@ void ImmutableMessageFieldGenerator::GenerateBuilderMergeMethod(
|
|||
PrintNestedBuilderFunction(
|
||||
printer,
|
||||
"$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
|
||||
"if ($get_has_field_bit_builder$ &&\n"
|
||||
"if ($get_has_field_bit$ &&\n"
|
||||
" $name$_ != null &&\n"
|
||||
" $name$_ != $type$.getDefaultInstance()) {\n"
|
||||
" get$capitalized_name$Builder().mergeFrom(value);\n"
|
||||
|
|
@ -284,7 +284,7 @@ void ImmutableMessageFieldGenerator::GenerateBuilderMergeMethod(
|
|||
"$name$Builder_.mergeFrom(value);\n",
|
||||
|
||||
"if ($name$_ != null) {\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
"}\n"
|
||||
"return this;\n",
|
||||
|
|
@ -298,7 +298,7 @@ void ImmutableMessageFieldGenerator::GenerateBuilderClearMethod(
|
|||
printer->Print(
|
||||
variables_,
|
||||
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
|
||||
" $clear_has_field_bit_builder$\n"
|
||||
" $clear_has_field_bit$\n"
|
||||
" $name$_ = null;\n"
|
||||
" if ($name$Builder_ != null) {\n"
|
||||
" $name$Builder_.dispose();\n"
|
||||
|
|
@ -317,7 +317,7 @@ void ImmutableMessageFieldGenerator::GenerateBuilderGetBuilderMethod(
|
|||
printer->Print(variables_,
|
||||
"$deprecation$public $type$.Builder "
|
||||
"${$get$capitalized_name$Builder$}$() {\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return "
|
||||
"internalGet$capitalized_name$FieldBuilder().getBuilder();\n"
|
||||
|
|
@ -386,7 +386,7 @@ void ImmutableMessageFieldGenerator::GenerateBuilderParseMethod(
|
|||
" $name$_ = input.readGroup($number$, $type$.parser(),\n"
|
||||
" extensionRegistry);\n"
|
||||
"}\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
} else {
|
||||
printer->Print(
|
||||
variables_,
|
||||
|
|
@ -398,7 +398,7 @@ void ImmutableMessageFieldGenerator::GenerateBuilderParseMethod(
|
|||
"} else {\n"
|
||||
" $name$_ = input.readMessage($type$.parser(), extensionRegistry);\n"
|
||||
"}\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
}
|
||||
printer->Outdent();
|
||||
printer->Print("}\n");
|
||||
|
|
@ -480,7 +480,7 @@ void ImmutableMessageFieldGenerator::GenerateSerializationCode(
|
|||
io::Printer* printer) const {
|
||||
printer->Print(
|
||||
variables_,
|
||||
"if ($is_field_present_message$) {\n"
|
||||
"if ($is_field_present$) {\n"
|
||||
" output.write$group_or_message$($number$, get$capitalized_name$());\n"
|
||||
"}\n");
|
||||
}
|
||||
|
|
@ -489,7 +489,7 @@ void ImmutableMessageFieldGenerator::GenerateSerializedSizeCode(
|
|||
io::Printer* printer) const {
|
||||
printer->Print(
|
||||
variables_,
|
||||
"if ($is_field_present_message$) {\n"
|
||||
"if ($is_field_present$) {\n"
|
||||
" size += com.google.protobuf.CodedOutputStream\n"
|
||||
" .compute$group_or_message$Size($number$, get$capitalized_name$());\n"
|
||||
"}\n");
|
||||
|
|
|
|||
|
|
@ -131,15 +131,15 @@ void SetPrimitiveVariables(
|
|||
// Note that these have a trailing ";".
|
||||
(*variables)["set_has_field_bit_to_local"] =
|
||||
absl::StrCat(GenerateSetBitToLocal(bit_index), ";");
|
||||
(*variables)["is_field_present_message"] = GenerateGetBit(bit_index);
|
||||
(*variables)["is_other_field_present_message"] =
|
||||
(*variables)["is_field_present"] = GenerateGetBit(bit_index);
|
||||
(*variables)["is_other_field_present"] =
|
||||
absl::StrCat("other.has", (*variables)["capitalized_name"], "()");
|
||||
} else {
|
||||
(*variables)["set_has_field_bit_to_local"] = "";
|
||||
switch (descriptor->type()) {
|
||||
case FieldDescriptor::TYPE_BYTES:
|
||||
AddPrimitiveVariableForThisAndOther(
|
||||
"is_field_present_message", "is_other_field_present_message",
|
||||
"is_field_present", "is_other_field_present",
|
||||
[](absl::string_view value) {
|
||||
return absl::StrCat("!", value, ".isEmpty()");
|
||||
},
|
||||
|
|
@ -147,7 +147,7 @@ void SetPrimitiveVariables(
|
|||
break;
|
||||
case FieldDescriptor::TYPE_FLOAT:
|
||||
AddPrimitiveVariableForThisAndOther(
|
||||
"is_field_present_message", "is_other_field_present_message",
|
||||
"is_field_present", "is_other_field_present",
|
||||
[](absl::string_view value) {
|
||||
return absl::StrCat("java.lang.Float.floatToRawIntBits(", value,
|
||||
") != 0");
|
||||
|
|
@ -156,7 +156,7 @@ void SetPrimitiveVariables(
|
|||
break;
|
||||
case FieldDescriptor::TYPE_DOUBLE:
|
||||
AddPrimitiveVariableForThisAndOther(
|
||||
"is_field_present_message", "is_other_field_present_message",
|
||||
"is_field_present", "is_other_field_present",
|
||||
[](absl::string_view value) {
|
||||
return absl::StrCat("java.lang.Double.doubleToRawLongBits(",
|
||||
value, ") != 0");
|
||||
|
|
@ -165,7 +165,7 @@ void SetPrimitiveVariables(
|
|||
break;
|
||||
default:
|
||||
AddPrimitiveVariableForThisAndOther(
|
||||
"is_field_present_message", "is_other_field_present_message",
|
||||
"is_field_present", "is_other_field_present",
|
||||
[variables](absl::string_view value) {
|
||||
return absl::StrCat(value, " != ", (*variables)["default"]);
|
||||
},
|
||||
|
|
@ -176,12 +176,12 @@ void SetPrimitiveVariables(
|
|||
|
||||
// Always track the presence of a field explicitly in the builder, regardless
|
||||
// of syntax.
|
||||
(*variables)["get_has_field_bit_builder"] = GenerateGetBit(bit_index);
|
||||
(*variables)["get_has_field_bit"] = GenerateGetBit(bit_index);
|
||||
(*variables)["get_has_field_bit_from_local"] =
|
||||
GenerateGetBitFromLocal(bit_index);
|
||||
(*variables)["set_has_field_bit_builder"] =
|
||||
(*variables)["set_has_field_bit"] =
|
||||
absl::StrCat(GenerateSetBit(bit_index), ";");
|
||||
(*variables)["clear_has_field_bit_builder"] =
|
||||
(*variables)["clear_has_field_bit"] =
|
||||
absl::StrCat(GenerateClearBit(bit_index), ";");
|
||||
}
|
||||
|
||||
|
|
@ -223,7 +223,7 @@ void ImmutablePrimitiveFieldGenerator::GenerateMembers(
|
|||
variables_,
|
||||
"@java.lang.Override\n"
|
||||
"$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
|
||||
" return $is_field_present_message$;\n"
|
||||
" return $is_field_present$;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
}
|
||||
|
|
@ -249,7 +249,7 @@ void ImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
|
|||
variables_,
|
||||
"@java.lang.Override\n"
|
||||
"$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
|
||||
" return $get_has_field_bit_builder$;\n"
|
||||
" return $get_has_field_bit$;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
}
|
||||
|
|
@ -271,7 +271,7 @@ void ImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
|
|||
"${$set$capitalized_name$$}$($type$ value) {\n"
|
||||
" $null_check$\n"
|
||||
" $name$_ = value;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -283,7 +283,7 @@ void ImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
|
|||
printer->Print(
|
||||
variables_,
|
||||
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
|
||||
" $clear_has_field_bit_builder$\n");
|
||||
" $clear_has_field_bit$\n");
|
||||
printer->Annotate("{", "}", descriptor_, Semantic::kSet);
|
||||
JavaType type = GetJavaType(descriptor_);
|
||||
if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) {
|
||||
|
|
@ -322,7 +322,7 @@ void ImmutablePrimitiveFieldGenerator::GenerateBuilderClearCode(
|
|||
void ImmutablePrimitiveFieldGenerator::GenerateMergingCode(
|
||||
io::Printer* printer) const {
|
||||
printer->Print(variables_,
|
||||
"if ($is_other_field_present_message$) {\n"
|
||||
"if ($is_other_field_present$) {\n"
|
||||
" set$capitalized_name$(other.get$capitalized_name$());\n"
|
||||
"}\n");
|
||||
}
|
||||
|
|
@ -342,13 +342,13 @@ void ImmutablePrimitiveFieldGenerator::GenerateBuilderParsingCode(
|
|||
io::Printer* printer) const {
|
||||
printer->Print(variables_,
|
||||
"$name$_ = input.read$capitalized_type$();\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
}
|
||||
|
||||
void ImmutablePrimitiveFieldGenerator::GenerateSerializationCode(
|
||||
io::Printer* printer) const {
|
||||
printer->Print(variables_,
|
||||
"if ($is_field_present_message$) {\n"
|
||||
"if ($is_field_present$) {\n"
|
||||
" output.write$capitalized_type$($number$, $name$_);\n"
|
||||
"}\n");
|
||||
}
|
||||
|
|
@ -356,7 +356,7 @@ void ImmutablePrimitiveFieldGenerator::GenerateSerializationCode(
|
|||
void ImmutablePrimitiveFieldGenerator::GenerateSerializedSizeCode(
|
||||
io::Printer* printer) const {
|
||||
printer->Print(variables_,
|
||||
"if ($is_field_present_message$) {\n"
|
||||
"if ($is_field_present$) {\n"
|
||||
" size += com.google.protobuf.CodedOutputStream\n"
|
||||
" .compute$capitalized_type$Size($number$, $name$_);\n"
|
||||
"}\n");
|
||||
|
|
@ -693,7 +693,7 @@ void RepeatedImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
|
|||
" if (!$name$_.isModifiable()) {\n"
|
||||
" $name$_ = makeMutableCopy($name$_, capacity);\n"
|
||||
" }\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
"}\n");
|
||||
|
||||
// Note: We return an unmodifiable list because otherwise the caller
|
||||
|
|
@ -734,7 +734,7 @@ void RepeatedImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
|
|||
" $null_check$\n"
|
||||
" ensure$capitalized_name$IsMutable(/* capacity= */ -1);\n"
|
||||
" $repeated_set$(index, value);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -748,7 +748,7 @@ void RepeatedImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
|
|||
" $null_check$\n"
|
||||
" ensure$capitalized_name$IsMutable(/* capacity= */ -1);\n"
|
||||
" $repeated_add$(value);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -762,7 +762,7 @@ void RepeatedImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
|
|||
" ensure$capitalized_name$IsMutable(/* capacity= */ -1);\n"
|
||||
" com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
|
||||
" values, $name$_);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -774,7 +774,7 @@ void RepeatedImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
|
|||
variables_,
|
||||
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
|
||||
" $name$_ = $empty_list$;\n"
|
||||
" $clear_has_field_bit_builder$\n"
|
||||
" $clear_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -808,7 +808,7 @@ void RepeatedImmutablePrimitiveFieldGenerator::GenerateMergingCode(
|
|||
" if ($name$_.isEmpty()) {\n"
|
||||
" $name$_ = other.$name$_;\n"
|
||||
" $name_make_immutable$;\n"
|
||||
" $set_has_field_bit_builder$\n");
|
||||
" $set_has_field_bit$\n");
|
||||
printer->Print(variables_,
|
||||
" } else {\n"
|
||||
" ensure$capitalized_name$IsMutable(/* capacity= */ -1);\n"
|
||||
|
|
|
|||
|
|
@ -77,26 +77,21 @@ void SetPrimitiveVariables(
|
|||
(*variables)["set_has_field_bit_to_local"] =
|
||||
GenerateSetBitToLocal(bit_index);
|
||||
|
||||
// Note that these have a trailing ";".
|
||||
(*variables)["set_has_field_bit_message"] =
|
||||
absl::StrCat(GenerateSetBit(bit_index), ";");
|
||||
|
||||
(*variables)["is_field_present_message"] = GenerateGetBit(bit_index);
|
||||
(*variables)["is_field_present"] = GenerateGetBit(bit_index);
|
||||
} else {
|
||||
(*variables)["set_has_field_bit_to_local"] = "";
|
||||
(*variables)["set_has_field_bit_message"] = "";
|
||||
|
||||
variables->insert({"is_field_present_message",
|
||||
absl::StrCat("!", (*variables)["isStringEmpty"], "(",
|
||||
(*variables)["name"], "_)")});
|
||||
variables->insert(
|
||||
{"is_field_present", absl::StrCat("!", (*variables)["isStringEmpty"],
|
||||
"(", (*variables)["name"], "_)")});
|
||||
}
|
||||
|
||||
(*variables)["get_has_field_bit_builder"] = GenerateGetBit(bit_index);
|
||||
(*variables)["get_has_field_bit"] = GenerateGetBit(bit_index);
|
||||
(*variables)["get_has_field_bit_from_local"] =
|
||||
GenerateGetBitFromLocal(bit_index);
|
||||
(*variables)["set_has_field_bit_builder"] =
|
||||
(*variables)["set_has_field_bit"] =
|
||||
absl::StrCat(GenerateSetBit(bit_index), ";");
|
||||
(*variables)["clear_has_field_bit_builder"] =
|
||||
(*variables)["clear_has_field_bit"] =
|
||||
absl::StrCat(GenerateClearBit(bit_index), ";");
|
||||
}
|
||||
|
||||
|
|
@ -178,7 +173,7 @@ void ImmutableStringFieldGenerator::GenerateMembers(
|
|||
variables_,
|
||||
"@java.lang.Override\n"
|
||||
"$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
|
||||
" return $is_field_present_message$;\n"
|
||||
" return $is_field_present$;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
}
|
||||
|
|
@ -241,7 +236,7 @@ void ImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
printer->Print(
|
||||
variables_,
|
||||
"$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
|
||||
" return $get_has_field_bit_builder$;\n"
|
||||
" return $get_has_field_bit$;\n"
|
||||
"}\n");
|
||||
printer->Annotate("{", "}", descriptor_);
|
||||
}
|
||||
|
|
@ -298,7 +293,7 @@ void ImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
" java.lang.String value) {\n"
|
||||
" $null_check$\n"
|
||||
" $name$_ = value;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -315,7 +310,7 @@ void ImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
printer->Print(variables_,
|
||||
" $name$_ = getDefaultInstance().get$capitalized_name$();\n");
|
||||
printer->Print(variables_,
|
||||
" $clear_has_field_bit_builder$\n"
|
||||
" $clear_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -334,7 +329,7 @@ void ImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
}
|
||||
printer->Print(variables_,
|
||||
" $name$_ = value;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -363,14 +358,14 @@ void ImmutableStringFieldGenerator::GenerateMergingCode(
|
|||
printer->Print(variables_,
|
||||
"if (other.has$capitalized_name$()) {\n"
|
||||
" $name$_ = other.$name$_;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
"}\n");
|
||||
} else {
|
||||
printer->Print(variables_,
|
||||
"if (!other.get$capitalized_name$().isEmpty()) {\n"
|
||||
" $name$_ = other.$name$_;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
"}\n");
|
||||
}
|
||||
|
|
@ -393,18 +388,18 @@ void ImmutableStringFieldGenerator::GenerateBuilderParsingCode(
|
|||
printer->Print(variables_,
|
||||
"$name$_ = "
|
||||
"input.readStringRequireUtf8();\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
} else {
|
||||
printer->Print(variables_,
|
||||
"$name$_ = input.readBytes();\n"
|
||||
"$set_has_field_bit_builder$\n");
|
||||
"$set_has_field_bit$\n");
|
||||
}
|
||||
}
|
||||
|
||||
void ImmutableStringFieldGenerator::GenerateSerializationCode(
|
||||
io::Printer* printer) const {
|
||||
printer->Print(variables_,
|
||||
"if ($is_field_present_message$) {\n"
|
||||
"if ($is_field_present$) {\n"
|
||||
" $writeString$(output, $number$, $name$_);\n"
|
||||
"}\n");
|
||||
}
|
||||
|
|
@ -412,7 +407,7 @@ void ImmutableStringFieldGenerator::GenerateSerializationCode(
|
|||
void ImmutableStringFieldGenerator::GenerateSerializedSizeCode(
|
||||
io::Printer* printer) const {
|
||||
printer->Print(variables_,
|
||||
"if ($is_field_present_message$) {\n"
|
||||
"if ($is_field_present$) {\n"
|
||||
" size += $computeStringSize$($number$, $name$_);\n"
|
||||
"}\n");
|
||||
}
|
||||
|
|
@ -778,7 +773,7 @@ void RepeatedImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
" if (!$name$_.isModifiable()) {\n"
|
||||
" $name$_ = new com.google.protobuf.LazyStringArrayList($name$_);\n"
|
||||
" }\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
"}\n");
|
||||
|
||||
// Note: We return an unmodifiable list because otherwise the caller
|
||||
|
|
@ -827,7 +822,7 @@ void RepeatedImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
" $null_check$\n"
|
||||
" ensure$capitalized_name$IsMutable();\n"
|
||||
" $name$_.set(index, value);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -841,7 +836,7 @@ void RepeatedImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
" $null_check$\n"
|
||||
" ensure$capitalized_name$IsMutable();\n"
|
||||
" $name$_.add(value);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -855,7 +850,7 @@ void RepeatedImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
" ensure$capitalized_name$IsMutable();\n"
|
||||
" com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
|
||||
" values, $name$_);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -868,7 +863,7 @@ void RepeatedImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
|
||||
" $name$_ =\n"
|
||||
" $empty_list$;\n"
|
||||
" $clear_has_field_bit_builder$;\n"
|
||||
" $clear_has_field_bit$;\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -889,7 +884,7 @@ void RepeatedImmutableStringFieldGenerator::GenerateBuilderMembers(
|
|||
printer->Print(variables_,
|
||||
" ensure$capitalized_name$IsMutable();\n"
|
||||
" $name$_.add(value);\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" $on_changed$\n"
|
||||
" return this;\n"
|
||||
"}\n");
|
||||
|
|
@ -925,7 +920,7 @@ void RepeatedImmutableStringFieldGenerator::GenerateMergingCode(
|
|||
"if (!other.$name$_.isEmpty()) {\n"
|
||||
" if ($name$_.isEmpty()) {\n"
|
||||
" $name$_ = other.$name$_;\n"
|
||||
" $set_has_field_bit_builder$\n"
|
||||
" $set_has_field_bit$\n"
|
||||
" } else {\n"
|
||||
" ensure$capitalized_name$IsMutable();\n"
|
||||
" $name$_.addAll(other.$name$_);\n"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue