Preprocessed uses the same syntax of AIDL

Preprocessed file has been using a similar but different syntax.  Now,
it is using the same syntax with AIDL files with a couple of small
changes.

- Type decl can have qualified name.
  (interestinly, I only changed this for interface/enum)
- Interface can omit body(members) blocks.
  interface IFoo; // is simply an empty interface

Bug: 25479378
Test: aidl_unittests
Test: m
Change-Id: Icf5e4c321c469af00506c5ff14782251018d9d57
diff --git a/parser.cpp b/parser.cpp
index abe1dbf..d2fe362 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -27,7 +27,7 @@
 
 const AidlDocument* Parser::Parse(const std::string& filename,
                                   const android::aidl::IoDelegate& io_delegate,
-                                  AidlTypenames& typenames) {
+                                  AidlTypenames& typenames, bool is_preprocessed) {
   auto clean_path = android::aidl::IoDelegate::CleanPath(filename);
   // reuse pre-parsed document from typenames
   for (auto& doc : typenames.AllDocuments()) {
@@ -46,13 +46,18 @@
   // nulls at the end.
   raw_buffer->append(2u, '\0');
 
-  Parser parser(clean_path, *raw_buffer, typenames);
+  Parser parser(clean_path, *raw_buffer, is_preprocessed);
 
   if (yy::parser(&parser).parse() != 0 || parser.HasError()) {
     return nullptr;
   }
 
-  return parser.document_;
+  // transfer ownership to AidlTypenames and return the raw pointer
+  const AidlDocument* result = parser.document_.get();
+  if (!typenames.AddDocument(std::move(parser.document_), is_preprocessed)) {
+    return nullptr;
+  }
+  return result;
 }
 
 void Parser::SetTypeParameters(AidlTypeSpecifier* type,
@@ -68,6 +73,21 @@
   }
 }
 
+void Parser::CheckValidTypeName(const AidlToken& token, const AidlLocation& loc) {
+  if (!is_preprocessed_ && token.GetText().find('.') != std::string::npos) {
+    AIDL_ERROR(loc) << "Type name can't be qualified. Use `package`.";
+    AddError();
+  }
+}
+
+void Parser::SetPackage(const AidlPackage& package) {
+  if (is_preprocessed_) {
+    AIDL_ERROR(package) << "Preprocessed file can't declare package.";
+    AddError();
+  }
+  package_ = package.GetName();
+}
+
 class ReferenceResolver : public AidlVisitor {
  public:
   ReferenceResolver(const AidlDefinedType* scope, TypeResolver& resolver, bool* success)
@@ -162,9 +182,8 @@
   return success;
 }
 
-Parser::Parser(const std::string& filename, std::string& raw_buffer,
-               android::aidl::AidlTypenames& typenames)
-    : filename_(filename), typenames_(typenames) {
+Parser::Parser(const std::string& filename, std::string& raw_buffer, bool is_preprocessed)
+    : filename_(filename), is_preprocessed_(is_preprocessed) {
   yylex_init(&scanner_);
   buffer_ = yy_scan_buffer(&raw_buffer[0], raw_buffer.length(), scanner_);
 }