add dumpapi option

multiple input aidls -> single aidl with fqnames

This will be used to ensure that a set of AIDL interfaces and
parcelables are backwards-compatible with older versions.

Bug: 110758635
Test: m -j
Test: runtests.py (AidlTest.ApiDump added)
Change-Id: I06315dca4c373046a4becfea6a225ea96dec9c9d
diff --git a/aidl_language.cpp b/aidl_language.cpp
index e034613..4da3e79 100644
--- a/aidl_language.cpp
+++ b/aidl_language.cpp
@@ -17,6 +17,8 @@
 
 #include "aidl_language_y.h"
 #include "logging.h"
+#include "type_java.h"
+#include "type_namespace.h"
 
 #ifdef _WIN32
 int isatty(int  fd)
@@ -120,6 +122,15 @@
   return ret;
 }
 
+string AidlTypeSpecifier::Signature() const {
+  string ret = ToString();
+  string annotations = AidlAnnotatable::ToString();
+  if (annotations != "") {
+    ret = annotations + " " + ret;
+  }
+  return ret;
+}
+
 bool AidlTypeSpecifier::Resolve(android::aidl::AidlTypenames& typenames) {
   assert(!IsResolved());
   pair<string, bool> result = typenames.ResolveTypename(unresolved_name_);
@@ -137,6 +148,10 @@
   return type_->ToString() + " " + name_;
 }
 
+string AidlVariableDeclaration::Signature() const {
+  return type_->Signature() + " " + name_;
+}
+
 AidlArgument::AidlArgument(AidlArgument::Direction direction, AidlTypeSpecifier* type,
                            std::string name, unsigned line)
     : AidlVariableDeclaration(type, name, line),
@@ -148,9 +163,8 @@
       direction_(AidlArgument::IN_DIR),
       direction_specified_(false) {}
 
-string AidlArgument::ToString() const {
+string AidlArgument::GetDirectionSpecifier() const {
   string ret;
-
   if (direction_specified_) {
     switch(direction_) {
     case AidlArgument::IN_DIR:
@@ -164,12 +178,17 @@
       break;
     }
   }
-
-  ret += AidlVariableDeclaration::ToString();
-
   return ret;
 }
 
+string AidlArgument::ToString() const {
+  return GetDirectionSpecifier() + AidlVariableDeclaration::ToString();
+}
+
+std::string AidlArgument::Signature() const {
+  return GetDirectionSpecifier() + AidlVariableDeclaration::Signature();
+}
+
 AidlIntConstant::AidlIntConstant(std::string name, int32_t value)
     : name_(name),
       value_(value),
@@ -236,6 +255,14 @@
   has_id_ = false;
 }
 
+string AidlMethod::Signature() const {
+  vector<string> arg_signatures;
+  for (const auto& arg : GetArguments()) {
+    arg_signatures.emplace_back(arg->Signature());
+  }
+  return GetType().Signature() + " " + GetName() + "(" + Join(arg_signatures, ", ") + ")";
+}
+
 Parser::Parser(const IoDelegate& io_delegate, android::aidl::AidlTypenames* typenames)
     : io_delegate_(io_delegate), typenames_(typenames) {
   yylex_init(&scanner_);
@@ -268,11 +295,25 @@
   }
 }
 
+void AidlParcelable::Write(CodeWriter* writer) const {
+  writer->Write("parcelable %s ;\n", GetName().c_str());
+}
+
 AidlStructuredParcelable::AidlStructuredParcelable(
     AidlQualifiedName* name, unsigned line, const std::vector<std::string>& package,
     std::vector<std::unique_ptr<AidlVariableDeclaration>>* variables)
     : AidlParcelable(name, line, package, "" /*cpp_header*/), variables_(std::move(*variables)) {}
 
+void AidlStructuredParcelable::Write(CodeWriter* writer) const {
+  writer->Write("parcelable %s {\n", GetName().c_str());
+  writer->Indent();
+  for (const auto& field : GetFields()) {
+    writer->Write("%s;\n", field->Signature().c_str());
+  }
+  writer->Dedent();
+  writer->Write("}\n");
+}
+
 AidlInterface::AidlInterface(const std::string& name, unsigned line,
                              const std::string& comments, bool oneway,
                              std::vector<std::unique_ptr<AidlMember>>* members,
@@ -299,6 +340,16 @@
   delete members;
 }
 
+void AidlInterface::Write(CodeWriter* writer) const {
+  writer->Write("interface %s {\n", GetName().c_str());
+  writer->Indent();
+  for (const auto& method : GetMethods()) {
+    writer->Write("%s;\n", method->Signature().c_str());
+  }
+  writer->Dedent();
+  writer->Write("}\n");
+}
+
 AidlDefinedType* AidlDocument::ReleaseDefinedType() {
   if (defined_types_.size() == 0) {
     return nullptr;