Thrift compiler now enforces uniqueness of field identifiers
authorMark Slee <mcslee@apache.org>
Wed, 28 Nov 2007 22:28:13 +0000 (22:28 +0000)
committerMark Slee <mcslee@apache.org>
Wed, 28 Nov 2007 22:28:13 +0000 (22:28 +0000)
Summary: The code would either not generate, or generate code with errors, if you did this beforehand. Now it's a die-fast stop hard error since this is absolultely always a wrong thing to do.

Reviewed By: dreiss

Test Plan: Test compiling a .thrift file with a repeated field identifier in a struct or arglist.

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

compiler/cpp/src/parse/t_field.h
compiler/cpp/src/parse/t_struct.h
compiler/cpp/src/thrifty.yy

index 25c50a5..35ee1a2 100644 (file)
@@ -106,12 +106,12 @@ class t_field {
 
   bool has_doc() {
     return has_doc_;
-  }                                                           
+  }
 
-  void set_doc(const std::string& doc) {                      
-    doc_ = doc;                                               
-    has_doc_ = true;                                          
-  }                                                           
+  void set_doc(const std::string& doc) {
+    doc_ = doc;
+    has_doc_ = true;
+  }
 
   // This is not the same function as t_type::get_fingerprint_material,
   // but it does the same thing.
@@ -132,8 +132,8 @@ class t_field {
   bool xsd_nillable_;
   t_struct* xsd_attrs_;
 
-  std::string doc_;                                           
-  bool has_doc_;                                              
+  std::string doc_;
+  bool has_doc_;
 
 };
 
index 39da110..bca51f6 100644 (file)
@@ -85,6 +85,17 @@ class t_struct : public t_type {
     }
   }
 
+  bool validate_field(t_field* field) {
+    int key = field->get_key();
+    std::vector<t_field*>::const_iterator m_iter;
+    for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
+      if ((*m_iter)->get_key() == key) {
+        return false;
+      }
+    }
+    return true;
+  }
+
  private:
 
   std::vector<t_field*> members_;
index 5d7cfcc..21828ff 100644 (file)
@@ -761,6 +761,10 @@ FieldList:
     {
       pdebug("FieldList -> FieldList , Field");
       $$ = $1;
+      if (!($$->validate_field($2))) {
+        yyerror("Field identifier %d for \"%s\" has already been used", $2->get_key(), $2->get_name().c_str());
+        exit(1);
+      }
       $$->append($2);
     }
 |