diff --git a/lldb/source/API/SBModuleSpec.cpp b/lldb/source/API/SBModuleSpec.cpp
index 17c83ab..b82b822 100644
--- a/lldb/source/API/SBModuleSpec.cpp
+++ b/lldb/source/API/SBModuleSpec.cpp
@@ -18,213 +18,140 @@
 using namespace lldb;
 using namespace lldb_private;
 
+SBModuleSpec::SBModuleSpec() : m_opaque_ap(new lldb_private::ModuleSpec()) {}
 
-SBModuleSpec::SBModuleSpec () :
-    m_opaque_ap (new lldb_private::ModuleSpec())
-{
+SBModuleSpec::SBModuleSpec(const SBModuleSpec &rhs)
+    : m_opaque_ap(new lldb_private::ModuleSpec(*rhs.m_opaque_ap)) {}
+
+const SBModuleSpec &SBModuleSpec::operator=(const SBModuleSpec &rhs) {
+  if (this != &rhs)
+    *m_opaque_ap = *(rhs.m_opaque_ap);
+  return *this;
 }
 
-SBModuleSpec::SBModuleSpec(const SBModuleSpec &rhs) :
-    m_opaque_ap (new lldb_private::ModuleSpec(*rhs.m_opaque_ap))
-{
+SBModuleSpec::~SBModuleSpec() {}
+
+bool SBModuleSpec::IsValid() const { return m_opaque_ap->operator bool(); }
+
+void SBModuleSpec::Clear() { m_opaque_ap->Clear(); }
+
+SBFileSpec SBModuleSpec::GetFileSpec() {
+  SBFileSpec sb_spec(m_opaque_ap->GetFileSpec());
+  return sb_spec;
 }
 
-const SBModuleSpec &
-SBModuleSpec::operator = (const SBModuleSpec &rhs)
-{
-    if (this != &rhs)
-        *m_opaque_ap = *(rhs.m_opaque_ap);
-    return *this;
+void SBModuleSpec::SetFileSpec(const lldb::SBFileSpec &sb_spec) {
+  m_opaque_ap->GetFileSpec() = *sb_spec;
 }
 
-SBModuleSpec::~SBModuleSpec ()
-{
+lldb::SBFileSpec SBModuleSpec::GetPlatformFileSpec() {
+  return SBFileSpec(m_opaque_ap->GetPlatformFileSpec());
 }
 
-bool
-SBModuleSpec::IsValid () const
-{
-    return m_opaque_ap->operator bool();
+void SBModuleSpec::SetPlatformFileSpec(const lldb::SBFileSpec &sb_spec) {
+  m_opaque_ap->GetPlatformFileSpec() = *sb_spec;
 }
 
-void
-SBModuleSpec::Clear()
-{
-    m_opaque_ap->Clear();
+lldb::SBFileSpec SBModuleSpec::GetSymbolFileSpec() {
+  return SBFileSpec(m_opaque_ap->GetSymbolFileSpec());
 }
 
-SBFileSpec
-SBModuleSpec::GetFileSpec ()
-{
-    SBFileSpec sb_spec(m_opaque_ap->GetFileSpec());
-    return sb_spec;
+void SBModuleSpec::SetSymbolFileSpec(const lldb::SBFileSpec &sb_spec) {
+  m_opaque_ap->GetSymbolFileSpec() = *sb_spec;
 }
 
-void
-SBModuleSpec::SetFileSpec (const lldb::SBFileSpec &sb_spec)
-{
-    m_opaque_ap->GetFileSpec() = *sb_spec;
+const char *SBModuleSpec::GetObjectName() {
+  return m_opaque_ap->GetObjectName().GetCString();
 }
 
-lldb::SBFileSpec
-SBModuleSpec::GetPlatformFileSpec ()
-{
-    return SBFileSpec(m_opaque_ap->GetPlatformFileSpec());
+void SBModuleSpec::SetObjectName(const char *name) {
+  m_opaque_ap->GetObjectName().SetCString(name);
 }
 
-void
-SBModuleSpec::SetPlatformFileSpec (const lldb::SBFileSpec &sb_spec)
-{
-    m_opaque_ap->GetPlatformFileSpec() = *sb_spec;
+const char *SBModuleSpec::GetTriple() {
+  std::string triple(m_opaque_ap->GetArchitecture().GetTriple().str());
+  // Unique the string so we don't run into ownership issues since
+  // the const strings put the string into the string pool once and
+  // the strings never comes out
+  ConstString const_triple(triple.c_str());
+  return const_triple.GetCString();
 }
 
-lldb::SBFileSpec
-SBModuleSpec::GetSymbolFileSpec ()
-{
-    return SBFileSpec(m_opaque_ap->GetSymbolFileSpec());
+void SBModuleSpec::SetTriple(const char *triple) {
+  m_opaque_ap->GetArchitecture().SetTriple(triple);
 }
 
-void
-SBModuleSpec::SetSymbolFileSpec (const lldb::SBFileSpec &sb_spec)
-{
-    m_opaque_ap->GetSymbolFileSpec() = *sb_spec;
+const uint8_t *SBModuleSpec::GetUUIDBytes() {
+  return (const uint8_t *)m_opaque_ap->GetUUID().GetBytes();
 }
 
-const char *
-SBModuleSpec::GetObjectName ()
-{
-    return m_opaque_ap->GetObjectName().GetCString();
+size_t SBModuleSpec::GetUUIDLength() {
+  return m_opaque_ap->GetUUID().GetByteSize();
 }
 
-void
-SBModuleSpec::SetObjectName (const char *name)
-{
-    m_opaque_ap->GetObjectName().SetCString(name);
+bool SBModuleSpec::SetUUIDBytes(const uint8_t *uuid, size_t uuid_len) {
+  return m_opaque_ap->GetUUID().SetBytes(uuid, uuid_len);
 }
 
-const char *
-SBModuleSpec::GetTriple ()
-{
-    std::string triple (m_opaque_ap->GetArchitecture().GetTriple().str());
-    // Unique the string so we don't run into ownership issues since
-    // the const strings put the string into the string pool once and
-    // the strings never comes out
-    ConstString const_triple (triple.c_str());
-    return const_triple.GetCString();
+bool SBModuleSpec::GetDescription(lldb::SBStream &description) {
+  m_opaque_ap->Dump(description.ref());
+  return true;
 }
 
-void
-SBModuleSpec::SetTriple (const char *triple)
-{
-    m_opaque_ap->GetArchitecture().SetTriple(triple);
+SBModuleSpecList::SBModuleSpecList() : m_opaque_ap(new ModuleSpecList()) {}
+
+SBModuleSpecList::SBModuleSpecList(const SBModuleSpecList &rhs)
+    : m_opaque_ap(new ModuleSpecList(*rhs.m_opaque_ap)) {}
+
+SBModuleSpecList &SBModuleSpecList::operator=(const SBModuleSpecList &rhs) {
+  if (this != &rhs)
+    *m_opaque_ap = *rhs.m_opaque_ap;
+  return *this;
 }
 
-const uint8_t *
-SBModuleSpec::GetUUIDBytes ()
-{
-    return (const uint8_t *)m_opaque_ap->GetUUID().GetBytes();
+SBModuleSpecList::~SBModuleSpecList() {}
+
+SBModuleSpecList SBModuleSpecList::GetModuleSpecifications(const char *path) {
+  SBModuleSpecList specs;
+  FileSpec file_spec(path, true);
+  Host::ResolveExecutableInBundle(file_spec);
+  ObjectFile::GetModuleSpecifications(file_spec, 0, 0, *specs.m_opaque_ap);
+  return specs;
 }
 
-size_t
-SBModuleSpec::GetUUIDLength ()
-{
-    return m_opaque_ap->GetUUID().GetByteSize();
+void SBModuleSpecList::Append(const SBModuleSpec &spec) {
+  m_opaque_ap->Append(*spec.m_opaque_ap);
 }
 
-bool
-SBModuleSpec::SetUUIDBytes (const uint8_t *uuid, size_t uuid_len)
-{
-    return m_opaque_ap->GetUUID().SetBytes(uuid, uuid_len);
+void SBModuleSpecList::Append(const SBModuleSpecList &spec_list) {
+  m_opaque_ap->Append(*spec_list.m_opaque_ap);
 }
 
-bool
-SBModuleSpec::GetDescription (lldb::SBStream &description)
-{
-    m_opaque_ap->Dump (description.ref());
-    return true;
-}
+size_t SBModuleSpecList::GetSize() { return m_opaque_ap->GetSize(); }
 
-SBModuleSpecList::SBModuleSpecList() :
-    m_opaque_ap(new ModuleSpecList())
-{
-    
-}
-
-SBModuleSpecList::SBModuleSpecList (const SBModuleSpecList &rhs) :
-    m_opaque_ap(new ModuleSpecList(*rhs.m_opaque_ap))
-{
-    
-}
-
-SBModuleSpecList &
-SBModuleSpecList::operator = (const SBModuleSpecList &rhs)
-{
-    if (this != &rhs)
-        *m_opaque_ap = *rhs.m_opaque_ap;
-    return *this;
-}
-
-SBModuleSpecList::~SBModuleSpecList()
-{
-    
-}
-
-SBModuleSpecList
-SBModuleSpecList::GetModuleSpecifications (const char *path)
-{
-    SBModuleSpecList specs;
-    FileSpec file_spec(path, true);
-    Host::ResolveExecutableInBundle(file_spec);
-    ObjectFile::GetModuleSpecifications(file_spec, 0, 0, *specs.m_opaque_ap);
-    return specs;
-}
-
-void
-SBModuleSpecList::Append (const SBModuleSpec &spec)
-{
-    m_opaque_ap->Append (*spec.m_opaque_ap);
-}
-
-void
-SBModuleSpecList::Append (const SBModuleSpecList &spec_list)
-{
-    m_opaque_ap->Append (*spec_list.m_opaque_ap);
-}
-
-size_t
-SBModuleSpecList::GetSize()
-{
-    return m_opaque_ap->GetSize();
+SBModuleSpec SBModuleSpecList::GetSpecAtIndex(size_t i) {
+  SBModuleSpec sb_module_spec;
+  m_opaque_ap->GetModuleSpecAtIndex(i, *sb_module_spec.m_opaque_ap);
+  return sb_module_spec;
 }
 
 SBModuleSpec
-SBModuleSpecList::GetSpecAtIndex (size_t i)
-{
-    SBModuleSpec sb_module_spec;
-    m_opaque_ap->GetModuleSpecAtIndex(i, *sb_module_spec.m_opaque_ap);
-    return sb_module_spec;
-}
-
-SBModuleSpec
-SBModuleSpecList::FindFirstMatchingSpec (const SBModuleSpec &match_spec)
-{
-    SBModuleSpec sb_module_spec;
-    m_opaque_ap->FindMatchingModuleSpec(*match_spec.m_opaque_ap, *sb_module_spec.m_opaque_ap);
-    return sb_module_spec;
+SBModuleSpecList::FindFirstMatchingSpec(const SBModuleSpec &match_spec) {
+  SBModuleSpec sb_module_spec;
+  m_opaque_ap->FindMatchingModuleSpec(*match_spec.m_opaque_ap,
+                                      *sb_module_spec.m_opaque_ap);
+  return sb_module_spec;
 }
 
 SBModuleSpecList
-SBModuleSpecList::FindMatchingSpecs (const SBModuleSpec &match_spec)
-{
-    SBModuleSpecList specs;
-    m_opaque_ap->FindMatchingModuleSpecs(*match_spec.m_opaque_ap, *specs.m_opaque_ap);
-    return specs;
-    
+SBModuleSpecList::FindMatchingSpecs(const SBModuleSpec &match_spec) {
+  SBModuleSpecList specs;
+  m_opaque_ap->FindMatchingModuleSpecs(*match_spec.m_opaque_ap,
+                                       *specs.m_opaque_ap);
+  return specs;
 }
 
-bool
-SBModuleSpecList::GetDescription (lldb::SBStream &description)
-{
-    m_opaque_ap->Dump (description.ref());
-    return true;
+bool SBModuleSpecList::GetDescription(lldb::SBStream &description) {
+  m_opaque_ap->Dump(description.ref());
+  return true;
 }
