Skip to content

Commit e4f682f

Browse files
committedOct 8, 2024
compiler/cpp/src/generate/t_rb_generator: Embed the annotations in the struct and service definitions
1 parent bb7f6ef commit e4f682f

File tree

2 files changed

+49
-10
lines changed

2 files changed

+49
-10
lines changed
 

‎compiler/cpp/src/generate/t_rb_generator.cc

+39-2
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ class t_rb_generator : public t_oop_generator {
184184

185185
void generate_rdoc(t_rb_ofstream& out, t_doc* tdoc);
186186

187+
void generate_rb_annotations(t_rb_ofstream& out, t_annotated* tannotated, std::string key_prefix);
188+
187189
/**
188190
* Helper rendering functions
189191
*/
@@ -596,6 +598,7 @@ void t_rb_generator::generate_rb_struct(t_rb_ofstream& out,
596598
out.indent() << "NAME = '" << tstruct->get_name() << "'.freeze" << endl;
597599
out.indent() << "NAMESPACE = '" << tstruct->get_program()->get_namespace("*") << "'.freeze" << endl << endl;
598600

601+
generate_rb_annotations(out, tstruct, "");
599602
generate_field_constants(out, tstruct);
600603
generate_field_defns(out, tstruct);
601604
generate_rb_struct_required_validator(out, tstruct);
@@ -607,6 +610,28 @@ void t_rb_generator::generate_rb_struct(t_rb_ofstream& out,
607610
out.indent() << "end" << endl << endl;
608611
}
609612

613+
614+
void t_rb_generator::generate_rb_annotations(t_rb_ofstream& out,
615+
t_annotated* tannotated,
616+
std::string key_prefix) {
617+
out.indent() << key_prefix << "LEGACY_ANNOTATIONS = {" << endl;
618+
out.indent_up();
619+
const map<string, string>& annotations = tannotated->legacy_annotations();
620+
for (map<string, string>::const_iterator ns_it = annotations.begin(); ns_it != annotations.end(); ++ns_it) {
621+
out << indent() << "%q\"" << escape_string(ns_it->first) << "\" => %q\"" << escape_string(ns_it->second)<< "\"," << endl;
622+
}
623+
out.indent_down();
624+
out.indent() << "}.freeze" << endl << endl;
625+
626+
out.indent() << key_prefix << "STRUCTURED_ANNOTATIONS = [" << endl;
627+
out.indent_up();
628+
vector<t_structured_annotation*> sannotations = tannotated->structured_annotations();
629+
for (vector<t_structured_annotation*>::const_iterator it = sannotations.begin(); it != sannotations.end(); it++) {
630+
render_const_value(out.indent(), (*it)->type_, (*it)->value_) << "," << endl;
631+
}
632+
out.indent_down();
633+
out.indent() << "].freeze" << endl << endl;
634+
}
610635
/**
611636
* Generates a ruby union
612637
*/
@@ -623,8 +648,8 @@ void t_rb_generator::generate_rb_union(t_rb_ofstream& out,
623648
out.indent() << "NAME = '" << tstruct->get_name() << "'.freeze" << endl;
624649
out.indent() << "NAMESPACE = '" << tstruct->get_program()->get_namespace("*") << "'.freeze" << endl << endl;
625650

651+
generate_rb_annotations(out, tstruct, "");
626652
generate_field_constructors(out, tstruct);
627-
628653
generate_field_constants(out, tstruct);
629654
generate_field_defns(out, tstruct);
630655
generate_rb_union_validator(out, tstruct);
@@ -702,6 +727,10 @@ void t_rb_generator::generate_field_defns(t_rb_ofstream& out, t_struct* tstruct)
702727
const vector<t_field*>& fields = tstruct->get_members();
703728
vector<t_field*>::const_iterator f_iter;
704729

730+
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
731+
generate_rb_annotations(out, *f_iter, "THRIFT_FIELD_" + upcase_string((*f_iter)->get_name()) + "_");
732+
}
733+
705734
out.indent() << "FIELDS = {" << endl;
706735
out.indent_up();
707736
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
@@ -775,6 +804,9 @@ void t_rb_generator::generate_field_data(t_rb_ofstream& out,
775804
out << ", enum_class: " << full_type_name(field_type);
776805
}
777806

807+
out << ", legacy_annotations: THRIFT_FIELD_" << upcase_string(field_name) << "_LEGACY_ANNOTATIONS";
808+
out << ", structured_annotations: THRIFT_FIELD_" << upcase_string(field_name) << "_STRUCTURED_ANNOTATIONS";
809+
778810
// End of this field's defn
779811
out << "}";
780812
}
@@ -826,6 +858,7 @@ void t_rb_generator::generate_service(t_service* tservice) {
826858
f_service_.indent() << "NAMESPACE = '" << tservice->get_program()->get_namespace("*") << "'.freeze" << endl << endl;
827859

828860
// Generate the three main parts of the service (well, two for now in PHP)
861+
generate_rb_annotations(f_service_, tservice, "");
829862
generate_service_helpers(tservice);
830863
generate_service_client(tservice);
831864
generate_service_server(tservice);
@@ -1019,11 +1052,15 @@ void t_rb_generator::generate_service_server(t_service* tservice) {
10191052
f_service_.indent_down();
10201053
f_service_.indent() << "end" << endl << endl;
10211054

1055+
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
1056+
generate_rb_annotations(f_service_, *f_iter, "THRIFT_METHOD_" + upcase_string((*f_iter)->get_name()) + "_");
1057+
}
1058+
10221059
f_service_.indent() << "METHODS = {" << endl;
10231060
f_service_.indent_up();
10241061

10251062
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
1026-
f_service_.indent() << "'" << (*f_iter)->get_name() << "' => { args_klass: " << capitalize((*f_iter)->get_name()) << "_args, oneway: " << ((*f_iter)->is_oneway() ? "true" : "false") << "}," << endl;
1063+
f_service_.indent() << "'" << (*f_iter)->get_name() << "' => { args_klass: " << capitalize((*f_iter)->get_name()) << "_args, oneway: " << ((*f_iter)->is_oneway() ? "true" : "false") << ", legacy_annotations: THRIFT_METHOD_" << upcase_string((*f_iter)->get_name()) << "_STRUCTURED_ANNOTATIONS, structured_annotations: THRIFT_METHOD_" << upcase_string((*f_iter)->get_name()) << "_STRUCTURED_ANNOTATIONS}," << endl;
10271064
}
10281065

10291066
f_service_.indent_down();

‎lib/rb/lib/thrift/definition.rb

+10-8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ def initialize(klass)
66
@klass = klass
77
end
88

9+
def structured_annotations
10+
@klass::STRUCTURED_ANNOTATIONS
11+
end
12+
13+
def legacy_annotations
14+
@klass::LEGACY_ANNOTATIONS
15+
end
16+
917
def namespace
1018
@klass::NAMESPACE
1119
end
@@ -20,12 +28,6 @@ def struct_type
2028
end
2129

2230
class ServiceDefinition < StructDefinition
23-
attr_reader :klass
24-
25-
def initialize(klass)
26-
@klass = klass
27-
end
28-
2931
def client_class
3032
@klass::Client
3133
end
@@ -34,8 +36,8 @@ def processor_class
3436
@klass::Processor
3537
end
3638

37-
def namespace
38-
@klass::NAMESPACE
39+
def name
40+
service
3941
end
4042

4143
def service

0 commit comments

Comments
 (0)