Remove TypeNamespace

1. Remove TypeNamesapce
2. In aidl.cpp, just validate language specific restriction(validate_type)
   instead of register_type

Test: m
Test: ./runtests.sh
Bug: 110967839
Change-Id: I7406f5b326af4e2342059aef9277ddfb24775ce9
diff --git a/Android.bp b/Android.bp
index 44581fd..44ef1b2 100644
--- a/Android.bp
+++ b/Android.bp
@@ -62,9 +62,6 @@
         "line_reader.cpp",
         "io_delegate.cpp",
         "options.cpp",
-        "type_cpp.cpp",
-        "type_java.cpp",
-        "type_namespace.cpp",
     ],
     yacc: {
         gen_location_hh: true,
@@ -124,8 +121,6 @@
         "tests/test_data_ping_responder.cpp",
         "tests/test_data_string_constants.cpp",
         "tests/test_util.cpp",
-        "type_cpp_unittest.cpp",
-        "type_java_unittest.cpp",
     ],
 
     static_libs: [
diff --git a/aidl.cpp b/aidl.cpp
index 28f791e..3483593 100644
--- a/aidl.cpp
+++ b/aidl.cpp
@@ -46,9 +46,6 @@
 #include "logging.h"
 #include "options.h"
 #include "os.h"
-#include "type_cpp.h"
-#include "type_java.h"
-#include "type_namespace.h"
 
 #ifndef O_BINARY
 #  define O_BINARY  0
@@ -152,62 +149,6 @@
     return valid;
 }
 
