Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Adam Fedor <fedor@doc.com>
To: Elena Zannoni <ezannoni@redhat.com>
Cc: GDB Patches <gdb-patches@sources.redhat.com>
Subject: Re: [RFA] Demangle ObjC symbols in symtab.c [4/5]
Date: Sat, 11 Jan 2003 03:59:00 -0000	[thread overview]
Message-ID: <3E1F9682.7050901@doc.com> (raw)
In-Reply-To: <15897.63800.544503.672211@localhost.redhat.com>

[-- Attachment #1: Type: text/plain, Size: 3222 bytes --]



Elena Zannoni wrote:
> Adam Fedor writes:
>  > 2003-01-03  Adam Fedor  <fedor@gnu.org>
>  > 
>  > 	* symtab.c (symbol_init_demangled_name): Check for and demangle
>  > 	ObjC symbols.
>  > 	(make_symbol_completion_list): Look for ObjC symbols
>  > 
>  > Index: symtab.c
>  > ===================================================================
>  > RCS file: /cvs/src/src/gdb/symtab.c,v
>  > retrieving revision 1.84
>  > diff -u -p -r1.84 symtab.c
[...snip...]
>  > +      ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
>  > +	{
>  > +	  static char *tmp = NULL;
>  > +	  static unsigned int tmplen = 0;
>  > +	  
>  > +	  char *method, *category, *selector;
>  > +	  char *tmp2 = NULL;
>  > +	  
>  > +	  QUIT;
>  > +	  
>  > +	  method = SYMBOL_DEMANGLED_NAME (msymbol);
>  > +	  if (method == NULL)
>  > +	    method = SYMBOL_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);
>  > +     
> 
> Why don't you use the (yes, awful) macro COMPLETION_LIST_ADD_SYMBOL ? 
> 

I guess I'm not sure that SYMBOL_NAME(msymbol) is always non-NULL. Is 
that the case?

>  
>  > +	  /* 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);
> 
> Do you add 2 methods for a symbol that starts with '['?
> 
> 
>  > +
>  > +	  while ((strlen (method) + 1) >= tmplen)
>  > +	    {
>  > +	      tmplen = (tmplen == 0) ? 1024 : tmplen * 2;
> 
> Conditional expressions are generally frowned upon.
> 
>  > +	      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);
>  > +	    }
> 
> I am not sure I understand: how many variations of the same name get
> added to the completion list?
> 
>  > +	}
>

For a particular completion symbol, which could be something like

isFlip or [MyObject isFlip

You could potentially complete on any of

-[MyObject(PrivateCategory) isFlipped]
-[MyObject isFlipped]
[MyObject isFlipped]
isFlipped


All of these symbols COULD be unique, although in practice this is 
unlikely. Attached is an updated patch (second half only).


[-- Attachment #2: objc22b.patch --]
[-- Type: text/plain, Size: 4855 bytes --]

2003-01-10  Adam Fedor  <fedor@gnu.org>

	* symtab.c (make_symbol_completion_list): Look for ObjC
	symbols.

Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.84
diff -u -p -r1.84 symtab.c
--- symtab.c	2 Jan 2003 14:27:26 -0000	1.84
+++ symtab.c	11 Jan 2003 03:55:19 -0000
@@ -3388,10 +3406,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_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
@@ -3409,6 +3486,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)
 	    {
@@ -3514,15 +3592,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;
       }
   }

  parent reply	other threads:[~2003-01-11  3:59 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-01-03 23:03 Adam Fedor
2003-01-04  1:25 ` Michael Snyder
2003-01-11  4:01   ` Adam Fedor
2003-02-19 14:59     ` Elena Zannoni
2003-02-19 15:15       ` Elena Zannoni
2003-02-19 16:48         ` Adam Fedor
2003-01-06 21:42 ` Elena Zannoni
2003-01-07 23:14   ` Daniel Jacobowitz
2003-01-11  3:59   ` Adam Fedor [this message]
2003-01-11  5:24     ` Daniel Jacobowitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3E1F9682.7050901@doc.com \
    --to=fedor@doc.com \
    --cc=ezannoni@redhat.com \
    --cc=gdb-patches@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox