Skip to content

Commit

Permalink
Issue #8206: Incorrect XHTML results
Browse files Browse the repository at this point in the history
Changes:
- Change TooltipManager back into a singleton
- Give the OutputList object a unique output id
- Increment the id at each startFile() atomically
- Pass the id to the HTML code generator
- Store tooltips per output id.
- Keep track of tooltips that are already written for a given id
- for output formats other than HTML the output id is 0 and tooltips are
  not collected and written
  • Loading branch information
doxygen committed Nov 27, 2020
1 parent 6de91dc commit a292601
Show file tree
Hide file tree
Showing 21 changed files with 140 additions and 75 deletions.
2 changes: 1 addition & 1 deletion src/clangparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@ void ClangTUParser::writeMultiLineCodeLink(CodeOutputInterface &ol,
const char *text)
{
static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
p->tooltipManager.addTooltip(d);
p->tooltipManager.addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
Expand Down
5 changes: 2 additions & 3 deletions src/code.l
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,6 @@ struct codeYY_state

VariableContext theVarContext;
CallContext theCallContext;
TooltipManager tooltipManager;
SymbolResolver symbolResolver;
};

Expand Down Expand Up @@ -2469,7 +2468,7 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
yyextra->tooltipManager.addTooltip(d);
TooltipManager::instance().addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
Expand Down Expand Up @@ -3886,7 +3885,7 @@ void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const
yyextra->sourceFileDef=0;
}
// write the tooltips
yyextra->tooltipManager.writeTooltips(od);
TooltipManager::instance().writeTooltips(od);

printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
return;
Expand Down
4 changes: 2 additions & 2 deletions src/docbookgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ void DocbookGenerator::init()
createSubDirs(d);
}

void DocbookGenerator::startFile(const char *name,const char *,const char *)
void DocbookGenerator::startFile(const char *name,const char *,const char *,int)
{
DB_GEN_C
QCString fileName=name;
Expand Down Expand Up @@ -654,7 +654,7 @@ DB_GEN_C
}
}

void DocbookGenerator::writeDoc(DocNode *n,const Definition *,const MemberDef *)
void DocbookGenerator::writeDoc(DocNode *n,const Definition *,const MemberDef *,int)
{
DB_GEN_C
DocbookDocVisitor *visitor =
Expand Down
4 changes: 2 additions & 2 deletions src/docbookgen.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,13 @@ class DocbookGenerator : public OutputGenerator
{ m_codeGen.endCodeFragment(style); }
// ---------------------------

void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md);
void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md,int id);

///////////////////////////////////////////////////////////////
// structural output interface
///////////////////////////////////////////////////////////////
void startFile(const char *name,const char *manName,
const char *title);
const char *title,int id);
void writeSearchInfo(){DB_GEN_EMPTY};
void writeFooter(const char *){DB_GEN_NEW};
void endFile();
Expand Down
5 changes: 2 additions & 3 deletions src/fortrancode.l
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ struct fortrancodeYY_state
int inTypeDecl = 0;

bool endComment = false;
TooltipManager tooltipManager;
};

#if USE_STATE2STRING
Expand Down Expand Up @@ -1017,7 +1016,7 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
yyextra->tooltipManager.addTooltip(d);
TooltipManager::instance().addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
Expand Down Expand Up @@ -1521,7 +1520,7 @@ void FortranCodeParser::parseCode(CodeOutputInterface & codeOutIntf,
yyextra->hasContLine = NULL;

// write the tooltips
yyextra->tooltipManager.writeTooltips(codeOutIntf);
TooltipManager::instance().writeTooltips(codeOutIntf);

printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
}
Expand Down
6 changes: 4 additions & 2 deletions src/htmlgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1130,14 +1130,15 @@ void HtmlGenerator::writeFooterFile(QFile &file)
static std::mutex g_indexLock;

void HtmlGenerator::startFile(const char *name,const char *,
const char *title)
const char *title,int id)
{
//printf("HtmlGenerator::startFile(%s)\n",name);
m_relPath = relativePathToRoot(name);
QCString fileName = addHtmlExtensionIfMissing(name);
m_lastTitle=title;

startPlainFile(fileName);
m_codeGen.setId(id);
m_codeGen.setTextStream(t);
m_codeGen.setRelativePath(m_relPath);
{
Expand Down Expand Up @@ -2238,8 +2239,9 @@ void HtmlGenerator::endParamList()
t << "</dl>";
}

void HtmlGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *)
void HtmlGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *,int id)
{
m_codeGen.setId(id);
HtmlDocVisitor *visitor = new HtmlDocVisitor(t,m_codeGen,ctx);
n->accept(visitor);
delete visitor;
Expand Down
7 changes: 5 additions & 2 deletions src/htmlgen.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ class HtmlCodeGenerator : public CodeOutputInterface
public:
HtmlCodeGenerator(FTextStream &t,const QCString &relPath);
HtmlCodeGenerator();
int id() const { return m_id; }
void setId(int id) { m_id = id; }
void setTextStream(FTextStream &t);
void setRelativePath(const QCString &path);
void codify(const char *text);
Expand Down Expand Up @@ -61,6 +63,7 @@ class HtmlCodeGenerator : public CodeOutputInterface
int m_col = 0;
QCString m_relPath;
bool m_lineOpen = false;
int m_id = 0;
};

