Commit 0d0eec1d authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.2.2-20001001

parent 6778bfcd
DOXYGEN Version 1.2.2
DOXYGEN Version 1.2.2-20001001
Please read the installation section of the manual for instructions.
--------
Dimitri van Heesch (24 September 2000)
Dimitri van Heesch (01 October 2000)
DOXYGEN Version 1.2.2
DOXYGEN Version 1.2.2-20001001
Please read INSTALL for compilation instructions.
......@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (24 September 2000)
Dimitri van Heesch (01 October 2000)
1.2.2
1.2.2-20001001
......@@ -775,26 +775,27 @@ void init()
"information to generate all constant output in the proper language. \n"
"The default language is English, other supported languages are: \n"
"Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, \n"
"Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, and \n"
"Portuguese.\n"
"Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, \n"
"Portuguese and Slovene.\n"
);
ConfigString::addFixedValue("outputLanguage","English");
ConfigString::addFixedValue("outputLanguage","Croatian");
ConfigString::addFixedValue("outputLanguage","Czech");
ConfigString::addFixedValue("outputLanguage","Dutch");
ConfigString::addFixedValue("outputLanguage","English");
ConfigString::addFixedValue("outputLanguage","French");
ConfigString::addFixedValue("outputLanguage","Italian");
ConfigString::addFixedValue("outputLanguage","Czech");
ConfigString::addFixedValue("outputLanguage","Swedish");
ConfigString::addFixedValue("outputLanguage","German");
ConfigString::addFixedValue("outputLanguage","Finnish");
ConfigString::addFixedValue("outputLanguage","German");
ConfigString::addFixedValue("outputLanguage","Hungarian");
ConfigString::addFixedValue("outputLanguage","Italian");
ConfigString::addFixedValue("outputLanguage","Japanese");
ConfigString::addFixedValue("outputLanguage","Korean");
ConfigString::addFixedValue("outputLanguage","Spanish");
ConfigString::addFixedValue("outputLanguage","Romanian");
ConfigString::addFixedValue("outputLanguage","Russian");
ConfigString::addFixedValue("outputLanguage","Croatian");
ConfigString::addFixedValue("outputLanguage","Polish");
ConfigString::addFixedValue("outputLanguage","Portuguese");
ConfigString::addFixedValue("outputLanguage","Slovene");
ConfigString::addFixedValue("outputLanguage","Spanish");
ConfigString::addFixedValue("outputLanguage","Swedish");
ConfigBool::add( "extractAllFlag",
"EXTRACT_ALL",
"FALSE",
......@@ -956,12 +957,13 @@ void init()
);
ConfigBool::add( "autoBriefFlag",
"JAVADOC_AUTOBRIEF",
"TRUE",
"javadoc comments behaves as Qt comments.",
"If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen \n"
"FALSE",
"should javadoc comments behaves as Qt comments.",
"If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n"
"will interpret the first line (until the first dot) of a JavaDoc-style \n"
"comment as the brief description. If set to NO, the Javadoc-style will \n"
"behave just like the Qt-style comments. \n"
"comment as the brief description. If set to NO, the JavaDoc \n"
"comments will behave just like the Qt-style comments (thus requiring an \n"
"explict @brief command for a brief description. \n"
);
ConfigBool::add( "inheritDocsFlag",
"INHERIT_DOCS",
......
......@@ -69,6 +69,10 @@
\par Note 2:
For JavaDoc compatibility a \# may be used instead of a :: in
the patterns above.
\par Note 3:
In the documentation of a class containing a member foo,
a reference to a global variable is made using ::foo, whereas \#foo
will link to the member.
For non overloaded members the argument list may be omitted.
......@@ -111,7 +115,7 @@ typedef struct StructName TypeName
\par Example:
\verbinclude restypedef.cpp
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/restypedef/html/restypedef.cpp.html">here</a>
Click <a href="$(DOXYGEN_DOCDIR)/examples/restypedef/html/restypedef_cpp.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
*/
......@@ -47,10 +47,10 @@ file using a <code>\@INCLUDE</code> tag as follows:
\endverbatim
The include file is searched in the current working directory. You can
also specify a list of directories that should be searched before looking
in the current working directory. Do this by putting a <code>\@INCLUDEPATH</code> tag
in the current working directory. Do this by putting a <code>\@INCLUDE_PATH</code> tag
with these paths before the <code>\@INCLUDE</code> tag, e.g:
\verbatim
@INCLUDEPATH = my_config_dir
@INCLUDE_PATH = my_config_dir
\endverbatim
The configuration options can be divided into several categories.
......@@ -370,10 +370,10 @@ followed by the descriptions of the tags grouped by category.
\anchor cfg_javadoc_autobrief
<dt>\c JAVADOC_AUTOBRIEF <dd>
\addindex JAVADOC_AUTOBRIEF
If the \c JAVADOC_AUTOBRIEF is set to \c YES (the default) then Doxygen
If the \c JAVADOC_AUTOBRIEF is set to \c YES then Doxygen
will interpret the first line (until the first dot) of a JavaDoc-style
comment as the brief description. If set to NO, the Javadoc-style will
behave just like the Qt-style comments.
comment as the brief description. If set to NO (the default), the
Javadoc-style will behave just like the Qt-style comments.
\anchor cfg_inherit_docs
<dt>\c INHERIT_DOCS <dd>
......
......@@ -66,34 +66,33 @@ sentence of the detailed description
to \c NO). Both the brief and the detailed descriptions are optional
for the Qt style.
Here is the same piece of code, this time documented using the JavaDoc
style:
By default a JavaDoc style documentation block behaves the same way as a
Qt style documentation block. This is not according the JavaDoc specification
however, where the first sentence of the documentation block is automatically
treated as a brief description. To enable this behaviour you should set
\ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" to YES in the configuration
file. If you enble this option and want to put a dot in the middle of a
sentence without ending it, you should put a backslash and a space after it.
Here is an example:
\verbatim
/** Brief description (e.g.\ using only a few words). Details follow. */
\endverbatim
Here is the same piece of code as shown above, this time documented using the
JavaDoc style and \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" set to YES:
\verbinclude jdstyle.cpp
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/jdstyle/html/class_test.html">here</a>
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
Note that by default the first sentence of the documentation (until the <tt>.</tt>)
is treated as a brief description, whereas the documentation block as a whole
forms the detailed description. If you want to put a dot in the middle of a
sentence you should put a backslash and space behind it. Example:
\verbatim
/** Brief description (e.g.\ using only a few words). Details follow. */
\endverbatim
The brief description is required for the JavaDoc style, unless you set
\ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" to NO. If you do this,
doxygen treats JavaDoc comments just like Qt comments (i.e. You have
to insert an explicit \ref cmdbrief "\\brief" command to add a brief description).
Unlike most other documentation systems, doxygen also allows you to put
the documentation of members (including global functions) in front of
the \e definition. This way the documentation can be placed in the source
file instead of the header file. This keeps the header file compact, and allows the
implementer of the members more direct access to the documentation.
As a compromise the brief description could be placed before the
declaration and the detailed description before the member definition
(assuming you use the Qt style comments).
declaration and the detailed description before the member definition.
\par Note:
Each entity can only have \e one brief and \e one detailed description. If you
......
PROJECT_NAME = "AfterDocs"
OUTPUT_DIRECTORY = afterdoc
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = afterdoc.h
QUIET = YES
PROJECT_NAME = "AfterDocs"
OUTPUT_DIRECTORY = afterdoc
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = afterdoc.h
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = author.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = autolink.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = class.h
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -7,3 +7,4 @@ CASE_SENSE_NAMES = NO
INPUT = define.h
ENABLE_PREPROCESSING = YES
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -10,3 +10,4 @@ ENABLE_PREPROCESSING = YES
INPUT = .
FILE_PATTERNS = diagrams_*.h
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = enum.h
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -8,3 +8,4 @@ CASE_SENSE_NAMES = NO
INPUT = example.cpp
EXAMPLE_PATH = example_test.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = file.h
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = func.h
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = group.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -7,3 +7,4 @@ CASE_SENSE_NAMES = NO
INPUT = include.cpp
EXAMPLE_PATH = example_test.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
PROJECT_NAME = "JavaDoc Style"
OUTPUT_DIRECTORY = jdstyle
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = jdstyle.cpp
QUIET = YES
PROJECT_NAME = "JavaDoc Style"
OUTPUT_DIRECTORY = jdstyle
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = jdstyle.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
PROJECT_NAME = "Member Grouping"
OUTPUT_DIRECTORY = memgrp
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = memgrp.cpp
QUIET = YES
PROJECT_NAME = "Member Grouping"
OUTPUT_DIRECTORY = memgrp
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = memgrp.cpp
QUIET = YES
DISTRIBUTE_GROUP_DOC = YES
JAVADOC_AUTOBRIEF = YES
......@@ -33,7 +33,8 @@ void Test::func1InGroup2() {}
*/
//@{
//! one description for all members of this group
//! one description for all members of this group
//! (because DISTRIBUTE_GROUP_DOC is YES in the config file)
#define A 1
#define B 2
void glob_func();
......
......@@ -7,3 +7,4 @@ CASE_SENSE_NAMES = NO
SORT_MEMBER_DOCS = NO
INPUT = overload.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = page.doc
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = par.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = qtstyle.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = relates.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = restypedef.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = structcmd.h
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -8,3 +8,4 @@ INPUT = tag.cpp
TAGFILES = example.tag
PERL_PATH = perl
QUIET = YES
JAVADOC_AUTOBRIEF = YES
......@@ -6,3 +6,4 @@ GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = templ.cpp
QUIET = YES
JAVADOC_AUTOBRIEF = YES
Name: doxygen
Version: 1.2.2
Version: 1.2.2-20001001
Summary: documentation system for C, C++ and IDL
Release: 1
Source0: doxygen-%{version}.src.tar.gz
......
......@@ -386,10 +386,13 @@ void ClassDef::insertMember(MemberDef *md)
functionMembers.append(md);
break;
case Private:
if (Config::sortMembersFlag)
functionMembers.inSort(md);
else
functionMembers.append(md);
if (Config::extractPrivateFlag)
{
if (Config::sortMembersFlag)
functionMembers.inSort(md);
else
functionMembers.append(md);
}
break;
}
break;
......
......@@ -58,6 +58,7 @@ class ClassDef : public Definition
const char *name,CompoundType ct,
const char *ref=0,const char *fName=0);
~ClassDef();
DefType definitionType() { return TypeClass; }
QCString getOutputFileBase() const { return fileName; }
QCString displayName() const;
CompoundType compoundType() const { return compType; }
......
/* This file was generated by configgen on Sun Sep 24 18:38:07 2000
/* This file was generated by configgen on Sun Oct 1 13:51:26 2000
* from config_templ.h
*
* DO NOT EDIT!
......@@ -60,7 +60,7 @@ struct Config
static bool hideScopeNames; // hide the name of the scope.
static bool verbatimHeaderFlag; // enable/disable generation of verb headers.
static bool showIncFileFlag; // show include file in file documentation?
static bool autoBriefFlag; // javadoc comments behaves as Qt comments.
static bool autoBriefFlag; // should javadoc comments behaves as Qt comments.
static bool inheritDocsFlag; // inheritance of documentation enabled?
static bool inlineInfoFlag; // show info about inline members?
static bool sortMembersFlag; // sort members alphabetically?
......
/* This file was generated by configgen on Sun Sep 24 18:38:07 2000
/* This file was generated by configgen on Sun Oct 1 13:51:26 2000
* from config_templ.l
*
* DO NOT EDIT!
......@@ -97,7 +97,7 @@ bool Config::caseSensitiveNames = TRUE;
bool Config::hideScopeNames = FALSE;
bool Config::verbatimHeaderFlag = TRUE;
bool Config::showIncFileFlag = TRUE;
bool Config::autoBriefFlag = TRUE;
bool Config::autoBriefFlag = FALSE;
bool Config::inheritDocsFlag = TRUE;
bool Config::inlineInfoFlag = TRUE;
bool Config::sortMembersFlag = TRUE;
......@@ -823,7 +823,7 @@ void Config::init()
Config::hideScopeNames = FALSE;
Config::verbatimHeaderFlag = TRUE;
Config::showIncFileFlag = TRUE;
Config::autoBriefFlag = TRUE;
Config::autoBriefFlag = FALSE;
Config::inheritDocsFlag = TRUE;
Config::inlineInfoFlag = TRUE;
Config::sortMembersFlag = TRUE;
......@@ -1015,8 +1015,8 @@ void writeTemplateConfig(QFile *f,bool sl)
t << "# information to generate all constant output in the proper language. \n";
t << "# The default language is English, other supported languages are: \n";
t << "# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, \n";
t << "# Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, and \n";
t << "# Portuguese.\n";
t << "# Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, \n";
t << "# Portuguese and Slovene.\n";
t << "\n";
}
t << "OUTPUT_LANGUAGE = ";
......@@ -1240,10 +1240,11 @@ void writeTemplateConfig(QFile *f,bool sl)
if (!sl)
{
t << "\n";
t << "# If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen \n";
t << "# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n";
t << "# will interpret the first line (until the first dot) of a JavaDoc-style \n";
t << "# comment as the brief description. If set to NO, the Javadoc-style will \n";
t << "# behave just like the Qt-style comments. \n";
t << "# comment as the brief description. If set to NO, the JavaDoc \n";
t << "# comments will behave just like the Qt-style comments (thus requiring an \n";
t << "# explict @brief command for a brief description. \n";
t << "\n";
}
t << "JAVADOC_AUTOBRIEF = ";
......
......@@ -32,27 +32,32 @@ class MemberDef;
class Definition
{
public:
/*! create a new definition */
/*! Types of derived classes */
enum DefType { TypeClass, TypeMember, TypeFile, TypeGroup, TypeNamespace };
/*! Use this for dynamic inspection of the derived class */
virtual DefType definitionType() = 0;
/*! Create a new definition */
Definition(
const char *defFileName,int defLine,
const char *name,const char *b=0,const char *d=0);
/*! destroys the definition */
/*! Destroys the definition */
virtual ~Definition();
/*! returns the name of the definition */
/*! Returns the name of the definition */
const QCString& name() const { return n; }
/*! returns the base name of the output file that contains this
/*! Returns the base name of the output file that contains this
* definition.
*/
virtual QCString getOutputFileBase() const = 0;
/*! Returns the name of the source listing of this file. */
const QCString sourceName() const { return getOutputFileBase()+"-source"; }
/*! returns the detailed description of this definition */
/*! Returns the detailed description of this definition */
const QCString& documentation() const { return doc; }
/*! returns the brief description of this definition */
/*! Returns the brief description of this definition */
const QCString& briefDescription() const { return brief; }
/*! sets a new \a name for the definition */
/*! Sets a new \a name for the definition */
void setName(const char *name) { n=name; }
/*! sets the documentation of this definition to \a d. */
/*! Sets the documentation of this definition to \a d. */
void setDocumentation(const char *d,bool stripWhiteSpace=TRUE)
{
if (stripWhiteSpace)
......@@ -60,11 +65,11 @@ class Definition
else
doc=d;
}
/*! sets the brief description of this definition to \a b.
/*! Sets the brief description of this definition to \a b.
* A dot is added to the sentence if not available.
*/
void setBriefDescription(const char *b);
/*! returns TRUE iff the definition is documented */
/*! Returns TRUE iff the definition is documented */
virtual bool hasDocumentation();
virtual bool isLinkableInProject() = 0;
virtual bool isLinkable() = 0;
......
......@@ -984,6 +984,11 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
}
}
<DocScan>(({B}*"\n"){2,}{B}*)?{CMD}"par"{B}* {
QCString t=yytext;
if (t.contains('\n')>1 && insideItemList)
{
forceEndItemList();
}
BEGIN(DocPar);
}
<DocPar>[^\n]*{BN} {
......
......@@ -1107,6 +1107,7 @@ static MemberDef *addVariableToClass(
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setDefinition(def);
md->setBitfields(root->bitfields);
md->addSectionsToDefinition(root->anchors);
md->setFromAnnonymousScope(fromAnnScope);
md->setFromAnnonymousMember(fromAnnMemb);
......@@ -2038,6 +2039,22 @@ static void transferRelatedFunctionDocumentation()
}
//----------------------------------------------------------------------
static void replaceNamespaceAliases(QCString &scope,int i)
{
//printf("replaceNamespaceAliases(%s,%d)\n",scope.data(),i);
while (i>0)
{
QCString *s = namespaceAliasDict[scope.left(i)];
if (s)
{
scope=*s+scope.right(scope.length()-i);
i=s->length();
}
i=scope.findRev("::",i-1);
}
//printf("replaceNamespaceAliases() result=%s\n",scope.data());
}
static bool findBaseClassRelation(Entry *root,ClassDef *cd,
BaseInfo *bi,
......@@ -2109,6 +2126,14 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
bool found=baseClass!=0 && baseClass!=cd;
NamespaceDef *nd=cd->getNamespaceDef();
if (!found && (i=baseClassName.findRev("::"))!=-1)
{
// replace any namespace aliases
replaceNamespaceAliases(baseClassName,i);
baseClass=getResolvedClass(baseClassName);
found=baseClass!=0 && baseClass!=cd;
}
if (!found)
{
FileDef *fd=cd->getFileDef();
......@@ -2148,7 +2173,6 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
}
if (!found && nd) // class is inside a namespace
{
//printf(" class %s inside namespace %s\n",cd->name().data(),nd->name().data());
NamespaceList *nl = nd->getUsedNamespaces();
QCString fName = nd->name()+"::"+baseClassName;
found = (baseClass=getResolvedClass(fName))!=0 && root->name!=fName;
......@@ -2264,18 +2288,21 @@ static void computeClassRelations(Entry *root)
if (
(
(
// is it a compound (class, struct, union, interface ...)
root->section & Entry::COMPOUND_MASK
)
||
(
// is it a documentation block with inheritance info.
(root->section & Entry::COMPOUNDDOC_MASK) && root->extends->count()>0
)
)
&&
!root->name.isEmpty()
!root->name.isEmpty() // sanity check
)
{
ClassDef *cd;
// strip any annonymous scopes first
QCString bName=stripAnnonymousNamespaceScope(root->name);
Debug::print(Debug::Classes,0," Class %s : \n",bName.data());
if ((cd=getClass(bName)))
......
......@@ -27,7 +27,7 @@ HEADERS = doxygen.h scanner.h doc.h classdef.h classlist.h memberdef.h \
translator_it.h formula.h debug.h membergroup.h htmlhelp.h \
translator_ru.h translator_pl.h dot.h rtfgen.h xml.h xml_dtd.h \
reflist.h page.h sortdict.h translator_hu.h translator_kr.h \
translator_ro.h
translator_ro.h translator_si.h
SOURCES = doxygen.cpp scanner.cpp doc.cpp classdef.cpp classlist.cpp \
memberdef.cpp membername.cpp index.cpp memberlist.cpp \
entry.cpp logos.cpp instdox.cpp message.cpp code.cpp \
......
......@@ -56,6 +56,7 @@ Entry::Entry(const Entry &e)
type = e.type.copy();
name = e.name.copy();
args = e.args.copy();
bitfields = e.bitfields.copy();
exception = e.exception.copy();
program = e.program.copy();
includeFile = e.includeFile.copy();
......@@ -197,6 +198,7 @@ void Entry::reset()
name.resize(0);
type.resize(0);
args.resize(0);
bitfields.resize(0);
exception.resize(0);
program.resize(0);
//body.resize(0);
......@@ -242,6 +244,7 @@ int Entry::getSize()
size+=type.length()+1;
size+=name.length()+1;
size+=args.length()+1;
size+=bitfields.length()+1;
size+=exception.length()+1;
size+=program.length()+1;
//size+=body.length()+1;
......
......@@ -162,8 +162,6 @@ class Entry
int section; // entry type (see Sections);
Protection protection; // class protection
//bool sig; // a Qt signal ?
//bool slot; // a Qt slot ?
MethodTypes mtype; // signal, slot or dcop method?
bool stat; // static ?
bool explicitExternal; // explicitly defined as external?
......@@ -176,6 +174,7 @@ class Entry
QCString type; // member type
QCString name; // member name
QCString args; // member argument string
QCString bitfields; // member's bit fields
ArgumentList *argList; // member arguments as a list
ArgumentList *tArgList; // template argument list
ArgumentList *mtArgList; // member template argument list
......@@ -183,8 +182,6 @@ class Entry
QCString memberSpec; // template specialization of the member
QCString program; // the program text
QCString initializer; // initial value (for variables)
int bodyLine; // line number of the definition in the source
int endBodyLine; // line number where the definition ends
QCString includeFile; // include file (2 arg of \class, must be unique)
QCString includeName; // include name (3 arg of \class)
QCString doc; // documentation block (partly parsed)
......@@ -192,6 +189,8 @@ class Entry
QCString brief; // brief description (doc block)
QCString inside; // name of the class in which documents are found
QCString exception; // throw specification
int bodyLine; // line number of the definition in the source
int endBodyLine; // line number where the definition ends
int mGrpId; // member group id
QList<Entry> *sublist; // entries that are children of this one
QList<BaseInfo> *extends; // list of base classes
......
......@@ -66,6 +66,7 @@ class FileDef : public Definition
FileDef(const char *p,const char *n,const char *ref=0);
~FileDef();
DefType definitionType() { return TypeFile; }
/*! Returns the unique file name (this may include part of the path). */
QCString name() const
......
......@@ -366,7 +366,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
}
}
defineMembers.countDocMembers();
defineMembers.countDocMembers(TRUE);
if (defineMembers.totalCount()>0 )
{
ol.writeRuler();
......@@ -376,7 +376,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
defineMembers.writeDocumentation(ol,name(),this);
}
protoMembers.countDocMembers();
protoMembers.countDocMembers(TRUE);
if (protoMembers.totalCount()>0 )
{
ol.writeRuler();
......@@ -386,7 +386,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
protoMembers.writeDocumentation(ol,name(),this);
}
typedefMembers.countDocMembers();
typedefMembers.countDocMembers(TRUE);
if (typedefMembers.totalCount()>0 )
{
ol.writeRuler();
......@@ -396,7 +396,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
typedefMembers.writeDocumentation(ol,name(),this);
}
enumMembers.countDocMembers();
enumMembers.countDocMembers(TRUE);
if (enumMembers.totalCount()>0 )
{
ol.writeRuler();
......@@ -406,17 +406,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name(),this);
}
//enumValMembers.countDocMembers();
//if (enumValMembers.totalCount()>0 )
//{
// ol.writeRuler();
// ol.startGroupHeader();
// parseText(ol,theTranslator->trEnumerationValueDocumentation());
// ol.endGroupHeader();
// enumValMembers.writeDocumentation(ol,name());
//}
funcMembers.countDocMembers();
funcMembers.countDocMembers(TRUE);
if (funcMembers.totalCount()>0 )
{
ol.writeRuler();
......@@ -426,7 +416,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
funcMembers.writeDocumentation(ol,name(),this);
}
varMembers.countDocMembers();
varMembers.countDocMembers(TRUE);
if (varMembers.totalCount()>0 )
{
ol.writeRuler();
......
......@@ -41,6 +41,7 @@ class GroupDef : public Definition
public:
GroupDef(const char *fileName,int line,const char *name,const char *title);
~GroupDef();
DefType definitionType() { return TypeGroup; }
QCString getOutputFileBase() const { return fileName; }
const char *groupTitle() const { return title; }
void addFile(const FileDef *def);
......
......@@ -29,6 +29,7 @@
#include "version.h"
#include "dot.h"
#include "language.h"
#include "htmlhelp.h"
#define GROUP_COLOR "#ff8080"
......@@ -157,6 +158,11 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
lastTitle=title;
if (fileName.right(5)!=".html") fileName+=".html";
startPlainFile(fileName);
if (Config::htmlHelpFlag)
{
HtmlHelp::getInstance()->addIndexFile(fileName);
}
lastFile = fileName;
if (header.isEmpty())
{
......
......@@ -287,9 +287,12 @@ void HtmlHelp::initialize()
"<param name=\"ImageType\" value=\"Folder\">\n"
"</OBJECT>\n"
"<UL>\n";
}
void HtmlHelp::createProjectFile()
{
/* Write the project file */
fName = Config::htmlOutputDir + "/index.hhp";
QCString fName = Config::htmlOutputDir + "/index.hhp";
QFile f(fName);
if (f.open(IO_WriteOnly))
{
......@@ -298,12 +301,23 @@ void HtmlHelp::initialize()
"Compatibility=1.1\n"
"Full-text search=Yes\n"
"Contents file=index.hhc\n"
"Default Window=indexHelp\n"
"Default Window=main\n"
"Default topic=index.html\n"
"Index file=index.hhk\n"
"Title=" << Config::projectName << endl << endl
<< "[FILES]\n"
"index.html";
"Title=" << Config::projectName << endl << endl;
t << "[WINDOWS]" << endl;
t << "main=\"" << Config::projectName << "\",\"index.hhc\","
"\"index.hhk\",\"index.html\",\"index.html\",,,,,0x23520,,"
"0x3006,,,,,,,,0" << endl << endl;
t << "[FILES]" << endl;
char *s = indexFiles.first();
while (s)
{
t << s << endl;
s=indexFiles.next();
}
f.close();
}
else
......@@ -312,6 +326,11 @@ void HtmlHelp::initialize()
}
}
void HtmlHelp::addIndexFile(const char *s)
{
indexFiles.append(s);
}
/*! Finalizes the HTML help. This will finish and close the
* contents file (index.hhc) and the index file (index.hhk).
* \sa initialize()
......@@ -331,6 +350,8 @@ void HtmlHelp::finalize()
kts.unsetDevice();
kf->close();
delete kf;
createProjectFile();
}
/*! Increase the level of the contents hierarchy.
......
......@@ -23,6 +23,7 @@
#include "qtbc.h"
#include <qtextstream.h>
#include <qstrlist.h>
class QFile;
class HtmlHelpIndex;
......@@ -45,12 +46,17 @@ class HtmlHelp
const char *anchor = 0);
void addIndexItem(const char *level1, const char *level2,
const char *ref, const char *anchor);
void addIndexFile(const char *name);
private:
void createProjectFile();
HtmlHelp();
QFile *cf,*kf;
QTextStream cts,kts;
HtmlHelpIndex *index;
int dc;
QStrList indexFiles;
static HtmlHelp *theInstance;
};
......
......@@ -34,6 +34,7 @@
#include "translator_hu.h"
#include "translator_kr.h"
#include "translator_ro.h"
#include "translator_si.h"
#endif
#define L_EQUAL(a) !stricmp(langName,a)
......@@ -115,6 +116,10 @@ bool setTranslator(const char *langName)
{
theTranslator=new TranslatorRomanian;
}
else if (L_EQUAL("slovene"))
{
theTranslator=new TranslatorSlovene;
}
#endif
else // use the default language (i.e. english)
{
......
......@@ -450,8 +450,15 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
{
Definition *d=0;
if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else if (gd) d=gd;
if (d==0) return;
ol.writeObjectLink(d->getReference(),d->getOutputFileBase(),anchor(),name());
if (d==0) { err("Member %s without group! Please report this bug!\n",name().data()); return; }
if (group!=0 && gd==0) // forward link to the group
{
ol.writeObjectLink(group->getReference(),group->getOutputFileBase(),anchor(),name());
}
else // local link
{
ol.writeObjectLink(d->getReference(),d->getOutputFileBase(),anchor(),name());
}
}
......@@ -689,19 +696,6 @@ void MemberDef::writeDeclaration(OutputList &ol,
// write name
if (!name().isEmpty() && name().at(0)!='@')
{
//if (grpId!=-1)
//{
// if (annMemb)
// {
// //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
// annMemb->writeLink(ol,cd,nd,fd,gd,inGroup ? memberGroup : 0);
// annMemb->annUsed=annUsed=TRUE;
// }
// else
// writeLink(ol,0,0,0,0,memberGroup);
// //ol.writeBoldString(name());
//}
//else
if (isLinkable())
{
if (annMemb)
......@@ -748,7 +742,11 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.docify(excpString());
}
if (!init.isEmpty() && initLines==0 && maxInitLines>0) // add initializer
if (!bitfields.isEmpty()) // add bitfields
{
linkifyText(TextGeneratorOLImpl(ol),cname,name(),bitfields.simplifyWhiteSpace());
}
else if (!init.isEmpty() && initLines==0 && maxInitLines>0) // add initializer
{
if (!isDefine())
{
......@@ -797,9 +795,15 @@ void MemberDef::writeDeclaration(OutputList &ol,
* all active output formats.
*/
void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
const char *scopeName,Definition *container)
const char *scopeName,
Definition *container
)
{
// hide global static functions unless extractStaticFlag is enabled
if (getClassDef()==0 && isStatic() && !Config::extractStaticFlag) return;
// hide member that are documented in their own group
if (group!=0 && container->definitionType()!=TypeGroup) return;
bool hasDocs = detailsAreVisible();
//printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition());
if (
......@@ -996,7 +1000,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (protection()==Protected) sl.append("protected");
else if (protection()==Private) sl.append("private");
if (lvirt==Virtual) sl.append("virtual");
else if (lvirt==Pure) sl.append("pure virtual");
else if (lvirt==Pure) sl.append("pure virtual");
if (isSignal()) sl.append("signal");
if (isSlot()) sl.append("slot");
}
......
......@@ -73,6 +73,7 @@ class MemberDef : public Definition
bool related,MemberType t,const ArgumentList *tal,
const ArgumentList *al);
~MemberDef();
DefType definitionType() { return TypeMember; }
QCString getOutputFileBase() const;
const char *declaration() const { return decl; }
......@@ -80,6 +81,7 @@ class MemberDef : public Definition
const char *typeString() const { return type; }
const char *argsString() const { return args; }
const char *excpString() const { return exception; }
const char *bitfieldString() const { return bitfields; }
QCString anchor() const;
const QCString &initializer() const { return init; }
int initializerLines() const { return initLines; }
......@@ -133,6 +135,7 @@ class MemberDef : public Definition
init=init.stripWhiteSpace();
initLines=init.contains('\n');
}
void setBitfields(const char *s) { bitfields = s; }
void setMaxInitLines(int lines) { if (lines!=-1) maxInitLines=lines; }
void setMemberClass(ClassDef *cd) { classDef=cd; }
void setSectionList(MemberList *sl) { section=sl; }
......@@ -231,6 +234,7 @@ class MemberDef : public Definition
NamespaceDef *nspace; // the namespace this member is in.
QCString type; // return type
QCString args; // function arguments/variable array specifiers
QCString bitfields; // struct member bitfields
QCString exception; // exceptions that can be thrown
QCString init; // initializer
int initLines; // number of lines in the initializer
......
......@@ -110,7 +110,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe
//printf("MemberList::countDecMembers(%d)=%d\n",inGroup,m_count);
}
void MemberList::countDocMembers()
void MemberList::countDocMembers(bool listOfGroup)
{
/*varCnt=funcCnt=enumCnt=enumValCnt=typeCnt=protoCnt=defCnt=friendCnt=0;*/
m_count=0;
......@@ -122,7 +122,9 @@ void MemberList::countDocMembers()
bool visibleIfStatic =
!(md->getClassDef()==0 && md->isStatic() && !Config::extractStaticFlag);
if (visibleIfStatic &&
bool inOwnGroup = (md->getGroupDef()!=0 && !listOfGroup);
if (visibleIfStatic && !inOwnGroup &&
(Config::extractAllFlag || md->detailsAreVisible())
)
{
......@@ -298,6 +300,9 @@ void MemberList::writePlainDeclarations(OutputList &ol,
typeDecl.writeChar(' ');
}
const uint MAX_ENUM_VALUES_FOR_ONE_LINE = 4;
int enumMemCount=0;
typeDecl.docify("{ ");
QList<MemberDef> *fmdl=md->enumFieldList();
if (fmdl)
......@@ -305,12 +310,17 @@ void MemberList::writePlainDeclarations(OutputList &ol,
MemberDef *fmd=fmdl->first();
while (fmd)
{
/* in html we start each enum item on a new line */
typeDecl.pushGeneratorState();
typeDecl.disableAllBut(OutputGenerator::Html);
typeDecl.lineBreak();
typeDecl.writeString("&nbsp;&nbsp;");
typeDecl.popGeneratorState();
/* in html we start a new line after a number of items */
if (fmdl->count()>MAX_ENUM_VALUES_FOR_ONE_LINE
&& (enumMemCount%MAX_ENUM_VALUES_FOR_ONE_LINE)==0
)
{
typeDecl.pushGeneratorState();
typeDecl.disableAllBut(OutputGenerator::Html);
typeDecl.lineBreak();
typeDecl.writeString("&nbsp;&nbsp;");
typeDecl.popGeneratorState();
}
if (fmd->hasDocumentation()) // enum value has docs
{
......@@ -334,12 +344,16 @@ void MemberList::writePlainDeclarations(OutputList &ol,
typeDecl.disable(OutputGenerator::Man);
typeDecl.writeString("\n"); // to prevent too long lines in LaTeX
typeDecl.enable(OutputGenerator::Man);
enumMemCount++;
}
}
typeDecl.pushGeneratorState();
typeDecl.disableAllBut(OutputGenerator::Html);
typeDecl.lineBreak();
typeDecl.popGeneratorState();
if (fmdl->count()>MAX_ENUM_VALUES_FOR_ONE_LINE)
{
typeDecl.pushGeneratorState();
typeDecl.disableAllBut(OutputGenerator::Html);
typeDecl.lineBreak();
typeDecl.popGeneratorState();
}
typeDecl.docify(" }");
md->setEnumDecl(typeDecl);
int enumVars=0;
......
......@@ -42,7 +42,7 @@ class MemberList : public QList<MemberDef>
int defineCount() const { return defCnt; }
int friendCount() const { return friendCnt; }
void countDecMembers(bool inGroup,bool countSubGroups,bool sectionPerType);
void countDocMembers();
void countDocMembers(bool listOfGroup=FALSE);
int totalCount() const
{ return //varCnt+funcCnt+enumCnt+enumValCnt+typeCnt+
//protoCnt+defCnt+friendCnt;
......
......@@ -39,6 +39,7 @@ class NamespaceDef : public Definition
NamespaceDef(const char *defFileName,int defLine,
const char *name,const char *ref=0);
~NamespaceDef();
DefType definitionType() { return TypeNamespace; }
QCString getOutputFileBase() const { return fileName; }
void insertUsedFile(const char *fname);
void writeDocumentation(OutputList &ol);
......
......@@ -49,10 +49,13 @@ class PageSDict : public SDict<PageInfo>
}
};
class PageSDictIterator : public SDict<PageInfo>::Iterator
// typedef is to get around Solaris compile problem
typedef SDict<PageInfo>::Iterator _SDictPageInfoIterator;
class PageSDictIterator : public _SDictPageInfoIterator
{
public:
PageSDictIterator(const PageSDict &d) : SDict<PageInfo>::Iterator(d) {}
PageSDictIterator(const PageSDict &d) : _SDictPageInfoIterator(d) {}
~PageSDictIterator() {}
};
......@@ -488,14 +488,14 @@ bool StyleData::setStyle(const char* s, const char* styleName)
if (start < 0)
{
err("Style sheet '%s' contains no '\\s' clause.\n{%s}\n", styleName, s);
return false;
return FALSE;
}
s += start;
index = (int)atol(s + 2); ASSERT(index > 0);
// search for the end of pure formatting codes
const char* end = s + len;
bool haveNewDefinition = true;
bool haveNewDefinition = TRUE;
for(;;)
{
if (*end == '{')
......@@ -518,7 +518,7 @@ bool StyleData::setStyle(const char* s, const char* styleName)
}
else if (*end == 0)
{ // no style-definition part, keep default value
haveNewDefinition = false;
haveNewDefinition = FALSE;
break;
}
else // plain name without leading \\snext
......@@ -534,7 +534,7 @@ bool StyleData::setStyle(const char* s, const char* styleName)
definition = new char[size];
memcpy(definition, end, size);
}
return true;
return TRUE;
}
static void loadStylesheet(const char *name, QDict<StyleData>& dict)
......@@ -591,7 +591,7 @@ void RTFGenerator::init()
err("Could not create output directory %s\n",dir.data());
exit(1);
}
Rtf_Style.setAutoDelete(true);
Rtf_Style.setAutoDelete(TRUE);
// first duplicate strings of Rtf_Style_Default
const struct Rtf_Style_Default* def = Rtf_Style_Default;
......
......@@ -339,6 +339,7 @@ TITLE [tT][iI][tT][lL][eE]
%x Bases
%x BasesProt
%x NextSemi
%x BitFields
%x FindMembers
%x FindMemberName
%x FindFields
......@@ -501,7 +502,7 @@ TITLE [tT][iI][tT][lL][eE]
--curlyCount ;
}
else
BEGIN( NextSemi ) ;
BEGIN( NextSemi );
}
<NextSemi>"'"\\[0-7]{1,3}"'"
<NextSemi>"'"\\."'"
......@@ -512,8 +513,12 @@ TITLE [tT][iI][tT][lL][eE]
}
<NextSemi>[;,] {
unput(*yytext);
BEGIN( FindMembers ) ;
BEGIN( FindMembers );
}
<BitFields>[;,] {
unput(*yytext);
BEGIN( FindMembers );
}
<FindMembers>{B}*"k_dcop"{BN}*":"{BN}* { current->mtype = mtype = DCOP;
current->protection = protection = Public ;
current->type.resize(0);
......@@ -779,7 +784,16 @@ TITLE [tT][iI][tT][lL][eE]
BEGIN( NSAliasArg );
}
<NSAliasArg>({ID}"::")*{ID} {
namespaceAliasDict.insert(aliasName,new QCString(yytext));
printf("Inserting namespace alias %s::%s->%s\n",current_root->name.data(),aliasName.data(),yytext);
if (current_root->name.isEmpty())
{
namespaceAliasDict.insert(aliasName,new QCString(yytext));
}
else
{
namespaceAliasDict.insert(current_root->name+"::"+aliasName,
new QCString(current_root->name+"::"+yytext));
}
}
<NSAliasArg>";" {
BEGIN( FindMembers );
......@@ -997,7 +1011,7 @@ TITLE [tT][iI][tT][lL][eE]
<DefineEnd>.
<FindMembers>[*&]+ { current->name += yytext ; }
<FindMembers,MemberSpec,Function,NextSemi,ReadInitializer>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
<FindMembers,MemberSpec,Function,NextSemi,BitFields,ReadInitializer>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
lineCount();
if (current->bodyLine==-1)
current->bodyLine=yyLineNr;
......@@ -1019,7 +1033,7 @@ TITLE [tT][iI][tT][lL][eE]
BEGIN(AfterDoc);
}
}
<MemberSpec,FindFields,FindMembers,NextSemi,ReadInitializer>","{BN}*("/**"|"//!"|"/*!"|"///")"<" {
<MemberSpec,FindFields,FindMembers,NextSemi,BitFields,ReadInitializer>","{BN}*("/**"|"//!"|"/*!"|"///")"<" {
lineCount();
lastAfterDocContext = YY_START;
afterDocTerminator = ',';
......@@ -1043,7 +1057,10 @@ TITLE [tT][iI][tT][lL][eE]
lineCount();
lastAfterDocContext = YY_START;
if (YY_START==DefineEnd)
{
afterDocTerminator = '\n';
yyLineNr--;
}
else
afterDocTerminator = 0;
if (yytext[yyleng-3]=='/')
......@@ -1241,59 +1258,54 @@ TITLE [tT][iI][tT][lL][eE]
yyLineNr++;
*pCopyCurlyString+=*yytext;
}
<FindMembers>[:;,] {
<FindMembers>":" {
BEGIN(BitFields);
current->bitfields+=":";
}
<BitFields>. {
current->bitfields+=*yytext;
}
<FindMembers>[;,] {
QCString oldType = current->type.copy();
QCString oldDocs = current->doc.copy();
if ( *yytext != ':')
if (current->bodyLine==-1)
{
if (current->bodyLine==-1)
{
current->bodyLine = yyLineNr;
}
current->type=current->type.simplifyWhiteSpace();
current->args=current->args.simplifyWhiteSpace();
current->name=current->name.stripWhiteSpace();
if (!current->name.isEmpty() && current->type.left(8)=="typedef ")
{
// add typedef to dictionary
QCString dest = extractName(current->type.right(current->type.length()-8));
if (typedefDict[current->name]==0 && !dest.isEmpty())
{
//printf("1>>>>>>>>>> adding %s->%s\n",current->name.data(),dest.data());
typedefDict.insert(current->name, new QCString(dest));
}
}
current->section = Entry::VARIABLE_SEC ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
//printf("New variable type=`%s' name=`%s' groupId=%d\n",current->type.data(),current->name.data(),current->mGrpId);
current_root->addSubEntry( current ) ;
current = new Entry ;
// variable found
current->section = Entry::EMPTY_SEC ;
current->protection = protection;
current->mtype = Method;
current->virt = Normal;
current->stat = gstat;
current->mGrpId = memberGroupId;
current->bodyLine = yyLineNr;
}
// skip expression or bitfield if needed
if ( *yytext == ':')
{
BEGIN( NextSemi );
current->type=current->type.simplifyWhiteSpace();
current->args=current->args.simplifyWhiteSpace();
current->name=current->name.stripWhiteSpace();
if (!current->name.isEmpty() && current->type.left(8)=="typedef ")
{
// add typedef to dictionary
QCString dest = extractName(current->type.right(current->type.length()-8));
if (typedefDict[current->name]==0 && !dest.isEmpty())
{
//printf("1>>>>>>>>>> adding %s->%s\n",current->name.data(),dest.data());
typedefDict.insert(current->name, new QCString(dest));
}
}
else
current->section = Entry::VARIABLE_SEC ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
//printf("New variable type=`%s' name=`%s' groupId=%d\n",current->type.data(),current->name.data(),current->mGrpId);
current_root->addSubEntry( current ) ;
current = new Entry ;
// variable found
current->section = Entry::EMPTY_SEC ;
current->protection = protection;
current->mtype = Method;
current->virt = Normal;
current->stat = gstat;
current->mGrpId = memberGroupId;
if ( *yytext == ',' )
{
if ( *yytext == ',' )
{
int i=oldType.length();
while (i>0 && (oldType[i-1]=='*' || oldType[i-1]==' ')) i--;
current->type = oldType.left(i);
current->doc = oldDocs;
}
BEGIN( FindMembers ) ;
int i=oldType.length();
while (i>0 && (oldType[i-1]=='*' || oldType[i-1]==' ')) i--;
current->type = oldType.left(i);
current->doc = oldDocs;
}
BEGIN( FindMembers ) ;
}
<FindMembers>"[" {
......@@ -2661,7 +2673,7 @@ TITLE [tT][iI][tT][lL][eE]
lastDocRelContext = YY_START;
BEGIN( ClassDocRelates );
}
<ClassDocRelates>{ID} {
<ClassDocRelates>({ID}"::")*{ID} {
current->relates = yytext;
BEGIN( lastDocRelContext );
}
......
This diff is collapsed.
......@@ -1922,7 +1922,8 @@ bool getScopeDefs(const char *docScope,const char *scope,
* with name memberName.
* 3) "memberName(...)" a specific (overloaded) function or define
* with name memberName
* 4) "::memberName a non-function member or define
* 4) "::name a global variable or define
* 4) "#memberName member variable, global variable or define
* 5) ("ScopeName::")+"memberName()"
* 6) ("ScopeName::")+"memberName(...)"
* 7) ("ScopeName::")+"memberName"
......@@ -1934,7 +1935,9 @@ bool generateRef(OutputList &ol,const char *scName,
{
//printf("generateRef(scName=%s,name=%s,rt=%s)\n",scName,name,rt);
QCString tmpName = substitute(name,"#","::");
QCString tsName = name;
bool memberScopeFirst = tsName.find('#')!=-1;
QCString tmpName = substitute(tsName,"#","::");
QCString linkText = rt;
int scopePos=tmpName.findRev("::");
int bracePos=tmpName.findRev('('); // reverse is needed for operator()(...)
......@@ -2021,7 +2024,8 @@ bool generateRef(OutputList &ol,const char *scName,
// scopeStr.data(),nameStr.data(),argsStr.data());
// check if nameStr is a member or global.
if (getDefs(scopeStr,nameStr,argsStr,md,cd,fd,nd,gd,scopePos==0))
if (getDefs(scopeStr,nameStr,argsStr,md,cd,fd,nd,gd,
scopePos==0 && !memberScopeFirst))
{
//printf("after getDefs nd=%p\n",nd);
QCString anchor;
......@@ -2118,6 +2122,7 @@ bool generateRef(OutputList &ol,const char *scName,
bool generateLink(OutputList &ol,const char *clName,
const char *lr,bool inSeeBlock,const char *lt)
{
//printf("generateLink clName=`%s' lr=`%s' lt=`%s'\n",clName,lr,lt);
QCString linkRef=lr;
FileDef *fd;
GroupDef *gd;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment