now the methods are sorted in the correct order in the generated docs

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12767 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2001-11-30 21:43:35 +00:00
parent 744d5712ce
commit d8b6f4d9a2

View File

@ -122,7 +122,70 @@ static const wxString GetVersionString();
// private classes
// -----------------------------------------------------------------------------
// add a function which sanitazes the string before writing it to the file
// a function documentation entry
struct FunctionDocEntry
{
FunctionDocEntry(const wxString& name_, const wxString& text_)
: name(name_), text(text_) { }
// the function name
wxString name;
// the function doc text
wxString text;
// sorting stuff
static int Compare(FunctionDocEntry **pp1, FunctionDocEntry **pp2)
{
// the methods should appear in the following order: ctors, dtor, all
// the rest in the alphabetical order
bool isCtor1 = (*pp1)->name == classname;
bool isCtor2 = (*pp2)->name == classname;
if ( isCtor1 ) {
if ( isCtor2 ) {
// we don't order the ctors because we don't know how to do it
return 0;
}
// ctor comes before non-ctor
return -1;
}
else {
if ( isCtor2 ) {
// non-ctor must come after ctor
return 1;
}
wxString dtorname = wxString('~') + classname;
// there is only one dtor, so the logic here is simpler
if ( (*pp1)->name == dtorname ) {
return -1;
}
else if ( (*pp2)->name == dtorname ) {
return 1;
}
// two normal methods
return strcmp((*pp1)->name, (*pp2)->name);
}
}
static wxString classname;
};
wxString FunctionDocEntry::classname;
WX_DECLARE_OBJARRAY(FunctionDocEntry, FunctionDocEntries);
#include "wx/arrimpl.cpp"
WX_DEFINE_OBJARRAY(FunctionDocEntries);
// add a function which sanitazes the string before writing it to the file and
// also capable of delaying output and sorting it before really writing it to
// the file (done from FlushAll())
class wxTeXFile : public wxFile
{
public:
@ -130,23 +193,42 @@ public:
// write a string to file verbatim (should only be used for the strings
// inside verbatim environment)
bool WriteVerbatim(const wxString& s)
void WriteVerbatim(const wxString& s)
{
return wxFile::Write(s);
m_text += s;
}
// write a string quoting TeX specials in it
bool WriteTeX(const wxString& s)
void WriteTeX(const wxString& s)
{
wxString t(s);
TeXFilter(&t);
return wxFile::Write(t);
m_text += t;
}
// do write everything to file
bool FlushAll()
{
if ( m_text.empty() )
return TRUE;
if ( !Write(m_text) ) {
wxLogError("Failed to output generated documentation.");
return FALSE;
}
m_text.clear();
return TRUE;
}
private:
wxTeXFile(const wxTeXFile&);
wxTeXFile& operator=(const wxTeXFile&);
wxString m_text;
};
// helper class which manages the classes and function names to ignore for
@ -247,6 +329,10 @@ protected:
// terminate the function documentation if it was started
void CloseFunction();
// write out all function docs when there are no more left in this class
// after sorting them in alphabetical order
void CloseClass();
wxString m_directoryOut, // directory for the output
m_fileHeader; // name of the .h file we parse
bool m_overwrite; // overwrite existing files?
@ -256,8 +342,18 @@ protected:
bool m_inClass, // TRUE after file successfully opened
m_inTypesSection, // enums & typedefs go there
m_inMethodSection, // functions go here
m_isFirstParam, // first parameter of current function?
m_inFunction; // we're parsing a function declaration
m_isFirstParam; // first parameter of current function?
// non empty while parsing a class
wxString m_classname;
// these are only non-empty while parsing a method:
wxString m_funcName, // the function name
m_textFunc; // the function doc text
// the array containing the documentation entries for the functions in the
// class currently being parsed
FunctionDocEntries m_arrayFuncDocs;
// holders for "saved" documentation
wxString m_textStoredTypedefs,
@ -441,10 +537,6 @@ private:
DocManager& operator=(const DocManager&);
};
// -----------------------------------------------------------------------------
// private functions
// -----------------------------------------------------------------------------
// =============================================================================
// implementation
// =============================================================================
@ -711,13 +803,17 @@ HelpGenVisitor::HelpGenVisitor(const wxString& directoryOut,
void HelpGenVisitor::Reset()
{
m_inClass =
m_inFunction =
m_inTypesSection =
m_inMethodSection = FALSE;
m_classname =
m_funcName =
m_textFunc =
m_textStoredTypedefs =
m_textStoredFunctionComment = "";
m_arrayFuncDocs.Empty();
m_storedEnums.Empty();
m_storedEnumsVerb.Empty();
m_headers.Empty();
@ -747,7 +843,7 @@ void HelpGenVisitor::InsertDataStructuresHeader()
if ( !m_inTypesSection ) {
m_inTypesSection = TRUE;
m_file.Write("\\wxheading{Data structures}\n\n");
m_file.WriteVerbatim("\\wxheading{Data structures}\n\n");
}
}
@ -756,26 +852,47 @@ void HelpGenVisitor::InsertMethodsHeader()
if ( !m_inMethodSection ) {
m_inMethodSection = TRUE;
m_file.Write( "\\latexignore{\\rtfignore{\\wxheading{Members}}}\n\n");
m_file.WriteVerbatim( "\\latexignore{\\rtfignore{\\wxheading{Members}}}\n\n");
}
}
void HelpGenVisitor::CloseFunction()
{
if ( m_inFunction ) {
m_inFunction = FALSE;
wxString totalText;
if ( !m_funcName.empty() ) {
if ( m_isFirstParam ) {
// no params found
totalText << "\\void";
m_textFunc << "\\void";
}
totalText << "}\n\n";
m_file.Write(totalText);
m_textFunc << "}\n\n";
if ( !m_textStoredFunctionComment.IsEmpty() )
m_file.WriteTeX(m_textStoredFunctionComment + '\n');
if ( !m_textStoredFunctionComment.IsEmpty() ) {
m_textFunc << m_textStoredFunctionComment << '\n';
}
m_arrayFuncDocs.Add(new FunctionDocEntry(m_funcName, m_textFunc));
m_funcName.clear();
}
}
void HelpGenVisitor::CloseClass()
{
if ( m_inClass ) {
size_t count = m_arrayFuncDocs.GetCount();
if ( count ) {
FunctionDocEntry::classname = m_classname;
m_arrayFuncDocs.Sort(FunctionDocEntry::Compare);
for ( size_t n = 0; n < count; n++ ) {
m_file.WriteTeX(m_arrayFuncDocs[n].text);
}
m_arrayFuncDocs.Empty();
}
m_inClass = FALSE;
m_classname.clear();
}
}
@ -783,8 +900,12 @@ void HelpGenVisitor::EndVisit()
{
CloseFunction();
CloseClass();
m_fileHeader.Empty();
m_file.FlushAll();
wxLogVerbose("%s: finished generating for the current file.",
GetCurrentTime("%H:%M:%S"));
}
@ -798,7 +919,7 @@ void HelpGenVisitor::VisitFile( spFile& file )
void HelpGenVisitor::VisitClass( spClass& cl )
{
m_inClass = FALSE; // will be left FALSE on error
CloseClass();
wxString name = cl.GetName();
@ -858,7 +979,7 @@ void HelpGenVisitor::VisitClass( spClass& cl )
name.c_str(),
wxString(name).MakeLower().c_str());
m_file.Write(header);
m_file.WriteVerbatim(header);
// the entire text we're writing to file
wxString totalText;
@ -1002,7 +1123,7 @@ void HelpGenVisitor::VisitEnumeration( spEnumeration& en )
m_file.WriteTeX(enumeration);
m_file.WriteVerbatim(enumerationVerb);
m_file.Write('\n');
m_file.WriteVerbatim('\n');
}
}
@ -1086,11 +1207,12 @@ void HelpGenVisitor::VisitOperation( spOperation& op )
return;
}
wxString funcname = op.GetName(),
classname = op.GetClass().GetName();
if ( m_ignoreNames.IgnoreMethod(classname, funcname) ) {
m_classname = op.GetClass().GetName();
wxString funcname = op.GetName();
if ( m_ignoreNames.IgnoreMethod(m_classname, funcname) ) {
wxLogVerbose("Skipping ignored '%s::%s'.",
classname.c_str(), funcname.c_str());
m_classname.c_str(), funcname.c_str());
return;
}
@ -1098,7 +1220,7 @@ void HelpGenVisitor::VisitOperation( spOperation& op )
InsertMethodsHeader();
// save state info
m_inFunction =
m_funcName = funcname;
m_isFirstParam = TRUE;
m_textStoredFunctionComment = GetAllComments(op);
@ -1108,47 +1230,42 @@ void HelpGenVisitor::VisitOperation( spOperation& op )
// check for the special case of dtor
wxString dtor;
if ( (funcname[0] == '~') && (classname == funcname.c_str() + 1) ) {
dtor.Printf("\\destruct{%s}", classname.c_str());
if ( (funcname[0] == '~') && (m_classname == funcname.c_str() + 1) ) {
dtor.Printf("\\destruct{%s}", m_classname.c_str());
funcname = dtor;
}
totalText.Printf("\n"
"\\membersection{%s::%s}\\label{%s}\n"
"\n"
"\\%sfunc{%s%s}{%s}{",
classname.c_str(), funcname.c_str(),
MakeLabel(classname, funcname).c_str(),
op.mIsConstant ? "const" : "",
op.mIsVirtual ? "virtual " : "",
op.mRetType.c_str(),
funcname.c_str());
m_file.WriteTeX(totalText);
m_textFunc.Printf("\n"
"\\membersection{%s::%s}\\label{%s}\n"
"\n"
"\\%sfunc{%s%s}{%s}{",
m_classname.c_str(), funcname.c_str(),
MakeLabel(m_classname, funcname).c_str(),
op.mIsConstant ? "const" : "",
op.mIsVirtual ? "virtual " : "",
op.mRetType.c_str(),
funcname.c_str());
}
void HelpGenVisitor::VisitParameter( spParameter& param )
{
if ( !m_inFunction )
if ( m_funcName.empty() )
return;
wxString totalText;
if ( m_isFirstParam ) {
m_isFirstParam = FALSE;
}
else {
totalText << ", ";
m_textFunc << ", ";
}
totalText << "\\param{" << param.mType << " }{" << param.GetName();
m_textFunc << "\\param{" << param.mType << " }{" << param.GetName();
wxString defvalue = param.mInitVal;
if ( !defvalue.IsEmpty() ) {
totalText << " = " << defvalue;
m_textFunc << " = " << defvalue;
}
totalText << '}';
m_file.WriteTeX(totalText);
m_textFunc << '}';
}
// ---------------------------------------------------------------------------
@ -1892,8 +2009,44 @@ static wxString MakeLabel(const char *classname, const char *funcname)
}
}
if ( funcname )
label << funcname;
if ( funcname ) {
// special treatment for operatorXXX() stuff because the C operators
// are not valid in LaTeX labels
wxString oper;
if ( wxString(funcname).StartsWith("operator", &oper) ) {
label << "operator";
static const struct
{
const char *oper;
const char *name;
} operatorNames[] =
{
{ "=", "assign" },
{ "==", "equal" },
};
size_t n;
for ( n = 0; n < WXSIZEOF(operatorNames); n++ ) {
if ( oper == operatorNames[n].oper ) {
label << operatorNames[n].name;
break;
}
}
if ( n == WXSIZEOF(operatorNames) ) {
wxLogWarning("unknown operator '%s' - making dummy label.",
oper.c_str());
label << "unknown";
}
}
else // simply use the func name
{
label << funcname;
}
}
label.MakeLower();
@ -1981,6 +2134,9 @@ static const wxString GetVersionString()
/*
$Log$
Revision 1.17 2001/11/30 21:43:35 VZ
now the methods are sorted in the correct order in the generated docs
Revision 1.16 2001/11/28 19:27:33 VZ
HelpGen doesn't work in GUI mode