Fix clang-tidy performance warnings in system/tools/hidl.

* Use const reference parameter type to avoid unnecessary copy.
* Use more efficient overloaded string methods.

Bug: 30407689
Bug: 30411878
Test: build with WITH_TIDY=1
Change-Id: Ib90a35106eb59d05878b75504b87ef324211cc6b
diff --git a/AST.h b/AST.h
index dc39c0a..d48fba4 100644
--- a/AST.h
+++ b/AST.h
@@ -188,7 +188,9 @@
     void generateTemplatizationLink(Formatter& out) const;
     void generateCppTag(Formatter& out, const std::string& tag) const;
 
-    status_t generateMethods(Formatter &out, MethodGenerator gen, bool includeParents = true) const;
+    status_t generateMethods(Formatter &out,
+                             const MethodGenerator &gen,
+                             bool includeParents = true) const;
     status_t generateStubImplMethod(Formatter &out,
                                     const std::string &className,
                                     const Method *method) const;
diff --git a/CompoundType.cpp b/CompoundType.cpp
index 146074e..c8d56b0 100644
--- a/CompoundType.cpp
+++ b/CompoundType.cpp
@@ -491,8 +491,7 @@
     return OK;
 }
 
-status_t CompoundType::emitTypeDefinitions(
-        Formatter &out, const std::string prefix) const {
+status_t CompoundType::emitTypeDefinitions(Formatter& out, const std::string& prefix) const {
     std::string space = prefix.empty() ? "" : (prefix + "::");
     status_t err = Scope::emitTypeDefinitions(out, space + localName());
 
@@ -871,8 +870,8 @@
     out << "}\n\n";
 }
 
-void CompoundType::emitResolveReferenceDef(
-        Formatter &out, const std::string prefix, bool isReader) const {
+void CompoundType::emitResolveReferenceDef(Formatter& out, const std::string& prefix,
+                                           bool isReader) const {
     out << "::android::status_t ";
     const std::string space(prefix.empty() ? "" : (prefix + "::"));
 
diff --git a/CompoundType.h b/CompoundType.h
index da986a1..80c7435 100644
--- a/CompoundType.h
+++ b/CompoundType.h
@@ -115,8 +115,7 @@
     status_t emitGlobalTypeDeclarations(Formatter &out) const override;
     status_t emitGlobalHwDeclarations(Formatter &out) const override;
 
-    status_t emitTypeDefinitions(
-            Formatter &out, const std::string prefix) const override;
+    status_t emitTypeDefinitions(Formatter& out, const std::string& prefix) const override;
 
     status_t emitJavaTypeDeclarations(
             Formatter &out, bool atTopLevel) const override;
@@ -139,8 +138,7 @@
 
     void emitStructReaderWriter(
             Formatter &out, const std::string &prefix, bool isReader) const;
-    void emitResolveReferenceDef(
-        Formatter &out, const std::string prefix, bool isReader) const;
+    void emitResolveReferenceDef(Formatter& out, const std::string& prefix, bool isReader) const;
 
     DISALLOW_COPY_AND_ASSIGN(CompoundType);
 };
diff --git a/Coordinator.cpp b/Coordinator.cpp
index 1f76410..f37c8a9 100644
--- a/Coordinator.cpp
+++ b/Coordinator.cpp
@@ -585,7 +585,7 @@
 
     size_t start = 1;  // Ignore leading '/'
     size_t slashPos;
-    while ((slashPos = path.find("/", start)) != std::string::npos) {
+    while ((slashPos = path.find('/', start)) != std::string::npos) {
         std::string partial = path.substr(0, slashPos);
 
         struct stat st;
diff --git a/EnumType.cpp b/EnumType.cpp
index eaadc23..64c50f9 100644
--- a/EnumType.cpp
+++ b/EnumType.cpp
@@ -286,8 +286,7 @@
     return OK;
 }
 
-status_t EnumType::emitTypeDefinitions(Formatter &out, const std::string /* prefix */) const {
-
+status_t EnumType::emitTypeDefinitions(Formatter& out, const std::string& /* prefix */) const {
     const ScalarType *scalarType = mStorageType->resolveToScalarType();
     CHECK(scalarType != NULL);
 
diff --git a/EnumType.h b/EnumType.h
index 27f648b..518b5ea 100644
--- a/EnumType.h
+++ b/EnumType.h
@@ -79,7 +79,7 @@
 
     status_t emitTypeDeclarations(Formatter &out) const override;
     status_t emitGlobalTypeDeclarations(Formatter &out) const override;
-    status_t emitTypeDefinitions(Formatter &out, const std::string prefix) const override;
+    status_t emitTypeDefinitions(Formatter& out, const std::string& prefix) const override;
 
     status_t emitJavaTypeDeclarations(
             Formatter &out, bool atTopLevel) const override;
diff --git a/Interface.cpp b/Interface.cpp
index db5d682..208a83d 100644
--- a/Interface.cpp
+++ b/Interface.cpp
@@ -576,7 +576,7 @@
     return isIBase() ? std::vector<InterfaceAndMethod>() : superType()->allMethodsFromRoot();
 }
 
-Method *Interface::lookupMethod(std::string name) const {
+Method *Interface::lookupMethod(const std::string& name) const {
     for (const auto &tuple : allMethodsFromRoot()) {
         Method *method = tuple.method();
         if (method->name() == name) {
@@ -736,9 +736,7 @@
     return OK;
 }
 
-
-status_t Interface::emitTypeDefinitions(
-        Formatter &out, const std::string prefix) const {
+status_t Interface::emitTypeDefinitions(Formatter& out, const std::string& prefix) const {
     std::string space = prefix.empty() ? "" : (prefix + "::");
     status_t err = Scope::emitTypeDefinitions(out, space + localName());
     if (err != OK) {
diff --git a/Interface.h b/Interface.h
index 7489735..a8b562d 100644
--- a/Interface.h
+++ b/Interface.h
@@ -43,7 +43,7 @@
 
     const Interface* superType() const;
 
-    Method *lookupMethod(std::string name) const;
+    Method* lookupMethod(const std::string& name) const;
     // Super type chain to root type.
     // First element is superType().
     std::vector<const Interface *> superTypeChain() const;
@@ -96,8 +96,7 @@
             ErrorMode mode) const override;
 
     status_t emitGlobalTypeDeclarations(Formatter &out) const override;
-    status_t emitTypeDefinitions(
-            Formatter &out, const std::string prefix) const override;
+    status_t emitTypeDefinitions(Formatter& out, const std::string& prefix) const override;
 
     void emitJavaReaderWriter(
             Formatter &out,
diff --git a/Scope.cpp b/Scope.cpp
index 9223b78..f9a844c 100644
--- a/Scope.cpp
+++ b/Scope.cpp
@@ -114,7 +114,7 @@
     mAnnotations = *annotations;
 }
 
-status_t Scope::forEachType(std::function<status_t(Type *)> func) const {
+status_t Scope::forEachType(const std::function<status_t(Type *)> &func) const {
     for (size_t i = 0; i < mTypes.size(); ++i) {
         status_t err = func(mTypes[i]);
 
@@ -151,8 +151,7 @@
     });
 }
 
-status_t Scope::emitTypeDefinitions(
-        Formatter &out, const std::string prefix) const {
+status_t Scope::emitTypeDefinitions(Formatter& out, const std::string& prefix) const {
     return forEachType([&](Type *type) {
         return type->emitTypeDefinitions(out, prefix);
     });
diff --git a/Scope.h b/Scope.h
index 14f51f9..63bfbfd 100644
--- a/Scope.h
+++ b/Scope.h
@@ -61,8 +61,7 @@
     status_t emitJavaTypeDeclarations(
             Formatter &out, bool atTopLevel) const override;
 
-    status_t emitTypeDefinitions(
-            Formatter &out, const std::string prefix) const override;
+    status_t emitTypeDefinitions(Formatter& out, const std::string& prefix) const override;
 
     const std::vector<NamedType *> &getSubTypes() const;
 
@@ -79,7 +78,7 @@
     std::map<std::string, size_t> mTypeIndexByName;
     std::vector<Annotation*> mAnnotations;
 
-    status_t forEachType(std::function<status_t(Type *)> func) const;
+    status_t forEachType(const std::function<status_t(Type*)>& func) const;
 
     DISALLOW_COPY_AND_ASSIGN(Scope);
 };
diff --git a/Type.cpp b/Type.cpp
index 3d32180..d678cd1 100644
--- a/Type.cpp
+++ b/Type.cpp
@@ -371,8 +371,7 @@
     return OK;
 }
 
-status_t Type::emitTypeDefinitions(
-        Formatter &, const std::string) const {
+status_t Type::emitTypeDefinitions(Formatter&, const std::string&) const {
     return OK;
 }
 
diff --git a/Type.h b/Type.h
index a489e5c..bb53573 100644
--- a/Type.h
+++ b/Type.h
@@ -187,8 +187,7 @@
     // at global scope for transport, e.g. read/writeEmbeddedTo/FromParcel
     virtual status_t emitGlobalHwDeclarations(Formatter &out) const;
 
-    virtual status_t emitTypeDefinitions(
-            Formatter &out, const std::string prefix) const;
+    virtual status_t emitTypeDefinitions(Formatter& out, const std::string& prefix) const;
 
     virtual status_t emitJavaTypeDeclarations(
             Formatter &out, bool atTopLevel) const;
diff --git a/c2hal/AST.cpp b/c2hal/AST.cpp
index e2ae13c..e2eae91 100644
--- a/c2hal/AST.cpp
+++ b/c2hal/AST.cpp
@@ -317,7 +317,7 @@
 
     size_t start = 1;  // Ignore leading '/'
     size_t slashPos;
-    while ((slashPos = path.find("/", start)) != std::string::npos) {
+    while ((slashPos = path.find('/', start)) != std::string::npos) {
         std::string partial = path.substr(0, slashPos);
 
         struct stat st;
diff --git a/c2hal/Expression.cpp b/c2hal/Expression.cpp
index 7863b15..1b96d2a 100644
--- a/c2hal/Expression.cpp
+++ b/c2hal/Expression.cpp
@@ -29,7 +29,7 @@
 static const std::regex RE_S64("[^ul](l|ll)$");
 static const std::regex RE_U64("[^ul](ul|ull)$");
 
-Expression::Type Expression::integralType(std::string integer) {
+Expression::Type Expression::integralType(const std::string& integer) {
     if (std::regex_search(integer, RE_S32)) {
         return Type::S32;
     }
diff --git a/c2hal/Expression.h b/c2hal/Expression.h
index 9f04837..5449e55 100644
--- a/c2hal/Expression.h
+++ b/c2hal/Expression.h
@@ -63,7 +63,7 @@
         }
     }
 
-    static Type integralType(std::string integer);
+    static Type integralType(const std::string& integer);
     static Type coalesceTypes(Type lhs, Type rhs);
 
     static Expression *parenthesize(Expression *inner);
diff --git a/generateCpp.cpp b/generateCpp.cpp
index f2147b3..e47c210 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -784,7 +784,9 @@
     return OK;
 }
 
-status_t AST::generateMethods(Formatter &out, MethodGenerator gen, bool includeParent) const {
+status_t AST::generateMethods(Formatter& out,
+                              const MethodGenerator& gen,
+                              bool includeParent) const {
     const Interface* iface = mRootScope.getInterface();
 
     const Interface *prevIterface = nullptr;
diff --git a/main.cpp b/main.cpp
index af53171..0ebc966 100644
--- a/main.cpp
+++ b/main.cpp
@@ -235,7 +235,7 @@
         AST *ast = coordinator->parse(fqName);
         CHECK(ast != nullptr);
         const std::set<FQName>& refs = ast->getImportedNames();
-        for (auto depFQName : refs) {
+        for (const auto& depFQName : refs) {
             // If the package of depFQName is the same as this fqName's package,
             // then add it explicitly as a .hal dependency within the same
             // package.
@@ -657,17 +657,16 @@
 }
 
 static void generateAndroidBpGenSection(
-        Formatter &out,
-        const FQName &packageFQName,
-        const char *hidl_gen,
-        Coordinator *coordinator,
-        const std::string &halFilegroupName,
-        const std::string &genName,
-        const char *language,
-        const std::vector<FQName> &packageInterfaces,
-        const std::set<FQName> &importedPackages,
-        const std::function<void(Formatter&, const FQName)> outputFn) {
-
+    Formatter& out,
+    const FQName& packageFQName,
+    const char* hidl_gen,
+    Coordinator* coordinator,
+    const std::string& halFilegroupName,
+    const std::string& genName,
+    const char* language,
+    const std::vector<FQName>& packageInterfaces,
+    const std::set<FQName>& importedPackages,
+    const std::function<void(Formatter&, const FQName)>& outputFn) {
     out << "genrule {\n";
     out.indent();
     out << "name: \"" << genName << "\",\n"
diff --git a/utils/Formatter.cpp b/utils/Formatter.cpp
index a4f2047..f994650 100644
--- a/utils/Formatter.cpp
+++ b/utils/Formatter.cpp
@@ -42,18 +42,18 @@
     mIndentDepth -= level;
 }
 
-Formatter &Formatter::indent(size_t level, std::function<void(void)> func) {
+Formatter& Formatter::indent(size_t level, const std::function<void(void)>& func) {
     this->indent(level);
     func();
     this->unindent(level);
     return *this;
 }
 
-Formatter &Formatter::indent(std::function<void(void)> func) {
+Formatter& Formatter::indent(const std::function<void(void)>& func) {
     return this->indent(1, func);
 }
 
-Formatter &Formatter::block(std::function<void(void)> func) {
+Formatter& Formatter::block(const std::function<void(void)>& func) {
     (*this) << "{\n";
     this->indent(func);
     return (*this) << "}";
@@ -71,42 +71,42 @@
     return (*this) << "\n";
 }
 
-Formatter &Formatter::sIf(const std::string &cond, std::function<void(void)> block) {
+Formatter& Formatter::sIf(const std::string& cond, const std::function<void(void)>& block) {
     (*this) << "if (" << cond << ") ";
     return this->block(block);
 }
 
-Formatter &Formatter::sElseIf(const std::string &cond, std::function<void(void)> block) {
+Formatter& Formatter::sElseIf(const std::string& cond, const std::function<void(void)>& block) {
     (*this) << " else if (" << cond << ") ";
     return this->block(block);
 }
 
-Formatter &Formatter::sElse(std::function<void(void)> block) {
+Formatter& Formatter::sElse(const std::function<void(void)>& block) {
     (*this) << " else ";
     return this->block(block);
 }
 
-Formatter &Formatter::sFor(const std::string &stmts, std::function<void(void)> block) {
+Formatter& Formatter::sFor(const std::string& stmts, const std::function<void(void)>& block) {
     (*this) << "for (" << stmts << ") ";
     return this->block(block);
 }
 
-Formatter &Formatter::sTry(std::function<void(void)> block) {
+Formatter& Formatter::sTry(const std::function<void(void)>& block) {
     (*this) << "try ";
     return this->block(block);
 }
 
-Formatter &Formatter::sCatch(const std::string &exception, std::function<void(void)> block) {
+Formatter& Formatter::sCatch(const std::string& exception, const std::function<void(void)>& block) {
     (*this) << " catch (" << exception << ") ";
     return this->block(block);
 }
 
-Formatter &Formatter::sFinally(std::function<void(void)> block) {
+Formatter& Formatter::sFinally(const std::function<void(void)>& block) {
     (*this) << " finally ";
     return this->block(block);
 }
 
-Formatter &Formatter::sWhile(const std::string &cond, std::function<void(void)> block) {
+Formatter& Formatter::sWhile(const std::string& cond, const std::function<void(void)>& block) {
     (*this) << "while (" << cond << ") ";
     return this->block(block);
 }
@@ -115,7 +115,7 @@
     const size_t len = out.length();
     size_t start = 0;
     while (start < len) {
-        size_t pos = out.find("\n", start);
+        size_t pos = out.find('\n', start);
 
         if (pos == std::string::npos) {
             if (mAtStartOfLine) {
diff --git a/utils/include/hidl-util/Formatter.h b/utils/include/hidl-util/Formatter.h
index bb4288b..2f7c02d 100644
--- a/utils/include/hidl-util/Formatter.h
+++ b/utils/include/hidl-util/Formatter.h
@@ -42,13 +42,13 @@
     // out.indent(2, [&] {
     //     out << "Meow\n";
     // });
-    Formatter &indent(size_t level, std::function<void(void)> func);
+    Formatter& indent(size_t level, const std::function<void(void)>& func);
 
     // Note that The last \n after the last line is NOT added automatically.
     // out.indent([&] {
     //     out << "Meow\n";
     // });
-    Formatter &indent(std::function<void(void)> func);
+    Formatter& indent(const std::function<void(void)>& func);
 
     // A block inside braces.
     // * No space will be added before the opening brace.
@@ -62,7 +62,7 @@
     // out << "{\n"
     //     << "one();\ntwo();\n" // func()
     //     << "}";
-    Formatter &block(std::function<void(void)> func);
+    Formatter& block(const std::function<void(void)>& func);
 
     // A synonym to (*this) << "\n";
     Formatter &endl();
@@ -75,14 +75,14 @@
     //     out << "logFatal();\n";
     // }).endl();
     // note that there will be a space before the "else"-s.
-    Formatter &sIf(const std::string &cond, std::function<void(void)> block);
-    Formatter &sElseIf(const std::string &cond, std::function<void(void)> block);
-    Formatter &sElse(std::function<void(void)> block);
+    Formatter& sIf(const std::string& cond, const std::function<void(void)>& block);
+    Formatter& sElseIf(const std::string& cond, const std::function<void(void)>& block);
+    Formatter& sElse(const std::function<void(void)>& block);
 
     // out.sFor("int i = 0; i < 10; i++", [&] {
     //     out << "printf(\"%d\", i);\n";
     // }).endl();
-    Formatter &sFor(const std::string &stmts, std::function<void(void)> block);
+    Formatter& sFor(const std::string& stmts, const std::function<void(void)>& block);
 
     // out.sTry([&] {
     //     out << "throw RemoteException();\n"
@@ -92,21 +92,22 @@
     //     // cleanup
     // }).endl();
     // note that there will be a space before the "catch"-s.
-    Formatter &sTry(std::function<void(void)> block);
-    Formatter &sCatch(const std::string &exception, std::function<void(void)> block);
-    Formatter &sFinally(std::function<void(void)> block);
+    Formatter& sTry(const std::function<void(void)>& block);
+    Formatter& sCatch(const std::string& exception, const std::function<void(void)>& block);
+    Formatter& sFinally(const std::function<void(void)>& block);
 
     // out.sWhile("z < 10", [&] {
     //     out << "z++;\n";
     // }).endl();
-    Formatter &sWhile(const std::string &cond, std::function<void(void)> block);
+    Formatter& sWhile(const std::string& cond, const std::function<void(void)>& block);
 
     // out.join(v.begin(), v.end(), ",", [&](const auto &e) {
     //     out << toString(e);
     // });
-    template<typename I>
-    Formatter &join(const I begin, const I end, const std::string &separator,
-            std::function<void(const typename std::iterator_traits<I>::value_type &)> func);
+    template <typename I>
+    Formatter& join(
+        const I begin, const I end, const std::string& separator,
+        const std::function<void(const typename std::iterator_traits<I>::value_type&)>& func);
 
     Formatter &operator<<(const std::string &out);
 
@@ -150,9 +151,10 @@
     DISALLOW_COPY_AND_ASSIGN(Formatter);
 };
 
-template<typename I>
-Formatter &Formatter::join(const I begin, const I end, const std::string &separator,
-        std::function<void(const typename std::iterator_traits<I>::value_type &)> func) {
+template <typename I>
+Formatter& Formatter::join(
+    const I begin, const I end, const std::string& separator,
+    const std::function<void(const typename std::iterator_traits<I>::value_type&)>& func) {
     for (I iter = begin; iter != end; ++iter) {
         if (iter != begin) {
             (*this) << separator;