Doxygen
Loading...
Searching...
No Matches
definition.cpp File Reference
#include <algorithm>
#include <iterator>
#include <unordered_map>
#include <string>
#include <optional>
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include "anchor.h"
#include "md5.h"
#include "regex.h"
#include "config.h"
#include "definitionimpl.h"
#include "doxygen.h"
#include "language.h"
#include "message.h"
#include "portable.h"
#include "outputlist.h"
#include "code.h"
#include "util.h"
#include "groupdef.h"
#include "pagedef.h"
#include "section.h"
#include "htags.h"
#include "parserintf.h"
#include "debug.h"
#include "vhdldocgen.h"
#include "memberlist.h"
#include "namespacedef.h"
#include "filedef.h"
#include "dirdef.h"
#include "reflist.h"
#include "utf8.h"
#include "indexlist.h"
#include "fileinfo.h"
+ Include dependency graph for definition.cpp:

Go to the source code of this file.

Classes

class  DefinitionImpl::Private
 Private data associated with a Symbol DefinitionImpl object. More...
 
class  FilterCache
 
struct  FilterCache::FilterCacheItem
 

Functions

static bool matchExcludedSymbols (const QCString &name)
 
static void addToMap (const QCString &name, Definition *d)
 
static void removeFromMap (const QCString &name, Definition *d)
 
bool readCodeFragment (const QCString &fileName, bool isMacro, int &startLine, int &endLine, QCString &result)
 Reads a fragment from file fileName starting with line startLine and ending with line endLine.
 
static MemberVector refMapToVector (const std::unordered_map< std::string, MemberDef * > &map)
 
static bool stripWord (QCString &s, QCString w)
 
static QCString abbreviate (const QCString &s, const QCString &name)
 
DefinitiontoDefinition (DefinitionMutable *dm)
 
DefinitionMutabletoDefinitionMutable (Definition *d)
 

Variables

static std::recursive_mutex g_qualifiedNameMutex
 
static std::mutex g_memberReferenceMutex
 

Function Documentation

◆ abbreviate()

static QCString abbreviate ( const QCString & s,
const QCString & name )
static

Definition at line 1500 of file definition.cpp.

1501{
1502 QCString scopelessName=name;
1503 int i=scopelessName.findRev("::");
1504 if (i!=-1) scopelessName=scopelessName.mid(i+2);
1505 QCString result=s;
1506 result=result.stripWhiteSpace();
1507 // strip trailing .
1508 if (!result.isEmpty() && result.at(result.length()-1)=='.')
1509 result=result.left(result.length()-1);
1510
1511 // strip any predefined prefix
1512 const StringVector &briefDescAbbrev = Config_getList(ABBREVIATE_BRIEF);
1513 for (const auto &p : briefDescAbbrev)
1514 {
1515 QCString str = substitute(p.c_str(),"$name",scopelessName); // replace $name with entity name
1516 str += " ";
1517 stripWord(result,str);
1518 }
1519
1520 // capitalize first word
1521 if (!result.isEmpty())
1522 {
1523 char c=result[0];
1524 if (c>='a' && c<='z') c+='A'-'a';
1525 result[0]=c;
1526 }
1527 return result;
1528}
This is an alternative implementation of QCString.
Definition qcstring.h:101
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:226
char & at(size_t i)
Returns a reference to the character at index i.
Definition qcstring.h:578
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:245
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:91
QCString left(size_t len) const
Definition qcstring.h:214
#define Config_getList(name)
Definition config.h:38
std::vector< std::string > StringVector
Definition containers.h:33
static bool stripWord(QCString &s, QCString w)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:477

References QCString::at(), Config_getList, QCString::findRev(), QCString::isEmpty(), QCString::left(), QCString::length(), QCString::mid(), QCString::stripWhiteSpace(), stripWord(), and substitute().

Referenced by Definition::briefDescription(), DefinitionAliasMixin< Base >::briefDescription(), DefinitionImpl::briefDescription(), DefinitionMixin< Base >::briefDescription(), and DefinitionImpl::operator=().

◆ addToMap()

static void addToMap ( const QCString & name,
Definition * d )
static

Definition at line 214 of file definition.cpp.