-bool register_types(const AidlStructuredParcelable* parcel, TypeNamespace* types) {
-  for (const auto& v : parcel->GetFields()) {
-    if (!types->MaybeAddContainerType(v->GetType())) {
-      return false;
-    }
-
-    const ValidatableType* type = types->GetReturnType(v->GetType(), *parcel);
-    if (type == nullptr) {
-      return false;
-    }
-    v->GetMutableType()->SetLanguageType(type);
-  }
-  return true;
-}
-
-bool register_types(const AidlInterface* c, TypeNamespace* types) {
-  for (const auto& m : c->GetMethods()) {
-    if (!types->MaybeAddContainerType(m->GetType())) {
-      return false;
-    }
-
-    const ValidatableType* return_type = types->GetReturnType(m->GetType(), *c);
-
-    if (return_type == nullptr) {
-      return false;
-    }
-    m->GetMutableType()->SetLanguageType(return_type);
-
-    set<string> argument_names;
-
-    int index = 1;
-    for (const auto& arg : m->GetArguments()) {
-      if (!types->MaybeAddContainerType(arg->GetType())) {
-        return false;
-      }
-
-      const ValidatableType* arg_type = types->GetArgType(*arg, index, *c);
-      if (arg_type == nullptr) {
-        return false;
-      }
-      arg->GetMutableType()->SetLanguageType(arg_type);
-    }
-  }
-
-  for (const std::unique_ptr<AidlConstantDeclaration>& constant : c->GetConstantDeclarations()) {
-    AidlTypeSpecifier* specifier = constant->GetMutableType();
-    const ValidatableType* return_type = types->GetReturnType(*specifier, *c);
-    if (return_type == nullptr) {
-      return false;
-    }
-    specifier->SetLanguageType(return_type);
-  }
-
-  return true;
-}
-
 bool write_dep_file(const Options& options, const AidlDefinedType& defined_type,
                     const vector<string>& imports, const IoDelegate& io_delegate,
                     const string& input_file, const string& output_file) {
@@ -399,7 +340,7 @@
 namespace internals {
 
 bool parse_preprocessed_file(const IoDelegate& io_delegate, const string& filename,
-                             TypeNamespace* types, AidlTypenames& typenames) {
+                             AidlTypenames* typenames) {
   bool success = true;
   unique_ptr<LineReader> line_reader = io_delegate.GetLineReader(filename);
   if (!line_reader) {
@@ -436,20 +377,17 @@
       }
       AidlParcelable* doc = new AidlParcelable(
           location, new AidlQualifiedName(location, class_name, ""), package, "" /* comments */);
-      types->AddParcelableType(*doc, filename);
-      typenames.AddPreprocessedType(unique_ptr<AidlParcelable>(doc));
+      typenames->AddPreprocessedType(unique_ptr<AidlParcelable>(doc));
     } else if (decl == "structured_parcelable") {
       auto temp = new std::vector<std::unique_ptr<AidlVariableDeclaration>>();
       AidlStructuredParcelable* doc =
           new AidlStructuredParcelable(location, new AidlQualifiedName(location, class_name, ""),
                                        package, "" /* comments */, temp);
-      types->AddParcelableType(*doc, filename);
-      typenames.AddPreprocessedType(unique_ptr<AidlStructuredParcelable>(doc));
+      typenames->AddPreprocessedType(unique_ptr<AidlStructuredParcelable>(doc));
     } else if (decl == "interface") {
       auto temp = new std::vector<std::unique_ptr<AidlMember>>();
       AidlInterface* doc = new AidlInterface(location, class_name, "", false, temp, package);
-      types->AddBinderType(*doc, filename);
-      typenames.AddPreprocessedType(unique_ptr<AidlInterface>(doc));
+      typenames->AddPreprocessedType(unique_ptr<AidlInterface>(doc));
     } else {
       success = false;
       break;
@@ -464,7 +402,7 @@
 }
 
 AidlError load_and_validate_aidl(const std::string& input_file_name, const Options& options,
-                                 const IoDelegate& io_delegate, TypeNamespace* types,
+                                 const IoDelegate& io_delegate, AidlTypenames* typenames,
                                  vector<AidlDefinedType*>* defined_types,
                                  vector<string>* imported_files) {
   AidlError err = AidlError::OK;
@@ -474,8 +412,7 @@
   //////////////////////////////////////////////////////////////////////////
 
   // Parse the main input file
-  std::unique_ptr<Parser> main_parser =
-      Parser::Parse(input_file_name, io_delegate, types->typenames_);
+  std::unique_ptr<Parser> main_parser = Parser::Parse(input_file_name, io_delegate, *typenames);
   if (main_parser == nullptr) {
     return AidlError::PARSE_ERROR;
   }
@@ -483,13 +420,10 @@
     AIDL_ERROR(input_file_name) << "You must declare only one type per a file.";
     return AidlError::BAD_TYPE;
   }
-  if (!types->AddDefinedTypes(main_parser->GetDefinedTypes(), input_file_name)) {
-    return AidlError::BAD_TYPE;
-  }
 
   // Import the preprocessed file
   for (const string& s : options.PreprocessedFiles()) {
-    if (!parse_preprocessed_file(io_delegate, s, types, types->typenames_)) {
+    if (!parse_preprocessed_file(io_delegate, s, typenames)) {
       err = AidlError::BAD_PRE_PROCESSED_FILE;
     }
   }
@@ -523,7 +457,7 @@
   set<string> import_candidates(type_from_import_statements);
   import_candidates.insert(unresolved_types.begin(), unresolved_types.end());
   for (const auto& import : import_candidates) {
-    if (types->HasImportType(import)) {
+    if (typenames->IsIgnorableImport(import)) {
       // There are places in the Android tree where an import doesn't resolve,
       // but we'll pick the type up through the preprocessed types.
       // This seems like an error, but legacy support demands we support it...
@@ -541,16 +475,12 @@
 
     import_paths.emplace_back(import_path);
 
-    std::unique_ptr<Parser> import_parser =
-        Parser::Parse(import_path, io_delegate, types->typenames_);
+    std::unique_ptr<Parser> import_parser = Parser::Parse(import_path, io_delegate, *typenames);
     if (import_parser == nullptr) {
       cerr << "error while importing " << import_path << " for " << import << endl;
       err = AidlError::BAD_IMPORT;
       continue;
     }
-    if (!types->AddDefinedTypes(import_parser->GetDefinedTypes(), import_path)) {
-      return AidlError::BAD_TYPE;
-    }
   }
   if (err != AidlError::OK) {
     return err;
@@ -559,16 +489,12 @@
   for (const auto& imported_file : options.ImportFiles()) {
     import_paths.emplace_back(imported_file);
 
-    std::unique_ptr<Parser> import_parser =
-        Parser::Parse(imported_file, io_delegate, types->typenames_);
+    std::unique_ptr<Parser> import_parser = Parser::Parse(imported_file, io_delegate, *typenames);
     if (import_parser == nullptr) {
       AIDL_ERROR(imported_file) << "error while importing " << imported_file;
       err = AidlError::BAD_IMPORT;
       continue;
     }
-    if (!types->AddDefinedTypes(import_parser->GetDefinedTypes(), imported_file)) {
-      return AidlError::BAD_TYPE;
-    }
   }
   if (err != AidlError::OK) {
     return err;
@@ -581,34 +507,10 @@
     // using fully qualified names.
     return AidlError::BAD_TYPE;
   }
-  if (!is_check_api) {
-    for (const auto defined_type : main_parser->GetDefinedTypes()) {
-      AidlInterface* interface = defined_type->AsInterface();
-      AidlStructuredParcelable* parcelable = defined_type->AsStructuredParcelable();
-
-      // Link the AIDL type with the type of the target language. This will
-      // be removed when the migration to AidlTypenames is done.
-      defined_type->SetLanguageType(types->GetDefinedType(*defined_type));
-
-      if (interface != nullptr) {
-        if (!register_types(interface, types)) {
-          return AidlError::BAD_TYPE;
-        }
-      }
-      if (parcelable != nullptr) {
-        if (!register_types(parcelable, types)) {
-          return AidlError::BAD_TYPE;
-        }
-      }
-    }
-  }
-
   //////////////////////////////////////////////////////////////////////////
   // Validation phase
   //////////////////////////////////////////////////////////////////////////
 
-  AidlTypenames& typenames = types->typenames_;
-
   // For legacy reasons, by default, compiling an unstructured parcelable (which contains no output)
   // is allowed. This must not be returned as an error until the very end of this procedure since
   // this may be considered a success, and we should first check that there are not other, more
@@ -618,9 +520,20 @@
   const int num_defined_types = main_parser->GetDefinedTypes().size();
   for (const auto defined_type : main_parser->GetDefinedTypes()) {
     CHECK(defined_type != nullptr);
+
+    // Language specific validation
+    AidlError check_result = AidlError::OK;
+    if (!defined_type->LanguageSpecificCheckValid(options.TargetLanguage())) {
+      return AidlError::BAD_TYPE;
+    }
+
+    if (check_result != AidlError::OK) {
+      return check_result;
+    }
+
     AidlParcelable* unstructuredParcelable = defined_type->AsUnstructuredParcelable();
     if (unstructuredParcelable != nullptr) {
-      if (!unstructuredParcelable->CheckValid(typenames)) {
+      if (!unstructuredParcelable->CheckValid(*typenames)) {
         return AidlError::BAD_TYPE;
       }
       bool isStable = unstructuredParcelable->IsStableParcelable();
@@ -662,7 +575,7 @@
     if (!is_check_api) {
       // No need to do this for check api because all typespecs are already
       // using fully qualified name and we don't import in AIDL files.
-      if (!defined_type->CheckValid(typenames)) {
+      if (!defined_type->CheckValid(*typenames)) {
         return AidlError::BAD_TYPE;
       }
     }
@@ -672,7 +585,7 @@
       if (options.Version() > 0) {
         AidlTypeSpecifier* ret =
             new AidlTypeSpecifier(AIDL_LOCATION_HERE, "int", false, nullptr, "");
-        ret->Resolve(typenames);
+        ret->Resolve(*typenames);
         vector<unique_ptr<AidlArgument>>* args = new vector<unique_ptr<AidlArgument>>();
         AidlMethod* method =
             new AidlMethod(AIDL_LOCATION_HERE, false, ret, "getInterfaceVersion", args, "",
@@ -685,7 +598,7 @@
     }
   }
 
-  typenames.IterateTypes([&](const AidlDefinedType& type) {
+  typenames->IterateTypes([&](const AidlDefinedType& type) {
     if (options.IsStructured() && type.AsUnstructuredParcelable() != nullptr &&
         !type.AsUnstructuredParcelable()->IsStableParcelable()) {
       err = AidlError::NOT_STRUCTURED;
@@ -724,30 +637,13 @@
 int compile_aidl(const Options& options, const IoDelegate& io_delegate) {
   const Options::Language lang = options.TargetLanguage();
   for (const string& input_file : options.InputFiles()) {
-    // Create type namespace that will hold the types identified by the parser.
-    // This two namespaces that are specific to the target language will be
-    // unified to AidlTypenames which is agnostic to the target language.
-    cpp::TypeNamespace cpp_types;
-    cpp_types.Init();
-
-    java::JavaTypeNamespace java_types;
-    java_types.Init();
-
-    TypeNamespace* types;
-    if (options.IsCppOutput()) {
-      types = &cpp_types;
-    } else if (lang == Options::Language::JAVA) {
-      types = &java_types;
-    } else {
-      LOG(FATAL) << "Unsupported target language." << endl;
-      return 1;
-    }
+    AidlTypenames typenames;
 
     vector<AidlDefinedType*> defined_types;
     vector<string> imported_files;
 
-    AidlError aidl_err = internals::load_and_validate_aidl(input_file, options, io_delegate, types,
-                                                           &defined_types, &imported_files);
+    AidlError aidl_err = internals::load_and_validate_aidl(
+        input_file, options, io_delegate, &typenames, &defined_types, &imported_files);
     bool allowError = aidl_err == AidlError::FOUND_PARCELABLE && !options.FailOnParcelable();
     if (aidl_err != AidlError::OK && !allowError) {
       return 1;
@@ -772,15 +668,14 @@
 
       bool success = false;
       if (lang == Options::Language::CPP) {
-        success = cpp::GenerateCpp(output_file_name, options, cpp_types.typenames_, *defined_type,
-                                   io_delegate);
+        success =
+            cpp::GenerateCpp(output_file_name, options, typenames, *defined_type, io_delegate);
       } else if (lang == Options::Language::NDK) {
-        ndk::GenerateNdk(output_file_name, options, cpp_types.typenames_, *defined_type,
-                         io_delegate);
+        ndk::GenerateNdk(output_file_name, options, typenames, *defined_type, io_delegate);
         success = true;
       } else if (lang == Options::Language::JAVA) {
-        success = java::generate_java(output_file_name, defined_type, java_types.typenames_,
-                                      io_delegate, options);
+        success =
+            java::generate_java(output_file_name, defined_type, typenames, io_delegate, options);
       } else {
         LOG(FATAL) << "Should not reach here" << endl;
         return 1;
@@ -796,13 +691,12 @@
 bool dump_mappings(const Options& options, const IoDelegate& io_delegate) {
   android::aidl::mappings::SignatureMap all_mappings;
   for (const string& input_file : options.InputFiles()) {
-    java::JavaTypeNamespace java_types;
-    java_types.Init();
+    AidlTypenames typenames;
     vector<AidlDefinedType*> defined_types;
     vector<string> imported_files;
 
     AidlError aidl_err = internals::load_and_validate_aidl(
-        input_file, options, io_delegate, &java_types, &defined_types, &imported_files);
+        input_file, options, io_delegate, &typenames, &defined_types, &imported_files);
     if (aidl_err != AidlError::OK) {
       LOG(WARNING) << "AIDL file is invalid.\n";
       continue;
@@ -849,10 +743,9 @@
 
 bool dump_api(const Options& options, const IoDelegate& io_delegate) {
   for (const auto& file : options.InputFiles()) {
-    java::JavaTypeNamespace ns;
-    ns.Init();
+    AidlTypenames typenames;
     vector<AidlDefinedType*> defined_types;
-    if (internals::load_and_validate_aidl(file, options, io_delegate, &ns, &defined_types,
+    if (internals::load_and_validate_aidl(file, options, io_delegate, &typenames, &defined_types,
                                           nullptr) == AidlError::OK) {
       for (const auto type : defined_types) {
         unique_ptr<CodeWriter> writer =
diff --git a/aidl.h b/aidl.h
index 5b5799c..955b280 100644
--- a/aidl.h
+++ b/aidl.h
@@ -25,7 +25,6 @@
 #include "import_resolver.h"
 #include "io_delegate.h"
 #include "options.h"
-#include "type_namespace.h"
 
 namespace android {
 namespace aidl {
@@ -56,12 +55,12 @@
 namespace internals {
 
 AidlError load_and_validate_aidl(const std::string& input_file_name, const Options& options,
-                                 const IoDelegate& io_delegate, TypeNamespace* types,
+                                 const IoDelegate& io_delegate, AidlTypenames* typenames,
                                  vector<AidlDefinedType*>* defined_types,
                                  vector<string>* imported_files);
 
 bool parse_preprocessed_file(const IoDelegate& io_delegate, const std::string& filename,
-                             TypeNamespace* types, AidlTypenames& typenames);
+                             AidlTypenames* typenames);
 
 } // namespace internals
 
diff --git a/aidl_apicheck.cpp b/aidl_apicheck.cpp
index 4bedd17..3030ebd 100644
--- a/aidl_apicheck.cpp
+++ b/aidl_apicheck.cpp
@@ -16,8 +16,8 @@
 #include "aidl.h"
 #include "aidl_language.h"
 #include "import_resolver.h"
+#include "logging.h"
 #include "options.h"
-#include "type_java.h"
 
 #include <map>
 #include <string>
@@ -179,9 +179,7 @@
   CHECK(options.IsStructured());
   CHECK(options.InputFiles().size() == 2) << "--checkapi requires two inputs "
                                           << "but got " << options.InputFiles().size();
-
-  java::JavaTypeNamespace old_ns;
-  old_ns.Init();
+  AidlTypenames old_tns;
   const string old_dir = options.InputFiles().at(0);
   vector<AidlDefinedType*> old_types;
   vector<string> old_files = io_delegate.ListFiles(old_dir);
@@ -191,7 +189,7 @@
   }
   for (const auto& file : old_files) {
     vector<AidlDefinedType*> types;
-    if (internals::load_and_validate_aidl(file, options, io_delegate, &old_ns, &types,
+    if (internals::load_and_validate_aidl(file, options, io_delegate, &old_tns, &types,
                                           nullptr /* imported_files */) != AidlError::OK) {
       AIDL_ERROR(file) << "Failed to read.";
       return false;
@@ -199,8 +197,7 @@
     old_types.insert(old_types.end(), types.begin(), types.end());
   }
 
-  java::JavaTypeNamespace new_ns;
-  new_ns.Init();
+  AidlTypenames new_tns;
   const string new_dir = options.InputFiles().at(1);
   vector<AidlDefinedType*> new_types;
   vector<string> new_files = io_delegate.ListFiles(new_dir);
@@ -210,7 +207,7 @@
   }
   for (const auto& file : new_files) {
     vector<AidlDefinedType*> types;
-    if (internals::load_and_validate_aidl(file, options, io_delegate, &new_ns, &types,
+    if (internals::load_and_validate_aidl(file, options, io_delegate, &new_tns, &types,
                                           nullptr /* imported_files */) != AidlError::OK) {
       AIDL_ERROR(file) << "Failed to read.";
       return false;
diff --git a/aidl_language.cpp b/aidl_language.cpp
index 6068415..5eeb8ad 100644
--- a/aidl_language.cpp
+++ b/aidl_language.cpp
@@ -17,7 +17,6 @@
 
 #include "aidl_language_y.h"
 #include "logging.h"
-#include "type_namespace.h"
 
 #ifdef _WIN32
 int isatty(int  fd)
@@ -37,6 +36,22 @@
 using std::unique_ptr;
 using std::vector;
 
+namespace {
+bool is_java_keyword(const char* str) {
+  static const std::vector<std::string> kJavaKeywords{
+      "abstract", "assert", "boolean",    "break",     "byte",       "case",      "catch",
+      "char",     "class",  "const",      "continue",  "default",    "do",        "double",
+      "else",     "enum",   "extends",    "final",     "finally",    "float",     "for",
+      "goto",     "if",     "implements", "import",    "instanceof", "int",       "interface",
+      "long",     "native", "new",        "package",   "private",    "protected", "public",
+      "return",   "short",  "static",     "strictfp",  "super",      "switch",    "synchronized",
+      "this",     "throw",  "throws",     "transient", "try",        "void",      "volatile",
+      "while",    "true",   "false",      "null",
+  };
+  return std::find(kJavaKeywords.begin(), kJavaKeywords.end(), str) != kJavaKeywords.end();
+}
+}  // namespace
+
 void yylex_init(void **);
 void yylex_destroy(void *);
 void yyset_in(FILE *f, void *);
@@ -780,6 +795,88 @@
   return true;
 }
 
+// TODO: we should treat every backend all the same in future.
+bool AidlTypeSpecifier::LanguageSpecificCheckValid(Options::Language lang) const {
+  if (lang == Options::Language::CPP) {
+    if (this->GetName() == "List" && !this->IsGeneric()) {
+      AIDL_ERROR(this) << "List without type isn't supported in cpp.";
+      return false;
+    }
+  }
+  if (this->IsGeneric()) {
+    if (this->GetName() == "List") {
+      if (this->GetTypeParameters().size() != 1) {
+        AIDL_ERROR(this) << "List must have only one type parameter.";
+        return false;
+      }
+      if (lang == Options::Language::CPP) {
+        auto& name = this->GetTypeParameters()[0]->GetName();
+        if (!(name == "String" || name == "IBinder")) {
+          AIDL_ERROR(this) << "List in cpp supports only string and IBinder for now.";
+          return false;
+        }
+      } else if (lang == Options::Language::NDK) {
+        AIDL_ERROR(this) << "NDK backend does not support List yet.";
+        return false;
+      }
+
+    } else if (this->GetName() == "Map") {
+      if (lang != Options::Language::JAVA) {
+        AIDL_ERROR(this) << "Currently, only Java backend supports Map.";
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+// TODO: we should treat every backend all the same in future.
+bool AidlParcelable::LanguageSpecificCheckValid(Options::Language lang) const {
+  if (lang != Options::Language::JAVA) {
+    if (this->IsStableParcelable()) {
+      AIDL_ERROR(this) << "@JavaOnlyStableParcelable supports only Java target.";
+      return false;
+    }
+    const AidlParcelable* unstructuredParcelable = this->AsUnstructuredParcelable();
+    if (unstructuredParcelable != nullptr) {
+      if (unstructuredParcelable->GetCppHeader().empty()) {
+        AIDL_ERROR(unstructuredParcelable)
+            << "Unstructured parcelable must have C++ header defined.";
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+// TODO: we should treat every backend all the same in future.
+bool AidlStructuredParcelable::LanguageSpecificCheckValid(Options::Language lang) const {
+  if (!AidlParcelable::LanguageSpecificCheckValid(lang)) {
+    return false;
+  }
+  for (const auto& v : this->GetFields()) {
+    if (!v->GetType().LanguageSpecificCheckValid(lang)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+// TODO: we should treat every backend all the same in future.
+bool AidlInterface::LanguageSpecificCheckValid(Options::Language lang) const {
+  for (const auto& m : this->GetMethods()) {
+    if (!m->GetType().LanguageSpecificCheckValid(lang)) {
+      return false;
+    }
+    for (const auto& arg : m->GetArguments()) {
+      if (!arg->GetType().LanguageSpecificCheckValid(lang)) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
 AidlInterface::AidlInterface(const AidlLocation& location, const std::string& name,
                              const std::string& comments, bool oneway,
                              std::vector<std::unique_ptr<AidlMember>>* members,
@@ -852,6 +949,29 @@
         AIDL_ERROR(m) << "oneway method '" << m->GetName() << "' cannot have out parameters";
         return false;
       }
+      const bool can_be_out = typenames.CanBeOutParameter(arg->GetType());
+      if (!arg->DirectionWasSpecified() && can_be_out) {
+        AIDL_ERROR(arg) << "'" << arg->GetType().ToString()
+                        << "' can be an out type, so you must declare it as in, out, or inout.";
+        return false;
+      }
+
+      if (arg->GetDirection() != AidlArgument::IN_DIR && !can_be_out) {
+        AIDL_ERROR(arg) << "'" << arg->ToString() << "' can only be an in parameter.";
+        return false;
+      }
+
+      // check that the name doesn't match a keyword
+      if (is_java_keyword(arg->GetName().c_str())) {
+        AIDL_ERROR(arg) << "Argument name is a Java or aidl keyword";
+        return false;
+      }
+
+      // Reserve a namespace for internal use
+      if (android::base::StartsWith(arg->GetName(), "_aidl")) {
+        AIDL_ERROR(arg) << "Argument name cannot begin with '_aidl'";
+        return false;
+      }
     }
 
     auto it = method_names.find(m->GetName());
diff --git a/aidl_language.h b/aidl_language.h
index 3895432..ee8a201 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -3,6 +3,7 @@
 #include "aidl_typenames.h"
 #include "code_writer.h"
 #include "io_delegate.h"
+#include "options.h"
 
 #include <memory>
 #include <string>
@@ -16,11 +17,11 @@
 
 using android::aidl::AidlTypenames;
 using android::aidl::CodeWriter;
+using android::aidl::Options;
 using std::shared_ptr;
 using std::string;
 using std::unique_ptr;
 using std::vector;
-
 class AidlNode;
 
 namespace android {
@@ -257,6 +258,7 @@
   bool Resolve(android::aidl::AidlTypenames& typenames);
 
   bool CheckValid(const AidlTypenames& typenames) const;
+  bool LanguageSpecificCheckValid(Options::Language lang) const;
 
   void SetLanguageType(const android::aidl::ValidatableType* language_type) {
     language_type_ = language_type;
@@ -536,7 +538,7 @@
   virtual const AidlParcelable* AsParcelable() const { return nullptr; }
   virtual const AidlInterface* AsInterface() const { return nullptr; }
   virtual bool CheckValid(const AidlTypenames&) const { return CheckValidAnnotations(); }
-
+  virtual bool LanguageSpecificCheckValid(Options::Language lang) const = 0;
   AidlStructuredParcelable* AsStructuredParcelable() {
     return const_cast<AidlStructuredParcelable*>(
         const_cast<const AidlDefinedType*>(this)->AsStructuredParcelable());
@@ -589,7 +591,7 @@
   std::string GetCppHeader() const { return cpp_header_; }
 
   bool CheckValid(const AidlTypenames& typenames) const override;
-
+  bool LanguageSpecificCheckValid(Options::Language lang) const override;
   const AidlParcelable* AsParcelable() const override { return this; }
   std::string GetPreprocessDeclarationName() const override { return "parcelable"; }
 
@@ -618,6 +620,7 @@
   void Write(CodeWriter* writer) const override;
 
   bool CheckValid(const AidlTypenames& typenames) const override;
+  bool LanguageSpecificCheckValid(Options::Language lang) const override;
 
  private:
   const std::vector<std::unique_ptr<AidlVariableDeclaration>> variables_;
@@ -645,6 +648,7 @@
   void Write(CodeWriter* writer) const override;
 
   bool CheckValid(const AidlTypenames& typenames) const override;
+  bool LanguageSpecificCheckValid(Options::Language lang) const override;
 
  private:
   std::vector<std::unique_ptr<AidlMethod>> methods_;
diff --git a/aidl_typenames.cpp b/aidl_typenames.cpp
index 3b79aba..32b03bd 100644
--- a/aidl_typenames.cpp
+++ b/aidl_typenames.cpp
@@ -81,6 +81,13 @@
   return true;
 }
 
+bool AidlTypenames::IsIgnorableImport(const string& import) const {
+  static set<string> ignore_import = {"android.os.IInterface",   "android.os.IBinder",
+                                      "android.os.Parcelable",   "android.os.Parcel",
+                                      "android.content.Context", "java.lang.String"};
+  return ResolveTypename(import).second || ignore_import.find(import) != ignore_import.end();
+}
+
 bool AidlTypenames::AddDefinedType(unique_ptr<AidlDefinedType> type) {
   const string name = type->GetCanonicalName();
   if (defined_types_.find(name) != defined_types_.end()) {
diff --git a/aidl_typenames.h b/aidl_typenames.h
index 74db49c..3a64ef2 100644
--- a/aidl_typenames.h
+++ b/aidl_typenames.h
@@ -58,7 +58,7 @@
   const AidlDefinedType* TryGetDefinedType(const string& type_name) const;
   pair<string, bool> ResolveTypename(const string& type_name) const;
   bool CanBeOutParameter(const AidlTypeSpecifier& type) const;
-
+  bool IsIgnorableImport(const string& import) const;
   // Iterates over all defined and then preprocessed types
   void IterateTypes(const std::function<void(const AidlDefinedType&)>& body) const;
 
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index 2a5a5d7..3763f75 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -26,10 +26,9 @@
 #include "aidl_apicheck.h"
 #include "aidl_language.h"
 #include "aidl_to_cpp.h"
+#include "aidl_to_java.h"
+#include "options.h"
 #include "tests/fake_io_delegate.h"
-#include "type_cpp.h"
-#include "type_java.h"
-#include "type_namespace.h"
 
 using android::aidl::internals::parse_preprocessed_file;
 using android::aidl::test::FakeIoDelegate;
@@ -144,8 +143,6 @@
 class AidlTest : public ::testing::Test {
  protected:
   void SetUp() override {
-    java_types_.Init();
-    cpp_types_.Init();
     CaptureStderr();
   }
 
@@ -158,15 +155,15 @@
 
   void AddExpectedStderr(string expected) { expected_stderr_.push_back(expected); }
 
-  AidlDefinedType* Parse(const string& path, const string& contents, TypeNamespace* types,
-                         AidlError* error = nullptr,
+  AidlDefinedType* Parse(const string& path, const string& contents, AidlTypenames& typenames_,
+                         Options::Language lang, AidlError* error = nullptr,
                          const vector<string> additional_arguments = {}) {
     io_delegate_.SetFileContents(path, contents);
     vector<string> args;
-    if (types == &java_types_) {
-      args.emplace_back("aidl");
-    } else {
+    if (lang == Options::Language::CPP) {
       args.emplace_back("aidl-cpp");
+    } else {
+      args.emplace_back("aidl");
     }
     for (const string& s : additional_arguments) {
       args.emplace_back(s);
@@ -183,7 +180,7 @@
     vector<string> imported_files;
     ImportResolver import_resolver{io_delegate_, path, import_paths_, {}};
     AidlError actual_error = ::android::aidl::internals::load_and_validate_aidl(
-        path, options, io_delegate_, types, &defined_types, &imported_files);
+        path, options, io_delegate_, &typenames_, &defined_types, &imported_files);
 
     if (error != nullptr) {
       *error = actual_error;
@@ -202,18 +199,21 @@
   vector<string> preprocessed_files_;
   set<string> import_paths_;
   vector<string> expected_stderr_;
-  java::JavaTypeNamespace java_types_;
-  cpp::TypeNamespace cpp_types_;
+  AidlTypenames typenames_;
 };
 
 TEST_F(AidlTest, AcceptMissingPackage) {
-  EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { }", &java_types_));
-  EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { }", &cpp_types_));
+  EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { }", typenames_, Options::Language::JAVA));
+  typenames_.Reset();
+  EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { }", typenames_, Options::Language::CPP));
 }
 
 TEST_F(AidlTest, EndsInSingleLineComment) {
-  EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { } // foo", &java_types_));
-  EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { } // foo", &cpp_types_));
+  EXPECT_NE(nullptr,
+            Parse("IFoo.aidl", "interface IFoo { } // foo", typenames_, Options::Language::JAVA));
+  typenames_.Reset();
+  EXPECT_NE(nullptr,
+            Parse("IFoo.aidl", "interface IFoo { } // foo", typenames_, Options::Language::CPP));
 }
 
 TEST_F(AidlTest, RejectsArraysOfBinders) {
@@ -224,18 +224,22 @@
   string contents = "package foo;\n"
                     "import bar.IBar;\n"
                     "interface IFoo { void f(in IBar[] input); }";
-  EXPECT_EQ(nullptr, Parse(path, contents, &java_types_));
-  EXPECT_EQ(nullptr, Parse(path, contents, &cpp_types_));
+  EXPECT_EQ(nullptr, Parse(path, contents, typenames_, Options::Language::JAVA));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse(path, contents, typenames_, Options::Language::CPP));
 }
 
 TEST_F(AidlTest, SupportOnlyOutParameters) {
   string interface_list = "package a; interface IBar { void f(out List bar); }";
   string interface_ibinder = "package a; interface IBaz { void f(out IBinder bar); }";
   // List without type isn't supported in cpp.
-  EXPECT_EQ(nullptr, Parse("a/IBar.aidl", interface_list, &cpp_types_));
-  EXPECT_NE(nullptr, Parse("a/IBar.aidl", interface_list, &java_types_));
-  EXPECT_EQ(nullptr, Parse("a/IBaz.aidl", interface_ibinder, &cpp_types_));
-  EXPECT_EQ(nullptr, Parse("a/IBaz.aidl", interface_ibinder, &java_types_));
+  EXPECT_EQ(nullptr, Parse("a/IBar.aidl", interface_list, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_NE(nullptr, Parse("a/IBar.aidl", interface_list, typenames_, Options::Language::JAVA));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IBaz.aidl", interface_ibinder, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IBaz.aidl", interface_ibinder, typenames_, Options::Language::JAVA));
 }
 
 TEST_F(AidlTest, RejectsOnewayOutParameters) {
@@ -243,49 +247,55 @@
       "package a; oneway interface IFoo { void f(out int bar); }";
   string oneway_method =
       "package a; interface IBar { oneway void f(out int bar); }";
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_interface, &cpp_types_));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_interface, &java_types_));
-  EXPECT_EQ(nullptr, Parse("a/IBar.aidl", oneway_method, &cpp_types_));
-  EXPECT_EQ(nullptr, Parse("a/IBar.aidl", oneway_method, &java_types_));
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_interface, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_interface, typenames_, Options::Language::JAVA));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IBar.aidl", oneway_method, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IBar.aidl", oneway_method, typenames_, Options::Language::JAVA));
 }
 
 TEST_F(AidlTest, RejectsOnewayNonVoidReturn) {
   string oneway_method = "package a; interface IFoo { oneway int f(); }";
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, &cpp_types_));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, &java_types_));
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, Options::Language::JAVA));
 }
 
 TEST_F(AidlTest, RejectsNullablePrimitive) {
   string oneway_method = "package a; interface IFoo { @nullable int f(); }";
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, &cpp_types_));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, &java_types_));
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, Options::Language::JAVA));
 }
 
 TEST_F(AidlTest, RejectsDuplicatedArgumentNames) {
   string method = "package a; interface IFoo { void f(int a, int a); }";
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, &cpp_types_));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, &java_types_));
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, Options::Language::JAVA));
 }
 
 TEST_F(AidlTest, RejectsDuplicatedAnnotationParams) {
   string method = "package a; interface IFoo { @UnsupportedAppUsage(foo=1, foo=2)void f(); }";
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, &cpp_types_));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, &java_types_));
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, Options::Language::JAVA));
 }
 
 TEST_F(AidlTest, ParsesNullableAnnotation) {
   for (auto is_nullable: {true, false}) {
-    auto parse_result = Parse(
-        "a/IFoo.aidl",
-        StringPrintf( "package a; interface IFoo {%s String f(); }",
-                     (is_nullable) ? "@nullable" : ""),
-        &cpp_types_);
+    auto parse_result = Parse("a/IFoo.aidl",
+                              StringPrintf("package a; interface IFoo {%s String f(); }",
+                                           (is_nullable) ? "@nullable" : ""),
+                              typenames_, Options::Language::CPP);
     ASSERT_NE(nullptr, parse_result);
     const AidlInterface* interface = parse_result->AsInterface();
     ASSERT_NE(nullptr, interface);
     ASSERT_FALSE(interface->GetMethods().empty());
     EXPECT_EQ(interface->GetMethods()[0]->GetType().IsNullable(), is_nullable);
-    cpp_types_.typenames_.Reset();
+    typenames_.Reset();
   }
 }
 
@@ -293,51 +303,52 @@
   for (auto is_utf8: {true, false}) {
     auto parse_result = Parse(
         "a/IFoo.aidl",
-        StringPrintf( "package a; interface IFoo {%s String f(); }",
-                     (is_utf8) ? "@utf8InCpp" : ""),
-        &cpp_types_);
+        StringPrintf("package a; interface IFoo {%s String f(); }", (is_utf8) ? "@utf8InCpp" : ""),
+        typenames_, Options::Language::CPP);
     ASSERT_NE(nullptr, parse_result);
     const AidlInterface* interface = parse_result->AsInterface();
     ASSERT_NE(nullptr, interface);
     ASSERT_FALSE(interface->GetMethods().empty());
     EXPECT_EQ(interface->GetMethods()[0]->GetType().IsUtf8InCpp(), is_utf8);
-    cpp_types_.typenames_.Reset();
+    typenames_.Reset();
   }
 }
 
 TEST_F(AidlTest, VintfRequiresStructuredAndStability) {
   AidlError error;
-  auto parse_result = Parse("IFoo.aidl", "@VintfStability interface IFoo {}", &cpp_types_, &error);
+  auto parse_result = Parse("IFoo.aidl", "@VintfStability interface IFoo {}", typenames_,
+                            Options::Language::CPP, &error);
   ASSERT_EQ(AidlError::NOT_STRUCTURED, error);
   ASSERT_EQ(nullptr, parse_result);
 }
 
 TEST_F(AidlTest, VintfRequiresStructured) {
   AidlError error;
-  auto parse_result = Parse("IFoo.aidl", "@VintfStability interface IFoo {}", &cpp_types_, &error,
-                            {"--stability", "vintf"});
+  auto parse_result = Parse("IFoo.aidl", "@VintfStability interface IFoo {}", typenames_,
+                            Options::Language::CPP, &error, {"--stability", "vintf"});
   ASSERT_EQ(AidlError::NOT_STRUCTURED, error);
   ASSERT_EQ(nullptr, parse_result);
 }
 
 TEST_F(AidlTest, VintfRequiresSpecifiedStability) {
   AidlError error;
-  auto parse_result = Parse("IFoo.aidl", "@VintfStability interface IFoo {}", &cpp_types_, &error,
-                            {"--structured"});
+  auto parse_result = Parse("IFoo.aidl", "@VintfStability interface IFoo {}", typenames_,
+                            Options::Language::CPP, &error, {"--structured"});
   ASSERT_EQ(AidlError::NOT_STRUCTURED, error);
   ASSERT_EQ(nullptr, parse_result);
 }
 
 TEST_F(AidlTest, ParsesStabilityAnnotations) {
   AidlError error;
-  auto parse_result = Parse("IFoo.aidl", "@VintfStability interface IFoo {}", &cpp_types_, &error,
-                            {"--structured", "--stability", "vintf"});
+  auto parse_result =
+      Parse("IFoo.aidl", "@VintfStability interface IFoo {}", typenames_, Options::Language::CPP,
+            &error, {"--structured", "--stability", "vintf"});
   ASSERT_EQ(AidlError::OK, error);
   ASSERT_NE(nullptr, parse_result);
   const AidlInterface* interface = parse_result->AsInterface();
   ASSERT_NE(nullptr, interface);
   ASSERT_TRUE(interface->IsVintfStability());
-  cpp_types_.typenames_.Reset();
+  typenames_.Reset();
 }
 
 TEST_F(AidlTest, ParsesJavaOnlyStableParcelable) {
@@ -348,6 +359,8 @@
       "a/Foo.aidl", StringPrintf("package a; @JavaOnlyStableParcelable parcelable Foo;"));
 
   EXPECT_EQ(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
+  AddExpectedStderr(
+      "ERROR: a/Foo.aidl:1.48-52: @JavaOnlyStableParcelable supports only Java target.\n");
   EXPECT_NE(0, ::android::aidl::compile_aidl(cpp_options, io_delegate_));
 }
 
@@ -355,16 +368,20 @@
   string oneway_method = "package a; interface IFoo { oneway void f(int a); }";
   string oneway_interface =
       "package a; oneway interface IBar { void f(int a); }";
-  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, &cpp_types_));
-  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, &java_types_));
-  EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, &cpp_types_));
-  EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, &java_types_));
+  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, Options::Language::JAVA));
+  typenames_.Reset();
+  EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, typenames_, Options::Language::JAVA));
 }
 
 TEST_F(AidlTest, AcceptsAnnotatedOnewayMethod) {
   string oneway_method = "package a; interface IFoo { @UnsupportedAppUsage oneway void f(int a); }";
-  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, &cpp_types_));
-  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, &java_types_));
+  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, Options::Language::CPP));
+  typenames_.Reset();
+  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, Options::Language::JAVA));
 }
 
 TEST_F(AidlTest, WritesComments) {
@@ -374,7 +391,7 @@
       "  /* j */ @nullable String j();"
       "  /* k */ @UnsupportedAppUsage oneway void k(int a); }";
 
-  auto parse_result = Parse("a/IFoo.aidl", foo_interface, &java_types_);
+  auto parse_result = Parse("a/IFoo.aidl", foo_interface, typenames_, Options::Language::JAVA);
   EXPECT_NE(nullptr, parse_result);
   EXPECT_EQ("/* foo */", parse_result->GetComments());
 
@@ -387,19 +404,20 @@
 TEST_F(AidlTest, ParsesPreprocessedFile) {
   string simple_content = "parcelable a.Foo;\ninterface b.IBar;";
   io_delegate_.SetFileContents("path", simple_content);
-  EXPECT_FALSE(java_types_.HasTypeByCanonicalName("a.Foo"));
-  EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &java_types_, java_types_.typenames_));
-  EXPECT_TRUE(java_types_.HasTypeByCanonicalName("a.Foo"));
-  EXPECT_TRUE(java_types_.HasTypeByCanonicalName("b.IBar"));
+  EXPECT_FALSE(typenames_.ResolveTypename("a.Foo").second);
+  EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &typenames_));
+  EXPECT_TRUE(typenames_.ResolveTypename("a.Foo").second);
+  EXPECT_TRUE(typenames_.ResolveTypename("b.IBar").second);
 }
 
 TEST_F(AidlTest, ParsesPreprocessedFileWithWhitespace) {
   string simple_content = "parcelable    a.Foo;\n  interface b.IBar  ;\t";
   io_delegate_.SetFileContents("path", simple_content);
-  EXPECT_FALSE(java_types_.HasTypeByCanonicalName("a.Foo"));
-  EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &java_types_, java_types_.typenames_));
-  EXPECT_TRUE(java_types_.HasTypeByCanonicalName("a.Foo"));
-  EXPECT_TRUE(java_types_.HasTypeByCanonicalName("b.IBar"));
+
+  EXPECT_FALSE(typenames_.ResolveTypename("a.Foo").second);
+  EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &typenames_));
+  EXPECT_TRUE(typenames_.ResolveTypename("a.Foo").second);
+  EXPECT_TRUE(typenames_.ResolveTypename("b.IBar").second);
 }
 
 TEST_F(AidlTest, PreferImportToPreprocessed) {
@@ -408,18 +426,17 @@
                                                 "interface IBar {}");
   preprocessed_files_.push_back("preprocessed");
   import_paths_.emplace("");
-  auto parse_result = Parse(
-      "p/IFoo.aidl", "package p; import one.IBar; interface IFoo {}",
-      &java_types_);
+  auto parse_result = Parse("p/IFoo.aidl", "package p; import one.IBar; interface IFoo {}",
+                            typenames_, Options::Language::JAVA);
   EXPECT_NE(nullptr, parse_result);
+
   // We expect to know about both kinds of IBar
-  EXPECT_TRUE(java_types_.HasTypeByCanonicalName("one.IBar"));
-  EXPECT_TRUE(java_types_.HasTypeByCanonicalName("another.IBar"));
+  EXPECT_TRUE(typenames_.ResolveTypename("one.IBar").second);
+  EXPECT_TRUE(typenames_.ResolveTypename("another.IBar").second);
   // But if we request just "IBar" we should get our imported one.
   AidlTypeSpecifier ambiguous_type(AIDL_LOCATION_HERE, "IBar", false, nullptr, "");
-  const java::Type* type = java_types_.Find(ambiguous_type);
-  ASSERT_TRUE(type);
-  EXPECT_EQ("one.IBar", type->CanonicalName());
+  ambiguous_type.Resolve(typenames_);
+  EXPECT_EQ("one.IBar", ambiguous_type.GetName());
 }
 
 TEST_F(AidlTest, WritePreprocessedFile) {
@@ -471,10 +488,9 @@
   io_delegate_.SetFileContents("p/Outer.aidl",
                                "package p; parcelable Outer.Inner;");
   import_paths_.emplace("");
-  auto parse_result = Parse(
-      "p/IFoo.aidl",
-      "package p; import p.Outer; interface IFoo { void f(in Inner c); }",
-      &java_types_);
+  auto parse_result =
+      Parse("p/IFoo.aidl", "package p; import p.Outer; interface IFoo { void f(in Inner c); }",
+            typenames_, Options::Language::JAVA);
   EXPECT_EQ(nullptr, parse_result);
 }
 
@@ -482,10 +498,8 @@
   io_delegate_.SetFileContents("preprocessed",
                                "parcelable p.Outer.Inner;");
   preprocessed_files_.push_back("preprocessed");
-  auto parse_result = Parse(
-      "p/IFoo.aidl",
-      "package p; interface IFoo { void f(in Inner c); }",
-      &java_types_);
+  auto parse_result = Parse("p/IFoo.aidl", "package p; interface IFoo { void f(in Inner c); }",
+                            typenames_, Options::Language::JAVA);
   // TODO(wiley): This should actually return nullptr because we require
   //              the outer class name.  However, for legacy reasons,
   //              this behavior must be maintained.  b/17415692
@@ -519,23 +533,21 @@
   auto parse_result =
       Parse("p/IFoo.aidl",
             "package p; import o.WhoKnowsWhat; interface IFoo { void f(in WhoKnowsWhat thisIs); }",
-            &java_types_, &reported_error, {"--structured"});
+            typenames_, Options::Language::JAVA, &reported_error, {"--structured"});
   EXPECT_EQ(nullptr, parse_result);
   EXPECT_EQ(AidlError::NOT_STRUCTURED, reported_error);
 }
 
 TEST_F(AidlTest, FailOnDuplicateConstantNames) {
   AidlError reported_error;
-  EXPECT_EQ(nullptr,
-            Parse("p/IFoo.aidl",
-                   R"(package p;
+  EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
+                           R"(package p;
                       interface IFoo {
                         const String DUPLICATED = "d";
                         const int DUPLICATED = 1;
                       }
                    )",
-                   &cpp_types_,
-                   &reported_error));
+                           typenames_, Options::Language::CPP, &reported_error));
   EXPECT_EQ(AidlError::BAD_TYPE, reported_error);
 }
 
@@ -549,7 +561,7 @@
                       parcelable StructuredParcelable {}
                       interface IBaz {}
                   )",
-                           &cpp_types_, &reported_error));
+                           typenames_, Options::Language::CPP, &reported_error));
   // Parse success is important for clear error handling even if the cases aren't
   // actually supported in code generation.
   EXPECT_EQ(AidlError::BAD_TYPE, reported_error);
@@ -557,35 +569,32 @@
 
 TEST_F(AidlTest, FailOnNoDefinedTypes) {
   AidlError reported_error;
-  EXPECT_EQ(nullptr, Parse("p/IFoo.aidl", R"(package p;)", &cpp_types_, &reported_error));
+  EXPECT_EQ(nullptr, Parse("p/IFoo.aidl", R"(package p;)", typenames_, Options::Language::CPP,
+                           &reported_error));
   EXPECT_EQ(AidlError::PARSE_ERROR, reported_error);
 }
 
 TEST_F(AidlTest, FailOnMalformedConstHexValue) {
   AidlError reported_error;
-  EXPECT_EQ(nullptr,
-            Parse("p/IFoo.aidl",
-                   R"(package p;
+  EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
+                           R"(package p;
                       interface IFoo {
                         const int BAD_HEX_VALUE = 0xffffffffffffffffff;
                       }
                    )",
-                   &cpp_types_,
-                   &reported_error));
+                           typenames_, Options::Language::CPP, &reported_error));
   EXPECT_EQ(AidlError::BAD_TYPE, reported_error);
 }
 
 TEST_F(AidlTest, ParsePositiveConstHexValue) {
   AidlError reported_error;
-  auto cpp_parse_result =
-    Parse("p/IFoo.aidl",
-           R"(package p;
+  auto cpp_parse_result = Parse("p/IFoo.aidl",
+                                R"(package p;
               interface IFoo {
                 const int POSITIVE_HEX_VALUE = 0xf5;
               }
            )",
-           &cpp_types_,
-           &reported_error);
+                                typenames_, Options::Language::CPP, &reported_error);
   EXPECT_NE(nullptr, cpp_parse_result);
   const AidlInterface* interface = cpp_parse_result->AsInterface();
   ASSERT_NE(nullptr, interface);
@@ -597,15 +606,13 @@
 
 TEST_F(AidlTest, ParseNegativeConstHexValue) {
   AidlError reported_error;
-  auto cpp_parse_result =
-    Parse("p/IFoo.aidl",
-           R"(package p;
+  auto cpp_parse_result = Parse("p/IFoo.aidl",
+                                R"(package p;
               interface IFoo {
                 const int NEGATIVE_HEX_VALUE = 0xffffffff;
               }
            )",
-           &cpp_types_,
-           &reported_error);
+                                typenames_, Options::Language::CPP, &reported_error);
   EXPECT_NE(nullptr, cpp_parse_result);
   const AidlInterface* interface = cpp_parse_result->AsInterface();
   ASSERT_NE(nullptr, interface);
