diff options
author | Petr Prikryl <prikryl@atlas.cz> | 2013-06-18 06:39:12 (GMT) |
---|---|---|
committer | Petr Prikryl <prikryl@atlas.cz> | 2013-06-18 06:39:12 (GMT) |
commit | e3d21b2da50edbca18087608207c41a4d805a946 (patch) | |
tree | 278830874f914495ef184f7fa14873b42cadf1fe | |
parent | 775978d39fdc6bd3c3427499f0fe72d1a1a5f43e (diff) | |
parent | 0e1e9f73e1f85380ace3de21692f110b96322c0d (diff) | |
download | Doxygen-e3d21b2da50edbca18087608207c41a4d805a946.zip Doxygen-e3d21b2da50edbca18087608207c41a4d805a946.tar.gz Doxygen-e3d21b2da50edbca18087608207c41a4d805a946.tar.bz2 |
Merge branch 'master' of https://github.com/doxygen/doxygen.git
38 files changed, 330 insertions, 104 deletions
diff --git a/Makefile.in b/Makefile.in index 606804f..99a616a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -82,7 +82,7 @@ pdf: docs DISTFILES = Doxyfile libmd5 addon tmake doc examples bin lib objects \ qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \ Makefile.win_make.in INSTALL LANGUAGE.HOWTO LICENSE PLATFORMS \ - VERSION packages winbuild jquery + VERSION README.md packages winbuild jquery archive: clean tar zcvf dx`date +%y%m%d`.tgz $(DISTFILES) @@ -7,6 +7,7 @@ languages such as C, Objective-C, C#, PHP, Java, Python, IDL and to some extent D. Doxygen can help you in three ways: + 1. It can generate an on-line documentation browser (in HTML) and/or an off-line reference manual (in LaTeX) from a set of documented source files. There is also support for generating output in RTF (MS-Word), PostScript, diff --git a/qtools/qfileinfo_win32.cpp b/qtools/qfileinfo_win32.cpp index 8f83107..2e1ecae 100644 --- a/qtools/qfileinfo_win32.cpp +++ b/qtools/qfileinfo_win32.cpp @@ -266,7 +266,7 @@ void QFileInfo::doStat() const } #else QString file = fn; - reslashify(file); + reslashify(QDir::cleanDirPath(file)); #ifdef QT_LARGEFILE_SUPPORT if ( _wstati64( (wchar_t*) file.ucs2(), b ) == -1 ) { #else @@ -18,6 +18,8 @@ #ifndef CODE_H #define CODE_H +#include "types.h" + class CodeOutputInterface; class FileDef; class MemberDef; @@ -25,7 +27,7 @@ class QCString; class Definition; void parseCCode(CodeOutputInterface &,const char *,const QCString &, - bool ,const char *,FileDef *fd, + SrcLangExt lang, bool isExample, const char *exName,FileDef *fd, int startLine,int endLine,bool inlineFragment, MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx); void resetCCodeParserState(); @@ -112,6 +112,9 @@ static int g_memCallContext; static int g_lastCContext; static bool g_insideObjC; +static bool g_insideJava; +static bool g_insideCS; +static bool g_insidePHP; static bool g_insideProtocolList; static bool g_lexInit = FALSE; @@ -863,7 +866,7 @@ static bool getLinkInScope(const QCString &c, // scope } Definition *d = md->getOuterScope()==Doxygen::globalScope ? - md->getBodyDef() : md->getOuterScope(); + md->getFileDef() : md->getOuterScope(); if (md->getGroupDef()) d = md->getGroupDef(); if (d && d->isLinkable()) { @@ -927,7 +930,14 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName { className+="-p"; } - className = substitute(className,"\\","::"); // for PHP namespaces + if (g_insidePHP) + { + className = substitute(className,"\\","::"); // for PHP namespaces + } + else if (g_insideCS || g_insideJava) + { + className = substitute(className,".","::"); // for PHP namespaces + } ClassDef *cd=0,*lcd=0; MemberDef *md=0; bool isLocal=FALSE; @@ -1000,7 +1010,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName if (md) { Definition *d = md->getOuterScope()==Doxygen::globalScope ? - md->getBodyDef() : md->getOuterScope(); + md->getFileDef() : md->getOuterScope(); if (md->getGroupDef()) d = md->getGroupDef(); if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef) { @@ -1098,7 +1108,7 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const g_theCallContext.setClass(typeClass); Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ? - xmd->getBodyDef() : xmd->getOuterScope(); + xmd->getFileDef() : xmd->getOuterScope(); if (xmd->getGroupDef()) xd = xmd->getGroupDef(); if (xd && xd->isLinkable()) { @@ -1747,8 +1757,10 @@ static int yyread(char *buf,int max_size) B [ \t] BN [ \t\n\r] ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* -SEP ("::"|"\\") +SEP ("::"|"\\") +SEPCS (".") SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID} +SCOPENAMECS ({SEPCS}{BN}*)?({ID}{BN}*{SEPCS}{BN}*)*("~"{BN}*)?{ID} TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID}) SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+ @@ -2492,6 +2504,20 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" generateClassOrGlobalLink(*g_code,yytext); g_name+=yytext; } +<Body>{SCOPENAMECS}/{BN}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" + if (!g_insideCS && !g_insideJava) + { + REJECT; + } + else + { + addType(); + // changed this to generateFunctionLink, see bug 624514 + //generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE); + generateFunctionLink(*g_code,yytext); + g_name+=yytext; + } + } <Body>{SCOPENAME}/{BN}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" addType(); // changed this to generateFunctionLink, see bug 624514 @@ -2499,6 +2525,18 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" generateFunctionLink(*g_code,yytext); g_name+=yytext; } +<Body>{SCOPENAMECS}/{B}* { // p->func() + if (!g_insideCS && !g_insideJava) + { + REJECT; + } + else + { + addType(); + generateClassOrGlobalLink(*g_code,yytext); + g_name+=yytext; + } + } <Body>{SCOPENAME}/{B}* { // p->func() addType(); generateClassOrGlobalLink(*g_code,yytext); @@ -3514,7 +3552,7 @@ void resetCCodeParserState() } void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, - bool exBlock, const char *exName,FileDef *fd, + SrcLangExt lang,bool exBlock, const char *exName,FileDef *fd, int startLine,int endLine,bool inlineFragment, MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx) { @@ -3562,11 +3600,13 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, g_sourceFileDef = new FileDef("",(exName?exName:"generated")); cleanupSourceDef = TRUE; } + g_insideObjC = lang==SrcLangExt_ObjC; + g_insideJava = lang==SrcLangExt_Java; + g_insideCS = lang==SrcLangExt_CSharp; + g_insidePHP = lang==SrcLangExt_PHP; if (g_sourceFileDef) { setCurrentDoc("l00001"); - g_insideObjC = g_sourceFileDef->name().lower().right(2)==".m" || - g_sourceFileDef->name().lower().right(3)==".mm"; } g_currentDefinition = 0; g_currentMemberDef = 0; diff --git a/src/commentscan.l b/src/commentscan.l index b12dd3d..9a51e6b 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -414,8 +414,8 @@ static bool parseMore; static int g_condCount; static int g_commentCount; -static bool g_spaceBeforeCmd; -static bool g_spaceBeforeIf; +static QCString g_spaceBeforeCmd; +static QCString g_spaceBeforeIf; static QCString g_copyDocArg; static QCString g_guardExpr; @@ -1033,17 +1033,17 @@ RCSTAG "$"{ID}":"[^\n$]+"$" // the {B}* in the front was added for bug620924 QCString cmdName = QCString(yytext).stripWhiteSpace().data()+1; DocCmdMapper::Cmd *cmdPtr = DocCmdMapper::map(cmdName); - g_spaceBeforeCmd = yytext[0]==' ' || yytext[0]=='\t'; if (cmdPtr) // special action is required { + int i=0; + while (yytext[i]==' ' || yytext[i]=='\t') i++; + g_spaceBeforeCmd = QCString(yytext).left(i); if (cmdPtr->endsBrief) { briefEndsAtDot=FALSE; // this command forces the end of brief description setOutput(OutputDoc); } - int i=0; - while (yytext[i]==' ' || yytext[i]=='\t') i++; //if (i>0) addOutput(QCString(yytext).left(i)); // removed for bug 689341 if (cmdPtr->func && cmdPtr->func(cmdName)) { @@ -1067,7 +1067,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" { // command without handler, to be processed // later by parsedoc.cpp - addOutput(yytext+i); + addOutput(yytext); } } else // command not relevant @@ -1795,15 +1795,15 @@ RCSTAG "$"{ID}":"[^\n$]+"$" addOutput(*yytext); } <GuardParamEnd>{B}*{DOCNL} { - g_spaceBeforeIf=FALSE; + g_spaceBeforeIf.resize(0); BEGIN(Comment); } <GuardParamEnd>{B}* { - if (g_spaceBeforeIf) // needed for 665313 in combation with bug620924 + if (!g_spaceBeforeIf.isEmpty()) // needed for 665313 in combation with bug620924 { - addOutput(" "); + addOutput(g_spaceBeforeIf); } - g_spaceBeforeIf=FALSE; + g_spaceBeforeIf.resize(0); BEGIN(Comment); } <GuardParamEnd>. { @@ -2430,10 +2430,10 @@ static bool handleSubpage(const QCString &s) warn(yyFileName,yyLineNr, "found \\subpage command in a comment block that is not marked as a page!"); } - if (g_spaceBeforeCmd) + if (!g_spaceBeforeCmd.isEmpty()) { - addOutput(' '); - g_spaceBeforeCmd=FALSE; + addOutput(g_spaceBeforeCmd); + g_spaceBeforeCmd.resize(0); } addOutput("@"+s+" "); BEGIN(SubpageLabel); @@ -2449,10 +2449,10 @@ static bool handleAnchor(const QCString &s) static bool handleCite(const QCString &s) { - if (g_spaceBeforeCmd) + if (!g_spaceBeforeCmd.isEmpty()) { - addOutput(' '); - g_spaceBeforeCmd=FALSE; + addOutput(g_spaceBeforeCmd); + g_spaceBeforeCmd.resize(0); } addOutput("@"+s+" "); BEGIN(CiteLabel); @@ -2535,10 +2535,10 @@ static bool handleEndIf(const QCString &) delete guards.pop(); } enabledSectionFound=FALSE; - if (g_spaceBeforeCmd) + if (!g_spaceBeforeCmd.isEmpty()) { - addOutput(' '); - g_spaceBeforeCmd=FALSE; + addOutput(g_spaceBeforeCmd); + g_spaceBeforeCmd.resize(0); } BEGIN( GuardParamEnd ); return FALSE; @@ -2689,10 +2689,10 @@ static bool handleCopyBrief(const QCString &) // otherwise it will be copied inline (see bug691315 & bug700788) setOutput(OutputBrief); } - if (g_spaceBeforeCmd) + if (!g_spaceBeforeCmd.isEmpty()) { - addOutput(' '); - g_spaceBeforeCmd=FALSE; + addOutput(g_spaceBeforeCmd); + g_spaceBeforeCmd.resize(0); } addOutput("\\copybrief "); return FALSE; @@ -2701,10 +2701,10 @@ static bool handleCopyBrief(const QCString &) static bool handleCopyDetails(const QCString &) { setOutput(OutputDoc); - if (g_spaceBeforeCmd) + if (!g_spaceBeforeCmd.isEmpty()) { - addOutput(' '); - g_spaceBeforeCmd=FALSE; + addOutput(g_spaceBeforeCmd); + g_spaceBeforeCmd.resize(0); } addOutput("\\copydetails "); return FALSE; @@ -2713,10 +2713,10 @@ static bool handleCopyDetails(const QCString &) static bool handleCopyDoc(const QCString &) { setOutput(OutputBrief); - if (g_spaceBeforeCmd) + if (!g_spaceBeforeCmd.isEmpty()) { - addOutput(' '); - g_spaceBeforeCmd=FALSE; + addOutput(g_spaceBeforeCmd); + g_spaceBeforeCmd.resize(0); } addOutput("\\copybrief "); g_copyDocArg.resize(0); @@ -2775,8 +2775,8 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, briefEndsAtDot = isAutoBriefOn; g_condCount = 0; g_sectionLevel = 0; - g_spaceBeforeCmd = FALSE; - g_spaceBeforeIf = FALSE; + g_spaceBeforeCmd.resize(0); + g_spaceBeforeIf.resize(0); if (!current->inbodyDocs.isEmpty() && isInbody) // separate in body fragments { diff --git a/src/dbusxmlscanner.cpp b/src/dbusxmlscanner.cpp index bfb5cd0..12168dd 100644 --- a/src/dbusxmlscanner.cpp +++ b/src/dbusxmlscanner.cpp @@ -861,6 +861,7 @@ bool DBusXMLScanner::needsPreprocessing(const QCString & /* extension */) void DBusXMLScanner::parseCode(CodeOutputInterface & /* codeOutIntf */, const char * /* scopeName */, const QCString & /* input */, + SrcLangExt /* lang */, bool /* isExampleBlock */, const char * /* exampleName */, FileDef * /* fileDef */, diff --git a/src/dbusxmlscanner.h b/src/dbusxmlscanner.h index a0ead5a..64ba1a7 100644 --- a/src/dbusxmlscanner.h +++ b/src/dbusxmlscanner.h @@ -42,6 +42,7 @@ public: void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName=0, FileDef *fileDef=0, diff --git a/src/definition.cpp b/src/definition.cpp index fe1afb7..5cde4ce 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -1044,6 +1044,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) pIntf->parseCode(ol, // codeOutIntf scopeName, // scope codeFragment, // input + m_impl->lang, // lang FALSE, // isExample 0, // exampleName m_impl->body->fileDef, // fileDef diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp index 3c81eda..09a78bd 100644 --- a/src/docbookgen.cpp +++ b/src/docbookgen.cpp @@ -370,11 +370,13 @@ static void writeDocbookDocBlock(FTextStream &t, void writeDocbookCodeBlock(FTextStream &t,FileDef *fd) { ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension()); + SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension()); pIntf->resetCodeParserState(); DocbookCodeGenerator *docbookGen = new DocbookCodeGenerator(t); pIntf->parseCode(*docbookGen, // codeOutIntf 0, // scopeName fileToString(fd->absFilePath(),Config_getBool("FILTER_SOURCE_FILES")), + langExt, // lang FALSE, // isExampleBlock 0, // exampleName fd, // fileDef diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp index aa750db..ad5965d 100644 --- a/src/docbookvisitor.cpp +++ b/src/docbookvisitor.cpp @@ -249,12 +249,13 @@ void DocbookDocVisitor::visit(DocStyleChange *s) void DocbookDocVisitor::visit(DocVerbatim *s) { if (m_hide) return; + SrcLangExt langExt = getLanguageFromFileName(m_langExt); switch(s->type()) { case DocVerbatim::Code: // fall though m_t << "<programlisting>"; Doxygen::parserManager->getParser(m_langExt) - ->parseCode(m_ci,s->context(),s->text(), + ->parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); m_t << "</programlisting>"; break; @@ -346,6 +347,7 @@ void DocbookDocVisitor::visit(DocAnchor *anc) void DocbookDocVisitor::visit(DocInclude *inc) { if (m_hide) return; + SrcLangExt langExt = getLanguageFromFileName(inc->extension()); switch(inc->type()) { case DocInclude::IncWithLines: @@ -356,6 +358,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile(), &fd); m_t << "</programlisting>"; @@ -366,6 +369,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile()); m_t << "</programlisting>"; @@ -385,6 +389,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) ->parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), + langExt, inc->isExample(), inc->exampleFile() ); @@ -404,6 +409,7 @@ void DocbookDocVisitor::visit(DocIncOperator *op) pushEnabled(); m_hide = TRUE; } + SrcLangExt langExt = getLanguageFromFileName(m_langExt); if (op->type()!=DocIncOperator::Skip) { popEnabled(); @@ -411,7 +417,7 @@ void DocbookDocVisitor::visit(DocIncOperator *op) { Doxygen::parserManager->getParser(m_langExt) ->parseCode(m_ci,op->context(), - op->text(),op->isExample(), + op->text(),langExt,op->isExample(), op->exampleFile()); } pushEnabled(); diff --git a/src/filedef.cpp b/src/filedef.cpp index 784ebff..a2e2d12 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -879,6 +879,7 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu) ol.startCodeFragment(); pIntf->parseCode(ol,0, fileToString(absFilePath(),filterSourceFiles,TRUE), + getLanguage(), FALSE,0,this ); ol.endCodeFragment(); @@ -917,6 +918,7 @@ void FileDef::parseSource(bool sameTu,QStrList &filesInSameTu) pIntf->parseCode( devNullIntf,0, fileToString(absFilePath(),filterSourceFiles,TRUE), + getLanguage(), FALSE,0,this ); } diff --git a/src/fortranscanner.h b/src/fortranscanner.h index c70f948..e834698 100644 --- a/src/fortranscanner.h +++ b/src/fortranscanner.h @@ -39,6 +39,7 @@ class FortranLanguageScanner : public ParserInterface void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName=0, FileDef *fileDef=0, diff --git a/src/fortranscanner.l b/src/fortranscanner.l index 278367c..08fe095 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -2306,6 +2306,7 @@ void FortranLanguageScanner::parseInput(const char *fileName, void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, const char * scopeName, const QCString & input, + SrcLangExt /*lang*/, bool isExampleBlock, const char * exampleName, FileDef * fileDef, diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 767fa5b..6fe4f35 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -417,6 +417,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) { lang = s->language(); } + SrcLangExt langExt = getLanguageFromFileName(lang); switch(s->type()) { case DocVerbatim::Code: @@ -426,6 +427,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) ->parseCode(m_ci, s->context(), s->text(), + langExt, s->isExample(), s->exampleFile(), 0, // fileDef @@ -526,6 +528,7 @@ void HtmlDocVisitor::visit(DocAnchor *anc) void HtmlDocVisitor::visit(DocInclude *inc) { if (m_hide) return; + SrcLangExt langExt = getLanguageFromFileName(inc->extension()); switch(inc->type()) { case DocInclude::Include: @@ -535,6 +538,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) ->parseCode(m_ci, inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile(), 0, // fileDef @@ -558,6 +562,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) ->parseCode(m_ci, inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile(), &fd, // fileDef, @@ -592,6 +597,7 @@ void HtmlDocVisitor::visit(DocInclude *inc) ->parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), + langExt, inc->isExample(), inc->exampleFile(), 0, @@ -619,6 +625,7 @@ void HtmlDocVisitor::visit(DocIncOperator *op) pushEnabled(); m_hide=TRUE; } + SrcLangExt langExt = getLanguageFromFileName(m_langExt); if (op->type()!=DocIncOperator::Skip) { popEnabled(); @@ -629,6 +636,7 @@ void HtmlDocVisitor::visit(DocIncOperator *op) m_ci, op->context(), op->text(), + langExt, op->isExample(), op->exampleFile(), 0, // fileDef diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 25f8c46..cdcf8b4 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -339,13 +339,14 @@ void LatexDocVisitor::visit(DocVerbatim *s) { lang = s->language(); } + SrcLangExt langExt = getLanguageFromFileName(lang); switch(s->type()) { case DocVerbatim::Code: { m_t << "\n\\begin{DoxyCode}\n"; Doxygen::parserManager->getParser(lang) - ->parseCode(m_ci,s->context(),s->text(), + ->parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); m_t << "\\end{DoxyCode}\n"; } @@ -435,6 +436,7 @@ void LatexDocVisitor::visit(DocAnchor *anc) void LatexDocVisitor::visit(DocInclude *inc) { if (m_hide) return; + SrcLangExt langExt = getLanguageFromFileName(inc->extension()); switch(inc->type()) { case DocInclude::IncWithLines: @@ -445,6 +447,7 @@ void LatexDocVisitor::visit(DocInclude *inc) Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile(), &fd); m_t << "\\end{DoxyCodeInclude}" << endl; @@ -454,7 +457,7 @@ void LatexDocVisitor::visit(DocInclude *inc) m_t << "\n\\begin{DoxyCodeInclude}\n"; Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), - inc->text(),inc->isExample(), + inc->text(),langExt,inc->isExample(), inc->exampleFile()); m_t << "\\end{DoxyCodeInclude}\n"; break; @@ -474,6 +477,7 @@ void LatexDocVisitor::visit(DocInclude *inc) ->parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), + langExt, inc->isExample(), inc->exampleFile() ); @@ -493,13 +497,14 @@ void LatexDocVisitor::visit(DocIncOperator *op) pushEnabled(); m_hide = TRUE; } + SrcLangExt langExt = getLanguageFromFileName(m_langExt); if (op->type()!=DocIncOperator::Skip) { popEnabled(); if (!m_hide) { Doxygen::parserManager->getParser(m_langExt) - ->parseCode(m_ci,op->context(),op->text(), + ->parseCode(m_ci,op->context(),op->text(),langExt, op->isExample(),op->exampleFile()); } pushEnabled(); diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index e854bfc..18f93bb 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -193,14 +193,21 @@ void ManDocVisitor::visit(DocStyleChange *s) void ManDocVisitor::visit(DocVerbatim *s) { if (m_hide) return; + QCString lang = m_langExt; + if (!s->language().isEmpty()) // explicit language setting + { + lang = s->language(); + } + SrcLangExt langExt = getLanguageFromFileName(lang); switch (s->type()) { case DocVerbatim::Code: // fall though if (!m_firstCol) m_t << endl; m_t << ".PP" << endl; m_t << ".nf" << endl; - Doxygen::parserManager->getParser(0/*TODO*/) + Doxygen::parserManager->getParser(lang) ->parseCode(m_ci,s->context(),s->text(), + langExt, s->isExample(),s->exampleFile()); if (!m_firstCol) m_t << endl; m_t << ".fi" << endl; @@ -240,6 +247,7 @@ void ManDocVisitor::visit(DocAnchor *) void ManDocVisitor::visit(DocInclude *inc) { if (m_hide) return; + SrcLangExt langExt = getLanguageFromFileName(inc->extension()); switch(inc->type()) { case DocInclude::IncWithLines: @@ -252,6 +260,7 @@ void ManDocVisitor::visit(DocInclude *inc) Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile(), &fd); if (!m_firstCol) m_t << endl; @@ -266,7 +275,9 @@ void ManDocVisitor::visit(DocInclude *inc) m_t << ".nf" << endl; Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), - inc->text(),inc->isExample(), + inc->text(), + langExt, + inc->isExample(), inc->exampleFile()); if (!m_firstCol) m_t << endl; m_t << ".fi" << endl; @@ -295,6 +306,7 @@ void ManDocVisitor::visit(DocInclude *inc) ->parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), + langExt, inc->isExample(), inc->exampleFile() ); @@ -308,6 +320,7 @@ void ManDocVisitor::visit(DocInclude *inc) void ManDocVisitor::visit(DocIncOperator *op) { + SrcLangExt langExt = getLanguageFromFileName(m_langExt); //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n", // op->type(),op->isFirst(),op->isLast(),op->text().data()); if (op->isFirst()) @@ -326,8 +339,8 @@ void ManDocVisitor::visit(DocIncOperator *op) popEnabled(); if (!m_hide) { - Doxygen::parserManager->getParser(0/*TODO*/) - ->parseCode(m_ci,op->context(),op->text(), + Doxygen::parserManager->getParser(m_langExt) + ->parseCode(m_ci,op->context(),op->text(),langExt, op->isExample(),op->exampleFile()); } pushEnabled(); diff --git a/src/markdown.cpp b/src/markdown.cpp index a3ac468..8f8feff 100644 --- a/src/markdown.cpp +++ b/src/markdown.cpp @@ -2341,6 +2341,7 @@ void MarkdownFileParser::parseInput(const char *fileName, void MarkdownFileParser::parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName, FileDef *fileDef, @@ -2356,7 +2357,7 @@ void MarkdownFileParser::parseCode(CodeOutputInterface &codeOutIntf, if (pIntf!=this) { pIntf->parseCode( - codeOutIntf,scopeName,input,isExampleBlock,exampleName, + codeOutIntf,scopeName,input,lang,isExampleBlock,exampleName, fileDef,startLine,endLine,inlineFragment,memberDef,showLineNumbers,searchCtx); } } diff --git a/src/markdown.h b/src/markdown.h index 71884d5..daabc33 100644 --- a/src/markdown.h +++ b/src/markdown.h @@ -39,6 +39,7 @@ class MarkdownFileParser : public ParserInterface void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName=0, FileDef *fileDef=0, diff --git a/src/memberdef.cpp b/src/memberdef.cpp index c5bf787..4c9e900 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -2701,7 +2701,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension()); pIntf->resetCodeParserState(); ol.startCodeFragment(); - pIntf->parseCode(ol,scopeName,m_impl->initializer,FALSE,0,getFileDef(), + pIntf->parseCode(ol,scopeName,m_impl->initializer,lang,FALSE,0,getFileDef(), -1,-1,TRUE,this,FALSE,this); ol.endCodeFragment(); } @@ -3795,6 +3795,12 @@ QCString MemberDef::qualifiedName() const qm+="]"; return qm; } + else if (m_impl->enumScope && m_impl->enumScope->isStrong()) + { + return m_impl->enumScope->qualifiedName()+ + getLanguageSpecificSeparator(getLanguage())+ + localName(); + } else { return Definition::qualifiedName(); @@ -4139,6 +4145,13 @@ bool MemberDef::isStrong() const return (m_impl->memSpec&Entry::Strong)!=0; } +bool MemberDef::isStrongEnumValue() const +{ + return m_impl->mtype==MemberType_EnumValue && + m_impl->enumScope && + m_impl->enumScope->isStrong(); +} + bool MemberDef::isUnretained() const { return (m_impl->memSpec&Entry::Unretained)!=0; @@ -4845,4 +4858,3 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef) } } - diff --git a/src/memberdef.h b/src/memberdef.h index 8c88f7c..fc2bb44 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -169,6 +169,7 @@ class MemberDef : public Definition bool hasMultiLineInitializer() const; bool protectionVisible() const; bool showInCallGraph() const; + bool isStrongEnumValue() const; // output info bool isLinkableInProject() const; diff --git a/src/message.cpp b/src/message.cpp index dd1f05c..7c9c02b 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -26,8 +26,8 @@ #include "filedef.h" static QCString outputFormat; -static const char *warning_str = "Warning: "; -static const char *error_str = "Error: "; +static const char *warning_str = "warning: "; +static const char *error_str = "error: "; //static int warnFormatOrder; // 1 = $file,$line,$text // // 2 = $text,$line,$file // // 3 = $line,$text,$file diff --git a/src/parserintf.h b/src/parserintf.h index 0274c13..40c82dc 100644 --- a/src/parserintf.h +++ b/src/parserintf.h @@ -21,6 +21,8 @@ #include <qdict.h> #include <qstrlist.h> +#include "types.h" + class Entry; class FileDef; class CodeOutputInterface; @@ -79,6 +81,7 @@ class ParserInterface /** Parses a source file or fragment with the goal to produce * highlighted and cross-referenced output. * @param[in] codeOutIntf Abstract interface for writing the result. + * @param[in] lang The programming language of the code fragment. * @param[in] scopeName Name of scope to which the code belongs. * @param[in] input Actual code in the form of a string * @param[in] isExampleBlock TRUE iff the code is part of an example. @@ -99,6 +102,7 @@ class ParserInterface virtual void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName=0, FileDef *fileDef=0, @@ -232,6 +232,7 @@ class DefineManager Define *isDefined(const char *name) const { Define *d = m_contextDefines.find(name); + if (d && d->undef) d=0; //printf("isDefined(%s)=%p\n",name,d); return d; } diff --git a/src/pycode.h b/src/pycode.h index ef9d47c..bdaef55 100644 --- a/src/pycode.h +++ b/src/pycode.h @@ -25,13 +25,15 @@ #ifndef PYCODE_H #define PYCODE_H +#include "types.h" + class CodeOutputInterface; class FileDef; class MemberDef; class QCString; class Definition; -extern void parsePythonCode(CodeOutputInterface &,const char *,const QCString &, +extern void parsePythonCode(CodeOutputInterface &,const char *,const QCString &, bool ,const char *,FileDef *fd, int startLine,int endLine,bool inlineFragment, MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx); diff --git a/src/pyscanner.h b/src/pyscanner.h index 707edbd..5cc69d9 100644 --- a/src/pyscanner.h +++ b/src/pyscanner.h @@ -46,6 +46,7 @@ class PythonLanguageScanner : public ParserInterface void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName=0, FileDef *fileDef=0, diff --git a/src/pyscanner.l b/src/pyscanner.l index 69b7558..69523d2 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -1700,6 +1700,7 @@ bool PythonLanguageScanner::needsPreprocessing(const QCString &) void PythonLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt /*lang*/, bool isExampleBlock, const char *exampleName, FileDef *fileDef, diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 2d07957..9489145 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -420,6 +420,7 @@ void RTFDocVisitor::visit(DocVerbatim *s) { lang = s->language(); } + SrcLangExt langExt = getLanguageFromFileName(lang); switch(s->type()) { case DocVerbatim::Code: // fall though @@ -427,7 +428,7 @@ void RTFDocVisitor::visit(DocVerbatim *s) m_t << "\\par" << endl; m_t << rtf_Style_Reset << getStyle("CodeExample"); Doxygen::parserManager->getParser(lang) - ->parseCode(m_ci,s->context(),s->text(), + ->parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); //m_t << "\\par" << endl; m_t << "}" << endl; @@ -527,6 +528,7 @@ void RTFDocVisitor::visit(DocAnchor *anc) void RTFDocVisitor::visit(DocInclude *inc) { if (m_hide) return; + SrcLangExt langExt = getLanguageFromFileName(inc->extension()); DBG_RTF("{\\comment RTFDocVisitor::visit(DocInclude)}\n"); switch(inc->type()) { @@ -540,6 +542,7 @@ void RTFDocVisitor::visit(DocInclude *inc) Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile(), &fd); m_t << "\\par"; @@ -552,7 +555,7 @@ void RTFDocVisitor::visit(DocInclude *inc) m_t << rtf_Style_Reset << getStyle("CodeExample"); Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), - inc->text(),inc->isExample(), + inc->text(),langExt,inc->isExample(), inc->exampleFile()); m_t << "\\par"; m_t << "}" << endl; @@ -577,6 +580,7 @@ void RTFDocVisitor::visit(DocInclude *inc) ->parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), + langExt, inc->isExample(), inc->exampleFile() ); @@ -591,6 +595,7 @@ void RTFDocVisitor::visit(DocIncOperator *op) //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n", // op->type(),op->isFirst(),op->isLast(),op->text().data()); DBG_RTF("{\\comment RTFDocVisitor::visit(DocIncOperator)}\n"); + SrcLangExt langExt = getLanguageFromFileName(m_langExt); if (op->isFirst()) { if (!m_hide) @@ -608,7 +613,7 @@ void RTFDocVisitor::visit(DocIncOperator *op) if (!m_hide) { Doxygen::parserManager->getParser(m_langExt) - ->parseCode(m_ci,op->context(),op->text(), + ->parseCode(m_ci,op->context(),op->text(),langExt, op->isExample(),op->exampleFile()); } pushEnabled(); diff --git a/src/scanner.h b/src/scanner.h index 54a3c1c..f26accb 100644 --- a/src/scanner.h +++ b/src/scanner.h @@ -41,6 +41,7 @@ class CLanguageScanner : public ParserInterface void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName=0, FileDef *fileDef=0, diff --git a/src/scanner.l b/src/scanner.l index 4ae410e..65bb405 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -45,10 +45,6 @@ #include "clangparser.h" -// Toggle for some debugging info -#define DBG_CTX(x) fprintf x -//#define DBG_CTX(x) do { } while(0) - #define YY_NEVER_INTERACTIVE 1 #define YY_NO_INPUT 1 @@ -526,7 +522,6 @@ static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName) oldStyleArgName=current->args.copy().stripWhiteSpace(); } } - DBG_CTX((stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data())); } //----------------------------------------------------------------------------- @@ -4656,7 +4651,6 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else if (checkForKnRstyleC()) { - DBG_CTX((stderr,"===> got a K&R style function\n")); current->args = yytext; oldStyleArgType.resize(0); BEGIN(OldStyleArgs); @@ -6827,6 +6821,7 @@ void CLanguageScanner::parseInput(const char *fileName, void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, const char * scopeName, const QCString & input, + SrcLangExt lang, bool isExampleBlock, const char * exampleName, FileDef * fileDef, @@ -6838,7 +6833,7 @@ void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, Definition *searchCtx ) { - ::parseCCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, + ::parseCCode(codeOutIntf,scopeName,input,lang,isExampleBlock,exampleName, fileDef,startLine,endLine,inlineFragment,memberDef, showLineNumbers,searchCtx); } diff --git a/src/tclscanner.h b/src/tclscanner.h index a7c0dde..7cd93b9 100644 --- a/src/tclscanner.h +++ b/src/tclscanner.h @@ -40,6 +40,7 @@ class TclLanguageScanner : public ParserInterface void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName=0, FileDef *fileDef=0, diff --git a/src/tclscanner.l b/src/tclscanner.l index 73b2b58..2129bf0 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -2560,6 +2560,7 @@ tcl_inf("%s\n",fileName); void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, const char * scopeName, const QCString & input, + SrcLangExt lang, bool isExampleBlock, const char * exampleName, FileDef * fileDef, @@ -2572,6 +2573,7 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, ) { (void)scopeName; + (void)lang; (void)exampleName; (void)fileDef; (void)endLine; diff --git a/src/util.cpp b/src/util.cpp index 0c36fc0..b66932e 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1593,6 +1593,12 @@ ClassDef *getResolvedClass(Definition *scope, { result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec,pResolvedType); } + if (result==0) // for nested classes imported via tag files, the scope may not + // present, so we check the class name directly as well. + // See also bug701314 + { + result = getClass(n); + } if (!mayBeUnlinkable && result && !result->isLinkable()) { if (!mayBeHidden || !result->isHidden()) @@ -1873,20 +1879,24 @@ int findParameterList(const QString &name) bool rightScopeMatch(const QCString &scope, const QCString &name) { + int sl=scope.length(); + int nl=name.length(); return (name==scope || // equal - (scope.right(name.length())==name && // substring - scope.at(scope.length()-name.length()-1)==':' // scope - ) - ); + (scope.right(nl)==name && // substring + sl-nl>1 && scope.at(sl-nl-1)==':' && scope.at(sl-nl-2)==':' // scope + ) + ); } bool leftScopeMatch(const QCString &scope, const QCString &name) { + int sl=scope.length(); + int nl=name.length(); return (name==scope || // equal - (scope.left(name.length())==name && // substring - scope.at(name.length())==':' // scope - ) - ); + (scope.left(nl)==name && // substring + sl>nl+1 && scope.at(nl)==':' && scope.at(nl+1)==':' // scope + ) + ); } @@ -3901,7 +3911,7 @@ static void findMembersWithSpecificName(MemberName *mn, * file fd. */ bool getDefs(const QCString &scName, - const QCString &memberName, + const QCString &mbName, const char *args, MemberDef *&md, ClassDef *&cd, @@ -3915,10 +3925,12 @@ bool getDefs(const QCString &scName, ) { fd=0, md=0, cd=0, nd=0, gd=0; - if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */ + if (mbName.isEmpty()) return FALSE; /* empty name => nothing to link */ QCString scopeName=scName; + QCString memberName=mbName; scopeName = substitute(scopeName,"\\","::"); // for PHP + memberName = substitute(memberName,"\\","::"); // for PHP //printf("Search for name=%s args=%s in scope=%s forceEmpty=%d\n", // memberName.data(),args,scopeName.data(),forceEmptyScope); @@ -3972,8 +3984,9 @@ bool getDefs(const QCString &scName, className=mScope; } - ClassDef *fcd=getResolvedClass(Doxygen::globalScope,0,className); - //printf("Trying class scope %s: %p\n",className.data(),fcd); + MemberDef *tmd=0; + ClassDef *fcd=getResolvedClass(Doxygen::globalScope,0,className,&tmd); + //printf("Trying class scope %s: fcd=%p tmd=%p\n",className.data(),fcd,tmd); // todo: fill in correct fileScope! if (fcd && // is it a documented class fcd->isLinkable() @@ -3991,30 +4004,30 @@ bool getDefs(const QCString &scName, } for (mmli.toFirst();(mmd=mmli.current());++mmli) { - //if (mmd->isLinkable()) - //{ - ArgumentList *mmdAl = mmd->argumentList(); - bool match=args==0 || - matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl, - fcd,fcd->getFileDef(),argList, - checkCV - ); - //printf("match=%d\n",match); - if (match) + if (!mmd->isStrongEnumValue()) { - ClassDef *mcd=mmd->getClassDef(); - if (mcd) + ArgumentList *mmdAl = mmd->argumentList(); + bool match=args==0 || + matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl, + fcd,fcd->getFileDef(),argList, + checkCV + ); + //printf("match=%d\n",match); + if (match) { - int m=minClassDistance(fcd,mcd); - if (m<mdist && mcd->isLinkable()) + ClassDef *mcd=mmd->getClassDef(); + if (mcd) { - mdist=m; - cd=mcd; - md=mmd; + int m=minClassDistance(fcd,mcd); + if (m<mdist && mcd->isLinkable()) + { + mdist=m; + cd=mcd; + md=mmd; + } } } } - //} } if (argList) { @@ -4047,7 +4060,7 @@ bool getDefs(const QCString &scName, //printf(" >Succes=%d\n",mdist<maxInheritanceDepth); if (mdist<maxInheritanceDepth) { - if (!md->isLinkable()) + if (!md->isLinkable() || md->isStrongEnumValue()) { md=0; // avoid returning things we cannot link to cd=0; @@ -4061,6 +4074,34 @@ bool getDefs(const QCString &scName, } } } + if (tmd && tmd->isEnumerate() && tmd->isStrong()) // scoped enum + { + //printf("Found scoped enum!\n"); + MemberList *tml = tmd->enumFieldList(); + if (tml) + { + MemberListIterator tmi(*tml); + MemberDef *emd; + for (;(emd=tmi.current());++tmi) + { + if (emd->localName()==mName) + { + if (emd->isLinkable()) + { + cd=tmd->getClassDef(); + md=emd; + } + else + { + cd=0; + md=0; + } + //printf("result cd=%p md=%p\n",cd,md); + return TRUE; + } + } + } + } /* go to the parent scope */ if (scopeOffset==0) { @@ -4075,6 +4116,7 @@ bool getDefs(const QCString &scName, } if (mn && scopeName.isEmpty() && mScope.isEmpty()) // Maybe a related function? { + //printf("Global symbol\n"); MemberListIterator mmli(*mn); MemberDef *mmd, *fuzzy_mmd = 0; ArgumentList *argList = 0; @@ -4108,7 +4150,7 @@ bool getDefs(const QCString &scName, mmd = mmd ? mmd : fuzzy_mmd; - if (mmd) + if (mmd && !mmd->isStrongEnumValue()) { md = mmd; cd = mmd->getClassDef(); @@ -4142,7 +4184,8 @@ bool getDefs(const QCString &scName, fnd->isLinkable() ) { - //printf("Function inside existing namespace `%s'\n",namespaceName.data()); + //printf("Symbol inside existing namespace `%s' count=%d\n", + // namespaceName.data(),mn->count()); bool found=FALSE; MemberListIterator mmli(*mn); MemberDef *mmd; @@ -4150,7 +4193,26 @@ bool getDefs(const QCString &scName, { //printf("mmd->getNamespaceDef()=%p fnd=%p\n", // mmd->getNamespaceDef(),fnd); - if (mmd->getNamespaceDef()==fnd /* && mmd->isLinkable() */ ) + MemberDef *emd = mmd->getEnumScope(); + if (emd && emd->isStrong()) + { + //printf("yes match %s<->%s!\n",mScope.data(),emd->localName().data()); + if (emd->getNamespaceDef()==fnd && + rightScopeMatch(mScope,emd->localName())) + { + //printf("found it!\n"); + nd=fnd; + md=mmd; + found=TRUE; + } + else + { + md=0; + cd=0; + return FALSE; + } + } + else if (mmd->getNamespaceDef()==fnd /* && mmd->isLinkable() */ ) { // namespace is found bool match=TRUE; ArgumentList *argList=0; @@ -4206,6 +4268,35 @@ bool getDefs(const QCString &scName, } } } + else + { + //printf("not a namespace\n"); + bool found=FALSE; + MemberListIterator mmli(*mn); + MemberDef *mmd; + for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli) + { + MemberDef *tmd = mmd->getEnumScope(); + //printf("try member %s tmd=%s\n",mmd->name().data(),tmd?tmd->name().data():"<none>"); + int ni=namespaceName.findRev("::"); + bool notInNS = tmd && ni==-1 && tmd->getNamespaceDef()==0; + bool sameNS = tmd && tmd->getNamespaceDef() && namespaceName.left(ni)==tmd->getNamespaceDef()->name(); + //printf("notInNS=%d sameNS=%d\n",notInNS,sameNS); + if (tmd && tmd->isStrong() && // C++11 enum class + (notInNS || sameNS) && + namespaceName.length()>0 // enum is part of namespace so this should not be empty + ) + { + md=mmd; + fd=mmd->getFileDef(); + gd=mmd->getGroupDef(); + if (gd && gd->isLinkable()) fd=0; else gd=0; + //printf("Found scoped enum %s fd=%p gd=%p\n", + // mmd->name().data(),fd,gd); + return TRUE; + } + } + } if (scopeOffset==0) { scopeOffset=-1; @@ -4238,8 +4329,10 @@ bool getDefs(const QCString &scName, //printf("member is linkable md->name()=`%s'\n",md->name().data()); fd=md->getFileDef(); gd=md->getGroupDef(); + MemberDef *tmd = md->getEnumScope(); if ( - (gd && gd->isLinkable()) || (fd && fd->isLinkable()) + (gd && gd->isLinkable()) || (fd && fd->isLinkable()) || + (tmd && tmd->isStrong()) ) { members.append(md); @@ -4252,7 +4345,8 @@ bool getDefs(const QCString &scName, { md=members.last(); } - if (md) // found a matching global member + if (md && (md->getEnumScope()==0 || !md->getEnumScope()->isStrong())) + // found a matching global member, that is not a scoped enum value (or uniquely matches) { fd=md->getFileDef(); gd=md->getGroupDef(); @@ -4466,6 +4560,7 @@ bool resolveRef(/* in */ const char *scName, { //printf("after getDefs checkScope=%d nameStr=%s cd=%p nd=%p\n",checkScope,nameStr.data(),cd,nd); if (checkScope && md && md->getOuterScope()==Doxygen::globalScope && + !md->isStrongEnumValue() && (!scopeStr.isEmpty() || nameStr.find("::")>0)) { // we did find a member, but it is a global one while we were explicitly @@ -4507,6 +4602,14 @@ bool resolveRef(/* in */ const char *scName, { return resolveRef(scName,name,inSeeBlock,resContext,resMember,FALSE,0,checkScope); } + if (bracePos!=-1) // Try without parameters as well, could be a contructor invocation + { + *resContext=getClass(fullName.left(bracePos)); + if (*resContext) + { + return TRUE; + } + } //printf("resolveRef: %s not found!\n",name); return FALSE; diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 7f898d6..a9af81a 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -2583,6 +2583,7 @@ void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname) pIntf->parseCode(ol, // codeOutIntf 0, // scope codeFragment, // input + SrcLangExt_VHDL, // lang FALSE, // isExample 0, // exampleName mdef->getFileDef(), // fileDef diff --git a/src/vhdlscanner.h b/src/vhdlscanner.h index 12c2d13..6ad8316 100644 --- a/src/vhdlscanner.h +++ b/src/vhdlscanner.h @@ -59,6 +59,7 @@ class VHDLLanguageScanner : public ParserInterface void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt lang, bool isExampleBlock, const char *exampleName=0, FileDef *fileDef=0, diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l index 934a985..fb0dcb7 100644 --- a/src/vhdlscanner.l +++ b/src/vhdlscanner.l @@ -796,6 +796,7 @@ void VHDLLanguageScanner::parseInput(const char *fileName, void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, const QCString &input, + SrcLangExt /*lang*/, bool isExampleBlock, const char *exampleName, FileDef *fileDef, diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index add18e3..f93b12d 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -246,12 +246,13 @@ void XmlDocVisitor::visit(DocStyleChange *s) void XmlDocVisitor::visit(DocVerbatim *s) { if (m_hide) return; + SrcLangExt langExt = getLanguageFromFileName(m_langExt); switch(s->type()) { case DocVerbatim::Code: // fall though m_t << "<programlisting>"; Doxygen::parserManager->getParser(m_langExt) - ->parseCode(m_ci,s->context(),s->text(), + ->parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); m_t << "</programlisting>"; break; @@ -310,6 +311,7 @@ void XmlDocVisitor::visit(DocAnchor *anc) void XmlDocVisitor::visit(DocInclude *inc) { if (m_hide) return; + SrcLangExt langExt = getLanguageFromFileName(inc->extension()); switch(inc->type()) { case DocInclude::IncWithLines: @@ -320,6 +322,7 @@ void XmlDocVisitor::visit(DocInclude *inc) Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile(), &fd); m_t << "</programlisting>"; @@ -330,6 +333,7 @@ void XmlDocVisitor::visit(DocInclude *inc) Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), + langExt, inc->isExample(), inc->exampleFile()); m_t << "</programlisting>"; @@ -352,6 +356,7 @@ void XmlDocVisitor::visit(DocInclude *inc) ->parseCode(m_ci, inc->context(), extractBlock(inc->text(),inc->blockId()), + langExt, inc->isExample(), inc->exampleFile() ); @@ -373,6 +378,7 @@ void XmlDocVisitor::visit(DocIncOperator *op) pushEnabled(); m_hide = TRUE; } + SrcLangExt langExt = getLanguageFromFileName(m_langExt); if (op->type()!=DocIncOperator::Skip) { popEnabled(); @@ -380,7 +386,7 @@ void XmlDocVisitor::visit(DocIncOperator *op) { Doxygen::parserManager->getParser(m_langExt) ->parseCode(m_ci,op->context(), - op->text(),op->isExample(), + op->text(),langExt,op->isExample(), op->exampleFile()); } pushEnabled(); diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index f189831..6f98b3c 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -456,11 +456,13 @@ static void writeXMLDocBlock(FTextStream &t, void writeXMLCodeBlock(FTextStream &t,FileDef *fd) { ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension()); + SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension()); pIntf->resetCodeParserState(); XMLCodeGenerator *xmlGen = new XMLCodeGenerator(t); pIntf->parseCode(*xmlGen, // codeOutIntf 0, // scopeName fileToString(fd->absFilePath(),Config_getBool("FILTER_SOURCE_FILES")), + langExt, // lang FALSE, // isExampleBlock 0, // exampleName fd, // fileDef |