215{
216 bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
217 QCString symbolName = name;
218 int index=computeQualifiedIndex(symbolName);
219 if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
220 if (!symbolName.isEmpty())
221 {
222 //printf("adding symbol %s\n",qPrint(symbolName));
223 Doxygen::symbolMap->add(symbolName,d);
224
225 d->_setSymbolName(symbolName);
226 }
227}
virtual void _setSymbolName(const QCString &name)=0
static SymbolMap< Definition > * symbolMap
Definition doxygen.h:125
#define Config_getBool(name)
Definition config.h:33
int computeQualifiedIndex(const QCString &name)
Return the index of the last :: in the string name that is still before the first <.
Definition util.cpp:7248

References Definition::_setSymbolName(), computeQualifiedIndex(), Config_getBool, QCString::isEmpty(), QCString::mid(), DefinitionImpl::name(), Doxygen::symbolMap, and DefinitionImpl::symbolName().

Referenced by DefinitionImpl::DefinitionImpl(), DefinitionImpl::DefinitionImpl(), and DefinitionAliasImpl::init().

◆ matchExcludedSymbols()

static bool matchExcludedSymbols ( const QCString & name)
static

Definition at line 159 of file definition.cpp.

160{
161 const StringVector &exclSyms = Config_getList(EXCLUDE_SYMBOLS);
162 if (exclSyms.empty()) return FALSE; // nothing specified
163 std::string symName = name.str();
164 for (const auto &pat : exclSyms)
165 {
166 QCString pattern = pat.c_str();
167 bool forceStart=FALSE;
168 bool forceEnd=FALSE;
169 if (pattern.at(0)=='^')
170 pattern=pattern.mid(1),forceStart=TRUE;
171 if (pattern.at(pattern.length()-1)=='$')
172 pattern=pattern.left(pattern.length()-1),forceEnd=TRUE;
173 if (pattern.find('*')!=-1) // wildcard mode
174 {
175 const reg::Ex re(substitute(pattern,"*",".*").str());
177 if (reg::search(symName,match,re)) // wildcard match
178 {
179 size_t ui = match.position();
180 size_t pl = match.length();
181 size_t sl = symName.length();
182 if ((ui==0 || pattern.at(0)=='*' || (!isId(symName.at(ui-1)) && !forceStart)) &&
183 (ui+pl==sl || pattern.at(pattern.length()-1)=='*' || (!isId(symName.at(ui+pl)) && !forceEnd))
184 )
185 {
186 //printf("--> name=%s pattern=%s match at %d\n",qPrint(symName),qPrint(pattern),i);
187 return TRUE;
188 }
189 }
190 }
191 else if (!pattern.isEmpty()) // match words
192 {
193 size_t i = symName.find(pattern.str());
194 if (i!=std::string::npos) // we have a match!
195 {
196 size_t ui=i;
197 size_t pl=pattern.length();
198 size_t sl=symName.length();
199 // check if it is a whole word match
200 if ((ui==0 || (!isId(symName.at(ui-1)) && !forceStart)) &&
201 (ui+pl==sl || (!isId(symName.at(ui+pl)) && !forceEnd))
202 )
203 {
204 //printf("--> name=%s pattern=%s match at %d\n",qPrint(symName),qPrint(pattern),i);
205 return TRUE;
206 }
207 }
208 }
209 }
210 //printf("--> name=%s: no match\n",name);
211 return FALSE;
212}
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
const std::string & str() const
Definition qcstring.h:537
Class representing a regular expression.
Definition regex.h:39
Object representing the matching results.
Definition regex.h:153
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
Definition regex.cpp:748
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Definition regex.cpp:759
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
bool isId(int c)
Definition util.h:206

References QCString::at(), Config_getList, FALSE, QCString::find(), QCString::isEmpty(), isId(), QCString::left(), QCString::length(), QCString::mid(), DefinitionImpl::name(), reg::search(), QCString::str(), substitute(), and TRUE.

Referenced by DefinitionImpl::DefinitionImpl().

◆ readCodeFragment()

bool readCodeFragment ( const QCString & fileName,
bool isMacro,
int & startLine,
int & endLine,
QCString & result )

Reads a fragment from file fileName starting with line startLine and ending with line endLine.

Reads a fragment of code from file fileName starting at line startLine and ending at line endLine (inclusive). The fragment is stored in result. If FALSE is returned the code fragment could not be found.

The file is scanned for a opening bracket ('{') from startLine onward The line actually containing the bracket is returned via startLine. The file is scanned for a closing bracket ('}') from endLine backward. The line actually containing the bracket is returned via endLine. Note that for VHDL code the bracket search is not done.

Definition at line 752 of file definition.cpp.