@@ -624,12 +631,14 @@
   const string input = "package p; import p.Outer; interface IFoo"
                        " { Outer.Inner get(); }";
 
-  auto cpp_parse_result = Parse(input_path, input, &cpp_types_);
+  auto cpp_parse_result = Parse(input_path, input, typenames_, Options::Language::CPP);
   EXPECT_NE(nullptr, cpp_parse_result);
-  auto cpp_type = cpp_types_.FindTypeByCanonicalName("p.Outer.Inner");
-  ASSERT_NE(nullptr, cpp_type);
+
+  auto pair = typenames_.ResolveTypename("p.Outer.Inner");
+  EXPECT_TRUE(pair.second);
   // C++ uses "::" instead of "." to refer to a inner class.
-  EXPECT_EQ("::p::Outer::Inner", cpp_type->CppType());
+  AidlTypeSpecifier nested_type(AIDL_LOCATION_HERE, "p.Outer.Inner", false, nullptr, "");
+  EXPECT_EQ("::p::Outer::Inner", cpp::CppNameOf(nested_type, typenames_));
 }
 
 TEST_F(AidlTest, UnderstandsNativeParcelables) {
@@ -639,24 +648,31 @@
   import_paths_.emplace("");
   const string input_path = "p/IFoo.aidl";
   const string input = "package p; import p.Bar; interface IFoo { }";
-
-  // C++ understands C++ specific stuff
-  auto cpp_parse_result = Parse(input_path, input, &cpp_types_);
-  EXPECT_NE(nullptr, cpp_parse_result);
-  auto cpp_type = cpp_types_.FindTypeByCanonicalName("p.Bar");
-  ASSERT_NE(nullptr, cpp_type);
-  EXPECT_EQ("::p::Bar", cpp_type->CppType());
-  set<string> headers;
-  cpp_type->GetHeaders(&headers);
-  EXPECT_EQ(1u, headers.size());
-  EXPECT_EQ(1u, headers.count("baz/header"));
-
-  // Java ignores C++ specific stuff
-  auto java_parse_result = Parse(input_path, input, &java_types_);
-  EXPECT_NE(nullptr, java_parse_result);
-  auto java_type = java_types_.FindTypeByCanonicalName("p.Bar");
-  ASSERT_NE(nullptr, java_type);
-  EXPECT_EQ("p.Bar", java_type->InstantiableName());
+  {
+    // C++ understands C++ specific stuff
+    auto cpp_parse_result = Parse(input_path, input, typenames_, Options::Language::CPP);
+    EXPECT_NE(nullptr, cpp_parse_result);
+    auto pair = typenames_.ResolveTypename("p.Bar");
+    EXPECT_TRUE(pair.second);
+    AidlTypeSpecifier native_type(AIDL_LOCATION_HERE, "p.Bar", false, nullptr, "");
+    native_type.Resolve(typenames_);
+    EXPECT_EQ("::p::Bar", cpp::CppNameOf(native_type, typenames_));
+    set<string> headers;
+    cpp::AddHeaders(native_type, typenames_, headers);
+    EXPECT_EQ(1u, headers.size());
+    EXPECT_EQ(1u, headers.count("baz/header"));
+  }
+  typenames_.Reset();
+  {
+    // Java ignores C++ specific stuff
+    auto java_parse_result = Parse(input_path, input, typenames_, Options::Language::JAVA);
+    EXPECT_NE(nullptr, java_parse_result);
+    auto pair = typenames_.ResolveTypename("p.Bar");
+    EXPECT_TRUE(pair.second);
+    AidlTypeSpecifier native_type(AIDL_LOCATION_HERE, "p.Bar", false, nullptr, "");
+    native_type.Resolve(typenames_);
+    EXPECT_EQ("p.Bar", java::InstantiableJavaSignatureOf(native_type));
+  }
 }
 
 TEST_F(AidlTest, WritesCorrectDependencyFile) {
@@ -719,10 +735,11 @@
                            "  List<int, List<String, bool>> foo(); }";
   string nested_in_parcelable = "package a; parcelable IData {\n"
                                 "  List<int, List<String, bool>> foo;}";
-  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", nested_in_iface, &java_types_));
-  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", nested_in_iface, &cpp_types_));
-  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", nested_in_parcelable, &java_types_));
-  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", nested_in_parcelable, &cpp_types_));
+  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", nested_in_iface, typenames_, Options::Language::JAVA));
+  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", nested_in_iface, typenames_, Options::Language::CPP));
+  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", nested_in_parcelable, typenames_,
+Options::Language::JAVA)); EXPECT_NE(nullptr, Parse("a/IFoo.aidl", nested_in_parcelable, typenames_,
+Options::Language::CPP));
 }
 */
 
diff --git a/generate_cpp_unittest.cpp b/generate_cpp_unittest.cpp
index 8b4fc78..092e7cc 100644
--- a/generate_cpp_unittest.cpp
+++ b/generate_cpp_unittest.cpp
@@ -27,7 +27,6 @@
 #include "os.h"
 #include "tests/fake_io_delegate.h"
 #include "tests/test_util.h"
-#include "type_cpp.h"
 
 using ::android::aidl::test::FakeIoDelegate;
 using ::android::base::StringPrintf;
@@ -1385,7 +1384,6 @@
  protected:
   ASTTest(const string& cmdline, const string& file_contents)
       : options_(Options::From(cmdline)), file_contents_(file_contents) {
-    types_.Init();
   }
 
   AidlInterface* ParseSingleInterface() {
@@ -1395,7 +1393,7 @@
     vector<string> imported_files;
     ImportResolver import_resolver{io_delegate_, options_.InputFiles().at(0), {"."}, {}};
     AidlError err = ::android::aidl::internals::load_and_validate_aidl(
-        options_.InputFiles().front(), options_, io_delegate_, &types_, &defined_types,
+        options_.InputFiles().front(), options_, io_delegate_, &typenames_, &defined_types,
         &imported_files);
 
     if (err != AidlError::OK) {
@@ -1423,7 +1421,7 @@
   const Options options_;
   const string file_contents_;
   FakeIoDelegate io_delegate_;
-  TypeNamespace types_;
+  AidlTypenames typenames_;
 };
 
 class ComplexTypeInterfaceASTTest : public ASTTest {
@@ -1439,44 +1437,42 @@
 TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  unique_ptr<Document> doc = internals::BuildClientHeader(types_.typenames_, *interface, options_);
+  unique_ptr<Document> doc = internals::BuildClientHeader(typenames_, *interface, options_);
   Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
 }
 
 TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  unique_ptr<Document> doc = internals::BuildClientSource(types_.typenames_, *interface, options_);
+  unique_ptr<Document> doc = internals::BuildClientSource(typenames_, *interface, options_);
   Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
 }
 
 TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  unique_ptr<Document> doc = internals::BuildServerHeader(types_.typenames_, *interface, options_);
+  unique_ptr<Document> doc = internals::BuildServerHeader(typenames_, *interface, options_);
   Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
 }
 
 TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  unique_ptr<Document> doc = internals::BuildServerSource(types_.typenames_, *interface, options_);
+  unique_ptr<Document> doc = internals::BuildServerSource(typenames_, *interface, options_);
   Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
 }
 
 TEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  unique_ptr<Document> doc =
-      internals::BuildInterfaceHeader(types_.typenames_, *interface, options_);
+  unique_ptr<Document> doc = internals::BuildInterfaceHeader(typenames_, *interface, options_);
   Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
 }
 
 TEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  unique_ptr<Document> doc =
-      internals::BuildInterfaceSource(types_.typenames_, *interface, options_);
+  unique_ptr<Document> doc = internals::BuildInterfaceSource(typenames_, *interface, options_);
   Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
 }
 
@@ -1492,14 +1488,14 @@
 TEST_F(ComplexTypeInterfaceASTTestWithTrace, GeneratesClientSource) {
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  unique_ptr<Document> doc = internals::BuildClientSource(types_.typenames_, *interface, options_);
+  unique_ptr<Document> doc = internals::BuildClientSource(typenames_, *interface, options_);
   Compare(doc.get(), kExpectedComplexTypeClientWithTraceSourceOutput);
 }
 
 TEST_F(ComplexTypeInterfaceASTTestWithTrace, GeneratesServerSource) {
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  unique_ptr<Document> doc = internals::BuildServerSource(types_.typenames_, *interface, options_);
+  unique_ptr<Document> doc = internals::BuildServerSource(typenames_, *interface, options_);
   Compare(doc.get(), kExpectedComplexTypeServerWithTraceSourceOutput);
 }
 
@@ -1523,8 +1519,7 @@
   // Confirm that this is working correctly without I/O problems.
   AidlInterface* interface = ParseSingleInterface();
   ASSERT_NE(interface, nullptr);
-  ASSERT_TRUE(
-      GenerateCpp(options_.OutputFile(), options_, types_.typenames_, *interface, io_delegate_));
+  ASSERT_TRUE(GenerateCpp(options_.OutputFile(), options_, typenames_, *interface, io_delegate_));
 }
 
 TEST_F(IoErrorHandlingTest, HandlesBadHeaderWrite) {
@@ -1537,8 +1532,7 @@
       StringPrintf("%s%c%s", kHeaderDir, OS_PATH_SEPARATOR,
                    kInterfaceHeaderRelPath);
   io_delegate_.AddBrokenFilePath(header_path);
-  ASSERT_FALSE(
-      GenerateCpp(options_.OutputFile(), options_, types_.typenames_, *interface, io_delegate_));
+  ASSERT_FALSE(GenerateCpp(options_.OutputFile(), options_, typenames_, *interface, io_delegate_));
   // We should never attempt to write the C++ file if we fail writing headers.
   ASSERT_FALSE(io_delegate_.GetWrittenContents(kOutputPath, nullptr));
   // We should remove partial results.
@@ -1552,8 +1546,7 @@
 
   // Simulate issues closing the cpp file.
   io_delegate_.AddBrokenFilePath(kOutputPath);
-  ASSERT_FALSE(
-      GenerateCpp(options_.OutputFile(), options_, types_.typenames_, *interface, io_delegate_));
+  ASSERT_FALSE(GenerateCpp(options_.OutputFile(), options_, typenames_, *interface, io_delegate_));
   // We should remove partial results.
   ASSERT_TRUE(io_delegate_.PathWasRemoved(kOutputPath));
 }
diff --git a/generate_java_binder.cpp b/generate_java_binder.cpp
index af1452b..1581d48 100644
--- a/generate_java_binder.cpp
+++ b/generate_java_binder.cpp
@@ -17,6 +17,7 @@
 #include "aidl.h"
 #include "aidl_to_java.h"
 #include "generate_java.h"
+#include "logging.h"
 #include "options.h"
 
 #include <stdio.h>
diff --git a/type_cpp.cpp b/type_cpp.cpp
deleted file mode 100644
index b9bd4b6..0000000
--- a/type_cpp.cpp
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "type_cpp.h"
-
-#include <algorithm>
-#include <iostream>
-#include <memory>
-#include <vector>
-
-#include <android-base/stringprintf.h>
-#include <android-base/strings.h>
-
-#include "logging.h"
-
-using std::string;
-using std::vector;
-
-using android::base::Join;
-using android::base::StringPrintf;
-
-namespace android {
-namespace aidl {
-namespace cpp {
-namespace {
-
-const char kNoPackage[] = "";
-const char kNoHeader[] = "";
-const char kNoValidMethod[] = "";
-Type* const kNoArrayType = nullptr;
-Type* const kNoNullableType = nullptr;
-
-class VoidType : public Type {
- public:
-  VoidType() : Type(ValidatableType::KIND_BUILT_IN, kNoPackage, "void",
-                    {}, "void", kNoValidMethod, kNoValidMethod) {}
-  ~VoidType() override = default;
-  bool CanWriteToParcel() const override { return false; }
-};  // class VoidType
-
-class CppArrayType : public Type {
- public:
-  CppArrayType(int kind,  // from ValidatableType
-            const std::string& package,
-            const string& underlying_aidl_type,
-            const string& cpp_header,
-            const string& underlying_cpp_type,
-            const string& underlying_cpp_type_nulllable,
-            const string& read_method,
-            const string& write_method,
-            bool is_nullable,
-            const string& src_file_name = "")
-      : Type(kind, package,
-             underlying_aidl_type + "[]",
-             GetHeaders(is_nullable, cpp_header),
-             GetCppType(is_nullable, underlying_cpp_type),
-             read_method, write_method, kNoArrayType,
-             (is_nullable)
-                 ? kNoNullableType
-                 // All arrays are nullable.
-                 : new CppArrayType(kind, package, underlying_aidl_type,
-                                    cpp_header, underlying_cpp_type_nulllable,
-                                    underlying_cpp_type_nulllable,
-                                    read_method, write_method, true),
-             src_file_name) {}
-
- private:
-  static vector<string> GetHeaders(bool is_nullable, const string& cpp_header) {
-    vector<string> result = {"vector"};
-    if (is_nullable) {
-      result.push_back("memory");
-    }
-    if (!cpp_header.empty()) {
-      result.push_back(cpp_header);
-    }
-    return result;
-  }
-
-  static string GetCppType(bool is_nullable,
-                           const string& underlying_cpp_type) {
-    if (is_nullable)
-      return StringPrintf("::std::unique_ptr<::std::vector<%s>>",
-                          underlying_cpp_type.c_str());
-    return StringPrintf("::std::vector<%s>",
-                        underlying_cpp_type.c_str());
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(CppArrayType);
-};  // class CppArrayType
-
-class PrimitiveType : public Type {
- public:
-  PrimitiveType(const std::string& aidl_type,
-                const std::string& header,
-                const std::string& cpp_type,
-                const std::string& read_method,
-                const std::string& write_method,
-                const std::string& read_array_method,
-                const std::string& write_array_method)
-      : Type(ValidatableType::KIND_BUILT_IN, kNoPackage, aidl_type, {header},
-             cpp_type, read_method, write_method,
-             new CppArrayType(ValidatableType::KIND_BUILT_IN, kNoPackage,
-                              aidl_type, header, cpp_type, cpp_type,
-                              read_array_method, write_array_method,
-                              false)) {}
-
-  ~PrimitiveType() override = default;
-  bool IsCppPrimitive() const override { return true; }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PrimitiveType);
-};  // class PrimitiveType
-
-// Unfortunately, bytes in Java are signed.  However, most C authors would
-// say that a byte is not in fact signed.  Compromise: customize this otherwise
-// normal primitive to use signed single bytes, but unsigned byte arrays.
-class ByteType : public Type {
- public:
-  ByteType()
-      : Type(ValidatableType::KIND_BUILT_IN, kNoPackage, "byte",
-             {"cstdint"}, "int8_t", "readByte", "writeByte",
-             new CppArrayType(ValidatableType::KIND_BUILT_IN, kNoPackage,
-                              "byte", "cstdint", "uint8_t", "uint8_t",
-                              "readByteVector", "writeByteVector",
-                              false)) {}
-
-  ~ByteType() override = default;
-  bool IsCppPrimitive() const override { return true; }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ByteType);
-};  // class PrimitiveType
-
-static string GetCppHeader(const AidlDefinedType& defined_type) {
-  vector<string> name = defined_type.GetSplitPackage();
-  name.push_back(defined_type.GetName());
-  return Join(name, '/') + ".h";
-}
-
-class BinderType : public Type {
- public:
-  BinderType(const AidlInterface& interface, const std::string& src_file_name)
-      : BinderType(interface, src_file_name,
-                   new BinderType(interface, src_file_name, kNoNullableType,
-                                  "readNullableStrongBinder"),
-                   "readStrongBinder") {}
-  ~BinderType() override = default;
-
-  string WriteCast(const string& val) const override {
-    return write_cast_ + "(" + val + ")";
-  }
-
- private:
-  BinderType(const AidlInterface& interface, const std::string& src_file_name, Type* nullable_type,
-             const std::string& read)
-      : Type(ValidatableType::KIND_GENERATED, interface.GetPackage(), interface.GetName(),
-             {GetCppHeader(interface)}, GetCppName(interface), read, "writeStrongBinder",
-             kNoArrayType, nullable_type, src_file_name),
-        write_cast_(GetRawCppName(interface) + "::asBinder") {}
-
-  static string GetCppName(const AidlInterface& interface) {
-    return "::android::sp<" + GetRawCppName(interface) + ">";
-  }
-
-  static string GetRawCppName(const AidlInterface& interface) {
-    vector<string> name = interface.GetSplitPackage();
-    string ret;
-
-    name.push_back(interface.GetName());
-
-    for (const auto& term : name) {
-      ret += "::" + term;
-    }
-
-    return ret;
-  }
-
-  std::string write_cast_;
-};
-
-class NullableParcelableType : public Type {
- public:
-  NullableParcelableType(const AidlParcelable& parcelable, const std::string& cpp_header,
-                         const std::string& src_file_name)
-      : Type(ValidatableType::KIND_PARCELABLE, parcelable.GetPackage(), parcelable.GetName(),
-             {cpp_header}, GetCppName(parcelable), "readParcelable", "writeNullableParcelable",
-             kNoArrayType, kNoNullableType, src_file_name) {}
-  ~NullableParcelableType() override = default;
-
- private:
-  static string GetCppName(const AidlParcelable& parcelable) {
-    return "::std::unique_ptr<::" + Join(parcelable.GetSplitPackage(), "::") +
-        "::" + parcelable.GetCppName() + ">";
-  }
-};
-
-class ParcelableType : public Type {
- public:
-  ParcelableType(const AidlParcelable& parcelable, const std::string& cpp_header,
-                 const std::string& src_file_name)
-      : Type(ValidatableType::KIND_PARCELABLE, parcelable.GetPackage(), parcelable.GetName(),
-             {cpp_header}, GetCppName(parcelable), "readParcelable", "writeParcelable",
-             new CppArrayType(ValidatableType::KIND_PARCELABLE, parcelable.GetPackage(),
-                              parcelable.GetName(), cpp_header, GetCppName(parcelable),
-                              GetCppName(parcelable), "readParcelableVector",
-                              "writeParcelableVector", false, src_file_name),
-             new NullableParcelableType(parcelable, cpp_header, src_file_name), src_file_name) {}
-  ~ParcelableType() override = default;
-
- private:
-  static string GetCppName(const AidlParcelable& parcelable) {
-    std::vector<std::string> components = parcelable.GetSplitPackage();
-    components.push_back(parcelable.GetCppName());
-
-    return "::" + Join(components, "::");
-  }
-};
-
-class NullableStringListType : public Type {
- public:
-  NullableStringListType()
-      : Type(ValidatableType::KIND_BUILT_IN,
-             "java.util", "List<" + string(kStringCanonicalName) + ">",
-             {"utils/String16.h", "memory", "vector"},
-             "::std::unique_ptr<::std::vector<std::unique_ptr<::android::String16>>>",
-             "readString16Vector", "writeString16Vector") {}
-  ~NullableStringListType() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NullableStringListType);
-};  // class NullableStringListType
-
-class StringListType : public Type {
- public:
-  StringListType()
-      : Type(ValidatableType::KIND_BUILT_IN,
-             "java.util", "List<" + string(kStringCanonicalName) + ">",
-             {"utils/String16.h", "vector"},
-             "::std::vector<::android::String16>",
-             "readString16Vector", "writeString16Vector",
-             kNoArrayType, new NullableStringListType()) {}
-  ~StringListType() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(StringListType);
-};  // class StringListType
-
-class NullableUtf8InCppStringListType : public Type {
- public:
-  NullableUtf8InCppStringListType()
-      : Type(ValidatableType::KIND_BUILT_IN,
-             "java.util", "List<" + string(kUtf8InCppStringCanonicalName) + ">",
-             {"memory", "string", "vector"},
-             "::std::unique_ptr<::std::vector<std::unique_ptr<::std::string>>>",
-             "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector") {}
-  ~NullableUtf8InCppStringListType() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NullableUtf8InCppStringListType);
-};  // class NullableUtf8InCppStringListType
-
-class Utf8InCppStringListType : public Type {
- public:
-  Utf8InCppStringListType()
-      : Type(ValidatableType::KIND_BUILT_IN,
-             "java.util", "List<" + string(kUtf8InCppStringCanonicalName) + ">",
-             {"string", "vector"},
-             "::std::vector<::std::string>",
-             "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector",
-             kNoArrayType, new NullableUtf8InCppStringListType()) {}
-  ~Utf8InCppStringListType() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Utf8InCppStringListType);
-};  // class Utf8InCppStringListType
-
-class NullableBinderListType : public Type {
- public:
-  NullableBinderListType()
-      : Type(ValidatableType::KIND_BUILT_IN, "java.util",
-             "List<android.os.IBinder>", {"binder/IBinder.h", "vector"},
-             "::std::unique_ptr<::std::vector<::android::sp<::android::IBinder>>>",
-             "readStrongBinderVector", "writeStrongBinderVector") {}
-  ~NullableBinderListType() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NullableBinderListType);
-};  // class NullableBinderListType
-
-class BinderListType : public Type {
- public:
-  BinderListType()
-      : Type(ValidatableType::KIND_BUILT_IN, "java.util",
-             "List<android.os.IBinder>", {"binder/IBinder.h", "vector"},
-             "::std::vector<::android::sp<::android::IBinder>>",
-             "readStrongBinderVector", "writeStrongBinderVector",
-             kNoArrayType, new NullableBinderListType()) {}
-  ~BinderListType() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BinderListType);
-};  // class BinderListType
-
-}  // namespace
-
-Type::Type(int kind,
-           const std::string& package,
-           const std::string& aidl_type,
-           const vector<string>& headers,
-           const string& cpp_type,
-           const string& read_method,
-           const string& write_method,
-           Type* array_type,
-           Type* nullable_type,
-           const string& src_file_name,
-           int line)
-    : ValidatableType(kind, package, aidl_type, src_file_name, line),
-      headers_(headers),
-      aidl_type_(aidl_type),
-      cpp_type_(cpp_type),
-      parcel_read_method_(read_method),
-      parcel_write_method_(write_method),
-      array_type_(array_type),
-      nullable_type_(nullable_type) {}
-
-bool Type::CanWriteToParcel() const { return true; }
-
-void TypeNamespace::Init() {
-  Add(std::make_unique<ByteType>());
-  Add(std::make_unique<PrimitiveType>("int", "cstdint", "int32_t", "readInt32", "writeInt32",
-                                      "readInt32Vector", "writeInt32Vector"));
-  Add(std::make_unique<PrimitiveType>("long", "cstdint", "int64_t", "readInt64", "writeInt64",
-                                      "readInt64Vector", "writeInt64Vector"));
-  Add(std::make_unique<PrimitiveType>("float", kNoHeader, "float", "readFloat", "writeFloat",
-                                      "readFloatVector", "writeFloatVector"));
-  Add(std::make_unique<PrimitiveType>("double", kNoHeader, "double", "readDouble", "writeDouble",
-                                      "readDoubleVector", "writeDoubleVector"));
-  Add(std::make_unique<PrimitiveType>("boolean", kNoHeader, "bool", "readBool", "writeBool",
-                                      "readBoolVector", "writeBoolVector"));
-  // C++11 defines the char16_t type as a built in for Unicode characters.
-  Add(std::make_unique<PrimitiveType>("char", kNoHeader, "char16_t", "readChar", "writeChar",
-                                      "readCharVector", "writeCharVector"));
-
-  Type* string_array_type = new CppArrayType(
-      ValidatableType::KIND_BUILT_IN, "java.lang", "String",
-      "utils/String16.h", "::android::String16",
-      "::std::unique_ptr<::android::String16>", "readString16Vector",
-      "writeString16Vector", false);
-
-  Type* nullable_string_type =
-      new Type(ValidatableType::KIND_BUILT_IN, "java.lang", "String",
-               {"memory", "utils/String16.h"}, "::std::unique_ptr<::android::String16>",
-               "readString16", "writeString16");
-
-  AddAndSetMember(&string_type_,
-                  std::make_unique<Type>(ValidatableType::KIND_BUILT_IN, "java.lang", "String",
-                                         std::vector<std::string>{"utils/String16.h"},
-                                         "::android::String16", "readString16", "writeString16",
-                                         string_array_type, nullable_string_type));
-
-  using ::android::aidl::kAidlReservedTypePackage;
-  using ::android::aidl::kUtf8InCppStringClass;
-
-  // This type is a Utf16 string in the parcel, but deserializes to
-  // a std::string in Utf8 format when we use it in C++.
-  Type* cpp_utf8_string_array = new CppArrayType(
-      ValidatableType::KIND_BUILT_IN,
-      kAidlReservedTypePackage, kUtf8InCppStringClass,
-      "string", "::std::string", "::std::unique_ptr<::std::string>",
-      "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector",
-      false);
-  Type* nullable_cpp_utf8_string_type =
-      new Type(ValidatableType::KIND_BUILT_IN, kAidlReservedTypePackage, kUtf8InCppStringClass,
-               std::vector<std::string>{"string", "memory"}, "::std::unique_ptr<::std::string>",
-               "readUtf8FromUtf16", "writeUtf8AsUtf16");
-  Add(std::make_unique<Type>(ValidatableType::KIND_BUILT_IN, kAidlReservedTypePackage,
-                             kUtf8InCppStringClass, std::vector<std::string>{"string"},
-                             "::std::string", "readUtf8FromUtf16", "writeUtf8AsUtf16",
-                             cpp_utf8_string_array, nullable_cpp_utf8_string_type));
-
-  Type* nullable_ibinder = new Type(
-      ValidatableType::KIND_BUILT_IN, "android.os", "IBinder",
-      {"binder/IBinder.h"}, "::android::sp<::android::IBinder>",
-      "readNullableStrongBinder", "writeStrongBinder");
-
-  AddAndSetMember(&ibinder_type_,
-                  std::make_unique<Type>(ValidatableType::KIND_BUILT_IN, "android.os", "IBinder",
-                                         std::vector<std::string>{"binder/IBinder.h"},
-                                         "::android::sp<::android::IBinder>", "readStrongBinder",
-                                         "writeStrongBinder", kNoArrayType, nullable_ibinder));
-
-  Add(std::make_unique<BinderListType>());
-  Add(std::make_unique<StringListType>());
-  Add(std::make_unique<Utf8InCppStringListType>());
-
-  Type* fd_vector_type = new CppArrayType(
-      ValidatableType::KIND_BUILT_IN, kNoPackage, "FileDescriptor",
-      "android-base/unique_fd.h",
-      "::android::base::unique_fd", "::android::base::unique_fd",
-      "readUniqueFileDescriptorVector", "writeUniqueFileDescriptorVector",
-      false);
-
-  Add(std::make_unique<Type>(ValidatableType::KIND_BUILT_IN, kNoPackage, "FileDescriptor",
-                             std::vector<std::string>{"android-base/unique_fd.h"},
-                             "::android::base::unique_fd", "readUniqueFileDescriptor",
-                             "writeUniqueFileDescriptor", fd_vector_type));
-
-  Type* pfd_vector_type =
-      new CppArrayType(ValidatableType::KIND_BUILT_IN, "android.os", "ParcelFileDescriptor",
-                       "binder/ParcelFileDescriptor.h", "::android::os::ParcelFileDescriptor",
-                       "::android::os::ParcelFileDescriptor", "readParcelableVector",
-                       "writeParcelableVector", false);
-
-  Type* nullable_pfd_type =
-      new Type(ValidatableType::KIND_BUILT_IN, "android.os", "ParcelFileDescriptor",
-               std::vector<std::string>{"memory", "binder/ParcelFileDescriptor.h"},
-               "::std::unique_ptr<::android::os::ParcelFileDescriptor>", "readParcelable",
-               "writeNullableParcelable");
-
-  Add(std::make_unique<Type>(ValidatableType::KIND_BUILT_IN, "android.os", "ParcelFileDescriptor",
-                             std::vector<std::string>{"binder/ParcelFileDescriptor.h"},
-                             "::android::os::ParcelFileDescriptor", "readParcelable",
-                             "writeParcelable", pfd_vector_type, nullable_pfd_type));
-
-  // Qualify VoidType so we don't get collisions with the VoidType method
-  AddAndSetMember(&void_type_, std::make_unique<class VoidType>());
-}
-
-bool TypeNamespace::AddParcelableType(const AidlParcelable& p, const std::string& filename) {
-  const std::string cpp_header = p.AsStructuredParcelable() ? GetCppHeader(p) : p.GetCppHeader();
-  if (p.IsStableParcelable()) {
-    AIDL_ERROR(p) << "@JavaOnlyStableParcelable supports only Java target.";
-    return false;
-  }
-  if (cpp_header.empty()) {
-    AIDL_ERROR(p) << "Parcelable " << p.GetCanonicalName() << " has no C++ header defined.";
-    return false;
-  }
-
-  Add(std::make_unique<ParcelableType>(p, cpp_header, filename));
-  return true;
-}
-
-bool TypeNamespace::AddBinderType(const AidlInterface& b, const std::string& filename) {
-  Add(std::make_unique<BinderType>(b, filename));
-  return true;
-}
-
-bool TypeNamespace::AddListType(const std::string& type_name) {
-  const Type* contained_type = FindTypeByCanonicalName(type_name);
-  if (!contained_type) {
-    LOG(ERROR) << "Cannot create List<" << type_name << "> because contained "
-                  "type cannot be found or is invalid.";
-    return false;
-  }
-  if (contained_type->IsCppPrimitive()) {
-    LOG(ERROR) << "Cannot create List<" << type_name << "> because contained "
-                  "type is a primitive in Java and Java List cannot hold "
-                  "primitives.";
-    return false;
-  }
-
-  if (contained_type->CanonicalName() == kStringCanonicalName ||
-      contained_type->CanonicalName() == kUtf8InCppStringCanonicalName ||
-      contained_type == IBinderType()) {
-    return true;
-  }
-
-  // TODO Support lists of parcelables b/23600712
-
-  LOG(ERROR) << "aidl-cpp does not yet support List<" << type_name << ">";
-  return false;
-}
-
-bool TypeNamespace::AddMapType(const std::string& /* key_type_name */,
-                               const std::string& /* value_type_name */) {
-  // TODO Support list types b/25242025
-  LOG(ERROR) << "aidl does not implement support for typed maps!";
-  return false;
-}
-
-const ValidatableType* TypeNamespace::GetArgType(const AidlArgument& a, int arg_index,
-                                                 const AidlDefinedType& context) const {
-  return ::android::aidl::TypeNamespace::GetArgType(a, arg_index, context);
-}
-
-}  // namespace cpp
-}  // namespace aidl
-}  // namespace android
diff --git a/type_cpp.h b/type_cpp.h
deleted file mode 100644
index a27132b..0000000
--- a/type_cpp.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <memory>
-#include <string>
-#include <set>
-#include <vector>
-
-#include <android-base/macros.h>
-
-#include "type_namespace.h"
-
-namespace android {
-namespace aidl {
-namespace cpp {
-
-class Type : public ValidatableType {
- public:
-  Type(int kind,  // from ValidatableType
-       const std::string& package,
-       const std::string& aidl_type,
-       const std::vector<std::string>& header,
-       const std::string& cpp_type,
-       const std::string& read_method,
-       const std::string& write_method,
-       Type* array_type = nullptr,
-       Type* nullable_type = nullptr,
-       const std::string& src_file_name = "",
-       int line = -1);
-  virtual ~Type() = default;
-
-  // overrides of ValidatableType
-  bool CanWriteToParcel() const override;
-
-  const Type* ArrayType() const override { return array_type_.get(); }
-  const Type* NullableType() const override { return nullable_type_.get(); }
-  std::string CppType() const { return cpp_type_; }
-  const std::string& ReadFromParcelMethod() const {
-    return parcel_read_method_;
-  }
-  const std::string& WriteToParcelMethod() const {
-    return parcel_write_method_;
-  }
-
-  void GetHeaders(std::set<std::string>* headers) const {
-    for (const std::string& header : headers_) {
-      if (!header.empty()) {
-        headers->insert(header);
-      }
-    }
-  }
-  virtual bool IsCppPrimitive() const { return false; }
-  virtual std::string WriteCast(const std::string& value) const {
-    return value;
-  }
-
- private:
-  // |headers| are the headers we must include to use this type
-  const std::vector<std::string> headers_;
-  // |aidl_type| is what we find in the yacc generated AST (e.g. "int").
-  const std::string aidl_type_;
-  // |cpp_type| is what we use in the generated C++ code (e.g. "int32_t").
-  const std::string cpp_type_;
-  const std::string parcel_read_method_;
-  const std::string parcel_write_method_;
-
-  const std::unique_ptr<Type> array_type_;
-  const std::unique_ptr<Type> nullable_type_;
-
-  DISALLOW_COPY_AND_ASSIGN(Type);
-};  // class Type
-
-class TypeNamespace : public ::android::aidl::LanguageTypeNamespace<Type> {
- public:
-  TypeNamespace() = default;
-  virtual ~TypeNamespace() = default;
-
-  void Init() override;
-  bool AddParcelableType(const AidlParcelable& p,
-                         const std::string& filename) override;
-  bool AddBinderType(const AidlInterface& b,
-                     const std::string& filename) override;
-  bool AddListType(const std::string& type_name) override;
-  bool AddMapType(const std::string& key_type_name,
-                  const std::string& value_type_name) override;
-
-  const ValidatableType* GetArgType(const AidlArgument& a, int arg_index,
-                                    const AidlDefinedType& context) const override;
-
-  const Type* VoidType() const { return void_type_; }
-  const Type* IBinderType() const { return ibinder_type_; }
-
- private:
-  const Type* void_type_ = nullptr;
-  const Type* string_type_ = nullptr;
-  const Type* ibinder_type_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(TypeNamespace);
-};  // class TypeNamespace
-
-}  // namespace cpp
-}  // namespace aidl
-}  // namespace android
diff --git a/type_cpp_unittest.cpp b/type_cpp_unittest.cpp
deleted file mode 100644
index b098086..0000000
--- a/type_cpp_unittest.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <memory>
-#include <string>
-
-#include <gtest/gtest.h>
-
-#include "type_cpp.h"
-
-using std::string;
-using std::unique_ptr;
-
-namespace android {
-namespace aidl {
-namespace cpp {
-
-namespace {
-
-string kParcelableDotName = "Outer.Inner";
-string kParcelableColonName = "Outer::Inner";
-
-}  // namespace
-
-class CppTypeNamespaceTest : public ::testing::Test {
- protected:
-  void SetUp() override {
-    types_.Init();
-  }
-  TypeNamespace types_;
-};
-
-TEST_F(CppTypeNamespaceTest, HasSomeBasicTypes) {
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("byte"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("int"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("long"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("float"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("double"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("boolean"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("char"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("String"));
-}
-
-TEST_F(CppTypeNamespaceTest, SupportsListString) {
-  EXPECT_TRUE(
-      types_.HasTypeByCanonicalName("java.util.List<java.lang.String>"));
-}
-
-TEST_F(CppTypeNamespaceTest, SupportsNestedParcelableClass) {
-  unique_ptr<AidlParcelable> parcelable(new AidlParcelable(
-      AIDL_LOCATION_HERE, new AidlQualifiedName(AIDL_LOCATION_HERE, kParcelableDotName, ""),
-      {"a", "goog"}, ""));
-  EXPECT_EQ(parcelable->GetCppName(), kParcelableColonName);
-}
-
-}  // namespace cpp
-}  // namespace aidl
-}  // namespace android
diff --git a/type_java.cpp b/type_java.cpp
deleted file mode 100644
index 5f5f9dc..0000000
--- a/type_java.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "type_java.h"
-
-#include <sys/types.h>
-#include <memory>
-
-#include <android-base/strings.h>
-
-#include "aidl_language.h"
-#include "logging.h"
-
-using std::string;
-
-namespace android {
-namespace aidl {
-namespace java {
-
-// ================================================================
-
-Type::Type(const JavaTypeNamespace* types, const string& name, int kind, bool canWriteToParcel)
-    : Type(types, "", name, kind, canWriteToParcel, "", -1) {}
-
-Type::Type(const JavaTypeNamespace* types, const string& package, const string& name, int kind,
-           bool canWriteToParcel, const string& declFile, int declLine)
-    : ValidatableType(kind, package, name, declFile, declLine),
-      m_types(types),
-      m_javaType((package.empty()) ? name : package + "." + name),
-      m_canWriteToParcel(canWriteToParcel) {}
-
-string Type::InstantiableName() const { return JavaType(); }
-
-Expression* Type::BuildWriteToParcelFlags(int flags) const {
-  if (flags == 0) {
-    return new LiteralExpression("0");
-  }
-  if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
-    return new FieldVariable(m_types->ParcelableInterfaceType()->JavaType(),
-                             "PARCELABLE_WRITE_RETURN_VALUE");
-  }
-  return new LiteralExpression("0");
-}
-
-// ================================================================
-
-BasicType::BasicType(const JavaTypeNamespace* types, const string& name,
-                     const string& marshallParcel, const string& unmarshallParcel,
-                     const string& writeArrayParcel, const string& createArrayParcel,
-                     const string& readArrayParcel)
-    : Type(types, name, ValidatableType::KIND_BUILT_IN, true),
-      m_marshallParcel(marshallParcel),
-      m_unmarshallParcel(unmarshallParcel) {
-  m_array_type.reset(new BasicArrayType(types, name, writeArrayParcel,
-                                        createArrayParcel, readArrayParcel));
-}
-
-BasicArrayType::BasicArrayType(const JavaTypeNamespace* types, const string& name,
-                               const string& writeArrayParcel, const string& createArrayParcel,
-                               const string& readArrayParcel)
-    : Type(types, name, ValidatableType::KIND_BUILT_IN, true),
-      m_writeArrayParcel(writeArrayParcel),
-      m_createArrayParcel(createArrayParcel),
-      m_readArrayParcel(readArrayParcel) {}
-
-// ================================================================
-
-FileDescriptorType::FileDescriptorType(const JavaTypeNamespace* types)
-    : Type(types, "java.io", "FileDescriptor", ValidatableType::KIND_BUILT_IN, true) {
-  m_array_type.reset(new FileDescriptorArrayType(types));
-}
-
-FileDescriptorArrayType::FileDescriptorArrayType(const JavaTypeNamespace* types)
-    : Type(types, "java.io", "FileDescriptor", ValidatableType::KIND_BUILT_IN, true) {}
-
-// ================================================================
-
-ParcelFileDescriptorType::ParcelFileDescriptorType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "ParcelFileDescriptor", ValidatableType::KIND_BUILT_IN, true) {
-  m_array_type.reset(new ParcelFileDescriptorArrayType(types));
-}
-
-ParcelFileDescriptorArrayType::ParcelFileDescriptorArrayType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "ParcelFileDescriptor", ValidatableType::KIND_BUILT_IN, true) {}
-
-// ================================================================
-
-BooleanType::BooleanType(const JavaTypeNamespace* types)
-    : Type(types, "boolean", ValidatableType::KIND_BUILT_IN, true) {
-  m_array_type.reset(new BooleanArrayType(types));
-}
-
-BooleanArrayType::BooleanArrayType(const JavaTypeNamespace* types)
-    : Type(types, "boolean", ValidatableType::KIND_BUILT_IN, true) {}
-
-// ================================================================
-
-CharType::CharType(const JavaTypeNamespace* types)
-    : Type(types, "char", ValidatableType::KIND_BUILT_IN, true) {
-  m_array_type.reset(new CharArrayType(types));
-}
-
-CharArrayType::CharArrayType(const JavaTypeNamespace* types)
-    : Type(types, "char", ValidatableType::KIND_BUILT_IN, true) {}
-
-// ================================================================
-
-StringType::StringType(const JavaTypeNamespace* types, const std::string& package,
-                       const std::string& class_name)
-    : Type(types, package, class_name, ValidatableType::KIND_BUILT_IN, true) {
-  m_array_type.reset(new StringArrayType(types));
-}
-
-StringArrayType::StringArrayType(const JavaTypeNamespace* types)
-    : Type(types, "java.lang", "String", ValidatableType::KIND_BUILT_IN, true) {}
-
-// ================================================================
-
-CharSequenceType::CharSequenceType(const JavaTypeNamespace* types)
-    : Type(types, "java.lang", "CharSequence", ValidatableType::KIND_BUILT_IN, true) {}
-
-// ================================================================
-
-RemoteExceptionType::RemoteExceptionType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "RemoteException", ValidatableType::KIND_BUILT_IN, false) {}
-
-// ================================================================
-
-RuntimeExceptionType::RuntimeExceptionType(const JavaTypeNamespace* types)
-    : Type(types, "java.lang", "RuntimeException", ValidatableType::KIND_BUILT_IN, false) {}
-
-// ================================================================
-
-IBinderType::IBinderType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN, true) {
-  m_array_type.reset(new IBinderArrayType(types));
-}
-
-IBinderArrayType::IBinderArrayType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "IBinder", ValidatableType::KIND_BUILT_IN, true) {}
-
-// ================================================================
-
-IInterfaceType::IInterfaceType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "IInterface", ValidatableType::KIND_BUILT_IN, false) {}
-
-// ================================================================
-
-BinderType::BinderType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "Binder", ValidatableType::KIND_BUILT_IN, false) {}
-
-// ================================================================
-
-BinderProxyType::BinderProxyType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "BinderProxy", ValidatableType::KIND_BUILT_IN, false) {}
-
-// ================================================================
-
-ParcelType::ParcelType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "Parcel", ValidatableType::KIND_BUILT_IN, false) {}
-
-// ================================================================
-
-ParcelableInterfaceType::ParcelableInterfaceType(const JavaTypeNamespace* types)
-    : Type(types, "android.os", "Parcelable", ValidatableType::KIND_BUILT_IN, false) {}
-
-// ================================================================
-
-MapType::MapType(const JavaTypeNamespace* types)
-    : Type(types, "java.util", "Map", ValidatableType::KIND_BUILT_IN, true) {}
-
-// ================================================================
-
-ListType::ListType(const JavaTypeNamespace* types)
-    : Type(types, "java.util", "List", ValidatableType::KIND_BUILT_IN, true) {}
-
-string ListType::InstantiableName() const { return "java.util.ArrayList"; }
-
-// ================================================================
-
-UserDataType::UserDataType(const JavaTypeNamespace* types, const string& package,
-                           const string& name, bool builtIn, bool canWriteToParcel,
-                           const string& declFile, int declLine)
-    : Type(types, package, name,
-           builtIn ? ValidatableType::KIND_BUILT_IN : ValidatableType::KIND_PARCELABLE,
-           canWriteToParcel, declFile, declLine) {
-  m_array_type.reset(new UserDataArrayType(types, package, name, builtIn,
-                                           canWriteToParcel, declFile,
-                                           declLine));
-}
-
-UserDataArrayType::UserDataArrayType(const JavaTypeNamespace* types, const string& package,
-                                     const string& name, bool builtIn, bool canWriteToParcel,
-                                     const string& declFile, int declLine)
-    : Type(types, package, name,
-           builtIn ? ValidatableType::KIND_BUILT_IN : ValidatableType::KIND_PARCELABLE,
-           canWriteToParcel, declFile, declLine) {}
-
-// ================================================================
-
-InterfaceType::InterfaceType(const JavaTypeNamespace* types, const string& package,
-                             const string& name, bool builtIn, const string& declFile, int declLine,
-                             const Type* stub, const Type* proxy, const Type* defaultImpl)
-    : Type(types, package, name,
-           builtIn ? ValidatableType::KIND_BUILT_IN : ValidatableType::KIND_INTERFACE, true,
-           declFile, declLine),
-      stub_(stub),
-      proxy_(proxy),
-      defaultImpl_(defaultImpl) {}
-
-// ================================================================
-
-GenericListType::GenericListType(const JavaTypeNamespace* types, const Type* contained_type)
-    : Type(types, "java.util", "List<" + contained_type->CanonicalName() + ">",
-           ValidatableType::KIND_BUILT_IN, true),
-      m_contained_type(contained_type) {}
-
-string GenericListType::InstantiableName() const {
-  return "java.util.ArrayList<" + m_contained_type->JavaType() + ">";
-}
-
-// ================================================================
-
-ClassLoaderType::ClassLoaderType(const JavaTypeNamespace* types)
-    : Type(types, "java.lang", "ClassLoader", ValidatableType::KIND_BUILT_IN, false) {}
-
-// ================================================================
-
-void JavaTypeNamespace::Init() {
-  Add(std::make_unique<BasicType>(this, "void", "XXX", "XXX", "XXX", "XXX", "XXX"));
-
-  AddAndSetMember(&m_bool_type, std::make_unique<BooleanType>(this));
-
-  Add(std::make_unique<BasicType>(this, "byte", "writeByte", "readByte", "writeByteArray",
-                                  "createByteArray", "readByteArray"));
-
-  Add(std::make_unique<CharType>(this));
-
-  AddAndSetMember(&m_int_type,
-                  std::make_unique<BasicType>(this, "int", "writeInt", "readInt", "writeIntArray",
-                                              "createIntArray", "readIntArray"));
-
-  Add(std::make_unique<BasicType>(this, "long", "writeLong", "readLong", "writeLongArray",
-                                  "createLongArray", "readLongArray"));
-
-  Add(std::make_unique<BasicType>(this, "float", "writeFloat", "readFloat", "writeFloatArray",
-                                  "createFloatArray", "readFloatArray"));
-
-  Add(std::make_unique<BasicType>(this, "double", "writeDouble", "readDouble", "writeDoubleArray",
-                                  "createDoubleArray", "readDoubleArray"));
-
-  AddAndSetMember(&m_string_type, std::make_unique<class StringType>(this, "java.lang", "String"));
-  Add(std::make_unique<class StringType>(this, ::android::aidl::kAidlReservedTypePackage,
-                                         ::android::aidl::kUtf8InCppStringClass));
-
-  Add(std::make_unique<Type>(this, "java.lang", "Object", ValidatableType::KIND_BUILT_IN, false));
-
-  Add(std::make_unique<FileDescriptorType>(this));
-
-  Add(std::make_unique<ParcelFileDescriptorType>(this));
-
-  Add(std::make_unique<CharSequenceType>(this));
-
-  Add(std::make_unique<MapType>(this));
-
-  Add(std::make_unique<ListType>(this));
-
-  AddAndSetMember(&m_text_utils_type,
-                  std::make_unique<Type>(this, "android.text", "TextUtils",
-                                         ValidatableType::KIND_BUILT_IN, false));
-
-  AddAndSetMember(&m_remote_exception_type, std::make_unique<class RemoteExceptionType>(this));
-
-  AddAndSetMember(&m_runtime_exception_type, std::make_unique<class RuntimeExceptionType>(this));
-
-  AddAndSetMember(&m_ibinder_type, std::make_unique<class IBinderType>(this));
-
-  AddAndSetMember(&m_iinterface_type, std::make_unique<class IInterfaceType>(this));
-
-  AddAndSetMember(&m_binder_native_type, std::make_unique<BinderType>(this));
-
-  AddAndSetMember(&m_binder_proxy_type, std::make_unique<class BinderProxyType>(this));
-
-  AddAndSetMember(&m_parcel_type, std::make_unique<class ParcelType>(this));
-
-  AddAndSetMember(&m_parcelable_interface_type,
-                  std::make_unique<class ParcelableInterfaceType>(this));
-
-  AddAndSetMember(&m_context_type, std::make_unique<Type>(this, "android.content", "Context",
-                                                          ValidatableType::KIND_BUILT_IN, false));
-
-  AddAndSetMember(&m_classloader_type, std::make_unique<class ClassLoaderType>(this));
-}
-
-bool JavaTypeNamespace::AddParcelableType(const AidlParcelable& p,
-                                          const std::string& filename) {
-  return Add(
-      std::make_unique<UserDataType>(this, p.GetPackage(), p.GetName(), false, true, filename));
-}
-
-bool JavaTypeNamespace::AddBinderType(const AidlInterface& b,
-                                      const std::string& filename) {
-  // for interfaces, add the stub, proxy, and interface types.
-  auto stub = std::make_unique<Type>(this, b.GetPackage(), b.GetName() + ".Stub",
-                                     ValidatableType::KIND_GENERATED, false, filename);
-  auto proxy = std::make_unique<Type>(this, b.GetPackage(), b.GetName() + ".Stub.Proxy",
-                                      ValidatableType::KIND_GENERATED, false, filename);
-  auto defaultImpl = std::make_unique<Type>(this, b.GetPackage(), b.GetName() + ".Default",
-                                            ValidatableType::KIND_GENERATED, false, filename);
-  auto type = std::make_unique<InterfaceType>(this, b.GetPackage(), b.GetName(), false, filename,
-                                              -1, stub.get(), proxy.get(), defaultImpl.get());
-
-  bool success = true;
-  success &= Add(std::move(type));
-  success &= Add(std::move(stub));
-  success &= Add(std::move(proxy));
-  success &= Add(std::move(defaultImpl));
-  return success;
-}
-
-bool JavaTypeNamespace::AddListType(const std::string& contained_type_name) {
-  const Type* contained_type = FindTypeByCanonicalName(contained_type_name);
-  if (!contained_type) {
-    return false;
-  }
-  Add(std::make_unique<GenericListType>(this, contained_type));
-  return true;
-}
-
-bool JavaTypeNamespace::AddMapType(const string& /*key_type_name*/,
-                                   const string& /*value_type_name*/) {
-  LOG(ERROR) << "Don't know how to create a Map<K,V> container.";
-  return false;
-}
-
-}  // namespace java
-}  // namespace aidl
-}  // namespace android
diff --git a/type_java.h b/type_java.h
deleted file mode 100644
index dc2c5fb..0000000
--- a/type_java.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <string>
-#include <vector>
-
-#include "ast_java.h"
-#include "type_namespace.h"
-
-namespace android {
-namespace aidl {
-namespace java {
-
-class JavaTypeNamespace;
-
-class Type : public ValidatableType {
- public:
-  // WriteToParcel flags
-  enum { PARCELABLE_WRITE_RETURN_VALUE = 0x0001 };
-
-  // defaultValue is by default set to "null" because that is the default value
-  // for most of the types like class and array. default values for built-in
-  // types like int, double, boolean, etc. are explicitly set via BasicType
-  Type(const JavaTypeNamespace* types, const std::string& name, int kind, bool canWriteToParcel);
-  Type(const JavaTypeNamespace* types, const std::string& package, const std::string& name,
-       int kind, bool canWriteToParcel, const std::string& declFile = "", int declLine = -1);
-  virtual ~Type() = default;
-
-  bool CanWriteToParcel() const override { return m_canWriteToParcel; }
-
-  const ValidatableType* ArrayType() const override { return m_array_type.get(); }
-  const ValidatableType* NullableType() const override { return nullptr; }
-
-  virtual std::string JavaType() const { return m_javaType; }
-  virtual std::string InstantiableName() const;
-
-  // The namespace where this type is defined in
-  const JavaTypeNamespace* GetTypeNamespace() const { return m_types; }
-
- protected:
-  Expression* BuildWriteToParcelFlags(int flags) const;
-
-  const JavaTypeNamespace* m_types;
-
-  std::unique_ptr<Type> m_array_type;
-
- private:
-  Type();
-  Type(const Type&);
-
-  std::string m_javaType;
-  std::string m_declFile;
-  bool m_canWriteToParcel;
-};
-
-class BasicArrayType : public Type {
- public:
-  BasicArrayType(const JavaTypeNamespace* types, const std::string& name,
-                 const std::string& writeArrayParcel,
-                 const std::string& createArrayParcel,
-                 const std::string& readArrayParcel);
-
-  const ValidatableType* NullableType() const override { return this; }
-
- private:
-  std::string m_writeArrayParcel;
-  std::string m_createArrayParcel;
-  std::string m_readArrayParcel;
-};
-
-class BasicType : public Type {
- public:
-  BasicType(const JavaTypeNamespace* types, const std::string& name,
-            const std::string& marshallParcel, const std::string& unmarshallParcel,
-            const std::string& writeArrayParcel, const std::string& createArrayParcel,
-            const std::string& readArrayParcel);
-
- private:
-  std::string m_marshallParcel;
-  std::string m_unmarshallParcel;
-};
-
-class FileDescriptorArrayType : public Type {
- public:
-  explicit FileDescriptorArrayType(const JavaTypeNamespace* types);
-
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class FileDescriptorType : public Type {
- public:
-  explicit FileDescriptorType(const JavaTypeNamespace* types);
-};
-
-class ParcelFileDescriptorArrayType : public Type {
- public:
-  explicit ParcelFileDescriptorArrayType(const JavaTypeNamespace* types);
-
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class ParcelFileDescriptorType : public Type {
- public:
-  explicit ParcelFileDescriptorType(const JavaTypeNamespace* types);
-
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class BooleanArrayType : public Type {
- public:
-  explicit BooleanArrayType(const JavaTypeNamespace* types);
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class BooleanType : public Type {
- public:
-  explicit BooleanType(const JavaTypeNamespace* types);
-};
-
-class CharArrayType : public Type {
- public:
-  explicit CharArrayType(const JavaTypeNamespace* types);
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class CharType : public Type {
- public:
-  explicit CharType(const JavaTypeNamespace* types);
-};
-
-class StringArrayType : public Type {
- public:
-  explicit StringArrayType(const JavaTypeNamespace* types);
-
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class StringType : public Type {
- public:
-  StringType(const JavaTypeNamespace* types, const std::string& package,
-             const std::string& class_name);
-
-  std::string JavaType() const override { return "java.lang.String"; }
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class CharSequenceType : public Type {
- public:
-  explicit CharSequenceType(const JavaTypeNamespace* types);
-};
-
-class RemoteExceptionType : public Type {
- public:
-  explicit RemoteExceptionType(const JavaTypeNamespace* types);
-};
-
-class RuntimeExceptionType : public Type {
- public:
-  explicit RuntimeExceptionType(const JavaTypeNamespace* types);
-};
-
-class IBinderArrayType : public Type {
- public:
-  explicit IBinderArrayType(const JavaTypeNamespace* types);
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class IBinderType : public Type {
- public:
-  explicit IBinderType(const JavaTypeNamespace* types);
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class IInterfaceType : public Type {
- public:
-  explicit IInterfaceType(const JavaTypeNamespace* types);
-};
-
-class BinderType : public Type {
- public:
-  explicit BinderType(const JavaTypeNamespace* types);
-};
-
-class BinderProxyType : public Type {
- public:
-  explicit BinderProxyType(const JavaTypeNamespace* types);
-};
-
-class ParcelType : public Type {
- public:
-  explicit ParcelType(const JavaTypeNamespace* types);
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class ParcelableInterfaceType : public Type {
- public:
-  explicit ParcelableInterfaceType(const JavaTypeNamespace* types);
-};
-
-class MapType : public Type {
- public:
-  explicit MapType(const JavaTypeNamespace* types);
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class ListType : public Type {
- public:
-  explicit ListType(const JavaTypeNamespace* types);
-
-  std::string InstantiableName() const override;
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class UserDataArrayType : public Type {
- public:
-  UserDataArrayType(const JavaTypeNamespace* types, const std::string& package,
-                    const std::string& name, bool builtIn,
-                    bool canWriteToParcel, const std::string& declFile = "",
-                    int declLine = -1);
-
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class UserDataType : public Type {
- public:
-  UserDataType(const JavaTypeNamespace* types, const std::string& package,
-               const std::string& name, bool builtIn, bool canWriteToParcel,
-               const std::string& declFile = "", int declLine = -1);
-
-  const ValidatableType* NullableType() const override { return this; }
-};
-
-class InterfaceType : public Type {
- public:
-  InterfaceType(const JavaTypeNamespace* types, const std::string& package, const std::string& name,
-                bool builtIn, const std::string& declFile, int declLine, const Type* stub,
-                const Type* proxy, const Type* defaultImpl);
-
-  const ValidatableType* NullableType() const override { return this; }
-  const Type* GetStub() const { return stub_; }
-  const Type* GetProxy() const { return proxy_; }
-  const Type* GetDefaultImpl() const { return defaultImpl_; }
-
- private:
-  const Type* stub_;
-  const Type* proxy_;
-  const Type* defaultImpl_;
-};
-
-class ClassLoaderType : public Type {
- public:
-  explicit ClassLoaderType(const JavaTypeNamespace* types);
-};
-
-class GenericListType : public Type {
- public:
-  GenericListType(const JavaTypeNamespace* types, const Type* arg);
-
-  std::string InstantiableName() const override;
-  std::string JavaType() const override {
-    return "java.util.List<" + m_contained_type->JavaType() + ">";
-  }
-
-  const ValidatableType* NullableType() const override { return this; }
-
- private:
-  const Type* m_contained_type;
-};
-
-class JavaTypeNamespace : public LanguageTypeNamespace<Type> {
- public:
-  JavaTypeNamespace() = default;
-  virtual ~JavaTypeNamespace() = default;
-
-  void Init() override;
-  bool AddParcelableType(const AidlParcelable& p,
-                         const std::string& filename) override;
-  bool AddBinderType(const AidlInterface& b,
-                     const std::string& filename) override;
-  bool AddListType(const std::string& contained_type_name) override;
-  bool AddMapType(const std::string& key_type_name,
-                  const std::string& value_type_name) override;
-
-  const Type* BoolType() const { return m_bool_type; }
-  const Type* IntType() const { return m_int_type; }
-  const Type* StringType() const { return m_string_type; }
-  const Type* TextUtilsType() const { return m_text_utils_type; }
-  const Type* RemoteExceptionType() const { return m_remote_exception_type; }
-  const Type* RuntimeExceptionType() const { return m_runtime_exception_type; }
-  const Type* IBinderType() const { return m_ibinder_type; }
-  const Type* IInterfaceType() const { return m_iinterface_type; }
-  const Type* BinderNativeType() const { return m_binder_native_type; }
-  const Type* BinderProxyType() const { return m_binder_proxy_type; }
-  const Type* ParcelType() const { return m_parcel_type; }
-  const Type* ParcelableInterfaceType() const {
-    return m_parcelable_interface_type;
-  }
-  const Type* ContextType() const { return m_context_type; }
-  const Type* ClassLoaderType() const { return m_classloader_type; }
-
- private:
-  const Type* m_bool_type{nullptr};
-  const Type* m_int_type{nullptr};
-  const Type* m_string_type{nullptr};
-  const Type* m_text_utils_type{nullptr};
-  const Type* m_remote_exception_type{nullptr};
-  const Type* m_runtime_exception_type{nullptr};
-  const Type* m_ibinder_type{nullptr};
-  const Type* m_iinterface_type{nullptr};
-  const Type* m_binder_native_type{nullptr};
-  const Type* m_binder_proxy_type{nullptr};
-  const Type* m_parcel_type{nullptr};
-  const Type* m_parcelable_interface_type{nullptr};
-  const Type* m_context_type{nullptr};
-  const Type* m_classloader_type{nullptr};
-
-  DISALLOW_COPY_AND_ASSIGN(JavaTypeNamespace);
-};
-}  // namespace java
-}  // namespace aidl
-}  // namespace android
diff --git a/type_java_unittest.cpp b/type_java_unittest.cpp
deleted file mode 100644
index 0a5c94b..0000000
--- a/type_java_unittest.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <memory>
-
-#include <gtest/gtest.h>
-
-#include "aidl_language.h"
-#include "type_java.h"
-
-using std::unique_ptr;
-
-namespace android {
-namespace aidl {
-namespace java {
-
-class JavaTypeNamespaceTest : public ::testing::Test {
- protected:
-  void SetUp() override {
-    types_.Init();
-  }
-  JavaTypeNamespace types_;
-};
-
-TEST_F(JavaTypeNamespaceTest, HasSomeBasicTypes) {
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("void"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("int"));
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("java.lang.String"));
-}
-
-TEST_F(JavaTypeNamespaceTest, ContainerTypeCreation) {
-  // We start with no knowledge of parcelables or lists of them.
-  EXPECT_FALSE(types_.HasTypeByCanonicalName("Foo"));
-  EXPECT_FALSE(types_.HasTypeByCanonicalName("java.util.List<a.goog.Foo>"));
-  unique_ptr<AidlParcelable> parcelable(new AidlParcelable(
-      AIDL_LOCATION_HERE, new AidlQualifiedName(AIDL_LOCATION_HERE, "Foo", ""), {"a", "goog"}, ""));
-  // Add the parcelable type we care about.
-  EXPECT_TRUE(types_.AddParcelableType(*parcelable.get(), __FILE__));
-  // Now we can find the parcelable type, but not the List of them.
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("a.goog.Foo"));
-  EXPECT_FALSE(types_.HasTypeByCanonicalName("java.util.List<a.goog.Foo>"));
-  // But after we add the list explicitly...
-  std::vector<std::unique_ptr<AidlTypeSpecifier>>* type_args =
-      new std::vector<std::unique_ptr<AidlTypeSpecifier>>();
-  type_args->emplace_back(new AidlTypeSpecifier(AIDL_LOCATION_HERE, "Foo", false, nullptr, ""));
-  AidlTypeSpecifier container_type(AIDL_LOCATION_HERE, "List", false, type_args, "");
-  EXPECT_TRUE(types_.MaybeAddContainerType(container_type));
-  // This should work.
-  EXPECT_TRUE(types_.HasTypeByCanonicalName("java.util.List<a.goog.Foo>"));
-}
-
-}  // namespace java
-}  // namespace aidl
-}  // namespace android
diff --git a/type_namespace.cpp b/type_namespace.cpp
deleted file mode 100644
index e8e5a29..0000000
--- a/type_namespace.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "type_namespace.h"
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "aidl_language.h"
-#include "logging.h"
-
-using android::base::StringPrintf;
-using std::string;
-using std::vector;
-
-namespace android {
-namespace aidl {
-
-// Since packages cannot contain '-' normally, we cannot be asked
-// to create a type that conflicts with these strings.
-const char kAidlReservedTypePackage[] = "aidl-internal";
-const char kUtf8InCppStringClass[] = "Utf8InCppString";
-
-// These *must* match the package and class names above.
-const char kUtf8InCppStringCanonicalName[] = "aidl-internal.Utf8InCppString";
-
-const char kStringCanonicalName[] = "java.lang.String";
-
-const char kUtf8InCppAnnotation[] = "@utfInCpp";
-
-namespace {
-
-bool is_java_keyword(const char* str) {
-  static const std::vector<std::string> kJavaKeywords{
-      "abstract",   "assert",       "boolean",   "break",      "byte",
-      "case",       "catch",        "char",      "class",      "const",
-      "continue",   "default",      "do",        "double",     "else",
-      "enum",       "extends",      "final",     "finally",    "float",
-      "for",        "goto",         "if",        "implements", "import",
-      "instanceof", "int",          "interface", "long",       "native",
-      "new",        "package",      "private",   "protected",  "public",
-      "return",     "short",        "static",    "strictfp",   "super",
-      "switch",     "synchronized", "this",      "throw",      "throws",
-      "transient",  "try",          "void",      "volatile",   "while",
-      "true",       "false",        "null",
-  };
-  return std::find(kJavaKeywords.begin(), kJavaKeywords.end(), str) !=
-      kJavaKeywords.end();
-}
-
-} // namespace
-
-ValidatableType::ValidatableType(
-    int kind, const string& package, const string& type_name,
-    const string& decl_file, int decl_line)
-    : kind_(kind),
-      type_name_(type_name),
-      canonical_name_((package.empty()) ? type_name
-                                        : package + "." + type_name),
-      origin_file_(decl_file),
-      origin_line_(decl_line) {}
-
-string ValidatableType::HumanReadableKind() const {
-  switch (Kind()) {
-    case ValidatableType::KIND_BUILT_IN:
-      return "a built in";
-    case ValidatableType::KIND_PARCELABLE:
-      return "a parcelable";
-    case ValidatableType::KIND_INTERFACE:
-      return "an interface";
-    case ValidatableType::KIND_GENERATED:
-      return "a generated";
-  }
-  return "unknown";
-}
-
-const ValidatableType* TypeNamespace::GetReturnType(const AidlTypeSpecifier& raw_type,
-                                                    const AidlDefinedType& context) const {
-  string error_msg;
-  const ValidatableType* return_type = GetValidatableType(raw_type, &error_msg, context);
-  if (return_type == nullptr) {
-    AIDL_ERROR(raw_type) << "Return type " << raw_type.ToString() << ": " << error_msg;
-    return nullptr;
-  }
-
-  return return_type;
-}
-
-bool TypeNamespace::AddDefinedTypes(vector<AidlDefinedType*>& types, const string& filename) {
-  bool success = true;
-  for (const auto type : types) {
-    const AidlInterface* interface = type->AsInterface();
-    if (interface != nullptr) {
-      success &= AddBinderType(*interface, filename);
-      continue;
-    }
-
-    const AidlParcelable* parcelable = type->AsParcelable();
-    if (parcelable != nullptr) {
-      success &= AddParcelableType(*parcelable, filename);
-      continue;
-    }
-
-    CHECK(false) << "aidl internal error: unrecognized type";
-  }
-  return success;
-}
-
-const ValidatableType* TypeNamespace::GetArgType(const AidlArgument& a, int arg_index,
-                                                 const AidlDefinedType& context) const {
-  string error_prefix =
-      StringPrintf("parameter %s (argument %d): ", a.GetName().c_str(), arg_index);
-
-  // check the arg type
-  string error_msg;
-  const ValidatableType* t = GetValidatableType(a.GetType(), &error_msg, context);
-  if (t == nullptr) {
-    AIDL_ERROR(a) << error_prefix << error_msg;
-    return nullptr;
-  }
-
-  const bool can_be_out = typenames_.CanBeOutParameter(a.GetType());
-  if (!a.DirectionWasSpecified() && can_be_out) {
-    AIDL_ERROR(a) << error_prefix << "'" << a.GetType().ToString()
-                  << "' can be an out type, so you must declare it as in, out, or inout.";
-    return nullptr;
-  }
-
-  if (a.GetDirection() != AidlArgument::IN_DIR && !can_be_out) {
-    AIDL_ERROR(a) << error_prefix << "'" << a.ToString() << "' can only be an in parameter.";
-    return nullptr;
-  }
-
-  // check that the name doesn't match a keyword
-  if (is_java_keyword(a.GetName().c_str())) {
-    AIDL_ERROR(a) << error_prefix << "Argument name is a Java or aidl keyword";
-    return nullptr;
-  }
-
-  // Reserve a namespace for internal use
-  if (a.GetName().substr(0, 5)  == "_aidl") {
-    AIDL_ERROR(a) << error_prefix << "Argument name cannot begin with '_aidl'";
-    return nullptr;
-  }
-
-  return t;
-}
-
-}  // namespace aidl
-}  // namespace android
diff --git a/type_namespace.h b/type_namespace.h
deleted file mode 100644
index a7952fb..0000000
--- a/type_namespace.h
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- * Copyright (C) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <memory>
-#include <string>
-
-#include <android-base/macros.h>
-#include <android-base/stringprintf.h>
-#include <android-base/strings.h>
-
-#include "aidl_language.h"
-#include "logging.h"
-
-namespace android {
-namespace aidl {
-
-// Special reserved type names.
-extern const char kAidlReservedTypePackage[];
-extern const char kUtf8InCppStringClass[];  // UTF16 wire format, UTF8 in C++
-
-// Helpful aliases defined to be <kAidlReservedTypePackage>.<class name>
-extern const char kUtf8InCppStringCanonicalName[];
-
-// We sometimes special case this class.
-extern const char kStringCanonicalName[];
-
-// Note that these aren't the strings recognized by the parser, we just keep
-// here for the sake of logging a common string constant.
-extern const char kUtf8InCppAnnotation[];
-
-class ValidatableType {
- public:
-  enum {
-    KIND_BUILT_IN,
-    KIND_PARCELABLE,
-    KIND_INTERFACE,
-    KIND_GENERATED,
-  };
-
-  ValidatableType(int kind,
-                  const std::string& package, const std::string& type_name,
-                  const std::string& decl_file, int decl_line);
-  virtual ~ValidatableType() = default;
-
-  virtual bool CanBeArray() const { return ArrayType() != nullptr; }
-  virtual bool CanWriteToParcel() const = 0;
-
-  virtual const ValidatableType* ArrayType() const = 0;
-  virtual const ValidatableType* NullableType() const = 0;
-
-  // ShortName() is the class name without a package.
-  std::string ShortName() const { return type_name_; }
-  // CanonicalName() returns the canonical AIDL type, with packages.
-  std::string CanonicalName() const { return canonical_name_; }
-
-  int Kind() const { return kind_; }
-  std::string HumanReadableKind() const;
-  std::string DeclFile() const { return origin_file_; }
-  int DeclLine() const { return origin_line_; }
-
- private:
-  const int kind_;
-  const std::string type_name_;
-  const std::string canonical_name_;
-  const std::string origin_file_;
-  const int origin_line_;
-
-  DISALLOW_COPY_AND_ASSIGN(ValidatableType);
-};
-
-class TypeNamespace {
- public:
-  // Load the TypeNamespace with built in types.  Don't do work in the
-  // constructor because many of the useful methods are virtual.
-  virtual void Init() = 0;
-
-  bool AddDefinedTypes(vector<AidlDefinedType*>& types, const string& filename);
-
-  // Load this TypeNamespace with user defined types.
-  virtual bool AddParcelableType(const AidlParcelable& p,
-                                 const std::string& filename) = 0;
-
-  virtual bool AddBinderType(const AidlInterface& b,
-                             const std::string& filename) = 0;
-  // Add a container type to this namespace.  Returns false only
-  // on error. Silently discards requests to add non-container types.
-  virtual bool MaybeAddContainerType(const AidlTypeSpecifier& aidl_type) = 0;
-
-  // Returns true iff this has a type for |import|.
-  virtual bool HasImportType(const std::string& import) const = 0;
-
-  // Returns a pointer to a type corresponding to |raw_type| or nullptr
-  // if this is an invalid return type.
-  virtual const ValidatableType* GetReturnType(const AidlTypeSpecifier& raw_type,
-                                               const AidlDefinedType& context) const;
-
-  // Returns a pointer to a type corresponding to |a| or nullptr if |a|
-  // has an invalid argument type.
-  virtual const ValidatableType* GetArgType(const AidlArgument& a, int arg_index,
-                                            const AidlDefinedType& context) const;
-
-  // Returns a pointer to a type corresponding to |defined_type|.
-  virtual const ValidatableType* GetDefinedType(const AidlDefinedType& defined_type) const = 0;
-
-  AidlTypenames typenames_;
-
- protected:
-  TypeNamespace() = default;
-  virtual ~TypeNamespace() = default;
-
-  virtual const ValidatableType* GetValidatableType(const AidlTypeSpecifier& type,
-                                                    std::string* error_msg,
-                                                    const AidlDefinedType& context) const = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TypeNamespace);
-};
-
-template<typename T>
-class LanguageTypeNamespace : public TypeNamespace {
- public:
-  LanguageTypeNamespace() = default;
-  virtual ~LanguageTypeNamespace() = default;
-
-  // Get a pointer to an existing type.  Searches first by fully-qualified
-  // name, and then class name (dropping package qualifiers).
-  const T* Find(const AidlTypeSpecifier& aidl_type) const;
-
-  // Find a type by its |name|.  If |name| refers to a container type (e.g.
-  // List<String>) you must turn it into a canonical name first (e.g.
-  // java.util.List<java.lang.String>).
-  const T* FindTypeByCanonicalName(const std::string& name) const;
-  bool HasTypeByCanonicalName(const std::string& type_name) const {
-    return FindTypeByCanonicalName(type_name) != nullptr;
-  }
-  bool HasImportType(const std::string& import) const override {
-    return HasTypeByCanonicalName(import);
-  }
-  const ValidatableType* GetDefinedType(const AidlDefinedType& defined_type) const override {
-    return FindTypeByCanonicalName(defined_type.GetCanonicalName());
-  }
-
-  bool MaybeAddContainerType(const AidlTypeSpecifier& aidl_type) override;
-  // We dynamically create container types as we discover them in the parse
-  // tree.  Returns false if the contained types cannot be canonicalized.
-  virtual bool AddListType(const std::string& contained_type_name) = 0;
-  virtual bool AddMapType(const std::string& key_type_name,
-                          const std::string& value_type_name) = 0;
-
- protected:
-  bool Add(std::unique_ptr<const T> type);
-  void AddAndSetMember(const T** member, std::unique_ptr<const T> type) {
-    const T* ptr_value = type.get();
-    CHECK(Add(std::move(type)));
-    *member = ptr_value;
-  }
-
- private:
-  // Returns true iff the name can be canonicalized to a container type.
-  virtual bool CanonicalizeContainerType(const AidlTypeSpecifier& aidl_type,
-                                         std::vector<std::string>* container_class,
-                                         std::vector<std::string>* contained_type_names) const;
-
-  // Returns true if this is a container type, rather than a normal type.
-  bool IsContainerType(const std::string& type_name) const;
-
-  const ValidatableType* GetValidatableType(const AidlTypeSpecifier& type, std::string* error_msg,
-                                            const AidlDefinedType& context) const override;
-
-  std::vector<std::unique_ptr<const T>> types_;
-
-  DISALLOW_COPY_AND_ASSIGN(LanguageTypeNamespace);
-};  // class LanguageTypeNamespace
-
-template <typename T>
-bool LanguageTypeNamespace<T>::Add(std::unique_ptr<const T> type) {
-  const T* existing = FindTypeByCanonicalName(type->CanonicalName());
-  if (!existing) {
-    types_.push_back(std::move(type));
-    return true;
-  }
-
-  if (existing->Kind() == ValidatableType::KIND_BUILT_IN) {
-    LOG(ERROR) << type->DeclFile() << ":" << type->DeclLine()
-               << " attempt to redefine built in class "
-               << type->CanonicalName();
-    return false;
-  }
-
-  if (type->Kind() != existing->Kind()) {
-    LOG(ERROR) << type->DeclFile() << ":" << type->DeclLine()
-               << " attempt to redefine " << type->CanonicalName()
-               << " as " << type->HumanReadableKind();
-    LOG(ERROR) << existing->DeclFile() << ":" << existing->DeclLine()
-               << " previously defined here as "
-               << existing->HumanReadableKind();
-    return false;
-  }
-
-  return true;
-}
-
-template <typename T>
-const T* LanguageTypeNamespace<T>::Find(const AidlTypeSpecifier& aidl_type) const {
-  using std::string;
-  using std::vector;
-  using android::base::Join;
-  using android::base::Trim;
-
-  string name = Trim(aidl_type.IsArray() ? aidl_type.GetName() : aidl_type.ToString());
-  if (IsContainerType(name)) {
-    vector<string> container_class;
-    vector<string> contained_type_names;
-    if (!CanonicalizeContainerType(aidl_type, &container_class,
-                                   &contained_type_names)) {
-      return nullptr;
-    }
-    name = Join(container_class, '.') +
-           "<" + Join(contained_type_names, ',') + ">";
-  }
-  // Here, we know that we have the canonical name for this container.
-  return FindTypeByCanonicalName(name);
-}
-
-template<typename T>
-const T* LanguageTypeNamespace<T>::FindTypeByCanonicalName(
-    const std::string& raw_name) const {
-  using android::base::Trim;
-
-  std::string name = Trim(raw_name);
-  const T* ret = nullptr;
-  for (const auto& type : types_) {
-    // Always prefer a exact match if possible.
-    // This works for primitives and class names qualified with a package.
-    if (type->CanonicalName() == name) {
-      ret = type.get();
-      break;
-    }
-    // We allow authors to drop packages when refering to a class name.
-    if (type->ShortName() == name) {
-      ret = type.get();
-    }
-  }
-
-  return ret;
-}
-
-template <typename T>
-bool LanguageTypeNamespace<T>::MaybeAddContainerType(const AidlTypeSpecifier& aidl_type) {
-  using android::base::Join;
-
-  const std::string& type_name = aidl_type.ToString();
-  if (!IsContainerType(type_name)) {
-    return true;
-  }
-
-  std::vector<std::string> container_class;
-  std::vector<std::string> contained_type_names;
-  if (!CanonicalizeContainerType(aidl_type, &container_class,
-                                 &contained_type_names)) {
-    return false;
-  }
-
-  const std::string canonical_name = Join(container_class, ".") +
-      "<" + Join(contained_type_names, ",") + ">";
-  if (HasTypeByCanonicalName(canonical_name)) {
-    return true;
-  }
-
-
-  // We only support two types right now and this type is one of them.
-  switch (contained_type_names.size()) {
-    case 1:
-      return AddListType(contained_type_names[0]);
-    case 2:
-      return AddMapType(contained_type_names[0], contained_type_names[1]);
-    default:
-      break;  // Should never get here, will FATAL below.
-  }
-
-  LOG(FATAL) << "aidl internal error";
-  return false;
-}
-
-template<typename T>
-bool LanguageTypeNamespace<T>::IsContainerType(
-    const std::string& type_name) const {
-  const size_t opening_brace = type_name.find('<');
-  const size_t closing_brace = type_name.find('>');
-  if (opening_brace != std::string::npos ||
-      closing_brace != std::string::npos) {
-    return true;  // Neither < nor > appear in normal AIDL types.
-  }
-  return false;
-}
-
-template <typename T>
-bool LanguageTypeNamespace<T>::CanonicalizeContainerType(
-    const AidlTypeSpecifier& aidl_type, std::vector<std::string>* container_class,
-    std::vector<std::string>* contained_type_names) const {
-  std::string container = aidl_type.GetName();
-  std::vector<std::string> args;
-  for (auto& type_arg : aidl_type.GetTypeParameters()) {
-    if (type_arg->IsGeneric()) {
-      // nesting is not allowed yet.
-      LOG(ERROR) << "Nested template type '" << aidl_type.ToString() << "'";
-    }
-
-    std::string type_name = type_arg->ToString();
-    // Here, we are relying on FindTypeByCanonicalName to do its best when
-    // given a non-canonical name for non-compound type (i.e. not another
-    // container).
-    const T* arg_type = FindTypeByCanonicalName(type_name);
-    if (!arg_type) {
-      return false;
-    }
-
-    // Now get the canonical names for these contained types, remapping them if
-    // necessary.
-    type_name = arg_type->CanonicalName();
-    if (aidl_type.IsUtf8InCpp() && type_name == "java.lang.String") {
-      type_name = kUtf8InCppStringCanonicalName;
-    }
-    args.emplace_back(type_name);
-  }
-
-  // Map the container name to its canonical form for supported containers.
-  if ((container == "List" || container == "java.util.List") &&
-      args.size() == 1) {
-    *container_class = {"java", "util", "List"};
-    *contained_type_names = args;
-    return true;
-  }
-  if ((container == "Map" || container == "java.util.Map") &&
-      args.size() == 2) {
-    *container_class = {"java", "util", "Map"};
-    *contained_type_names = args;
-    return true;
-  }
-
-  LOG(ERROR) << "Unknown find container with name " << container << " and " << args.size()
-             << " contained types.";
-  return false;
-}
-
-template <typename T>
-const ValidatableType* LanguageTypeNamespace<T>::GetValidatableType(
-    const AidlTypeSpecifier& aidl_type, std::string* error_msg,
-    const AidlDefinedType& context) const {
-  using android::base::StringPrintf;
-
-  const ValidatableType* type = Find(aidl_type);
-  if (type == nullptr) {
-    *error_msg = "unknown type";
-    return nullptr;
-  }
-
-  if (aidl_type.GetName() == "void") {
-    if (aidl_type.IsArray()) {
-      *error_msg = "void type cannot be an array";
-      return nullptr;
-    }
-    if (aidl_type.IsNullable() || aidl_type.IsUtf8InCpp()) {
-      *error_msg = "void type cannot be annotated";
-      return nullptr;
-    }
-    // We have no more special handling for void.
-    return type;
-  }
-
-  bool utf8InCpp = aidl_type.IsUtf8InCpp();
-
-  // Strings inside containers get remapped to appropriate utf8 versions when
-  // we convert the container name to its canonical form and the look up the
-  // type.  However, for non-compound types (i.e. those not in a container) we
-  // must patch them up here.
-  if (IsContainerType(type->CanonicalName())) {
-    utf8InCpp = false;
-  } else if (aidl_type.GetName() == "String" ||
-             aidl_type.GetName() == "java.lang.String") {
-    utf8InCpp = utf8InCpp || context.IsUtf8InCpp();
-  } else if (utf8InCpp) {
-    *error_msg = StringPrintf("type '%s' may not be annotated as %s.", aidl_type.GetName().c_str(),
-                              kUtf8InCppAnnotation);
-    return nullptr;
-  }
-
-  if (utf8InCpp) {
-    type = FindTypeByCanonicalName(kUtf8InCppStringCanonicalName);
-  }
-
-  // One of our UTF8 transforms made type null
-  if (type == nullptr) {
-    *error_msg = StringPrintf("%s is unsupported when generating code for this language.",
-                              kUtf8InCppAnnotation);
-    return nullptr;
-  }
-
-  if (!type->CanWriteToParcel()) {
-    *error_msg = "type cannot be marshalled";
-    return nullptr;
-  }
-
-  if (aidl_type.IsArray()) {
-    type = type->ArrayType();
-    if (!type) {
-      *error_msg = StringPrintf("type '%s' cannot be an array",
-                                aidl_type.GetName().c_str());
-      return nullptr;
-    }
-  }
-
-  if (context.IsNullable()) {
-    const ValidatableType* nullableType = type->NullableType();
-
-    if (nullableType) {
-      return nullableType;
-    }
-  }
-
-  if (aidl_type.IsNullable()) {
-    type = type->NullableType();
-    if (!type) {
-      *error_msg = StringPrintf("type '%s%s' cannot be marked as possibly null",
-                                aidl_type.GetName().c_str(),
-                                (aidl_type.IsArray()) ? "[]" : "");
-      return nullptr;
-    }
-  }
-
-  return type;
-}
-
-}  // namespace aidl
-}  // namespace android