Lexer passes the list of comments to parser

The lexer has been squashing comments into a single string, which makes
it hard to distinguish the type of comments later.

Instead of re-parsing comments, now, the lexer keeps the list of
comments and pass it to the parser.

But note that we still need to parse the contents of the body of block
comments to extract @hide/@deprecated tags.

Bug: 177276676
Test: aidl_unittests
Change-Id: I5f683ba6bf9fa3fbc5e73c4f80237a25eb410f71
diff --git a/aidl_language.h b/aidl_language.h
index 7c758e6..ca45103 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -26,6 +26,7 @@
 
 #include "aidl_typenames.h"
 #include "code_writer.h"
+#include "comments.h"
 #include "diagnostics.h"
 #include "io_delegate.h"
 #include "location.h"
@@ -34,6 +35,7 @@
 
 using android::aidl::AidlTypenames;
 using android::aidl::CodeWriter;
+using android::aidl::Comments;
 using android::aidl::Options;
 using std::shared_ptr;
 using std::string;
@@ -122,7 +124,7 @@
 // Anything that is locatable in a .aidl file.
 class AidlNode {
  public:
-  AidlNode(const AidlLocation& location, const std::string& comments = "");
+  AidlNode(const AidlLocation& location, const Comments& comments = {});
 
   AidlNode(const AidlNode&) = default;
   virtual ~AidlNode() = default;
@@ -139,14 +141,14 @@
   virtual void TraverseChildren(std::function<void(const AidlNode&)> traverse) const = 0;
   virtual void DispatchVisit(AidlVisitor&) const = 0;
 
-  const std::string& GetComments() const { return comments_; }
-  void SetComments(const std::string comments) { comments_ = comments; }
+  const Comments& GetComments() const { return comments_; }
+  void SetComments(const Comments& comments) { comments_ = comments; }
 
  private:
   std::string PrintLine() const;
   std::string PrintLocation() const;
   const AidlLocation location_;
-  std::string comments_;
+  Comments comments_;
 };
 
 // unique_ptr<AidlTypeSpecifier> for type arugment,
@@ -181,7 +183,7 @@
 
 class AidlCommentable : public AidlNode {
  public:
-  AidlCommentable(const AidlLocation& location, const std::string& comments)
+  AidlCommentable(const AidlLocation& location, const Comments& comments)
       : AidlNode(location, comments) {}
   virtual ~AidlCommentable() = default;
 
@@ -237,7 +239,7 @@
   static AidlAnnotation* Parse(
       const AidlLocation& location, const string& name,
       std::map<std::string, std::shared_ptr<AidlConstantValue>>* parameter_list,
-      const std::string& comments);
+      const Comments& comments);
 
   AidlAnnotation(const AidlAnnotation&) = default;
   AidlAnnotation(AidlAnnotation&&) = default;
@@ -289,7 +291,7 @@
 
   AidlAnnotation(const AidlLocation& location, const Schema& schema,
                  std::map<std::string, std::shared_ptr<AidlConstantValue>>&& parameters,
-                 const std::string& comments);
+                 const Comments& comments);
 
   const Schema& schema_;
   std::map<std::string, std::shared_ptr<AidlConstantValue>> parameters_;
