From 2b8fea9c5d1b1560ad344e0e057799935f331af4 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Sun, 10 Sep 2023 12:03:05 +0200 Subject: [PATCH] Fixed issue showing wrong inline source fragment for multi-line macros --- src/definition.cpp | 26 ++++++++++++++------------ src/definition.h | 2 +- src/vhdldocgen.cpp | 2 +- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/definition.cpp b/src/definition.cpp index 9ee2b7a0d07..6ff92c494a1 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -812,7 +812,7 @@ FilterCache &FilterCache::instance() * The line actually containing the bracket is returned via endLine. * Note that for VHDL code the bracket search is not done. */ -bool readCodeFragment(const QCString &fileName, +bool readCodeFragment(const QCString &fileName,bool isMacro, int &startLine,int &endLine,QCString &result) { bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES); @@ -829,7 +829,8 @@ bool readCodeFragment(const QCString &fileName, bool found = lang==SrcLangExt_VHDL || lang==SrcLangExt_Python || - lang==SrcLangExt_Fortran; + lang==SrcLangExt_Fortran || + isMacro; // for VHDL, Python, and Fortran no bracket search is possible char *p=str.data(); if (p && *p) @@ -1068,26 +1069,27 @@ void DefinitionImpl::writeInlineCode(OutputList &ol,const QCString &scopeName) c { bool inlineSources = Config_getBool(INLINE_SOURCES); ol.pushGeneratorState(); - //printf("Source Fragment %s: %d-%d bodyDef=%p\n",qPrint(name()), - // m_startBodyLine,m_endBodyLine,m_bodyDef); + //printf("Source Fragment %s: %d-%d\n",qPrint(name()), + // m_impl->body->startLine,m_impl->body->endLine); if (inlineSources && hasSources()) { QCString codeFragment; + const MemberDef *thisMd = 0; + if (m_impl->def->definitionType()==Definition::TypeMember) + { + thisMd = toMemberDef(m_impl->def); + } + bool isMacro = thisMd && thisMd->memberType()==MemberType_Define; int actualStart=m_impl->body->startLine,actualEnd=m_impl->body->endLine; - if (readCodeFragment(m_impl->body->fileDef->absFilePath(), + if (readCodeFragment(m_impl->body->fileDef->absFilePath(),isMacro, actualStart,actualEnd,codeFragment) ) { - //printf("Adding code fragment '%s' ext='%s'\n", - // qPrint(codeFragment),qPrint(m_impl->defFileExt)); + //printf("Adding code fragment '%s' ext='%s' range=%d-%d\n", + // qPrint(codeFragment),qPrint(m_impl->defFileExt),actualStart,actualEnd); auto intf = Doxygen::parserManager->getCodeParser(m_impl->defFileExt); intf->resetCodeParserState(); //printf("Read:\n'%s'\n\n",qPrint(codeFragment)); - const MemberDef *thisMd = 0; - if (m_impl->def->definitionType()==Definition::TypeMember) - { - thisMd = toMemberDef(m_impl->def); - } auto &codeOL = ol.codeGenerators(); codeOL.startCodeFragment("DoxyCode"); diff --git a/src/definition.h b/src/definition.h index 12914a8c59b..d099feb42f5 100644 --- a/src/definition.h +++ b/src/definition.h @@ -401,7 +401,7 @@ DefinitionMutable *toDefinitionMutable(Definition *d); * via \a result. The function returns TRUE if successful and FALSE * in case of an error. */ -bool readCodeFragment(const QCString &fileName, +bool readCodeFragment(const QCString &fileName,bool isMacro, int &startLine,int &endLine, QCString &result); #endif diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 60a8b20a68d..dc5a1ab7afb 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -2794,7 +2794,7 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef) int actualStart= mdef->getStartBodyLine(); int actualEnd=mdef->getEndBodyLine(); const FileDef* fd=mdef->getFileDef(); - bool b=readCodeFragment( fd->absFilePath(), actualStart,actualEnd,codeFragment); + bool b=readCodeFragment( fd->absFilePath(), false, actualStart, actualEnd, codeFragment); if (!b) return; auto parser { Doxygen::parserManager->getOutlineParser(".vhd") };