diff --git a/lldb/source/Symbol/ClangExternalASTSourceCallbacks.cpp b/lldb/source/Symbol/ClangExternalASTSourceCallbacks.cpp
index 6c804f4..e39baea 100644
--- a/lldb/source/Symbol/ClangExternalASTSourceCallbacks.cpp
+++ b/lldb/source/Symbol/ClangExternalASTSourceCallbacks.cpp
@@ -13,7 +13,7 @@
 // C++ Includes
 // Other libraries and framework includes
 
-// Clang headers like to use NDEBUG inside of them to enable/disable debug 
+// Clang headers like to use NDEBUG inside of them to enable/disable debug
 // related features using "#ifndef NDEBUG" preprocessor blocks to do one thing
 // or another. This is bad because it means that if clang was built in release
 // mode, it assumes that you are building in release mode which is not always
@@ -46,131 +46,145 @@
 using namespace clang;
 using namespace lldb_private;
 
-bool
-ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName 
-(
+bool ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(
     const clang::DeclContext *decl_ctx,
-    clang::DeclarationName clang_decl_name
-)
-{
-    if (m_callback_find_by_name)
-    {
-        llvm::SmallVector <clang::NamedDecl *, 3> results;
-        
-        m_callback_find_by_name (m_callback_baton, decl_ctx, clang_decl_name, &results);
-        
-        SetExternalVisibleDeclsForName(decl_ctx, clang_decl_name, results);
-        
-        return (results.size() != 0);
+    clang::DeclarationName clang_decl_name) {
+  if (m_callback_find_by_name) {
+    llvm::SmallVector<clang::NamedDecl *, 3> results;
+
+    m_callback_find_by_name(m_callback_baton, decl_ctx, clang_decl_name,
+                            &results);
+
+    SetExternalVisibleDeclsForName(decl_ctx, clang_decl_name, results);
+
+    return (results.size() != 0);
+  }
+
+  std::string decl_name(clang_decl_name.getAsString());
+
+  switch (clang_decl_name.getNameKind()) {
+  // Normal identifiers.
+  case clang::DeclarationName::Identifier:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"Identifier\", name = \"%s\")\n", decl_ctx,
+    // decl_name.c_str());
+    if (clang_decl_name.getAsIdentifierInfo()->getBuiltinID() != 0) {
+      SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+      return false;
     }
-        
-    std::string decl_name (clang_decl_name.getAsString());
+    break;
 
-    switch (clang_decl_name.getNameKind()) {
-    // Normal identifiers.
-    case clang::DeclarationName::Identifier:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"Identifier\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        if (clang_decl_name.getAsIdentifierInfo()->getBuiltinID() != 0)
-        {
-            SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-            return false;
-        }
-        break;
-
-    case clang::DeclarationName::ObjCZeroArgSelector:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCZeroArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-
-    case clang::DeclarationName::ObjCOneArgSelector:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCOneArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-
-    case clang::DeclarationName::ObjCMultiArgSelector:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCMultiArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-
-    case clang::DeclarationName::CXXConstructorName:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXConstructorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-
-
-    case clang::DeclarationName::CXXDestructorName:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXDestructorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-
-    case clang::DeclarationName::CXXConversionFunctionName:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXConversionFunctionName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-
-    case clang::DeclarationName::CXXOperatorName:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXOperatorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-
-    case clang::DeclarationName::CXXLiteralOperatorName:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXLiteralOperatorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-
-    case clang::DeclarationName::CXXUsingDirective:
-        //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXUsingDirective\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
-        SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
-        return false;
-    }
-
+  case clang::DeclarationName::ObjCZeroArgSelector:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"ObjCZeroArgSelector\", name = \"%s\")\n",
+    // decl_ctx, decl_name.c_str());
     SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
     return false;
+
+  case clang::DeclarationName::ObjCOneArgSelector:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"ObjCOneArgSelector\", name = \"%s\")\n",
+    // decl_ctx, decl_name.c_str());
+    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+    return false;
+
+  case clang::DeclarationName::ObjCMultiArgSelector:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"ObjCMultiArgSelector\", name = \"%s\")\n",
+    // decl_ctx, decl_name.c_str());
+    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+    return false;
+
+  case clang::DeclarationName::CXXConstructorName:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"CXXConstructorName\", name = \"%s\")\n",
+    // decl_ctx, decl_name.c_str());
+    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+    return false;
+
+  case clang::DeclarationName::CXXDestructorName:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"CXXDestructorName\", name = \"%s\")\n",
+    // decl_ctx, decl_name.c_str());
+    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+    return false;
+
+  case clang::DeclarationName::CXXConversionFunctionName:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"CXXConversionFunctionName\", name =
+    // \"%s\")\n", decl_ctx, decl_name.c_str());
+    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+    return false;
+
+  case clang::DeclarationName::CXXOperatorName:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"CXXOperatorName\", name = \"%s\")\n",
+    // decl_ctx, decl_name.c_str());
+    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+    return false;
+
+  case clang::DeclarationName::CXXLiteralOperatorName:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"CXXLiteralOperatorName\", name = \"%s\")\n",
+    // decl_ctx, decl_name.c_str());
+    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+    return false;
+
+  case clang::DeclarationName::CXXUsingDirective:
+    // printf
+    // ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx
+    // = %p, decl_name = { kind = \"CXXUsingDirective\", name = \"%s\")\n",
+    // decl_ctx, decl_name.c_str());
+    SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+    return false;
+  }
+
+  SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
+  return false;
 }
 
-void
-ClangExternalASTSourceCallbacks::CompleteType (TagDecl *tag_decl)
-{
-    if (m_callback_tag_decl)
-        m_callback_tag_decl (m_callback_baton, tag_decl);
+void ClangExternalASTSourceCallbacks::CompleteType(TagDecl *tag_decl) {
+  if (m_callback_tag_decl)
+    m_callback_tag_decl(m_callback_baton, tag_decl);
 }
 
-void
-ClangExternalASTSourceCallbacks::CompleteType (ObjCInterfaceDecl *objc_decl)
-{
-    if (m_callback_objc_decl)
-        m_callback_objc_decl (m_callback_baton, objc_decl);
+void ClangExternalASTSourceCallbacks::CompleteType(
+    ObjCInterfaceDecl *objc_decl) {
+  if (m_callback_objc_decl)
+    m_callback_objc_decl(m_callback_baton, objc_decl);
 }
 
-bool
-ClangExternalASTSourceCallbacks::layoutRecordType(
+bool ClangExternalASTSourceCallbacks::layoutRecordType(
     const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
     llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
     llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
-    llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets)
-{
-    if (m_callback_layout_record_type)
-        return m_callback_layout_record_type(m_callback_baton,
-                                             Record,
-                                             Size, 
-                                             Alignment, 
-                                             FieldOffsets, 
-                                             BaseOffsets, 
-                                             VirtualBaseOffsets);
-    
-    return false;
+    llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
+        &VirtualBaseOffsets) {
+  if (m_callback_layout_record_type)
+    return m_callback_layout_record_type(m_callback_baton, Record, Size,
+                                         Alignment, FieldOffsets, BaseOffsets,
+                                         VirtualBaseOffsets);
+
+  return false;
 }
 
-void
-ClangExternalASTSourceCallbacks::FindExternalLexicalDecls (const clang::DeclContext *decl_ctx,
-                                                           llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
-                                                           llvm::SmallVectorImpl<clang::Decl *> &decls)
-{
-    if (m_callback_tag_decl && decl_ctx)
-    {
-        clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(const_cast<clang::DeclContext *>(decl_ctx));
-        if (tag_decl)
-            CompleteType(tag_decl);
-    }
+void ClangExternalASTSourceCallbacks::FindExternalLexicalDecls(
+    const clang::DeclContext *decl_ctx,
+    llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
+    llvm::SmallVectorImpl<clang::Decl *> &decls) {
+  if (m_callback_tag_decl && decl_ctx) {
+    clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(
+        const_cast<clang::DeclContext *>(decl_ctx));
+    if (tag_decl)
+      CompleteType(tag_decl);
+  }
 }
-
