From: <gg...@us...> - 2007-05-02 13:32:20
|
Revision: 9751 http://swig.svn.sourceforge.net/swig/?rev=9751&view=rev Author: gga73 Date: 2007-05-02 06:32:18 -0700 (Wed, 02 May 2007) Log Message: ----------- Improved rdoc generation. Modified Paths: -------------- trunk/Source/Modules/ruby.cxx Modified: trunk/Source/Modules/ruby.cxx =================================================================== --- trunk/Source/Modules/ruby.cxx 2007-05-02 10:00:26 UTC (rev 9750) +++ trunk/Source/Modules/ruby.cxx 2007-05-02 13:32:18 UTC (rev 9751) @@ -138,6 +138,41 @@ #define RCLASS(hash, name) (RClass*)(Getattr(hash, name) ? Data(Getattr(hash, name)) : 0) #define SET_RCLASS(hash, name, klass) Setattr(hash, name, NewVoid(klass, 0)) +struct Autodoc { + const char* symname; + const char* description; +}; + +static const Autodoc kAutoDocs[] = { + { "to_a", "Convert class to an Array" }, + { "to_s", "Convert class to a String representation" }, + { "inspect", "Inspect class and its contents" }, + { "[]", "Element accessor/slicing" }, + { "[]=", "Element setter/slicing" }, + { "==", "Equality comparison operator" }, + { "<=", "Lower or equal comparison operator" }, + { ">=", "Higher or equal comparison operator" }, + { "<", "Lower than comparison operator" }, + { ">", "Higher than comparison operator" }, + { "<<", "Left shifting or appending operator" }, + { ">>", "Right shifting operator or extracting operator" }, + { "+", "Add operator" }, + { "-", "Substraction operator" }, + { "+@", "Positive operator" }, + { "-@", "Negation operator" }, + { "&", "AND operator" }, + { "|", "OR operator" }, + { "^", "XOR operator" }, + { "~", "Invert operator" }, + { "**", "Exponential operator" }, + { "divmod", "Modulo of division" }, + { "hash", "Hashing function for class" }, + { "coerce", "Coerce class to a number" }, + { "<=>", "Comparison operator" }, + {0,0} +}; + + class RUBY:public Language { private: @@ -190,6 +225,7 @@ }; + autodoc_l autodoc_level(String *autodoc) { autodoc_l dlevel = NO_AUTODOC; if (autodoc) { @@ -400,7 +436,8 @@ n = Getattr(n, "sym:previousSibling"); Node *pn = Swig_methodclass(n); - String* class_name = Getattr(pn, "sym:name"); + String* class_name = Copy( Getattr(pn, "sym:name") ); + if ( !class_name ) class_name = NewString(""); String* full_name; if ( module ) { full_name = NewString(module); @@ -408,14 +445,16 @@ } else full_name = NewString(""); - if ( class_name ) - Append(full_name, class_name); + Append(full_name, class_name); + String *symname = NULL; String *doc = NewString("/*\n"); int counter = 0; + bool skipAuto = false; + Node* on = n; for ( ; n; ++counter ) { + skipAuto = false; bool showTypes = false; - bool skipAuto = false; String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { @@ -436,53 +475,78 @@ showTypes = true; break; case STRING_AUTODOC: - Append(doc, autodoc); skipAuto = true; break; } - if (!skipAuto) { - String *symname = Getattr(n, "sym:name"); - if ( Getattr( special_methods, symname ) ) - symname = Getattr( special_methods, symname ); + symname = Getattr(n, "sym:name"); + if ( Getattr( special_methods, symname ) ) + symname = Getattr( special_methods, symname ); - SwigType *type = Getattr(n, "type"); + SwigType *type = Getattr(n, "type"); - if (type) { - if (Strcmp(type, "void") == 0) - type = NULL; + if (type) { + if (Strcmp(type, "void") == 0) + type = NULL; + else { + SwigType *qt = SwigType_typedef_resolve_all(type); + if (SwigType_isenum(qt)) + type = NewString("int"); else { - SwigType *qt = SwigType_typedef_resolve_all(type); - if (SwigType_isenum(qt)) - type = NewString("int"); - else { - type = SwigType_base(type); - Node *lookup = Swig_symbol_clookup(type, 0); + type = SwigType_base(type); + Node *lookup = Swig_symbol_clookup(type, 0); if (lookup) type = Getattr(lookup, "sym:name"); - } } } + } + if (counter == 0) { switch (ad_type) { case AUTODOC_CLASS: + Printf(doc, " Document-class: %s\n\n", full_name); + break; + case AUTODOC_CTOR: + Printf(doc, " Document-method: new\n\n", class_name); + break; + + case AUTODOC_DTOR: + break; + + case AUTODOC_STATICFUNC: + Printf(doc, " Document-method: %s\n\n", full_name); + break; + + case AUTODOC_FUNC: + case AUTODOC_METHOD: + Printf(doc, " Document-method: %s\n\n", symname); + break; + } + } + + + if (skipAuto) { + Append(doc, autodoc); + } + else { + switch (ad_type) { + case AUTODOC_CLASS: { // Only do the autodoc if there isn't a docstring for the class String *str = Getattr(n, "feature:docstring"); if (counter == 0 && (str == NULL || Len(str) == 0)) { if (CPlusPlus) { - Printf(doc, " Document-class: %s\n\n Proxy of C++ %s class", + Printf(doc, " Proxy of C++ %s class", full_name, class_name); } else { - Printf(doc, " Document-class: %s\n\n Proxy of C %s struct", + Printf(doc, " Proxy of C %s struct", full_name, class_name); } } } break; case AUTODOC_CTOR: - if (counter == 0) - Append(doc, " Document-method: new\n\n call-seq:\n"); + if (counter == 0) Printf(doc, " call-seq:\n"); if (Strcmp(class_name, symname) == 0) { String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) @@ -498,27 +562,9 @@ break; case AUTODOC_STATICFUNC: - if (counter == 0) - Printf(doc, " Document-method: %s\n\n call-seq:\n", full_name); - Printf(doc, " %s(%s)", full_name, - make_autodocParmList(n, showTypes)); - - if (type) - Printf(doc, " -> %s", type); - break; - case AUTODOC_FUNC: - if (counter == 0) - Printf(doc, " Document-method: %s\n\n call-seq:\n", symname); - Printf(doc, " %s(%s)", symname, - make_autodocParmList(n, showTypes)); - if (type) - Printf(doc, " -> %s", type); - break; - case AUTODOC_METHOD: - if (counter == 0) - Printf(doc, " Document-method: %s\n\n call-seq:\n", symname); + if (counter == 0) Printf(doc, " call-seq:\n"); String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s(%s)", symname, paramList); @@ -529,21 +575,91 @@ break; } } + + // if it's overloaded then get the next decl and loop around again + n = Getattr(n, "sym:nextSibling"); + if (n) + Append(doc, "\n"); + } + + if (!skipAuto) { + Printf(doc, "\n\n "); + switch (ad_type) { + case AUTODOC_CLASS: + break; + case AUTODOC_CTOR: + Printf(doc, "Class constructor.\n"); + break; + + case AUTODOC_DTOR: + break; + + case AUTODOC_STATICFUNC: + Printf(doc, "A static function.\n"); + break; + + case AUTODOC_FUNC: + Printf(doc, "A function.\n"); + break; + + case AUTODOC_METHOD: + bool found = false; + if ( symname ) + { + const Autodoc* d = kAutoDocs; + for ( ; d->symname != NULL; ++d ) + { + if ( Cmp(symname, d->symname) == 0 ) + { + found = true; + Printf(doc, "%s.\n", d->description); + break; + } + } + } + if (!found) + { + Printf(doc, "A method.\n"); + } + break; + } + } + + + n = on; + while ( n ) { + String *autodoc = Getattr(n, "feature:autodoc"); + autodoc_l dlevel = autodoc_level(autodoc); + + symname = Getattr(n, "sym:name"); + if ( Getattr( special_methods, symname ) ) + symname = Getattr( special_methods, symname ); + + switch (dlevel) { + case NO_AUTODOC: + case NAMES_AUTODOC: + case TYPES_AUTODOC: + case STRING_AUTODOC: + extended = 0; + break; + case EXTEND_AUTODOC: + case EXTEND_TYPES_AUTODOC: + extended = 1; + break; + } + if (extended) { String *pdocs = Getattr(n, "feature:pdocs"); if (pdocs) { - Printv(doc, "\n", pdocs, NULL); + Printv(doc, "\n\n", pdocs, NULL); } } - - // if it's overloaded then get the next decl and loop around again n = Getattr(n, "sym:nextSibling"); - if (n) - Append(doc, "\n"); } Append(doc, "\n\n*/\n"); Delete(full_name); + Delete(class_name); return doc; } @@ -692,7 +808,7 @@ special_methods = NewHash(); - /* Python style special method name. */ + /* Python->Ruby style special method name. */ /* Basic */ Setattr(special_methods, "__repr__", "inspect"); Setattr(special_methods, "__str__", "to_s"); @@ -1367,6 +1483,7 @@ * --------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { + String *nodeType; bool constructor; bool destructor; @@ -1465,6 +1582,10 @@ } Printf(f->code, "{rb_raise(rb_eArgError, \"wrong # of arguments(%%d for %d)\",argc); SWIG_fail;}\n", numreq - start); } else { + String* docs = docstring(n, AUTODOC_FUNC); + Printf(f_wrappers, "%s", docs); + Delete(docs); + Printv(f->def, "SWIGINTERN VALUE\n", wname, "(int argc, VALUE *argv, VALUE self) {", NIL); if (!varargs) { Printf(f->code, "if ((argc < %d) || (argc > %d)) ", numreq - start, numarg - start); @@ -1801,6 +1922,9 @@ * --------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { + String* docs = docstring(n, AUTODOC_METHOD); + Printf(f_wrappers, "%s", docs); + Delete(docs); char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |