add -W<warning>/-Werror CLI options

-Weverything: enable all diagnotics
-Wfoo: enable "foo"
-Wno-foo: disable "foo"

-Werror: turn diagnostic warnings into errors
-Wno-error=foo: turn "foo" into a warning

For now, only -Winterface-name is available, which checks if interface
names start with "I".

Bug: 168028537
Test: aidl_unittests
Change-Id: I31516b337dd80b9833205bf769af40e49f88d15d
diff --git a/aidl_language.cpp b/aidl_language.cpp
index 92f9d9b..52aa085 100644
--- a/aidl_language.cpp
+++ b/aidl_language.cpp
@@ -44,6 +44,7 @@
 }
 #endif
 
+using android::aidl::DiagnosticID;
 using android::aidl::IoDelegate;
 using android::base::Join;
 using android::base::Split;
@@ -863,7 +864,7 @@
   }
 }
 
-bool AidlDefinedType::CheckValid(const AidlTypenames& typenames) const {
+bool AidlDefinedType::CheckValid(const AidlTypenames& typenames, DiagnosticsContext&) const {
   if (!AidlAnnotatable::CheckValid(typenames)) {
     return false;
   }
@@ -991,8 +992,8 @@
           AidlAnnotation::Type::JAVA_PASSTHROUGH,       AidlAnnotation::Type::JAVA_ONLY_IMMUTABLE};
 }
 
-bool AidlParcelable::CheckValid(const AidlTypenames& typenames) const {
-  if (!AidlDefinedType::CheckValid(typenames)) {
+bool AidlParcelable::CheckValid(const AidlTypenames& typenames, DiagnosticsContext& diag) const {
+  if (!AidlDefinedType::CheckValid(typenames, diag)) {
     return false;
   }
   if (!AidlParameterizable<std::string>::CheckValid()) {
@@ -1044,8 +1045,9 @@
           AidlAnnotation::Type::RUST_DERIVE};
 }
 
-bool AidlStructuredParcelable::CheckValid(const AidlTypenames& typenames) const {
-  if (!AidlParcelable::CheckValid(typenames)) {
+bool AidlStructuredParcelable::CheckValid(const AidlTypenames& typenames,
+                                          DiagnosticsContext& diag) const {
+  if (!AidlParcelable::CheckValid(typenames, diag)) {
     return false;
   }
 
@@ -1240,8 +1242,9 @@
           AidlAnnotation::Type::HIDE, AidlAnnotation::Type::JAVA_PASSTHROUGH};
 }
 
-bool AidlEnumDeclaration::CheckValid(const AidlTypenames& typenames) const {
-  if (!AidlDefinedType::CheckValid(typenames)) {
+bool AidlEnumDeclaration::CheckValid(const AidlTypenames& typenames,
+                                     DiagnosticsContext& diag) const {
+  if (!AidlDefinedType::CheckValid(typenames, diag)) {
     return false;
   }
   if (!GetMembers().empty()) {
@@ -1303,9 +1306,9 @@
   writer->Write("}\n");
 }
 
-bool AidlUnionDecl::CheckValid(const AidlTypenames& typenames) const {
+bool AidlUnionDecl::CheckValid(const AidlTypenames& typenames, DiagnosticsContext& diag) const {
   // visit parents
-  if (!AidlParcelable::CheckValid(typenames)) {
+  if (!AidlParcelable::CheckValid(typenames, diag)) {
     return false;
   }
 
@@ -1421,8 +1424,8 @@
           AidlAnnotation::Type::JAVA_PASSTHROUGH,      AidlAnnotation::Type::DESCRIPTOR};
 }
 
-bool AidlInterface::CheckValid(const AidlTypenames& typenames) const {
-  if (!AidlDefinedType::CheckValid(typenames)) {
+bool AidlInterface::CheckValid(const AidlTypenames& typenames, DiagnosticsContext& diag) const {
+  if (!AidlDefinedType::CheckValid(typenames, diag)) {
     return false;
   }
   // Has to be a pointer due to deleting copy constructor. No idea why.
@@ -1522,6 +1525,11 @@
     success = success && constant->CheckValid(typenames);
   }
 
+  if (auto name = GetName(); name.size() < 1 || name[0] != 'I') {
+    diag.Report(GetLocation(), DiagnosticID::interface_name)
+        << "Interface names should start with I.";
+  }
+
   return success;
 }