Merge "Better indent methods to Formatter."
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;
+          }
       }
     ;
 
diff --git a/main.cpp b/main.cpp
index 7a06404..cef969e 100644
--- a/main.cpp
+++ b/main.cpp
@@ -665,6 +665,15 @@
 
     out << "],\n";
     out.unindent();
+
+    out << "export_shared_lib_headers: [\n";
+    out.indent();
+    out << "\"libhidl\",\n"
+        << "\"libhwbinder\",\n"
+        << "\"libutils\",\n"
+        << "],\n";
+    out.unindent();
+
     out << "}\n";
 
     return OK;
diff --git a/test/main.cpp b/test/main.cpp
index 6063bef..18c6bac 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -414,13 +414,6 @@
     EXPECT_EQ(true, true);
 }
 
-TEST_F(HidlTest, FooDoThisIntTest) {
-    ALOGI("CLIENT call doThis (int).");
-    EXPECT_OK(foo->doThis(42u));
-    ALOGI("CLIENT doThis (int) returned.");
-    EXPECT_EQ(true, true);
-}
-
 TEST_F(HidlTest, FooDoThatAndReturnSomethingTest) {
     ALOGI("CLIENT call doThatAndReturnSomething.");
     int32_t result = foo->doThatAndReturnSomething(2.0f);