Skip to content

Commit

Permalink
Refactoring: modernize TooltipManager class and source reference lists
Browse files Browse the repository at this point in the history
- Tooltips are now collected per file instead of globally
- Source reference lists now use STL containers
  • Loading branch information
doxygen committed Oct 20, 2020
1 parent 33b0f4d commit d03e8d9
Show file tree
Hide file tree
Showing 22 changed files with 326 additions and 367 deletions.
52 changes: 25 additions & 27 deletions addon/doxyparse/doxyparse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
class Doxyparse : public CodeOutputInterface
{
public:
Doxyparse(FileDef *fd) : m_fd(fd) {}
Doxyparse(const FileDef *fd) : m_fd(fd) {}
~Doxyparse() {}

// these are just null functions, they can be used to produce a syntax highlighted
Expand Down Expand Up @@ -84,7 +84,7 @@ class Doxyparse : public CodeOutputInterface
}

private:
FileDef *m_fd;
const FileDef *m_fd;
};

static bool is_c_code = true;
Expand All @@ -110,7 +110,7 @@ static void findXRefSymbols(FileDef *fd)
delete parse;
}

static bool ignoreStaticExternalCall(MemberDef *context, MemberDef *md) {
static bool ignoreStaticExternalCall(const MemberDef *context, const MemberDef *md) {
if (md->isStatic()) {
if(md->getFileDef() && context->getFileDef()) {
if(md->getFileDef()->getOutputFileBase() == context->getFileDef()->getOutputFileBase())
Expand Down Expand Up @@ -174,11 +174,11 @@ static void printReferenceTo(std::string type, std::string signature, std::strin
printf(" type: %s\n", type.c_str());
printf(" defined_in: \"%s\"\n", unescapeCharsInString(defined_in.c_str()).data());
}
static void printNumberOfConditionalPaths(MemberDef* md) {
static void printNumberOfConditionalPaths(const MemberDef* md) {
printf(" conditional_paths: %d\n", md->numberOfFlowKeyWords());
}

static int isPartOfCStruct(MemberDef * md) {
static int isPartOfCStruct(const MemberDef * md) {
return is_c_code && md->getClassDef() != NULL;
}

Expand All @@ -198,7 +198,7 @@ std::string argumentData(const Argument &argument) {
return data;
}

std::string functionSignature(MemberDef* md) {
std::string functionSignature(const MemberDef* md) {
std::string signature = sanitizeString(md->name().data());
if(md->isFunction()){
const ArgumentList &argList = md->argumentList();
Expand All @@ -215,7 +215,7 @@ std::string functionSignature(MemberDef* md) {
return signature;
}

static void referenceTo(MemberDef* md) {
static void referenceTo(const MemberDef* md) {
std::string type = md->memberTypeName().data();
std::string defined_in = "";
std::string signature = "";
Expand Down Expand Up @@ -253,25 +253,25 @@ void protectionInformation(Protection protection) {
}
}

void cModule(ClassDef* cd) {
MemberList* ml = cd->getMemberList(MemberListType_variableMembers);
void cModule(const ClassDef* cd) {
const MemberList* ml = cd->getMemberList(MemberListType_variableMembers);
if (ml) {
FileDef *fd = cd->getFileDef();
MemberList *fd_ml = fd->getMemberList(MemberListType_allMembersList);
const FileDef *fd = cd->getFileDef();
const MemberList *fd_ml = fd->getMemberList(MemberListType_allMembersList);
if (!fd_ml || fd_ml->count() == 0) {
printModule(fd->getOutputFileBase().data());
printDefines();
}
MemberListIterator mli(*ml);
MemberDef* md;
const MemberDef* md;
for (mli.toFirst(); (md=mli.current()); ++mli) {
printDefinition("variable", cd->name().data() + std::string("::") + md->name().data(), md->getDefLine());
protectionInformation(md->protection());
}
}
}

static bool checkOverrideArg(const ArgumentList &argList, MemberDef *md) {
static bool checkOverrideArg(const ArgumentList &argList, const MemberDef *md) {
if(!md->isFunction() || argList.empty()){
return false;
}
Expand All @@ -285,7 +285,7 @@ static bool checkOverrideArg(const ArgumentList &argList, MemberDef *md) {
return false;
}

void functionInformation(MemberDef* md) {
void functionInformation(const MemberDef* md) {
std::string temp = "";
int size = md->getEndBodyLine() - md->getStartBodyLine() + 1;
printNumberOfLines(size);
Expand All @@ -301,28 +301,26 @@ void functionInformation(MemberDef* md) {
}

printNumberOfConditionalPaths(md);
MemberSDict *defDict = md->getReferencesMembers();
if (defDict) {
MemberSDict::Iterator msdi(*defDict);
MemberDef *rmd;
auto refList = md->getReferencesMembers();
if (!refList.empty()) {
printUses();
for (msdi.toFirst(); (rmd=msdi.current()); ++msdi) {
for (const auto &rmd : refList) {
if (rmd->definitionType() == Definition::TypeMember && !ignoreStaticExternalCall(md, rmd) && !checkOverrideArg(argList, rmd)) {
referenceTo(rmd);
}
}
}
}

void prototypeInformation(MemberDef* md) {
void prototypeInformation(const MemberDef* md) {
printPrototypeYes();
const ArgumentList &argList = md->argumentList();
printNumberOfArguments(argList.size());
}

static void lookupSymbol(Definition *d) {
static void lookupSymbol(const Definition *d) {
if (d->definitionType() == Definition::TypeMember) {
MemberDef *md = dynamic_cast<MemberDef*>(d);
const MemberDef *md = dynamic_cast<const MemberDef*>(d);
std::string type = md->memberTypeName().data();
std::string signature = functionSignature(md);
printDefinition(type, signature, md->getDefLine());
Expand All @@ -336,17 +334,17 @@ static void lookupSymbol(Definition *d) {
}
}

void listMembers(MemberList *ml) {
void listMembers(const MemberList *ml) {
if (ml) {
MemberListIterator mli(*ml);
MemberDef *md;
const MemberDef *md;
for (mli.toFirst(); (md=mli.current()); ++mli) {
lookupSymbol((Definition*) md);
}
}
}

void listAllMembers(ClassDef* cd) {
void listAllMembers(const ClassDef* cd) {
// methods
listMembers(cd->getMemberList(MemberListType_functionMembers));
// constructors
Expand All @@ -355,7 +353,7 @@ void listAllMembers(ClassDef* cd) {
listMembers(cd->getMemberList(MemberListType_variableMembers));
}

static void classInformation(ClassDef* cd) {
static void classInformation(const ClassDef* cd) {
if (is_c_code) {
cModule(cd);
} else {
Expand Down Expand Up @@ -418,7 +416,7 @@ static void listSymbols() {
ClassSDict *classes = fd->getClassSDict();
if (classes) {
ClassSDict::Iterator cli(*classes);
ClassDef *cd;
const ClassDef *cd;
for (cli.toFirst(); (cd = cli.current()); ++cli) {
if (!cd->isVisited()) {
classInformation(cd);
Expand Down
3 changes: 2 additions & 1 deletion src/clangparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ class ClangTUParser::Private
CXToken *tokens = 0;
uint numTokens = 0;
StringVector filesInSameTU;
TooltipManager tooltipManager;

// state while parsing sources
MemberDef *currentMemberDef=0;
Expand Down Expand Up @@ -572,7 +573,7 @@ void ClangTUParser::writeMultiLineCodeLink(CodeOutputInterface &ol,
const char *text)
{
static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
TooltipManager::instance()->addTooltip(d);
p->tooltipManager.addTooltip(d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
Expand Down
16 changes: 11 additions & 5 deletions src/code.l
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ struct codeYY_state
QCString forceTagReference;
VariableContext theVarContext;
CallContext theCallContext;
TooltipManager tooltipManager;
};

static bool isCastKeyword(const QCString &s);
Expand Down Expand Up @@ -241,7 +242,7 @@ static void addVariable(yyscan_t yyscanner,QCString type,QCString name);
//-------------------------------------------------------------------

static std::mutex g_searchIndexMutex;
static std::mutex g_tooltipMutex;
static std::mutex g_docCrossReferenceMutex;

/* -----------------------------------------------------------------
*/
Expand Down Expand Up @@ -2471,10 +2472,7 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol,
{
struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
{
std::lock_guard<std::mutex> lock(g_tooltipMutex);
TooltipManager::instance()->addTooltip(d);
}
yyextra->tooltipManager.addTooltip(d);
QCString ref = d->getReference();
QCString file = d->getOutputFileBase();
QCString anchor = d->anchor();
Expand Down Expand Up @@ -2764,6 +2762,7 @@ static bool getLinkInScope(yyscan_t yyscanner,
if (yyextra->currentDefinition && yyextra->currentMemberDef &&
md!=yyextra->currentMemberDef && yyextra->insideBody && yyextra->collectXRefs)
{
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md));
}
//printf("d->getReference()='%s' d->getOutputBase()='%s' name='%s' member name='%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
Expand Down Expand Up @@ -2924,6 +2923,7 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner,
if (d && d->isLinkable() && md->isLinkable() &&
yyextra->currentMemberDef && yyextra->collectXRefs)
{
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md));
}
}
Expand Down Expand Up @@ -2978,6 +2978,7 @@ static void generateClassOrGlobalLink(yyscan_t yyscanner,
addToSearchIndex(yyscanner,clName);
if (yyextra->currentMemberDef && yyextra->collectXRefs)
{
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(md));
}
return;
Expand Down Expand Up @@ -3038,6 +3039,7 @@ static bool generateClassMemberLink(yyscan_t yyscanner,
if (yyextra->currentDefinition && yyextra->currentMemberDef &&
/*xmd!=yyextra->currentMemberDef &&*/ yyextra->insideBody && yyextra->collectXRefs)
{
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
addDocCrossReference(yyextra->currentMemberDef,xmd);
}

Expand Down Expand Up @@ -3457,6 +3459,7 @@ static void writeObjCMethodCall(yyscan_t yyscanner,ObjCCallCtx *ctx)
writeMultiLineCodeLink(yyscanner,*yyextra->code,ctx->method,name);
if (yyextra->currentMemberDef && yyextra->collectXRefs)
{
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(ctx->method));
}
}
Expand Down Expand Up @@ -3531,6 +3534,7 @@ static void writeObjCMethodCall(yyscan_t yyscanner,ObjCCallCtx *ctx)
writeMultiLineCodeLink(yyscanner,*yyextra->code,ctx->objectVar,object);
if (yyextra->currentMemberDef && yyextra->collectXRefs)
{
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
addDocCrossReference(yyextra->currentMemberDef,const_cast<MemberDef*>(ctx->objectVar));
}
}
Expand Down Expand Up @@ -3903,6 +3907,8 @@ void CCodeParser::parseCode(CodeOutputInterface &od,const char *className,const
delete yyextra->sourceFileDef;
yyextra->sourceFileDef=0;
}
// write the tooltips
yyextra->tooltipManager.writeTooltips(od);

printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
return;
Expand Down
16 changes: 13 additions & 3 deletions src/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4943,7 +4943,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
Cachable &cache = getCache();
if (!cache.sourceRefs)
{
cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers()));
}
return cache.sourceRefs.get();
}
Expand All @@ -4952,7 +4952,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
Cachable &cache = getCache();
if (!cache.sourceRefBys)
{
cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers()));
}
return cache.sourceRefBys.get();
}
Expand Down Expand Up @@ -8581,7 +8581,7 @@ TemplateListIntf::ConstIterator *InheritanceListContext::createIterator() const
class MemberListContext::Private : public GenericNodeListContext
{
public:
void addMember(MemberDef *md)
void addMember(const MemberDef *md)
{
append(MemberContext::alloc(md));
}
Expand Down Expand Up @@ -8630,6 +8630,16 @@ MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCounted
}
}

MemberListContext::MemberListContext(std::vector<const MemberDef *> &&ml) : RefCountedContext("MemberListContext")
{
p = new Private;
for (const auto &md : ml)
{
p->addMember(md);
}
ml.clear();
}

MemberListContext::~MemberListContext()
{
delete p;
Expand Down
3 changes: 3 additions & 0 deletions src/context.h
Original file line number Diff line number Diff line change
Expand Up @@ -954,6 +954,8 @@ class MemberListContext : public RefCountedContext, public TemplateListIntf
{ return new MemberListContext(ml); }
static MemberListContext *alloc(MemberSDict *ml,bool doSort)
{ return new MemberListContext(ml,doSort); }
static MemberListContext *alloc(std::vector<const MemberDef *> &&ml)
{ return new MemberListContext(std::move(ml)); }

// TemplateListIntf
virtual uint count() const;
Expand All @@ -966,6 +968,7 @@ class MemberListContext : public RefCountedContext, public TemplateListIntf
MemberListContext();
MemberListContext(const MemberList *ml);
MemberListContext(MemberSDict *ml,bool doSort);
MemberListContext(std::vector<const MemberDef *> &&ml);
~MemberListContext();
class Private;
Private *p;
Expand Down
Loading

0 comments on commit d03e8d9

Please sign in to comment.