/** Generator for HTML output */
Expand Down Expand Up @@ -117,9 +120,9 @@ class HtmlGenerator : public OutputGenerator

void setCurrentDoc(const Definition *context,const char *anchor,bool isSourceFile);
void addWord(const char *word,bool hiPriority);
void writeDoc(DocNode *,const Definition *,const MemberDef *);
void writeDoc(DocNode *,const Definition *,const MemberDef *,int id);

void startFile(const char *name,const char *manName,const char *title);
void startFile(const char *name,const char *manName,const char *title,int id);
void writeFooter(const char *navPath);
void endFile();
void clearBuffer();
Expand Down
4 changes: 2 additions & 2 deletions src/latexgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -902,7 +902,7 @@ void LatexGenerator::writeStyleSheetFile(QFile &f)
writeDefaultStyleSheet(t);
}

void LatexGenerator::startFile(const char *name,const char *,const char *)
void LatexGenerator::startFile(const char *name,const char *,const char *,int)
{
#if 0
setEncoding(Config_getString(LATEX_OUTPUT_ENCODING));
Expand Down Expand Up @@ -2230,7 +2230,7 @@ void LatexGenerator::exceptionEntry(const char* prefix,bool closeBracket)
t << " ";
}

void LatexGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *)
void LatexGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *,int)
{
LatexDocVisitor *visitor =
new LatexDocVisitor(t,m_codeGen,ctx?ctx->getDefFileExtension():QCString(""),m_insideTabbing);
Expand Down
4 changes: 2 additions & 2 deletions src/latexgen.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@ class LatexGenerator : public OutputGenerator
// ---------------------------


void writeDoc(DocNode *,const Definition *ctx,const MemberDef *);
void writeDoc(DocNode *,const Definition *ctx,const MemberDef *,int id);

void startFile(const char *name,const char *manName,const char *title);
void startFile(const char *name,const char *manName,const char *title,int id);
void writeSearchInfo() {}
void writeFooter(const char *) {}
void endFile();
Expand Down
4 changes: 2 additions & 2 deletions src/mangen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ static QCString buildFileName(const char *name)
return fileName;
}

void ManGenerator::startFile(const char *,const char *manName,const char *)
void ManGenerator::startFile(const char *,const char *manName,const char *,int)
{
startPlainFile( buildFileName( manName ) );
m_firstCol=TRUE;
Expand Down Expand Up @@ -696,7 +696,7 @@ void ManGenerator::endParamList()
{
}

void ManGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *)
void ManGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *,int)
{
ManDocVisitor *visitor = new ManDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString(""));
n->accept(visitor);
Expand Down
4 changes: 2 additions & 2 deletions src/mangen.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ class ManGenerator : public OutputGenerator

OutputType type() const { return Man; }

void writeDoc(DocNode *,const Definition *,const MemberDef *);
void writeDoc(DocNode *,const Definition *,const MemberDef *,int);

static void init();
void startFile(const char *name,const char *manName,const char *title);
void startFile(const char *name,const char *manName,const char *title,int);
void writeSearchInfo() {}
void writeFooter(const char *) {}
void endFile();
Expand Down
1 change: 1 addition & 0 deletions src/outputgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

#include <qfile.h>

#include "doxygen.h"
#include "outputgen.h"
#include "message.h"
#include "portable.h"
Expand Down
7 changes: 5 additions & 2 deletions src/outputgen.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ class CodeOutputInterface
public:
virtual ~CodeOutputInterface() {}

/** Identifier for the output file */
virtual int id() const { return 0; }

