This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PING/RFA]: Search for Objc Symbols


I forgot about this one:

http://sources.redhat.com/ml/gdb-patches/2003-01/msg00441.html

It doesn't apprear that this was ever formally approved. I've attached the patch again since there have been some minor changes since then in order to keep up with the times...


2003-04-25  Adam Fedor  <fedor at gnu dot org>

	* symtab.c (make_symbol_completion_list): Look for ObjC
	symbols.
	* Makefile.in (symtab.o): Update dependencies.

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.367
diff -u -p -r1.367 Makefile.in
--- Makefile.in	26 Apr 2003 01:57:28 -0000	1.367
+++ Makefile.in	26 Apr 2003 03:12:16 -0000
@@ -2275,7 +2275,7 @@ symtab.o: symtab.c $(defs_h) $(symtab_h)
 	$(gdbcmd_h) $(call_cmds_h) $(gdb_regex_h) $(expression_h) \
 	$(language_h) $(demangle_h) $(inferior_h) $(linespec_h) \
 	$(filenames_h) $(gdb_obstack_h) $(gdb_string_h) $(gdb_stat_h) \
-	$(cp_abi_h) $(source_h) $(block_h)
+	$(cp_abi_h) $(source_h) $(block_h) $(objc_lang_h)
 target.o: target.c $(defs_h) $(gdb_string_h) $(target_h) $(gdbcmd_h) \
 	$(symtab_h) $(inferior_h) $(bfd_h) $(symfile_h) $(objfiles_h) \
 	$(gdb_wait_h) $(dcache_h) $(regcache_h)
Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.101
diff -u -p -r1.101 symtab.c
--- symtab.c	14 Apr 2003 19:56:32 -0000	1.101
+++ symtab.c	26 Apr 2003 03:12:21 -0000
@@ -40,6 +40,7 @@
 #include "linespec.h"
 #include "source.h"
 #include "filenames.h"		/* for FILENAME_CMP */
+#include "objc-lang.h"
 
 #include "hashtab.h"
 
@@ -3527,10 +3541,69 @@ make_symbol_completion_list (char *text,
      anything that isn't a text symbol (everything else will be
      handled by the psymtab code above).  */
 
+  /* ObjC: In case we are completing on a selector, look thru the msymbols
+     again and feed all the selectors into the mill.  */
+
   ALL_MSYMBOLS (objfile, msymbol)
   {
+    static char *tmp = NULL;
+    static unsigned int tmplen = 0;
+    
+    char *method, *category, *selector;
+    char *tmp2 = NULL;
+    
     QUIT;
-    COMPLETION_LIST_ADD_SYMBOL (msymbol, sym_text, sym_text_len, text, word);
+    
+    method = SYMBOL_DEMANGLED_NAME (msymbol);
+    if (method == NULL)
+      method = SYMBOL_LINKAGE_NAME (msymbol);
+    if (method == NULL)
+      continue;
+
+    /* Add the minimal symbol no matter what.  */
+    completion_list_add_name (method, sym_text, sym_text_len, text, word);
+
+    /* Is it a method?  */
+    if ((method[0] != '-') && (method[0] != '+'))
+      continue;
+    if (sym_text[0] == '[')
+      /* Complete on shortened method method.  */
+      completion_list_add_name (method + 1, sym_text, sym_text_len, text, word);
+    
+    while ((strlen (method) + 1) >= tmplen)
+      {
+	if (tmplen == 0)
+	  tmplen = 1024;
+	else
+	  tmplen *= 2;
+	tmp = xrealloc (tmp, tmplen);
+      }
+    selector = strchr (method, ' ');
+    if (selector != NULL)
+      selector++;
+    
+    category = strchr (method, '(');
+    
+    if ((category != NULL) && (selector != NULL))
+      {
+	memcpy (tmp, method, (category - method));
+	tmp[category - method] = ' ';
+	memcpy (tmp + (category - method) + 1, selector, strlen (selector) + 1);
+	completion_list_add_name (tmp, sym_text, sym_text_len, text, word);
+	if (sym_text[0] == '[')
+	  completion_list_add_name (tmp + 1, sym_text, sym_text_len, text, word);
+      }
+    
+    if (selector != NULL)
+      {
+	/* Complete on selector only.  */
+	strcpy (tmp, selector);
+	tmp2 = strchr (tmp, ']');
+	if (tmp2 != NULL)
+	  *tmp2 = '\0';
+	
+	completion_list_add_name (tmp, sym_text, sym_text_len, text, word);
+      }
   }
 
   /* Search upwards from currently selected frame (so that we can
@@ -3548,6 +3621,7 @@ make_symbol_completion_list (char *text,
 
       ALL_BLOCK_SYMBOLS (b, i, sym)
 	{
+	  QUIT;
 	  COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text, word);
 	  if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
 	    {
@@ -3653,15 +3727,45 @@ make_file_symbol_completion_list (char *
       }
     else
       {
-	/* It is not a quoted string.  Break it based on the characters
-	   which are in symbols.  */
-	while (p > text)
-	  {
-	    if (isalnum (p[-1]) || p[-1] == '_' || p[-1] == '\0')
-	      --p;
-	    else
-	      break;
-	  }
+        /* It is not a quoted string.  Break it based on the characters
+           which are in symbols.  */
+        for (; p > text; --p)
+          {
+            if (isalnum (p[-1]) || p[-1] == '_' || p[-1] == '\0')
+              continue;
+            else
+              {
+                if ((current_language->la_language == language_objc))
+		  {
+                  if (p[-1] == ':')     /* might be part of a method name */
+                    continue;
+                  else if (p[-1] == '[' && (p[-2] == '-' || p[-2] == '+'))
+                    p -= 2;             /* beginning of a method name */
+                  else if (p[-1] == ' ' || p[-1] == '(' || p[-1] == ')')
+                    {                   /* might be part of a method name */
+                      char *t = p;
+
+                      /* Seeing a ' ' or a '(' is not conclusive evidence
+                         that we are in the middle of a method name.  However,
+                         finding "-[" or "+[" should be pretty un-ambiguous.
+                         Unfortunately we have to find it now to decide.  */
+
+                      while (t > text)
+                        if (isalnum (t[-1]) || t[-1] == '_' ||
+                            t[-1] == ' '    || t[-1] == ':' ||
+                            t[-1] == '('    || t[-1] == ')')
+                          --t;
+                        else
+                          break;
+
+                      if (t[-1] == '[' && (t[-2] == '-' || t[-2] == '+'))
+                        p = t - 2;      /* method name detected */
+                      /* else we leave with p unchanged */
+                    }
+		  }
+                break;
+              }
+          }
 	sym_text = p;
       }
   }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]