Commit ce05925c authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.3.6-20040307

parent f13d78d4
DOXYGEN Version 1.3.6-20040222 DOXYGEN Version 1.3.6-20040307
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (22 February 2004) Dimitri van Heesch (07 March 2004)
DOXYGEN Version 1.3.6_20040222 DOXYGEN Version 1.3.6_20040307
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (22 February 2004) Dimitri van Heesch (dimitri@stack.nl) (07 March 2004)
1.3.6-20040222 1.3.6-20040307
...@@ -109,6 +109,7 @@ documentation: ...@@ -109,6 +109,7 @@ documentation:
\refitem cmdparam \\param \refitem cmdparam \\param
\refitem cmdpost \\post \refitem cmdpost \\post
\refitem cmdpre \\pre \refitem cmdpre \\pre
\refitem cmdproperty \\property
\refitem cmdref \\ref \refitem cmdref \\ref
\refitem cmdrelates \\relates \refitem cmdrelates \\relates
\refitem cmdrelatesalso \\relatesalso \refitem cmdrelatesalso \\relatesalso
...@@ -539,6 +540,16 @@ See section \ref memgroup for an example. ...@@ -539,6 +540,16 @@ See section \ref memgroup for an example.
\ref cmdsubsection "\\subsection", and section \ref cmdsubsection "\\subsection", and section
\ref cmdref "\\ref". \ref cmdref "\\ref".
<hr>
\section cmdproperty \property (qualified property name)
\addindex \\property
Indicates that a comment block contains documentation for a
property (either global or as a member of a class).
This command is equivalent to \\var and \\fn.
\sa section \ref cmdfn "\\fn" and \ref cmdvar "\\var".
<hr> <hr>
\section cmdrelates \relates <name> \section cmdrelates \relates <name>
......
...@@ -92,6 +92,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -92,6 +92,7 @@ followed by the descriptions of the tags grouped by category.
\refitem cfg_extra_packages EXTRA_PACKAGES \refitem cfg_extra_packages EXTRA_PACKAGES
\refitem cfg_extract_all EXTRACT_ALL \refitem cfg_extract_all EXTRACT_ALL
\refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES \refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES
\refitem cfg_extract_local_methods EXTRACT_LOCAL_METHODS
\refitem cfg_extract_private EXTRACT_PRIVATE \refitem cfg_extract_private EXTRACT_PRIVATE
\refitem cfg_extract_static EXTRACT_STATIC \refitem cfg_extract_static EXTRACT_STATIC
\refitem cfg_file_patterns FILE_PATTERNS \refitem cfg_file_patterns FILE_PATTERNS
...@@ -467,6 +468,14 @@ followed by the descriptions of the tags grouped by category. ...@@ -467,6 +468,14 @@ followed by the descriptions of the tags grouped by category.
If set to NO only classes defined in header files are included. Does not If set to NO only classes defined in header files are included. Does not
have any effect for Java sources. have any effect for Java sources.
\anchor cfg_extract_local_methods
<dt>\c EXTRACT_LOCAL_METHODS <dd>
\addindex EXTRACT_LOCAL_METHODS
This flag is only useful for Objective-C code. When set to \c YES local
methods, which are defined in the implementation section but not in
the interface are included in the documentation.
If set to \c NO (the default) only methods in the interface are included.
\anchor cfg_hide_undoc_members \anchor cfg_hide_undoc_members
<dt>\c HIDE_UNDOC_MEMBERS <dd> <dt>\c HIDE_UNDOC_MEMBERS <dd>
\addindex HIDE_UNDOC_MEMBERS \addindex HIDE_UNDOC_MEMBERS
......
...@@ -105,6 +105,14 @@ int IntegerVariable; ...@@ -105,6 +105,14 @@ int IntegerVariable;
/*@}*/ /*@}*/
\endverbatim \endverbatim
The \ref cmdref "\\ref" command can be used to refer to a group.
The first argument of the \\ref command should be group's label.
To use a custom link name, you can put the name of the links in
double quotes after the label, as shown by the following example
\verbatim
This is the \ref group_label "link" to this group.
\endverbatim
The priorities of grouping definitions are (from highest to lowest): The priorities of grouping definitions are (from highest to lowest):
\ref cmdingroup "\\ingroup", \ref cmddefgroup "\\defgroup", \ref cmdingroup "\\ingroup", \ref cmddefgroup "\\defgroup",
\ref cmdaddtogroup "\\addtogroup", \ref cmdweakgroup "\\weakgroup". \ref cmdaddtogroup "\\addtogroup", \ref cmdweakgroup "\\weakgroup".
......
...@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other ...@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
than English (the default). The output language is chosen through the than English (the default). The output language is chosen through the
configuration file (with default name and known as Doxyfile). configuration file (with default name and known as Doxyfile).
Currently (version 1.3.6), 28 languages Currently (version 1.3.6-20040222), 28 languages
are supported (sorted alphabetically): are supported (sorted alphabetically):
Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian,
Czech, Danish, Dutch, English, Finnish, French, German, Greek, Czech, Danish, Dutch, English, Finnish, French, German, Greek,
......
...@@ -1266,7 +1266,7 @@ class TrManager: ...@@ -1266,7 +1266,7 @@ class TrManager:
self.numLang -= 1 # the couple will be counted as one self.numLang -= 1 # the couple will be counted as one
# Extract the version of Doxygen. # Extract the version of Doxygen.
f = file(os.path.join(self.doxy_path, 'version')) f = file(os.path.join(self.doxy_path, 'VERSION'))
self.doxVersion = f.readline().strip() self.doxVersion = f.readline().strip()
f.close() f.close()
......
Summary: A documentation system for C/C++. Summary: A documentation system for C/C++.
Name: doxygen Name: doxygen
Version: 1.3.6_20040222 Version: 1.3.6_20040307
Release: 1 Release: 1
Epoch: 1 Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
...@@ -1371,10 +1371,10 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -1371,10 +1371,10 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write the list of used files (not for man pages) // write the list of used files (not for man pages)
ol.pushGeneratorState(); ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
if (Config_getBool("SHOW_USED_FILES")) if (Config_getBool("SHOW_USED_FILES"))
{ {
ol.disable(OutputGenerator::Man);
ol.writeRuler(); ol.writeRuler();
ol.parseText(theTranslator->trGeneratedFromFiles( ol.parseText(theTranslator->trGeneratedFromFiles(
m_isObjC && m_compType==Interface ? Class : m_compType, m_isObjC && m_compType==Interface ? Class : m_compType,
...@@ -1633,7 +1633,7 @@ void ClassDef::writeMemberList(OutputList &ol) ...@@ -1633,7 +1633,7 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.writeString("<td>"); ol.writeString("<td>");
} }
if ( if (
(prot!=Public || virt!=Normal || (prot!=Public || (virt!=Normal && !m_isObjC) ||
md->isFriend() || md->isRelated() || md->isExplicit() || md->isFriend() || md->isRelated() || md->isExplicit() ||
md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) || md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) ||
md->isSignal() || md->isSlot() || md->isSignal() || md->isSlot() ||
...@@ -1655,7 +1655,8 @@ void ClassDef::writeMemberList(OutputList &ol) ...@@ -1655,7 +1655,8 @@ void ClassDef::writeMemberList(OutputList &ol)
if (prot==Protected) sl.append("protected"); if (prot==Protected) sl.append("protected");
else if (prot==Private) sl.append("private"); else if (prot==Private) sl.append("private");
else if (prot==Package) sl.append("package"); else if (prot==Package) sl.append("package");
if (virt==Virtual) sl.append("virtual"); if (virt==Virtual &&
!m_isObjC) sl.append("virtual");
else if (virt==Pure) sl.append("pure virtual"); else if (virt==Pure) sl.append("pure virtual");
if (md->isStatic()) sl.append("static"); if (md->isStatic()) sl.append("static");
if (md->isSignal()) sl.append("signal"); if (md->isSignal()) sl.append("signal");
...@@ -2572,7 +2573,7 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName, ...@@ -2572,7 +2573,7 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName,
ClassDef *templateClass=m_templateInstances->find(templSpec); ClassDef *templateClass=m_templateInstances->find(templSpec);
if (templateClass==0) if (templateClass==0)
{ {
Debug::print(Debug::Classes,0," New template instance class %s%s\n",name().data(),templSpec.data()); Debug::print(Debug::Classes,0," New template instance class `%s'`%s'\n",name().data(),templSpec.data());
templateClass = new ClassDef( templateClass = new ClassDef(
fileName,startLine,name()+templSpec,ClassDef::Class); fileName,startLine,name()+templSpec,ClassDef::Class);
templateClass->setTemplateMaster(this); templateClass->setTemplateMaster(this);
......
...@@ -103,6 +103,8 @@ static int g_lastVerbStringContext; ...@@ -103,6 +103,8 @@ static int g_lastVerbStringContext;
static int g_memCallContext; static int g_memCallContext;
static int g_lastCContext; static int g_lastCContext;
static bool g_insideObjC;
//------------------------------------------------------------------- //-------------------------------------------------------------------
/*! Represents a stack of variable to class mappings as found in the /*! Represents a stack of variable to class mappings as found in the
...@@ -860,6 +862,8 @@ static bool generateClassMemberLink(BaseCodeDocInterface &ol,ClassDef *mcd,const ...@@ -860,6 +862,8 @@ static bool generateClassMemberLink(BaseCodeDocInterface &ol,ClassDef *mcd,const
if (xd) if (xd)
{ {
//printf("g_currentDefiniton=%p g_currentMemberDef=%p xmd=%p g_insideBody=%d\n",g_currentDefinition,g_currentMemberDef,xmd,g_insideBody);
// add usage reference // add usage reference
if (g_currentDefinition && g_currentMemberDef && if (g_currentDefinition && g_currentMemberDef &&
xmd!=g_currentMemberDef && g_insideBody) xmd!=g_currentMemberDef && g_insideBody)
...@@ -1080,7 +1084,7 @@ TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" ...@@ -1080,7 +1084,7 @@ TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID}) SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+ SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+
KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol") KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol")
KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|KEYWORD_OBJC) KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"self"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|KEYWORD_OBJC)
FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"for"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while") FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"for"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while")
TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"boolean"|"id"|"SEL") TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"boolean"|"id"|"SEL")
...@@ -1106,6 +1110,12 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1106,6 +1110,12 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
%x ReadInclude %x ReadInclude
%x TemplDecl %x TemplDecl
%x CallEnd %x CallEnd
%x ObjCMethod
%x ObjCParams
%x ObjCParamType
%x ObjCMemberCall
%x ObjCMemberCall2
%x ObjCMemberCall3
%% %%
...@@ -1115,7 +1125,15 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1115,7 +1125,15 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_code->codify(yytext); g_code->codify(yytext);
BEGIN( ReadInclude ); BEGIN( ReadInclude );
} }
<Body>("class"|"struct"|"union"|"namespace"|"@interface"|"@implementation"|"@interface")[ \t\n]+ { <Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ {
g_insideObjC=TRUE;
startFontClass("keyword");
codifyLines(yytext);
endFontClass();
if (!g_insideTemplate)
BEGIN( ClassName );
}
<Body>("class"|"struct"|"union"|"namespace")[ \t\n]+ {
startFontClass("keyword"); startFontClass("keyword");
codifyLines(yytext); codifyLines(yytext);
endFontClass(); endFontClass();
...@@ -1128,6 +1146,63 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1128,6 +1146,63 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
endFontClass(); endFontClass();
BEGIN( PackageName ); BEGIN( PackageName );
} }
<Body,ClassVar>"-"|"+" {
if (!g_insideObjC)
{
g_code->codify(yytext);
}
else // Start of Objective-C method
{
//printf("Method!\n");
g_code->codify(yytext);
BEGIN(ObjCMethod);
}
}
<ObjCMethod>":" {
g_code->codify(yytext);
BEGIN(ObjCParams);
}
<ObjCParams>"(" {
g_code->codify(yytext);
BEGIN(ObjCParamType);
}
<ObjCParams,ObjCMethod>";"|"{" {
g_code->codify(yytext);
if (*yytext=='{')
{
g_insideBody=TRUE;
}
BEGIN(Body);
}
<ObjCParams>{ID}{B}*":" {
g_code->codify(yytext);
}
<ObjCParamType>{TYPEKW} {
startFontClass("keywordtype");
g_code->codify(yytext);
endFontClass();
g_parmType=yytext;
}
<ObjCParamType>{ID} {
g_code->codify(yytext);
g_parmType=yytext;
}
<ObjCParamType>")" {
g_code->codify(yytext);
BEGIN(ObjCParams);
}
<ObjCParams>{ID} {
g_code->codify(yytext);
g_parmName=yytext;
g_theVarContext.addVariable(g_parmType,g_parmName);
g_parmType.resize(0);g_parmName.resize(0);
}
<ObjCMethod,ObjCParams,ObjCParamType>. {
g_code->codify(yytext);
}
<ObjCMethod,ObjCParams,ObjCParamType>\n {
codifyLines(yytext);
}
<ReadInclude>[^\n\"\>]+/(">"|"\"") { <ReadInclude>[^\n\"\>]+/(">"|"\"") {
//FileInfo *f; //FileInfo *f;
bool ambig; bool ambig;
...@@ -1239,6 +1314,18 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1239,6 +1314,18 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
BEGIN(Body); BEGIN(Body);
} }
<Body>"@end" { <Body>"@end" {
//printf("End of objc scope fd=%s\n",g_sourceFileDef->name().data());
if (g_sourceFileDef)
{
FileDef *fd=g_sourceFileDef;
g_insideObjC = fd->name().lower().right(2)==".m" ||
fd->name().lower().right(3)==".mm";
//printf("insideObjC=%d\n",g_insideObjC);
}
else
{
g_insideObjC = FALSE;
}
g_theVarContext.popScope(); g_theVarContext.popScope();
int *scope = g_scopeStack.pop(); int *scope = g_scopeStack.pop();
...@@ -1458,7 +1545,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1458,7 +1545,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_theCallContext.popScope(); g_theCallContext.popScope();
} }
} }
<Body,TemplDecl>{TYPEKW}/{B}* { <Body,TemplDecl,ObjCMethod>{TYPEKW}/{B}* {
startFontClass("keywordtype"); startFontClass("keywordtype");
g_code->codify(yytext); g_code->codify(yytext);
endFontClass(); endFontClass();
...@@ -1516,7 +1603,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1516,7 +1603,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_name+=yytext; g_name+=yytext;
BEGIN( FuncCall ); BEGIN( FuncCall );
} }
<FuncCall,Body,MemberCall,MemberCall2>\" { <FuncCall,Body,MemberCall,MemberCall2,ObjCMemberCall2,ObjCMemberCall3>\" {
startFontClass("stringliteral"); startFontClass("stringliteral");
g_code->codify(yytext); g_code->codify(yytext);
g_lastStringContext=YY_START; g_lastStringContext=YY_START;
...@@ -1638,27 +1725,82 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1638,27 +1725,82 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
BEGIN(g_memCallContext); BEGIN(g_memCallContext);
} }
<Body>[,=;\[] { <Body>[,=;\[] {
g_code->codify(yytext); if (g_insideObjC && *yytext=='[')
g_saveName = g_name.copy(); {
g_saveType = g_type.copy(); //printf("Found start of ObjC call!\n");
if (!g_type.isEmpty()) // start of a method call
g_code->codify(yytext);
g_theCallContext.pushScope();
BEGIN(ObjCMemberCall);
}
else
{ {
if (g_scopeStack.top()!=CLASSBLOCK) g_code->codify(yytext);
g_saveName = g_name.copy();
g_saveType = g_type.copy();
if (!g_type.isEmpty())
{
if (g_scopeStack.top()!=CLASSBLOCK)
{
g_theVarContext.addVariable(g_type,g_name);
}
g_name.resize(0);
}
if (*yytext==';')
{ {
g_theVarContext.addVariable(g_type,g_name); g_type.resize(0);
g_name.resize(0);
} }
g_name.resize(0); else if (*yytext=='[')
{
g_theCallContext.pushScope();
}
g_args.resize(0);
} }
if (*yytext==';') }
<ObjCMemberCall>{ID} {
if (strcmp(yytext,"self")==0 || strcmp(yytext,"super")==0)
{ {
g_type.resize(0); // TODO: get proper base class for "super"
g_name.resize(0); g_theCallContext.setClass(getClass(g_curClassName));
startFontClass("keyword");
g_code->codify(yytext);
endFontClass();
} }
else if (*yytext=='[') else
{ {
generateClassOrGlobalLink(*g_code,yytext);
}
g_name.resize(0);
BEGIN(ObjCMemberCall2);
}
<ObjCMemberCall>"[" {
g_code->codify(yytext);
g_theCallContext.pushScope(); g_theCallContext.pushScope();
}
<ObjCMemberCall2>{ID}":"? {
g_name+=yytext;
if (g_theCallContext.getClass())
{
//printf("Calling method %s\n",g_name.data());
if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),g_name))
{
g_code->codify(yytext);
addToSearchIndex(g_name);
}
} }
g_args.resize(0); else
{
g_code->codify(yytext);
addToSearchIndex(g_name);
}
g_name.resize(0);
BEGIN(ObjCMemberCall3);
}
<ObjCMemberCall2,ObjCMemberCall3>"]" {
g_theCallContext.popScope();
g_code->codify(yytext);
BEGIN(Body);
} }
<Body>"]" { <Body>"]" {
g_theCallContext.popScope(); g_theCallContext.popScope();
...@@ -2215,6 +2357,8 @@ void parseCode(BaseCodeDocInterface &od,const char *className,const QCString &s, ...@@ -2215,6 +2357,8 @@ void parseCode(BaseCodeDocInterface &od,const char *className,const QCString &s,
if (fd) if (fd)
{ {
setCurrentDoc(fd->name(),fd->getSourceFileBase()); setCurrentDoc(fd->name(),fd->getSourceFileBase());
g_insideObjC = fd->name().lower().right(2)==".m" ||
fd->name().lower().right(3)==".mm";
} }
g_currentDefinition = 0; g_currentDefinition = 0;
g_currentMemberDef = 0; g_currentMemberDef = 0;
......
...@@ -112,6 +112,8 @@ void replaceComment(int offset); ...@@ -112,6 +112,8 @@ void replaceComment(int offset);
%} %}
CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
%option noyywrap %option noyywrap
%x Scan %x Scan
...@@ -123,13 +125,16 @@ void replaceComment(int offset); ...@@ -123,13 +125,16 @@ void replaceComment(int offset);
%% %%
<Scan>[^\"\/\n\\]* { /* eat anything that is not " / or \n */ <Scan>[^"'\/\n\\]* { /* eat anything that is not " / or \n */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
} }
<Scan>"\"" { /* start of a string */ <Scan>"\"" { /* start of a string */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
BEGIN(SkipString); BEGIN(SkipString);
} }
<Scan>{CHARLIT} {
copyToOutput(yytext,yyleng);
}
<Scan>\n { /* new line */ <Scan>\n { /* new line */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
} }
......
...@@ -1607,6 +1607,14 @@ void Config::create() ...@@ -1607,6 +1607,14 @@ void Config::create()
"If set to NO only classes defined in header files are included. \n", "If set to NO only classes defined in header files are included. \n",
TRUE TRUE
); );
cb = addBool(
"EXTRACT_LOCAL_METHODS",
"This flag is only useful for Objective-C code. When set to YES local \n"
"methods, which are defined in the implementation section but not in \n"
"the interface are included in the documentation. \n"
"If set to NO (the default) only methods in the interface are included. \n",
FALSE
);
cb = addBool( cb = addBool(
"HIDE_UNDOC_MEMBERS", "HIDE_UNDOC_MEMBERS",
"If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n" "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n"
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
static void addToMap(const char *name,Definition *d) static void addToMap(const char *name,Definition *d)
{ {
QCString symbolName = name; QCString symbolName = name;
int index=symbolName.findRev("::"); int index=computeQualifiedIndex(symbolName);
if (index!=-1) symbolName=symbolName.mid(index+2); if (index!=-1) symbolName=symbolName.mid(index+2);
if (!symbolName.isEmpty()) if (!symbolName.isEmpty())
{ {
...@@ -58,7 +58,7 @@ static void addToMap(const char *name,Definition *d) ...@@ -58,7 +58,7 @@ static void addToMap(const char *name,Definition *d)
static void removeFromMap(Definition *d) static void removeFromMap(Definition *d)
{ {
QCString symbolName = d->symbolName(); QCString symbolName = d->symbolName();
int index=symbolName.findRev("::"); int index=computeQualifiedIndex(symbolName);
if (index!=-1) symbolName=symbolName.mid(index+2); if (index!=-1) symbolName=symbolName.mid(index+2);
if (!symbolName.isEmpty()) if (!symbolName.isEmpty())
{ {
...@@ -512,8 +512,10 @@ void Definition::writeSourceRefList(OutputList &ol,const char *scopeName, ...@@ -512,8 +512,10 @@ void Definition::writeSourceRefList(OutputList &ol,const char *scopeName,
name.prepend(scope+"::"); name.prepend(scope+"::");
} }
} }
if (md->isFunction() || md->isSlot() || if (!md->isObjCMethod() &&
md->isPrototype() || md->isSignal() (md->isFunction() || md->isSlot() ||
md->isPrototype() || md->isSignal()
)
) name+="()"; ) name+="()";
//Definition *d = md->getOutputFileBase(); //Definition *d = md->getOutputFileBase();
//if (d==Doxygen::globalScope) d=md->getBodyDef(); //if (d==Doxygen::globalScope) d=md->getBodyDef();
......
...@@ -252,13 +252,14 @@ static void checkArgumentName(const QString &name,bool isParam) ...@@ -252,13 +252,14 @@ static void checkArgumentName(const QString &name,bool isParam)
while ((i=re.match(name,p,&l))!=-1) while ((i=re.match(name,p,&l))!=-1)
{ {
QString aName=name.mid(i,l); QString aName=name.mid(i,l);
//printf("aName=%s\n",aName.data()); //printf("aName=`%s'\n",aName.data());
ArgumentListIterator ali(*al); ArgumentListIterator ali(*al);
Argument *a; Argument *a;
bool found=FALSE; bool found=FALSE;
for (ali.toFirst();(a=ali.current());++ali) for (ali.toFirst();(a=ali.current());++ali)
{ {
QString argName = g_memberDef->isDefine() ? a->type : a->name; QString argName = g_memberDef->isDefine() ? a->type : a->name;
//printf("argName=`%s'\n",argName.data());
if (argName.right(3)=="...") argName=argName.left(argName.length()-3); if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
if (aName==argName) if (aName==argName)
{ {
...@@ -4085,6 +4086,8 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag ...@@ -4085,6 +4086,8 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
break; break;
case HTML_UNKNOWN: case HTML_UNKNOWN:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported html tag <%s> found", tagName.data()); warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported html tag <%s> found", tagName.data());
m_children.append(new DocWord(this, "<"+tagName+">"));
break;
break; break;
default: default:
// we should not get here! // we should not get here!
......
...@@ -486,7 +486,7 @@ static void writeBoxMemberList(QTextStream &t,char prot,MemberList &ml,ClassDef ...@@ -486,7 +486,7 @@ static void writeBoxMemberList(QTextStream &t,char prot,MemberList &ml,ClassDef
if (mma->getClassDef() == scope) if (mma->getClassDef() == scope)
{ {
t << prot << " " << convertLabel(mma->name()); t << prot << " " << convertLabel(mma->name());
if (mma->isFunction()) t << "()"; if (!mma->isObjCMethod() && mma->isFunction()) t << "()";
t << "\\l"; t << "\\l";
} }
} }
......
...@@ -187,6 +187,11 @@ void statistics() ...@@ -187,6 +187,11 @@ void statistics()
static void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, static void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
ArgumentList *al,bool over_load,NamespaceSDict *nl=0); ArgumentList *al,bool over_load,NamespaceSDict *nl=0);
static void findMember(Entry *root,
QCString funcDecl,
bool overloaded,
bool isFunc
);
const char idMask[] = "[A-Za-z_][A-Za-z_0-9]*"; const char idMask[] = "[A-Za-z_][A-Za-z_0-9]*";
QCString spaces; QCString spaces;
...@@ -2914,7 +2919,7 @@ static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,co ...@@ -2914,7 +2919,7 @@ static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,co
{ {
QDict<int> *templateNames = new QDict<int>(17); QDict<int> *templateNames = new QDict<int>(17);
templateNames->setAutoDelete(TRUE); templateNames->setAutoDelete(TRUE);
static QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*"); static QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
if (templateArguments) if (templateArguments)
{ {
ArgumentListIterator ali(*templateArguments); ArgumentListIterator ali(*templateArguments);
...@@ -3108,12 +3113,7 @@ static void findUsedClassesForClass(Entry *root, ...@@ -3108,12 +3113,7 @@ static void findUsedClassesForClass(Entry *root,
} }
// add any template arguments to the class // add any template arguments to the class
QCString usedName = usedClassName+templSpec; QCString usedName = usedClassName+templSpec;
//printf("usedName=%s\n",usedName.data());
//if (!typeName.isEmpty())
//{
// usedName=typeName;
//}
//printf("usedName=`%s'\n",usedName.data());
bool delTempNames=FALSE; bool delTempNames=FALSE;
if (templateNames==0) if (templateNames==0)
...@@ -3147,7 +3147,7 @@ static void findUsedClassesForClass(Entry *root, ...@@ -3147,7 +3147,7 @@ static void findUsedClassesForClass(Entry *root,
if (usedCd) if (usedCd)
{ {
if (isArtificial) usedCd->setClassIsArtificial(); if (isArtificial) usedCd->setClassIsArtificial();
Debug::print(Debug::Classes,0," Adding used class `%s'\n", usedCd->name().data()); Debug::print(Debug::Classes,0," Adding used class `%s' (1)\n", usedCd->name().data());
instanceCd->addUsedClass(usedCd,md->name()); instanceCd->addUsedClass(usedCd,md->name());
usedCd->addUsedByClass(instanceCd,md->name()); usedCd->addUsedByClass(instanceCd,md->name());
} }
...@@ -3160,10 +3160,10 @@ static void findUsedClassesForClass(Entry *root, ...@@ -3160,10 +3160,10 @@ static void findUsedClassesForClass(Entry *root,
ClassDef *usedCd=findClassWithinClassContext(masterCd,usedName); ClassDef *usedCd=findClassWithinClassContext(masterCd,usedName);
//printf("Looking for used class: result=%p master=%p\n",usedCd,masterCd); //printf("Looking for used class: result=%p master=%p\n",usedCd,masterCd);
if (usedCd /*&& usedCd!=masterCd*/) if (usedCd)
{ {
found=TRUE; found=TRUE;
Debug::print(Debug::Classes,0," Adding used class `%s'\n", usedCd->name().data()); Debug::print(Debug::Classes,0," Adding used class `%s' (2)\n", usedCd->name().data());
instanceCd->addUsedClass(usedCd,md->name()); // class exists instanceCd->addUsedClass(usedCd,md->name()); // class exists
usedCd->addUsedByClass(instanceCd,md->name()); usedCd->addUsedByClass(instanceCd,md->name());
} }
...@@ -3192,7 +3192,7 @@ static void findUsedClassesForClass(Entry *root, ...@@ -3192,7 +3192,7 @@ static void findUsedClassesForClass(Entry *root,
if (usedCd) if (usedCd)
{ {
if (isArtificial) usedCd->setClassIsArtificial(); if (isArtificial) usedCd->setClassIsArtificial();
Debug::print(Debug::Classes,0," Adding used class `%s'\n", usedCd->name().data()); Debug::print(Debug::Classes,0," Adding used class `%s' (3)\n", usedCd->name().data());
instanceCd->addUsedClass(usedCd,md->name()); instanceCd->addUsedClass(usedCd,md->name());
usedCd->addUsedByClass(instanceCd,md->name()); usedCd->addUsedByClass(instanceCd,md->name());
} }
...@@ -3297,6 +3297,7 @@ static bool findTemplateInstanceRelation(Entry *root, ...@@ -3297,6 +3297,7 @@ static bool findTemplateInstanceRelation(Entry *root,
if (freshInstance) if (freshInstance)
{ {
Debug::print(Debug::Classes,0," found fresh instance!\n");
Doxygen::classSDict.append(instanceClass->name(),instanceClass); Doxygen::classSDict.append(instanceClass->name(),instanceClass);
instanceClass->setTemplateBaseClassNames(templateNames); instanceClass->setTemplateBaseClassNames(templateNames);
...@@ -3305,6 +3306,7 @@ static bool findTemplateInstanceRelation(Entry *root, ...@@ -3305,6 +3306,7 @@ static bool findTemplateInstanceRelation(Entry *root,
Entry *templateRoot = classEntries.find(templateClass->name()); Entry *templateRoot = classEntries.find(templateClass->name());
if (templateRoot) if (templateRoot)
{ {
Debug::print(Debug::Classes,0," template root found %s!\n",templateRoot->name.data());
ArgumentList *templArgs = new ArgumentList; ArgumentList *templArgs = new ArgumentList;
stringToArgumentList(templSpec,templArgs); stringToArgumentList(templSpec,templArgs);
findBaseClassesForClass(templateRoot,templateClass,instanceClass, findBaseClassesForClass(templateRoot,templateClass,instanceClass,
...@@ -3316,12 +3318,17 @@ static bool findTemplateInstanceRelation(Entry *root, ...@@ -3316,12 +3318,17 @@ static bool findTemplateInstanceRelation(Entry *root,
} }
else else
{ {
Debug::print(Debug::Classes,0," no template root entry found!\n");
// TODO: what happened if we get here? // TODO: what happened if we get here?
} }
//Debug::print(Debug::Classes,0," Template instance %s : \n",instanceClass->name().data()); //Debug::print(Debug::Classes,0," Template instance %s : \n",instanceClass->name().data());
//ArgumentList *tl = templateClass->templateArguments(); //ArgumentList *tl = templateClass->templateArguments();
} }
else
{
Debug::print(Debug::Classes,0," instance already exists!\n");
}
return TRUE; return TRUE;
} }
...@@ -4199,11 +4206,8 @@ static bool findGlobalMember(Entry *root, ...@@ -4199,11 +4206,8 @@ static bool findGlobalMember(Entry *root,
} }
else // got docs for an undefined member! else // got docs for an undefined member!
{ {
if (root->parent && root->parent->section==Entry::OBJCIMPL_SEC) if (root->type!="friend class" && root->type!="friend struct" &&
{ root->type!="friend union")
// probably a local member ObjC method not found in the interface
}
else
{ {
warn(root->fileName,root->startLine, warn(root->fileName,root->startLine,
"Warning: documented function `%s' was not defined.",decl "Warning: documented function `%s' was not defined.",decl
...@@ -4389,8 +4393,8 @@ static void findMember(Entry *root, ...@@ -4389,8 +4393,8 @@ static void findMember(Entry *root,
funcArgs,funcTempList,exceptions funcArgs,funcTempList,exceptions
); );
} }
//printf("scopeName=`%s' funcType=`%s' funcName=`%s'\n", //printf("scopeName=`%s' funcType=`%s' funcName=`%s' funcArgs=`%s'\n",
// scopeName.data(),funcType.data(),funcName.data()); // scopeName.data(),funcType.data(),funcName.data(),funcArgs.data());
// the class name can also be a namespace name, we decide this later. // the class name can also be a namespace name, we decide this later.
// if a related class name is specified and the class name could // if a related class name is specified and the class name could
...@@ -4751,9 +4755,11 @@ static void findMember(Entry *root, ...@@ -4751,9 +4755,11 @@ static void findMember(Entry *root,
delete nl; delete nl;
} }
} }
if (count==0 && !(isFriend && funcType=="class") && if (count==0 && root->parent && root->parent->section==Entry::OBJCIMPL_SEC)
(root->parent==0 || root->parent->section!=Entry::OBJCIMPL_SEC) {
) goto localObjCMethod;
}
if (count==0 && !(isFriend && funcType=="class"))
{ {
int candidates=0; int candidates=0;
if (mn->count()>0) if (mn->count()>0)
...@@ -5050,6 +5056,59 @@ static void findMember(Entry *root, ...@@ -5050,6 +5056,59 @@ static void findMember(Entry *root,
); );
} }
} }
else if (root->parent && root->parent->section==Entry::OBJCIMPL_SEC)
{
localObjCMethod:
ClassDef *cd;
//printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
if (Config_getBool("EXTRACT_LOCAL_METHODS") && (cd=getClass(scopeName)))
{
bool ambig;
//printf("Local objective C method `%s' of class `%s' found\n",root->name.data(),cd->name().data());
MemberDef *md=new MemberDef(
root->fileName,root->startLine,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,root->stat,FALSE,
MemberDef::Function,0,root->argList);
if (root->tagInfo)
{
md->setAnchor(root->tagInfo->anchor);
md->setReference(root->tagInfo->tagName);
}
md->makeImplementationDetail();
md->setMemberClass(cd);
md->setDefinition(funcDecl);
md->enableCallGraph(root->callGraph);
md->setDocumentation(root->doc,root->docFile,root->docLine);
md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
md->setDocsForDefinition(!root->proto);
md->setPrototype(root->proto);
md->addSectionsToDefinition(root->anchors);
md->setBodySegment(root->bodyLine,root->endBodyLine);
FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
md->setBodyDef(fd);
md->setMemberSpecifiers(root->memSpec);
md->setMemberGroupId(root->mGrpId);
cd->insertMember(md);
cd->insertUsedFile(root->fileName);
md->setRefItems(root->sli);
if ((mn=Doxygen::memberNameSDict[root->name]))
{
mn->append(md);
}
else
{
mn = new MemberName(root->name);
mn->append(md);
Doxygen::memberNameSDict.append(root->name,mn);
}
}
else
{
// local objective C method found for class without interface
}
}
else // unrelated not overloaded member found else // unrelated not overloaded member found
{ {
bool globMem = findGlobalMember(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl); bool globMem = findGlobalMember(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl);
......
...@@ -237,7 +237,9 @@ class Entry ...@@ -237,7 +237,9 @@ class Entry
Explicit = 0x02, Explicit = 0x02,
Mutable = 0x04, Mutable = 0x04,
Settable = 0x08, Settable = 0x08,
Gettable = 0x10 Gettable = 0x10,
Readable = 0x20,
Writable = 0x40
}; };
Entry(); Entry();
......
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
// #define GROUP_COLOR "#ff8080" // #define GROUP_COLOR "#ff8080"
//#define DBG_HTML(x) x; #define DBG_HTML(x) x;
#define DBG_HTML(x) //#define DBG_HTML(x)
static const char *defaultStyleSheet = static const char *defaultStyleSheet =
"H1 {\n" "H1 {\n"
...@@ -1069,7 +1069,7 @@ void HtmlGenerator::startParameterName(bool oneArgOnly) ...@@ -1069,7 +1069,7 @@ void HtmlGenerator::startParameterName(bool oneArgOnly)
t << "\" nowrap>"; //&nbsp;"; t << "\" nowrap>"; //&nbsp;";
} }
void HtmlGenerator::endParameterName(bool last,bool emptyList) void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
{ {
DBG_HTML(t << "<!-- endParameterName -->" << endl;) DBG_HTML(t << "<!-- endParameterName -->" << endl;)
if (last) if (last)
...@@ -1077,7 +1077,9 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList) ...@@ -1077,7 +1077,9 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList)
if (emptyList) if (emptyList)
{ {
t << " </td>" << endl; t << " </td>" << endl;
t << " <td class=\"md\" valign=\"top\">&nbsp;)&nbsp;</td>" << endl; t << " <td class=\"md\" valign=\"top\">";
if (closeBracket) t << "&nbsp;)";
t << "&nbsp;</td>" << endl;
t << " <td class=\"md\" nowrap>"; t << " <td class=\"md\" nowrap>";
} }
else else
...@@ -1086,7 +1088,9 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList) ...@@ -1086,7 +1088,9 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList)
t << " </tr>" << endl; t << " </tr>" << endl;
t << " <tr>" << endl; t << " <tr>" << endl;
t << " <td></td>" << endl; t << " <td></td>" << endl;
t << " <td class=\"md\">)&nbsp;</td>" << endl; t << " <td class=\"md\">";
if (closeBracket) t << ")";
t << "&nbsp;</td>" << endl;
t << " <td class=\"md\" colspan=\"2\">"; t << " <td class=\"md\" colspan=\"2\">";
} }
} }
......
...@@ -200,7 +200,7 @@ class HtmlGenerator : public OutputGenerator ...@@ -200,7 +200,7 @@ class HtmlGenerator : public OutputGenerator
void startParameterType(bool first,const char *key); void startParameterType(bool first,const char *key);
void endParameterType(); void endParameterType();
void startParameterName(bool); void startParameterName(bool);
void endParameterName(bool last,bool emptyList); void endParameterName(bool last,bool emptyList,bool closeBracket);
void startParameterList(bool); void startParameterList(bool);
void endParameterList(); void endParameterList();
......
...@@ -1650,7 +1650,8 @@ void writeMemberList(OutputList &ol,bool useSections,ClassMemberHighlight filter ...@@ -1650,7 +1650,8 @@ void writeMemberList(OutputList &ol,bool useSections,ClassMemberHighlight filter
) )
{ {
found=TRUE; found=TRUE;
isFunc=md->isFunction() || md->isSlot() || md->isSignal(); isFunc=!md->isObjCMethod() &&
(md->isFunction() || md->isSlot() || md->isSignal());
} }
md=mn->next(); md=mn->next();
} }
......
...@@ -275,7 +275,7 @@ class LatexGenerator : public OutputGenerator ...@@ -275,7 +275,7 @@ class LatexGenerator : public OutputGenerator
void startParameterType(bool,const char *) {} void startParameterType(bool,const char *) {}
void endParameterType() {} void endParameterType() {}
void startParameterName(bool) {} void startParameterName(bool) {}
void endParameterName(bool,bool) {} void endParameterName(bool,bool,bool) {}
void startParameterList(bool) {} void startParameterList(bool) {}
void endParameterList() {} void endParameterList() {}
......
...@@ -242,7 +242,7 @@ class ManGenerator : public OutputGenerator ...@@ -242,7 +242,7 @@ class ManGenerator : public OutputGenerator
void startParameterType(bool,const char *) {} void startParameterType(bool,const char *) {}
void endParameterType() {} void endParameterType() {}
void startParameterName(bool) {} void startParameterName(bool) {}
void endParameterName(bool,bool) {} void endParameterName(bool,bool,bool) {}
void startParameterList(bool) {} void startParameterList(bool) {}
void endParameterList() {} void endParameterList() {}
......
...@@ -33,8 +33,6 @@ ...@@ -33,8 +33,6 @@
#include "docparser.h" #include "docparser.h"
#include "dot.h" #include "dot.h"
#include "searchindex.h" #include "searchindex.h"
//#include "xml.h"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -197,7 +195,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd, ...@@ -197,7 +195,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
key=a->attrib.mid(1,a->attrib.length()-2); key=a->attrib.mid(1,a->attrib.length()-2);
if (key!=",") key+=":"; // for normal keywords add colon if (key!=",") key+=":"; // for normal keywords add colon
} }
ol.endParameterName(FALSE,FALSE); ol.endParameterName(FALSE,FALSE,!md->isObjCMethod());
ol.startParameterType(FALSE,key); ol.startParameterType(FALSE,key);
} }
} }
...@@ -212,13 +210,13 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd, ...@@ -212,13 +210,13 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
if (!md->isDefine()) if (!md->isDefine())
{ {
if (first) ol.startParameterName(defArgList->count()<2); if (first) ol.startParameterName(defArgList->count()<2);
ol.endParameterName(!md->isObjCMethod(),defArgList->count()<2); ol.endParameterName(TRUE,defArgList->count()<2,!md->isObjCMethod());
} }
else else
{ {
ol.endParameterType(); ol.endParameterType();
ol.startParameterName(TRUE); ol.startParameterName(TRUE);
ol.endParameterName(TRUE,TRUE); ol.endParameterName(TRUE,TRUE,!md->isObjCMethod());
} }
ol.popGeneratorState(); ol.popGeneratorState();
if (defArgList->constSpecifier) if (defArgList->constSpecifier)
...@@ -391,6 +389,7 @@ MemberDef::MemberDef(const char *df,int dl, ...@@ -391,6 +389,7 @@ MemberDef::MemberDef(const char *df,int dl,
m_isTypedefValCached = FALSE; m_isTypedefValCached = FALSE;
m_cachedTypedefValue = 0; m_cachedTypedefValue = 0;
m_inbodyLine = -1; m_inbodyLine = -1;
m_implOnly=FALSE;
} }
/*! Destroys the member definition. */ /*! Destroys the member definition. */
...@@ -1047,6 +1046,12 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -1047,6 +1046,12 @@ void MemberDef::writeDeclaration(OutputList &ol,
linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),init); linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),init);
} }
} }
if (isObjCMethod() && isImplementation())
{
ol.startTypewriter();
ol.docify(" [implementation]");
ol.endTypewriter();
}
if (!detailsVisible && !annMemb) if (!detailsVisible && !annMemb)
{ {
...@@ -1385,7 +1390,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1385,7 +1390,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
isMutable() || (isInline() && Config_getBool("INLINE_INFO")) || isMutable() || (isInline() && Config_getBool("INLINE_INFO")) ||
isSignal() || isSlot() || isSignal() || isSlot() ||
isStatic() || (classDef && classDef!=container) || isStatic() || (classDef && classDef!=container) ||
isSettable() || isGettable() isSettable() || isGettable() || isReadable() || isWritable()
) )
) )
{ {
...@@ -1405,6 +1410,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1405,6 +1410,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (isStatic()) sl.append("static"); if (isStatic()) sl.append("static");
if (isGettable()) sl.append("get"); if (isGettable()) sl.append("get");
if (isSettable()) sl.append("set"); if (isSettable()) sl.append("set");
if (isReadable()) sl.append("read");
if (isWritable()) sl.append("write");
if (protection()==Protected) sl.append("protected"); if (protection()==Protected) sl.append("protected");
else if (protection()==Private) sl.append("private"); else if (protection()==Private) sl.append("private");
else if (protection()==Package) sl.append("package"); else if (protection()==Package) sl.append("package");
...@@ -1424,6 +1431,13 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1424,6 +1431,13 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.docify("]"); ol.docify("]");
ol.endTypewriter(); ol.endTypewriter();
} }
else if (isObjCMethod() && isImplementation())
{
ol.writeLatexSpacing();
ol.startTypewriter();
ol.docify(" [implementation]");
ol.endTypewriter();
}
if (!isDefine() && defArgList) ol.endParameterList(); if (!isDefine() && defArgList) ol.endParameterList();
ol.endMemberDoc(); ol.endMemberDoc();
ol.endDoxyAnchor(cfname,anchor()); ol.endDoxyAnchor(cfname,anchor());
......
...@@ -125,6 +125,9 @@ class MemberDef : public Definition ...@@ -125,6 +125,9 @@ class MemberDef : public Definition
bool isMutable() const { return (memSpec&Entry::Mutable)!=0; } bool isMutable() const { return (memSpec&Entry::Mutable)!=0; }
bool isGettable() const { return (memSpec&Entry::Gettable)!=0; } bool isGettable() const { return (memSpec&Entry::Gettable)!=0; }
bool isSettable() const { return (memSpec&Entry::Settable)!=0; } bool isSettable() const { return (memSpec&Entry::Settable)!=0; }
bool isReadable() const { return (memSpec&Entry::Readable)!=0; }
bool isWritable() const { return (memSpec&Entry::Writable)!=0; }
bool isImplementation() const { return m_implOnly; }
bool isExternal() const { return explExt; } bool isExternal() const { return explExt; }
bool isObjCMethod() const; bool isObjCMethod() const;
bool isConstructor() const; bool isConstructor() const;
...@@ -229,6 +232,7 @@ class MemberDef : public Definition ...@@ -229,6 +232,7 @@ class MemberDef : public Definition
MemberGroup *getMemberGroup() const { return memberGroup; } MemberGroup *getMemberGroup() const { return memberGroup; }
void setMemberGroupId(int id) { grpId=id; } void setMemberGroupId(int id) { grpId=id; }
int getMemberGroupId() const { return grpId; } int getMemberGroupId() const { return grpId; }
void makeImplementationDetail() { m_implOnly=TRUE; }
// anonymous scope members // anonymous scope members
void setFromAnonymousScope(bool b) { annScope=b; } void setFromAnonymousScope(bool b) { annScope=b; }
...@@ -360,6 +364,10 @@ class MemberDef : public Definition ...@@ -360,6 +364,10 @@ class MemberDef : public Definition
int m_inbodyLine; int m_inbodyLine;
QCString m_inbodyFile; QCString m_inbodyFile;
QCString m_inbodyDocs; QCString m_inbodyDocs;
// objective-c
bool m_implOnly; // function found in implementation but not
// in the interface
}; };
#endif #endif
...@@ -351,7 +351,7 @@ class OutputGenerator : public BaseOutputDocInterface ...@@ -351,7 +351,7 @@ class OutputGenerator : public BaseOutputDocInterface
virtual void startParameterType(bool,const char *) = 0; virtual void startParameterType(bool,const char *) = 0;
virtual void endParameterType() = 0; virtual void endParameterType() = 0;
virtual void startParameterName(bool) = 0; virtual void startParameterName(bool) = 0;
virtual void endParameterName(bool,bool) = 0; virtual void endParameterName(bool,bool,bool) = 0;
virtual void startParameterList(bool) = 0; virtual void startParameterList(bool) = 0;
virtual void endParameterList() = 0; virtual void endParameterList() = 0;
......
...@@ -269,6 +269,7 @@ FORALL1(SectionTypes a1,a1) ...@@ -269,6 +269,7 @@ FORALL1(SectionTypes a1,a1)
FORALL1(bool a1,a1) FORALL1(bool a1,a1)
FORALL2(bool a1,int a2,a1,a2) FORALL2(bool a1,int a2,a1,a2)
FORALL2(bool a1,bool a2,a1,a2) FORALL2(bool a1,bool a2,a1,a2)
FORALL3(bool a1,bool a2,bool a3,a1,a2,a3)
FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4) FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4)
#endif #endif
FORALL2(int a1,bool a2,a1,a2) FORALL2(int a1,bool a2,a1,a2)
......
...@@ -339,8 +339,8 @@ class OutputList : public OutputDocInterface ...@@ -339,8 +339,8 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::endParameterType); } { forall(&OutputGenerator::endParameterType); }
void startParameterName(bool one) void startParameterName(bool one)
{ forall(&OutputGenerator::startParameterName,one); } { forall(&OutputGenerator::startParameterName,one); }
void endParameterName(bool last,bool one) void endParameterName(bool last,bool one,bool bracket)
{ forall(&OutputGenerator::endParameterName,last,one); } { forall(&OutputGenerator::endParameterName,last,one,bracket); }
void startParameterList(bool openBracket) void startParameterList(bool openBracket)
{ forall(&OutputGenerator::startParameterList,openBracket); } { forall(&OutputGenerator::startParameterList,openBracket); }
void endParameterList() void endParameterList()
...@@ -388,6 +388,7 @@ class OutputList : public OutputDocInterface ...@@ -388,6 +388,7 @@ class OutputList : public OutputDocInterface
FORALLPROTO1(bool); FORALLPROTO1(bool);
FORALLPROTO2(bool,int); FORALLPROTO2(bool,int);
FORALLPROTO2(bool,bool); FORALLPROTO2(bool,bool);
FORALLPROTO3(bool,bool,bool);
FORALLPROTO4(const char *,const char *,const char *,int); FORALLPROTO4(const char *,const char *,const char *,int);
#endif #endif
FORALLPROTO2(int,bool); FORALLPROTO2(int,bool);
......
...@@ -397,6 +397,18 @@ static void returnCharToStream(char c) ...@@ -397,6 +397,18 @@ static void returnCharToStream(char c)
unput(c); unput(c);
} }
static inline void addTillEndOfString(const QCString &expr,QCString *rest,
uint &pos,char term,QCString &arg)
{
char cc;
while ((cc=getNextChar(expr,rest,pos))!=EOF)
{
if (cc=='\\') arg+=cc,cc=getNextChar(expr,rest,pos);
else if (cc==term) return;
arg+=cc;
}
}
/*! replaces the function macro \a def whose argument list starts at /*! replaces the function macro \a def whose argument list starts at
* \a pos in expression \a expr. * \a pos in expression \a expr.
* Notice that this routine may scan beyond the \a expr string if needed. * Notice that this routine may scan beyond the \a expr string if needed.
...@@ -449,28 +461,23 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int ...@@ -449,28 +461,23 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int
{ {
int level=1; int level=1;
arg+=c; arg+=c;
char term='\0'; //char term='\0';
while ((cc=getNextChar(expr,rest,j))!=EOF) while ((cc=getNextChar(expr,rest,j))!=EOF)
{ {
char c=(char)cc; char c=(char)cc;
//printf("processing %c: term=%c (%d)\n",c,term,term);
if (c=='\'' || c=='\"') // skip ('s and )'s inside strings if (c=='\'' || c=='\"') // skip ('s and )'s inside strings
{ {
if (term!='\0') arg+=c;
{ addTillEndOfString(expr,rest,j,c,arg);
if (c==term && expr.at(j-2)!='\\') term='\0';
}
else
{
term=c;
}
} }
if (term=='\0' && c==')') if (c==')')
{ {
level--; level--;
arg+=c; arg+=c;
if (level==0) break; if (level==0) break;
} }
else if (term=='\0' && c=='(') else if (c=='(')
{ {
level++; level++;
arg+=c; arg+=c;
...@@ -625,7 +632,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int ...@@ -625,7 +632,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int
{ {
inString=TRUE; // entering a literal string inString=TRUE; // entering a literal string
} }
else if (inString && d.at(k)=='\"' && d.at(k-1)!='\\') else if (inString && d.at(k)=='\"' && (d.at(k-1)!='\\' || d.at(k-2)=='\\'))
{ {
inString=FALSE; // leaving a literal string inString=FALSE; // leaving a literal string
} }
...@@ -665,10 +672,12 @@ static int getNextId(const QCString &expr,int p,int *l) ...@@ -665,10 +672,12 @@ static int getNextId(const QCString &expr,int p,int *l)
} }
else if (c=='"') // skip string else if (c=='"') // skip string
{ {
char pc=c; char ppc=0,pc=c;
if (p<(int)expr.length()) c=expr.at(p); if (p<(int)expr.length()) c=expr.at(p);
while (p<(int)expr.length() && (c!='"' || pc=='\\')) while (p<(int)expr.length() && (c!='"' || (pc=='\\' && ppc!='\\')))
// continue as long as no " is found, but ignoring \", but not \\"
{ {
ppc=pc;
pc=c; pc=c;
c=expr.at(p); c=expr.at(p);
p++; p++;
...@@ -1189,6 +1198,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -1189,6 +1198,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
Define *def=0; Define *def=0;
if (skipFuncMacros && if (skipFuncMacros &&
name!="Q_PROPERTY" &&
!( !(
(g_includeStack.isEmpty() || g_curlyCount>0) && (g_includeStack.isEmpty() || g_curlyCount>0) &&
g_macroExpansion && g_macroExpansion &&
......
...@@ -245,7 +245,7 @@ class RTFGenerator : public OutputGenerator ...@@ -245,7 +245,7 @@ class RTFGenerator : public OutputGenerator
void startParameterType(bool,const char *) {} void startParameterType(bool,const char *) {}
void endParameterType() {} void endParameterType() {}
void startParameterName(bool) {} void startParameterName(bool) {}
void endParameterName(bool,bool) {} void endParameterName(bool,bool,bool) {}
void startParameterList(bool) {} void startParameterList(bool) {}
void endParameterList() {} void endParameterList() {}
......
...@@ -807,6 +807,9 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -807,6 +807,9 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
%x ObjCReturnType %x ObjCReturnType
%x ObjCParams %x ObjCParams
%x ObjCParamType %x ObjCParamType
%x QtPropType
%x QtPropName
%x QtPropRW
%% %%
...@@ -1032,6 +1035,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -1032,6 +1035,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
current->section = Entry::FUNCTION_SEC; current->section = Entry::FUNCTION_SEC;
current->protection = protection = Public ; current->protection = protection = Public ;
current->virt = Virtual;
current->stat=yytext[0]=='+'; current->stat=yytext[0]=='+';
current->mtype = mtype = Method; current->mtype = mtype = Method;
current->type.resize(0); current->type.resize(0);
...@@ -1110,14 +1114,6 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -1110,14 +1114,6 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
lineCount(); lineCount();
} }
<PackageName>{ID}("."{ID})* { <PackageName>{ID}("."{ID})* {
//current->name = yytext;
//current->fileName = yyFileName;
//current->startLine = yyLineNr;
//current->section=Entry::PACKAGE_SEC;
//current_root->addSubEntry(current);
//current = new Entry ;
//initEntry();
isTypedef=FALSE; isTypedef=FALSE;
current->name = yytext; current->name = yytext;
current->name = substitute(current->name,".","::"); current->name = substitute(current->name,".","::");
...@@ -1567,6 +1563,31 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -1567,6 +1563,31 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
else else
REJECT; REJECT;
} }
<FindMembers>"Q_OBJECT" { // Qt object macro
}
<FindMembers>"Q_PROPERTY" { // Qt property declaration
current->protection = protection = Public ;
current->mtype = mtype = Property;
BEGIN(QtPropType);
}
<QtPropType>{ID} {
current->type=yytext;
BEGIN(QtPropName);
}
<QtPropName>{ID} {
current->name=yytext;
BEGIN(QtPropRW);
}
<QtPropRW>"READ" {
current->memSpec |= Entry::Readable;
}
<QtPropRW>"WRITE" {
current->memSpec |= Entry::Writable;
}
<QtPropRW>")" {
unput(';');
BEGIN(FindMembers);
}
<FindMembers,FindMemberName>{SCOPENAME} { <FindMembers,FindMemberName>{SCOPENAME} {
lineCount(); lineCount();
if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0) if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0)
...@@ -3869,7 +3890,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ...@@ -3869,7 +3890,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
} }
BEGIN( tmpDocType ); BEGIN( tmpDocType );
} }
<Doc,JavaDoc>{B}*{CMD}("fn"|"var"|"typedef"){B}+ { <Doc,JavaDoc>{B}*{CMD}("fn"|"var"|"typedef"|"property"){B}+ {
current->section = Entry::MEMBERDOC_SEC; current->section = Entry::MEMBERDOC_SEC;
current->fileName = yyFileName; current->fileName = yyFileName;
current->startLine = yyLineNr; current->startLine = yyLineNr;
......
...@@ -707,9 +707,12 @@ class TranslatorDutch : public Translator ...@@ -707,9 +707,12 @@ class TranslatorDutch : public Translator
"relatie tussen twee klassen.\n" "relatie tussen twee klassen.\n"
"<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n" "<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n"
"<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n" "<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n"
"<li>Een paars gestreepte pijl wordt gebruikt indien een klasse bevat is of gebruikt wordt " "<li>Een paars gestippelde pijl wordt gebruikt indien een klasse bevat is of gebruikt wordt "
"door een andere klasse. De pijl is gelabeled met de variable(n) " "door een andere klasse. De pijl is gelabeled met de variable(n) "
"die toegang geven tot de aangewezen klasse of structure. \n" "die toegang geven tot de aangewezen klasse of structure. \n"
"<li>Een geel gestippelde pijl wordt gebruikt om een relatie tussen een \n"
"template instantie en een template klasse aan te geven. De pijl is gelabeld met \n"
"template parameters van de instantie.\n"
"</ul>\n"; "</ul>\n";
} }
/*! text for the link to the legend page */ /*! text for the link to the legend page */
......
...@@ -959,6 +959,12 @@ done: ...@@ -959,6 +959,12 @@ done:
return result; return result;
} }
int computeQualifiedIndex(const QString &name)
{
int i = name.find('<');
return name.findRev("::",i==-1 ? name.length() : i);
}
/* Find the fully qualified class name refered to by the input class /* Find the fully qualified class name refered to by the input class
* or typedef name against the input scope. * or typedef name against the input scope.
* Loops through scope and each of its parent scopes looking for a * Loops through scope and each of its parent scopes looking for a
...@@ -976,7 +982,9 @@ ClassDef *getResolvedClassRec(Definition *scope, ...@@ -976,7 +982,9 @@ ClassDef *getResolvedClassRec(Definition *scope,
QCString name=n; QCString name=n;
QCString explicitScopePart; QCString explicitScopePart;
int qualifierIndex = name.findRev("::"); // todo: deal with cases like A<B::C> //int qualifierIndex = name.findRev("::"); // todo: deal with cases like A<B::C>
int qualifierIndex = computeQualifiedIndex(name);
//printf("name=%s qualifierIndex=%d\n",name.data(),qualifierIndex);
if (qualifierIndex!=-1) // qualified name if (qualifierIndex!=-1) // qualified name
{ {
// split off the explicit scope part // split off the explicit scope part
...@@ -1101,7 +1109,7 @@ ClassDef *getResolvedClass(Definition *scope, ...@@ -1101,7 +1109,7 @@ ClassDef *getResolvedClass(Definition *scope,
} }
//printf("getResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>", //printf("getResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>",
// n,result?result->name().data():"<none>"); // n,result?result->name().data():"<none>");
// //
//printf("-------- end\n"); //printf("-------- end\n");
return result; return result;
} }
...@@ -1168,7 +1176,7 @@ QCString removeRedundantWhiteSpace(const QCString &s) ...@@ -1168,7 +1176,7 @@ QCString removeRedundantWhiteSpace(const QCString &s)
result+=' '; result+=' ';
result+=s.at(i); result+=s.at(i);
} }
else if (c=='t' && csp==5 && !(isId(s.at(i+1)) || s.at(i+1)==' ')) // prevent const ::A from being converted to const::A else if (c=='t' && csp==5 && !(isId(s.at(i+1)) || s.at(i+1)==' ' || s.at(i+1)==')' || s.at(i+1)==',' || s.at(i+1)=='\0')) // prevent const ::A from being converted to const::A
{ {
result+="t "; result+="t ";
csp=0; csp=0;
......
...@@ -212,6 +212,7 @@ void replaceNamespaceAliases(QCString &scope,int i); ...@@ -212,6 +212,7 @@ void replaceNamespaceAliases(QCString &scope,int i);
int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item); int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item);
int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item, int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item,
const QCString &explicitScopePart); const QCString &explicitScopePart);
int computeQualifiedIndex(const QString &name);
#endif #endif
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