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;
}
}
next prev 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