fix: --checkapi works with enum constants

--checkapi should compare const values with "literal" values, not
with evaluated values because --checkapi task can't resolve imported
types.

--checkapi=equal was relying on "Dump()" which relies on type/value/
resolution.

Now --checkapi=equal dumps const values using literals, not evaluated
values.

Bug: 179950161
Test: m aidl_unittests
Change-Id: I62c84f060036260bfcd9c1020e32715993378e26
diff --git a/aidl_checkapi.cpp b/aidl_checkapi.cpp
index f07e7e6..de5c9ad 100644
--- a/aidl_checkapi.cpp
+++ b/aidl_checkapi.cpp
@@ -41,10 +41,18 @@
 using std::string;
 using std::vector;
 
+struct DumpForEqualityVisitor : DumpVisitor {
+  DumpForEqualityVisitor(CodeWriter& out) : DumpVisitor(out) {}
+
+  void DumpConstantValue(const AidlTypeSpecifier&, const AidlConstantValue& c) {
+    out << c.Literal();
+  }
+};
+
 static std::string Dump(const AidlDefinedType& type) {
   string code;
   CodeWriterPtr out = CodeWriter::ForString(&code);
-  DumpVisitor visitor(*out);
+  DumpForEqualityVisitor visitor(*out);
   type.DispatchVisit(visitor);
   out->Close();
   return code;
diff --git a/aidl_dumpapi.h b/aidl_dumpapi.h
index f30c54a..6d000dd 100644
--- a/aidl_dumpapi.h
+++ b/aidl_dumpapi.h
@@ -28,7 +28,7 @@
   void DumpMembers(const AidlDefinedType& dt);
   void DumpComments(const AidlCommentable& c);
   void DumpAnnotations(const AidlAnnotatable& a);
-  void DumpConstantValue(const AidlTypeSpecifier& type, const AidlConstantValue& c);
+  virtual void DumpConstantValue(const AidlTypeSpecifier& type, const AidlConstantValue& c);
 
   void Visit(const AidlInterface& t) override;
   void Visit(const AidlParcelable& t) override;
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index 05008c9..0baf5ba 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -1938,6 +1938,19 @@
   EXPECT_TRUE(::android::aidl::check_api(options, io_delegate_));
 }
 
+TEST_F(AidlTest, CheckApiEqual_EnumFieldsWithDefaultValues) {
+  Options options = Options::From("aidl --checkapi=equal old new");
+  const string foo_definition = "package p; parcelable Foo{ p.Enum e = p.Enum.FOO; }";
+  const string enum_definition = "package p; enum Enum { FOO }";
+  io_delegate_.SetFileContents("old/p/Foo.aidl", foo_definition);
+  io_delegate_.SetFileContents("old/p/Enum.aidl", enum_definition);
+  io_delegate_.SetFileContents("new/p/Foo.aidl", foo_definition);
+  io_delegate_.SetFileContents("new/p/Enum.aidl", enum_definition);
+  CaptureStderr();
+  EXPECT_TRUE(::android::aidl::check_api(options, io_delegate_));
+  EXPECT_EQ("", GetCapturedStderr());
+}
+
 class AidlTestCompatibleChanges : public AidlTest {
  protected:
   Options options_ = Options::From("aidl --checkapi old new");