THRIFT-2320 Program level doctext does not get attached by parser

Patch: Craig Peterson & Jens Geyer
diff --git a/compiler/cpp/src/thrifty.yy b/compiler/cpp/src/thrifty.yy
index 8814332..fd72b70 100755
--- a/compiler/cpp/src/thrifty.yy
+++ b/compiler/cpp/src/thrifty.yy
@@ -243,12 +243,11 @@
   HeaderList DefinitionList
     {
       pdebug("Program -> Headers DefinitionList");
-      /*
-      TODO(dreiss): Decide whether full-program doctext is worth the trouble.
-      if ($1 != NULL) {
-        g_program->set_doc($1);
+      if((g_program_doctext_candidate != NULL) && (g_program_doctext_status != ALREADY_PROCESSED))
+      {
+        g_program->set_doc(g_program_doctext_candidate);
+        g_program_doctext_status = ALREADY_PROCESSED;
       }
-      */
       clear_doctext();
     }
 
@@ -290,6 +289,7 @@
 | tok_namespace tok_identifier tok_identifier
     {
       pdebug("Header -> tok_namespace tok_identifier tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace($2, $3);
       }
@@ -297,6 +297,7 @@
 | tok_namespace '*' tok_identifier
     {
       pdebug("Header -> tok_namespace * tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("*", $3);
       }
@@ -306,6 +307,7 @@
     {
       pwarning(1, "'cpp_namespace' is deprecated. Use 'namespace cpp' instead");
       pdebug("Header -> tok_cpp_namespace tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("cpp", $2);
       }
@@ -313,6 +315,7 @@
 | tok_cpp_include tok_literal
     {
       pdebug("Header -> tok_cpp_include tok_literal");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->add_cpp_include($2);
       }
@@ -321,6 +324,7 @@
     {
       pwarning(1, "'php_namespace' is deprecated. Use 'namespace php' instead");
       pdebug("Header -> tok_php_namespace tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("php", $2);
       }
@@ -330,6 +334,7 @@
     {
       pwarning(1, "'py_module' is deprecated. Use 'namespace py' instead");
       pdebug("Header -> tok_py_module tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("py", $2);
       }
@@ -339,6 +344,7 @@
     {
       pwarning(1, "'perl_package' is deprecated. Use 'namespace perl' instead");
       pdebug("Header -> tok_perl_namespace tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("perl", $2);
       }
@@ -348,6 +354,7 @@
     {
       pwarning(1, "'ruby_namespace' is deprecated. Use 'namespace rb' instead");
       pdebug("Header -> tok_ruby_namespace tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("rb", $2);
       }
@@ -357,6 +364,7 @@
     {
       pwarning(1, "'smalltalk_category' is deprecated. Use 'namespace smalltalk.category' instead");
       pdebug("Header -> tok_smalltalk_category tok_st_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("smalltalk.category", $2);
       }
@@ -366,6 +374,7 @@
     {
       pwarning(1, "'smalltalk_prefix' is deprecated. Use 'namespace smalltalk.prefix' instead");
       pdebug("Header -> tok_smalltalk_prefix tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("smalltalk.prefix", $2);
       }
@@ -375,6 +384,7 @@
     {
       pwarning(1, "'java_package' is deprecated. Use 'namespace java' instead");
       pdebug("Header -> tok_java_package tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("java", $2);
       }
@@ -384,6 +394,7 @@
     {
       pwarning(1, "'cocoa_prefix' is deprecated. Use 'namespace cocoa' instead");
       pdebug("Header -> tok_cocoa_prefix tok_identifier");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("cocoa", $2);
       }
@@ -393,6 +404,7 @@
     {
       pwarning(1, "'xsd_namespace' is deprecated. Use 'namespace xsd' instead");
       pdebug("Header -> tok_xsd_namespace tok_literal");
+      declare_valid_program_doctext();  
       if (g_parse_mode == PROGRAM) {
         g_program->set_namespace("cocoa", $2);
       }
@@ -402,6 +414,7 @@
    {
      pwarning(1, "'csharp_namespace' is deprecated. Use 'namespace csharp' instead");
      pdebug("Header -> tok_csharp_namespace tok_identifier");
+     declare_valid_program_doctext();  
      if (g_parse_mode == PROGRAM) {
        g_program->set_namespace("csharp", $2);
      }
@@ -411,6 +424,7 @@
    {
      pwarning(1, "'delphi_namespace' is deprecated. Use 'namespace delphi' instead");
      pdebug("Header -> tok_delphi_namespace tok_identifier");
+     declare_valid_program_doctext();  
      if (g_parse_mode == PROGRAM) {
        g_program->set_namespace("delphi", $2);
      }
@@ -420,6 +434,7 @@
   tok_include tok_literal
     {
       pdebug("Include -> tok_include tok_literal");
+      declare_valid_program_doctext();  
       if (g_parse_mode == INCLUDES) {
         std::string path = include_file(std::string($2));
         if (!path.empty()) {