@@ -304,7 +306,7 @@
 
 class AidlAnnotatable : public AidlCommentable {
  public:
-  AidlAnnotatable(const AidlLocation& location, const std::string& comments);
+  AidlAnnotatable(const AidlLocation& location, const Comments& comments);
 
   AidlAnnotatable(const AidlAnnotatable&) = default;
   AidlAnnotatable(AidlAnnotatable&&) = default;
@@ -356,7 +358,7 @@
                                 public AidlParameterizable<unique_ptr<AidlTypeSpecifier>> {
  public:
   AidlTypeSpecifier(const AidlLocation& location, const string& unresolved_name, bool is_array,
-                    vector<unique_ptr<AidlTypeSpecifier>>* type_params, const string& comments);
+                    vector<unique_ptr<AidlTypeSpecifier>>* type_params, const Comments& comments);
   virtual ~AidlTypeSpecifier() = default;
 
   // Copy of this type which is not an array.
@@ -436,7 +438,7 @@
 
 class AidlMember : public AidlCommentable {
  public:
-  AidlMember(const AidlLocation& location, const std::string& comments);
+  AidlMember(const AidlLocation& location, const Comments& comments);
   virtual ~AidlMember() = default;
 
   // non-copyable, non-movable
@@ -810,9 +812,9 @@
 class AidlMethod : public AidlMember {
  public:
   AidlMethod(const AidlLocation& location, bool oneway, AidlTypeSpecifier* type, const string& name,
-             vector<unique_ptr<AidlArgument>>* args, const string& comments);
+             vector<unique_ptr<AidlArgument>>* args, const Comments& comments);
   AidlMethod(const AidlLocation& location, bool oneway, AidlTypeSpecifier* type, const string& name,
-             vector<unique_ptr<AidlArgument>>* args, const string& comments, int id,
+             vector<unique_ptr<AidlArgument>>* args, const Comments& comments, int id,
              bool is_user_defined = true);
   virtual ~AidlMethod() = default;
 
@@ -885,9 +887,8 @@
 // defined in the source file.
 class AidlDefinedType : public AidlAnnotatable {
  public:
-  AidlDefinedType(const AidlLocation& location, const std::string& name,
-                  const std::string& comments, const std::string& package,
-                  std::vector<std::unique_ptr<AidlMember>>* members);
+  AidlDefinedType(const AidlLocation& location, const std::string& name, const Comments& comments,
+                  const std::string& package, std::vector<std::unique_ptr<AidlMember>>* members);
   virtual ~AidlDefinedType() = default;
 
   // non-copyable, non-movable
@@ -988,7 +989,7 @@
 class AidlParcelable : public AidlDefinedType, public AidlParameterizable<std::string> {
  public:
   AidlParcelable(const AidlLocation& location, const std::string& name, const std::string& package,
-                 const std::string& comments, const std::string& cpp_header = "",
+                 const Comments& comments, const std::string& cpp_header = "",
                  std::vector<std::string>* type_params = nullptr,
                  std::vector<std::unique_ptr<AidlMember>>* members = nullptr);
   virtual ~AidlParcelable() = default;
@@ -1020,7 +1021,7 @@
 class AidlStructuredParcelable : public AidlParcelable {
  public:
   AidlStructuredParcelable(const AidlLocation& location, const std::string& name,
-                           const std::string& package, const std::string& comments,
+                           const std::string& package, const Comments& comments,
                            std::vector<std::string>* type_params,
                            std::vector<std::unique_ptr<AidlMember>>* members);
   virtual ~AidlStructuredParcelable() = default;
@@ -1046,7 +1047,7 @@
 class AidlEnumerator : public AidlCommentable {
  public:
   AidlEnumerator(const AidlLocation& location, const std::string& name, AidlConstantValue* value,
-                 const std::string& comments);
+                 const Comments& comments);
   virtual ~AidlEnumerator() = default;
 
   // non-copyable, non-movable
@@ -1080,7 +1081,7 @@
  public:
   AidlEnumDeclaration(const AidlLocation& location, const string& name,
                       std::vector<std::unique_ptr<AidlEnumerator>>* enumerators,
-                      const std::string& package, const std::string& comments);
+                      const std::string& package, const Comments& comments);
   virtual ~AidlEnumDeclaration() = default;
 
   // non-copyable, non-movable
@@ -1122,7 +1123,7 @@
 class AidlUnionDecl : public AidlParcelable {
  public:
   AidlUnionDecl(const AidlLocation& location, const std::string& name, const std::string& package,
-                const std::string& comments, std::vector<std::string>* type_params,
+                const Comments& comments, std::vector<std::string>* type_params,
                 std::vector<std::unique_ptr<AidlMember>>* members);
   virtual ~AidlUnionDecl() = default;
 
@@ -1146,7 +1147,7 @@
 
 class AidlInterface final : public AidlDefinedType {
  public:
-  AidlInterface(const AidlLocation& location, const std::string& name, const std::string& comments,
+  AidlInterface(const AidlLocation& location, const std::string& name, const Comments& comments,
                 bool oneway_, const std::string& package,
                 std::vector<std::unique_ptr<AidlMember>>* members);
   virtual ~AidlInterface() = default;
@@ -1172,7 +1173,7 @@
 
 class AidlPackage : public AidlNode {
  public:
-  AidlPackage(const AidlLocation& location, const std::string& comments)
+  AidlPackage(const AidlLocation& location, const Comments& comments)
       : AidlNode(location, comments) {}
   virtual ~AidlPackage() = default;
   void TraverseChildren(std::function<void(const AidlNode&)>) const {}
@@ -1182,7 +1183,7 @@
 class AidlImport : public AidlNode {
  public:
   AidlImport(const AidlLocation& location, const std::string& needed_class,
-             const std::string& comments);
+             const Comments& comments);
   virtual ~AidlImport() = default;
 
   // non-copyable, non-movable
@@ -1202,7 +1203,7 @@
 // AidlDocument models an AIDL file
 class AidlDocument : public AidlCommentable {
  public:
-  AidlDocument(const AidlLocation& location, const std::string& comments,
+  AidlDocument(const AidlLocation& location, const Comments& comments,
                std::vector<std::unique_ptr<AidlImport>> imports,
                std::vector<std::unique_ptr<AidlDefinedType>> defined_types)
       : AidlCommentable(location, comments),