2003-01-10 Adam Fedor * 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; } }