ConstantValueDecorator with strings

ConstantValueDecorator now handles array-type values better. Previously,
array values are passed to ConstantValueDecorator after joining into a
single string, which makes it difficult to handle array values because
it should rely on formatting ("{", Join(), "}) and "wrong" type.

Now, when the type is an array, raw_value is passed as vector<string>.

This is a preparation step for multi-dimensional fixed-size arrays.
Nested constant arrays like "{{1,2,3}, {4,5,6}}" will be used as a
default value for fixed-size arrays.

Bug: 204116012
Bug: 207087196
Test: aidl_unittests
Change-Id: I15353816dafcc80b55f1878f6bcc923e21cd12e8
diff --git a/aidl_language.h b/aidl_language.h
index 392665d..019330c 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -20,6 +20,7 @@
 #include <regex>
 #include <string>
 #include <unordered_set>
+#include <variant>
 #include <vector>
 
 #include <android-base/result.h>
@@ -215,8 +216,9 @@
 
 // Transforms a value string into a language specific form. Raw value as produced by
 // AidlConstantValue.
-using ConstantValueDecorator =
-    std::function<std::string(const AidlTypeSpecifier& type, const std::string& raw_value)>;
+using ConstantValueDecorator = std::function<std::string(
+    const AidlTypeSpecifier& type,
+    const std::variant<std::string, std::vector<std::string>>& raw_value)>;
 
 class AidlAnnotation : public AidlNode {
  public:
@@ -458,7 +460,9 @@
 };
 
 // Returns the universal value unaltered.
-std::string AidlConstantValueDecorator(const AidlTypeSpecifier& type, const std::string& raw_value);
+std::string AidlConstantValueDecorator(
+    const AidlTypeSpecifier& type,
+    const std::variant<std::string, std::vector<std::string>>& raw_value);
 
 class AidlMember : public AidlAnnotatable {
  public: