- l=cls->static_traits;
- for(;l;l=l->next) {
- trait_t*trait = l->trait;
- if(trait->name->ns->access==ACCESS_PRIVATE)
- continue;
- char*type="static entity";
- const char*name = trait->name->name;
- if(dict_lookup(d, name)) {
- continue;
- } else {
- dict_put(d, (char*)name, (char*)name);
- }
- switch(trait->kind) {
- case TRAIT_METHOD: type="static method";break;
- case TRAIT_CONST: type="constant";break;
- case TRAIT_FUNCTION: type="static function";break;
- case TRAIT_GETTER: type="static variable";break;
- case TRAIT_SETTER: type="static variable";break;
- case TRAIT_SLOT: type="static variable";break;
- case TRAIT_CLASS: type="static subclass";break;
- }
- fprintf(fi, " dict_put(&%s.members, \"%s\", \"%s\");\n",
- id, name, type);
+ char*type="0";
+ switch(trait->kind) {
+ case TRAIT_METHOD: {
+ multiname_t*ret = trait->method->return_type;
+ if(!ret)
+ retvalue = 0;
+ else
+ retvalue = mkid(ret->ns->name, ret->name);
+ if(ret && !strcmp(ret->name, "void"))
+ retvalue = 0;
+ } //fallthrough
+ case TRAIT_FUNCTION:
+ type = "MEMBER_METHOD";
+ break;
+ case TRAIT_CONST:
+ case TRAIT_GETTER:
+ case TRAIT_SETTER:
+ case TRAIT_SLOT:
+ type = "MEMBER_SLOT";
+ break;
+ default:
+ fprintf(stderr, "Unknown trait type %d\n", trait->kind);
+ }
+ if(pass==0) {
+ fprintf(fi, "static memberinfo_t %s;\n", id2);
+ } if(pass==1) {
+ fprintf(fi, "static memberinfo_t %s = {%s, \"%s\"", id2, type, name);
+ if(!retvalue)
+ fprintf(fi, ", 0");
+ else
+ fprintf(fi, ", &%s", retvalue);
+ fprintf(fi, "};\n");
+ } else if(pass==2) {
+ fprintf(fi, " dict_put(&%s.members, \"%s\", &%s);\n", id, name, id2);
+ }
+cont:
+ l = l->next;
+ if(!l && !is_static) {
+ l = cls->static_traits;
+ is_static = 1;