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,