From 53c10e09e15b446e7213b341e8fddc79296f1d51 Mon Sep 17 00:00:00 2001 From: David Reiss Date: Fri, 5 Mar 2010 07:51:51 +0000 Subject: [PATCH] THRIFT-564. Support arbitrary annotations on struct fields This is subtly different from a type annotation, since some bits of metadata only make sense in the context of a single structure field, like whether the field is required, or whether the C++ code should use a pointer for it. This change doesn't define any meaningful annotations. It just sets up the parsing infrastructure. I have no idea if $10 will work with older versions of yacc. It seems to work fine with bison. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@919325 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/parse/t_field.h | 1 + compiler/cpp/src/thrifty.yy | 6 +++++- test/AnnotationTest.thrift | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/compiler/cpp/src/parse/t_field.h b/compiler/cpp/src/parse/t_field.h index 67a2125c..4217a517 100644 --- a/compiler/cpp/src/parse/t_field.h +++ b/compiler/cpp/src/parse/t_field.h @@ -133,6 +133,7 @@ class t_field : public t_doc { } }; + std::map annotations_; private: t_type* type_; diff --git a/compiler/cpp/src/thrifty.yy b/compiler/cpp/src/thrifty.yy index 0fc90dac..f0745d7a 100644 --- a/compiler/cpp/src/thrifty.yy +++ b/compiler/cpp/src/thrifty.yy @@ -853,7 +853,7 @@ FieldList: } Field: - CaptureDocText FieldIdentifier FieldRequiredness FieldType tok_identifier FieldValue XsdOptional XsdNillable XsdAttributes CommaOrSemicolonOptional + CaptureDocText FieldIdentifier FieldRequiredness FieldType tok_identifier FieldValue XsdOptional XsdNillable XsdAttributes TypeAnnotations CommaOrSemicolonOptional { pdebug("tok_int_constant : Field -> FieldType tok_identifier"); if ($2 < 0) { @@ -878,6 +878,10 @@ Field: if ($9 != NULL) { $$->set_xsd_attrs($9); } + if ($10 != NULL) { + $$->annotations_ = $10->annotations_; + delete $10; + } } FieldIdentifier: diff --git a/test/AnnotationTest.thrift b/test/AnnotationTest.thrift index ef9ba13a..1a34320c 100644 --- a/test/AnnotationTest.thrift +++ b/test/AnnotationTest.thrift @@ -20,8 +20,8 @@ typedef list ( cpp.template = "std::list" ) int_linked_list struct foo { - 1: i32 bar; - 2: i32 baz; + 1: i32 bar ( presence = "required" ); + 2: i32 baz ( presence = "manual", cpp.use_pointer = "", ); 3: i32 qux; 4: i32 bop; } ( -- 2.17.1