diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2005-05-16 10:07:22 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2005-05-16 10:07:22 (GMT) |
commit | 530402f723b5426086bc8efdb9b7c6513e2ed3fa (patch) | |
tree | 4031df0b930759962f9126116d333cec031ca5cb /src | |
parent | 5bd970b12ec39636593453d12e5b64bd935bbf38 (diff) | |
download | Doxygen-530402f723b5426086bc8efdb9b7c6513e2ed3fa.zip Doxygen-530402f723b5426086bc8efdb9b7c6513e2ed3fa.tar.gz Doxygen-530402f723b5426086bc8efdb9b7c6513e2ed3fa.tar.bz2 |
Release-1.4.3
Diffstat (limited to 'src')
-rw-r--r-- | src/classdef.cpp | 4 | ||||
-rw-r--r-- | src/classdef.h | 1 | ||||
-rw-r--r-- | src/code.l | 2 | ||||
-rw-r--r-- | src/commentscan.l | 5 | ||||
-rw-r--r-- | src/config.l | 3 | ||||
-rw-r--r-- | src/definition.cpp | 6 | ||||
-rw-r--r-- | src/doctokenizer.l | 2 | ||||
-rw-r--r-- | src/doxygen.cpp | 202 | ||||
-rw-r--r-- | src/htags.cpp | 2 | ||||
-rw-r--r-- | src/latexdocvisitor.cpp | 5 | ||||
-rw-r--r-- | src/latexgen.cpp | 5 | ||||
-rw-r--r-- | src/memberdef.cpp | 29 | ||||
-rw-r--r-- | src/memberdef.h | 1 | ||||
-rw-r--r-- | src/scanner.l | 2 | ||||
-rw-r--r-- | src/translator_ca.h | 69 | ||||
-rw-r--r-- | src/translator_de.h | 62 | ||||
-rw-r--r-- | src/translator_lt.h | 138 | ||||
-rw-r--r-- | src/translator_pl.h | 20 | ||||
-rw-r--r-- | src/util.cpp | 107 | ||||
-rw-r--r-- | src/util.h | 2 |
20 files changed, 351 insertions, 316 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index 4aed1ee..dd419bb 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -876,7 +876,7 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType { if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || !documentation().isEmpty() || - /*(Config_getBool("SOURCE_BROWSER") && startBodyLine!=-1 && bodyDef) ||*/ + (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef()) || exampleFlag) { ol.writeRuler(); @@ -2455,7 +2455,7 @@ void ClassDef::determineImplUsageRelation() QCString usedClassName; QCString templSpec; bool found=FALSE; - while (extractClassNameFromType(type,pos,usedClassName,templSpec) && !found) + while (extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1 && !found) { //printf("usedClassName=`%s' templSpec=%s\n",usedClassName.data(),templSpec.data()); // check if usedClassName is a template argument of its class diff --git a/src/classdef.h b/src/classdef.h index 81d7bf2..ce572ee 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -305,6 +305,7 @@ class ClassDef : public Definition void setIsStatic(bool b) { m_isStatic=b; } void setIsObjectiveC(bool b) { m_isObjC=b; } void addListReferences(); + void setCompoundType(CompoundType t) { m_compType = t; } /*! Creates a new compound definition. * \param fileName full path and file name in which this compound was @@ -627,7 +627,7 @@ static ClassDef *stripClassName(const char *s) QCString type = s; QCString className; QCString templSpec; - while (extractClassNameFromType(type,pos,className,templSpec)) + while (extractClassNameFromType(type,pos,className,templSpec)!=-1) { QCString clName=className+templSpec; ClassDef *cd=0; diff --git a/src/commentscan.l b/src/commentscan.l index e8f3725..31a7c52 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -501,10 +501,10 @@ static void checkFormula(); static void prependScope() { +#if 0 Entry *current_root = current->parent; if (current_root && current_root->section & Entry::SCOPE_MASK) { - //printf("--- prependScope %s to %s\n",current_root->name.data(),current->name.data()); current->name.prepend(current_root->name+"::"); if (current_root->tArgLists) { @@ -513,7 +513,6 @@ static void prependScope() current->tArgLists = new QList<ArgumentList>; current->tArgLists->setAutoDelete(TRUE); } - //printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count()); QListIterator<ArgumentList> talsi(*current_root->tArgLists); ArgumentList *srcAl=0; for (talsi.toLast();(srcAl=talsi.current());--talsi) @@ -525,12 +524,12 @@ static void prependScope() for (;(a=tali.current());++tali) { dstAl->append(new Argument(*a)); - //printf("appending argument %s %s\n",a->type.data(),a->name.data()); } current->tArgLists->insert(0,dstAl); } } } +#endif } static void addSection() diff --git a/src/config.l b/src/config.l index 43bfb32..bfe0e13 100644 --- a/src/config.l +++ b/src/config.l @@ -1940,7 +1940,8 @@ void Config::create() "If the USE_HTAGS tag is set to YES then the references to source code \n" "will point to the HTML generated by the htags(1) tool instead of doxygen \n" "built-in source browser. The htags tool is part of GNU's global source \n" - "tagging system (see http://www.gnu.org/software/global/global.html) \n", + "tagging system (see http://www.gnu.org/software/global/global.html). You \n" + "will need version 4.8.6 or higher. \n", FALSE ); cb->addDependency("SOURCE_BROWSER"); diff --git a/src/definition.cpp b/src/definition.cpp index 635302d..b9d7104 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -369,7 +369,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { QCString lineStr,anchorStr; lineStr.sprintf("%d",m_startBodyLine); - anchorStr.sprintf(Htags::useHtags ? "%d" : "l%05d",m_startBodyLine); + anchorStr.sprintf(Htags::useHtags ? "L%d" : "l%05d",m_startBodyLine); ol.newParagraph(); if (lineMarkerPos<fileMarkerPos) // line marker before file marker { @@ -586,10 +586,12 @@ bool Definition::hasDocumentation() const { static bool extractAll = Config_getBool("EXTRACT_ALL"); static bool sourceBrowser = Config_getBool("SOURCE_BROWSER"); - return !m_doc.isEmpty() || // has detailed docs + bool hasDocs = + !m_doc.isEmpty() || // has detailed docs !m_brief.isEmpty() || // has brief description extractAll || // extract everything (sourceBrowser && m_startBodyLine!=-1 && m_bodyDef); // link to definition + return hasDocs; } void Definition::addSourceReferencedBy(MemberDef *md) diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 8810ba4..7cca73b 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -701,7 +701,7 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"))*({ID}(":")?){FUNCARG}? unput(*yytext); return 0; } -<St_IntRef>[A-Z_a-z0-9.:/#\-\+]+ { +<St_IntRef>[A-Z_a-z0-9.:/#\-\+\(\)]+ { g_token->name = yytext; return TK_WORD; } diff --git a/src/doxygen.cpp b/src/doxygen.cpp index d49e706..9b493d4 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -640,6 +640,40 @@ ArgumentList *getTemplateArgumentsFromName( return ali.current(); } +static ClassDef::CompoundType convertToCompoundType(int section) +{ + ClassDef::CompoundType sec=ClassDef::Class; + switch(section) + { + case Entry::UNION_SEC: + case Entry::UNIONDOC_SEC: + sec=ClassDef::Union; + break; + case Entry::STRUCT_SEC: + case Entry::STRUCTDOC_SEC: + sec=ClassDef::Struct; + break; + case Entry::INTERFACE_SEC: + case Entry::INTERFACEDOC_SEC: + sec=ClassDef::Interface; + break; + case Entry::PROTOCOL_SEC: + case Entry::PROTOCOLDOC_SEC: + sec=ClassDef::Protocol; + break; + case Entry::CATEGORY_SEC: + case Entry::CATEGORYDOC_SEC: + sec=ClassDef::Category; + break; + case Entry::EXCEPTION_SEC: + case Entry::EXCEPTIONDOC_SEC: + sec=ClassDef::Exception; + break; + } + return sec; +} + + static void addClassToContext(Entry *root) { // QCString fullName=removeRedundantWhiteSpace(root->name); @@ -667,13 +701,9 @@ static void addClassToContext(Entry *root) // see if the using statement was found inside a namespace or inside // the global file scope. QCString scName; - if (root->parent->section == Entry::NAMESPACE_SEC) + if (root->parent->section&Entry::SCOPE_MASK) { scName=root->parent->name; - // if (!scName.isEmpty()) - // { - // nd = getResolvedNamespace(scName); - // } } QCString fullName = root->name; @@ -681,8 +711,8 @@ static void addClassToContext(Entry *root) ClassDef *cd = getClass(qualifiedName); - Debug::print(Debug::Classes,0, " Found class with name %s (cd=%p)\n", - cd ? cd->name().data() : root->name.data(), cd); + Debug::print(Debug::Classes,0, " Found class with name %s (qualifiedName=%s -> cd=%p)\n", + cd ? cd->name().data() : root->name.data(), qualifiedName.data(),cd); if (cd) { @@ -740,38 +770,12 @@ static void addClassToContext(Entry *root) getTemplateArgumentsFromName(cd->name(),root->tArgLists); cd->setTemplateArguments(tArgList); } + + cd->setCompoundType(convertToCompoundType(root->section)); } else // new class { - - ClassDef::CompoundType sec=ClassDef::Class; - switch(root->section) - { - case Entry::UNION_SEC: - case Entry::UNIONDOC_SEC: - sec=ClassDef::Union; - break; - case Entry::STRUCT_SEC: - case Entry::STRUCTDOC_SEC: - sec=ClassDef::Struct; - break; - case Entry::INTERFACE_SEC: - case Entry::INTERFACEDOC_SEC: - sec=ClassDef::Interface; - break; - case Entry::PROTOCOL_SEC: - case Entry::PROTOCOLDOC_SEC: - sec=ClassDef::Protocol; - break; - case Entry::CATEGORY_SEC: - case Entry::CATEGORYDOC_SEC: - sec=ClassDef::Category; - break; - case Entry::EXCEPTION_SEC: - case Entry::EXCEPTIONDOC_SEC: - sec=ClassDef::Exception; - break; - } + ClassDef::CompoundType sec = convertToCompoundType(root->section); Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n", fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1); QCString className; @@ -3194,7 +3198,7 @@ static void findUsedClassesForClass(Entry *root, type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs); } //printf(" template substitution gives=%s\n",type.data()); - while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec)) + while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1) { //printf(" found used class %s\n",usedClassName.data()); // the name could be a type definition, resolve it @@ -3326,47 +3330,42 @@ static void findBaseClassesForClass( BaseInfo *bi=0; for (bii.toFirst();(bi=bii.current());++bii) { - //printf("masterCd=%s bi->name=%s\n",masterCd->localName().data(),bi->name.data()); - //if ( masterCd->localName()!=bi->name.left(masterCd->localName().length()) - // || bi->name.at(masterCd->localName().length())!='<' - // ) // to avoid recursive lock-up in cases like - // // template<typename T> class A : public A<typename T::B> - //{ - bool delTempNames=FALSE; - if (templateNames==0) - { - templateNames = getTemplateArgumentsInName(formalArgs,bi->name); - delTempNames=TRUE; - } - BaseInfo tbi(bi->name,bi->prot,bi->virt); - if (actualArgs) // substitute the formal template arguments of the base class - { - tbi.name = substituteTemplateArgumentsInString(bi->name,formalArgs,actualArgs); - } - //printf("bi->name=%s tbi.name=%s\n",bi->name.data(),tbi.name.data()); + //printf("masterCd=%s bi->name=%s #actualArgs=%d\n", + // masterCd->localName().data(),bi->name.data(),actualArgs?(int)actualArgs->count():-1); + bool delTempNames=FALSE; + if (templateNames==0) + { + templateNames = getTemplateArgumentsInName(formalArgs,bi->name); + delTempNames=TRUE; + } + BaseInfo tbi(bi->name,bi->prot,bi->virt); + if (actualArgs) // substitute the formal template arguments of the base class + { + tbi.name = substituteTemplateArgumentsInString(bi->name,formalArgs,actualArgs); + } + //printf("bi->name=%s tbi.name=%s\n",bi->name.data(),tbi.name.data()); - if (mode==DocumentedOnly) + if (mode==DocumentedOnly) + { + // find a documented base class in the correct scope + if (!findClassRelation(root,context,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial)) { - // find a documented base class in the correct scope - if (!findClassRelation(root,context,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial)) + if (!Config_getBool("HIDE_UNDOC_RELATIONS")) { - if (!Config_getBool("HIDE_UNDOC_RELATIONS")) - { - // no documented base class -> try to find an undocumented one - findClassRelation(root,context,instanceCd,&tbi,templateNames,Undocumented,isArtificial); - } + // no documented base class -> try to find an undocumented one + findClassRelation(root,context,instanceCd,&tbi,templateNames,Undocumented,isArtificial); } } - else if (mode==TemplateInstances) - { - findClassRelation(root,context,instanceCd,&tbi,templateNames,TemplateInstances,isArtificial); - } - if (delTempNames) - { - delete templateNames; - templateNames=0; - } - //} + } + else if (mode==TemplateInstances) + { + findClassRelation(root,context,instanceCd,&tbi,templateNames,TemplateInstances,isArtificial); + } + if (delTempNames) + { + delete templateNames; + templateNames=0; + } } } @@ -3413,7 +3412,8 @@ static bool findTemplateInstanceRelation(Entry *root, Entry *templateRoot = classEntries.find(templateClass->name()); if (templateRoot) { - Debug::print(Debug::Classes,0," template root found %s!\n",templateRoot->name.data()); + Debug::print(Debug::Classes,0," template root found %s templSpec=%s!\n", + templateRoot->name.data(),templSpec.data()); ArgumentList *templArgs = new ArgumentList; stringToArgumentList(templSpec,templArgs); findBaseClassesForClass(templateRoot,context,templateClass,instanceClass, @@ -3644,10 +3644,14 @@ static bool findClassRelation( } else { - baseClass=new ClassDef(root->fileName,root->startLine, - baseClassName,ClassDef::Class); - Doxygen::classSDict.append(baseClassName,baseClass); - if (isArtificial) baseClass->setClassIsArtificial(); + baseClass=Doxygen::classSDict.find(baseClassName); + if (baseClass==0) + { + baseClass=new ClassDef(root->fileName,root->startLine, + baseClassName,ClassDef::Class); + Doxygen::classSDict.append(baseClassName,baseClass); + if (isArtificial) baseClass->setClassIsArtificial(); + } } // add base class to this class cd->insertBaseClass(baseClass,biName,bi->prot,bi->virt,templSpec); @@ -4432,33 +4436,28 @@ static void findMember(Entry *root, do { done=TRUE; - if (funcDecl.left(7)=="friend ") // treat friends as related members + if (funcDecl.stripPrefix("friend ")) // treat friends as related members { - funcDecl=funcDecl.right(funcDecl.length()-7); isFriend=TRUE; done=FALSE; } - if (funcDecl.left(7)=="inline ") + if (funcDecl.stripPrefix("inline ")) { - funcDecl=funcDecl.right(funcDecl.length()-7); root->memSpec|=Entry::Inline; done=FALSE; } - if (funcDecl.left(9)=="explicit ") + if (funcDecl.stripPrefix("explicit ")) { - funcDecl=funcDecl.right(funcDecl.length()-9); root->memSpec|=Entry::Explicit; done=FALSE; } - if (funcDecl.left(8)=="mutable ") + if (funcDecl.stripPrefix("mutable ")) { - funcDecl=funcDecl.right(funcDecl.length()-8); root->memSpec|=Entry::Mutable; done=FALSE; } - if (funcDecl.left(8)=="virtual ") + if (funcDecl.stripPrefix("virtual ")) { - funcDecl=funcDecl.right(funcDecl.length()-7); done=FALSE; } } while (!done); @@ -4521,7 +4520,8 @@ static void findMember(Entry *root, if (root->relates.isEmpty() && root->parent && (root->parent->section&Entry::SCOPE_MASK) && - !root->parent->name.isEmpty()) + !root->parent->name.isEmpty()) // see if we can combine scopeName + // with the scope in which it was found { QCString joinedName = root->parent->name+"::"+scopeName; if (!scopeName.isEmpty() && @@ -4534,6 +4534,30 @@ static void findMember(Entry *root, scopeName = mergeScopes(root->parent->name,scopeName); } } + else // see if we can prefix a namespace or class that is used from the file + { + bool ambig; + FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); + if (fd) + { + NamespaceSDict *fnl = fd->getUsedNamespaces(); + if (fnl) + { + QCString joinedName; + NamespaceDef *fnd; + NamespaceSDict::Iterator nsdi(*fnl); + for (nsdi.toFirst();(fnd=nsdi.current());++nsdi) + { + joinedName = fnd->name()+"::"+scopeName; + if (Doxygen::namespaceSDict[joinedName]) + { + scopeName=joinedName; + break; + } + } + } + } + } scopeName=stripTemplateSpecifiersFromScope( removeRedundantWhiteSpace(scopeName),FALSE,&funcSpec); diff --git a/src/htags.cpp b/src/htags.cpp index 681e5b8..56b0a2d 100644 --- a/src/htags.cpp +++ b/src/htags.cpp @@ -66,7 +66,7 @@ bool Htags::execute(const QCString &htmldir) /* * Construct command line for htags(1). */ - QCString commandLine = " -g -s -a -n"; + QCString commandLine = " -g -s -a -n "; if (!quiet) commandLine += "-v "; if (warnings) commandLine += "-w "; if (!htagsOptions.isEmpty()) diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 8cbefc0..719c357 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -124,8 +124,9 @@ void LatexDocVisitor::visit(DocSymbol *s) { case DocSymbol::BSlash: m_t << "$\\backslash$"; break; case DocSymbol::At: m_t << "@"; break; - case DocSymbol::Less: m_t << "$<$"; break; - case DocSymbol::Greater: m_t << "$>$"; break; + case DocSymbol::Less: if (m_insidePre) m_t << "<"; else m_t << "$<$"; + break; + case DocSymbol::Greater: if (m_insidePre) m_t << ">"; else m_t << "$>$"; break; case DocSymbol::Amp: m_t << "\\&"; break; case DocSymbol::Dollar: m_t << "\\$"; break; case DocSymbol::Hash: m_t << "\\#"; break; diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 90384ec..cf19c9b 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -229,9 +229,12 @@ static void writeDefaultHeaderPart1(QTextStream &t) "\\usepackage{alltt}\n" //"\\usepackage{ae,aecompl,aeguill}\n" ; - if (Config_getBool("PDF_HYPERLINKS")) + if (Config_getBool("USE_PDFLATEX")) { t << "\\usepackage{times}" << endl; + } + if (Config_getBool("PDF_HYPERLINKS")) + { t << "\\ifx\\pdfoutput\\undefined" << endl << "\\usepackage[ps2pdf," << endl << " pagebackref=true," << endl diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 36079fd..ee96ff1 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -1943,7 +1943,7 @@ void MemberDef::warnIfUndocumented() // d->isLinkable(),isLinkable(),isDocumentedFriendClass(), // name().data(),prot); if (!isLinkable() && - !isDocumentedFriendClass() && + !isFriendClass() && name().find('@')==-1 && d->name().find('@')==-1 && (prot!=Private || Config_getBool("EXTRACT_PRIVATE")) ) @@ -1960,13 +1960,21 @@ void MemberDef::warnIfUndocumented() // *enumDeclList+=ed; //} -bool MemberDef::isDocumentedFriendClass() const +bool MemberDef::isFriendClass() const { - ClassDef *fcd=0; return (isFriend() && (type=="friend class" || type=="friend struct" || - type=="friend union") && - (fcd=getClass(name())) && fcd->isLinkable()); + type=="friend union")); +} + +bool MemberDef::isDocumentedFriendClass() const +{ + ClassDef *fcd=0; + QCString baseName=name(); + int i=baseName.find('<'); + if (i!=-1) baseName=baseName.left(i); + return (isFriendClass() && + (fcd=getClass(baseName)) && fcd->isLinkable()); } bool MemberDef::hasDocumentation() const @@ -2125,6 +2133,7 @@ void MemberDef::addListReference(Definition *) } QCString memName = name(); Definition *pd=getOuterScope(); + QCString memArgs; if (!isRelated() && ( (!hideScopeNames && // there is a scope @@ -2135,19 +2144,25 @@ void MemberDef::addListReference(Definition *) ) ) { - if (optimizeOutputJava) + if (isObjCMethod()) + { + memName = "[" + pd->name() + " " + name() + "]"; + } + else if (optimizeOutputJava) { memName.prepend(pd->name()+"."); + memArgs = argsString(); } else { memName.prepend(pd->name()+"::"); + memArgs = argsString(); } } if (xrefListItems()) { addRefItem(xrefListItems(),memLabel, - getOutputFileBase()+"#"+anchor(),memName,argsString()); + getOutputFileBase()+"#"+anchor(),memName,memArgs); } else { diff --git a/src/memberdef.h b/src/memberdef.h index 6b5c3bf..70c69ac 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -156,6 +156,7 @@ class MemberDef : public Definition bool isBriefSectionVisible() const; bool isDetailedSectionVisible(bool inGroup,bool inFile) const; bool isDetailedSectionLinkable() const; + bool isFriendClass() const; bool isDocumentedFriendClass() const; // set functions diff --git a/src/scanner.l b/src/scanner.l index dfe8777..f56d880 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -2358,6 +2358,7 @@ IDLATTR ("["[^\]]*"]"){BN}* } } <ReadBody>"}"{BN}+"typedef"{BN}+ { //err("ReadBody count=%d\n",curlyCount); + lineCount(); if ( curlyCount>0 ) { current->program += yytext ; @@ -2365,7 +2366,6 @@ IDLATTR ("["[^\]]*"]"){BN}* } else { - lineCount(); isTypedef = TRUE; current->endBodyLine = yyLineNr; QCString &cn = current->name; diff --git a/src/translator_ca.h b/src/translator_ca.h index 3980309..4676a6c 100644 --- a/src/translator_ca.h +++ b/src/translator_ca.h @@ -39,7 +39,7 @@ // Translator class (by the local maintainer) when the localized // translator is made up-to-date again. -class TranslatorCatalan : public TranslatorAdapter_1_4_1 +class TranslatorCatalan : public Translator { public: @@ -189,10 +189,6 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 virtual QCString trFileList() { return "Llista dels Fitxers"; } - /*! This is put above each page as a link to the list of all verbatim headers */ - virtual QCString trHeaderFiles() - { return "Fitxers d'encapēalaments"; } - /*! This is put above each page as a link to all members of compounds. */ virtual QCString trCompoundMembers() { @@ -324,10 +320,6 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 return result; } - /*! This is an introduction to the page with the list of all header files. */ - virtual QCString trHeaderFilesDescription() - { return "Aquests són els fitxers d'encapēalament que constitueixen l'API:"; } - /*! This is an introduction to the page with the list of all examples */ virtual QCString trExamplesDescription() { return "Aquesta és la llista de tots els exemples:"; } @@ -339,12 +331,6 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 /*! This is an introduction to the page with the list of class/file groups */ virtual QCString trModulesDescription() { return "Aquesta és la llista de mņduls:"; } - - /*! This sentences is used in the annotated class/file lists if no brief - * description is given. - */ - virtual QCString trNoDescriptionAvailable() - { return "No hi ha cap descripció disponible"; } // index titles (the project name is prepended for these) @@ -496,12 +482,6 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 { return "Documentació dels Tipus de les Enumeracions"; } /*! This is used in the documentation of a file/namespace before the list - * of documentation blocks for enumeration values - */ - virtual QCString trEnumerationValueDocumentation() - { return "Documentació dels Valors de les Enumeracions"; } - - /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for functions */ virtual QCString trFunctionDocumentation() @@ -555,18 +535,10 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 virtual QCString trForInternalUseOnly() { return "Tan sols per a śs intern."; } - /*! this text is generated when the \\reimp command is used. */ - virtual QCString trReimplementedForInternalReasons() - { return "Reimplementat per raons internes; l'API no es veu afectada."; } - /*! this text is generated when the \\warning command is used. */ virtual QCString trWarning() { return "Atenció"; } - /*! this text is generated when the \\bug command is used. */ - virtual QCString trBugsAndLimitations() - { return "Errors i limitacions"; } - /*! this text is generated when the \\version command is used. */ virtual QCString trVersion() { return "Versió"; } @@ -845,10 +817,6 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 // new since 0.49-991003 ////////////////////////////////////////////////////////////////////////// - virtual QCString trSources() - { - return "Codi Font"; - } virtual QCString trDefinedAtLineInSourceFile() { return "Definició a la lķnia @0 del fitxer @1."; @@ -1148,11 +1116,6 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 // new since 1.2.4 ////////////////////////////////////////////////////////////////////////// - /*! Used for Java interfaces in the summary section of Java packages */ - virtual QCString trInterfaces() - { - return "Interfķcies"; - } /*! Used for Java classes in the summary section of Java packages */ virtual QCString trClasses() { @@ -1185,11 +1148,6 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 { return "Paquets"; } - /*! Used as a chapter title for Latex & RTF output */ - virtual QCString trPackageDocumentation() - { - return "Documentació dels Paquets"; - } /*! Text shown before a multi-line define */ virtual QCString trDefineValue() { @@ -1330,17 +1288,6 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trField(bool first_capital, bool singular) - { - QCString result((first_capital ? "Camp" : "camp")); - if (!singular) result+="s"; - return result; - } - - /*! This is used for translation of the word that will possibly - * be followed by a single name or by a list of names - * of the category. - */ virtual QCString trGlobal(bool first_capital, bool singular) { QCString result((first_capital ? "Global" : "global")); @@ -1596,6 +1543,20 @@ class TranslatorCatalan : public TranslatorAdapter_1_4_1 if (!singular) result+="s"; return result; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.4.1 +////////////////////////////////////////////////////////////////////////// + + /*! This text is added to the documentation when the \\overload command + * is used for a overloaded function. + */ + virtual QCString trOverloadText() + { + return "Aquesta és una funció membre sobrecarregada, " + "proveļda per conveničncia. Es diferencia de la funció " + "anterior només en els arguments que accepta."; + } }; #endif diff --git a/src/translator_de.h b/src/translator_de.h index cfa8896..7eccaf4 100644 --- a/src/translator_de.h +++ b/src/translator_de.h @@ -14,6 +14,8 @@ * input used in their production; they are not affected by this license. * * The translation into German was provided by + * Jens Seidel (jensseidel@users.sf.net) + * based on work from * Jens Breitenstein (Jens.Breitenstein@tlc.de) */ @@ -103,6 +105,9 @@ // - Changed Todo list translation as suggested in // http://bugzilla.gnome.org/show_bug.cgi?id=172818 // +// 2005/05/09 Jens Seidel (jensseidel@users.sourceforge.net) +// - Updated for "new since 1.4.3" version (removed unused methods) +// // Todo: // - see FIXME @@ -244,10 +249,6 @@ class TranslatorGerman : public Translator virtual QCString trFileList() { return "Auflistung der Dateien"; } - /*! This is put above each page as a link to the list of all verbatim headers */ - virtual QCString trHeaderFiles() - { return "Header-Dateien"; } - /*! This is put above each page as a link to all members of compounds. */ virtual QCString trCompoundMembers() { @@ -371,10 +372,6 @@ class TranslatorGerman : public Translator return result; } - /*! This is an introduction to the page with the list of all header files. */ - virtual QCString trHeaderFilesDescription() - { return "Hier folgen die Headerdateien, welche die API definieren:"; } - /*! This is an introduction to the page with the list of all examples */ virtual QCString trExamplesDescription() { return "Hier folgt eine Liste mit allen Beispielen:"; } @@ -387,12 +384,6 @@ class TranslatorGerman : public Translator virtual QCString trModulesDescription() { return "Hier folgt die Aufzählung aller Module:"; } - /*! This sentences is used in the annotated class/file lists if no brief - * description is given. - */ - virtual QCString trNoDescriptionAvailable() - { return "Keine Beschreibung verfügbar"; } - // index titles (the project name is prepended for these) /*! This is used in HTML as the title of index.html. */ @@ -538,12 +529,6 @@ class TranslatorGerman : public Translator { return "Dokumentation der Aufzählungstypen"; } /*! This is used in the documentation of a file/namespace before the list - * of documentation blocks for enumeration values - */ - virtual QCString trEnumerationValueDocumentation() - { return "Dokumentation des Wertebereiches der Aufzählungstypen"; } - - /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for functions */ virtual QCString trFunctionDocumentation() @@ -598,19 +583,10 @@ class TranslatorGerman : public Translator virtual QCString trForInternalUseOnly() { return "Nur für den internen Gebrauch."; } - /*! this text is generated when the \\reimp command is used. */ - virtual QCString trReimplementedForInternalReasons() - { return "Aus internen Gründen neu implementiert. " - "Das API wird davon nicht berührt."; } - /*! this text is generated when the \\warning command is used. */ virtual QCString trWarning() { return "Warnung"; } - /*! this text is generated when the \\bug command is used. */ - virtual QCString trBugsAndLimitations() - { return "Fehler und Einschränkungen"; } - /*! this text is generated when the \\version command is used. */ virtual QCString trVersion() { return "Version"; } @@ -895,11 +871,6 @@ class TranslatorGerman : public Translator // new since 0.49-991003 ////////////////////////////////////////////////////////////////////////// - virtual QCString trSources() - { - return "Quellen"; - } - virtual QCString trDefinedAtLineInSourceFile() { return "Definiert in Zeile @0 der Datei @1."; @@ -1243,12 +1214,6 @@ class TranslatorGerman : public Translator // new since 1.2.4 ////////////////////////////////////////////////////////////////////////// - /*! Used for Java interfaces in the summary section of Java packages */ - virtual QCString trInterfaces() - { - return "Schnittstellen"; - } - /*! Used for Java classes in the summary section of Java packages */ virtual QCString trClasses() { @@ -1282,12 +1247,6 @@ class TranslatorGerman : public Translator return "Pakete"; } - /*! Used as a chapter title for Latex & RTF output */ - virtual QCString trPackageDocumentation() - { - return "Paketdokumentation"; - } - /*! Text shown before a multi-line define */ virtual QCString trDefineValue() { @@ -1408,17 +1367,6 @@ class TranslatorGerman : public Translator * be followed by a single name or by a list of names * of the category. */ - virtual QCString trField(bool, bool singular) - { - QCString result("Feld"); - if (!singular) result+="er"; - return result; - } - - /*! This is used for translation of the word that will possibly - * be followed by a single name or by a list of names - * of the category. - */ virtual QCString trGlobal(bool first_capital, bool singular) { QCString result((first_capital ? "Global" : "global")); // FIXME diff --git a/src/translator_lt.h b/src/translator_lt.h index e23e492..d9549d5 100644 --- a/src/translator_lt.h +++ b/src/translator_lt.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2005 by Dimitri van Heesch. + * Copyright (C) 1997-2004 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby @@ -21,8 +21,10 @@ * if you have any suggestions drop us an email * ------------------------------------------- * Project start :13.May.2k4 - * Last Doxygen version covered : 1.3.6 - * Last revision : + * Last Doxygen version covered : 1.4.3 + * + * Revisions: + * Updated to 1.3.9 25.Oct.2k4 * */ @@ -30,7 +32,7 @@ #define TRANSLATOR_LT_H -class TranslatorLithuanian : public TranslatorAdapter_1_3_8 +class TranslatorLithuanian : public Translator { public: @@ -180,10 +182,6 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 virtual QCString trFileList() { return "Failai"; } - /*! This is put above each page as a link to the list of all verbatim headers */ - virtual QCString trHeaderFiles() - { return "Antraščių Failai"; } - /*! This is put above each page as a link to all members of compounds. */ virtual QCString trCompoundMembers() { @@ -316,10 +314,6 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 return result; } - /*! This is an introduction to the page with the list of all header files. */ - virtual QCString trHeaderFilesDescription() - { return "Antraščių failai, kurie sudaro API:"; } - /*! This is an introduction to the page with the list of all examples */ virtual QCString trExamplesDescription() { return "Visų pavyzdžių sąrašas:"; } @@ -332,15 +326,8 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 virtual QCString trModulesDescription() { return "Visų modulių sąrašas:"; } - /*! This sentences is used in the annotated class/file lists if no brief - * description is given. - */ - virtual QCString trNoDescriptionAvailable() - { return "Aprašymo nėra"; } - // index titles (the project name is prepended for these) - - + /*! This is used in HTML as the title of index.html. */ virtual QCString trDocumentation() { return "Dokumentacija"; } @@ -488,12 +475,6 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 { return "Išvardinimo Tipo Dokumentacija"; } /*! This is used in the documentation of a file/namespace before the list - * of documentation blocks for enumeration values - */ - virtual QCString trEnumerationValueDocumentation() - { return "Išvardinimo Reikšmių Dokumentacija"; } - - /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for functions */ virtual QCString trFunctionDocumentation() @@ -547,18 +528,10 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 virtual QCString trForInternalUseOnly() { return "Tiktai vidiniam naudojimui."; } - /*! this text is generated when the \\reimp command is used. */ - virtual QCString trReimplementedForInternalReasons() - { return "Reimplemented for internal reasons; the API is not affected."; }/*FIXME*/ - /*! this text is generated when the \\warning command is used. */ virtual QCString trWarning() { return "Įspėjimas"; } - /*! this text is generated when the \\bug command is used. */ - virtual QCString trBugsAndLimitations() - { return "Klaidos ir apribojimai"; } - /*! this text is generated when the \\version command is used. */ virtual QCString trVersion() { return "Versija"; } @@ -832,10 +805,6 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 // new since 0.49-991003 ////////////////////////////////////////////////////////////////////////// - virtual QCString trSources() - { - return "Šaltiniai";/*FIXME cia gali buti ir programos tekstai*/ - } virtual QCString trDefinedAtLineInSourceFile() { return "Apibrėžimas failo @1 eilutėje @0."; @@ -1142,11 +1111,6 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 // new since 1.2.4 ////////////////////////////////////////////////////////////////////////// - /*! Used for Java interfaces in the summary section of Java packages */ - virtual QCString trInterfaces() - { - return "Sąsajos"; - } /*! Used for Java classes in the summary section of Java packages */ virtual QCString trClasses() { @@ -1179,11 +1143,6 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 { return "Paketai"; } - /*! Used as a chapter title for Latex & RTF output */ - virtual QCString trPackageDocumentation() - { - return "Paketo Dokumentacija"; - } /*! Text shown before a multi-line define */ virtual QCString trDefineValue() { @@ -1328,18 +1287,6 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trField(bool first_capital, bool singular) - { - QCString result((first_capital ? "Lauka" : "lauka")); - if (!singular) result+="i"; - else result+="s"; - return result; - } - - /*! This is used for translation of the word that will possibly - * be followed by a single name or by a list of names - * of the category. - */ virtual QCString trGlobal(bool first_capital, bool singular) { QCString result((first_capital ? "Global" : "global")); @@ -1529,7 +1476,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 } else { - return "Surasti <b>$num</b> dokumentų, atitinkančių Jūsų užklausą. " + return "Surasta <b>$num</b> dokumentų, atitinkančių Jūsų užklausą. " "Pirmiausiai rodomi labiausiai tenkinantys užklausą."; } } @@ -1540,6 +1487,75 @@ class TranslatorLithuanian : public TranslatorAdapter_1_3_8 { return "Atitikmenys:"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.8 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in HTML as the title of page with source code for file filename + */ + virtual QCString trSourceFile(QCString& filename) + { + return filename + " išeities tekstas"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return "Direktorijų hierarchija"; } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return "Direktorijų dokumentacija"; } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return "Direktorijos"; } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return "Ši direktorjų strūktūra grubiai surikiuota abėcėlės tvarka:"; + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { QCString result=dirName; result+=" Directorijos aprašas"; return result; } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool singular) + { + QCString result((first_capital ? "Direktorij" : "direktorij")); + if (singular) result+="a"; else result+="os"; + return result; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.4.1 +////////////////////////////////////////////////////////////////////////// + + /*! This text is added to the documentation when the \\overload command + * is used for a overloaded function. + */ + virtual QCString trOverloadText() + { + return "Perkraunamas metodas sukurtas patogumui. " + "Jis skiriasi nuo aukščiau minėto tik argumetais."; + } + }; diff --git a/src/translator_pl.h b/src/translator_pl.h index ac4b16d..76a44ec 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -20,7 +20,7 @@ #ifndef TRANSLATOR_PL_H #define TRANSLATOR_PL_H -class TranslatorPolish : public TranslatorAdapter_1_4_1 +class TranslatorPolish : public Translator { private: /*! to avoid macro redefinition from translator_pl.h */ @@ -1537,9 +1537,10 @@ class TranslatorPolish : public TranslatorAdapter_1_4_1 * and the fact that it is sorted alphabetically per level */ virtual QCString trDirDescription() - { return "Ta struktura katalogów jest posortowana jest z grubsza, " + { + return "Ta struktura katalogów jest posortowana jest z grubsza, " "choę nie ca³kowicie, alfabetycznie:"; - } + } /*! This returns the title of a directory page. The name of the * directory is passed via \a dirName. @@ -1556,6 +1557,19 @@ class TranslatorPolish : public TranslatorAdapter_1_4_1 if (! singular) result+="i"; return result; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.4.1 +////////////////////////////////////////////////////////////////////////// + + /*! This text is added to the documentation when the \\overload command + * is used for a overloaded function. + */ + virtual QCString trOverloadText() + { + return "To jest metoda przeci±æona, udostźpniona dla wygody. " + "Róæni siź od powyæszej metody tylko zestawem akceptowanych argumentów."; + } }; #endif diff --git a/src/util.cpp b/src/util.cpp index e18190e..d0dcec6 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -2256,6 +2256,7 @@ void stripIrrelevantConstVolatile(QCString &s) //#define MATCH printf("Match at line %d\n",__LINE__); //#define NOMATCH printf("Nomatch at line %d\n",__LINE__); + static bool matchArgument(const Argument *srcA,const Argument *dstA, const QCString &className, const QCString &namespaceName, @@ -2627,6 +2628,7 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, return TRUE; // all arguments match } + static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *arg) { QCString type = arg->type; @@ -2655,42 +2657,51 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a static QRegExp id("[a-z_A-Z][:a-z_A-Z0-9]*"); - QCString canType; - int i,p=0,l; - while ((i=id.match(type,p,&l))!=-1) // foreach identifier in the type + QCString canType,templSpec,word; + int i,p=0,pp=0; + while ((i=extractClassNameFromType(type,p,word,templSpec))!=-1) + // foreach identifier in the type { - canType += type.mid(p,i-p); - QCString word = type.mid(i,l); - ClassDef *cd = getResolvedClass(d,fs,word,0,0,TRUE); - //printf("word %s => %s\n",word.data(),cd?cd->qualifiedName().data():"<none>"); + //printf(" i=%d p=%d\n",i,p); + canType += type.mid(pp,i-pp); + ClassDef *cd = 0; + if (!templSpec.isEmpty()) + { + cd = getResolvedClass(d,fs,word+templSpec,0,0,TRUE); + } + if (cd==0) + { + cd = getResolvedClass(d,fs,word,0,0,TRUE); + } + //printf(">>>> word '%s' => '%s'\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():"<none>"); if (cd) { - canType+=cd->qualifiedName(); + canType+=cd->qualifiedNameWithTemplateParameters(); } else { QCString resolvedType = resolveTypeDef(d,word); if (resolvedType.isEmpty()) { - int i=word.findRev("::"); - if (i!=-1) // strip scope if it cannot be resolved anyway - // TODO is this robust enough? - { - canType+=word.mid(i+2); - } - else - { - canType+=word; - } + //int i=word.findRev("::"); + //if (i!=-1) // strip scope if it cannot be resolved anyway + // // TODO is this robust enough? + //{ + // canType+=word.mid(i+2); + //} + //else + //{ + canType+=word+templSpec; + //} } else { canType+=resolvedType; } } - p=i+l; + pp=p; } - canType += type.right(type.length()-p); + canType += type.right(type.length()-pp); //printf("result = %s->%s\n",type.data(),canType.data()); return removeRedundantWhiteSpace(canType); @@ -3062,7 +3073,14 @@ bool getDefs(const QCString &scName,const QCString &memberName, //if (mmd->isLinkable()) //{ bool match=args==0 || +#ifdef NEW_MATCH + matchArguments2(mmd->getOuterScope(),md->getFileDef(),md->argumentList(), + fcd,fcd->getFileDef(),argList, + checkCV + ); +#else matchArguments(mmd->argumentList(),argList,className,0,checkCV); +#endif //printf("match=%d\n",match); if (match) { @@ -3175,8 +3193,15 @@ bool getDefs(const QCString &scName,const QCString &memberName, { argList=new ArgumentList; stringToArgumentList(args,argList); +#ifdef NEW_MATCH + match=matchArguments2( + mmd->getOuterScope(),mmd->getFileDef(),mmd->argumentList(), + fnd,mmd->getFileDef(),argList, + checkCV); +#else match=matchArguments(mmd->argumentList(),argList,0, namespaceName,checkCV); +#endif } if (match) { @@ -3255,7 +3280,14 @@ bool getDefs(const QCString &scName,const QCString &memberName, { argList=new ArgumentList; stringToArgumentList(args,argList); +#ifdef NEW_MATCH + match=matchArguments2( + md->getOuterScope(),fd,md->argumentList(), + Doxygen::globalScope,fd,argList, + checkCV); +#else match=matchArguments(md->argumentList(),argList,0,0,checkCV); +#endif delete argList; argList=0; } if (match) @@ -4417,10 +4449,11 @@ void addMembersToMemberGroup(MemberList *ml, } /*! Extracts a (sub-)string from \a type starting at \a pos that - * could form a class. When TRUE is returned the result is the - * class \a name and a template argument list \a templSpec. + * could form a class. The index of the match is returned and the found + * class \a name and a template argument list \a templSpec. If -1 is returned + * there are no more matches. */ -bool extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCString &templSpec) +int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCString &templSpec) { static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*"); name.resize(0); @@ -4453,17 +4486,25 @@ bool extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCStr te++; } } - if (te>ts) templSpec = type.mid(ts,te-ts),tl+=te-ts; name = type.mid(i,l); - pos=i+l+tl; + if (te>ts) + { + templSpec = type.mid(ts,te-ts),tl+=te-ts; + pos=i+l+tl; + } + else // no template part + { + pos=i+l; + } //printf("extractClassNameFromType([in] type=%s,[out] pos=%d,[out] name=%s,[out] templ=%s)=TRUE\n", // type.data(),pos,name.data(),templSpec.data()); - return TRUE; + return i; } } + pos = typeLen; //printf("extractClassNameFromType([in] type=%s,[out] pos=%d,[out] name=%s,[out] templ=%s)=FALSE\n", // type.data(),pos,name.data(),templSpec.data()); - return FALSE; + return -1; } /*! Substitutes any occurrence of a formal argument from argument list @@ -4500,9 +4541,10 @@ QCString substituteTemplateArgumentsInString( ++formAli,actArg=actualArgs->next() ) { - if (formArg->type=="class" || formArg->type=="typename") + //printf("formArg->type=%s\n",formArg->type.data()); + if (formArg->type=="class" || formArg->type=="typename" || formArg->type.left(8)=="template") { - //printf("n=%s formArg->type=%s formArg->name=%si formArg->defval=%s\n", + //printf("n=%s formArg->type='%s' formArg->name='%s' formArg->defval='%s'\n", // n.data(),formArg->type.data(),formArg->name.data(),formArg->defval.data()); if (formArg->name==n && actArg && !actArg->type.isEmpty()) // base class is a template argument { @@ -4526,6 +4568,13 @@ QCString substituteTemplateArgumentsInString( found=TRUE; } } + else if (formArg->name==n && actArg==0 && !formArg->defval.isEmpty() && + formArg->defval!=name /* to prevent recursion */ + ) + { + result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" "; + found=TRUE; + } } if (!found) result += n; p=i+l; @@ -184,7 +184,7 @@ QCString getOverloadDocs(); void addMembersToMemberGroup(MemberList *ml, MemberGroupSDict *memberGroupSDict, Definition *context); -bool extractClassNameFromType(const QCString &type,int &pos, +int extractClassNameFromType(const QCString &type,int &pos, QCString &name,QCString &templSpec); QCString substituteTemplateArgumentsInString( const QCString &name, |