THRIFT-897. compiler: Don't allow unqualified constant access to enum values
authorBryan Duxbury <bryanduxbury@apache.org>
Sun, 12 Sep 2010 14:38:36 +0000 (14:38 +0000)
committerBryan Duxbury <bryanduxbury@apache.org>
Sun, 12 Sep 2010 14:38:36 +0000 (14:38 +0000)
This patch makes it illegal to refer to enum values by just their names in the IDL. Now, you must also provide the enum type's name as well.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@996320 13f79535-47bb-0310-9956-ffa450edef68

compiler/cpp/src/main.cc
compiler/cpp/src/thrifty.yy
test/ThriftTest.thrift

index c7b1510..56b5c75 100644 (file)
@@ -720,7 +720,13 @@ void validate_const_rec(std::string name, t_type* type, t_const_value* value) {
     vector<t_enum_value*>::const_iterator c_iter;
     bool found = false;
     for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) {
-      if ((*c_iter)->get_name() == value->get_identifier()) {
+      size_t sub_index = value->get_identifier().find('.');
+      if (sub_index == string::npos) {
+        throw "error: identifier " + value->get_identifier() + " is unqualified!";
+      }
+      std::string name_portion = value->get_identifier().substr(sub_index+1);
+
+      if ((*c_iter)->get_name() == name_portion) {
         found = true;
         break;
       }
index cdedee0..fda49cd 100644 (file)
@@ -511,6 +511,20 @@ Enum:
       $$ = $4;
       $$->set_name($2);
       $$->resolve_values();
+      // make constants for all the enum values
+      if (g_parse_mode == PROGRAM) {
+        const std::vector<t_enum_value*>& enum_values = $$->get_constants();
+        std::vector<t_enum_value*>::const_iterator c_iter;
+        for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) {
+          std::string const_name = $$->get_name() + "." + (*c_iter)->get_name();
+          t_const_value* const_val = new t_const_value((*c_iter)->get_value());
+          const_val->set_enum($$);
+          g_scope->add_constant(const_name, new t_const(g_type_i32, (*c_iter)->get_name(), const_val));
+          if (g_parent_scope != NULL) {
+            g_parent_scope->add_constant(g_parent_prefix + const_name, new t_const(g_type_i32, (*c_iter)->get_name(), const_val));
+          }
+        }
+      }
     }
 
 EnumDefList:
@@ -540,12 +554,6 @@ EnumDef:
       if ($1 != NULL) {
         $$->set_doc($1);
       }
-      if (g_parse_mode == PROGRAM) {
-        g_scope->add_constant($2, new t_const(g_type_i32, $2, new t_const_value($4)));
-        if (g_parent_scope != NULL) {
-          g_parent_scope->add_constant(g_parent_prefix + $2, new t_const(g_type_i32, $2, new t_const_value($4)));
-        }
-      }
     }
 |
   CaptureDocText tok_identifier CommaOrSemicolonOptional
index a6788a9..d9f0fbe 100644 (file)
@@ -43,6 +43,10 @@ enum Numberz
   EIGHT = 8
 }
 
+const Numberz myNumberz = Numberz.ONE;
+// the following is expected to fail:
+// const Numberz urNumberz = ONE;
+
 typedef i64 UserId
 
 struct Bonk