static gchar* get_complex_node_type (JSNode *node, JSContext *my_cx) { Type *name = js_context_get_node_type (my_cx, node); if (!name) return NULL; if (!name->isFuncCall) return name->name; IJsSymbol* sym = global_search (name->name); if (sym && ijs_symbol_get_base_type (sym) == BASE_FUNC) { GList *ret = ijs_symbol_get_func_ret_type (sym); if (ret) { g_assert (ret->data != NULL); return (gchar*)ret->data; } } return NULL; }
static IJsSymbol* find (const gchar* name, IJsSymbol *sym) { gchar *vname = NULL, *left = NULL; if (!sym) return NULL; if (!name) return NULL; int i; for (i = 0; i < strlen (name); i++) { if (name[i] != '.') continue; vname = g_strndup (name, i); left = g_strdup (name + i + 1); break; } if (!vname) vname = g_strdup (name); if (strlen (vname) == 0) { g_free (vname); g_free (left); return NULL; } gboolean is_func_call = *((vname + strlen (vname)) - 1) == ')'; if (is_func_call) vname [strlen (vname) - 2] = '\0'; GList *j;////TODO for (j = ijs_symbol_list_member (sym); j; j = g_list_next (j)) { gchar *t = (gchar*)j->data; //puts (t); if (strcmp (vname, t) != 0 ) continue; if (!is_func_call) { if (!left) return ijs_symbol_get_member (sym, t); IJsSymbol *tjs = ijs_symbol_get_member (sym, t); IJsSymbol *ret = find (left, tjs); g_object_unref (tjs); return ret; } else { IJsSymbol *s = ijs_symbol_get_member (sym, t); if (!s) return NULL; if (ijs_symbol_get_base_type (s) != BASE_FUNC) { g_object_unref (s); return NULL; } GList* rets = ijs_symbol_get_func_ret_type (s); g_object_unref (s); if (rets == NULL) { return NULL; } //TODO: Fix IJsSymbol *ret = global_search (rets->data); if (!ret) return NULL; if (!left) return ret; s = find (left, ret); g_object_unref (ret); return s; } } return NULL; }