Revision: 1147 http://svn.sourceforge.net/geany/?rev=1147&view=rev Author: ntrel Date: 2006-12-26 07:49:35 -0800 (Tue, 26 Dec 2006)
Log Message: ----------- Add calltip support for D constructors. Add tm_workspace_find_scoped() (adapted from Anjuta 2.02 tm_workspace_find()).
Modified Paths: -------------- trunk/ChangeLog trunk/src/sci_cb.c trunk/tagmanager/include/tm_workspace.h trunk/tagmanager/tm_workspace.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-12-26 15:43:50 UTC (rev 1146) +++ trunk/ChangeLog 2006-12-26 15:49:35 UTC (rev 1147) @@ -2,6 +2,11 @@
* tagmanager/tm_tag.c, tagmanager/include/tm_tag.h: Fix missed matches in tm_tags_find(). + * src/sci_cb.c, tagmanager/tm_workspace.c, + tagmanager/include/tm_workspace.h: + Add calltip support for D constructors. + Add tm_workspace_find_scoped() (adapted from Anjuta 2.02 + tm_workspace_find()).
2006-12-24 Nick Treleaven nick.treleaven@btinternet.com
Modified: trunk/src/sci_cb.c =================================================================== --- trunk/src/sci_cb.c 2006-12-26 15:43:50 UTC (rev 1146) +++ trunk/src/sci_cb.c 2006-12-26 15:49:35 UTC (rev 1147) @@ -544,17 +544,35 @@ g_return_val_if_fail(ft && word && *word, NULL);
tags = tm_workspace_find(word, tm_tag_max_t, NULL, FALSE, ft->lang); - if (tags->len == 1 && TM_TAG(tags->pdata[0])->atts.entry.arglist) + + if (tags->len == 0) + return NULL; + + tag = TM_TAG(tags->pdata[0]); + if (tag->atts.entry.arglist) { - tag = TM_TAG(tags->pdata[0]); if (tag->atts.entry.var_type) return g_strconcat(tag->atts.entry.var_type, " ", tag->name, " ", tag->atts.entry.arglist, NULL); else return g_strconcat(tag->name, " ", tag->atts.entry.arglist, NULL); } - else - return NULL; + else if (tag->type == tm_tag_class_t && FILETYPE_ID(ft) == GEANY_FILETYPES_D) + { + TMTagAttrType attrs[] = { tm_tag_attr_name_t, 0 }; + + // user typed e.g. 'new Classname(' so lookup D constructor Classname::this() + tags = tm_workspace_find_scoped("this", tag->name, tm_tag_function_t | tm_tag_prototype_t, + attrs, FALSE, ft->lang, TRUE); + if (tags->len != 0) + { + tag = TM_TAG(tags->pdata[0]); + if (tag->atts.entry.arglist) + return g_strconcat(tag->atts.entry.scope, ".this ", + tag->atts.entry.arglist, NULL); + } + } + return NULL; }
Modified: trunk/tagmanager/include/tm_workspace.h =================================================================== --- trunk/tagmanager/include/tm_workspace.h 2006-12-26 15:43:50 UTC (rev 1146) +++ trunk/tagmanager/include/tm_workspace.h 2006-12-26 15:49:35 UTC (rev 1147) @@ -138,6 +138,20 @@ const GPtrArray *tm_workspace_find(const char *name, int type, TMTagAttrType *attrs , gboolean partial, langType lang);
+/*! Returns all matching tags found in the workspace. + \param name The name of the tag to find. + \param scope The scope name of the tag to find, or NULL. + \param type The tag types to return (TMTagType). Can be a bitmask. + \param attrs The attributes to sort and dedup on (0 terminated integer array). + \param partial Whether partial match is allowed. + \param lang Specifies the language(see the table in parsers.h) of the tags to be found, + -1 for all + \return Array of matching tags. Do not free() it since it is a static member. +*/ +const GPtrArray * +tm_workspace_find_scoped (const char *name, const char *scope, gint type, + TMTagAttrType *attrs, gboolean partial, langType lang, gboolean global_search); + /*! Returns TMTag to function which "own" given line \param line Current line in edited file. \param file_tags A GPtrArray of edited file TMTag pointers.
Modified: trunk/tagmanager/tm_workspace.c =================================================================== --- trunk/tagmanager/tm_workspace.c 2006-12-26 15:43:50 UTC (rev 1146) +++ trunk/tagmanager/tm_workspace.c 2006-12-26 15:49:35 UTC (rev 1147) @@ -526,6 +526,70 @@ }
+/* scope can be NULL. + * lang can be -1 */ +static int +fill_find_tags_array (GPtrArray * dst, const GPtrArray * src, + const char *name, const char *scope, int type, gboolean partial, + gint lang, gboolean first) +{ + TMTag **match; + int tagIter, count; + + if ((!src) || (!dst) || (!name) || (!*name)) + return 0; + + match = tm_tags_find (src, name, partial, &count); + if (count && match && *match) + { + for (tagIter = 0; tagIter < count; ++tagIter) + { + if (! scope || (match[tagIter]->atts.entry.scope && + 0 == strcmp(match[tagIter]->atts.entry.scope, scope))) + { + if ((lang == -1 || lang == match[tagIter]->atts.entry.file->lang) && + type & match[tagIter]->type) + { + g_ptr_array_add (dst, match[tagIter]); + if (first) + break; + } + } + } + } + return dst->len; +} + + +// adapted from tm_workspace_find, Anjuta 2.02 +const GPtrArray * +tm_workspace_find_scoped (const char *name, const char *scope, gint type, + TMTagAttrType *attrs, gboolean partial, langType lang, gboolean global_search) +{ + static GPtrArray *tags = NULL; + + if ((!theWorkspace)) + return NULL; + + if (tags) + g_ptr_array_set_size (tags, 0); + else + tags = g_ptr_array_new (); + + fill_find_tags_array (tags, theWorkspace->work_object.tags_array, + name, scope, type, partial, lang, TRUE); + if (global_search) + { + // for a scoped tag, I think we always want the same language + fill_find_tags_array (tags, theWorkspace->global_tags, + name, scope, type, partial, lang, TRUE); + } + if (attrs) + tm_tags_sort (tags, attrs, TRUE); + return tags; +} + + const TMTag * tm_get_current_function (GPtrArray * file_tags, const gulong line) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.