summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp21
-rw-r--r--src/classdef.h1
-rw-r--r--src/dotclassgraph.cpp2
-rw-r--r--src/doxygen.cpp72
-rw-r--r--src/doxygen.h1
-rw-r--r--src/markdown.cpp2
6 files changed, 47 insertions, 52 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 315f3f6..ff39e29 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -82,12 +82,6 @@ static QCString makeQualifiedNameWithTemplateParameters(const ClassDef *cd,
bool isSpecialization = cd->localName().find('<')!=-1;
QCString clName = cd->className();
- //bool isGeneric = getLanguage()==SrcLangExt_CSharp;
- //if (isGeneric && clName.right(2)=="-g")
- //{
- // clName = clName.left(clName.length()-2);
- //}
- //printf("m_impl->lang=%d clName=%s isSpecialization=%d\n",getLanguage(),clName.data(),isSpecialization);
scName+=clName;
if (!cd->templateArguments().empty())
{
@@ -239,7 +233,6 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
virtual const ClassDef *tagLessReference() const;
virtual MemberDef *isSmartPointer() const;
virtual bool isJavaEnum() const;
- virtual bool isGeneric() const;
virtual QCString title() const;
virtual QCString generatedFromFiles() const;
virtual const FileList &usedFiles() const;
@@ -522,8 +515,6 @@ class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
{ return getCdAlias()->isSmartPointer(); }
virtual bool isJavaEnum() const
{ return getCdAlias()->isJavaEnum(); }
- virtual bool isGeneric() const
- { return getCdAlias()->isGeneric(); }
virtual QCString title() const
{ return getCdAlias()->title(); }
virtual QCString generatedFromFiles() const
@@ -725,8 +716,6 @@ class ClassDefImpl::IMPL
/** Does this class represent a Java style enum? */
bool isJavaEnum = false;
- bool isGeneric = false;
-
uint64 spec = 0;
QCString metaData;
@@ -783,7 +772,6 @@ void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
{
isLocal=FALSE;
}
- isGeneric = (lang==SrcLangExt_CSharp || lang==SrcLangExt_Java) && QCString(name).find('<')!=-1;
}
ClassDefImpl::IMPL::IMPL() : vhdlSummaryTitles(17)
@@ -4044,11 +4032,11 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
ClassDefMutable *templateClass=toClassDefMutable(m_impl->templateInstances->find(templSpec));
if (templateClass==0)
{
- Debug::print(Debug::Classes,0," New template instance class '%s''%s'\n",qPrint(name()),qPrint(templSpec));
QCString tcname = removeRedundantWhiteSpace(localName()+templSpec);
+ Debug::print(Debug::Classes,0," New template instance class '%s''%s' inside '%s' hidden=%d\n",qPrint(name()),qPrint(templSpec),qPrint(name()),isHidden());
templateClass =
toClassDefMutable(
- Doxygen::classLinkedMap->add(tcname,
+ Doxygen::hiddenClassLinkedMap->add(tcname,
std::unique_ptr<ClassDef>(
new ClassDefImpl(fileName,startLine,startColumn,tcname,ClassDef::Class))));
templateClass->setTemplateMaster(this);
@@ -5023,11 +5011,6 @@ bool ClassDefImpl::isJavaEnum() const
return m_impl->isJavaEnum;
}
-bool ClassDefImpl::isGeneric() const
-{
- return m_impl->isGeneric;
-}
-
void ClassDefImpl::setClassSpecifier(uint64 spec)
{
m_impl->spec = spec;
diff --git a/src/classdef.h b/src/classdef.h
index 6d2bbef..62db01e 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -340,7 +340,6 @@ class ClassDef : public Definition
virtual bool isJavaEnum() const = 0;
- virtual bool isGeneric() const = 0;
virtual QCString title() const = 0;
virtual QCString generatedFromFiles() const = 0;
diff --git a/src/dotclassgraph.cpp b/src/dotclassgraph.cpp
index 4077d5b..be318e4 100644
--- a/src/dotclassgraph.cpp
+++ b/src/dotclassgraph.cpp
@@ -38,7 +38,7 @@ void DotClassGraph::addClass(const ClassDef *cd,DotNode *n,int prot,
}
else if (templSpec) // name has a template part
{
- className=insertTemplateSpecifierInScope(cd->name(),templSpec);
+ className=insertTemplateSpecifierInScope(cd->displayName(),templSpec);
}
else // just a normal name
{
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 64e5ac3..f13a4a8 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -161,7 +161,6 @@ int Doxygen::subpageNestingLevel = 0;
bool Doxygen::userComments = FALSE;
QCString Doxygen::spaces;
bool Doxygen::generatingXmlOutput = FALSE;
-GenericsSDict *Doxygen::genericsDict;
DefinesPerFileList Doxygen::macroDefinitions;
bool Doxygen::clangAssistedParsing = FALSE;
@@ -977,8 +976,8 @@ static void addClassToContext(const Entry *root)
// see if we already found the class before
ClassDefMutable *cd = getClassMutable(qualifiedName);
- //Debug::print(Debug::Classes,0, " Found class with name %s (qualifiedName=%s -> cd=%p)\n",
- // cd ? qPrint(cd->name()) : qPrint(root->name), qPrint(qualifiedName),cd);
+ Debug::print(Debug::Classes,0, " Found class with name %s (qualifiedName=%s -> cd=%p)\n",
+ cd ? qPrint(cd->name()) : qPrint(root->name), qPrint(qualifiedName),cd);
if (cd)
{
@@ -1046,7 +1045,7 @@ static void addClassToContext(const Entry *root)
}
}
std::unique_ptr<ArgumentList> tArgList;
- if ((root->lang==SrcLangExt_CSharp || root->lang==SrcLangExt_Java) && (i=fullName.find('<'))!=-1)
+ if ((root->lang==SrcLangExt_CSharp || root->lang==SrcLangExt_Java) && (i=fullName.findRev('<'))!=-1)
{
// a Java/C# generic class looks like a C++ specialization, so we need to split the
// name and template arguments here
@@ -1064,8 +1063,8 @@ static void addClassToContext(const Entry *root)
std::unique_ptr<ClassDef>(
createClassDef(tagInfo?tagName:root->fileName,root->startLine,root->startColumn,
fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum) )));
- Debug::print(Debug::Classes,0," New class '%s' (sec=0x%08x)! #tArgLists=%d tagInfo=%p\n",
- qPrint(fullName),sec,root->tArgLists.size(), tagInfo);
+ Debug::print(Debug::Classes,0," New class '%s' (sec=0x%08x)! #tArgLists=%d tagInfo=%p hidden=%d artificial=%d\n",
+ qPrint(fullName),sec,root->tArgLists.size(), tagInfo,root->hidden,root->artificial);
cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
cd->setLanguage(root->lang);
@@ -1097,11 +1096,6 @@ static void addClassToContext(const Entry *root)
cd->insertUsedFile(fd);
- if (cd->isGeneric()) // generics are also stored in a separate dictionary for fast lookup of instances
- {
- //printf("inserting generic '%s' cd=%p\n",fullName.data(),cd);
- Doxygen::genericsDict->insert(fullName,cd);
- }
}
cd->addSectionsToDefinition(root->anchors);
@@ -1855,7 +1849,7 @@ static void findUsingDeclarations(const Entry *root)
Debug::print(Debug::Classes,0," New using class '%s' (sec=0x%08x)! #tArgLists=%d\n",
qPrint(name),root->section,root->tArgLists.size());
usingCd = toClassDefMutable(
- Doxygen::hiddenClassLinkedMap->add(root->name,
+ Doxygen::hiddenClassLinkedMap->add(name,
std::unique_ptr<ClassDef>(
createClassDef( "<using>",1,1, name, ClassDef::Class))));
usingCd->setArtificial(TRUE);
@@ -3841,20 +3835,17 @@ static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,co
{
result = const_cast<ClassDef*>(resolver.resolveClass(context,name,true,true));
}
+ //printf("1. result=%p\n",result);
if (result==0)
{
result = const_cast<ClassDef*>(resolver.resolveClass(cd,name,true,true));
}
+ //printf("2. result=%p\n",result);
if (result==0) // try direct class, needed for namespaced classes imported via tag files (see bug624095)
{
result = getClass(name);
}
- if (result==0 &&
- (cd->getLanguage()==SrcLangExt_CSharp || cd->getLanguage()==SrcLangExt_Java) &&
- name.find('<')!=-1)
- {
- result = Doxygen::genericsDict->find(name);
- }
+ //printf("3. result=%p\n",result);
//printf("** Trying to find %s within context %s class %s result=%s lookup=%p\n",
// name.data(),
// context ? context->name().data() : "<none>",
@@ -4225,6 +4216,36 @@ static int findEndOfTemplate(const QCString &s,int startPos)
return brCount==0 ? e : -1;
}
+static int findTemplateSpecializationPosition(const char *name)
+{
+ if (name==0 || name[0]=='\0') return 0;
+ int l = strlen(name);
+ if (name[l-1]=='>') // search backward to find the matching <, allowing nested <...> and strings.
+ {
+ int count=1;
+ int i=l-2;
+ char insideQuote=0;
+ while (count>0 && i>=0)
+ {
+ char c = name[i--];
+ switch (c)
+ {
+ case '>': if (!insideQuote) count++; break;
+ case '<': if (!insideQuote) count--; break;
+ case '\'': if (!insideQuote) insideQuote=c;
+ else if (insideQuote==c && (i<0 || name[i]!='\\')) insideQuote=0;
+ break;
+ case '"': if (!insideQuote) insideQuote=c;
+ else if (insideQuote==c && (i<0 || name[i]!='\\')) insideQuote=0;
+ break;
+ default: break;
+ }
+ }
+ if (i>=0) l=i+1;
+ }
+ return l;
+}
+
static bool findClassRelation(
const Entry *root,
Definition *context,
@@ -4316,15 +4337,9 @@ static bool findClassRelation(
qPrint(templSpec)
);
- int i=baseClassName.find('<');
- int si=baseClassName.findRev("::",i==-1 ? baseClassName.length() : i);
+ int i=findTemplateSpecializationPosition(baseClassName);
+ int si=baseClassName.findRev("::",i);
if (si==-1) si=0;
- if (baseClass==0 && (root->lang==SrcLangExt_CSharp || root->lang==SrcLangExt_Java))
- {
- // for Java/C# strip the template part before looking for matching
- baseClass = toClassDefMutable(Doxygen::genericsDict->find(baseClassName.left(i)));
- //printf("looking for '%s' result=%p\n",baseClassName.data(),baseClass);
- }
if (baseClass==0 && i!=-1)
// base class has template specifiers
{
@@ -4396,6 +4411,7 @@ static bool findClassRelation(
found = baseClass!=0 && baseClass!=cd;
}
+ //printf("3. found=%d\n",found);
if (!found)
{
// for PHP the "use A\B as C" construct map class C to A::B, so we lookup
@@ -4412,7 +4428,7 @@ static bool findClassRelation(
// warning: the following line doesn't work for Mixin classes (see bug 560623)
// templSpec = getCanonicalTemplateSpec(cd, cd->getFileDef(), templSpec);
- //printf("3. found=%d\n",found);
+ //printf("4. found=%d\n",found);
if (found)
{
Debug::print(Debug::Classes,0," Documented base class '%s' templSpec=%s\n",qPrint(biName),qPrint(templSpec));
@@ -10047,7 +10063,6 @@ void initDoxygen()
Doxygen::memGrpInfoDict.setAutoDelete(TRUE);
Doxygen::tagDestinationDict.setAutoDelete(TRUE);
Doxygen::dirRelations.setAutoDelete(TRUE);
- Doxygen::genericsDict = new GenericsSDict;
Doxygen::indexList = new IndexList;
// initialisation of these globals depends on
@@ -10080,7 +10095,6 @@ void cleanUpDoxygen()
SectionManager::instance().clear();
delete Doxygen::indexList;
- delete Doxygen::genericsDict;
delete Doxygen::inputNameLinkedMap;
delete Doxygen::includeNameLinkedMap;
delete Doxygen::exampleNameLinkedMap;
diff --git a/src/doxygen.h b/src/doxygen.h
index a9a708d..76b8ef9 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -139,7 +139,6 @@ class Doxygen
static int subpageNestingLevel;
static QCString spaces;
static bool generatingXmlOutput;
- static GenericsSDict *genericsDict;
static DefinesPerFileList macroDefinitions;
static bool clangAssistedParsing;
};
diff --git a/src/markdown.cpp b/src/markdown.cpp
index 0cf8b87..4a40a35 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -2073,7 +2073,7 @@ void Markdown::writeOneLineHeaderOrRuler(const char *data,int size)
{
if (!id.isEmpty())
{
- m_out.addStr("\\anchor "+id+"\n");
+ m_out.addStr("\\anchor "+id+"\\ilinebr ");
}
hTag.sprintf("h%d",level);
m_out.addStr("<"+hTag+">");