/*! Writes an code fragment to the output. This function should keep
* spaces visible, should break lines at a newline and should convert
* tabs to the right number of spaces.
Expand Down Expand Up @@ -351,13 +354,13 @@ class OutputGenerator : public BaseOutputDocInterface
//void setEncoding(const QCString &enc) { encoding = enc; }
//virtual void postProcess(QByteArray &) { }

virtual void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md) = 0;
virtual void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md,int id) = 0;

///////////////////////////////////////////////////////////////
// structural output interface
///////////////////////////////////////////////////////////////
virtual void startFile(const char *name,const char *manName,
const char *title) = 0;
const char *title,int id=0) = 0;
virtual void writeSearchInfo() = 0;
virtual void writeFooter(const char *navPath) = 0;
virtual void endFile() = 0;
Expand Down
18 changes: 14 additions & 4 deletions src/outputlist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,19 @@
#include "definition.h"
#include "docparser.h"
#include "vhdldocgen.h"
#include "doxygen.h"

static AtomicInt g_outId;

OutputList::OutputList()
{
newId();
//printf("OutputList::OutputList()\n");
}

OutputList::OutputList(const OutputList &ol)
{
m_id = ol.m_id;
for (const auto &og : ol.m_outputs)
{
m_outputs.emplace_back(og->clone());
Expand All @@ -48,6 +52,7 @@ OutputList &OutputList::operator=(const OutputList &ol)
{
if (this!=&ol)
{
m_id = ol.m_id;
for (const auto &og : ol.m_outputs)
{
m_outputs.emplace_back(og->clone());
Expand All @@ -61,6 +66,11 @@ OutputList::~OutputList()
//printf("OutputList::~OutputList()\n");
}

void OutputList::newId()
{
m_id = ++g_outId;
}

void OutputList::disableAllBut(OutputGenerator::OutputType o)
{
for (const auto &og : m_outputs)
Expand Down Expand Up @@ -150,17 +160,17 @@ void OutputList::generateDoc(const char *fileName,int startLine,
root = validatingParseDoc(fileName,startLine,
ctx,md,docStr,indexWords,isExample,exampleName,
singleLine,linkFromIndex,markdownSupport);
if (count>0) writeDoc(root,ctx,md);
if (count>0) writeDoc(root,ctx,md,m_id);
delete root;
}

void OutputList::writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *md)
void OutputList::writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *md,int)
{
for (const auto &og : m_outputs)
{
//printf("og->printDoc(extension=%s)\n",
// ctx?ctx->getDefFileExtension().data():"<null>");
if (og->isEnabled()) og->writeDoc(root,ctx,md);
if (og->isEnabled()) og->writeDoc(root,ctx,md,m_id);
}
VhdlDocGen::setFlowMember(0);
}
Expand All @@ -183,7 +193,7 @@ void OutputList::parseText(const QCString &textStr)
{
for (const auto &og : m_outputs)
{
if (og->isEnabled()) og->writeDoc(root,0,0);
if (og->isEnabled()) og->writeDoc(root,0,0,m_id);
}
}

Expand Down
10 changes: 8 additions & 2 deletions src/outputlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class OutputList : public OutputDocInterface
}

size_t size() const { return m_outputs.size(); }
int id() const { return m_id; }

void disableAllBut(OutputGenerator::OutputType o);
void enableAll();
Expand All @@ -69,7 +70,7 @@ class OutputList : public OutputDocInterface
bool indexWords,bool isExample,const char *exampleName /*=0*/,
bool singleLine /*=FALSE*/,bool linkFromIndex /*=FALSE*/,
bool markdownSupport /*=FALSE*/);
void writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *md);
void writeDoc(DocRoot *root,const Definition *ctx,const MemberDef *md,int id=0);
void parseText(const QCString &textStr);

void startIndexSection(IndexSections is)
Expand All @@ -85,7 +86,10 @@ class OutputList : public OutputDocInterface
void writeStyleInfo(int part)
{ forall(&OutputGenerator::writeStyleInfo,part); }
void startFile(const char *name,const char *manName,const char *title)
{ forall(&OutputGenerator::startFile,name,manName,title); }
{
newId();
forall(&OutputGenerator::startFile,name,manName,title,m_id);
}
void writeSearchInfo()
{ forall(&OutputGenerator::writeSearchInfo); }
void writeFooter(const char *navPath)
Expand Down Expand Up @@ -486,6 +490,7 @@ class OutputList : public OutputDocInterface
private:
void debug();
void clear();
void newId();

// For each output format that is enabled (OutputGenerator::isEnabled()) we forward
// the method call.
Expand All @@ -501,6 +506,7 @@ class OutputList : public OutputDocInterface
}

std::vector< std::unique_ptr<OutputGenerator> > m_outputs;
int m_id;

};

Expand Down
5 changes: 2 additions & 3 deletions src/pycode.l
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ struct pycodeYY_state
bool endComment = FALSE;
VariableContext theVarContext;
CallContext theCallContext;
TooltipManager tooltipManager;
SymbolResolver symbolResolver;
};

Expand Down Expand Up @@ -1097,7 +1096,7 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
yyextra->tooltipManager.addTooltip(d);
TooltipManager::instance().addTooltip(ol,d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
Expand Down Expand Up @@ -1627,7 +1626,7 @@ void PythonCodeParser::parseCode(CodeOutputInterface &codeOutIntf,
yyextra->sourceFileDef=0;
}
// write the tooltips
yyextra->tooltipManager.writeTooltips(codeOutIntf);
TooltipManager::instance().writeTooltips(codeOutIntf);
printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? fileDef->fileName().data(): NULL);
}

Expand Down
Loading

0 comments on commit a292601

Please sign in to comment.