Merge "Removed call to overloaded function in hidl_test."
diff --git a/Interface.cpp b/Interface.cpp
index 4d22c5c..5951f87 100644
--- a/Interface.cpp
+++ b/Interface.cpp
@@ -19,6 +19,7 @@
#include "Annotation.h"
#include "Method.h"
+#include <android-base/logging.h>
#include <hidl-util/Formatter.h>
#include <iostream>
@@ -30,7 +31,12 @@
mIsJavaCompatibleInProgress(false) {
}
-void Interface::addMethod(Method *method) {
+bool Interface::addMethod(Method *method) {
+ if (lookupMethod(method->name()) != nullptr) {
+ LOG(ERROR) << "Redefinition of method " << method->name();
+ return false;
+ }
+
/* It is very important that these values NEVER change. These values
* must remain unchanged over the lifetime of android. This is
* because the framework on a device will be updated independently of
@@ -41,17 +47,16 @@
*/
size_t serial = 1; // hardware::IBinder::FIRST_CALL_TRANSACTION;
- serial += methods().size();
-
- const Interface *ancestor = mSuperType;
+ const Interface *ancestor = this;
while (ancestor != nullptr) {
serial += ancestor->methods().size();
ancestor = ancestor->superType();
}
method->setSerialId(serial);
-
mMethods.push_back(method);
+
+ return true;
}
const Interface *Interface::superType() const {
@@ -70,6 +75,20 @@
return mMethods;
}
+Method *Interface::lookupMethod(std::string name) const {
+ const Interface *ancestor = this;
+ while (ancestor != nullptr) {
+ for (const auto &method : mMethods) {
+ if (method->name() == name) {
+ return method;
+ }
+ }
+ ancestor = ancestor->superType();
+ }
+
+ return nullptr;
+}
+
std::string Interface::getBaseName() const {
return fqName().getInterfaceBaseName();
}
diff --git a/Interface.h b/Interface.h
index 1c793e7..7f7edc7 100644
--- a/Interface.h
+++ b/Interface.h
@@ -27,7 +27,7 @@
struct Interface : public Scope {
Interface(const char *localName, Interface *super);
- void addMethod(Method *method);
+ bool addMethod(Method *method);
bool isInterface() const override;
bool isBinder() const override;
@@ -35,6 +35,7 @@
const Interface *superType() const;
const std::vector<Method *> &methods() const;
+ Method *lookupMethod(std::string name) const;
std::string getBaseName() const;
diff --git a/hidl-gen_y.yy b/hidl-gen_y.yy
index b79f195..3e1fb98 100644
--- a/hidl-gen_y.yy
+++ b/hidl-gen_y.yy
@@ -341,7 +341,12 @@
| interface_declarations method_declaration
{
Interface *iface = static_cast<Interface *>(ast->scope());
- iface->addMethod($2);
+ if (!iface->addMethod($2)) {
+ std::cerr << "ERROR: Unable to add method '" << $2->name()
+ << "' at " << @2 << "\n";
+
+ YYERROR;
+ }
}
;