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 "outputlist.h"
52#include "moduledef.h"
53
54//---------------------------------------------------------------------------
55
57{
58 bool isIDLorJava = lang==SrcLangExt::IDL || lang==SrcLangExt::Java;
59 if (isIDLorJava || (kind & IncludeKind_ImportMask))
60 {
61 return "import ";
62 }
63 else if (kind & IncludeKind_ObjCMask)
64 {
65 return "#import ";
66 }
67 else
68 {
69 return "#include ";
70 }
71}
72
74{
75 if (lang==SrcLangExt::Java || kind==IncludeKind::ImportModule) return "";
76 if ((kind & IncludeKind_LocalMask) || (lang==SrcLangExt::IDL))
77 {
78 return "\"";
79 }
80 else
81 {
82 return "<";
83 }
84}
85
87{
88 if (lang==SrcLangExt::IDL) return "\";";
89 else if (lang==SrcLangExt::Java) return ";";
90
91 switch (kind)
92 {
93 case IncludeKind::ImportLocal: return "\";";
94 case IncludeKind::ImportLocalObjC: return "\"";
95 case IncludeKind::IncludeLocal: return "\"";
96 case IncludeKind::ImportSystem: return ">;";
97 case IncludeKind::ImportSystemObjC: return ">";
98 case IncludeKind::IncludeSystem: return ">";
99 case IncludeKind::ImportModule: return ";";
100 }
101 return "";
102}
103
105{
106 QCString result;
107 bool isIDLorJava = lang==SrcLangExt::IDL || lang==SrcLangExt::Java;
108 result.sprintf("local=\"%s\" import=\"%s\" module=\"%s\" objc=\"%s\"",
109 (kind & IncludeKind_LocalMask) ? "yes" : "no",
110 (isIDLorJava || (kind & IncludeKind_ImportMask)) ? "yes" : "no",
111 (kind==IncludeKind::ImportModule) ? "yes" : "no",
112 (kind & IncludeKind_ObjCMask) ? "yes" : "no");
113 return result;
114}
115
116//---------------------------------------------------------------------------
117
118using DefinitionLineMap = std::unordered_map<int,const Definition *>;
119using MemberDefLineMap = std::unordered_map<int,const MemberDef *>;
120using IncludeInfoMap = std::unordered_map<std::string, const IncludeInfo *>;
121
122class FileDefImpl : public DefinitionMixin<FileDef>
123{
124 public:
125 FileDefImpl(const QCString &p,const QCString &n,const QCString &ref=QCString(),const QCString &dn=QCString());
126 ~FileDefImpl() override;
128
129 DefType definitionType() const override { return TypeFile; }
131 const QCString &name() const override;
132
133 QCString displayName(bool=TRUE) const override { return localName(); }
134 QCString fileName() const override { return m_fileName; }
135 QCString getOutputFileBase() const override;
136 QCString anchor() const override { return QCString(); }
137 QCString getSourceFileBase() const override;
138 QCString includeName() const override;
141 QCString absFilePath() const override { return m_filePath; }
142 const QCString &docName() const override { return m_docname; }
143 bool isSource() const override { return m_isSource; }
144 bool isDocumentationFile() const override;
145 const Definition *getSourceDefinition(int lineNr) const override;
146 const MemberDef *getSourceMember(int lineNr) const override;
147 QCString getPath() const override { return m_path; }
148 QCString getVersion() const override { return m_fileVersion; }
149 bool isLinkableInProject() const override;
150 bool isLinkable() const override { return isLinkableInProject() || isReference(); }
151 bool isIncluded(const QCString &name) const override;
152 DirDef *getDirDef() const override { return m_dir; }
153 ModuleDef *getModuleDef() const override { return m_moduleDef; }
154 const LinkedRefMap<NamespaceDef> &getUsedNamespaces() const override;
156 const IncludeInfoList &includeFileList() const override { return m_includeList; }
157 const IncludeInfoList &includedByFileList() const override { return m_includedByList; }
158 void getAllIncludeFilesRecursively(StringVector &incFiles) const override;
159 MemberList *getMemberList(MemberListType lt) const override;
160 const MemberLists &getMemberLists() const override { return m_memberLists; }
161 const MemberGroupList &getMemberGroups() const override { return m_memberGroups; }
162 const NamespaceLinkedRefMap &getNamespaces() const override { return m_namespaces; }
163 const ConceptLinkedRefMap &getConcepts() const override { return m_concepts; }
164 const ClassLinkedRefMap &getClasses() const override { return m_classes; }
165 QCString title() const override;
166 bool hasDetailedDescription() const override;
167 QCString fileVersion() const override;
168 bool subGrouping() const override { return m_subGrouping; }
169 void countMembers() override;
170 int numDocMembers() const override;
171 int numDecMembers() const override;
172 void addSourceRef(int line,const Definition *d,const MemberDef *md) override;
173 void writeDocumentation(OutputList &ol) override;
174 void writeMemberPages(OutputList &ol) override;
175 void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const override;
176 void writeSummaryLinks(OutputList &ol) const override;
177 void writePageNavigation(OutputList &ol) const override;
178 void writeTagFile(TextStream &t) override;
179 void writeSourceHeader(OutputList &ol) override;
180 void writeSourceBody(OutputList &ol,ClangTUParser *clangParser) override;
181 void writeSourceFooter(OutputList &ol) override;
182 void parseSource(ClangTUParser *clangParser) override;
183 void setDiskName(const QCString &name) override;
184 void insertMember(MemberDef *md) override;
185 void removeMember(MemberDef *md) override;
186 void insertClass(ClassDef *cd) override;
187 void insertConcept(ConceptDef *cd) override;
188 void insertNamespace(NamespaceDef *nd) override;
189 void computeAnchors() override;
190 void setDirDef(DirDef *dd) override { m_dir=dd; }
191 void setModuleDef(ModuleDef *mod) override { m_moduleDef=mod; }
192 void addUsingDirective(NamespaceDef *nd) override;
193 void addUsingDeclaration(const Definition *d) override;
194 void combineUsingRelations() override;
195 bool generateSourceFile() const override;
196 void sortMemberLists() override;
197 void addIncludeDependency(const FileDef *fd,const QCString &incName,IncludeKind kind) override;
198 void addIncludedByDependency(const FileDef *fd,const QCString &incName,IncludeKind kind) override;
199 void addMembersToMemberGroup() override;
201 void findSectionsInDocumentation() override;
202 void addIncludedUsingDirectives(FileDefSet &visitedFiles) override;
203 void addListReferences() override;
204 void addRequirementReferences() override;
205
206 bool hasIncludeGraph() const override;
207 bool hasIncludedByGraph() const override;
208 void overrideIncludeGraph(bool e) override;
209 void overrideIncludedByGraph(bool e) override;
210
211 private:
212 void setDiskNameLocal(const QCString &name);
213 void acquireFileVersion();
222 void writeSourceLink(OutputList &ol);
224 bool isConstantGroup);
226 void writeConcepts(OutputList &ol,const QCString &title);
236
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 QCString &p,const QCString &n,const QCString &ref,const QCString &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 QCString &lref,const QCString &dn)
283 : DefinitionMixin(p+nm,1,1,nm,nullptr,nullptr,!p.isEmpty())
284{
286 m_filePath=p+nm;
287 m_fileName=nm;
288
289 setReference(lref);
290 setDiskNameLocal(!dn.isEmpty() ? dn : nm);
291 m_isSource = 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().isEmpty() && repeatBrief) ||
370 !documentation().stripWhiteSpace().isEmpty() || // 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 QCString 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(QCString(),"details");
486 ol.startGroupHeader("details");
487 ol.parseText(title);
488 ol.endGroupHeader();
489
490 ol.startTextBlock();
491 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
492 {
494 briefLine(),
495 this,
496 nullptr,
498 DocOptions());
499 }
500 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
501 !documentation().isEmpty())
502 {
506 ol.enableAll();
509 ol.writeString("\n\n");
511 }
512 if (!documentation().isEmpty())
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");
526 QCString refText = theTranslator->trDefinedInSourceFile();
527 int fileMarkerPos = refText.find("@0");
528 if (fileMarkerPos!=-1) // 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->isEmpty())
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().isEmpty()
576 )
577 {
579 ol.startTextLink(QCString(),"details");
580 ol.parseText(theTranslator->trMore());
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 {
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 QCString(),ii.includeName);
627 }
628 else
629 {
631 if (ii.kind==IncludeKind::ImportModule && mod && mod->isLinkable())
632 {
634 QCString(),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();
667 ol.parseText(theTranslator->trInclDepGraph(name()));
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();
692 ol.parseText(theTranslator->trInclByDepGraph());
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();
710 ol.parseText(theTranslator->trGotoSourceCode());
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
733 m_concepts.writeDeclaration(ol,title,FALSE);
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
743 m_classes.writeDocumentation(ol,this);
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();
797 ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString(PROJECT_NAME)));
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 QCString label = "nested-classes";
813 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
814 first=FALSE;
815 }
816 else if (lde->kind()==LayoutDocEntry::FileInterfaces && m_interfaces.declVisible() && ls)
817 {
818 QCString label = "interfaces";
819 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
820 first=FALSE;
821 }
822 else if (lde->kind()==LayoutDocEntry::FileStructs && m_structs.declVisible() && ls)
823 {
824 QCString label = "structs";
825 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
826 first=FALSE;
827 }
828 else if (lde->kind()==LayoutDocEntry::FileExceptions && m_exceptions.declVisible() && ls)
829 {
830 QCString label = "exceptions";
831 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
832 first=FALSE;
833 }
834 else if (lde->kind()==LayoutDocEntry::FileNamespaces && m_namespaces.declVisible(false) && ls)
835 {
836 QCString label = "namespaces";
837 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
838 first=FALSE;
839 }
840 else if (lde->kind()==LayoutDocEntry::FileConcepts && m_concepts.declVisible() && ls)
841 {
842 QCString label = "concepts";
843 ol.writeSummaryLink(QCString(),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(QCString(),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 //QCString 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 QCString versionTitle;
889 if (!m_fileVersion.isEmpty())
890 {
891 versionTitle=" ("+m_fileVersion+")";
892 }
893 QCString title = m_docname+versionTitle;
894 QCString pageTitle;
895 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
896 {
897 pageTitle=m_docname;
898 }
899 else
900 {
901 pageTitle=theTranslator->trFileReference(m_docname);
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 {
921 ol.parseText(theTranslator->trFileReference(displayName())); // Html only
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 :
935 theTranslator->trFileReference(name()));
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.isEmpty())
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 QCString 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.isEmpty())
1163 {
1164 title+=" ("+m_fileVersion+")";
1165 }
1166 QCString pageTitle = theTranslator->trSourceFile(title);
1168
1169 bool isDocFile = isDocumentationFile();
1170 bool genSourceFile = !isDocFile && generateSourceFile();
1171 if (getDirDef())
1172 {
1174 !generateTreeView,
1175 !isDocFile && genSourceFile ? QCString() : getOutputFileBase(),
1176 0);
1177 if (!generateTreeView)
1178 {
1180 ol.endQuickIndices();
1181 }
1183 ol.parseText(name());
1185 }
1186 else
1187 {
1189 !isDocFile && genSourceFile ? QCString() : getOutputFileBase(),
1190 0);
1192 ol.parseText(title);
1194 }
1195
1196 ol.startContents();
1197
1198 if (isLinkable())
1199 {
1201 ol.parseText(theTranslator->trGotoDocumentation());
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 {
1229 auto intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
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).isEmpty(); // 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,QCString(),
1243 getLanguage(),
1244 Config_getBool(STRIP_CODE_COMMENTS),
1246 .setFileDef(this)
1247 );
1248 }
1249 size_t indent = 0;
1250 intf->parseCode(codeOL,QCString(),
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 {
1284 auto intf = Doxygen::parserManager->getCodeParser(getDefFileExtension());
1285 intf->resetCodeParserState();
1286 size_t indent = 0;
1287 intf->parseCode(
1288 devNullList,QCString(),
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 {
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
1349 addMemberToList(MemberListType::DecVarMembers(),md);
1350 addMemberToList(MemberListType::DocVarMembers(),md);
1351 break;
1353 addMemberToList(MemberListType::DecFuncMembers(),md);
1354 addMemberToList(MemberListType::DocFuncMembers(),md);
1355 break;
1357 addMemberToList(MemberListType::DecTypedefMembers(),md);
1358 addMemberToList(MemberListType::DocTypedefMembers(),md);
1359 break;
1361 addMemberToList(MemberListType::DecSequenceMembers(),md);
1362 addMemberToList(MemberListType::DocSequenceMembers(),md);
1363 break;
1365 addMemberToList(MemberListType::DecDictionaryMembers(),md);
1366 addMemberToList(MemberListType::DocDictionaryMembers(),md);
1367 break;
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 {
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
1408 removeMemberFromList(MemberListType::DecVarMembers(),md);
1409 removeMemberFromList(MemberListType::DocVarMembers(),md);
1410 break;
1412 removeMemberFromList(MemberListType::DecFuncMembers(),md);
1413 removeMemberFromList(MemberListType::DocFuncMembers(),md);
1414 break;
1416 removeMemberFromList(MemberListType::DecTypedefMembers(),md);
1417 removeMemberFromList(MemberListType::DocTypedefMembers(),md);
1418 break;
1420 removeMemberFromList(MemberListType::DecSequenceMembers(),md);
1421 removeMemberFromList(MemberListType::DocSequenceMembers(),md);
1422 break;
1424 removeMemberFromList(MemberListType::DecDictionaryMembers(),md);
1425 removeMemberFromList(MemberListType::DocDictionaryMembers(),md);
1426 break;
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{
1518 m_usingDirList.add(nd->qualifiedName(),nd);
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 QCString iName = fd ? fd->absFilePath() : incName;
1537 if (!iName.isEmpty() && 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 QCString iName = fd ? fd->absFilePath() : incName;
1596 if (!iName.isEmpty() && 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.isEmpty()) 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 && (guessSection(name()).isHeader() || !m_includedByMap.empty()))
1616 ) &&
1618}
1619
1620
1622{
1625 theTranslator->trFile(TRUE,TRUE),
1627 QCString(),
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 int lastDot = name().findRev('.');
1695 return (lastDot!=-1 && docExtensions.find(name().mid(lastDot+1).str())!=docExtensions.end()) ||
1696 getLanguageFromFileName(getFileNameExtension(name())) == SrcLangExt::Markdown;
1697}
1698
1700{
1701 QCString vercmd = Config_getString(FILE_VERSION_FILTER);
1702 if (!vercmd.isEmpty() && !m_filePath.isEmpty() && !isReference() &&
1703 m_filePath!="generated" && m_filePath!="graph_legend.dox")
1704 {
1705 msg("Version of {} : ",m_filePath);
1706 QCString cmd = vercmd+" \""+m_filePath+"\"";
1707 Debug::print(Debug::ExtCmd,0,"Executing popen(`{}`)\n",cmd);
1708 FILE *f=Portable::popen(cmd,"r");
1709 if (!f)
1710 {
1711 err("could not execute {}\n",vercmd);
1712 return;
1713 }
1714 const int bufSize=1024;
1715 char buf[bufSize];
1716 int numRead = static_cast<int>(fread(buf,1,bufSize-1,f));
1718 if (numRead>0 && numRead<bufSize)
1719 {
1720 buf[numRead]='\0';
1721 m_fileVersion=QCString(buf,numRead).stripWhiteSpace();
1722 if (!m_fileVersion.isEmpty())
1723 {
1724 msg("{}\n",m_fileVersion);
1725 return;
1726 }
1727 }
1728 msg("no version available\n");
1729 }
1730}
1731
1732
1734{
1735 if (Htags::useHtags)
1736 {
1738 }
1739 else
1740 {
1741 return m_outputDiskName+"_source";
1742 }
1743}
1744
1749
1750/*! Returns the name of the verbatim copy of this file (if any). */
1752{
1753 return getSourceFileBase();
1754}
1755
1757{
1758 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
1759 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
1760 const auto &ml = m_memberLists.get(lt,MemberListContainer::File);
1761 ml->setNeedsSorting(
1762 (ml->listType().isDeclaration() && sortBriefDocs) ||
1763 (ml->listType().isDocumentation() && sortMemberDocs));
1764 ml->push_back(md);
1765 if (ml->listType().isDeclaration())
1766 {
1768 if (mdm)
1769 {
1770 mdm->setSectionList(this,ml.get());
1771 }
1772 }
1773}
1774
1776{
1777 for (auto &ml : m_memberLists)
1778 {
1779 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
1780 }
1781
1782 for (const auto &mg : m_memberGroups)
1783 {
1784 MemberList &mlg = const_cast<MemberList&>(mg->members());
1785 if (mlg.needsSorting()) { mlg.sort(); mlg.setNeedsSorting(FALSE); }
1786 }
1787
1788 std::stable_sort(m_includedByList.begin(),m_includedByList.end(),
1789 [](const auto &fi1,const auto &fi2) { return fi1.includeName < fi2.includeName; });
1790
1791 if (Config_getBool(SORT_BRIEF_DOCS))
1792 {
1793 auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
1794 {
1795 return Config_getBool(SORT_BY_SCOPE_NAME) ?
1796 qstricmp_sort(c1->name(), c2->name())<0 :
1797 qstricmp_sort(c1->className(), c2->className())<0;
1798 };
1799
1800 std::stable_sort(m_classes.begin(), m_classes.end(), classComp);
1801 std::stable_sort(m_interfaces.begin(),m_interfaces.end(),classComp);
1802 std::stable_sort(m_structs.begin(), m_structs.end(), classComp);
1803 std::stable_sort(m_exceptions.begin(),m_exceptions.end(),classComp);
1804
1805 auto conceptComp = [](const ConceptLinkedRefMap::Ptr &c1,const ConceptLinkedRefMap::Ptr &c2)
1806 {
1807 return qstricmp_sort(c1->name(),c2->name())<0;
1808 };
1809
1810 std::stable_sort(m_concepts.begin(), m_concepts.end(), conceptComp);
1811
1812 auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
1813 {
1814 return qstricmp_sort(n1->name(),n2->name())<0;
1815 };
1816
1817 std::stable_sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
1818 }
1819}
1820
1822{
1823 for (auto &ml : m_memberLists)
1824 {
1825 if (ml->listType()==lt)
1826 {
1827 return ml.get();
1828 }
1829 }
1830 return nullptr;
1831}
1832
1834{
1835 bool optVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1836 MemberList * ml = getMemberList(lt);
1837 if (ml)
1838 {
1839 if (optVhdl) // use specific declarations function
1840 {
1841
1842 VhdlDocGen::writeVhdlDeclarations(ml,ol,nullptr,nullptr,this,nullptr,nullptr);
1843 }
1844 else
1845 {
1846 ml->writeDeclarations(ol,nullptr,nullptr,this,nullptr,nullptr,title,QCString());
1847 }
1848 }
1849}
1850
1852{
1853 MemberList * ml = getMemberList(lt);
1854 if (ml) ml->writeDocumentation(ol,name(),this,title,ml->listType().toLabel());
1855}
1856
1858{
1859 bool showFiles = Config_getBool(SHOW_FILES);
1860 return hasDocumentation() && !isReference() && (showFiles || isLinkableViaGroup());
1861}
1862
1864 StringUnorderedSet &filesVisited,const FileDef *fd,StringVector &incFiles)
1865{
1866 for (const auto &ii : fd->includeFileList())
1867 {
1868 if (ii.fileDef && !ii.fileDef->isReference() &&
1869 filesVisited.find(ii.fileDef->absFilePath().str())==filesVisited.end())
1870 {
1871 //printf("FileDefImpl::addIncludeDependency(%s)\n",qPrint(ii->fileDef->absFilePath()));
1872 incFiles.push_back(ii.fileDef->absFilePath().str());
1873 filesVisited.insert(ii.fileDef->absFilePath().str());
1874 getAllIncludeFilesRecursively(filesVisited,ii.fileDef,incFiles);
1875 }
1876 }
1877}
1878
1880{
1881 StringUnorderedSet includes;
1882 ::getAllIncludeFilesRecursively(includes,this,incFiles);
1883}
1884
1886{
1887 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
1888 {
1889 return name();
1890 }
1891 else
1892 {
1893 return theTranslator->trFileReference(name());
1894 }
1895}
1896
1898{
1899 return m_fileVersion;
1900}
1901
1906
1911
1913{
1914 for (auto &ml : m_memberLists)
1915 {
1916 ml->countDecMembers();
1917 ml->countDocMembers();
1918 }
1919 for (const auto &mg : m_memberGroups)
1920 {
1921 mg->countDecMembers();
1922 mg->countDocMembers();
1923 }
1924}
1925
1927{
1928 MemberList *ml = getMemberList(MemberListType::AllMembersList());
1929 return ml ? ml->numDocMembers() : 0;
1930}
1931
1933{
1934 MemberList *ml = getMemberList(MemberListType::AllMembersList());
1935 return ml ? ml->numDecMembers() : 0;
1936}
1937
1942
1947
1949{
1950 return m_hasIncludeGraph;
1951}
1952
1954{
1955 return m_hasIncludedByGraph;
1956}
1957
1958// -----------------------
1959
1960bool compareFileDefs(const FileDef *fd1, const FileDef *fd2)
1961{
1962 return qstricmp_sort(fd1->name(),fd2->name()) < 0;
1963}
1964
1965// --- Cast functions
1966
1968{
1969 if (d==nullptr) return nullptr;
1970 if (d && typeid(*d)==typeid(FileDefImpl))
1971 {
1972 return static_cast<FileDef*>(d);
1973 }
1974 else
1975 {
1976 return nullptr;
1977 }
1978}
1979
1981{
1982 if (d==nullptr) return nullptr;
1983 if (d && typeid(*d)==typeid(FileDefImpl))
1984 {
1985 return static_cast<const FileDef*>(d);
1986 }
1987 else
1988 {
1989 return nullptr;
1990 }
1991}
1992
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 QCString 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.
void writeDeclaration(OutputList &ol, const ClassDef::CompoundType *filter, const QCString &header, bool localNames) const
Definition classlist.cpp:53
@ ExtCmd
Definition debug.h:36
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:76
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 bool isHidden() const =0
virtual QCString getReference() const =0
virtual QCString qualifiedName() const =0
virtual QCString getOutputFileBase() const =0
virtual bool isReference() const =0
virtual const QCString & name() const =0
bool isReference() const override
const QCString & name() const override
bool isLinkableViaGroup() const override
bool hasBriefDescription() const override
QCString docFile() const override
QCString getDefFileExtension() const override
bool hasRequirementRefs() const override
QCString briefFile() const override
void setLanguage(SrcLangExt lang) override
void setReference(const QCString &r) override
void writeRequirementRefs(OutputList &ol) const override
const RefItemVector & xrefListItems() const override
QCString briefDescription(bool abbreviate=FALSE) const override
DefinitionMixin(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=TRUE)
const QCString & localName() const override
const FileDef * getBodyDef() const override
int getStartBodyLine() const override
QCString inbodyDocumentation() const override
int docLine() const override
int briefLine() const override
QCString documentation() 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:131
static bool parseSourcesNeeded
Definition doxygen.h:122
static bool clangAssistedParsing
Definition doxygen.h:137
static ParserManager * parserManager
Definition doxygen.h:130
A model of a file symbol.
Definition filedef.h:99
virtual QCString includeName() const =0
virtual bool generateSourceFile() const =0
virtual QCString absFilePath() const =0
virtual const IncludeInfoList & includeFileList() const =0
bool isDocumentationFile() const override
Definition filedef.cpp:1689
void findSectionsInDocumentation() override
Definition filedef.cpp:346
void setModuleDef(ModuleDef *mod) override
Definition filedef.cpp:191
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:155
void setDiskName(const QCString &name) override
Definition filedef.cpp:325
void addSourceRef(int line, const Definition *d, const MemberDef *md) override
Definition filedef.cpp:1489
LinkedRefMap< const Definition > m_usingDeclList
Definition filedef.cpp:242
DirDef * m_dir
Definition filedef.cpp:254
QCString getOutputFileBase() const override
Definition filedef.cpp:1745
void insertNamespace(NamespaceDef *nd) override
Definition filedef.cpp:1475
ModuleDef * getModuleDef() const override
Definition filedef.cpp:153
void writeQuickMemberLinks(OutputList &ol, const MemberDef *currentMd) const override
Definition filedef.cpp:1114
void writeSourceLink(OutputList &ol)
Definition filedef.cpp:702
void writeSummaryLinks(OutputList &ol) const override
Definition filedef.cpp:801
QCString absFilePath() const override
Definition filedef.cpp:141
QCString m_path
Definition filedef.cpp:243
ClassLinkedRefMap m_interfaces
Definition filedef.cpp:260
const ConceptLinkedRefMap & getConcepts() const override
Definition filedef.cpp:163
QCString m_inclDepFileName
Definition filedef.cpp:245
ClassLinkedRefMap m_structs
Definition filedef.cpp:261
void sortMemberLists() override
Definition filedef.cpp:1775
void parseSource(ClangTUParser *clangParser) override
Definition filedef.cpp:1269
void setDiskNameLocal(const QCString &name)
Definition filedef.cpp:309
void addMemberToList(MemberListType lt, MemberDef *md)
Definition filedef.cpp:1756
void acquireFileVersion()
Definition filedef.cpp:1699
QCString m_fileVersion
Definition filedef.cpp:253
void addUsingDirective(NamespaceDef *nd) override
Definition filedef.cpp:1516
void writeNamespaceDeclarations(OutputList &ol, const QCString &title, bool isConstantGroup)
Definition filedef.cpp:717
void countMembers() override
Definition filedef.cpp:1912
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:1443
DefinitionLineMap m_srcDefMap
Definition filedef.cpp:250
QCString getSourceFileBase() const override
Definition filedef.cpp:1733
NamespaceLinkedRefMap m_namespaces
Definition filedef.cpp:258
ModuleDef * m_moduleDef
Definition filedef.cpp:255
IncludeInfoList m_includedByList
Definition filedef.cpp:240
CodeSymbolType codeSymbolType() const override
Definition filedef.cpp:130
void writeClassDeclarations(OutputList &ol, const QCString &title, const ClassLinkedRefMap &list)
Definition filedef.cpp:724
QCString anchor() const override
Definition filedef.cpp:136
bool m_hasIncludeGraph
Definition filedef.cpp:265
const NamespaceLinkedRefMap & getNamespaces() const override
Definition filedef.cpp:162
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:262
QCString includeName() const override
Definition filedef.cpp:1751
void writeTagFile(TextStream &t) override
Definition filedef.cpp:376
void endMemberDeclarations(OutputList &ol)
Definition filedef.cpp:754
void addListReferences() override
Definition filedef.cpp:1621
void writeMemberDeclarations(OutputList &ol, MemberListType lt, const QCString &title)
Definition filedef.cpp:1833
const MemberGroupList & getMemberGroups() const override
Definition filedef.cpp:161
IncludeInfoMap m_includedByMap
Definition filedef.cpp:239
void insertMember(MemberDef *md) override
Definition filedef.cpp:1320
const LinkedRefMap< NamespaceDef > & getUsedNamespaces() const override
Definition filedef.cpp:1522
void writeInlineClasses(OutputList &ol)
Definition filedef.cpp:736
const QCString & docName() const override
Definition filedef.cpp:142
void writeIncludeFiles(OutputList &ol)
Definition filedef.cpp:602
MemberGroupList m_memberGroups
Definition filedef.cpp:257
void computeAnchors() override
Definition filedef.cpp:331
void writeDetailedDescription(OutputList &ol, const QCString &title)
Definition filedef.cpp:474
QCString m_fileName
Definition filedef.cpp:248
void writeMemberPages(OutputList &ol) override
Definition filedef.cpp:1098
void writeSourceFooter(OutputList &ol) override
Definition filedef.cpp:1262
QCString fileVersion() const override
Definition filedef.cpp:1897
void writeConcepts(OutputList &ol, const QCString &title)
Definition filedef.cpp:730
bool generateSourceFile() const override
Definition filedef.cpp:1609
void writeIncludedByGraph(OutputList &ol)
Definition filedef.cpp:676
const QCString & name() const override
Definition filedef.cpp:1481
bool m_isSource
Definition filedef.cpp:252
const MemberDef * getSourceMember(int lineNr) const override
Definition filedef.cpp:1508
QCString m_outputDiskName
Definition filedef.cpp:247
bool isIncluded(const QCString &name) const override
Definition filedef.cpp:1603
~FileDefImpl() override
Definition filedef.cpp:305
const IncludeInfoList & includeFileList() const override
Definition filedef.cpp:156
void removeMemberFromList(MemberListType lt, MemberDef *md)
Definition filedef.cpp:1388
void getAllIncludeFilesRecursively(StringVector &incFiles) const override
Definition filedef.cpp:1879
MemberLists m_memberLists
Definition filedef.cpp:256
LinkedRefMap< NamespaceDef > m_usingDirList
Definition filedef.cpp:241
QCString getVersion() const override
Definition filedef.cpp:148
void writeAuthorSection(OutputList &ol)
Definition filedef.cpp:789
void insertConcept(ConceptDef *cd) override
Definition filedef.cpp:1468
const MemberLists & getMemberLists() const override
Definition filedef.cpp:160
void addIncludedByDependency(const FileDef *fd, const QCString &incName, IncludeKind kind) override
Definition filedef.cpp:1592
IncludeInfoMap m_includeMap
Definition filedef.cpp:237
bool m_subGrouping
Definition filedef.cpp:264
QCString m_inclByDepFileName
Definition filedef.cpp:246
DirDef * getDirDef() const override
Definition filedef.cpp:152
void overrideIncludeGraph(bool e) override
Definition filedef.cpp:1938
ClassLinkedRefMap m_classes
Definition filedef.cpp:259
QCString m_docname
Definition filedef.cpp:249
void overrideIncludedByGraph(bool e) override
Definition filedef.cpp:1943
const IncludeInfoList & includedByFileList() const override
Definition filedef.cpp:157
bool hasIncludedByGraph() const override
Definition filedef.cpp:1953
void writePageNavigation(OutputList &ol) const override
Definition filedef.cpp:867
QCString displayName(bool=TRUE) const override
Definition filedef.cpp:133
bool subGrouping() const override
Definition filedef.cpp:168
QCString m_filePath
Definition filedef.cpp:244
void writeMemberDocumentation(OutputList &ol, MemberListType lt, const QCString &title)
Definition filedef.cpp:1851
void writeSourceHeader(OutputList &ol) override
Definition filedef.cpp:1158
FileDefImpl(const QCString &p, const QCString &n, const QCString &ref=QCString(), const QCString &dn=QCString())
Definition filedef.cpp:281
void writeSourceBody(OutputList &ol, ClangTUParser *clangParser) override
Definition filedef.cpp:1211
void writeIncludeGraph(OutputList &ol)
Definition filedef.cpp:651
QCString title() const override
Definition filedef.cpp:1885
void addMembersToMemberGroup() override
Definition filedef.cpp:1298
int numDocMembers() const override
Definition filedef.cpp:1926
QCString getPath() const override
Definition filedef.cpp:147
bool m_hasIncludedByGraph
Definition filedef.cpp:266
IncludeInfoList m_includeList
Definition filedef.cpp:238
void startMemberDocumentation(OutputList &ol)
Definition filedef.cpp:759
int numDecMembers() const override
Definition filedef.cpp:1932
void writeClassesToTagFile(TextStream &t, const ClassLinkedRefMap &list)
Definition filedef.cpp:590
MemberList * getMemberList(MemberListType lt) const override
Definition filedef.cpp:1821
void startMemberDeclarations(OutputList &ol)
Definition filedef.cpp:749
bool isSource() const override
Definition filedef.cpp:143
void combineUsingRelations() override
Definition filedef.cpp:1661
bool isLinkableInProject() const override
Definition filedef.cpp:1857
void endMemberDocumentation(OutputList &ol)
Definition filedef.cpp:768
QCString includedByDependencyGraphFileName() const override
Definition filedef.cpp:1907
const ClassLinkedRefMap & getClasses() const override
Definition filedef.cpp:164
QCString fileName() const override
Definition filedef.cpp:134
bool hasIncludeGraph() const override
Definition filedef.cpp:1948
void writeDocumentation(OutputList &ol) override
Definition filedef.cpp:875
void addRequirementReferences() override
Definition filedef.cpp:1643
bool isLinkable() const override
Definition filedef.cpp:150
void addIncludeDependency(const FileDef *fd, const QCString &incName, IncludeKind kind) override
Definition filedef.cpp:1533
DefType definitionType() const override
Definition filedef.cpp:129
bool hasDetailedDescription() const override
Definition filedef.cpp:365
QCString includeDependencyGraphFileName() const override
Definition filedef.cpp:1902
void setDirDef(DirDef *dd) override
Definition filedef.cpp:190
void writeMemberGroups(OutputList &ol)
Definition filedef.cpp:777
const Definition * getSourceDefinition(int lineNr) const override
Definition filedef.cpp:1501
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1437
Container class representing a vector of objects with keys.
Definition linkedmap.h:232
bool add(const char *k, T *obj)
Definition linkedmap.h:284
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 writeDeclarations(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, const QCString &title, const QCString &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 writeTagFile(TextStream &, bool useQualifiedName=false, bool showNamespaceMembers=true)
void setNeedsSorting(bool b)
MemberListType listType() const
Definition memberlist.h:130
void writeDocumentation(OutputList &ol, const QCString &scopeName, const Definition *container, const QCString &title, const QCString &anchor, bool showEnumValues=FALSE, bool showInline=FALSE) const
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
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 QCString &moduleName) const
An abstract interface of a namespace symbol.
virtual void combineUsingRelations(NamespaceDefSet &visitedNamespace)=0
Class representing a list of different code generators.
Definition outputlist.h:165
void add(OutputCodeIntfPtr &&p)
Definition outputlist.h:195
void startCodeFragment(const QCString &style)
Definition outputlist.h:279
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 endTextBlock(bool paraBreak=FALSE)
Definition outputlist.h:672
void writeString(const QCString &text)
Definition outputlist.h:411
void disable(OutputType o)
void startInclDepGraph()
Definition outputlist.h:652
void writeRuler()
Definition outputlist.h:521
const OutputCodeList & codeGenerators() const
Definition outputlist.h:358
void startGroupHeader(const QCString &id=QCString(), int extraLevels=0)
Definition outputlist.h:453
void enable(OutputType o)
void endContents()
Definition outputlist.h:620
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:439
void docify(const QCString &s)
Definition outputlist.h:437
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, const DocOptions &options)
void startParagraph(const QCString &classDef=QCString())
Definition outputlist.h:407
void startProjectNumber()
Definition outputlist.h:391
void startTextBlock(bool dense=FALSE)
Definition outputlist.h:670
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 disableAllBut(OutputType o)
void popGeneratorState()
void writeSummaryLink(const QCString &file, const QCString &anchor, const QCString &title, bool first)
Definition outputlist.h:614
void writeAnchor(const QCString &fileName, const QCString &name)
Definition outputlist.h:523
void endGroupHeader(int extraLevels=0)
Definition outputlist.h:455
void endQuickIndices()
Definition outputlist.h:604
void writePageOutline()
Definition outputlist.h:616
void startContents()
Definition outputlist.h:618
void enableAll()
void endProjectNumber()
Definition outputlist.h:393
void endTypewriter()
Definition outputlist.h:451
void lineBreak(const QCString &style=QCString())
Definition outputlist.h:559
void parseText(const QCString &textStr)
void startTextLink(const QCString &file, const QCString &anchor)
Definition outputlist.h:442
void endMemberSections()
Definition outputlist.h:463
This is an alternative implementation of QCString.
Definition qcstring.h:101
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:260
const std::string & str() const
Definition qcstring.h:552
QCString right(size_t len) const
Definition qcstring.h:234
QCString & sprintf(const char *format,...)
Definition qcstring.cpp:29
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:96
QCString & insert(size_t index, const QCString &s)
Definition qcstring.h:332
QCString left(size_t len) const
Definition qcstring.h:229
static RequirementManager & instance()
void addRequirementRefsForSymbol(const Definition *symbol)
Text streaming class that buffers data.
Definition textstream.h:36
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
void docFindSections(const QCString &input, const Definition *d, const QCString &fileName)
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:55
static void writeTagFile()
std::unordered_map< std::string, const IncludeInfo * > IncludeInfoMap
Definition filedef.cpp:120
QCString includeClose(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:86
std::unordered_map< int, const Definition * > DefinitionLineMap
Definition filedef.cpp:118
QCString includeStatement(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:56
std::unique_ptr< FileDef > createFileDef(const QCString &p, const QCString &n, const QCString &ref, const QCString &dn)
Definition filedef.cpp:269
bool compareFileDefs(const FileDef *fd1, const FileDef *fd2)
Definition filedef.cpp:1960
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:1967
std::unordered_map< int, const MemberDef * > MemberDefLineMap
Definition filedef.cpp:119
QCString includeOpen(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:73
QCString includeTagFileAttributes(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:104
static void getAllIncludeFilesRecursively(StringUnorderedSet &filesVisited, const FileDef *fd, StringVector &incFiles)
Definition filedef.cpp:1863
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 startTitle(OutputList &ol, const QCString &fileName, const DefinitionMutable *def)
Definition index.cpp:384
void endTitle(OutputList &ol, const QCString &fileName, const QCString &name)
Definition index.cpp:394
void startFile(OutputList &ol, const QCString &name, bool isSource, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel, const QCString &allMembersFile)
Definition index.cpp:401
void endFileWithNavPath(OutputList &ol, const DefinitionMutable *d, bool showPageNavigation)
Definition index.cpp:448
Translator * theTranslator
Definition language.cpp:71
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 QCString &name, const QCString &type)
Definition portable.cpp:480
int pclose(FILE *stream)
Definition portable.cpp:489
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
std::unordered_set< const NamespaceDef * > NamespaceDefSet
Portable versions of functions that are platform dependent.
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
const char * qPrint(const char *s)
Definition qcstring.h:687
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
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:72
Options to configure the code parser.
Definition parserintf.h:78
static QCString path2URL(const QCString &path)
Definition htags.cpp:157
static bool useHtags
Definition htags.h:23
Represents of a member declaration list with configurable title and subtitle.
Definition layout.h:112
QCString title(SrcLangExt lang) const
Definition layout.cpp:1788
MemberListType type
Definition layout.h:118
Represents of a member definition list with configurable title.
Definition layout.h:132
MemberListType type
Definition layout.h:137
QCString title(SrcLangExt lang) const
Definition layout.cpp:1800
Definition layout.h:102
QCString title(SrcLangExt lang) const
Definition layout.cpp:1781
CodeSymbolType
Definition types.h:481
@ Enumeration
Definition types.h:557
@ EnumValue
Definition types.h:558
@ Dictionary
Definition types.h:568
@ Sequence
Definition types.h:567
@ Variable
Definition types.h:555
@ Property
Definition types.h:563
@ Typedef
Definition types.h:556
@ Function
Definition types.h:554
SrcLangExt
Definition types.h:207
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5191
QCString convertToHtml(const QCString &s, bool keepEntities)
Definition util.cpp:3944
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
Definition util.cpp:4805
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:4892
QCString fileToString(const QCString &name, bool filter, bool isSourceCode)
Definition util.cpp:1471
void createSubDirs(const Dir &d)
Definition util.cpp:3621
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:299
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
Definition util.cpp:3485
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:3893
QCString detab(const QCString &s, size_t &refIndent)
Definition util.cpp:6720
EntryType guessSection(const QCString &name)
Definition util.cpp:339
QCString removeLongPathMarker(QCString path)
Definition util.cpp:288
QCString getFileFilter(const QCString &name, bool isSourceCode)
Definition util.cpp:1399
QCString getFileNameExtension(const QCString &fn)
Definition util.cpp:5233
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:4902
A bunch of utility functions.