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