Doxygen
Loading...
Searching...
No Matches
filedef.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2026 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16// own header
17#include "filedef.h"
18
19// standard includes
20#include <unordered_set>
21
22// other includes
23#include "clangparser.h"
24#include "classdef.h"
25#include "classlist.h"
26#include "conceptdef.h"
27#include "config.h"
28#include "debug.h"
29#include "definitionimpl.h"
30#include "docparser.h"
31#include "dot.h"
32#include "dotincldepgraph.h"
33#include "doxygen.h"
34#include "entry.h"
35#include "htags.h"
36#include "language.h"
37#include "layout.h"
38#include "memberdef.h"
39#include "membergroup.h"
40#include "memberlist.h"
41#include "message.h"
42#include "moduledef.h"
43#include "namespacedef.h"
44#include "outputlist.h"
45#include "parserintf.h"
46#include "portable.h"
47#include "util.h"
48#include "vhdldocgen.h"
49
50//---------------------------------------------------------------------------
51
53{
54 bool isIDLorJava = lang==SrcLangExt::IDL || lang==SrcLangExt::Java;
55 if (isIDLorJava || (kind & IncludeKind_ImportMask))
56 {
57 return "import ";
58 }
59 else if (kind & IncludeKind_ObjCMask)
60 {
61 return "#import ";
62 }
63 else
64 {
65 return "#include ";
66 }
67}
68
70{
71 if (lang==SrcLangExt::Java || kind==IncludeKind::ImportModule) return "";
72 if ((kind & IncludeKind_LocalMask) || (lang==SrcLangExt::IDL))
73 {
74 return "\"";
75 }
76 else
77 {
78 return "<";
79 }
80}
81
83{
84 if (lang==SrcLangExt::IDL) return "\";";
85 else if (lang==SrcLangExt::Java) return ";";
86
87 switch (kind)
88 {
89 case IncludeKind::ImportLocal: return "\";";
90 case IncludeKind::ImportLocalObjC: return "\"";
91 case IncludeKind::IncludeLocal: return "\"";
92 case IncludeKind::ImportSystem: return ">;";
93 case IncludeKind::ImportSystemObjC: return ">";
94 case IncludeKind::IncludeSystem: return ">";
95 case IncludeKind::ImportModule: return ";";
96 }
97 return "";
98}
99
101{
102 DString result;
103 bool isIDLorJava = lang==SrcLangExt::IDL || lang==SrcLangExt::Java;
104 result.sprintf("local=\"%s\" import=\"%s\" module=\"%s\" objc=\"%s\"",
105 (kind & IncludeKind_LocalMask) ? "yes" : "no",
106 (isIDLorJava || (kind & IncludeKind_ImportMask)) ? "yes" : "no",
107 (kind==IncludeKind::ImportModule) ? "yes" : "no",
108 (kind & IncludeKind_ObjCMask) ? "yes" : "no");
109 return result;
110}
111
112//---------------------------------------------------------------------------
113
114using DefinitionLineMap = std::unordered_map<int,const Definition *>;
115using MemberDefLineMap = std::unordered_map<int,const MemberDef *>;
116using IncludeInfoMap = std::unordered_map<std::string, const IncludeInfo *>;
117
118class FileDefImpl final : public DefinitionMixin<FileDef>
119{
120 public:
121 FileDefImpl(const DString &p,const DString &n,const DString &ref=DString(),const DString &dn=DString());
122 ~FileDefImpl() override;
124
125 DefType definitionType() const override { return TypeFile; }
127 const DString &name() const override;
128
129 DString displayName(bool=true) const override { return localName(); }
130 DString fileName() const override { return m_fileName; }
131 DString getOutputFileBase() const override;
132 DString anchor() const override { return DString(); }
133 DString getSourceFileBase() const override;
134 DString includeName() const override;
137 DString absFilePath() const override { return m_filePath; }
138 const DString &docName() const override { return m_docname; }
139 bool isSource() const override { return m_isSource; }
140 bool isDocumentationFile() const override;
141 const Definition *getSourceDefinition(int lineNr) const override;
142 const MemberDef *getSourceMember(int lineNr) const override;
143 DString getPath() const override { return m_path; }
144 DString getVersion() const override { return m_fileVersion; }
145 bool isLinkableInProject() const override;
146 bool isLinkable() const override { return isLinkableInProject() || isReference(); }
147 bool isIncluded(const DString &name) const override;
148 DirDef *getDirDef() const override { return m_dir; }
149 ModuleDef *getModuleDef() const override { return m_moduleDef; }
150 const LinkedRefMap<NamespaceDef> &getUsedNamespaces() const override;
152 const IncludeInfoList &includeFileList() const override { return m_includeList; }
153 const IncludeInfoList &includedByFileList() const override { return m_includedByList; }
154 void getAllIncludeFilesRecursively(StringVector &incFiles) const override;
155 MemberList *getMemberList(MemberListType lt) const override;
156 const MemberLists &getMemberLists() const override { return m_memberLists; }
157 const MemberGroupList &getMemberGroups() const override { return m_memberGroups; }
158 const NamespaceLinkedRefMap &getNamespaces() const override { return m_namespaces; }
159 const ConceptLinkedRefMap &getConcepts() const override { return m_concepts; }
160 const ClassLinkedRefMap &getClasses() const override { return m_classes; }
161 DString title() const override;
162 bool hasDetailedDescription() const override;
163 DString fileVersion() const override;
164 bool subGrouping() const override { return m_subGrouping; }
165 void countMembers() override;
166 int numDocMembers() const override;
167 int numDecMembers() const override;
168 void addSourceRef(int line,const Definition *d,const MemberDef *md) override;
169 void writeDocumentation(OutputList &ol) override;
170 void writeMemberPages(OutputList &ol) override;
171 void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const override;
172 void writeSummaryLinks(OutputList &ol) const override;
173 void writePageNavigation(OutputList &ol) const override;
174 void writeTagFile(TextStream &t) override;
175 void writeSourceHeader(OutputList &ol) override;
176 void writeSourceBody(OutputList &ol,ClangTUParser *clangParser) override;
177 void writeSourceFooter(OutputList &ol) override;
178 void parseSource(ClangTUParser *clangParser) override;
179 void setDiskName(const DString &name) override;
180 void insertMember(MemberDef *md) override;
181 void removeMember(MemberDef *md) override;
182 void insertClass(ClassDef *cd) override;
183 void insertConcept(ConceptDef *cd) override;
184 void insertNamespace(NamespaceDef *nd) override;
185 void computeAnchors() override;
186 void setDirDef(DirDef *dd) override { m_dir=dd; }
187 void setModuleDef(ModuleDef *mod) override { m_moduleDef=mod; }
188 void addUsingDirective(NamespaceDef *nd) override;
189 void addUsingDeclaration(const Definition *d) override;
190 void combineUsingRelations() override;
191 bool generateSourceFile() const override;
192 void sortMemberLists() override;
193 void addIncludeDependency(const FileDef *fd,const DString &incName,IncludeKind kind) override;
194 void addIncludedByDependency(const FileDef *fd,const DString &incName,IncludeKind kind) override;
195 void addMembersToMemberGroup() override;
197 void findSectionsInDocumentation() override;
198 void addIncludedUsingDirectives(FileDefSet &visitedFiles) override;
199 void addListReferences() override;
200 void addRequirementReferences() override;
201
202 bool hasIncludeGraph() const override;
203 bool hasIncludedByGraph() const override;
204 void overrideIncludeGraph(bool e) override;
205 void overrideIncludedByGraph(bool e) override;
206
207 bool visibleInIndex(bool &genSourceFile) const override;
208
209 private:
210 void setDiskNameLocal(const DString &name);
211 void acquireFileVersion();
220 void writeSourceLink(OutputList &ol);
222 bool isConstantGroup);
224 void writeConcepts(OutputList &ol,const DString &title);
234
252 DirDef *m_dir = nullptr;
263 bool m_hasIncludeGraph = Config_getBool(INCLUDE_GRAPH);
264 bool m_hasIncludedByGraph = Config_getBool(INCLUDED_BY_GRAPH);
265};
266
267std::unique_ptr<FileDef> createFileDef(const DString &p,const DString &n,const DString &ref,const DString &dn)
268{
269 return std::make_unique<FileDefImpl>(p,n,ref,dn);
270}
271
272
273//---------------------------------------------------------------------------
274
275/*! create a new file definition, where \a p is the file path,
276 \a nm the file name, and \a lref is an HTML anchor name if the
277 file was read from a tag file or nullptr otherwise
278*/
280 const DString &lref,const DString &dn)
281 : DefinitionMixin(p+nm,1,1,nm,nullptr,nullptr,!p.empty())
282{
284 m_filePath=p+nm;
285 m_fileName=nm;
286
287 setReference(lref);
288 setDiskNameLocal(!dn.empty() ? dn : nm);
289 m_isSource = EntryType::guessSection(nm).isSource();
290 m_docname = nm;
291 m_dir = nullptr;
292 if (Config_getBool(FULL_PATH_NAMES))
293 {
295 }
297 Config_getBool(FULL_PATH_NAMES) ? m_fileName : DefinitionMixin::name()));
299 m_subGrouping=Config_getBool(SUBGROUPING);
300}
301
302/*! destroy the file definition */
306
308{
309 if (isReference())
310 {
312 m_inclDepFileName = name+"_incl";
313 m_inclByDepFileName = name+"_dep_incl";
314 }
315 else
316 {
320 }
321}
322
327
328/*! Compute the HTML anchor names for all members in the class */
330{
331 MemberList *ml = getMemberList(MemberListType::AllMembersList());
332 if (ml) ml->setAnchors();
333}
334
336{
337 //printf("FileDefImpl::distributeMemberGroupDocumentation()\n");
338 for (const auto &mg : m_memberGroups)
339 {
340 mg->distributeMemberGroupDocumentation();
341 }
342}
343
345{
349 for (const auto &mg : m_memberGroups)
350 {
351 mg->findSectionsInDocumentation(this);
352 }
353
354 for (auto &ml : m_memberLists)
355 {
356 if (ml->listType().isDeclaration())
357 {
358 ml->findSectionsInDocumentation(this);
359 }
360 }
361}
362
364{
365 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
366 bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
367 return ((!briefDescription().empty() && repeatBrief) ||
368 !documentation().stripWhiteSpace().empty() || // avail empty section
369 (sourceBrowser && getStartBodyLine()!=-1 && getBodyDef()) ||
371 );
372}
373
375{
378 tagFile << " <compound kind=\"file\">\n";
379 tagFile << " <name>" << convertToXML(name()) << "</name>\n";
380 tagFile << " <path>" << convertToXML(stripFromPath(getPath())) << "</path>\n";
381 tagFile << " <filename>" << fn << "</filename>\n";
382 for (const auto &ii : m_includeList)
383 {
384 const FileDef *fd=ii.fileDef;
385 if (fd && fd->isLinkable() && !fd->isReference())
386 {
387 DString attr = includeTagFileAttributes(fd->getLanguage(),ii.kind);
388 tagFile << " <includes id=\""
389 << convertToXML(fd->getOutputFileBase()) << "\" "
390 << "name=\"" << convertToXML(fd->name()) << "\" "
391 << attr << ">"
392 << convertToXML(ii.includeName)
393 << "</includes>\n";
394 }
395 }
396 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::File))
397 {
398 switch (lde->kind())
399 {
400 case LayoutDocEntry::FileClasses:
401 {
403 }
404 break;
405 case LayoutDocEntry::FileInterfaces:
406 {
408 }
409 break;
410 case LayoutDocEntry::FileStructs:
411 {
413 }
414 break;
415 case LayoutDocEntry::FileExceptions:
416 {
418 }
419 break;
420 case LayoutDocEntry::FileConcepts:
421 {
422 for (const auto *nd : m_concepts)
423 {
424 if (nd->isLinkableInProject())
425 {
426 tagFile << " <concept>" << convertToXML(nd->name()) << "</concept>\n";
427 }
428 }
429 }
430 break;
431 case LayoutDocEntry::FileNamespaces:
432 {
433 for (const auto *nd : m_namespaces)
434 {
435 if (nd->isLinkableInProject())
436 {
437 tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>\n";
438 }
439 }
440 }
441 break;
442 case LayoutDocEntry::MemberDecl:
443 {
444 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
445 if (lmd)
446 {
447 MemberList * ml = getMemberList(lmd->type);
448 if (ml)
449 {
450 ml->writeTagFile(tagFile,false,false);
451 }
452 }
453 }
454 break;
455 case LayoutDocEntry::MemberGroups:
456 {
457 for (const auto &mg : m_memberGroups)
458 {
459 mg->writeTagFile(tagFile);
460 }
461 }
462 break;
463 default:
464 break;
465 }
466 }
467
469 tagFile << " </compound>\n";
470}
471
473{
475 {
478 ol.writeRuler();
482 ol.writeAnchor(DString(),"details");
484 ol.startGroupHeader("details");
485 ol.parseText(title);
486 ol.endGroupHeader();
487
488 ol.startTextBlock();
489 if (!briefDescription().empty() && Config_getBool(REPEAT_BRIEF))
490 {
492 briefLine(),
493 this,
494 nullptr,
496 DocOptions());
497 }
498 if (!briefDescription().empty() && Config_getBool(REPEAT_BRIEF) &&
499 !documentation().empty())
500 {
504 ol.enableAll();
507 ol.writeString("\n\n");
509 }
510 if (!documentation().empty())
511 {
512 ol.generateDoc(docFile(),
513 docLine(),
514 this,
515 nullptr,
516 documentation()+"\n",
517 DocOptions()
518 .setIndexWords(true));
519 }
520 //printf("Writing source ref for file %s\n",qPrint(name()));
521 if (Config_getBool(SOURCE_BROWSER))
522 {
523 ol.startParagraph("definition");
525 if (size_t fileMarkerPos = refText.find("@0"); fileMarkerPos!=DString::npos) // should always pass this.
526 {
527 ol.parseText(refText.left(fileMarkerPos)); //text left from marker 1
529 ol.parseText(refText.right(
530 refText.length()-fileMarkerPos-2)); // text right from marker 2
531 }
532 else
533 {
534 err("translation error: invalid marker in trDefinedInSourceFile()\n");
535 }
536 ol.endParagraph();
537 }
539 ol.endTextBlock();
540 }
541}
542
544{
546 {
547 auto parser { createDocParser() };
548 auto ast { validatingParseDoc(*parser.get(),
549 briefFile(),
550 briefLine(),
551 this,
552 nullptr,
554 DocOptions()
555 .setIndexWords(true)
556 .setSingleLine(true))
557 };
558 if (!ast->empty())
559 {
560 ol.startParagraph();
563 ol.writeString(" - ");
565 ol.writeDoc(ast.get(),this,nullptr);
568 ol.writeString(" \n");
570
571 if (Config_getBool(REPEAT_BRIEF) ||
572 !documentation().stripWhiteSpace().empty()
573 )
574 {
576 ol.startTextLink(DString(),"details");
578 ol.endTextLink();
579 }
581 ol.endParagraph();
582 }
583 }
584 ol.writeSynopsis();
585}
586
588{
589 for (const auto &cd : list)
590 {
591 if (cd->isLinkableInProject())
592 {
593 tagFile << " <class kind=\"" << cd->compoundTypeString() <<
594 "\">" << convertToXML(cd->name()) << "</class>\n";
595 }
596 }
597}
598
600{
601 if (!m_includeList.empty())
602 {
603 ol.startTextBlock(true);
604 for (const auto &ii : m_includeList)
605 {
606 const FileDef *fd=ii.fileDef;
607 ol.startTypewriter();
608 SrcLangExt lang = fd ? fd->getLanguage() : SrcLangExt::Cpp;
609 ol.docify(::includeStatement(lang,ii.kind));
610 ol.docify(::includeOpen(lang,ii.kind));
612 ol.docify(ii.includeName);
613 ol.enableAll();
615
616 // Here we use the include file name as it appears in the file.
617 // we could also we the name as it is used within doxygen,
618 // then we should have used fd->docName() instead of ii->includeName
619 if (fd && fd->isLinkable())
620 {
623 DString(),ii.includeName);
624 }
625 else
626 {
628 if (ii.kind==IncludeKind::ImportModule && mod && mod->isLinkable())
629 {
631 DString(),ii.includeName);
632 }
633 else
634 {
635 ol.docify(ii.includeName);
636 }
637 }
638
639 ol.enableAll();
640 ol.docify(::includeClose(lang,ii.kind));
641 ol.endTypewriter();
642 ol.lineBreak();
643 }
644 ol.endTextBlock();
645 }
646}
647
649{
650 if (Config_getBool(HAVE_DOT) && m_hasIncludeGraph /*&& Config_getBool(INCLUDE_GRAPH)*/)
651 {
652 //printf("Graph for file %s\n",qPrint(name()));
653 DotInclDepGraph incDepGraph(this,false);
654 if (incDepGraph.isTooBig())
655 {
656 warn_uncond("Include graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
657 qPrint(name()), incDepGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
658 }
659 else if (!incDepGraph.isTrivial())
660 {
661 ol.startTextBlock();
665 ol.endInclDepGraph(incDepGraph);
666 ol.enableAll();
667 ol.endTextBlock(true);
668 }
669 //incDepGraph.writeGraph(Config_getString(HTML_OUTPUT),fd->getOutputFileBase());
670 }
671}
672
674{
675 if (Config_getBool(HAVE_DOT) && m_hasIncludedByGraph /*&& Config_getBool(INCLUDED_BY_GRAPH)*/)
676 {
677 //printf("Graph for file %s\n",qPrint(name()));
678 DotInclDepGraph incDepGraph(this,true);
679 if (incDepGraph.isTooBig())
680 {
681 warn_uncond("Included by graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
682 qPrint(name()), incDepGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
683 }
684 else if (!incDepGraph.isTrivial())
685 {
686 ol.startTextBlock();
690 ol.endInclDepGraph(incDepGraph);
691 ol.enableAll();
692 ol.endTextBlock(true);
693 }
694 //incDepGraph.writeGraph(Config_getString(HTML_OUTPUT),fd->getOutputFileBase());
695 }
696}
697
698
700{
701 //printf("%s: generateSourceFile()=%d\n",qPrint(name()),generateSourceFile());
702 if (generateSourceFile())
703 {
705 ol.startParagraph();
708 ol.endTextLink();
709 ol.endParagraph();
710 ol.enableAll();
711 }
712}
713
715 bool const isConstantGroup)
716{
717 // write list of namespaces
718 m_namespaces.writeDeclaration(ol,title,isConstantGroup);
719}
720
722{
723 // write list of classes
724 list.writeDeclaration(ol,nullptr,title,false);
725}
726
728{
729 // write list of classes
731}
732
734{
735 // temporarily undo the disabling could be done by startMemberDocumentation()
736 // as a result of setting SEPARATE_MEMBER_PAGES to YES; see bug730512
737 bool isEnabled = ol.isEnabled(OutputType::Html);
739
741
742 // restore the initial state if needed
743 if (!isEnabled) ol.disable(OutputType::Html);
744}
745
750
755
757{
758 if (Config_getBool(SEPARATE_MEMBER_PAGES))
759 {
762 }
763}
764
766{
767 if (Config_getBool(SEPARATE_MEMBER_PAGES))
768 {
771 }
772}
773
775{
776 /* write user defined member groups */
777 for (const auto &mg : m_memberGroups)
778 {
779 if (!mg->allMembersInSameSection() || !m_subGrouping)
780 {
781 mg->writeDeclarations(ol,nullptr,nullptr,this,nullptr,nullptr);
782 }
783 }
784}
785
787{
788 // write Author section (Man only)
791 ol.startGroupHeader();
792 ol.parseText(theTranslator->trAuthor(true,true));
793 ol.endGroupHeader();
796}
797
799{
802 bool first=true;
803 SrcLangExt lang=getLanguage();
804 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::File))
805 {
806 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
807 if (lde->kind()==LayoutDocEntry::FileClasses && m_classes.declVisible() && ls)
808 {
809 DString label = "nested-classes";
810 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
811 first=false;
812 }
813 else if (lde->kind()==LayoutDocEntry::FileInterfaces && m_interfaces.declVisible() && ls)
814 {
815 DString label = "interfaces";
816 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
817 first=false;
818 }
819 else if (lde->kind()==LayoutDocEntry::FileStructs && m_structs.declVisible() && ls)
820 {
821 DString label = "structs";
822 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
823 first=false;
824 }
825 else if (lde->kind()==LayoutDocEntry::FileExceptions && m_exceptions.declVisible() && ls)
826 {
827 DString label = "exceptions";
828 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
829 first=false;
830 }
831 else if (lde->kind()==LayoutDocEntry::FileNamespaces && m_namespaces.declVisible(false) && ls)
832 {
833 DString label = "namespaces";
834 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
835 first=false;
836 }
837 else if (lde->kind()==LayoutDocEntry::FileConcepts && m_concepts.declVisible() && ls)
838 {
839 DString label = "concepts";
840 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
841 first=false;
842 }
843 else if (lde->kind()==LayoutDocEntry::MemberDecl)
844 {
845 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
846 if (lmd)
847 {
848 MemberList * ml = getMemberList(lmd->type);
849 if (ml && ml->declVisible())
850 {
851 ol.writeSummaryLink(DString(),ml->listType().toLabel(),lmd->title(lang),first);
852 first=false;
853 }
854 }
855 }
856 }
857 if (!first)
858 {
859 ol.writeString(" </div>\n");
860 }
862}
863
868
869/*! Write the documentation page for this file to the file of output
870 generators \a ol.
871*/
873{
874 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
875 //funcList->countDecMembers();
876
877 //DString fn = name();
878 //if (Config_getBool(FULL_PATH_NAMES))
879 //{
880 // fn.prepend(stripFromPath(getPath()));
881 //}
882
883 //printf("WriteDocumentation diskname=%s\n",qPrint(diskname));
884
885 DString versionTitle;
886 if (!m_fileVersion.empty())
887 {
888 versionTitle=" ("+m_fileVersion+")";
889 }
890 DString title = m_docname+versionTitle;
891 DString pageTitle;
892 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
893 {
894 pageTitle=m_docname;
895 }
896 else
897 {
899 }
900
901 if (getDirDef())
902 {
903 startFile(ol,getOutputFileBase(),false,name(),pageTitle,HighlightedItem::FileVisible,!generateTreeView);
904 if (!generateTreeView)
905 {
907 ol.endQuickIndices();
908 }
909 startTitle(ol,getOutputFileBase(),this);
912 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
913 {
914 ol.parseText(displayName()); // Html only
915 }
916 else
917 {
919 }
920 ol.enableAll();
922 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
923 {
924 ol.parseText(Config_getBool(FULL_PATH_NAMES) ? // other output formats
925 pageTitle :
926 name());
927 }
928 else
929 {
930 ol.parseText(Config_getBool(FULL_PATH_NAMES) ? // other output formats
931 pageTitle :
933 }
935 addGroupListToTitle(ol,this);
937 }
938 else
939 {
940 startFile(ol,getOutputFileBase(),false,name(),pageTitle,HighlightedItem::FileVisible,!generateTreeView);
941 if (!generateTreeView)
942 {
943 ol.endQuickIndices();
944 }
945 startTitle(ol,getOutputFileBase(),this);
946 ol.parseText(pageTitle);
947 addGroupListToTitle(ol,this);
949 }
950
951 ol.startContents();
952
953 if (!m_fileVersion.empty())
954 {
957 ol.docify(versionTitle);
958 ol.endProjectNumber();
959 ol.enableAll();
960 }
961
962 //---------------------------------------- start flexible part -------------------------------
963
964 SrcLangExt lang = getLanguage();
965 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::File))
966 {
967 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
968 switch (lde->kind())
969 {
970 case LayoutDocEntry::BriefDesc:
972 break;
973 case LayoutDocEntry::MemberDeclStart:
975 break;
976 case LayoutDocEntry::FileIncludes:
978 break;
979 case LayoutDocEntry::FileIncludeGraph:
981 break;
982 case LayoutDocEntry::FileIncludedByGraph:
984 break;
985 case LayoutDocEntry::FileSourceLink:
986 writeSourceLink(ol);
987 break;
988 case LayoutDocEntry::FileClasses:
989 if (ls) writeClassDeclarations(ol,ls->title(lang),m_classes);
990 break;
991 case LayoutDocEntry::FileInterfaces:
992 if (ls) writeClassDeclarations(ol,ls->title(lang),m_interfaces);
993 break;
994 case LayoutDocEntry::FileStructs:
995 if (ls) writeClassDeclarations(ol,ls->title(lang),m_structs);
996 break;
997 case LayoutDocEntry::FileExceptions:
998 if (ls) writeClassDeclarations(ol,ls->title(lang),m_exceptions);
999 break;
1000 case LayoutDocEntry::FileConcepts:
1001 if (ls) writeConcepts(ol,ls->title(lang));
1002 break;
1003 case LayoutDocEntry::FileNamespaces:
1004 if (ls) writeNamespaceDeclarations(ol,ls->title(lang),false);
1005 break;
1006 case LayoutDocEntry::FileConstantGroups:
1007 if (ls) writeNamespaceDeclarations(ol,ls->title(lang),true);
1008 break;
1009 case LayoutDocEntry::MemberGroups:
1011 break;
1012 case LayoutDocEntry::MemberDecl:
1013 {
1014 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1015 if (lmd) writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
1016 }
1017 break;
1018 case LayoutDocEntry::MemberDeclEnd:
1020 break;
1021 case LayoutDocEntry::DetailedDesc:
1022 if (ls) writeDetailedDescription(ol,ls->title(lang));
1023 break;
1024 case LayoutDocEntry::MemberDefStart:
1026 break;
1027 case LayoutDocEntry::FileInlineClasses:
1029 break;
1030 case LayoutDocEntry::MemberDef:
1031 {
1032 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
1033 if (lmd) writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
1034 }
1035 break;
1036 case LayoutDocEntry::MemberDefEnd:
1038 break;
1039 case LayoutDocEntry::AuthorSection:
1041 break;
1042 case LayoutDocEntry::ClassIncludes:
1043 case LayoutDocEntry::ClassInheritanceGraph:
1044 case LayoutDocEntry::ClassNestedClasses:
1045 case LayoutDocEntry::ClassCollaborationGraph:
1046 case LayoutDocEntry::ClassAllMembersLink:
1047 case LayoutDocEntry::ClassUsedFiles:
1048 case LayoutDocEntry::ClassInlineClasses:
1049 case LayoutDocEntry::NamespaceNestedNamespaces:
1050 case LayoutDocEntry::NamespaceNestedConstantGroups:
1051 case LayoutDocEntry::NamespaceClasses:
1052 case LayoutDocEntry::NamespaceConcepts:
1053 case LayoutDocEntry::NamespaceInterfaces:
1054 case LayoutDocEntry::NamespaceStructs:
1055 case LayoutDocEntry::NamespaceExceptions:
1056 case LayoutDocEntry::NamespaceInlineClasses:
1057 case LayoutDocEntry::ConceptDefinition:
1058 case LayoutDocEntry::GroupClasses:
1059 case LayoutDocEntry::GroupConcepts:
1060 case LayoutDocEntry::GroupModules:
1061 case LayoutDocEntry::GroupInlineClasses:
1062 case LayoutDocEntry::GroupNamespaces:
1063 case LayoutDocEntry::GroupDirs:
1064 case LayoutDocEntry::GroupNestedGroups:
1065 case LayoutDocEntry::GroupFiles:
1066 case LayoutDocEntry::GroupGraph:
1067 case LayoutDocEntry::GroupPageDocs:
1068 case LayoutDocEntry::ModuleExports:
1069 case LayoutDocEntry::ModuleClasses:
1070 case LayoutDocEntry::ModuleConcepts:
1071 case LayoutDocEntry::ModuleUsedFiles:
1072 case LayoutDocEntry::DirSubDirs:
1073 case LayoutDocEntry::DirFiles:
1074 case LayoutDocEntry::DirGraph:
1075 err("Internal inconsistency: member '{}' should not be part of "
1076 "LayoutDocManager::File entry list\n",lde->entryToString());
1077 break;
1078 }
1079 }
1080
1081 //---------------------------------------- end flexible part -------------------------------
1082
1083 ol.endContents();
1084
1085 endFileWithNavPath(ol,this);
1086
1087 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1088 {
1089 MemberList *ml = getMemberList(MemberListType::AllMembersList());
1090 if (ml) ml->sort();
1091 writeMemberPages(ol);
1092 }
1093}
1094
1096{
1097 ol.pushGeneratorState();
1099
1100 for (const auto &ml : m_memberLists)
1101 {
1102 if (ml->listType().isDocumentation())
1103 {
1104 ml->writeDocumentationPage(ol,name(),this);
1105 }
1106 }
1107
1108 ol.popGeneratorState();
1109}
1110
1112{
1113 bool createSubDirs=Config_getBool(CREATE_SUBDIRS);
1114
1115 ol.writeString(" <div class=\"navtab\">\n");
1116 ol.writeString(" <table>\n");
1117
1118 MemberList *allMemberList = getMemberList(MemberListType::AllMembersList());
1119 if (allMemberList)
1120 {
1121 for (const auto &md : *allMemberList)
1122 {
1123 if (md->getFileDef()==this && md->getNamespaceDef()==nullptr && md->isLinkable() && !md->isEnumValue())
1124 {
1125 if (md->isLinkableInProject())
1126 {
1127 DString fn=md->getOutputFileBase();
1129 if (md==currentMd) // selected item => highlight
1130 {
1131 ol.writeString(" <tr><td class=\"navtabHL\">");
1132 }
1133 else
1134 {
1135 ol.writeString(" <tr><td class=\"navtab\">");
1136 }
1137 ol.writeString("<span class=\"label\"><a ");
1138 ol.writeString("href=\"");
1139 if (createSubDirs) ol.writeString("../../");
1140 ol.writeString(fn+"#"+md->anchor());
1141 ol.writeString("\">");
1142 ol.writeString(convertToHtml(md->localName()));
1143 ol.writeString("</a></span>");
1144 ol.writeString("</td></tr>\n");
1145 }
1146 }
1147 }
1148 }
1149
1150 ol.writeString(" </table>\n");
1151 ol.writeString(" </div>\n");
1152}
1153
1154/*! Write a source listing of this file to the output */
1156{
1157 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
1159 if (!m_fileVersion.empty())
1160 {
1161 title+=" ("+m_fileVersion+")";
1162 }
1165
1166 bool isDocFile = isDocumentationFile();
1167 bool genSourceFile = !isDocFile && generateSourceFile();
1168 if (getDirDef())
1169 {
1171 !generateTreeView,
1172 !isDocFile && genSourceFile ? DString() : getOutputFileBase(),
1173 0);
1174 if (!generateTreeView)
1175 {
1177 ol.endQuickIndices();
1178 }
1180 ol.parseText(name());
1182 }
1183 else
1184 {
1186 !isDocFile && genSourceFile ? DString() : getOutputFileBase(),
1187 0);
1189 ol.parseText(title);
1191 }
1192
1193 ol.startContents();
1194
1195 if (isLinkable())
1196 {
1199 ol.endTextLink();
1200
1201 ol.pushGeneratorState();
1203 ol.writeString("\\par\n");
1204 ol.popGeneratorState();
1205 }
1206}
1207
1208void FileDefImpl::writeSourceBody(OutputList &ol,[[maybe_unused]] ClangTUParser *clangParser)
1209{
1210 bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
1211 OutputCodeList devNullList;
1212 devNullList.add<DevNullCodeGenerator>();
1213#if USE_LIBCLANG
1214 if (Doxygen::clangAssistedParsing && clangParser &&
1215 (getLanguage()==SrcLangExt::Cpp || getLanguage()==SrcLangExt::ObjC))
1216 {
1217 auto &codeOL = ol.codeGenerators();
1218 codeOL.startCodeFragment("DoxyCode");
1219 clangParser->switchToFile(this);
1220 clangParser->writeSources(codeOL,this);
1221 codeOL.endCodeFragment("DoxyCode");
1222 }
1223 else
1224#endif
1225 {
1227 intf->resetCodeParserState();
1228 auto &codeOL = ol.codeGenerators();
1229 codeOL.startCodeFragment("DoxyCode");
1230 bool needs2PassParsing =
1231 Doxygen::parseSourcesNeeded && // we need to parse (filtered) sources for cross-references
1232 !filterSourceFiles && // but user wants to show sources as-is
1233 !getFileFilter(absFilePath(),true).empty(); // and there is a filter used while parsing
1234
1235 if (needs2PassParsing)
1236 {
1237 // parse code for cross-references only (see bug707641)
1238 intf->parseCode(devNullList,DString(),
1239 fileToString(absFilePath(),true,true),
1240 getLanguage(),
1241 Config_getBool(STRIP_CODE_COMMENTS),
1243 .setFileDef(this)
1244 );
1245 }
1246 size_t indent = 0;
1247 intf->parseCode(codeOL,DString(),
1248 detab(fileToString(absFilePath(),filterSourceFiles,true),indent),
1249 getLanguage(), // lang
1250 Config_getBool(STRIP_CODE_COMMENTS),
1252 .setFileDef(this)
1253 .setCollectXRefs(!needs2PassParsing)
1254 );
1255 codeOL.endCodeFragment("DoxyCode");
1256 }
1257}
1258
1260{
1261 ol.endContents();
1262 endFileWithNavPath(ol,this,false);
1263 ol.enableAll();
1264}
1265
1266void FileDefImpl::parseSource([[maybe_unused]] ClangTUParser *clangParser)
1267{
1268 bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
1269 OutputCodeList devNullList;
1270 devNullList.add<DevNullCodeGenerator>();
1271#if USE_LIBCLANG
1272 if (Doxygen::clangAssistedParsing && clangParser &&
1273 (getLanguage()==SrcLangExt::Cpp || getLanguage()==SrcLangExt::ObjC))
1274 {
1275 clangParser->switchToFile(this);
1276 clangParser->writeSources(devNullList,this);
1277 }
1278 else
1279#endif
1280 {
1282 intf->resetCodeParserState();
1283 size_t indent = 0;
1284 intf->parseCode(
1285 devNullList,DString(),
1286 detab(fileToString(absFilePath(),filterSourceFiles,true),indent),
1287 getLanguage(),
1288 Config_getBool(STRIP_CODE_COMMENTS),
1290 .setFileDef(this)
1291 );
1292 }
1293}
1294
1296{
1297 for (auto &ml : m_memberLists)
1298 {
1299 if (ml->listType().isDeclaration())
1300 {
1302 }
1303 }
1304
1305 // add members inside sections to their groups
1306 for (const auto &mg : m_memberGroups)
1307 {
1308 if (mg->allMembersInSameSection() && m_subGrouping)
1309 {
1310 //printf("----> addToDeclarationSection(%s)\n",qPrint(mg->header()));
1311 mg->addToDeclarationSection();
1312 }
1313 }
1314}
1315
1316/*! Adds member definition \a md to the list of all members of this file */
1318{
1319 if (md->isHidden()) return;
1320 MemberList *allMemberList = getMemberList(MemberListType::AllMembersList());
1321 //printf("%s:FileDefImpl::insertMember(%s (=%p) list has %zu elements)\n",
1322 // qPrint(name()),qPrint(md->name()),(void*)md,allMemberList ? allMemberList->size() : 0);
1323 if (allMemberList && allMemberList->contains(md))
1324 {
1325 //printf("already added\n");
1326 return;
1327 }
1328
1329 if (allMemberList==nullptr)
1330 {
1331 m_memberLists.emplace_back(std::make_unique<MemberList>(MemberListType::AllMembersList(),MemberListContainer::File));
1332 allMemberList = m_memberLists.back().get();
1333 }
1334 allMemberList->push_back(md);
1335 switch (md->memberType())
1336 {
1337 case MemberType::Property:
1338 if (md->getLanguage() == SrcLangExt::Python)
1339 {
1340 addMemberToList(MemberListType::PropertyMembers(),md);
1341 addMemberToList(MemberListType::Properties(),md);
1342 break;
1343 }
1344 // fallthrough, explicitly no break here
1345 case MemberType::Variable:
1346 addMemberToList(MemberListType::DecVarMembers(),md);
1347 addMemberToList(MemberListType::DocVarMembers(),md);
1348 break;
1349 case MemberType::Function:
1350 addMemberToList(MemberListType::DecFuncMembers(),md);
1351 addMemberToList(MemberListType::DocFuncMembers(),md);
1352 break;
1353 case MemberType::Typedef:
1354 addMemberToList(MemberListType::DecTypedefMembers(),md);
1355 addMemberToList(MemberListType::DocTypedefMembers(),md);
1356 break;
1357 case MemberType::Sequence:
1358 addMemberToList(MemberListType::DecSequenceMembers(),md);
1359 addMemberToList(MemberListType::DocSequenceMembers(),md);
1360 break;
1361 case MemberType::Dictionary:
1362 addMemberToList(MemberListType::DecDictionaryMembers(),md);
1363 addMemberToList(MemberListType::DocDictionaryMembers(),md);
1364 break;
1365 case MemberType::Enumeration:
1366 addMemberToList(MemberListType::DecEnumMembers(),md);
1367 addMemberToList(MemberListType::DocEnumMembers(),md);
1368 break;
1369 case MemberType::EnumValue: // enum values are shown inside their enums
1370 break;
1371 case MemberType::Define:
1372 addMemberToList(MemberListType::DecDefineMembers(),md);
1373 addMemberToList(MemberListType::DocDefineMembers(),md);
1374 break;
1375 default:
1376 err("FileDefImpl::insertMembers(): "
1377 "member '{}' with class scope '{}' inserted in file scope '{}'!\n",
1378 md->name(),
1379 md->getClassDef() ? md->getClassDef()->name() : "<global>",
1380 name());
1381 }
1382 //addMemberToGroup(md,groupId);
1383}
1384
1386{
1387 MemberList *ml = getMemberList(lt);
1388 if (ml) ml->remove(md);
1389}
1390
1392{
1393 removeMemberFromList(MemberListType::AllMembersList(),md);
1394 switch(md->memberType())
1395 {
1396 case MemberType::Property:
1397 if (md->getLanguage() == SrcLangExt::Python)
1398 {
1399 removeMemberFromList(MemberListType::PropertyMembers(),md);
1400 removeMemberFromList(MemberListType::Properties(),md);
1401 break;
1402 }
1403 // fallthrough, explicitly no break here
1404 case MemberType::Variable:
1405 removeMemberFromList(MemberListType::DecVarMembers(),md);
1406 removeMemberFromList(MemberListType::DocVarMembers(),md);
1407 break;
1408 case MemberType::Function:
1409 removeMemberFromList(MemberListType::DecFuncMembers(),md);
1410 removeMemberFromList(MemberListType::DocFuncMembers(),md);
1411 break;
1412 case MemberType::Typedef:
1413 removeMemberFromList(MemberListType::DecTypedefMembers(),md);
1414 removeMemberFromList(MemberListType::DocTypedefMembers(),md);
1415 break;
1416 case MemberType::Sequence:
1417 removeMemberFromList(MemberListType::DecSequenceMembers(),md);
1418 removeMemberFromList(MemberListType::DocSequenceMembers(),md);
1419 break;
1420 case MemberType::Dictionary:
1421 removeMemberFromList(MemberListType::DecDictionaryMembers(),md);
1422 removeMemberFromList(MemberListType::DocDictionaryMembers(),md);
1423 break;
1424 case MemberType::Enumeration:
1425 removeMemberFromList(MemberListType::DecEnumMembers(),md);
1426 removeMemberFromList(MemberListType::DocEnumMembers(),md);
1427 break;
1428 case MemberType::EnumValue: // enum values are shown inside their enums
1429 break;
1430 case MemberType::Define:
1431 removeMemberFromList(MemberListType::DecDefineMembers(),md);
1432 removeMemberFromList(MemberListType::DocDefineMembers(),md);
1433 break;
1434 default:
1435 err("FileDefImpl::removeMember(): unexpected member remove in file!\n");
1436 }
1437}
1438
1439/*! Adds compound definition \a cd to the list of all compounds of this file */
1441{
1442 if (cd->isHidden()) return;
1443
1445
1446 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
1447 {
1449 {
1450 list = &m_interfaces;
1451 }
1452 else if (cd->compoundType()==ClassDef::Struct)
1453 {
1454 list = &m_structs;
1455 }
1456 else if (cd->compoundType()==ClassDef::Exception)
1457 {
1458 list = &m_exceptions;
1459 }
1460 }
1461
1462 list->add(cd->name(),cd);
1463}
1464
1466{
1467 if (cd->isHidden()) return;
1468 m_concepts.add(cd->name(),cd);
1469}
1470
1471/*! Adds namespace definition \a nd to the list of all compounds of this file */
1473{
1474 if (nd->isHidden()) return;
1475 m_namespaces.add(nd->name(),nd);
1476}
1477
1479{
1480 if (Config_getBool(FULL_PATH_NAMES))
1481 return m_fileName;
1482 else
1483 return DefinitionMixin::name();
1484}
1485
1486void FileDefImpl::addSourceRef(int line,const Definition *d,const MemberDef *md)
1487{
1488 //printf("FileDefImpl::addSourceRef(%d,%s,%s)\n",line,qPrint(d?d->name():"nullptr"),qPrint(md?md->name():"nullptr"));
1489 if (d)
1490 {
1491 m_srcDefMap.emplace(line,d);
1492 if (md) m_srcMemberMap.emplace(line,md);
1493 //printf("Adding member %s with anchor %s at line %d to file %s\n",
1494 // md?qPrint(md->name()):"<none>",md?qPrint(md->anchor()):"<none>",line,qPrint(name()));
1495 }
1496}
1497
1499{
1500 auto it = m_srcDefMap.find(lineNr);
1501 //printf("%s::getSourceDefinition(%d)=%s\n",qPrint(name()),lineNr,it!=m_srcDefMap.end()?qPrint(it->second->name()):"none");
1502 return it!=m_srcDefMap.end() ? it->second : nullptr;
1503}
1504
1506{
1507 auto it = m_srcMemberMap.find(lineNr);
1508 //printf("%s::getSourceMember(%d)=%s\n",qPrint(name()),lineNr,it!=m_srcMemberMap.end()?qPrint(it->second->name()):"none");
1509 return it!=m_srcMemberMap.end() ? it->second : nullptr;
1510}
1511
1512
1514{
1516 //printf("%p: FileDefImpl::addUsingDirective: %s:%d\n",this,qPrint(name()),usingDirList->count());
1517}
1518
1520{
1521 //printf("%p: FileDefImpl::getUsedNamespace: %s:%d\n",this,qPrint(name()),usingDirList?usingDirList->count():0);
1522 return m_usingDirList;
1523}
1524
1529
1531{
1532 //printf("FileDefImpl::addIncludeDependency(%p,%s,%d)\n",(void*)fd,qPrint(incName),kind);
1533 DString iName = fd ? fd->absFilePath() : incName;
1534 if (!iName.empty() && m_includeMap.find(iName.str())==m_includeMap.end())
1535 {
1536 m_includeList.emplace_back(fd,incName,kind);
1537 m_includeMap.emplace(iName.str(),&m_includeList.back());
1538 }
1539}
1540
1542{
1543 if (visitedFiles.find(this)!=visitedFiles.end()) return; // file already processed
1544 visitedFiles.insert(this);
1545 //printf("( FileDefImpl::addIncludedUsingDirectives for file %s\n",qPrint(name()));
1546
1547 if (!m_includeList.empty()) // file contains #includes
1548 {
1549 {
1550 for (const auto &ii : m_includeList) // foreach #include...
1551 {
1552 if (ii.fileDef) // ...that is a known file
1553 {
1554 // recurse into this file
1555 const_cast<FileDef*>(ii.fileDef)->addIncludedUsingDirectives(visitedFiles);
1556 }
1557 }
1558 }
1559 {
1560 // iterate through list from last to first
1561 for (auto ii_it = m_includeList.rbegin(); ii_it!=m_includeList.rend(); ++ii_it)
1562 {
1563 auto &ii = *ii_it;
1564 if (ii.fileDef && ii.fileDef!=this)
1565 {
1566 // add using directives
1567 auto unl = ii.fileDef->getUsedNamespaces();
1568 for (auto it = unl.rbegin(); it!=unl.rend(); ++it)
1569 {
1570 auto *nd = *it;
1571 //printf(" adding using directive for %s\n",qPrint(nd->qualifiedName()));
1572 m_usingDirList.prepend(nd->qualifiedName(),nd);
1573 }
1574 // add using declarations
1575 auto udl = ii.fileDef->getUsedDefinitions();
1576 for (auto it = udl.rbegin(); it!=udl.rend(); ++it)
1577 {
1578 auto *d = *it;
1579 m_usingDeclList.prepend(d->qualifiedName(),d);
1580 }
1581 }
1582 }
1583 }
1584 }
1585 //printf(") end FileDefImpl::addIncludedUsingDirectives for file %s\n",qPrint(name()));
1586}
1587
1588
1590{
1591 //printf("FileDefImpl::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
1592 DString iName = fd ? fd->absFilePath() : incName;
1593 if (!iName.empty() && m_includedByMap.find(iName.str())==m_includedByMap.end())
1594 {
1595 m_includedByList.emplace_back(fd,incName,kind);
1596 m_includedByMap.emplace(iName.str(),&m_includedByList.back());
1597 }
1598}
1599
1601{
1602 if (name.empty()) return false;
1603 return m_includeMap.find(name.str())!=m_includeMap.end();
1604}
1605
1607{
1608 bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
1609 bool verbatimHeaders = Config_getBool(VERBATIM_HEADERS);
1610 return !isReference() &&
1611 (sourceBrowser ||
1612 (verbatimHeaders && (EntryType::guessSection(name()).isHeader() || !m_includedByMap.empty()))
1613 ) &&
1615}
1616
1617
1619{
1622 theTranslator->trFile(true,true),
1624 DString(),
1625 nullptr
1626 );
1627 for (const auto &mg : m_memberGroups)
1628 {
1629 mg->addListReferences(this);
1630 }
1631 for (auto &ml : m_memberLists)
1632 {
1633 if (ml->listType().isDocumentation())
1634 {
1635 ml->addListReferences(this);
1636 }
1637 }
1638}
1639
1641{
1643 for (const auto &mg : m_memberGroups)
1644 {
1645 mg->addRequirementReferences(this);
1646 }
1647 for (auto &ml : m_memberLists)
1648 {
1649 if (ml->listType().isDocumentation())
1650 {
1651 ml->addRequirementReferences(this);
1652 }
1653 }
1654}
1655
1656//-------------------------------------------------------------------
1657
1659{
1661 NamespaceDefSet visitedNamespaces;
1662 for (auto &nd : usingDirList)
1663 {
1665 if (ndm)
1666 {
1667 ndm->combineUsingRelations(visitedNamespaces);
1668 }
1669 }
1670
1671 for (auto &nd : usingDirList)
1672 {
1673 // add used namespaces of namespace nd to this namespace
1674 for (const auto &und : nd->getUsedNamespaces())
1675 {
1676 addUsingDirective(und);
1677 }
1678 // add used classes of namespace nd to this namespace
1679 for (const auto &ud : nd->getUsedDefinitions())
1680 {
1682 }
1683 }
1684}
1685
1687{
1688 static const std::unordered_set<std::string> docExtensions =
1689 { "doc", "txt", "dox", "md", "markdown" };
1690
1691 size_t lastDot = name().rfind('.');
1692 return (lastDot!=DString::npos &&
1693 docExtensions.find(name().mid(lastDot+1).str())!=docExtensions.end()) ||
1694 getLanguageFromFileName(getFileNameExtension(name())) == SrcLangExt::Markdown;
1695}
1696
1698{
1699 DString vercmd = Config_getString(FILE_VERSION_FILTER);
1700 if (!vercmd.empty() && !m_filePath.empty() && !isReference() &&
1701 m_filePath!="generated" && m_filePath!="graph_legend.dox")
1702 {
1703 msg("Version of {} : ",m_filePath);
1704 DString cmd = vercmd+" \""+m_filePath+"\"";
1705 Debug::print(Debug::ExtCmd,0,"Executing popen(`{}`)\n",cmd);
1706 FILE *f=Portable::popen(cmd,"r");
1707 if (!f)
1708 {
1709 err("could not execute {}\n",vercmd);
1710 return;
1711 }
1712 const int bufSize=1024;
1713 char buf[bufSize];
1714 int numRead = static_cast<int>(fread(buf,1,bufSize-1,f));
1716 if (numRead>0 && numRead<bufSize)
1717 {
1718 buf[numRead]='\0';
1719 m_fileVersion=DString(buf,numRead).stripWhiteSpace();
1720 if (!m_fileVersion.empty())
1721 {
1722 msg("{}\n",m_fileVersion);
1723 return;
1724 }
1725 }
1726 msg("no version available\n");
1727 }
1728}
1729
1730
1732{
1733 if (Htags::useHtags)
1734 {
1736 }
1737 else
1738 {
1739 return m_outputDiskName+"_source";
1740 }
1741}
1742
1747
1748/*! Returns the name of the verbatim copy of this file (if any). */
1750{
1751 return getSourceFileBase();
1752}
1753
1755{
1756 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
1757 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
1758 const auto &ml = m_memberLists.get(lt,MemberListContainer::File);
1759 ml->setNeedsSorting(
1760 (ml->listType().isDeclaration() && sortBriefDocs) ||
1761 (ml->listType().isDocumentation() && sortMemberDocs));
1762 ml->push_back(md);
1763 if (ml->listType().isDeclaration())
1764 {
1766 if (mdm)
1767 {
1768 mdm->setSectionList(this,ml.get());
1769 }
1770 }
1771}
1772
1774{
1775 for (auto &ml : m_memberLists)
1776 {
1777 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(false); }
1778 }
1779
1780 for (const auto &mg : m_memberGroups)
1781 {
1782 MemberList &mlg = const_cast<MemberList&>(mg->members());
1783 if (mlg.needsSorting()) { mlg.sort(); mlg.setNeedsSorting(false); }
1784 }
1785
1786 std::stable_sort(m_includedByList.begin(),m_includedByList.end(),
1787 [](const auto &fi1,const auto &fi2) { return fi1.includeName < fi2.includeName; });
1788
1789 if (Config_getBool(SORT_BRIEF_DOCS))
1790 {
1791 auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
1792 {
1793 return Config_getBool(SORT_BY_SCOPE_NAME) ?
1794 dstricmp_sort(c1->displayName(), c2->displayName())<0 :
1795 dstricmp_sort(c1->className(), c2->className())<0;
1796 };
1797
1798 std::stable_sort(m_classes.begin(), m_classes.end(), classComp);
1799 std::stable_sort(m_interfaces.begin(),m_interfaces.end(),classComp);
1800 std::stable_sort(m_structs.begin(), m_structs.end(), classComp);
1801 std::stable_sort(m_exceptions.begin(),m_exceptions.end(),classComp);
1802
1803 auto conceptComp = [](const ConceptLinkedRefMap::Ptr &c1,const ConceptLinkedRefMap::Ptr &c2)
1804 {
1805 return dstricmp_sort(c1->name(),c2->name())<0;
1806 };
1807
1808 std::stable_sort(m_concepts.begin(), m_concepts.end(), conceptComp);
1809
1810 auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
1811 {
1812 return dstricmp_sort(n1->name(),n2->name())<0;
1813 };
1814
1815 std::stable_sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
1816 }
1817}
1818
1820{
1821 for (auto &ml : m_memberLists)
1822 {
1823 if (ml->listType()==lt)
1824 {
1825 return ml.get();
1826 }
1827 }
1828 return nullptr;
1829}
1830
1832{
1833 bool optVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1834 MemberList * ml = getMemberList(lt);
1835 if (ml)
1836 {
1837 if (optVhdl) // use specific declarations function
1838 {
1839
1840 VhdlDocGen::writeVhdlDeclarations(ml,ol,nullptr,nullptr,this,nullptr,nullptr);
1841 }
1842 else
1843 {
1844 ml->writeDeclarations(ol,nullptr,nullptr,this,nullptr,nullptr,title,DString());
1845 }
1846 }
1847}
1848
1850{
1851 MemberList * ml = getMemberList(lt);
1852 if (ml) ml->writeDocumentation(ol,name(),this,title,ml->listType().toLabel());
1853}
1854
1856{
1857 bool showFiles = Config_getBool(SHOW_FILES);
1858 return hasDocumentation() && !isReference() && (showFiles || isLinkableViaGroup());
1859}
1860
1862 StringUnorderedSet &filesVisited,const FileDef *fd,StringVector &incFiles)
1863{
1864 for (const auto &ii : fd->includeFileList())
1865 {
1866 if (ii.fileDef && !ii.fileDef->isReference() &&
1867 filesVisited.find(ii.fileDef->absFilePath().str())==filesVisited.end())
1868 {
1869 //printf("FileDefImpl::addIncludeDependency(%s)\n",qPrint(ii->fileDef->absFilePath()));
1870 incFiles.push_back(ii.fileDef->absFilePath().str());
1871 filesVisited.insert(ii.fileDef->absFilePath().str());
1872 getAllIncludeFilesRecursively(filesVisited,ii.fileDef,incFiles);
1873 }
1874 }
1875}
1876
1878{
1879 StringUnorderedSet includes;
1880 ::getAllIncludeFilesRecursively(includes,this,incFiles);
1881}
1882
1884{
1885 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
1886 {
1887 return name();
1888 }
1889 else
1890 {
1892 }
1893}
1894
1896{
1897 return m_fileVersion;
1898}
1899
1904
1909
1911{
1912 for (auto &ml : m_memberLists)
1913 {
1914 ml->countDecMembers();
1915 ml->countDocMembers();
1916 }
1917 for (const auto &mg : m_memberGroups)
1918 {
1919 mg->countDecMembers();
1920 mg->countDocMembers();
1921 }
1922}
1923
1925{
1926 MemberList *ml = getMemberList(MemberListType::AllMembersList());
1927 return ml ? ml->numDocMembers() : 0;
1928}
1929
1931{
1932 MemberList *ml = getMemberList(MemberListType::AllMembersList());
1933 return ml ? ml->numDecMembers() : 0;
1934}
1935
1940
1945
1947{
1948 return m_hasIncludeGraph;
1949}
1950
1952{
1953 return m_hasIncludedByGraph;
1954}
1955
1956bool FileDefImpl::visibleInIndex(bool &genSourceFile) const
1957{
1958 bool allExternals = Config_getBool(ALLEXTERNALS);
1959 bool isDocFile = isDocumentationFile();
1960 genSourceFile = !isDocFile && generateSourceFile();
1961 return ((allExternals && isLinkable()) || isLinkableInProject()) && !isDocFile;
1962}
1963
1964// -----------------------
1965
1966bool compareFileDefs(const FileDef *fd1, const FileDef *fd2)
1967{
1968 return dstricmp_sort(fd1->name(),fd2->name()) < 0;
1969}
1970
1971// --- Cast functions
1972
1974{
1975 if (d==nullptr) return nullptr;
1976 if (d && typeid(*d)==typeid(FileDefImpl))
1977 {
1978 return static_cast<FileDef*>(d);
1979 }
1980 else
1981 {
1982 return nullptr;
1983 }
1984}
1985
1987{
1988 if (d==nullptr) return nullptr;
1989 if (d && typeid(*d)==typeid(FileDefImpl))
1990 {
1991 return static_cast<const FileDef*>(d);
1992 }
1993 else
1994 {
1995 return nullptr;
1996 }
1997}
1998
Clang parser object for a single translation unit, which consists of a source file and the directly o...
Definition clangparser.h:25
A abstract class representing of a compound symbol.
Definition classdef.h:100
virtual DString className() const =0
Returns the name of the class including outer classes, but not including namespaces.
@ Interface
Definition classdef.h:108
@ Exception
Definition classdef.h:111
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e. class/struct/union/...
bool declVisible(const ClassDef::CompoundType *filter=nullptr) const
Definition classlist.cpp:27
void writeDocumentation(OutputList &ol, const Definition *container=nullptr) const
Definition classlist.cpp:72
void writeDeclaration(OutputList &ol, const ClassDef::CompoundType *filter, const DString &header, bool localNames) const
Definition classlist.cpp:51
bool declVisible() const
void writeDeclaration(OutputList &ol, const DString &header, bool localNames) const
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
size_t rfind(char c, size_t pos=npos) const
Definition dstring.h:244
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
DString right(size_t len) const
Definition dstring.h:311
DString & prepend(const char *s)
Definition dstring.h:515
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
DString & sprintf(const char *format,...)
Definition dstring.cpp:34
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:337
DString left(size_t len) const
Definition dstring.h:306
const std::string & str() const
Definition dstring.h:645
DString & insert(size_t index, const DString &s)
Definition dstring.h:425
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:151
@ ExtCmd
Definition debug.h:37
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:78
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual bool isLinkable() const =0
virtual const DString & name() const =0
virtual DString displayName(bool includeScope=true) const =0
virtual DString qualifiedName() const =0
virtual bool isHidden() const =0
virtual DString getReference() const =0
virtual bool isReference() const =0
virtual DString getOutputFileBase() const =0
bool isReference() const override
DString docFile() const override
bool isLinkableViaGroup() const override
bool hasBriefDescription() const override
DString briefFile() const override
bool hasRequirementRefs() const override
DString briefDescription(bool abbreviate=false) const override
const DString & name() const override
void setLanguage(SrcLangExt lang) override
void writeRequirementRefs(OutputList &ol) const override
const RefItemVector & xrefListItems() const override
const DString & localName() const override
void setReference(const DString &r) override
DString getDefFileExtension() const override
DString documentation() const override
DefinitionMixin(const DString &defFileName, int defLine, size_t defColumn, const DString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=true)
const FileDef * getBodyDef() const override
DString inbodyDocumentation() const override
int getStartBodyLine() const override
int docLine() const override
int briefLine() const override
void writeDocAnchorsToTagFile(TextStream &fs) const override
bool hasDocumentation() const override
SrcLangExt getLanguage() const override
virtual void writeNavigationPath(OutputList &ol) const =0
Class implementing OutputCodeIntf by throwing away everything.
Definition devnullgen.h:23
A model of a directory symbol.
Definition dirdef.h:108
Representation of an include dependency graph.
bool isTooBig() const
bool isTrivial() const
static bool suppressDocWarnings
Definition doxygen.h:123
static bool parseSourcesNeeded
Definition doxygen.h:116
static bool clangAssistedParsing
Definition doxygen.h:129
static ParserManager * parserManager
Definition doxygen.h:122
static EntryType guessSection(const DString &name)
Definition types.cpp:22
A model of a file symbol.
Definition filedef.h:97
virtual DString includeName() const =0
virtual bool generateSourceFile() const =0
virtual DString absFilePath() const =0
virtual const IncludeInfoList & includeFileList() const =0
void addIncludedByDependency(const FileDef *fd, const DString &incName, IncludeKind kind) override
Definition filedef.cpp:1589
bool isDocumentationFile() const override
Definition filedef.cpp:1686
void findSectionsInDocumentation() override
Definition filedef.cpp:344
DString m_inclByDepFileName
Definition filedef.cpp:244
void setModuleDef(ModuleDef *mod) override
Definition filedef.cpp:187
void addIncludedUsingDirectives(FileDefSet &visitedFiles) override
Definition filedef.cpp:1541
void writeBriefDescription(OutputList &ol)
Definition filedef.cpp:543
const LinkedRefMap< const Definition > & getUsedDefinitions() const override
Definition filedef.cpp:151
void addSourceRef(int line, const Definition *d, const MemberDef *md) override
Definition filedef.cpp:1486
LinkedRefMap< const Definition > m_usingDeclList
Definition filedef.cpp:240
DirDef * m_dir
Definition filedef.cpp:252
DString includedByDependencyGraphFileName() const override
Definition filedef.cpp:1905
void insertNamespace(NamespaceDef *nd) override
Definition filedef.cpp:1472
ModuleDef * getModuleDef() const override
Definition filedef.cpp:149
void writeQuickMemberLinks(OutputList &ol, const MemberDef *currentMd) const override
Definition filedef.cpp:1111
bool visibleInIndex(bool &genSourceFile) const override
Returns true if this file is visible in the index.
Definition filedef.cpp:1956
void setDiskName(const DString &name) override
Definition filedef.cpp:323
void writeSourceLink(OutputList &ol)
Definition filedef.cpp:699
void writeSummaryLinks(OutputList &ol) const override
Definition filedef.cpp:798
void writeMemberDocumentation(OutputList &ol, MemberListType lt, const DString &title)
Definition filedef.cpp:1849
ClassLinkedRefMap m_interfaces
Definition filedef.cpp:258
const ConceptLinkedRefMap & getConcepts() const override
Definition filedef.cpp:159
void setDiskNameLocal(const DString &name)
Definition filedef.cpp:307
DString getSourceFileBase() const override
Definition filedef.cpp:1731
ClassLinkedRefMap m_structs
Definition filedef.cpp:259
void sortMemberLists() override
Definition filedef.cpp:1773
void parseSource(ClangTUParser *clangParser) override
Definition filedef.cpp:1266
void addMemberToList(MemberListType lt, MemberDef *md)
Definition filedef.cpp:1754
void acquireFileVersion()
Definition filedef.cpp:1697
DString displayName(bool=true) const override
Definition filedef.cpp:129
void addUsingDirective(NamespaceDef *nd) override
Definition filedef.cpp:1513
const DString & name() const override
Definition filedef.cpp:1478
void countMembers() override
Definition filedef.cpp:1910
void distributeMemberGroupDocumentation() override
Definition filedef.cpp:335
MemberDefLineMap m_srcMemberMap
Definition filedef.cpp:249
ConceptLinkedRefMap m_concepts
Definition filedef.cpp:261
void insertClass(ClassDef *cd) override
Definition filedef.cpp:1440
DefinitionLineMap m_srcDefMap
Definition filedef.cpp:248
NamespaceLinkedRefMap m_namespaces
Definition filedef.cpp:256
ModuleDef * m_moduleDef
Definition filedef.cpp:253
IncludeInfoList m_includedByList
Definition filedef.cpp:238
CodeSymbolType codeSymbolType() const override
Definition filedef.cpp:126
bool m_hasIncludeGraph
Definition filedef.cpp:263
const NamespaceLinkedRefMap & getNamespaces() const override
Definition filedef.cpp:158
void removeMember(MemberDef *md) override
Definition filedef.cpp:1391
void addUsingDeclaration(const Definition *d) override
Definition filedef.cpp:1525
ClassLinkedRefMap m_exceptions
Definition filedef.cpp:260
void writeTagFile(TextStream &t) override
Definition filedef.cpp:374
void endMemberDeclarations(OutputList &ol)
Definition filedef.cpp:751
void addListReferences() override
Definition filedef.cpp:1618
const MemberGroupList & getMemberGroups() const override
Definition filedef.cpp:157
IncludeInfoMap m_includedByMap
Definition filedef.cpp:237
void insertMember(MemberDef *md) override
Definition filedef.cpp:1317
const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const override
Definition filedef.cpp:1519
void writeConcepts(OutputList &ol, const DString &title)
Definition filedef.cpp:727
void writeInlineClasses(OutputList &ol)
Definition filedef.cpp:733
void writeIncludeFiles(OutputList &ol)
Definition filedef.cpp:599
MemberGroupList m_memberGroups
Definition filedef.cpp:255
void writeNamespaceDeclarations(OutputList &ol, const DString &title, bool isConstantGroup)
Definition filedef.cpp:714
void computeAnchors() override
Definition filedef.cpp:329
void addIncludeDependency(const FileDef *fd, const DString &incName, IncludeKind kind) override
Definition filedef.cpp:1530
void writeMemberPages(OutputList &ol) override
Definition filedef.cpp:1095
void writeSourceFooter(OutputList &ol) override
Definition filedef.cpp:1259
bool generateSourceFile() const override
Definition filedef.cpp:1606
void writeIncludedByGraph(OutputList &ol)
Definition filedef.cpp:673
bool m_isSource
Definition filedef.cpp:250
void writeClassDeclarations(OutputList &ol, const DString &title, const ClassLinkedRefMap &list)
Definition filedef.cpp:721
const MemberDef * getSourceMember(int lineNr) const override
Definition filedef.cpp:1505
~FileDefImpl() override
Definition filedef.cpp:303
DString getOutputFileBase() const override
Definition filedef.cpp:1743
const IncludeInfoList & includeFileList() const override
Definition filedef.cpp:152
DString getVersion() const override
Definition filedef.cpp:144
DString m_fileVersion
Definition filedef.cpp:251
void removeMemberFromList(MemberListType lt, MemberDef *md)
Definition filedef.cpp:1385
void getAllIncludeFilesRecursively(StringVector &incFiles) const override
Definition filedef.cpp:1877
DString m_path
Definition filedef.cpp:241
MemberLists m_memberLists
Definition filedef.cpp:254
DString fileName() const override
Definition filedef.cpp:130
LinkedRefMap< NamespaceDef > m_usingDirList
Definition filedef.cpp:239
void writeAuthorSection(OutputList &ol)
Definition filedef.cpp:786
DString absFilePath() const override
Definition filedef.cpp:137
DString getPath() const override
Definition filedef.cpp:143
void insertConcept(ConceptDef *cd) override
Definition filedef.cpp:1465
const MemberLists & getMemberLists() const override
Definition filedef.cpp:156
DString m_inclDepFileName
Definition filedef.cpp:243
DString m_outputDiskName
Definition filedef.cpp:245
void writeDetailedDescription(OutputList &ol, const DString &title)
Definition filedef.cpp:472
DString includeDependencyGraphFileName() const override
Definition filedef.cpp:1900
IncludeInfoMap m_includeMap
Definition filedef.cpp:235
bool m_subGrouping
Definition filedef.cpp:262
DString m_fileName
Definition filedef.cpp:246
const DString & docName() const override
Definition filedef.cpp:138
DirDef * getDirDef() const override
Definition filedef.cpp:148
void overrideIncludeGraph(bool e) override
Definition filedef.cpp:1936
ClassLinkedRefMap m_classes
Definition filedef.cpp:257
void overrideIncludedByGraph(bool e) override
Definition filedef.cpp:1941
const IncludeInfoList & includedByFileList() const override
Definition filedef.cpp:153
bool hasIncludedByGraph() const override
Definition filedef.cpp:1951
void writePageNavigation(OutputList &ol) const override
Definition filedef.cpp:864
bool subGrouping() const override
Definition filedef.cpp:164
void writeSourceHeader(OutputList &ol) override
Definition filedef.cpp:1155
void writeSourceBody(OutputList &ol, ClangTUParser *clangParser) override
Definition filedef.cpp:1208
void writeIncludeGraph(OutputList &ol)
Definition filedef.cpp:648
void addMembersToMemberGroup() override
Definition filedef.cpp:1295
int numDocMembers() const override
Definition filedef.cpp:1924
bool m_hasIncludedByGraph
Definition filedef.cpp:264
IncludeInfoList m_includeList
Definition filedef.cpp:236
void startMemberDocumentation(OutputList &ol)
Definition filedef.cpp:756
int numDecMembers() const override
Definition filedef.cpp:1930
DString fileVersion() const override
Definition filedef.cpp:1895
void writeClassesToTagFile(TextStream &t, const ClassLinkedRefMap &list)
Definition filedef.cpp:587
MemberList * getMemberList(MemberListType lt) const override
Definition filedef.cpp:1819
void startMemberDeclarations(OutputList &ol)
Definition filedef.cpp:746
bool isSource() const override
Definition filedef.cpp:139
void combineUsingRelations() override
Definition filedef.cpp:1658
bool isLinkableInProject() const override
Definition filedef.cpp:1855
void endMemberDocumentation(OutputList &ol)
Definition filedef.cpp:765
const ClassLinkedRefMap & getClasses() const override
Definition filedef.cpp:160
void writeMemberDeclarations(OutputList &ol, MemberListType lt, const DString &title)
Definition filedef.cpp:1831
bool hasIncludeGraph() const override
Definition filedef.cpp:1946
void writeDocumentation(OutputList &ol) override
Definition filedef.cpp:872
bool isIncluded(const DString &name) const override
Definition filedef.cpp:1600
DString m_docname
Definition filedef.cpp:247
DString m_filePath
Definition filedef.cpp:242
DString title() const override
Definition filedef.cpp:1883
void addRequirementReferences() override
Definition filedef.cpp:1640
bool isLinkable() const override
Definition filedef.cpp:146
FileDefImpl(const DString &p, const DString &n, const DString &ref=DString(), const DString &dn=DString())
Definition filedef.cpp:279
DefType definitionType() const override
Definition filedef.cpp:125
bool hasDetailedDescription() const override
Definition filedef.cpp:363
DString anchor() const override
Definition filedef.cpp:132
void setDirDef(DirDef *dd) override
Definition filedef.cpp:186
void writeMemberGroups(OutputList &ol)
Definition filedef.cpp:774
const Definition * getSourceDefinition(int lineNr) const override
Definition filedef.cpp:1498
DString includeName() const override
Definition filedef.cpp:1749
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1437
Container class representing a vector of objects with keys.
Definition linkedmap.h:232
bool add(const char *k, T *obj)
Definition linkedmap.h:284
iterator end()
Definition linkedmap.h:367
bool prepend(const char *k, T *obj)
Definition linkedmap.h:317
iterator begin()
Definition linkedmap.h:366
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
virtual const ClassDef * getClassDef() const =0
virtual MemberType memberType() const =0
virtual void setSectionList(const Definition *container, const MemberList *sl)=0
A list of MemberDef objects as shown in documentation sections.
Definition memberlist.h:126
bool needsSorting() const
Definition memberlist.h:141
int numDocMembers() const
Definition memberlist.h:139
void writeTagFile(TextStream &, bool useQualifiedName=false, bool showNamespaceMembers=true)
void setNeedsSorting(bool b)
void writeDeclarations(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, const DString &title, const DString &subtitle, bool showEnumValues=false, bool showInline=false, const ClassDef *inheritedFrom=nullptr, MemberListType lt=MemberListType::PubMethods(), bool showSectionTitle=true) const
Writes the list of members to the output.
void writeDocumentation(OutputList &ol, const DString &scopeName, const Definition *container, const DString &title, const DString &anchor, bool showEnumValues=false, bool showInline=false) const
MemberListType listType() const
Definition memberlist.h:131
void setAnchors()
int numDecMembers(const ClassDef *inheritedFrom) const
Definition memberlist.h:134
bool declVisible() const
Wrapper class for the MemberListType type.
Definition types.h:346
constexpr const char * toLabel() const noexcept
Definition types.h:402
const std::unique_ptr< MemberList > & get(MemberListType lt, MemberListContainer con)
Definition memberlist.h:192
void remove(const MemberDef *md)
Definition memberlist.h:85
void sort()
Definition memberlist.h:77
bool contains(const MemberDef *md) const
Definition memberlist.h:90
void push_back(const T &value)
Definition memberlist.h:49
static ModuleManager & instance()
ModuleDef * getPrimaryInterface(const DString &moduleName) const
An abstract interface of a namespace symbol.
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
void writeDeclaration(OutputList &ol, const DString &title, bool isConstantGroup=false, bool localName=false)
bool declVisible(bool isContantGroup) const
Class representing a list of different code generators.
Definition outputlist.h:162
void startCodeFragment(const DString &style)
Definition outputlist.h:276
void add(OutputCodeIntfPtr &&p)
Definition outputlist.h:192
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:311
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md, int sectionLevel=-1)
Definition outputlist.h:379
bool isEnabled(OutputType o)
void parseText(const DString &textStr)
void disable(OutputType o)
void startParagraph(const DString &classDef=DString())
Definition outputlist.h:403
void writeObjectLink(const DString &ref, const DString &file, const DString &anchor, const DString &name)
Definition outputlist.h:435
void startInclDepGraph()
Definition outputlist.h:648
void writeRuler()
Definition outputlist.h:517
const OutputCodeList & codeGenerators() const
Definition outputlist.h:354
void enable(OutputType o)
void endContents()
Definition outputlist.h:616
void endTextBlock(bool paraBreak=false)
Definition outputlist.h:668
void docify(const DString &s)
Definition outputlist.h:433
void lineBreak(const DString &style=DString())
Definition outputlist.h:555
void writeAnchor(const DString &fileName, const DString &name)
Definition outputlist.h:519
void writeString(const DString &text)
Definition outputlist.h:407
void startProjectNumber()
Definition outputlist.h:387
void endParagraph()
Definition outputlist.h:405
void endInclDepGraph(DotInclDepGraph &g)
Definition outputlist.h:650
void startMemberSections()
Definition outputlist.h:457
void endTextLink()
Definition outputlist.h:440
void writeSynopsis()
Definition outputlist.h:588
void startTypewriter()
Definition outputlist.h:445
void pushGeneratorState()
void writeSummaryLink(const DString &file, const DString &anchor, const DString &title, bool first)
Definition outputlist.h:610
void disableAllBut(OutputType o)
void startTextBlock(bool dense=false)
Definition outputlist.h:666
void popGeneratorState()
void startTextLink(const DString &file, const DString &anchor)
Definition outputlist.h:438
void endGroupHeader(int extraLevels=0)
Definition outputlist.h:451
void endQuickIndices()
Definition outputlist.h:600
void writePageOutline()
Definition outputlist.h:612
void generateDoc(const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &docStr, const DocOptions &options)
void startContents()
Definition outputlist.h:614
void startGroupHeader(const DString &id=DString(), int extraLevels=0)
Definition outputlist.h:449
void enableAll()
void endProjectNumber()
Definition outputlist.h:389
void endTypewriter()
Definition outputlist.h:447
void endMemberSections()
Definition outputlist.h:459
std::unique_ptr< CodeParserInterface > getCodeParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
Definition parserintf.h:253
static RequirementManager & instance()
void addRequirementRefsForSymbol(const Definition *symbol)
Text streaming class that buffers data.
Definition textstream.h:36
virtual DString trAuthor(bool first_capital, bool singular)=0
virtual DString trFileReference(const DString &fileName)=0
virtual DString trGotoDocumentation()=0
virtual DString trInclDepGraph(const DString &fName)=0
virtual DString trMore()=0
virtual DString trInclByDepGraph()=0
virtual DString trSourceFile(const DString &filename)=0
virtual DString trGotoSourceCode()=0
virtual DString trGeneratedAutomatically(const DString &s)=0
virtual DString trFile(bool first_capital, bool singular)=0
virtual DString trDefinedInSourceFile()=0
static void writeVhdlDeclarations(const MemberList *, OutputList &, const GroupDef *, const ClassDef *, const FileDef *, const NamespaceDef *, const ModuleDef *)
#define Config_getInt(name)
Definition config.h:34
#define Config_getBool(name)
Definition config.h:33
#define Config_getString(name)
Definition config.h:32
#define NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
std::unordered_set< std::string > StringUnorderedSet
Definition containers.h:29
std::vector< std::string > StringVector
Definition containers.h:33
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:59
void docFindSections(const DString &input, const Definition *d, const DString &fileName)
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &input, const DocOptions &options)
int dstricmp_sort(const char *str1, const char *str2)
Definition dstring.h:67
const char * qPrint(const char *s)
Definition dstring.h:783
DString includeClose(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:82
std::unordered_map< std::string, const IncludeInfo * > IncludeInfoMap
Definition filedef.cpp:116
DString includeOpen(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:69
std::unordered_map< int, const Definition * > DefinitionLineMap
Definition filedef.cpp:114
bool compareFileDefs(const FileDef *fd1, const FileDef *fd2)
Definition filedef.cpp:1966
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:1973
std::unordered_map< int, const MemberDef * > MemberDefLineMap
Definition filedef.cpp:115
DString includeTagFileAttributes(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:100
DString includeStatement(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:52
std::unique_ptr< FileDef > createFileDef(const DString &p, const DString &n, const DString &ref, const DString &dn)
Definition filedef.cpp:267
static void getAllIncludeFilesRecursively(StringUnorderedSet &filesVisited, const FileDef *fd, StringVector &incFiles)
Definition filedef.cpp:1861
constexpr uint32_t IncludeKind_ObjCMask
Definition filedef.h:64
IncludeKind
Definition filedef.h:44
@ ImportLocal
Definition filedef.h:51
@ ImportModule
Definition filedef.h:52
@ IncludeLocal
Definition filedef.h:47
@ ImportSystemObjC
Definition filedef.h:48
@ ImportLocalObjC
Definition filedef.h:49
@ IncludeSystem
Definition filedef.h:46
@ ImportSystem
Definition filedef.h:50
constexpr uint32_t IncludeKind_ImportMask
Definition filedef.h:62
constexpr uint32_t IncludeKind_LocalMask
Definition filedef.h:60
std::unordered_set< const FileDef * > FileDefSet
Definition filedef.h:41
void endTitle(OutputList &ol, const DString &fileName, const DString &name)
Definition index.cpp:398
void endFileWithNavPath(OutputList &ol, const DefinitionMutable *d, bool showPageNavigation)
Definition index.cpp:452
void startTitle(OutputList &ol, const DString &fileName, const DefinitionMutable *def)
Definition index.cpp:388
void startFile(OutputList &ol, const DString &name, bool isSource, const DString &manName, const DString &title, HighlightedItem hli, bool additionalIndices, const DString &altSidebarName, int hierarchyLevel, const DString &allMembersFile)
Definition index.cpp:405
Translator * theTranslator
Definition language.cpp:76
MemberDefMutable * toMemberDefMutable(Definition *d)
#define warn_uncond(fmt,...)
Definition message.h:122
#define msg(fmt,...)
Definition message.h:94
#define err(fmt,...)
Definition message.h:127
FILE * popen(const DString &name, const DString &type)
Definition portable.cpp:495
int pclose(FILE *stream)
Definition portable.cpp:504
DString removeLongPathMarker(const DString &path)
Definition portable.cpp:656
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
std::unordered_set< const NamespaceDef * > NamespaceDefSet
Portable versions of functions that are platform dependent.
void addRefItem(const RefItemVector &sli, const DString &key, const DString &prefix, const DString &name, const DString &title, const DString &args, const Definition *scope)
Definition reflist.h:136
std::string_view stripWhiteSpace(std::string_view s)
Given a string view s, returns a new, narrower view on that string, skipping over any leading or trai...
Definition stringutil.h:75
Options to configure the code parser.
Definition parserintf.h:77
Helper class to pass options when calling OutputList::generateDoc().
Definition docoptions.h:24
static DString path2URL(const DString &path)
Definition htags.cpp:159
static bool useHtags
Definition htags.h:23
Represents of a member declaration list with configurable title and subtitle.
Definition layout.h:111
MemberListType type
Definition layout.h:117
DString title(SrcLangExt lang) const
Definition layout.cpp:1788
Represents of a member definition list with configurable title.
Definition layout.h:131
MemberListType type
Definition layout.h:136
DString title(SrcLangExt lang) const
Definition layout.cpp:1800
Definition layout.h:101
DString title(SrcLangExt lang) const
Definition layout.cpp:1781
CodeSymbolType
Definition types.h:481
SrcLangExt
Definition types.h:207
DString detab(const DString &s, size_t &refIndent)
Definition util.cpp:5179
DString convertNameToFile(const DString &name, bool allowDots, bool allowUnderscore)
Definition util.cpp:2863
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:3921
DString getFileNameExtension(const DString &fn)
Definition util.cpp:4210
void createSubDirs(const Dir &d)
Definition util.cpp:2969
DString convertToHtml(const DString &s, bool keepEntities)
Definition util.cpp:3291
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
Definition util.cpp:4168
DString getFileFilter(const DString &name, bool isSourceCode)
Definition util.cpp:1020
void addHtmlExtensionIfMissing(DString &fName)
Definition util.cpp:3931
DString fileToString(const DString &name, bool filter, bool isSourceCode)
Definition util.cpp:1053
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
Definition util.cpp:3232
DString stripFromPath(const DString &path)
Definition util.cpp:219
A bunch of utility functions.