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 setIncludeFile(FileDef *fd, const DString &includeName,bool local, bool force) override;
199 void addIncludedUsingDirectives(FileDefSet &visitedFiles) override;
200 void addListReferences() override;
201 void addRequirementReferences() override;
202
203 bool hasIncludeGraph() const override;
204 bool hasIncludedByGraph() const override;
205 void overrideIncludeGraph(bool e) override;
206 void overrideIncludedByGraph(bool e) override;
207
208 bool visibleInIndex(bool &genSourceFile) const override;
209
210 private:
211 void setDiskNameLocal(const DString &name);
212 void acquireFileVersion();
221 void writeSourceLink(OutputList &ol);
223 bool isConstantGroup);
225 void writeConcepts(OutputList &ol,const DString &title);
235
242 std::unique_ptr<IncludeInfo> m_incInfo;
254 DirDef *m_dir = nullptr;
265 bool m_hasIncludeGraph = Config_getBool(INCLUDE_GRAPH);
266 bool m_hasIncludedByGraph = Config_getBool(INCLUDED_BY_GRAPH);
267};
268
269std::unique_ptr<FileDef> createFileDef(const DString &p,const DString &n,const DString &ref,const DString &dn)
270{
271 return std::make_unique<FileDefImpl>(p,n,ref,dn);
272}
273
274
275//---------------------------------------------------------------------------
276
277/*! create a new file definition, where \a p is the file path,
278 \a nm the file name, and \a lref is an HTML anchor name if the
279 file was read from a tag file or nullptr otherwise
280*/
282 const DString &lref,const DString &dn)
283 : DefinitionMixin(p+nm,1,1,nm,nullptr,nullptr,!p.empty())
284{
286 m_filePath=p+nm;
287 m_fileName=nm;
288
289 setReference(lref);
290 setDiskNameLocal(!dn.empty() ? dn : nm);
291 m_isSource = EntryType::guessSection(nm).isSource();
292 m_docname = nm;
293 m_dir = nullptr;
294 if (Config_getBool(FULL_PATH_NAMES))
295 {
297 }
299 Config_getBool(FULL_PATH_NAMES) ? m_fileName : DefinitionMixin::name()));
301 m_subGrouping=Config_getBool(SUBGROUPING);
302}
303
304/*! destroy the file definition */
308
310{
311 if (isReference())
312 {
314 m_inclDepFileName = name+"_incl";
315 m_inclByDepFileName = name+"_dep_incl";
316 }
317 else
318 {
322 }
323}
324
329
330/*! Compute the HTML anchor names for all members in the class */
332{
333 MemberList *ml = getMemberList(MemberListType::AllMembersList());
334 if (ml) ml->setAnchors();
335}
336
338{
339 //printf("FileDefImpl::distributeMemberGroupDocumentation()\n");
340 for (const auto &mg : m_memberGroups)
341 {
342 mg->distributeMemberGroupDocumentation();
343 }
344}
345
347{
351 for (const auto &mg : m_memberGroups)
352 {
353 mg->findSectionsInDocumentation(this);
354 }
355
356 for (auto &ml : m_memberLists)
357 {
358 if (ml->listType().isDeclaration())
359 {
360 ml->findSectionsInDocumentation(this);
361 }
362 }
363}
364
366{
367 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
368 bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
369 return ((!briefDescription().empty() && repeatBrief) ||
370 !documentation().stripWhiteSpace().empty() || // avail empty section
371 (sourceBrowser && getStartBodyLine()!=-1 && getBodyDef()) ||
373 );
374}
375
377{
380 tagFile << " <compound kind=\"file\">\n";
381 tagFile << " <name>" << convertToXML(name()) << "</name>\n";
382 tagFile << " <path>" << convertToXML(stripFromPath(getPath())) << "</path>\n";
383 tagFile << " <filename>" << fn << "</filename>\n";
384 for (const auto &ii : m_includeList)
385 {
386 const FileDef *fd=ii.fileDef;
387 if (fd && fd->isLinkable() && !fd->isReference())
388 {
389 DString attr = includeTagFileAttributes(fd->getLanguage(),ii.kind);
390 tagFile << " <includes id=\""
391 << convertToXML(fd->getOutputFileBase()) << "\" "
392 << "name=\"" << convertToXML(fd->name()) << "\" "
393 << attr << ">"
394 << convertToXML(ii.includeName)
395 << "</includes>\n";
396 }
397 }
398 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::File))
399 {
400 switch (lde->kind())
401 {
402 case LayoutDocEntry::FileClasses:
403 {
405 }
406 break;
407 case LayoutDocEntry::FileInterfaces:
408 {
410 }
411 break;
412 case LayoutDocEntry::FileStructs:
413 {
415 }
416 break;
417 case LayoutDocEntry::FileExceptions:
418 {
420 }
421 break;
422 case LayoutDocEntry::FileConcepts:
423 {
424 for (const auto *nd : m_concepts)
425 {
426 if (nd->isLinkableInProject())
427 {
428 tagFile << " <concept>" << convertToXML(nd->name()) << "</concept>\n";
429 }
430 }
431 }
432 break;
433 case LayoutDocEntry::FileNamespaces:
434 {
435 for (const auto *nd : m_namespaces)
436 {
437 if (nd->isLinkableInProject())
438 {
439 tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>\n";
440 }
441 }
442 }
443 break;
444 case LayoutDocEntry::MemberDecl:
445 {
446 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
447 if (lmd)
448 {
449 MemberList * ml = getMemberList(lmd->type);
450 if (ml)
451 {
452 ml->writeTagFile(tagFile,false,false);
453 }
454 }
455 }
456 break;
457 case LayoutDocEntry::MemberGroups:
458 {
459 for (const auto &mg : m_memberGroups)
460 {
461 mg->writeTagFile(tagFile);
462 }
463 }
464 break;
465 default:
466 break;
467 }
468 }
469
471 tagFile << " </compound>\n";
472}
473
475{
477 {
480 ol.writeRuler();
484 ol.writeAnchor(DString(),"details");
486 ol.startGroupHeader("details");
487 ol.parseText(title);
488 ol.endGroupHeader();
489
490 ol.startTextBlock();
491 if (!briefDescription().empty() && Config_getBool(REPEAT_BRIEF))
492 {
494 briefLine(),
495 this,
496 nullptr,
498 DocOptions());
499 }
500 if (!briefDescription().empty() && Config_getBool(REPEAT_BRIEF) &&
501 !documentation().empty())
502 {
506 ol.enableAll();
509 ol.writeString("\n\n");
511 }
512 if (!documentation().empty())
513 {
514 ol.generateDoc(docFile(),
515 docLine(),
516 this,
517 nullptr,
518 documentation()+"\n",
519 DocOptions()
520 .setIndexWords(true));
521 }
522 //printf("Writing source ref for file %s\n",qPrint(name()));
523 if (Config_getBool(SOURCE_BROWSER))
524 {
525 ol.startParagraph("definition");
527 if (size_t fileMarkerPos = refText.find("@0"); fileMarkerPos!=DString::npos) // should always pass this.
528 {
529 ol.parseText(refText.left(fileMarkerPos)); //text left from marker 1
531 ol.parseText(refText.right(
532 refText.length()-fileMarkerPos-2)); // text right from marker 2
533 }
534 else
535 {
536 err("translation error: invalid marker in trDefinedInSourceFile()\n");
537 }
538 ol.endParagraph();
539 }
541 ol.endTextBlock();
542 }
543}
544
546{
548 {
549 auto parser { createDocParser() };
550 auto ast { validatingParseDoc(*parser.get(),
551 briefFile(),
552 briefLine(),
553 this,
554 nullptr,
556 DocOptions()
557 .setIndexWords(true)
558 .setSingleLine(true))
559 };
560 if (!ast->empty())
561 {
562 ol.startParagraph();
565 ol.writeString(" - ");
567 ol.writeDoc(ast.get(),this,nullptr);
570 ol.writeString(" \n");
572
573 if (Config_getBool(REPEAT_BRIEF) ||
574 !documentation().stripWhiteSpace().empty()
575 )
576 {
578 ol.startTextLink(DString(),"details");
580 ol.endTextLink();
581 }
583 ol.endParagraph();
584 }
585 }
586 ol.writeSynopsis();
587}
588
590{
591 for (const auto &cd : list)
592 {
593 if (cd->isLinkableInProject())
594 {
595 tagFile << " <class kind=\"" << cd->compoundTypeString() <<
596 "\">" << convertToXML(cd->name()) << "</class>\n";
597 }
598 }
599}
600
602{
603 if (m_incInfo)
604 {
605 DString nm=m_incInfo->includeName.empty() ?
606 (m_incInfo->fileDef ?
607 m_incInfo->fileDef->docName() : DString()
608 ) :
609 m_incInfo->includeName;
610 if (!nm.empty())
611 {
612 ol.startParagraph();
613 ol.startTypewriter();
614 ol.docify(::includeStatement(SrcLangExt::Cpp,m_incInfo->kind));
615 ol.docify(::includeOpen(SrcLangExt::Cpp,m_incInfo->kind));
618 ol.docify(nm);
621 if (m_incInfo->fileDef)
622 {
623 ol.writeObjectLink(DString(),m_incInfo->fileDef->includeName(),DString(),nm);
624 }
625 else
626 {
627 ol.docify(nm);
628 }
630 ol.docify(::includeClose(SrcLangExt::Cpp,m_incInfo->kind));
631 ol.endTypewriter();
632 ol.endParagraph();
633 }
634 }
635 else if (!m_includeList.empty())
636 {
637 ol.startTextBlock(true);
638 for (const auto &ii : m_includeList)
639 {
640 const FileDef *fd=ii.fileDef;
641 ol.startTypewriter();
642 SrcLangExt lang = fd ? fd->getLanguage() : SrcLangExt::Cpp;
643 ol.docify(::includeStatement(lang,ii.kind));
644 ol.docify(::includeOpen(lang,ii.kind));
646 ol.docify(ii.includeName);
647 ol.enableAll();
649
650 // Here we use the include file name as it appears in the file.
651 // we could also we the name as it is used within doxygen,
652 // then we should have used fd->docName() instead of ii->includeName
653 if (fd && fd->isLinkable())
654 {
657 DString(),ii.includeName);
658 }
659 else
660 {
662 if (ii.kind==IncludeKind::ImportModule && mod && mod->isLinkable())
663 {
665 DString(),ii.includeName);
666 }
667 else
668 {
669 ol.docify(ii.includeName);
670 }
671 }
672
673 ol.enableAll();
674 ol.docify(::includeClose(lang,ii.kind));
675 ol.endTypewriter();
676 ol.lineBreak();
677 }
678 ol.endTextBlock();
679 }
680}
681
683{
684 if (Config_getBool(HAVE_DOT) && m_hasIncludeGraph /*&& Config_getBool(INCLUDE_GRAPH)*/)
685 {
686 //printf("Graph for file %s\n",qPrint(name()));
687 DotInclDepGraph incDepGraph(this,false);
688 if (incDepGraph.isTooBig())
689 {
690 warn_uncond("Include graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
691 qPrint(name()), incDepGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
692 }
693 else if (!incDepGraph.isTrivial())
694 {
695 ol.startTextBlock();
699 ol.endInclDepGraph(incDepGraph);
700 ol.enableAll();
701 ol.endTextBlock(true);
702 }
703 //incDepGraph.writeGraph(Config_getString(HTML_OUTPUT),fd->getOutputFileBase());
704 }
705}
706
708{
709 if (Config_getBool(HAVE_DOT) && m_hasIncludedByGraph /*&& Config_getBool(INCLUDED_BY_GRAPH)*/)
710 {
711 //printf("Graph for file %s\n",qPrint(name()));
712 DotInclDepGraph incDepGraph(this,true);
713 if (incDepGraph.isTooBig())
714 {
715 warn_uncond("Included by graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
716 qPrint(name()), incDepGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
717 }
718 else if (!incDepGraph.isTrivial())
719 {
720 ol.startTextBlock();
724 ol.endInclDepGraph(incDepGraph);
725 ol.enableAll();
726 ol.endTextBlock(true);
727 }
728 //incDepGraph.writeGraph(Config_getString(HTML_OUTPUT),fd->getOutputFileBase());
729 }
730}
731
732
734{
735 //printf("%s: generateSourceFile()=%d\n",qPrint(name()),generateSourceFile());
736 if (generateSourceFile())
737 {
739 ol.startParagraph();
742 ol.endTextLink();
743 ol.endParagraph();
744 ol.enableAll();
745 }
746}
747
749 bool const isConstantGroup)
750{
751 // write list of namespaces
752 m_namespaces.writeDeclaration(ol,title,isConstantGroup);
753}
754
756{
757 // write list of classes
758 list.writeDeclaration(ol,nullptr,title,false);
759}
760
762{
763 // write list of classes
765}
766
768{
769 // temporarily undo the disabling could be done by startMemberDocumentation()
770 // as a result of setting SEPARATE_MEMBER_PAGES to YES; see bug730512
771 bool isEnabled = ol.isEnabled(OutputType::Html);
773
775
776 // restore the initial state if needed
777 if (!isEnabled) ol.disable(OutputType::Html);
778}
779
784
789
791{
792 if (Config_getBool(SEPARATE_MEMBER_PAGES))
793 {
796 }
797}
798
800{
801 if (Config_getBool(SEPARATE_MEMBER_PAGES))
802 {
805 }
806}
807
809{
810 /* write user defined member groups */
811 for (const auto &mg : m_memberGroups)
812 {
813 if (!mg->allMembersInSameSection() || !m_subGrouping)
814 {
815 mg->writeDeclarations(ol,nullptr,nullptr,this,nullptr,nullptr);
816 }
817 }
818}
819
821{
822 // write Author section (Man only)
825 ol.startGroupHeader();
826 ol.parseText(theTranslator->trAuthor(true,true));
827 ol.endGroupHeader();
830}
831
833{
836 bool first=true;
837 SrcLangExt lang=getLanguage();
838 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::File))
839 {
840 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
841 if (lde->kind()==LayoutDocEntry::FileClasses && m_classes.declVisible() && ls)
842 {
843 DString label = "nested-classes";
844 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
845 first=false;
846 }
847 else if (lde->kind()==LayoutDocEntry::FileInterfaces && m_interfaces.declVisible() && ls)
848 {
849 DString label = "interfaces";
850 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
851 first=false;
852 }
853 else if (lde->kind()==LayoutDocEntry::FileStructs && m_structs.declVisible() && ls)
854 {
855 DString label = "structs";
856 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
857 first=false;
858 }
859 else if (lde->kind()==LayoutDocEntry::FileExceptions && m_exceptions.declVisible() && ls)
860 {
861 DString label = "exceptions";
862 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
863 first=false;
864 }
865 else if (lde->kind()==LayoutDocEntry::FileNamespaces && m_namespaces.declVisible(false) && ls)
866 {
867 DString label = "namespaces";
868 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
869 first=false;
870 }
871 else if (lde->kind()==LayoutDocEntry::FileConcepts && m_concepts.declVisible() && ls)
872 {
873 DString label = "concepts";
874 ol.writeSummaryLink(DString(),label,ls->title(lang),first);
875 first=false;
876 }
877 else if (lde->kind()==LayoutDocEntry::MemberDecl)
878 {
879 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
880 if (lmd)
881 {
882 MemberList * ml = getMemberList(lmd->type);
883 if (ml && ml->declVisible())
884 {
885 ol.writeSummaryLink(DString(),ml->listType().toLabel(),lmd->title(lang),first);
886 first=false;
887 }
888 }
889 }
890 }
891 if (!first)
892 {
893 ol.writeString(" </div>\n");
894 }
896}
897
902
903/*! Write the documentation page for this file to the file of output
904 generators \a ol.
905*/
907{
908 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
909 //funcList->countDecMembers();
910
911 //DString fn = name();
912 //if (Config_getBool(FULL_PATH_NAMES))
913 //{
914 // fn.prepend(stripFromPath(getPath()));
915 //}
916
917 //printf("WriteDocumentation diskname=%s\n",qPrint(diskname));
918
919 DString versionTitle;
920 if (!m_fileVersion.empty())
921 {
922 versionTitle=" ("+m_fileVersion+")";
923 }
924 DString title = m_docname+versionTitle;
925 DString pageTitle;
926 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
927 {
928 pageTitle=m_docname;
929 }
930 else
931 {
933 }
934
935 if (getDirDef())
936 {
937 startFile(ol,getOutputFileBase(),false,name(),pageTitle,HighlightedItem::FileVisible,!generateTreeView);
938 if (!generateTreeView)
939 {
941 ol.endQuickIndices();
942 }
943 startTitle(ol,getOutputFileBase(),this);
946 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
947 {
948 ol.parseText(displayName()); // Html only
949 }
950 else
951 {
953 }
954 ol.enableAll();
956 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
957 {
958 ol.parseText(Config_getBool(FULL_PATH_NAMES) ? // other output formats
959 pageTitle :
960 name());
961 }
962 else
963 {
964 ol.parseText(Config_getBool(FULL_PATH_NAMES) ? // other output formats
965 pageTitle :
967 }
969 addGroupListToTitle(ol,this);
971 }
972 else
973 {
974 startFile(ol,getOutputFileBase(),false,name(),pageTitle,HighlightedItem::FileVisible,!generateTreeView);
975 if (!generateTreeView)
976 {
977 ol.endQuickIndices();
978 }
979 startTitle(ol,getOutputFileBase(),this);
980 ol.parseText(pageTitle);
981 addGroupListToTitle(ol,this);
983 }
984
985 ol.startContents();
986
987 if (!m_fileVersion.empty())
988 {
991 ol.docify(versionTitle);
992 ol.endProjectNumber();
993 ol.enableAll();
994 }
995
996 //---------------------------------------- start flexible part -------------------------------
997
998 SrcLangExt lang = getLanguage();
999 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::File))
1000 {
1001 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1002 switch (lde->kind())
1003 {
1004 case LayoutDocEntry::BriefDesc:
1006 break;
1007 case LayoutDocEntry::MemberDeclStart:
1009 break;
1010 case LayoutDocEntry::Includes:
1012 break;
1013 case LayoutDocEntry::FileIncludeGraph:
1015 break;
1016 case LayoutDocEntry::FileIncludedByGraph:
1018 break;
1019 case LayoutDocEntry::FileSourceLink:
1020 writeSourceLink(ol);
1021 break;
1022 case LayoutDocEntry::FileClasses:
1023 if (ls) writeClassDeclarations(ol,ls->title(lang),m_classes);
1024 break;
1025 case LayoutDocEntry::FileInterfaces:
1026 if (ls) writeClassDeclarations(ol,ls->title(lang),m_interfaces);
1027 break;
1028 case LayoutDocEntry::FileStructs:
1029 if (ls) writeClassDeclarations(ol,ls->title(lang),m_structs);
1030 break;
1031 case LayoutDocEntry::FileExceptions:
1032 if (ls) writeClassDeclarations(ol,ls->title(lang),m_exceptions);
1033 break;
1034 case LayoutDocEntry::FileConcepts:
1035 if (ls) writeConcepts(ol,ls->title(lang));
1036 break;
1037 case LayoutDocEntry::FileNamespaces:
1038 if (ls) writeNamespaceDeclarations(ol,ls->title(lang),false);
1039 break;
1040 case LayoutDocEntry::FileConstantGroups:
1041 if (ls) writeNamespaceDeclarations(ol,ls->title(lang),true);
1042 break;
1043 case LayoutDocEntry::MemberGroups:
1045 break;
1046 case LayoutDocEntry::MemberDecl:
1047 {
1048 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1049 if (lmd) writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
1050 }
1051 break;
1052 case LayoutDocEntry::MemberDeclEnd:
1054 break;
1055 case LayoutDocEntry::DetailedDesc:
1056 if (ls) writeDetailedDescription(ol,ls->title(lang));
1057 break;
1058 case LayoutDocEntry::MemberDefStart:
1060 break;
1061 case LayoutDocEntry::FileInlineClasses:
1063 break;
1064 case LayoutDocEntry::MemberDef:
1065 {
1066 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
1067 if (lmd) writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
1068 }
1069 break;
1070 case LayoutDocEntry::MemberDefEnd:
1072 break;
1073 case LayoutDocEntry::AuthorSection:
1075 break;
1076 case LayoutDocEntry::ClassInheritanceGraph:
1077 case LayoutDocEntry::ClassNestedClasses:
1078 case LayoutDocEntry::ClassCollaborationGraph:
1079 case LayoutDocEntry::ClassAllMembersLink:
1080 case LayoutDocEntry::ClassUsedFiles:
1081 case LayoutDocEntry::ClassInlineClasses:
1082 case LayoutDocEntry::NamespaceNestedNamespaces:
1083 case LayoutDocEntry::NamespaceNestedConstantGroups:
1084 case LayoutDocEntry::NamespaceClasses:
1085 case LayoutDocEntry::NamespaceConcepts:
1086 case LayoutDocEntry::NamespaceInterfaces:
1087 case LayoutDocEntry::NamespaceStructs:
1088 case LayoutDocEntry::NamespaceExceptions:
1089 case LayoutDocEntry::NamespaceInlineClasses:
1090 case LayoutDocEntry::ConceptDefinition:
1091 case LayoutDocEntry::GroupClasses:
1092 case LayoutDocEntry::GroupConcepts:
1093 case LayoutDocEntry::GroupModules:
1094 case LayoutDocEntry::GroupInlineClasses:
1095 case LayoutDocEntry::GroupNamespaces:
1096 case LayoutDocEntry::GroupDirs:
1097 case LayoutDocEntry::GroupNestedGroups:
1098 case LayoutDocEntry::GroupFiles:
1099 case LayoutDocEntry::GroupGraph:
1100 case LayoutDocEntry::GroupPageDocs:
1101 case LayoutDocEntry::ModuleExports:
1102 case LayoutDocEntry::ModuleClasses:
1103 case LayoutDocEntry::ModuleConcepts:
1104 case LayoutDocEntry::ModuleUsedFiles:
1105 case LayoutDocEntry::DirSubDirs:
1106 case LayoutDocEntry::DirFiles:
1107 case LayoutDocEntry::DirGraph:
1108 err("Internal inconsistency: member '{}' should not be part of "
1109 "LayoutDocManager::File entry list\n",lde->entryToString());
1110 break;
1111 }
1112 }
1113
1114 //---------------------------------------- end flexible part -------------------------------
1115
1116 ol.endContents();
1117
1118 endFileWithNavPath(ol,this);
1119
1120 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1121 {
1122 MemberList *ml = getMemberList(MemberListType::AllMembersList());
1123 if (ml) ml->sort();
1124 writeMemberPages(ol);
1125 }
1126}
1127
1129{
1130 ol.pushGeneratorState();
1132
1133 for (const auto &ml : m_memberLists)
1134 {
1135 if (ml->listType().isDocumentation())
1136 {
1137 ml->writeDocumentationPage(ol,name(),this);
1138 }
1139 }
1140
1141 ol.popGeneratorState();
1142}
1143
1145{
1146 bool createSubDirs=Config_getBool(CREATE_SUBDIRS);
1147
1148 ol.writeString(" <div class=\"navtab\">\n");
1149 ol.writeString(" <table>\n");
1150
1151 MemberList *allMemberList = getMemberList(MemberListType::AllMembersList());
1152 if (allMemberList)
1153 {
1154 for (const auto &md : *allMemberList)
1155 {
1156 if (md->getFileDef()==this && md->getNamespaceDef()==nullptr && md->isLinkable() && !md->isEnumValue())
1157 {
1158 if (md->isLinkableInProject())
1159 {
1160 DString fn=md->getOutputFileBase();
1162 if (md==currentMd) // selected item => highlight
1163 {
1164 ol.writeString(" <tr><td class=\"navtabHL\">");
1165 }
1166 else
1167 {
1168 ol.writeString(" <tr><td class=\"navtab\">");
1169 }
1170 ol.writeString("<span class=\"label\"><a ");
1171 ol.writeString("href=\"");
1172 if (createSubDirs) ol.writeString("../../");
1173 ol.writeString(fn+"#"+md->anchor());
1174 ol.writeString("\">");
1175 ol.writeString(convertToHtml(md->localName()));
1176 ol.writeString("</a></span>");
1177 ol.writeString("</td></tr>\n");
1178 }
1179 }
1180 }
1181 }
1182
1183 ol.writeString(" </table>\n");
1184 ol.writeString(" </div>\n");
1185}
1186
1187/*! Write a source listing of this file to the output */
1189{
1190 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
1192 if (!m_fileVersion.empty())
1193 {
1194 title+=" ("+m_fileVersion+")";
1195 }
1198
1199 bool isDocFile = isDocumentationFile();
1200 bool genSourceFile = !isDocFile && generateSourceFile();
1201 if (getDirDef())
1202 {
1204 !generateTreeView,
1205 !isDocFile && genSourceFile ? DString() : getOutputFileBase(),
1206 0);
1207 if (!generateTreeView)
1208 {
1210 ol.endQuickIndices();
1211 }
1213 ol.parseText(name());
1215 }
1216 else
1217 {
1219 !isDocFile && genSourceFile ? DString() : getOutputFileBase(),
1220 0);
1222 ol.parseText(title);
1224 }
1225
1226 ol.startContents();
1227
1228 if (isLinkable())
1229 {
1232 ol.endTextLink();
1233
1234 ol.pushGeneratorState();
1236 ol.writeString("\\par\n");
1237 ol.popGeneratorState();
1238 }
1239}
1240
1241void FileDefImpl::writeSourceBody(OutputList &ol,[[maybe_unused]] ClangTUParser *clangParser)
1242{
1243 bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
1244 OutputCodeList devNullList;
1245 devNullList.add<DevNullCodeGenerator>();
1246#if USE_LIBCLANG
1247 if (Doxygen::clangAssistedParsing && clangParser &&
1248 (getLanguage()==SrcLangExt::Cpp || getLanguage()==SrcLangExt::ObjC))
1249 {
1250 auto &codeOL = ol.codeGenerators();
1251 codeOL.startCodeFragment("DoxyCode");
1252 clangParser->switchToFile(this);
1253 clangParser->writeSources(codeOL,this);
1254 codeOL.endCodeFragment("DoxyCode");
1255 }
1256 else
1257#endif
1258 {
1260 intf->resetCodeParserState();
1261 auto &codeOL = ol.codeGenerators();
1262 codeOL.startCodeFragment("DoxyCode");
1263 bool needs2PassParsing =
1264 Doxygen::parseSourcesNeeded && // we need to parse (filtered) sources for cross-references
1265 !filterSourceFiles && // but user wants to show sources as-is
1266 !getFileFilter(absFilePath(),true).empty(); // and there is a filter used while parsing
1267
1268 if (needs2PassParsing)
1269 {
1270 // parse code for cross-references only (see bug707641)
1271 intf->parseCode(devNullList,DString(),
1272 fileToString(absFilePath(),true,true),
1273 getLanguage(),
1274 Config_getBool(STRIP_CODE_COMMENTS),
1276 .setFileDef(this)
1277 );
1278 }
1279 size_t indent = 0;
1280 intf->parseCode(codeOL,DString(),
1281 detab(fileToString(absFilePath(),filterSourceFiles,true),indent),
1282 getLanguage(), // lang
1283 Config_getBool(STRIP_CODE_COMMENTS),
1285 .setFileDef(this)
1286 .setCollectXRefs(!needs2PassParsing)
1287 );
1288 codeOL.endCodeFragment("DoxyCode");
1289 }
1290}
1291
1293{
1294 ol.endContents();
1295 endFileWithNavPath(ol,this,false);
1296 ol.enableAll();
1297}
1298
1299void FileDefImpl::parseSource([[maybe_unused]] ClangTUParser *clangParser)
1300{
1301 bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
1302 OutputCodeList devNullList;
1303 devNullList.add<DevNullCodeGenerator>();
1304#if USE_LIBCLANG
1305 if (Doxygen::clangAssistedParsing && clangParser &&
1306 (getLanguage()==SrcLangExt::Cpp || getLanguage()==SrcLangExt::ObjC))
1307 {
1308 clangParser->switchToFile(this);
1309 clangParser->writeSources(devNullList,this);
1310 }
1311 else
1312#endif
1313 {
1315 intf->resetCodeParserState();
1316 size_t indent = 0;
1317 intf->parseCode(
1318 devNullList,DString(),
1319 detab(fileToString(absFilePath(),filterSourceFiles,true),indent),
1320 getLanguage(),
1321 Config_getBool(STRIP_CODE_COMMENTS),
1323 .setFileDef(this)
1324 );
1325 }
1326}
1327
1329{
1330 for (auto &ml : m_memberLists)
1331 {
1332 if (ml->listType().isDeclaration())
1333 {
1335 }
1336 }
1337
1338 // add members inside sections to their groups
1339 for (const auto &mg : m_memberGroups)
1340 {
1341 if (mg->allMembersInSameSection() && m_subGrouping)
1342 {
1343 //printf("----> addToDeclarationSection(%s)\n",qPrint(mg->header()));
1344 mg->addToDeclarationSection();
1345 }
1346 }
1347}
1348
1349/*! Adds member definition \a md to the list of all members of this file */
1351{
1352 if (md->isHidden()) return;
1353 MemberList *allMemberList = getMemberList(MemberListType::AllMembersList());
1354 //printf("%s:FileDefImpl::insertMember(%s (=%p) list has %zu elements)\n",
1355 // qPrint(name()),qPrint(md->name()),(void*)md,allMemberList ? allMemberList->size() : 0);
1356 if (allMemberList && allMemberList->contains(md))
1357 {
1358 //printf("already added\n");
1359 return;
1360 }
1361
1362 if (allMemberList==nullptr)
1363 {
1364 m_memberLists.emplace_back(std::make_unique<MemberList>(MemberListType::AllMembersList(),MemberListContainer::File));
1365 allMemberList = m_memberLists.back().get();
1366 }
1367 allMemberList->push_back(md);
1368 switch (md->memberType())
1369 {
1370 case MemberType::Property:
1371 if (md->getLanguage() == SrcLangExt::Python)
1372 {
1373 addMemberToList(MemberListType::PropertyMembers(),md);
1374 addMemberToList(MemberListType::Properties(),md);
1375 break;
1376 }
1377 // fallthrough, explicitly no break here
1378 case MemberType::Variable:
1379 addMemberToList(MemberListType::DecVarMembers(),md);
1380 addMemberToList(MemberListType::DocVarMembers(),md);
1381 break;
1382 case MemberType::Function:
1383 addMemberToList(MemberListType::DecFuncMembers(),md);
1384 addMemberToList(MemberListType::DocFuncMembers(),md);
1385 break;
1386 case MemberType::Typedef:
1387 addMemberToList(MemberListType::DecTypedefMembers(),md);
1388 addMemberToList(MemberListType::DocTypedefMembers(),md);
1389 break;
1390 case MemberType::Sequence:
1391 addMemberToList(MemberListType::DecSequenceMembers(),md);
1392 addMemberToList(MemberListType::DocSequenceMembers(),md);
1393 break;
1394 case MemberType::Dictionary:
1395 addMemberToList(MemberListType::DecDictionaryMembers(),md);
1396 addMemberToList(MemberListType::DocDictionaryMembers(),md);
1397 break;
1398 case MemberType::Enumeration:
1399 addMemberToList(MemberListType::DecEnumMembers(),md);
1400 addMemberToList(MemberListType::DocEnumMembers(),md);
1401 break;
1402 case MemberType::EnumValue: // enum values are shown inside their enums
1403 break;
1404 case MemberType::Define:
1405 addMemberToList(MemberListType::DecDefineMembers(),md);
1406 addMemberToList(MemberListType::DocDefineMembers(),md);
1407 break;
1408 default:
1409 err("FileDefImpl::insertMembers(): "
1410 "member '{}' with class scope '{}' inserted in file scope '{}'!\n",
1411 md->name(),
1412 md->getClassDef() ? md->getClassDef()->name() : "<global>",
1413 name());
1414 }
1415 //addMemberToGroup(md,groupId);
1416}
1417
1419{
1420 MemberList *ml = getMemberList(lt);
1421 if (ml) ml->remove(md);
1422}
1423
1425{
1426 removeMemberFromList(MemberListType::AllMembersList(),md);
1427 switch(md->memberType())
1428 {
1429 case MemberType::Property:
1430 if (md->getLanguage() == SrcLangExt::Python)
1431 {
1432 removeMemberFromList(MemberListType::PropertyMembers(),md);
1433 removeMemberFromList(MemberListType::Properties(),md);
1434 break;
1435 }
1436 // fallthrough, explicitly no break here
1437 case MemberType::Variable:
1438 removeMemberFromList(MemberListType::DecVarMembers(),md);
1439 removeMemberFromList(MemberListType::DocVarMembers(),md);
1440 break;
1441 case MemberType::Function:
1442 removeMemberFromList(MemberListType::DecFuncMembers(),md);
1443 removeMemberFromList(MemberListType::DocFuncMembers(),md);
1444 break;
1445 case MemberType::Typedef:
1446 removeMemberFromList(MemberListType::DecTypedefMembers(),md);
1447 removeMemberFromList(MemberListType::DocTypedefMembers(),md);
1448 break;
1449 case MemberType::Sequence:
1450 removeMemberFromList(MemberListType::DecSequenceMembers(),md);
1451 removeMemberFromList(MemberListType::DocSequenceMembers(),md);
1452 break;
1453 case MemberType::Dictionary:
1454 removeMemberFromList(MemberListType::DecDictionaryMembers(),md);
1455 removeMemberFromList(MemberListType::DocDictionaryMembers(),md);
1456 break;
1457 case MemberType::Enumeration:
1458 removeMemberFromList(MemberListType::DecEnumMembers(),md);
1459 removeMemberFromList(MemberListType::DocEnumMembers(),md);
1460 break;
1461 case MemberType::EnumValue: // enum values are shown inside their enums
1462 break;
1463 case MemberType::Define:
1464 removeMemberFromList(MemberListType::DecDefineMembers(),md);
1465 removeMemberFromList(MemberListType::DocDefineMembers(),md);
1466 break;
1467 default:
1468 err("FileDefImpl::removeMember(): unexpected member remove in file!\n");
1469 }
1470}
1471
1472/*! Adds compound definition \a cd to the list of all compounds of this file */
1474{
1475 if (cd->isHidden()) return;
1476
1478
1479 if (Config_getBool(OPTIMIZE_OUTPUT_SLICE))
1480 {
1482 {
1483 list = &m_interfaces;
1484 }
1485 else if (cd->compoundType()==ClassDef::Struct)
1486 {
1487 list = &m_structs;
1488 }
1489 else if (cd->compoundType()==ClassDef::Exception)
1490 {
1491 list = &m_exceptions;
1492 }
1493 }
1494
1495 list->add(cd->name(),cd);
1496}
1497
1499{
1500 if (cd->isHidden()) return;
1501 m_concepts.add(cd->name(),cd);
1502}
1503
1504/*! Adds namespace definition \a nd to the list of all compounds of this file */
1506{
1507 if (nd->isHidden()) return;
1508 m_namespaces.add(nd->name(),nd);
1509}
1510
1512{
1513 if (Config_getBool(FULL_PATH_NAMES))
1514 return m_fileName;
1515 else
1516 return DefinitionMixin::name();
1517}
1518
1519void FileDefImpl::addSourceRef(int line,const Definition *d,const MemberDef *md)
1520{
1521 //printf("FileDefImpl::addSourceRef(%d,%s,%s)\n",line,qPrint(d?d->name():"nullptr"),qPrint(md?md->name():"nullptr"));
1522 if (d)
1523 {
1524 m_srcDefMap.emplace(line,d);
1525 if (md) m_srcMemberMap.emplace(line,md);
1526 //printf("Adding member %s with anchor %s at line %d to file %s\n",
1527 // md?qPrint(md->name()):"<none>",md?qPrint(md->anchor()):"<none>",line,qPrint(name()));
1528 }
1529}
1530
1532{
1533 auto it = m_srcDefMap.find(lineNr);
1534 //printf("%s::getSourceDefinition(%d)=%s\n",qPrint(name()),lineNr,it!=m_srcDefMap.end()?qPrint(it->second->name()):"none");
1535 return it!=m_srcDefMap.end() ? it->second : nullptr;
1536}
1537
1539{
1540 auto it = m_srcMemberMap.find(lineNr);
1541 //printf("%s::getSourceMember(%d)=%s\n",qPrint(name()),lineNr,it!=m_srcMemberMap.end()?qPrint(it->second->name()):"none");
1542 return it!=m_srcMemberMap.end() ? it->second : nullptr;
1543}
1544
1545
1547{
1549 //printf("%p: FileDefImpl::addUsingDirective: %s:%d\n",this,qPrint(name()),usingDirList->count());
1550}
1551
1553{
1554 //printf("%p: FileDefImpl::getUsedNamespace: %s:%d\n",this,qPrint(name()),usingDirList?usingDirList->count():0);
1555 return m_usingDirList;
1556}
1557
1562
1564 const DString &includeName,bool local, bool force)
1565{
1566 //printf("FileDefImpl::setIncludeFile(%p,%s,%d,%d)\n",fd,includeName,local,force);
1567 if (!m_incInfo) m_incInfo = std::make_unique<IncludeInfo>();
1568 if ((!includeName.empty() && m_incInfo->includeName.empty()) ||
1569 (fd!=nullptr && m_incInfo->fileDef==nullptr)
1570 )
1571 {
1572 //printf("Setting file info\n");
1573 m_incInfo->fileDef = fd;
1574 m_incInfo->includeName = includeName;
1576 }
1577 if (force && !includeName.empty())
1578 {
1579 m_incInfo->includeName = includeName;
1581 }
1582}
1583
1585{
1586 //printf("FileDefImpl::addIncludeDependency(%p,%s,%d)\n",(void*)fd,qPrint(incName),kind);
1587 DString iName = fd ? fd->absFilePath() : incName;
1588 if (!iName.empty() && m_includeMap.find(iName.str())==m_includeMap.end())
1589 {
1590 m_includeList.emplace_back(fd,incName,kind);
1591 m_includeMap.emplace(iName.str(),&m_includeList.back());
1592 }
1593}
1594
1596{
1597 if (visitedFiles.find(this)!=visitedFiles.end()) return; // file already processed
1598 visitedFiles.insert(this);
1599 //printf("( FileDefImpl::addIncludedUsingDirectives for file %s\n",qPrint(name()));
1600
1601 if (!m_includeList.empty()) // file contains #includes
1602 {
1603 {
1604 for (const auto &ii : m_includeList) // foreach #include...
1605 {
1606 if (ii.fileDef) // ...that is a known file
1607 {
1608 // recurse into this file
1609 const_cast<FileDef*>(ii.fileDef)->addIncludedUsingDirectives(visitedFiles);
1610 }
1611 }
1612 }
1613 {
1614 // iterate through list from last to first
1615 for (auto ii_it = m_includeList.rbegin(); ii_it!=m_includeList.rend(); ++ii_it)
1616 {
1617 auto &ii = *ii_it;
1618 if (ii.fileDef && ii.fileDef!=this)
1619 {
1620 // add using directives
1621 auto unl = ii.fileDef->getUsedNamespaces();
1622 for (auto it = unl.rbegin(); it!=unl.rend(); ++it)
1623 {
1624 auto *nd = *it;
1625 //printf(" adding using directive for %s\n",qPrint(nd->qualifiedName()));
1626 m_usingDirList.prepend(nd->qualifiedName(),nd);
1627 }
1628 // add using declarations
1629 auto udl = ii.fileDef->getUsedDefinitions();
1630 for (auto it = udl.rbegin(); it!=udl.rend(); ++it)
1631 {
1632 auto *d = *it;
1633 m_usingDeclList.prepend(d->qualifiedName(),d);
1634 }
1635 }
1636 }
1637 }
1638 }
1639 //printf(") end FileDefImpl::addIncludedUsingDirectives for file %s\n",qPrint(name()));
1640}
1641
1642
1644{
1645 //printf("FileDefImpl::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
1646 DString iName = fd ? fd->absFilePath() : incName;
1647 if (!iName.empty() && m_includedByMap.find(iName.str())==m_includedByMap.end())
1648 {
1649 m_includedByList.emplace_back(fd,incName,kind);
1650 m_includedByMap.emplace(iName.str(),&m_includedByList.back());
1651 }
1652}
1653
1655{
1656 if (name.empty()) return false;
1657 return m_includeMap.find(name.str())!=m_includeMap.end();
1658}
1659
1661{
1662 bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
1663 bool verbatimHeaders = Config_getBool(VERBATIM_HEADERS);
1664 return !isReference() &&
1665 (sourceBrowser ||
1666 (verbatimHeaders && (EntryType::guessSection(name()).isHeader() || !m_includedByMap.empty()))
1667 ) &&
1669}
1670
1671
1673{
1676 theTranslator->trFile(true,true),
1678 DString(),
1679 nullptr
1680 );
1681 for (const auto &mg : m_memberGroups)
1682 {
1683 mg->addListReferences(this);
1684 }
1685 for (auto &ml : m_memberLists)
1686 {
1687 if (ml->listType().isDocumentation())
1688 {
1689 ml->addListReferences(this);
1690 }
1691 }
1692}
1693
1695{
1697 for (const auto &mg : m_memberGroups)
1698 {
1699 mg->addRequirementReferences(this);
1700 }
1701 for (auto &ml : m_memberLists)
1702 {
1703 if (ml->listType().isDocumentation())
1704 {
1705 ml->addRequirementReferences(this);
1706 }
1707 }
1708}
1709
1710//-------------------------------------------------------------------
1711
1713{
1715 NamespaceDefSet visitedNamespaces;
1716 for (auto &nd : usingDirList)
1717 {
1719 if (ndm)
1720 {
1721 ndm->combineUsingRelations(visitedNamespaces);
1722 }
1723 }
1724
1725 for (auto &nd : usingDirList)
1726 {
1727 // add used namespaces of namespace nd to this namespace
1728 for (const auto &und : nd->getUsedNamespaces())
1729 {
1730 addUsingDirective(und);
1731 }
1732 // add used classes of namespace nd to this namespace
1733 for (const auto &ud : nd->getUsedDefinitions())
1734 {
1736 }
1737 }
1738}
1739
1741{
1742 static const std::unordered_set<std::string> docExtensions =
1743 { "doc", "txt", "dox", "md", "markdown" };
1744
1745 size_t lastDot = name().rfind('.');
1746 return (lastDot!=DString::npos &&
1747 docExtensions.find(name().mid(lastDot+1).str())!=docExtensions.end()) ||
1748 getLanguageFromFileName(getFileNameExtension(name())) == SrcLangExt::Markdown;
1749}
1750
1752{
1753 DString vercmd = Config_getString(FILE_VERSION_FILTER);
1754 if (!vercmd.empty() && !m_filePath.empty() && !isReference() &&
1755 m_filePath!="generated" && m_filePath!="graph_legend.dox")
1756 {
1757 msg("Version of {} : ",m_filePath);
1758 DString cmd = vercmd+" \""+m_filePath+"\"";
1759 Debug::print(Debug::ExtCmd,0,"Executing popen(`{}`)\n",cmd);
1760 FILE *f=Portable::popen(cmd,"r");
1761 if (!f)
1762 {
1763 err("could not execute {}\n",vercmd);
1764 return;
1765 }
1766 const int bufSize=1024;
1767 char buf[bufSize];
1768 int numRead = static_cast<int>(fread(buf,1,bufSize-1,f));
1770 if (numRead>0 && numRead<bufSize)
1771 {
1772 buf[numRead]='\0';
1773 m_fileVersion=DString(buf,numRead).stripWhiteSpace();
1774 if (!m_fileVersion.empty())
1775 {
1776 msg("{}\n",m_fileVersion);
1777 return;
1778 }
1779 }
1780 msg("no version available\n");
1781 }
1782}
1783
1784
1786{
1787 if (Htags::useHtags)
1788 {
1790 }
1791 else
1792 {
1793 return m_outputDiskName+"_source";
1794 }
1795}
1796
1801
1802/*! Returns the name of the verbatim copy of this file (if any). */
1804{
1805 return getSourceFileBase();
1806}
1807
1809{
1810 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
1811 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
1812 const auto &ml = m_memberLists.get(lt,MemberListContainer::File);
1813 ml->setNeedsSorting(
1814 (ml->listType().isDeclaration() && sortBriefDocs) ||
1815 (ml->listType().isDocumentation() && sortMemberDocs));
1816 ml->push_back(md);
1817 if (ml->listType().isDeclaration())
1818 {
1820 if (mdm)
1821 {
1822 mdm->setSectionList(this,ml.get());
1823 }
1824 }
1825}
1826
1828{
1829 for (auto &ml : m_memberLists)
1830 {
1831 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(false); }
1832 }
1833
1834 for (const auto &mg : m_memberGroups)
1835 {
1836 MemberList &mlg = const_cast<MemberList&>(mg->members());
1837 if (mlg.needsSorting()) { mlg.sort(); mlg.setNeedsSorting(false); }
1838 }
1839
1840 std::stable_sort(m_includedByList.begin(),m_includedByList.end(),
1841 [](const auto &fi1,const auto &fi2) { return fi1.includeName < fi2.includeName; });
1842
1843 if (Config_getBool(SORT_BRIEF_DOCS))
1844 {
1845 auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
1846 {
1847 return Config_getBool(SORT_BY_SCOPE_NAME) ?
1848 dstricmp_sort(c1->displayName(), c2->displayName())<0 :
1849 dstricmp_sort(c1->className(), c2->className())<0;
1850 };
1851
1852 std::stable_sort(m_classes.begin(), m_classes.end(), classComp);
1853 std::stable_sort(m_interfaces.begin(),m_interfaces.end(),classComp);
1854 std::stable_sort(m_structs.begin(), m_structs.end(), classComp);
1855 std::stable_sort(m_exceptions.begin(),m_exceptions.end(),classComp);
1856
1857 auto conceptComp = [](const ConceptLinkedRefMap::Ptr &c1,const ConceptLinkedRefMap::Ptr &c2)
1858 {
1859 return dstricmp_sort(c1->name(),c2->name())<0;
1860 };
1861
1862 std::stable_sort(m_concepts.begin(), m_concepts.end(), conceptComp);
1863
1864 auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
1865 {
1866 return dstricmp_sort(n1->name(),n2->name())<0;
1867 };
1868
1869 std::stable_sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
1870 }
1871}
1872
1874{
1875 for (auto &ml : m_memberLists)
1876 {
1877 if (ml->listType()==lt)
1878 {
1879 return ml.get();
1880 }
1881 }
1882 return nullptr;
1883}
1884
1886{
1887 bool optVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1888 MemberList * ml = getMemberList(lt);
1889 if (ml)
1890 {
1891 if (optVhdl) // use specific declarations function
1892 {
1893
1894 VhdlDocGen::writeVhdlDeclarations(ml,ol,nullptr,nullptr,this,nullptr,nullptr);
1895 }
1896 else
1897 {
1898 ml->writeDeclarations(ol,nullptr,nullptr,this,nullptr,nullptr,title,DString());
1899 }
1900 }
1901}
1902
1904{
1905 MemberList * ml = getMemberList(lt);
1906 if (ml) ml->writeDocumentation(ol,name(),this,title,ml->listType().toLabel());
1907}
1908
1910{
1911 bool showFiles = Config_getBool(SHOW_FILES);
1912 return hasDocumentation() && !isReference() && (showFiles || isLinkableViaGroup());
1913}
1914
1916 StringUnorderedSet &filesVisited,const FileDef *fd,StringVector &incFiles)
1917{
1918 for (const auto &ii : fd->includeFileList())
1919 {
1920 if (ii.fileDef && !ii.fileDef->isReference() &&
1921 filesVisited.find(ii.fileDef->absFilePath().str())==filesVisited.end())
1922 {
1923 //printf("FileDefImpl::addIncludeDependency(%s)\n",qPrint(ii->fileDef->absFilePath()));
1924 incFiles.push_back(ii.fileDef->absFilePath().str());
1925 filesVisited.insert(ii.fileDef->absFilePath().str());
1926 getAllIncludeFilesRecursively(filesVisited,ii.fileDef,incFiles);
1927 }
1928 }
1929}
1930
1932{
1933 StringUnorderedSet includes;
1934 ::getAllIncludeFilesRecursively(includes,this,incFiles);
1935}
1936
1938{
1939 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
1940 {
1941 return name();
1942 }
1943 else
1944 {
1946 }
1947}
1948
1950{
1951 return m_fileVersion;
1952}
1953
1958
1963
1965{
1966 for (auto &ml : m_memberLists)
1967 {
1968 ml->countDecMembers();
1969 ml->countDocMembers();
1970 }
1971 for (const auto &mg : m_memberGroups)
1972 {
1973 mg->countDecMembers();
1974 mg->countDocMembers();
1975 }
1976}
1977
1979{
1980 MemberList *ml = getMemberList(MemberListType::AllMembersList());
1981 return ml ? ml->numDocMembers() : 0;
1982}
1983
1985{
1986 MemberList *ml = getMemberList(MemberListType::AllMembersList());
1987 return ml ? ml->numDecMembers() : 0;
1988}
1989
1994
1999
2001{
2002 return m_hasIncludeGraph;
2003}
2004
2006{
2007 return m_hasIncludedByGraph;
2008}
2009
2010bool FileDefImpl::visibleInIndex(bool &genSourceFile) const
2011{
2012 bool allExternals = Config_getBool(ALLEXTERNALS);
2013 bool isDocFile = isDocumentationFile();
2014 genSourceFile = !isDocFile && generateSourceFile();
2015 return ((allExternals && isLinkable()) || isLinkableInProject()) && !isDocFile;
2016}
2017
2018// -----------------------
2019
2020bool compareFileDefs(const FileDef *fd1, const FileDef *fd2)
2021{
2022 return dstricmp_sort(fd1->name(),fd2->name()) < 0;
2023}
2024
2025// --- Cast functions
2026
2028{
2029 if (d==nullptr) return nullptr;
2030 if (d && typeid(*d)==typeid(FileDefImpl))
2031 {
2032 return static_cast<FileDef*>(d);
2033 }
2034 else
2035 {
2036 return nullptr;
2037 }
2038}
2039
2041{
2042 if (d==nullptr) return nullptr;
2043 if (d && typeid(*d)==typeid(FileDefImpl))
2044 {
2045 return static_cast<const FileDef*>(d);
2046 }
2047 else
2048 {
2049 return nullptr;
2050 }
2051}
2052
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:1643
bool isDocumentationFile() const override
Definition filedef.cpp:1740
void findSectionsInDocumentation() override
Definition filedef.cpp:346
DString m_inclByDepFileName
Definition filedef.cpp:246
void setModuleDef(ModuleDef *mod) override
Definition filedef.cpp:187
void addIncludedUsingDirectives(FileDefSet &visitedFiles) override
Definition filedef.cpp:1595
void writeBriefDescription(OutputList &ol)
Definition filedef.cpp:545
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:1519
LinkedRefMap< const Definition > m_usingDeclList
Definition filedef.cpp:241
DirDef * m_dir
Definition filedef.cpp:254
DString includedByDependencyGraphFileName() const override
Definition filedef.cpp:1959
void insertNamespace(NamespaceDef *nd) override
Definition filedef.cpp:1505
ModuleDef * getModuleDef() const override
Definition filedef.cpp:149
void writeQuickMemberLinks(OutputList &ol, const MemberDef *currentMd) const override
Definition filedef.cpp:1144
bool visibleInIndex(bool &genSourceFile) const override
Returns true if this file is visible in the index.
Definition filedef.cpp:2010
void setDiskName(const DString &name) override
Definition filedef.cpp:325
void writeSourceLink(OutputList &ol)
Definition filedef.cpp:733
void writeSummaryLinks(OutputList &ol) const override
Definition filedef.cpp:832
void writeMemberDocumentation(OutputList &ol, MemberListType lt, const DString &title)
Definition filedef.cpp:1903
ClassLinkedRefMap m_interfaces
Definition filedef.cpp:260
const ConceptLinkedRefMap & getConcepts() const override
Definition filedef.cpp:159
void setDiskNameLocal(const DString &name)
Definition filedef.cpp:309
std::unique_ptr< IncludeInfo > m_incInfo
Definition filedef.cpp:242
DString getSourceFileBase() const override
Definition filedef.cpp:1785
ClassLinkedRefMap m_structs
Definition filedef.cpp:261
void sortMemberLists() override
Definition filedef.cpp:1827
void parseSource(ClangTUParser *clangParser) override
Definition filedef.cpp:1299
void addMemberToList(MemberListType lt, MemberDef *md)
Definition filedef.cpp:1808
void acquireFileVersion()
Definition filedef.cpp:1751
DString displayName(bool=true) const override
Definition filedef.cpp:129
void addUsingDirective(NamespaceDef *nd) override
Definition filedef.cpp:1546
const DString & name() const override
Definition filedef.cpp:1511
void countMembers() override
Definition filedef.cpp:1964
void distributeMemberGroupDocumentation() override
Definition filedef.cpp:337
MemberDefLineMap m_srcMemberMap
Definition filedef.cpp:251
ConceptLinkedRefMap m_concepts
Definition filedef.cpp:263
void insertClass(ClassDef *cd) override
Definition filedef.cpp:1473
DefinitionLineMap m_srcDefMap
Definition filedef.cpp:250
NamespaceLinkedRefMap m_namespaces
Definition filedef.cpp:258
ModuleDef * m_moduleDef
Definition filedef.cpp:255
IncludeInfoList m_includedByList
Definition filedef.cpp:239
CodeSymbolType codeSymbolType() const override
Definition filedef.cpp:126
bool m_hasIncludeGraph
Definition filedef.cpp:265
const NamespaceLinkedRefMap & getNamespaces() const override
Definition filedef.cpp:158
void removeMember(MemberDef *md) override
Definition filedef.cpp:1424
void addUsingDeclaration(const Definition *d) override
Definition filedef.cpp:1558
ClassLinkedRefMap m_exceptions
Definition filedef.cpp:262
void writeTagFile(TextStream &t) override
Definition filedef.cpp:376
void endMemberDeclarations(OutputList &ol)
Definition filedef.cpp:785
void addListReferences() override
Definition filedef.cpp:1672
const MemberGroupList & getMemberGroups() const override
Definition filedef.cpp:157
IncludeInfoMap m_includedByMap
Definition filedef.cpp:238
void insertMember(MemberDef *md) override
Definition filedef.cpp:1350
const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const override
Definition filedef.cpp:1552
void writeConcepts(OutputList &ol, const DString &title)
Definition filedef.cpp:761
void writeInlineClasses(OutputList &ol)
Definition filedef.cpp:767
void writeIncludeFiles(OutputList &ol)
Definition filedef.cpp:601
MemberGroupList m_memberGroups
Definition filedef.cpp:257
void writeNamespaceDeclarations(OutputList &ol, const DString &title, bool isConstantGroup)
Definition filedef.cpp:748
void computeAnchors() override
Definition filedef.cpp:331
void addIncludeDependency(const FileDef *fd, const DString &incName, IncludeKind kind) override
Definition filedef.cpp:1584
void writeMemberPages(OutputList &ol) override
Definition filedef.cpp:1128
void writeSourceFooter(OutputList &ol) override
Definition filedef.cpp:1292
bool generateSourceFile() const override
Definition filedef.cpp:1660
void writeIncludedByGraph(OutputList &ol)
Definition filedef.cpp:707
bool m_isSource
Definition filedef.cpp:252
void writeClassDeclarations(OutputList &ol, const DString &title, const ClassLinkedRefMap &list)
Definition filedef.cpp:755
const MemberDef * getSourceMember(int lineNr) const override
Definition filedef.cpp:1538
~FileDefImpl() override
Definition filedef.cpp:305
DString getOutputFileBase() const override
Definition filedef.cpp:1797
const IncludeInfoList & includeFileList() const override
Definition filedef.cpp:152
DString getVersion() const override
Definition filedef.cpp:144
DString m_fileVersion
Definition filedef.cpp:253
void removeMemberFromList(MemberListType lt, MemberDef *md)
Definition filedef.cpp:1418
void getAllIncludeFilesRecursively(StringVector &incFiles) const override
Definition filedef.cpp:1931
DString m_path
Definition filedef.cpp:243
MemberLists m_memberLists
Definition filedef.cpp:256
DString fileName() const override
Definition filedef.cpp:130
LinkedRefMap< NamespaceDef > m_usingDirList
Definition filedef.cpp:240
void writeAuthorSection(OutputList &ol)
Definition filedef.cpp:820
DString absFilePath() const override
Definition filedef.cpp:137
DString getPath() const override
Definition filedef.cpp:143
void insertConcept(ConceptDef *cd) override
Definition filedef.cpp:1498
const MemberLists & getMemberLists() const override
Definition filedef.cpp:156
DString m_inclDepFileName
Definition filedef.cpp:245
DString m_outputDiskName
Definition filedef.cpp:247
void writeDetailedDescription(OutputList &ol, const DString &title)
Definition filedef.cpp:474
DString includeDependencyGraphFileName() const override
Definition filedef.cpp:1954
IncludeInfoMap m_includeMap
Definition filedef.cpp:236
bool m_subGrouping
Definition filedef.cpp:264
DString m_fileName
Definition filedef.cpp:248
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:1990
ClassLinkedRefMap m_classes
Definition filedef.cpp:259
void overrideIncludedByGraph(bool e) override
Definition filedef.cpp:1995
const IncludeInfoList & includedByFileList() const override
Definition filedef.cpp:153
bool hasIncludedByGraph() const override
Definition filedef.cpp:2005
void writePageNavigation(OutputList &ol) const override
Definition filedef.cpp:898
bool subGrouping() const override
Definition filedef.cpp:164
void setIncludeFile(FileDef *fd, const DString &includeName, bool local, bool force) override
Definition filedef.cpp:1563
void writeSourceHeader(OutputList &ol) override
Definition filedef.cpp:1188
void writeSourceBody(OutputList &ol, ClangTUParser *clangParser) override
Definition filedef.cpp:1241
void writeIncludeGraph(OutputList &ol)
Definition filedef.cpp:682
void addMembersToMemberGroup() override
Definition filedef.cpp:1328
int numDocMembers() const override
Definition filedef.cpp:1978
bool m_hasIncludedByGraph
Definition filedef.cpp:266
IncludeInfoList m_includeList
Definition filedef.cpp:237
void startMemberDocumentation(OutputList &ol)
Definition filedef.cpp:790
int numDecMembers() const override
Definition filedef.cpp:1984
DString fileVersion() const override
Definition filedef.cpp:1949
void writeClassesToTagFile(TextStream &t, const ClassLinkedRefMap &list)
Definition filedef.cpp:589
MemberList * getMemberList(MemberListType lt) const override
Definition filedef.cpp:1873
void startMemberDeclarations(OutputList &ol)
Definition filedef.cpp:780
bool isSource() const override
Definition filedef.cpp:139
void combineUsingRelations() override
Definition filedef.cpp:1712
bool isLinkableInProject() const override
Definition filedef.cpp:1909
void endMemberDocumentation(OutputList &ol)
Definition filedef.cpp:799
const ClassLinkedRefMap & getClasses() const override
Definition filedef.cpp:160
void writeMemberDeclarations(OutputList &ol, MemberListType lt, const DString &title)
Definition filedef.cpp:1885
bool hasIncludeGraph() const override
Definition filedef.cpp:2000
void writeDocumentation(OutputList &ol) override
Definition filedef.cpp:906
bool isIncluded(const DString &name) const override
Definition filedef.cpp:1654
DString m_docname
Definition filedef.cpp:249
DString m_filePath
Definition filedef.cpp:244
DString title() const override
Definition filedef.cpp:1937
void addRequirementReferences() override
Definition filedef.cpp:1694
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:281
DefType definitionType() const override
Definition filedef.cpp:125
bool hasDetailedDescription() const override
Definition filedef.cpp:365
DString anchor() const override
Definition filedef.cpp:132
void setDirDef(DirDef *dd) override
Definition filedef.cpp:186
void writeMemberGroups(OutputList &ol)
Definition filedef.cpp:808
const Definition * getSourceDefinition(int lineNr) const override
Definition filedef.cpp:1531
DString includeName() const override
Definition filedef.cpp:1803
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1439
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:2020
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:2027
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:269
static void getAllIncludeFilesRecursively(StringUnorderedSet &filesVisited, const FileDef *fd, StringVector &incFiles)
Definition filedef.cpp:1915
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:1790
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:1802
Definition layout.h:101
DString title(SrcLangExt lang) const
Definition layout.cpp:1783
CodeSymbolType
Definition types.h:481
SrcLangExt
Definition types.h:207
DString detab(const DString &s, size_t &refIndent)
Definition util.cpp:5195
DString convertNameToFile(const DString &name, bool allowDots, bool allowUnderscore)
Definition util.cpp:2864
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:3922
DString getFileNameExtension(const DString &fn)
Definition util.cpp:4211
void createSubDirs(const Dir &d)
Definition util.cpp:2970
DString convertToHtml(const DString &s, bool keepEntities)
Definition util.cpp:3292
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
Definition util.cpp:4169
DString getFileFilter(const DString &name, bool isSourceCode)
Definition util.cpp:1020
void addHtmlExtensionIfMissing(DString &fName)
Definition util.cpp:3932
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:3233
DString stripFromPath(const DString &path)
Definition util.cpp:219
A bunch of utility functions.