|
|
|
@ -1073,40 +1073,46 @@ void MessageGenerator::GenerateOneofMemberHasBits(const FieldDescriptor* field, |
|
|
|
|
void MessageGenerator::GenerateFieldClear(const FieldDescriptor* field, |
|
|
|
|
bool is_inline, io::Printer* p) { |
|
|
|
|
auto t = p->WithVars(MakeTrackerCalls(field, options_)); |
|
|
|
|
Formatter format(p); |
|
|
|
|
|
|
|
|
|
// Generate clear_$name$().
|
|
|
|
|
if (is_inline) { |
|
|
|
|
format("inline "); |
|
|
|
|
} |
|
|
|
|
format("void $classname$::clear_$name$() {\n"); |
|
|
|
|
|
|
|
|
|
format.Indent(); |
|
|
|
|
|
|
|
|
|
if (field->real_containing_oneof()) { |
|
|
|
|
// Clear this field only if it is the active field in this oneof,
|
|
|
|
|
// otherwise ignore
|
|
|
|
|
auto t = p->WithVars(MakeTrackerCalls(field, options_)); |
|
|
|
|
format("if ($has_field$) {\n"); |
|
|
|
|
format.Indent(); |
|
|
|
|
field_generators_.get(field).GenerateClearingCode(p); |
|
|
|
|
format("clear_has_$oneof_name$();\n"); |
|
|
|
|
format.Outdent(); |
|
|
|
|
format("}\n"); |
|
|
|
|
} else { |
|
|
|
|
if (ShouldSplit(field, options_)) { |
|
|
|
|
format("if (IsSplitMessageDefault()) return;\n"); |
|
|
|
|
} |
|
|
|
|
field_generators_.get(field).GenerateClearingCode(p); |
|
|
|
|
if (HasHasbit(field)) { |
|
|
|
|
int has_bit_index = HasBitIndex(field); |
|
|
|
|
auto v = p->WithVars(HasbitVars(has_bit_index)); |
|
|
|
|
format("$has_bits$[$has_array_index$] &= ~$has_mask$;\n"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
format("$annotate_clear$"); |
|
|
|
|
format.Outdent(); |
|
|
|
|
format("}\n"); |
|
|
|
|
p->Emit({{"inline", is_inline ? "inline" : ""}, |
|
|
|
|
{"body", |
|
|
|
|
[&] { |
|
|
|
|
if (field->real_containing_oneof()) { |
|
|
|
|
// Clear this field only if it is the active field in this
|
|
|
|
|
// oneof, otherwise ignore
|
|
|
|
|
p->Emit( |
|
|
|
|
{{"clearing_code", |
|
|
|
|
[&] { |
|
|
|
|
field_generators_.get(field).GenerateClearingCode(p); |
|
|
|
|
}}}, |
|
|
|
|
R"cc( |
|
|
|
|
if ($has_field$) { |
|
|
|
|
$clearing_code$; |
|
|
|
|
clear_has_$oneof_name$(); |
|
|
|
|
} |
|
|
|
|
)cc"); |
|
|
|
|
} else { |
|
|
|
|
// TODO(b/281513105): figure out if early return breaks tracking
|
|
|
|
|
if (ShouldSplit(field, options_)) { |
|
|
|
|
p->Emit(R"cc( |
|
|
|
|
if (IsSplitMessageDefault()) return; |
|
|
|
|
)cc"); |
|
|
|
|
} |
|
|
|
|
field_generators_.get(field).GenerateClearingCode(p); |
|
|
|
|
if (HasHasbit(field)) { |
|
|
|
|
int has_bit_index = HasBitIndex(field); |
|
|
|
|
auto v = p->WithVars(HasbitVars(has_bit_index)); |
|
|
|
|
p->Emit(R"cc( |
|
|
|
|
$has_bits$[$has_array_index$] &= ~$has_mask$; |
|
|
|
|
)cc"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}}}, |
|
|
|
|
R"cc( |
|
|
|
|
$inline $void $classname$::clear_$name$() { |
|
|
|
|
$body$; |
|
|
|
|
$annotate_clear$; |
|
|
|
|
} |
|
|
|
|
)cc"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void MessageGenerator::GenerateFieldAccessorDefinitions(io::Printer* p) { |
|
|
|
|