summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--INSTALL4
-rw-r--r--README4
-rwxr-xr-xconfigure2
-rw-r--r--doc/docblocks.doc2
-rw-r--r--src/code.l3
-rw-r--r--src/compound.xsd1
-rw-r--r--src/compound_xsd.h1
-rw-r--r--src/doxygen.css3
-rw-r--r--src/doxygen_css.h3
-rw-r--r--src/htmlgen.cpp59
-rw-r--r--src/latexdocvisitor.cpp62
-rw-r--r--src/latexgen.cpp30
-rw-r--r--src/latexgen.h6
-rw-r--r--src/memberdef.cpp21
-rw-r--r--src/pyscanner.l17
-rw-r--r--src/scanner.l87
-rw-r--r--src/xmlgen.cpp10
17 files changed, 230 insertions, 85 deletions
diff --git a/INSTALL b/INSTALL
index 6893981..160d550 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.4.6-20060115
+DOXYGEN Version 1.4.6-20060202
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
-Dimitri van Heesch (15 January 2006)
+Dimitri van Heesch (02 February 2006)
diff --git a/README b/README
index 974ee1c..8353851 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.4.6_20060115
+DOXYGEN Version 1.4.6_20060202
Please read INSTALL for compilation instructions.
@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
-Dimitri van Heesch (dimitri@stack.nl) (15 January 2006)
+Dimitri van Heesch (dimitri@stack.nl) (02 February 2006)
diff --git a/configure b/configure
index 7f70f7e..8fdc977 100755
--- a/configure
+++ b/configure
@@ -20,7 +20,7 @@ doxygen_version_minor=4
doxygen_version_revision=6
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
-doxygen_version_mmn=20060115
+doxygen_version_mmn=20060202
bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
index de1e94d..789cc92 100644
--- a/doc/docblocks.doc
+++ b/doc/docblocks.doc
@@ -222,7 +222,7 @@ declaration and the detailed description before the member definition.
If you want to document the members of a file, struct, union, class, or enum,
and you want to put the documentation for these members inside the compound,
it is sometimes desired to place the documentation block after the member
-instead of before. For this purpose you should put an additional \< marker
+instead of before. For this purpose you have to put an additional \< marker
in the comment block.
Here are some examples:
diff --git a/src/code.l b/src/code.l
index f0d285a..47ab7ce 100644
--- a/src/code.l
+++ b/src/code.l
@@ -814,6 +814,7 @@ static bool getLinkInScope(const QCString &c, // scope
Definition *d = md->getOuterScope()==Doxygen::globalScope ?
md->getBodyDef() : md->getOuterScope();
if (md->getGroupDef()) d = md->getGroupDef();
+ //printf("d=%p linkable=%d\n",d,d?d->isLinkable():0);
if (d && d->isLinkable())
{
g_theCallContext.setClass(stripClassName(md->typeString()));
@@ -1777,7 +1778,7 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
<SkipCPP>"//" {
g_code->codify(yytext);
}
-<Body>"{" {
+<Body,FuncCall>"{" {
g_theVarContext.pushScope();
g_scopeStack.push(INNERBLOCK);
diff --git a/src/compound.xsd b/src/compound.xsd
index 627fab5..f08e5e6 100644
--- a/src/compound.xsd
+++ b/src/compound.xsd
@@ -90,6 +90,7 @@
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="prot" type="DoxProtectionKind" use="optional"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
diff --git a/src/compound_xsd.h b/src/compound_xsd.h
index 3783b45..9a73283 100644
--- a/src/compound_xsd.h
+++ b/src/compound_xsd.h
@@ -90,6 +90,7 @@
" <xsd:simpleContent>\n"
" <xsd:extension base=\"xsd:string\">\n"
" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" use=\"optional\"/>\n"
" </xsd:extension>\n"
" </xsd:simpleContent>\n"
" </xsd:complexType>\n"
diff --git a/src/doxygen.css b/src/doxygen.css
index 1b47802..985d89d 100644
--- a/src/doxygen.css
+++ b/src/doxygen.css
@@ -309,7 +309,7 @@ HR { height: 1px;
padding: 2px;
}
.memitem {
- width: 100%;
+ padding: 4px;
background-color: #eef3f5;
border-width: 1px;
border-style: solid;
@@ -318,6 +318,7 @@ HR { height: 1px;
}
.memname {
white-space: nowrap;
+ font-weight: bold;
}
.memdoc{
padding-left: 10px;
diff --git a/src/doxygen_css.h b/src/doxygen_css.h
index 8268b16..5a944bc 100644
--- a/src/doxygen_css.h
+++ b/src/doxygen_css.h
@@ -309,7 +309,7 @@
" padding: 2px;\n"
"}\n"
".memitem {\n"
-" width: 100%;\n"
+" padding: 4px;\n"
" background-color: #eef3f5;\n"
" border-width: 1px;\n"
" border-style: solid;\n"
@@ -318,6 +318,7 @@
"}\n"
".memname {\n"
" white-space: nowrap;\n"
+" font-weight: bold;\n"
"}\n"
".memdoc{\n"
" padding-left: 10px;\n"
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 04d5a9f..c6666bd 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -1238,48 +1238,55 @@ void HtmlGenerator::endIndexValue(const char *,bool)
void HtmlGenerator::startMemberDocList()
{
DBG_HTML(t << "<!-- startMemberDocList -->" << endl;)
- t << "<table class=\"memlist\">" << endl;
- t << " <tr>" << endl;
- t << " <td>" << endl;
+ //t << "<table class=\"memlist\">" << endl;
+ //t << " <tr>" << endl;
+ //t << " <td>" << endl;
}
void HtmlGenerator::endMemberDocList()
{
DBG_HTML(t << "<!-- endMemberDocList -->" << endl;)
- t << " </td>" << endl;
- t << " </tr>" << endl;
- t << "</table>" << endl;
+ //t << " </td>" << endl;
+ //t << " </tr>" << endl;
+ //t << "</table>" << endl;
}
void HtmlGenerator::startMemberDoc(const char *,const char *,const char *,const char *)
{
DBG_HTML(t << "<!-- startMemberDoc -->" << endl;)
- t << "<p>" << endl;
-
- t << "<table class=\"memitem\">" << endl;
- t << " <tr>" << endl;
- t << " <td>" << endl;
- t << " <table class=\"memproto\">" << endl;
+ //t << "<p>" << endl;
+
+ t << "\n<div class=\"memitem\">" << endl;
+ //t << "<table>" << endl;
+ //t << " <tr>" << endl;
+ //t << " <td>" << endl;
+ //t << " <table class=\"memproto\">" << endl;
+ t << "<div class=\"memproto\">" << endl;
}
void HtmlGenerator::startMemberDocPrefixItem()
{
DBG_HTML(t << "<!-- startMemberDocPrefixItem -->" << endl;)
- t << " <tr>" << endl;
- t << " <td class=\"memtemplate\" colspan=\"5\">";
+ //t << " <tr>" << endl;
+ //t << " <td class=\"memtemplate\" colspan=\"5\">";
+ t << "<div class=\"memtemplate\">" << endl;
}
void HtmlGenerator::endMemberDocPrefixItem()
{
DBG_HTML(t << "<!-- endMemberDocPrefixItem -->" << endl;)
- t << "</td>" << endl;
- t << " </tr>" << endl;
+ //t << "</td>" << endl;
+ //t << " </tr>" << endl;
+ t << "</div>" << endl;
}
void HtmlGenerator::startMemberDocName(bool /*align*/)
{
DBG_HTML(t << "<!-- startMemberDocName -->" << endl;)
+
+ t << " <table class=\"memname\">" << endl;
+
t << " <tr>" << endl;
t << " <td class=\"memname\">";
}
@@ -1376,8 +1383,10 @@ void HtmlGenerator::endMemberDoc(bool hasArgs)
t << " </tr>" << endl;
}
t << " </table>" << endl;
- t << " </td>" << endl;
- t << " </tr>" << endl;
+ //t << " </td>" << endl;
+ //t << " </tr>" << endl;
+ //t << "</table>" << endl;
+ t << "</div>" << endl;
}
void HtmlGenerator::startDotGraph()
@@ -1462,25 +1471,15 @@ void HtmlGenerator::endMemberGroup(bool)
void HtmlGenerator::startIndent()
{
- // I really wanted to use CSS here to provide an indented section, but
- // alas, Netscape is buggy enough to sometimes "forget" to end the
- // indent cause a staircase effect where the indent continuously increases.
- // It's back to abusing tables :-(
-
- //t << "<div class=\"in\">" << endl;
DBG_HTML(t << "<!-- startIndent -->" << endl;)
- t << " <tr>\n"
- " <td >\n";
+ t << "<div class=\"memdoc\">\n";
}
void HtmlGenerator::endIndent()
{
DBG_HTML(t << "<!-- endIndent -->" << endl;)
- t << " </td>\n"
- " </tr>\n"
- "</table>\n";
- //t << "</div>" << endl;
+ t << endl << "</div>" << endl << "</div><p>" << endl;
}
void HtmlGenerator::addIndexItem(const char *,const char *)
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 1af9ae4..edbe979 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -191,7 +191,7 @@ void LatexDocVisitor::visit(DocURL *u)
if (u->isEmail()) m_t << "mailto:";
m_t << u->url() << "}";
}
- m_t << "{\\tt ";
+ m_t << "\\texttt{";
filter(u->url());
m_t << "}";
}
@@ -214,13 +214,13 @@ void LatexDocVisitor::visit(DocStyleChange *s)
switch (s->style())
{
case DocStyleChange::Bold:
- if (s->enable()) m_t << "{\\bf "; else m_t << "}";
+ if (s->enable()) m_t << "\\textbf{"; else m_t << "}";
break;
case DocStyleChange::Italic:
- if (s->enable()) m_t << "{\\em "; else m_t << "\\/}";
+ if (s->enable()) m_t << "\\textit{"; else m_t << "\\/}";
break;
case DocStyleChange::Code:
- if (s->enable()) m_t << "{\\tt "; else m_t << "}";
+ if (s->enable()) m_t << "\\texttt{ "; else m_t << "}";
break;
case DocStyleChange::Subscript:
if (s->enable()) m_t << "$_{\\mbox{"; else m_t << "}}$ ";
@@ -257,11 +257,11 @@ void LatexDocVisitor::visit(DocVerbatim *s)
switch(s->type())
{
case DocVerbatim::Code:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_t << "\n\n\\begin{Code}\\begin{verbatim}";
Doxygen::parserManager->getParser(m_langExt)
->parseCode(m_ci,s->context(),s->text().latin1(),
s->isExample(),s->exampleFile());
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
+ m_t << "\\end{verbatim}\\end{Code}\n" << endl;
break;
case DocVerbatim::Verbatim:
m_t << "\n\n\\footnotesize\\begin{verbatim}";
@@ -322,7 +322,7 @@ void LatexDocVisitor::visit(DocInclude *inc)
{
case DocInclude::IncWithLines:
{
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_t << "\n\n\\begin{DocInclude}\\begin{verbatim}";
QFileInfo cfi( inc->file() );
FileDef fd( cfi.dirPath(), cfi.fileName() );
Doxygen::parserManager->getParser(inc->extension())
@@ -330,25 +330,25 @@ void LatexDocVisitor::visit(DocInclude *inc)
inc->text().latin1(),
inc->isExample(),
inc->exampleFile(), &fd);
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
+ m_t << "\\end{verbatim}\n\\end{DocInclude}" << endl;
}
break;
case DocInclude::Include:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_t << "\n\n\\begin{DocInclude}\\begin{verbatim}";
Doxygen::parserManager->getParser(inc->extension())
->parseCode(m_ci,inc->context(),
inc->text().latin1(),inc->isExample(),
inc->exampleFile());
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
+ m_t << "\\end{verbatim}\n\\end{DocInclude}" << endl;
break;
case DocInclude::DontInclude:
break;
case DocInclude::HtmlInclude:
break;
case DocInclude::VerbInclude:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ m_t << "\n\n\\begin{VerbInclude}\\begin{verbatim}";
m_t << inc->text();
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
+ m_t << "\\end{verbatim}\n\\end{VerbInclude}" << endl;
break;
}
}
@@ -359,7 +359,7 @@ void LatexDocVisitor::visit(DocIncOperator *op)
// op->type(),op->isFirst(),op->isLast(),op->text().data());
if (op->isFirst())
{
- if (!m_hide) m_t << "\n\n\\footnotesize\\begin{verbatim}";
+ if (!m_hide) m_t << "\n\n\\begin{DocInclude}\\begin{verbatim}";
pushEnabled();
m_hide = TRUE;
}
@@ -378,7 +378,7 @@ void LatexDocVisitor::visit(DocIncOperator *op)
if (op->isLast())
{
popEnabled();
- if (!m_hide) m_t << "\\end{verbatim}\n\\normalsize" << endl;
+ if (!m_hide) m_t << "\\end{verbatim}\n\\end{DocInclude}" << endl;
}
else
{
@@ -718,7 +718,7 @@ void LatexDocVisitor::visitPre(DocHRef *href)
m_t << href->url();
m_t << "}";
}
- m_t << "{\\tt ";
+ m_t << "\texttt{";
}
void LatexDocVisitor::visitPost(DocHRef *)
@@ -746,12 +746,12 @@ void LatexDocVisitor::visitPre(DocImage *img)
if (m_hide) return;
if (img->hasCaption())
{
- m_t << "\\begin{figure}[H]" << endl;
+ m_t << "\\begin{Image}" << endl;
m_t << "\\begin{center}" << endl;
}
else
{
- m_t << "\\mbox{";
+ m_t << "\\begin{ImageNoCaption}\\mbox{";
}
QString gfxName = img->name();
if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
@@ -789,7 +789,10 @@ void LatexDocVisitor::visitPost(DocImage *img)
if (img->hasCaption())
{
m_t << "\\end{center}" << endl;
- m_t << "\\end{figure}" << endl;
+ m_t << "\\end{Image}" << endl;
+ }
+ else{
+ m_t << "\\end{ImageNoCaption}" << endl;
}
}
else // other format
@@ -969,7 +972,7 @@ void LatexDocVisitor::visitPre(DocXRefItem *x)
}
else
{
- m_t << "{\\bf ";
+ m_t << "\\textbf{";
}
m_insideItem=TRUE;
filter(x->title());
@@ -1025,11 +1028,10 @@ void LatexDocVisitor::startLink(const QString &ref,const QString &file,const QSt
if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_";
if (!anchor.isEmpty()) m_t << anchor;
m_t << "}{";
-
}
else
{
- m_t << "{\\bf ";
+ m_t << "\\doxyref{";
}
}
@@ -1038,11 +1040,11 @@ void LatexDocVisitor::endLink(const QString &ref,const QString &file,const QStri
m_t << "}";
if (ref.isEmpty() && !Config_getBool("PDF_HYPERLINKS"))
{
- m_t << "{\\rm (";
+ m_t << "{";
filter(theTranslator->trPageAbbreviation());
- m_t << "\\,\\pageref{" << file;
+ m_t << "}{" << file;
if (!anchor.isEmpty()) m_t << "_" << anchor;
- m_t << "})}";
+ m_t << "}";
}
}
@@ -1084,12 +1086,12 @@ void LatexDocVisitor::startDotFile(const QString &fileName,
writeDotGraphFromFile(name,outDir,baseName,EPS);
if (hasCaption)
{
- m_t << "\\begin{figure}[H]" << endl;
+ m_t << "\\begin{Image}" << endl;
m_t << "\\begin{center}" << endl;
}
else
{
- m_t << "\\mbox{";
+ m_t << "\\begin{ImageNoCaption}\\mbox{";
}
m_t << "\\includegraphics";
if (!width.isEmpty())
@@ -1111,11 +1113,15 @@ void LatexDocVisitor::startDotFile(const QString &fileName,
void LatexDocVisitor::endDotFile(bool hasCaption)
{
if (m_hide) return;
- m_t << "}" << endl; // end mbox or caption
+ m_t << "}" << endl; // end caption or mbox
if (hasCaption)
{
m_t << "\\end{center}" << endl;
- m_t << "\\end{figure}" << endl;
+ m_t << "\\end{Image}" << endl;
+ }
+ else
+ {
+ m_t << "\\end{ImageNoCaption}" << endl;
}
}
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 396ebbe..66aa16c 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -335,6 +335,20 @@ static void writeDefaultStyleSheetPart3(QTextStream &t)
{
t << "}}\n";
t << "\\cfoot{}\n";
+ t << "\\newenvironment{Code}\n";
+ t << "{\\footnotesize}\n";
+ t << "{\\normalsize}\n";
+ t << "\\newcommand{\\doxyref}[3]{\\textbf{#1} (\\textnormal{#2}\\,\\pageref{#3})}\n";
+ t << "\\newenvironment{DocInclude}\n";
+ t << "{\\footnotesize}\n";
+ t << "{\\normalsize}\n";
+ t << "\\newenvironment{VerbInclude}\n";
+ t << "{\\footnotesize}\n";
+ t << "{\\normalsize}\n";
+ t << "\\newenvironment{Image}\n";
+ t << "{\\begin{figure}[H]}\n";
+ t << "{\\end{figure}}\n";
+ t << "\\newenvironment{ImageNoCaption}{}{}\n";
t << "\\newenvironment{CompactList}\n";
t << "{\\begin{list}{}{\n";
t << " \\setlength{\\leftmargin}{0.5cm}\n";
@@ -910,7 +924,7 @@ void LatexGenerator::endHtmlLink()
void LatexGenerator::writeStartAnnoItem(const char *,const char *,
const char *path,const char *name)
{
- t << "\\item\\contentsline{section}{{\\bf ";
+ t << "\\item\\contentsline{section}{\\textbf{";
if (path) docify(path);
docify(name);
t << "} ";
@@ -945,7 +959,7 @@ void LatexGenerator::endIndexValue(const char *name,bool hasBrief)
//void LatexGenerator::writeClassLink(const char *,const char *,
// const char *,const char *name)
//{
-// t << "{\\bf ";
+// t << "\\textbf{";
// docify(name);
// t << "}";
//}
@@ -961,7 +975,7 @@ void LatexGenerator::startTextLink(const char *f,const char *anchor)
}
else
{
- t << "{\\bf ";
+ t << "\\textbf{";
}
}
@@ -985,7 +999,7 @@ void LatexGenerator::writeObjectLink(const char *ref, const char *f,
}
else
{
- t << "{\\bf ";
+ t << "\\textbf{";
docify(text);
t << "}";
}
@@ -993,15 +1007,15 @@ void LatexGenerator::writeObjectLink(const char *ref, const char *f,
void LatexGenerator::startPageRef()
{
- t << " {\\rm (";
+ t << " \\doxyref{";
}
void LatexGenerator::endPageRef(const char *clname, const char *anchor)
{
- t << "\\,\\pageref{";
+ t << "}{";
if (clname) t << clname;
if (anchor) t << "_" << anchor;
- t << "})}";
+ t << "}";
}
void LatexGenerator::writeCodeLink(const char *,const char *,
@@ -1406,7 +1420,7 @@ void LatexGenerator::endMemberList()
void LatexGenerator::startMemberGroupHeader(bool hasHeader)
{
if (hasHeader) t << "\\begin{Indent}";
- t << "{\\bf ";
+ t << "\\textbf{";
}
void LatexGenerator::endMemberGroupHeader()
diff --git a/src/latexgen.h b/src/latexgen.h
index 6a7a484..bfca4ed 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -115,14 +115,14 @@ class LatexGenerator : public OutputGenerator
void writeRuler() { t << endl << endl; /*t << "\\vspace{0.4cm}\\hrule\\vspace{0.2cm}" << endl; */ }
void writeAnchor(const char *fileName,const char *name);
- void startCodeFragment() { t << endl << endl << "\\footnotesize\\begin{verbatim}"; }
- void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; }
+ void startCodeFragment() { t << endl << endl << "\\begin{Code}\\begin{verbatim}"; }
+ void endCodeFragment() { t << "\\end{verbatim}\\end{Code}" << endl; }
void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; }
void startCodeLine() { col=0; }
void endCodeLine() { codify("\n"); }
void startEmphasis() { t << "{\\em "; }
void endEmphasis() { t << "}"; }
- void startBold() { t << "{\\bf "; }
+ void startBold() { t << "\\textbf{"; }
void endBold() { t << "}"; }
void startDescription();
void endDescription();
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 2f40015..6d2761c 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -79,7 +79,7 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr
static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
const QCString & /*scopeName*/,MemberDef *md)
{
- ArgumentList *defArgList=md->isDocsForDefinition() ?
+ ArgumentList *defArgList=(md->isDocsForDefinition() && !md->isProperty()) ?
md->argumentList() : md->declArgumentList();
//printf("writeDefArgumentList `%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition());
if (defArgList==0)
@@ -1150,6 +1150,25 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.endTypewriter();
}
+ if (isProperty())
+ {
+ ol.writeLatexSpacing();
+ ol.startTypewriter();
+ ol.docify(" [");
+ QStrList sl;
+ if (isGettable()) sl.append("get");
+ if (isSettable()) sl.append("set");
+ const char *s=sl.first();
+ while (s)
+ {
+ ol.docify(s);
+ s=sl.next();
+ if (s) ol.docify(", ");
+ }
+ ol.docify("]");
+ ol.endTypewriter();
+ }
+
if (!detailsVisible && !annMemb)
{
ol.endDoxyAnchor(cfname,anchor());
diff --git a/src/pyscanner.l b/src/pyscanner.l
index 15caa43..d29b2c1 100644
--- a/src/pyscanner.l
+++ b/src/pyscanner.l
@@ -154,6 +154,20 @@ static void newVariable()
newEntry();
}
+static void newFunction()
+{
+ if (current->name.left(2)=="__" && current->name.right(2)=="__")
+ {
+ // special method name, see
+ // http://docs.python.org/ref/specialnames.html
+ current->protection=Public;
+ }
+ else if (current->name.at(0)=='_')
+ {
+ current->protection=Private;
+ }
+}
+
static inline int computeIndent(const char *s)
{
int col=0;
@@ -804,6 +818,7 @@ STARTDOCSYMS ^{B}"##"/[^#]
}
current->name = yytext;
current->name = current->name.stripWhiteSpace();
+ newFunction();
}
{B}"(" {
@@ -984,7 +999,7 @@ STARTDOCSYMS ^{B}"##"/[^#]
}
<ClassInheritance>{
- ({BB}|[(,)]) { // syntactic sugar for the list
+ ({BB}|[\(,\)]) { // syntactic sugar for the list
}
":" { // begin of the class definition
diff --git a/src/scanner.l b/src/scanner.l
index 4465b9a..bb941f7 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -158,6 +158,9 @@ static bool docBlockInBody;
static bool docBlockJavaStyle;
static char docBlockTerm;
+static QCString idlAttr;
+static QCString idlProp;
+
//-----------------------------------------------------------------------------
@@ -657,6 +660,10 @@ IDLATTR ("["[^\]]*"]"){BN}*
%x CopyArgCommentLine
%x CopyArgVerbatim
+%x IDLAttribute
+%x IDLProp
+%x IDLPropName
+
/** Prototype scanner states */
%x Prototype
@@ -2189,11 +2196,14 @@ IDLATTR ("["[^\]]*"]"){BN}*
}
<FindMembers>"[" {
- if (current->name.isEmpty() || current->name=="typedef") // IDL function property
- {
- squareCount=1;
+ if (current->name.isEmpty() || current->name=="typedef") // IDL function property
+ {
+ squareCount=1;
lastSquareContext = YY_START;
- BEGIN(SkipSquare);
+ idlAttr.resize(0);
+ idlProp.resize(0);
+ current->mtype = mtype;
+ BEGIN( IDLAttribute );
}
else
{
@@ -2202,6 +2212,75 @@ IDLATTR ("["[^\]]*"]"){BN}*
BEGIN( Array ) ;
}
}
+<IDLAttribute>"]" {
+ // end of IDL function attribute
+ if (--squareCount<=0)
+ {
+ lineCount();
+ if (current->mtype == Property)
+ BEGIN( IDLPropName );
+ else
+ BEGIN( lastSquareContext );
+ }
+ }
+<IDLAttribute>"propput" {
+ current->mtype = Property;
+ current->memSpec |= Entry::Settable;
+ }
+<IDLAttribute>"propget" {
+ current->mtype = Property;
+ current->memSpec |= Entry::Gettable;
+ }
+<IDLAttribute>. {
+ }
+<IDLPropName>{BN}*{ID}{BN}* {
+ // return type (probably HRESULT) - skip it
+ }
+<IDLPropName>{ID}{BN}*"(" {
+ current->name = yytext;
+ current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
+ current->startLine = yyLineNr;
+ BEGIN( IDLProp );
+ }
+<IDLProp>{BN}*"["[^\]]*"]"{BN}* { // attribute of a parameter
+ idlAttr += yytext;
+ }
+<IDLProp>{ID} { // property type
+ idlProp = yytext;
+ }
+<IDLProp>{BN}*{ID}{BN}*"," { // Rare: Another parameter ([propput] HRESULT Item(int index, [in] Type theRealProperty);)
+ if (!current->args)
+ current->args = "(";
+ else
+ current->args += ", ";
+ current->args += idlAttr;
+ current->args += " ";
+ current->args += idlProp; // prop was actually type of extra parameter
+ current->args += " ";
+ current->args += yytext;
+ current->args = current->args.left(current->args.length() - 1); // strip comma
+ idlProp.resize(0);
+ idlAttr.resize(0);
+ BEGIN( IDLProp );
+ }
+<IDLProp>{BN}*{ID}{BN}*")"{BN}* {
+ // the parameter name for the property - just skip.
+ }
+<IDLProp>";" {
+ current->fileName = yyFileName;
+ current->type = idlProp;
+ current->args = current->args.simplifyWhiteSpace();
+ if (current->args)
+ current->args += ")";
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::VARIABLE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+ BEGIN( FindMembers );
+ }
+<IDLProp>. {
+ }
<Array>"]" { current->args += *yytext ;
if (--squareCount<=0)
BEGIN( FindMembers ) ;
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 22f8e68..a479842 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -953,7 +953,15 @@ static void writeInnerClasses(const ClassSDict *cl,QTextStream &t)
if (cd->name().find('@')==-1) // skip anonymous scopes
{
t << " <innerclass refid=\"" << cd->getOutputFileBase()
- << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
+ << "\" prot=\"";
+ switch(cd->protection())
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
+ }
+ t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
}
}
}