c2hal: Emit camelCase and PascalCase things.

Test: built, verified test headers output. Made sure it still worked on
opengl/telephony/libhardware headers.

Change-Id: Iabeb0e912dc7df6b2eae76b962531a30c83593bf
diff --git a/c2hal/CompositeDeclaration.cpp b/c2hal/CompositeDeclaration.cpp
index e15365d..a9eba59 100644
--- a/c2hal/CompositeDeclaration.cpp
+++ b/c2hal/CompositeDeclaration.cpp
@@ -21,7 +21,6 @@
 #include <algorithm>
 #include <iostream>
 #include <string>
-#include <hidl-util/StringHelper.h>
 
 namespace android {
 
@@ -29,8 +28,12 @@
         const Type::Qualifier::Qualification qualifier,
         const std::string &name,
         std::vector<android::Declaration *> *fieldDeclarations)
-    : Declaration(name), mQualifier(qualifier), mFieldDeclarations(fieldDeclarations)
-    {}
+    : Declaration(""),
+      mQualifier(qualifier),
+      mFieldDeclarations(fieldDeclarations)
+    {
+        setName(name);
+    }
 
 CompositeDeclaration::~CompositeDeclaration() {
     if(mFieldDeclarations != NULL) {
@@ -41,6 +44,10 @@
     delete mFieldDeclarations;
 }
 
+void CompositeDeclaration::setName(const std::string &name) {
+    Declaration::setName(name);
+    forcePascalCase();
+}
 
 const Type::Qualifier::Qualification &CompositeDeclaration::getQualifier() const {
     return mQualifier;
@@ -127,15 +134,7 @@
 }
 
 std::string CompositeDeclaration::getInterfaceName() const {
-    std::string baseName{getName()};
-
-    if (baseName.length() > 2 &&
-        baseName.substr(baseName.length() - 2) == "_t") {
-
-        baseName = baseName.substr(0, baseName.length() - 2);
-    }
-
-    return "I" + StringHelper::SnakeCaseToCamelCase(baseName);
+    return "I" + getName();
 }
 
 bool CompositeDeclaration::isInterface() const {
diff --git a/c2hal/CompositeDeclaration.h b/c2hal/CompositeDeclaration.h
index a449216..6eeaf9a 100644
--- a/c2hal/CompositeDeclaration.h
+++ b/c2hal/CompositeDeclaration.h
@@ -29,6 +29,8 @@
         std::vector<android::Declaration *> *fieldDeclarations);
     ~CompositeDeclaration();
 
+    void setName(const std::string &name) override;
+
     const Type::Qualifier::Qualification &getQualifier() const;
     const std::vector<android::Declaration *>* getFieldDeclarations() const;
 
diff --git a/c2hal/Declaration.cpp b/c2hal/Declaration.cpp
index 8f88ea6..894965c 100644
--- a/c2hal/Declaration.cpp
+++ b/c2hal/Declaration.cpp
@@ -16,6 +16,7 @@
 
 #include "Declaration.h"
 
+#include <hidl-util/StringHelper.h>
 #include <regex>
 
 namespace android {
@@ -35,6 +36,16 @@
     mName = name;
 }
 
+void Declaration::forceCamelCase() {
+    mName = StringHelper::RTrim(mName, "_t");
+    mName = StringHelper::SnakeCaseToCamelCase(mName);
+}
+
+void Declaration::forcePascalCase() {
+    mName = StringHelper::RTrim(mName, "_t");
+    mName = StringHelper::SnakeCaseToPascalCase(mName);
+}
+
 const std::string& Declaration::getComment() const {
     return mComment;
 }
diff --git a/c2hal/Declaration.h b/c2hal/Declaration.h
index fff73ea..1c76441 100644
--- a/c2hal/Declaration.h
+++ b/c2hal/Declaration.h
@@ -32,7 +32,10 @@
     virtual ~Declaration();
 
     const std::string &getName() const;
-    void setName(const std::string &name);
+    virtual void setName(const std::string &name);
+
+    void forceCamelCase();
+    void forcePascalCase();
 
     const std::string& getComment() const;
     void setComment(const std::string &comment);
diff --git a/c2hal/Expression.cpp b/c2hal/Expression.cpp
index f9c8bb2..33798ed 100644
--- a/c2hal/Expression.cpp
+++ b/c2hal/Expression.cpp
@@ -108,7 +108,7 @@
 
     virtual Type getType(const AST &ast) {
         if (mType != Type::UNKOWN) {
-            return mType; 
+            return mType;
         }
 
         Define *define = ast.getDefinesScope().lookup(mValue);
diff --git a/c2hal/FunctionDeclaration.cpp b/c2hal/FunctionDeclaration.cpp
index 3129fee..12b7dc0 100644
--- a/c2hal/FunctionDeclaration.cpp
+++ b/c2hal/FunctionDeclaration.cpp
@@ -18,15 +18,19 @@
 #include "VarDeclaration.h"
 #include "Type.h"
 
+#include <hidl-util/StringHelper.h>
+
 namespace android {
 
 FunctionDeclaration::FunctionDeclaration(Type* type,
                   const std::string &name,
                   std::vector<Declaration *> *params)
-    : Declaration(name),
+    : Declaration(""),
       mType(type),
       mParams(params)
-    {}
+    {
+        setName(name);
+    }
 
 FunctionDeclaration::~FunctionDeclaration() {
     delete mType;
@@ -39,6 +43,10 @@
     delete mParams;
 }
 
+void FunctionDeclaration::setName(const std::string &name) {
+    Declaration::setName(name);
+    forceCamelCase();
+}
 
 const Type* FunctionDeclaration::getType() const {
     return mType;
@@ -51,7 +59,7 @@
 
     if (!getType()->isVoid()) {
         out << " generates ("
-            << getType()->decorateName(getName() + "_ret")
+            << getType()->decorateName(getName() + "Ret")
             << ")";
     }
 
diff --git a/c2hal/FunctionDeclaration.h b/c2hal/FunctionDeclaration.h
index 1791102..5506471 100644
--- a/c2hal/FunctionDeclaration.h
+++ b/c2hal/FunctionDeclaration.h
@@ -32,6 +32,8 @@
                   std::vector<Declaration *> *params);
     ~FunctionDeclaration();
 
+    void setName(const std::string &name) override;
+
     const Type * getType() const;
 
     static std::string type() { return "function"; }
diff --git a/c2hal/Type.cpp b/c2hal/Type.cpp
index 518625c..68156ed 100644
--- a/c2hal/Type.cpp
+++ b/c2hal/Type.cpp
@@ -17,6 +17,8 @@
 #include "Type.h"
 #include <sstream>
 
+#include <hidl-util/StringHelper.h>
+
 namespace android {
 
 Type::Type(std::vector<Qualifier*> *qualifiers)
@@ -98,7 +100,7 @@
     auto it = kCToHidlMap.find(cType);
 
     if (it == kCToHidlMap.end()) {
-        return cType;
+        return "";
     }
 
     return (*it).second;
@@ -128,7 +130,19 @@
                 break;
             }
             case Type::Qualifier::ID: {
-                ss << cToHidlType((*it)->id);
+                std::string id = (*it)->id;
+                std::string conversion = cToHidlType(id);
+                if (!conversion.empty()) {
+                    ss << conversion;
+                } else if (!StringHelper::StartsWith(id, "int") &&
+                           !StringHelper::StartsWith(id, "uint") &&
+                           !StringHelper::StartsWith(id, "size") &&
+                           id.find("_") != std::string::npos) {
+                    std::string baseName = StringHelper::RTrim(id, "_t");
+                    ss << StringHelper::SnakeCaseToPascalCase(baseName);
+                } else {
+                    ss << id;
+                }
                 break;
             }
             case Type::Qualifier::GENERICS: {
diff --git a/c2hal/TypeDef.cpp b/c2hal/TypeDef.cpp
index 529bf99..2799f26 100644
--- a/c2hal/TypeDef.cpp
+++ b/c2hal/TypeDef.cpp
@@ -20,7 +20,9 @@
 
 TypeDef::TypeDef(const std::string &name, Declaration* declaration)
     : Declaration(name), mDeclaration(declaration)
-    {}
+    {
+        mDeclaration->forcePascalCase();
+    }
 
 TypeDef::~TypeDef() {}
 
diff --git a/c2hal/VarDeclaration.cpp b/c2hal/VarDeclaration.cpp
index 6f5e710..7d6727f 100644
--- a/c2hal/VarDeclaration.cpp
+++ b/c2hal/VarDeclaration.cpp
@@ -19,14 +19,21 @@
 namespace android {
 
 VarDeclaration::VarDeclaration(Type *type, const std::string &name)
-    : Declaration(name),
+    : Declaration(""),
       mType(type)
-    {}
+    {
+        setName(name);
+    }
 
 VarDeclaration::~VarDeclaration() {
     delete mType;
 }
 
+void VarDeclaration::setName(const std::string &name) {
+    Declaration::setName(name);
+    forceCamelCase();
+}
+
 Type* VarDeclaration::getType() const {
     return mType;
 }
diff --git a/c2hal/VarDeclaration.h b/c2hal/VarDeclaration.h
index e8ac2b4..33f3e1b 100644
--- a/c2hal/VarDeclaration.h
+++ b/c2hal/VarDeclaration.h
@@ -26,6 +26,8 @@
     VarDeclaration(Type *type, const std::string &name);
     ~VarDeclaration();
 
+    void setName(const std::string &name) override;
+
     Type* getType() const;
 
     static std::string type() { return "var"; }
diff --git a/c2hal/test/test.h b/c2hal/test/test.h
index 2f96551..a4bee5d 100644
--- a/c2hal/test/test.h
+++ b/c2hal/test/test.h
@@ -74,6 +74,9 @@
 
 static void fun1() { }
 
+typedef int my_int_type;
+typedef my_int_type my_type_two;
+
 namespace MyNamespace {
     static void fun2() { }
 }
@@ -140,7 +143,7 @@
     const int       stride;
 
     /* framebuffer pixel format */
-    const int       format;
+    const int       format_type;
 
     /* resolution of the framebuffer's display panel in pixel per inch*/
     const float     xdpi;
diff --git a/utils/StringHelper.cpp b/utils/StringHelper.cpp
index 2a90423..4862ff5 100644
--- a/utils/StringHelper.cpp
+++ b/utils/StringHelper.cpp
@@ -48,6 +48,26 @@
     std::string word;
     std::string out;
 
+    bool first = true;
+
+    while (std::getline(ss, word, '_')) {
+        if (first) {
+            out += word;
+            first = false;
+        } else {
+            out += Capitalize(word);
+        }
+    }
+
+    return out;
+}
+
+// static
+std::string StringHelper::SnakeCaseToPascalCase(const std::string &in) {
+    std::istringstream ss(in);
+    std::string word;
+    std::string out;
+
     while (std::getline(ss, word, '_')) {
         out += Capitalize(word);
     }
@@ -56,6 +76,23 @@
 }
 
 // static
+bool StringHelper::StartsWith(const std::string &in, const std::string &prefix) {
+    return in.size() >= prefix.size() &&
+           in.substr(0, prefix.size()) == prefix;
+}
+
+// static
+std::string StringHelper::RTrim(const std::string &in, const std::string &end) {
+    if (in.size() >= end.size() &&
+        in.substr(in.size() - end.size()) == end) {
+
+        return in.substr(0, in.size() - end.size());
+    }
+
+    return in;
+}
+
+// static
 void StringHelper::SplitString(
         const std::string &s, char c, std::vector<std::string> *components) {
     components->clear();
diff --git a/utils/include/hidl-util/StringHelper.h b/utils/include/hidl-util/StringHelper.h
index 75bb651..9b61c39 100644
--- a/utils/include/hidl-util/StringHelper.h
+++ b/utils/include/hidl-util/StringHelper.h
@@ -29,6 +29,12 @@
     static std::string Upcase(const std::string &in);
     static std::string Capitalize(const std::string &in);
     static std::string SnakeCaseToCamelCase(const std::string &in);
+    static std::string SnakeCaseToPascalCase(const std::string &in);
+
+    static bool StartsWith(const std::string &in, const std::string &prefix);
+
+    /* removes end from the end of in if in ends with end */
+    static std::string RTrim(const std::string &in, const std::string &end);
 
     static void SplitString(
         const std::string &s,