--dumpapi doesn't inline constants am: 833fbf46f9 am: ef553fb43a

Original change: https://android-review.googlesource.com/c/platform/system/tools/aidl/+/2363634

Change-Id: Ia6cf3e1ac6dc257d2f978f10d00260cef5ac08a1
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/aidl_checkapi.cpp b/aidl_checkapi.cpp
index c1d3c66..584e5a6 100644
--- a/aidl_checkapi.cpp
+++ b/aidl_checkapi.cpp
@@ -44,7 +44,7 @@
 static std::string Dump(const AidlDefinedType& type) {
   string code;
   CodeWriterPtr out = CodeWriter::ForString(&code);
-  DumpVisitor visitor(*out);
+  DumpVisitor visitor(*out, /*inline_constants=*/true);
   type.DispatchVisit(visitor);
   out->Close();
   return code;
diff --git a/aidl_dumpapi.cpp b/aidl_dumpapi.cpp
index c145081..df5be2f 100644
--- a/aidl_dumpapi.cpp
+++ b/aidl_dumpapi.cpp
@@ -97,7 +97,11 @@
 }
 
 void DumpVisitor::DumpConstantValue(const AidlTypeSpecifier& type, const AidlConstantValue& c) {
-  out << c.ValueString(type, AidlConstantValueDecorator);
+  if (inline_constants) {
+    out << c.ValueString(type, AidlConstantValueDecorator);
+  } else {
+    c.DispatchVisit(*this);
+  }
 }
 
 void DumpVisitor::Visit(const AidlInterface& t) {
@@ -126,8 +130,11 @@
   out.Indent();
   for (const auto& e : t.GetEnumerators()) {
     DumpComments(*e);
-    out << e->GetName() << " = ";
-    DumpConstantValue(t.GetBackingType(), *e->GetValue());
+    out << e->GetName();
+    if (e->IsValueUserSpecified() || inline_constants) {
+      out << " = ";
+      DumpConstantValue(t.GetBackingType(), *e->GetValue());
+    }
     out << ",\n";
   }
   out.Dedent();
@@ -173,6 +180,40 @@
   out << t.ToString();
 }
 
+// These Visit() methods are not invoked when inline_constants = true
+void DumpVisitor::Visit(const AidlConstantValue& c) {
+  AIDL_FATAL_IF(inline_constants, AIDL_LOCATION_HERE);
+  out << c.Literal();
+}
+
+void DumpVisitor::Visit(const AidlConstantReference& r) {
+  AIDL_FATAL_IF(inline_constants, AIDL_LOCATION_HERE);
+  if (auto& ref = r.GetRefType(); ref) {
+    ref->DispatchVisit(*this);
+    out << ".";
+  }
+  out << r.GetFieldName();
+}
+
+void DumpVisitor::Visit(const AidlBinaryConstExpression& b) {
+  AIDL_FATAL_IF(inline_constants, AIDL_LOCATION_HERE);
+  // TODO(b/262594867) put parentheses only when necessary
+  out << "(";
+  b.Left()->DispatchVisit(*this);
+  out << " " << b.Op() << " ";
+  b.Right()->DispatchVisit(*this);
+  out << ")";
+}
+
+void DumpVisitor::Visit(const AidlUnaryConstExpression& u) {
+  AIDL_FATAL_IF(inline_constants, AIDL_LOCATION_HERE);
+  // TODO(b/262594867) put parentheses only when necessary
+  out << "(";
+  out << u.Op();
+  u.Val()->DispatchVisit(*this);
+  out << ")";
+}
+
 static string GetApiDumpPathFor(const AidlDefinedType& defined_type, const Options& options) {
   string package_as_path = Join(Split(defined_type.GetPackage(), "."), OS_PATH_SEPARATOR);
   AIDL_FATAL_IF(options.OutputDir().empty() || options.OutputDir().back() != '/', defined_type);
@@ -209,7 +250,7 @@
         if (!type->GetPackage().empty()) {
           (*writer) << "package " << type->GetPackage() << ";\n";
         }
-        DumpVisitor visitor(*writer);
+        DumpVisitor visitor(*writer, /*inline_constants=*/false);
         type->DispatchVisit(visitor);
       }
     } else {
diff --git a/aidl_dumpapi.h b/aidl_dumpapi.h
index df8278a..b4c146c 100644
--- a/aidl_dumpapi.h
+++ b/aidl_dumpapi.h
@@ -22,7 +22,9 @@
 
 struct DumpVisitor : AidlVisitor {
   CodeWriter& out;
-  DumpVisitor(CodeWriter& out) : out(out) {}
+  bool inline_constants;
+  DumpVisitor(CodeWriter& out, bool inline_constants)
+      : out(out), inline_constants(inline_constants) {}
 
   void DumpType(const AidlDefinedType& dt, const string& type);
   void DumpMembers(const AidlDefinedType& dt);
@@ -39,6 +41,10 @@
   void Visit(const AidlVariableDeclaration& v) override;
   void Visit(const AidlConstantDeclaration& c) override;
   void Visit(const AidlTypeSpecifier& t) override;
+  void Visit(const AidlConstantValue& c) override;
+  void Visit(const AidlConstantReference& r) override;
+  void Visit(const AidlBinaryConstExpression& b) override;
+  void Visit(const AidlUnaryConstExpression& u) override;
 };
 
 bool dump_api(const Options& options, const IoDelegate& io_delegate);
diff --git a/aidl_language.h b/aidl_language.h
index 9cec570..e5e9774 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -727,7 +727,7 @@
 };
 
 // Represents "<type>.<field>" which resolves to a constant which is one of
-// - constant declartion
+// - constant declaration
 // - enumerator
 // When a <type> is missing, <field> is of the enclosing type.
 class AidlConstantReference : public AidlConstantValue {
@@ -765,6 +765,8 @@
     traverse(*unary_);
   }
   void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); }
+  const std::unique_ptr<AidlConstantValue>& Val() const { return unary_; }
+  const std::string& Op() const { return op_; }
 
  private:
   bool evaluate() const override;
@@ -790,6 +792,9 @@
     traverse(*right_val_);
   }
   void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); }
+  const std::unique_ptr<AidlConstantValue>& Left() const { return left_val_; }
+  const std::unique_ptr<AidlConstantValue>& Right() const { return right_val_; }
+  const std::string& Op() const { return op_; }
 
  private:
   bool evaluate() const override;
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index 9dedca3..7dc83aa 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -2478,8 +2478,8 @@
   EXPECT_TRUE(io_delegate_.GetWrittenContents("dump/foo/bar/Enum.aidl", &actual));
   EXPECT_EQ(string(kPreamble).append("package foo.bar;\n"
                                      "enum Enum {\n"
-                                     "  FOO = 0,\n"
-                                     "  BAR = 1,\n"
+                                     "  FOO,\n"
+                                     "  BAR = (FOO + 1),\n"
                                      "}\n"),
             actual);
 }
@@ -2495,6 +2495,7 @@
                                "import foo.bar.Enum;\n"
                                "parcelable Foo {\n"
                                "    Enum e = Enum.FOO;\n"
+                               "    int n = Enum.FOO;\n"
                                "}\n");
 
   vector<string> args = {"aidl", "--dumpapi", "-I . ", "-o dump", "foo/bar/Foo.aidl"};
@@ -2507,6 +2508,7 @@
   EXPECT_EQ(string(kPreamble).append("package foo.bar;\n"
                                      "parcelable Foo {\n"
                                      "  foo.bar.Enum e = foo.bar.Enum.FOO;\n"
+                                     "  int n = foo.bar.Enum.FOO;\n"
                                      "}\n"),
             actual);
 }
@@ -4981,7 +4983,7 @@
   EXPECT_EQ("int e = 3", fields[0]->ToString());
 }
 
-TEST_P(AidlTest, EnumeratorIsConstantValue_CanDefineOtherEnumerator) {
+TEST_F(AidlTest, EnumeratorIsConstantValue_CanDefineOtherEnumerator) {
   CaptureStderr();
   const AidlDefinedType* type = Parse("a/p/Foo.aidl", R"(
 package a.p;
@@ -4992,14 +4994,14 @@
       STANDARD_BT601_625 = 2 << STANDARD_SHIFT,
 }
 )",
-                                      typenames_, GetLanguage());
+                                      typenames_, Options::Language::JAVA);
   auto err = GetCapturedStderr();
   EXPECT_EQ("", err);
   ASSERT_NE(type, nullptr);
   const auto& enum_type = type->AsEnumDeclaration();
   string code;
   auto writer = CodeWriter::ForString(&code);
-  DumpVisitor visitor(*writer);
+  DumpVisitor visitor(*writer, /*inline_constants=*/true);
   visitor.Visit(*enum_type);
   writer->Close();
   EXPECT_EQ(R"--(@Backing(type="int")