Cleanups in preparation for making FindExternalVisibleDecls
look in individual modules rather than globally.
Also some whitespace fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@141765 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ClangExpressionDeclMap.cpp b/source/Expression/ClangExpressionDeclMap.cpp
index 42484f1..9d6e48f 100644
--- a/source/Expression/ClangExpressionDeclMap.cpp
+++ b/source/Expression/ClangExpressionDeclMap.cpp
@@ -2119,73 +2119,14 @@
void
ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
lldb::ModuleSP module,
- ClangNamespaceDecl &decl,
+ ClangNamespaceDecl &namespace_decl,
const ConstString &name)
{
assert (m_struct_vars.get());
assert (m_parser_vars.get());
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
-
- do
- {
- if (isa<TranslationUnitDecl>(context.m_decl_context))
- break;
-
- if (!isa<NamespaceDecl>(context.m_decl_context))
- return;
-
- const Decl *context_decl = dyn_cast<Decl>(context.m_decl_context);
-
- if (log)
- log->Printf("Searching for '%s' in a '%s'", name.GetCString(), context_decl->getDeclKindName());
-
- Decl *original_decl = NULL;
- ASTContext *original_ctx = NULL;
-
- if (!m_parser_vars->GetASTImporter(context.GetASTContext())->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
- break;
-
- if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
- {
- ExternalASTSource *external_source = original_ctx->getExternalSource();
- if (!external_source)
- break;
-
- if (!original_tag_decl)
- break;
-
- external_source->CompleteType (original_tag_decl);
- }
-
- DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
-
- if (!original_decl_context)
- break;
-
- for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
- iter != original_decl_context->decls_end();
- ++iter)
- {
- NamedDecl *named_decl = dyn_cast<NamedDecl>(*iter);
-
- if (named_decl && named_decl->getName().equals(name.GetCString()))
- {
- Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(original_ctx, named_decl);
- NamedDecl *copied_named_decl = dyn_cast<NamedDecl>(copied_decl);
-
- if (!copied_named_decl)
- continue;
-
- context.AddNamedDecl (copied_named_decl);
- }
- }
-
- return;
- }
- while (0);
-
SymbolContextList sc_list;
const char *name_unique_cstr = name.GetCString();
@@ -2197,14 +2138,193 @@
// doesn't start with our phony prefix of '$'
Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
- if (name_unique_cstr[0] != '$')
+ if (name_unique_cstr[0] == '$' && !namespace_decl)
+ {
+ static ConstString g_lldb_class_name ("$__lldb_class");
+
+ if (name == g_lldb_class_name)
+ {
+ // Clang is looking for the type of "this"
+
+ if (!frame)
+ return;
+
+ VariableList *vars = frame->GetVariableList(false);
+
+ if (!vars)
+ return;
+
+ lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
+
+ if (!this_var ||
+ !this_var->IsInScope(frame) ||
+ !this_var->LocationIsValidForFrame (frame))
+ return;
+
+ Type *this_type = this_var->GetType();
+
+ if (!this_type)
+ return;
+
+ if (log)
+ {
+ log->PutCString ("Type for \"this\" is: ");
+ StreamString strm;
+ this_type->Dump(&strm, true);
+ log->PutCString (strm.GetData());
+ }
+
+ TypeFromUser this_user_type(this_type->GetClangFullType(),
+ this_type->GetClangAST());
+
+ m_struct_vars->m_object_pointer_type = this_user_type;
+
+ void *pointer_target_type = NULL;
+
+ if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
+ &pointer_target_type))
+ return;
+
+ clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
+
+ if (pointer_target_qual_type.isConstQualified())
+ pointer_target_qual_type.removeLocalConst();
+
+ TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
+ this_type->GetClangAST());
+
+ if (log)
+ {
+ StreamString type_stream;
+ class_user_type.DumpTypeCode(&type_stream);
+ type_stream.Flush();
+ log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
+ }
+
+ AddOneType(context, class_user_type, true);
+
+ return;
+ }
+
+ static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
+ if (name == g_lldb_objc_class_name)
+ {
+ // Clang is looking for the type of "*self"
+
+ if (!frame)
+ return;
+
+ VariableList *vars = frame->GetVariableList(false);
+
+ if (!vars)
+ return;
+
+ lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
+
+ if (!self_var ||
+ !self_var->IsInScope(frame) ||
+ !self_var->LocationIsValidForFrame (frame))
+ return;
+
+ Type *self_type = self_var->GetType();
+
+ if (!self_type)
+ return;
+
+ TypeFromUser self_user_type(self_type->GetClangFullType(),
+ self_type->GetClangAST());
+
+ m_struct_vars->m_object_pointer_type = self_user_type;
+
+ void *pointer_target_type = NULL;
+
+ if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
+ &pointer_target_type)
+ || pointer_target_type == NULL)
+ return;
+
+ TypeFromUser class_user_type(pointer_target_type,
+ self_type->GetClangAST());
+
+ if (log)
+ {
+ StreamString type_stream;
+ class_user_type.DumpTypeCode(&type_stream);
+ type_stream.Flush();
+ log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
+ }
+
+ AddOneType(context, class_user_type, false);
+
+ return;
+ }
+
+ // any other $__lldb names should be weeded out now
+ if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
+ return;
+
+ do
+ {
+ if (!target)
+ break;
+
+ ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
+
+ if (!scratch_clang_ast_context)
+ break;
+
+ ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
+
+ if (!scratch_ast_context)
+ break;
+
+ TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
+
+ if (!ptype_type_decl)
+ break;
+
+ Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
+
+ if (!parser_ptype_decl)
+ break;
+
+ TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
+
+ if (!parser_ptype_type_decl)
+ break;
+
+ if (log)
+ log->Printf("Found persistent type %s", name.GetCString());
+
+ context.AddNamedDecl(parser_ptype_type_decl);
+ } while (0);
+
+ ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
+
+ if (pvar_sp)
+ {
+ AddOneVariable(context, pvar_sp);
+ return;
+ }
+
+ const char *reg_name(&name.GetCString()[1]);
+
+ if (m_parser_vars->m_exe_ctx->GetRegisterContext())
+ {
+ const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
+
+ if (reg_info)
+ AddOneRegister(context, reg_info);
+ }
+ }
+ else
{
ValueObjectSP valobj;
VariableSP var;
Error err;
bool found = false;
- if (frame)
+ if (frame && !namespace_decl)
{
valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
eNoDynamicValues,
@@ -2350,186 +2470,7 @@
if (clang_namespace_decl)
clang_namespace_decl->setHasExternalVisibleStorage();
}
- }
- else
- {
- static ConstString g_lldb_class_name ("$__lldb_class");
-
- if (name == g_lldb_class_name)
- {
- // Clang is looking for the type of "this"
-
- if (!frame)
- return;
-
- VariableList *vars = frame->GetVariableList(false);
-
- if (!vars)
- return;
-
- lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
-
- if (!this_var ||
- !this_var->IsInScope(frame) ||
- !this_var->LocationIsValidForFrame (frame))
- return;
-
- Type *this_type = this_var->GetType();
-
- if (!this_type)
- return;
-
- if (log)
- {
- log->PutCString ("Type for \"this\" is: ");
- StreamString strm;
- this_type->Dump(&strm, true);
- log->PutCString (strm.GetData());
- }
-
- TypeFromUser this_user_type(this_type->GetClangFullType(),
- this_type->GetClangAST());
-
- m_struct_vars->m_object_pointer_type = this_user_type;
-
- void *pointer_target_type = NULL;
-
- if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
- &pointer_target_type))
- return;
-
- clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
-
- if (pointer_target_qual_type.isConstQualified())
- pointer_target_qual_type.removeLocalConst();
-
- TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
- this_type->GetClangAST());
-
- if (log)
- {
- StreamString type_stream;
- class_user_type.DumpTypeCode(&type_stream);
- type_stream.Flush();
- log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
- }
-
- AddOneType(context, class_user_type, true);
-
- return;
- }
-
- static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
- if (name == g_lldb_objc_class_name)
- {
- // Clang is looking for the type of "*self"
-
- if (!frame)
- return;
-
- VariableList *vars = frame->GetVariableList(false);
-
- if (!vars)
- return;
-
- lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
-
- if (!self_var ||
- !self_var->IsInScope(frame) ||
- !self_var->LocationIsValidForFrame (frame))
- return;
-
- Type *self_type = self_var->GetType();
-
- if (!self_type)
- return;
-
- TypeFromUser self_user_type(self_type->GetClangFullType(),
- self_type->GetClangAST());
-
- m_struct_vars->m_object_pointer_type = self_user_type;
-
- void *pointer_target_type = NULL;
-
- if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
- &pointer_target_type)
- || pointer_target_type == NULL)
- return;
-
- TypeFromUser class_user_type(pointer_target_type,
- self_type->GetClangAST());
-
- if (log)
- {
- StreamString type_stream;
- class_user_type.DumpTypeCode(&type_stream);
- type_stream.Flush();
- log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
- }
-
- AddOneType(context, class_user_type, false);
-
- return;
- }
-
- // any other $__lldb names should be weeded out now
- if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
- return;
-
- do
- {
- if (!target)
- break;
-
- ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
-
- if (!scratch_clang_ast_context)
- break;
-
- ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
-
- if (!scratch_ast_context)
- break;
-
- TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
-
- if (!ptype_type_decl)
- break;
-
- Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
-
- if (!parser_ptype_decl)
- break;
-
- TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
-
- if (!parser_ptype_type_decl)
- break;
-
- if (log)
- log->Printf("Found persistent type %s", name.GetCString());
-
- context.AddNamedDecl(parser_ptype_type_decl);
- } while (0);
-
- ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
-
- if (pvar_sp)
- {
- AddOneVariable(context, pvar_sp);
- return;
- }
-
- const char *reg_name(&name.GetCString()[1]);
-
- if (m_parser_vars->m_exe_ctx->GetRegisterContext())
- {
- const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
-
- if (reg_info)
- AddOneRegister(context, reg_info);
- }
- }
+ }
lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));