X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/486240dc4c5d57b0afaddba60d87fe375112bed5..853c670e4b839fd435507201f04d16080590a894:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 9764b67..ba4615b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -141,18 +141,18 @@ push_function(int scope, int method, char *oid, char *id, !(g_list_length(funcargs) == 1 && g_list_length(gtktypes) == 2 && strcmp(gtktypes->next->data, "NONE")==0)) { - print_error(TRUE, _("The number of GTK arguments and " - "function arguments for a signal " - "don't seem to match"), line_no); + error_print(GOB_WARN, line_no, + _("The number of GTK arguments and " + "function arguments for a signal " + "don't seem to match")); } if(g_list_length(gtktypes) > 2) { GList *li; for(li = gtktypes->next; li; li = li->next) { if(strcmp(li->data, "NONE")==0) { - print_error(FALSE, + error_print(GOB_ERROR, line_no, _("NONE can only appear in an " - "argument list by itself"), - line_no); + "argument list by itself")); } } } @@ -235,12 +235,13 @@ push_init_arg(char *name, int is_class) } static void -push_self(char *id) +push_self(char *id, gboolean constant) { Node *node; Node *type; GList *ch = NULL; - type = new_type(g_strdup(((Class *)class)->otype), g_strdup("*"), NULL); + type = new_type(g_strdup(((Class *)class)->otype), + g_strdup(constant ? "const *" : "*"), NULL); ch = g_list_append(ch,new_check(NULL_CHECK,NULL)); ch = g_list_append(ch,new_check(TYPE_CHECK,NULL)); node = new_funcarg((Type *)type,id,ch); @@ -251,7 +252,6 @@ static Variable * find_var_or_die(const char *id, int line) { GList *li; - char *s; for(li = class_nodes; li != NULL; li = li->next) { Variable *var; @@ -263,8 +263,7 @@ find_var_or_die(const char *id, int line) return var; } - s = g_strdup_printf(_("Variable %s not defined here"), id); - print_error(FALSE, s, line); + error_printf(GOB_ERROR, line, _("Variable %s not defined here"), id); g_assert_not_reached(); return NULL; @@ -497,6 +496,7 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { g_free($3); g_free($4); g_free($5); g_free($8); g_list_foreach($2,(GFunc)g_free,NULL); + g_list_free($2); g_string_free($10,TRUE); g_string_free($7,TRUE); yyerror(_("parse error")); @@ -504,29 +504,30 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { } } | ARGUMENT flags argtype TOKEN TOKEN '{' CCODE ';' { - if(strcmp($5,"get")==0) { + if(strcmp($5, "get") == 0) { Node *node; Type *type = pop_type(); g_free($5); - node = new_argument($3,type,$2,$4, - ($7)->str,$6, - NULL,0, $1); - g_string_free($7,FALSE); - class_nodes = g_list_append(class_nodes,node); - } else if(strcmp($5,"set")==0) { + node = new_argument($3, type, $2, $4, + ($7)->str, $6, + NULL, 0, $1); + g_string_free($7, FALSE); + class_nodes = g_list_append(class_nodes, node); + } else if(strcmp($5, "set") == 0) { Node *node; Type *type = pop_type(); g_free($5); - node = new_argument($3,type,$2,$4, - NULL,0,($7)->str, + node = new_argument($3, type, $2, $4, + NULL, 0, ($7)->str, $6, $1); - g_string_free($7,FALSE); - class_nodes = g_list_append(class_nodes,node); + g_string_free($7, FALSE); + class_nodes = g_list_append(class_nodes, node); } else { g_free($5); g_free($3); g_free($4); - g_list_foreach($2,(GFunc)g_free,NULL); - g_string_free($7,TRUE); + g_list_foreach($2, (GFunc)g_free, NULL); + g_list_free($2); + g_string_free($7, TRUE); yyerror(_("parse error")); YYERROR; } @@ -544,6 +545,7 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { g_free($5); g_free($3); g_free($4); g_list_foreach($2,(GFunc)g_free,NULL); + g_list_free($2); yyerror(_("parse error")); YYERROR; } @@ -553,9 +555,12 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { var = find_var_or_die($4, $1); if(var->scope == PRIVATE_SCOPE) root = "self->_priv"; - else if(var->scope == CLASS_SCOPE) - root = "SELF_CLASS(GTK_OBJECT(self)->klass)"; - else + else if(var->scope == CLASS_SCOPE) { + root = "SELF_GET_CLASS(self)"; + if(no_self_alias) + error_print(GOB_ERROR, $1, + _("Self aliases needed when autolinking to a classwide member")); + } else root = "self"; if(strcmp($5, "link")==0) { @@ -959,23 +964,65 @@ funcargs: VOID { vararg = FALSE; has_self = FALSE; } vararg = FALSE; has_self = TRUE; if(strcmp($1,"self")==0) - push_self($1); + push_self($1, FALSE); else { g_free($1); yyerror(_("parse error")); YYERROR; } } + | TOKEN CONST { + vararg = FALSE; + has_self = TRUE; + if(strcmp($1,"self")==0) + push_self($1, TRUE); + else { + g_free($1); + yyerror(_("parse error")); + YYERROR; + } + } + | CONST TOKEN { + vararg = FALSE; + has_self = TRUE; + if(strcmp($2,"self")==0) + push_self($2, TRUE); + else { + g_free($2); + yyerror(_("parse error")); + YYERROR; + } + } | TOKEN ',' arglist { has_self = TRUE; if(strcmp($1,"self")==0) - push_self($1); + push_self($1, FALSE); else { g_free($1); yyerror(_("parse error")); YYERROR; } } + | TOKEN CONST ',' arglist { + has_self = TRUE; + if(strcmp($1,"self")==0) + push_self($1, TRUE); + else { + g_free($1); + yyerror(_("parse error")); + YYERROR; + } + } + | CONST TOKEN ',' arglist { + has_self = TRUE; + if(strcmp($2,"self")==0) + push_self($2, TRUE); + else { + g_free($2); + yyerror(_("parse error")); + YYERROR; + } + } | arglist { has_self = FALSE; } ;