754{
755 bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
756 QCString filter = getFileFilter(fileName,TRUE);
757 bool usePipe = !filter.isEmpty() && filterSourceFiles;
758 int tabSize = Config_getInt(TAB_SIZE);
759 SrcLangExt lang = getLanguageFromFileName(fileName);
760 const int blockSize = 4096;
761 std::string str;
763 static_cast<size_t>(std::max(1,startLine)),
764 static_cast<size_t>(std::max({1,startLine,endLine})),str);
765 //printf("readCodeFragment(%s,startLine=%d,endLine=%d)=\n[[[\n%s]]]\n",qPrint(fileName),startLine,endLine,qPrint(str));
766
767 bool found = lang==SrcLangExt::VHDL ||
768 lang==SrcLangExt::Python ||
769 lang==SrcLangExt::Fortran ||
770 isMacro;
771 // for VHDL, Python, and Fortran no bracket search is possible
772 char *p=str.data();
773 if (p && *p)
774 {
775 char c=0;
776 int col=0;
777 int lineNr=startLine;
778 // skip until the opening bracket or lonely : is found
779 char cn=0;
780 while (*p && !found)
781 {
782 int pc=0;
783 while ((c=*p++)!='{' && c!=':' && c!=0)
784 {
785 //printf("parsing char '%c'\n",c);
786 if (c=='\n')
787 {
788 lineNr++,col=0;
789 }
790 else if (c=='\t')
791 {
792 col+=tabSize - (col%tabSize);
793 }
794 else if (pc=='/' && c=='/') // skip single line comment
795 {
796 while ((c=*p++)!='\n' && c!=0);
797 if (c=='\n') lineNr++,col=0;
798 }
799 else if (pc=='/' && c=='*') // skip C style comment
800 {
801 while (((c=*p++)!='/' || pc!='*') && c!=0)
802 {
803 if (c=='\n') lineNr++,col=0;
804 pc=c;
805 }
806 }
807 else
808 {
809 col++;
810 }
811 pc = c;
812 }
813 if (c==':')
814 {
815 cn=*p++;
816 if (cn!=':') found=TRUE;
817 }
818 else if (c=='{')
819 {
820 found=TRUE;
821 }
822 else if (c==0)
823 {
824 break;
825 }
826 }
827 //printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr);
828 if (found)
829 {
830 // For code with more than one line,
831 // fill the line with spaces until we are at the right column
832 // so that the opening brace lines up with the closing brace
833 if (endLine!=startLine)
834 {
835 QCString spaces;
836 spaces.fill(' ',col);
837 result+=spaces;
838 }
839 // copy until end of line
840 if (c) result+=c;
841 startLine=lineNr;
842 if (c==':')
843 {
844 result+=cn;
845 if (cn=='\n') lineNr++;
846 }
847 char lineStr[blockSize];
848 do
849 {
850 //printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine);
851 int size_read=0;
852 do
853 {
854 // read up to blockSize-1 non-zero characters
855 int i=0;
856 while ((c=*p) && i<blockSize-1)
857 {
858 lineStr[i++]=c;
859 p++;
860 if (c=='\n') break; // stop at end of the line
861 }
862 lineStr[i]=0;
863 size_read=i;
864 result+=lineStr; // append line to the output
865 } while (size_read == (blockSize-1)); // append more if line does not fit in buffer
866 lineNr++;
867 } while (*p);
868
869 // strip stuff after closing bracket
870 int newLineIndex = result.findRev('\n');
871 int braceIndex = result.findRev('}');
872 if (braceIndex > newLineIndex)
873 {
874 result.resize(static_cast<size_t>(braceIndex+1));
875 }
876 endLine=lineNr-1;
877 }
878 if (usePipe)
879 {
880 Debug::print(Debug::FilterOutput, 0, "Filter output\n");
881 Debug::print(Debug::FilterOutput,0,"-------------\n{}\n-------------\n",result);
882 }
883 }
884 QCString encoding = getEncoding(FileInfo(fileName.str()));
885 if (encoding!="UTF-8")
886 {
887 std::string encBuf = result.str();
888 bool ok = transcodeCharacterStringToUTF8(encBuf,encoding.data());
889 if (ok)
890 {
891 result = QCString(encBuf);
892 }
893 else
894 {
895 err("failed to transcode characters in code fragment in file {} lines {} to {}, from input encoding {} to UTF-8\n",
896 fileName,startLine,endLine,encoding);
897
898 }
899 }
900 if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n";
901 //printf("readCodeFragment(%d-%d)=%s\n",startLine,endLine,qPrint(result));
902 return found;
903}
@ FilterOutput
Definition debug.h:38
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:76
Minimal replacement for QFileInfo.
Definition fileinfo.h:23
static FilterCache & instance()
bool getFileContents(const QCString &fileName, size_t startLine, size_t endLine, std::string &str)
void fill(char c, int len=-1)
Fills a string with a predefined character.
Definition qcstring.h:180
void resize(size_t newlen)
Definition qcstring.h:167
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:159
#define Config_getInt(name)
Definition config.h:34
#define err(fmt,...)
Definition message.h:127
SrcLangExt
Language as given by extension.
Definition types.h:42
@ Fortran
Definition types.h:53
@ Python
Definition types.h:52
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5645
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
Definition util.cpp:1376
bool found
Definition util.cpp:984
QCString getEncoding(const FileInfo &fi)
Definition util.cpp:6104
QCString getFileFilter(const QCString &name, bool isSourceCode)
Definition util.cpp:1342

References QCString::at(), Config_getBool, Config_getInt, QCString::data(), err, QCString::fill(), Debug::FilterOutput, QCString::findRev(), Fortran, found, getEncoding(), FilterCache::getFileContents(), getFileFilter(), getLanguageFromFileName(), FilterCache::instance(), QCString::isEmpty(), QCString::length(), Debug::print(), Python, QCString::resize(), QCString::str(), transcodeCharacterStringToUTF8(), TRUE, and VHDL.

Referenced by VhdlDocGen::createFlowChart(), DefinitionMutable::toDefinition_(), and DefinitionImpl::writeInlineCode().

◆ refMapToVector()

static MemberVector refMapToVector ( const std::unordered_map< std::string, MemberDef * > & map)
inlinestatic

Definition at line 1064 of file definition.cpp.

1065{
1066 // convert map to a vector of values
1067 MemberVector result;
1068 std::transform(map.begin(),map.end(), // iterate over map
1069 std::back_inserter(result), // add results to vector
1070 [](const auto &item)
1071 { return item.second; } // extract value to add from map Key,Value pair
1072 );
1073 // and sort it
1074 std::stable_sort(result.begin(),result.end(),
1075 [](const auto &m1,const auto &m2) { return genericCompareMembers(m1,m2)<0; });
1076 return result;
1077}
A vector of MemberDef object.
Definition memberlist.h:35
iterator end() noexcept
Definition memberlist.h:56
iterator begin() noexcept
Definition memberlist.h:54

References MemberVector::begin(), and MemberVector::end().

Referenced by DefinitionImpl::_writeSourceRefList(), DefinitionImpl::getReferencedByMembers(), and DefinitionImpl::getReferencesMembers().

◆ removeFromMap()

static void removeFromMap ( const QCString & name,
Definition * d )
static

Definition at line 229 of file definition.cpp.

230{
231 Doxygen::symbolMap->remove(name,d);
232}

References DefinitionImpl::name(), and Doxygen::symbolMap.

Referenced by DefinitionAliasImpl::deinit(), and DefinitionImpl::~DefinitionImpl().

◆ stripWord()

static bool stripWord ( QCString & s,
QCString w )
static

Definition at line 1487 of file definition.cpp.

1488{
1489 bool success=FALSE;
1490 if (s.left(w.length())==w)
1491 {
1492 success=TRUE;
1493 s=s.right(s.length()-w.length());
1494 }
1495 return success;
1496}
QCString right(size_t len) const
Definition qcstring.h:219

References FALSE, QCString::left(), QCString::length(), QCString::right(), and TRUE.

Referenced by abbreviate().

◆ toDefinition()

◆ toDefinitionMutable()

DefinitionMutable * toDefinitionMutable ( Definition * d)

Definition at line 1878 of file definition.cpp.

1879{
1880 if (d==nullptr) return nullptr;
1881 return d->toDefinitionMutable_();
1882}
virtual DefinitionMutable * toDefinitionMutable_()=0

Referenced by addConceptToContext(), buildNamespaceList(), buildScopeFromQualifiedName(), computeTooltipTexts(), createTagLessInstance(), resolveClassNestingRelations(), and DefinitionMutable::toDefinition_().

Variable Documentation

◆ g_memberReferenceMutex

std::mutex g_memberReferenceMutex
static

◆ g_qualifiedNameMutex

std::recursive_mutex g_qualifiedNameMutex
static