Revision: 891 http://svn.sourceforge.net/geany/?rev=891&view=rev Author: eht16 Date: 2006-10-12 15:21:29 -0700 (Thu, 12 Oct 2006)
Log Message: ----------- Improved function name parsing to fix some invalid parsed function names.
Modified Paths: -------------- trunk/ChangeLog trunk/src/utils.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-10-12 16:27:31 UTC (rev 890) +++ trunk/ChangeLog 2006-10-12 22:21:29 UTC (rev 891) @@ -1,3 +1,9 @@ +2006-10-12 Enrico Tröger enrico.troeger@uvena.de + + * src/utils.c: Improved function name parsing to fix some invalid + parsed function names. + + 2006-10-12 Nick Treleaven nick.treleaven@btinternet.com
* src/utils.c:
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2006-10-12 16:27:31 UTC (rev 890) +++ trunk/src/utils.c 2006-10-12 22:21:29 UTC (rev 891) @@ -554,37 +554,35 @@ }
-// Parse the function name up to 2 lines before tag_line. +// Parse the function name static gchar *parse_function_at_line(ScintillaObject *sci, gint tag_line) { - gint start, end, last_pos; + gint start, end, first_pos; gint tmp; + gchar c; gchar *cur_tag;
- start = sci_get_position_from_line(sci, tag_line - 2); - last_pos = sci_get_length(sci); + first_pos = end = sci_get_position_from_line(sci, tag_line); + while (sci_get_char_at(sci, end) != '{') end++; // goto the begin of function body + while (sci_get_char_at(sci, end) != '(') end--; // go back to the end of function identifier + end--; + while (isspace(sci_get_char_at(sci, end))) end--; // skip whitespaces between identifier and ( + + start = end; tmp = 0; - while (sci_get_style_at(sci, start) != SCE_C_IDENTIFIER - && sci_get_style_at(sci, start) != SCE_C_GLOBALCLASS - && start < last_pos) start++; - end = start; + c = 0; // Use tmp to find SCE_C_IDENTIFIER or SCE_C_GLOBALCLASS chars - // this fails on C++ code like 'Vek3 Vek3::mul(double s)' this code returns - // "Vek3" because the return type of the prototype is also a GLOBALCLASS, - // no idea how to fix at the moment - // fails also in C with code like - // typedef void viod; - // viod do_nothing() {} -> return viod instead of do_nothing - // perhaps: get the first colon, read forward the second colon and then method - // name, then go from the first colon backwards and read class name until space - while (((tmp = sci_get_style_at(sci, end)) == SCE_C_IDENTIFIER - || tmp == SCE_C_GLOBALCLASS - || sci_get_char_at(sci, end) == '~' - || sci_get_char_at(sci, end) == ':') - && end < last_pos) end++; + while (((tmp = sci_get_style_at(sci, start)) == SCE_C_IDENTIFIER + || tmp == SCE_C_GLOBALCLASS + || (c = sci_get_char_at(sci, start)) == '~' + || c == ':')) + start--;
- cur_tag = g_malloc(end - start + 1); - sci_get_text_range(sci, start, end, cur_tag); + if (sci_get_char_at(sci, start) == ' ') start++; // skip possible whitespace + if (sci_get_char_at(sci, start) == '*') start++; // skip possible * char + + cur_tag = g_malloc(end - start + 2); + sci_get_text_range(sci, start, end + 1, cur_tag); return cur_tag; }
@@ -632,10 +630,9 @@ return tag_line; } } - + /* parse the current function name here because TM line numbers may have changed, * and it would take too long to reparse the whole file. */ - if (doc_list[idx].file_type != NULL && doc_list[idx].file_type->id != GEANY_FILETYPES_ALL) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.