Thrift: Allow whole program doctext.

Summary:
Allow docstrings at the top of the program.

Blame Rev: 52687

Reviewed By: mcslee

Test Plan:
../compiler/cpp/thrift -cpp DocTest.thrift
(with dump_docs on)
and looked at the output.
Generated C++ is identical to installed thrift.

Revert Plan: Do 52687 also.


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665183 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/main.cc b/compiler/cpp/src/main.cc
index 4d00306..ed38b07 100644
--- a/compiler/cpp/src/main.cc
+++ b/compiler/cpp/src/main.cc
@@ -433,9 +433,13 @@
 
 /**
  * Dumps docstrings to stdout
- * Only works for typedefs
+ * Only works for typedefs and whole program
  */
 void dump_docstrings(t_program* program) {
+  string progdoc = g_program->get_doc();
+  if (!progdoc.empty()) {
+    printf("Whole program doc:\n%s\n", progdoc.c_str());
+  }
   const vector<t_typedef*>& typedefs = program->get_typedefs();
   vector<t_typedef*>::const_iterator t_iter;
   for (t_iter = typedefs.begin(); t_iter != typedefs.end(); ++t_iter) {
diff --git a/compiler/cpp/src/parse/t_doc.h b/compiler/cpp/src/parse/t_doc.h
index 9e3795a..bfa66ef 100644
--- a/compiler/cpp/src/parse/t_doc.h
+++ b/compiler/cpp/src/parse/t_doc.h
@@ -15,6 +15,8 @@
 class t_doc {
 
  public:
+  t_doc() : has_doc_(false) {}
+
   void set_doc(const std::string& doc) {
     doc_ = doc;
     has_doc_ = true;
diff --git a/compiler/cpp/src/parse/t_program.h b/compiler/cpp/src/parse/t_program.h
index 8b4f59c..f54ed71 100644
--- a/compiler/cpp/src/parse/t_program.h
+++ b/compiler/cpp/src/parse/t_program.h
@@ -14,6 +14,7 @@
 // For program_name()
 #include "main.h"
 
+#include "t_doc.h"
 #include "t_scope.h"
 #include "t_base_type.h"
 #include "t_typedef.h"
@@ -41,7 +42,7 @@
  *
  * @author Mark Slee <mcslee@facebook.com>
  */
-class t_program {
+class t_program : public t_doc {
  public:
   t_program(std::string path, std::string name) :
     path_(path),
diff --git a/compiler/cpp/src/thrifty.yy b/compiler/cpp/src/thrifty.yy
index 68384be..1ad0c35 100644
--- a/compiler/cpp/src/thrifty.yy
+++ b/compiler/cpp/src/thrifty.yy
@@ -186,9 +186,12 @@
  */
 
 Program:
-  HeaderList DefinitionList
+  DocTextOptional HeaderList DefinitionList
     {
       pdebug("Program -> Headers DefinitionList");
+      if ($1 != NULL) {
+        g_program->set_doc($1);
+      }
     }
 
 HeaderList:
diff --git a/test/DocTest.thrift b/test/DocTest.thrift
index c06bd21..361bdde 100755
--- a/test/DocTest.thrift
+++ b/test/DocTest.thrift
@@ -1,3 +1,9 @@
+/**
+ * Program doctext.
+ *
+ * Seriously, this is the documentation for this whole program.
+ */
+
 java_package thrift.test
 cpp_namespace thrift.test
 
@@ -67,6 +73,10 @@
   2: Xtruct struct_thing
 }
  
+/* C1 */
+/** Doc */
+/* C2 */
+/* C3 */
 struct EmptyStruct {}
 
 struct OneField {
@@ -211,3 +221,11 @@
  * }
  */
 typedef i32 BigDog
+
+/**
+*
+*
+*/
+typedef i32 TotallyDegenerate
+
+/* THE END */