diff options
-rw-r--r-- | INSTALL | 4 | ||||
-rw-r--r-- | README | 4 | ||||
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | src/code.l | 6 | ||||
-rw-r--r-- | src/commentscan.l | 10 | ||||
-rw-r--r-- | src/defargs.l | 10 | ||||
-rw-r--r-- | src/definition.cpp | 7 | ||||
-rw-r--r-- | src/doxygen.cpp | 110 | ||||
-rw-r--r-- | src/filedef.cpp | 1 | ||||
-rw-r--r-- | src/latexdocvisitor.cpp | 2 | ||||
-rw-r--r-- | src/memberdef.h | 1 | ||||
-rw-r--r-- | src/scanner.l | 8 | ||||
-rw-r--r-- | src/translator_id.h | 1 | ||||
-rw-r--r-- | src/util.cpp | 54 |
14 files changed, 141 insertions, 79 deletions
@@ -1,7 +1,7 @@ -DOXYGEN Version 1.4.3-20050615 +DOXYGEN Version 1.4.3-20050623 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (15 June 2005) +Dimitri van Heesch (23 June 2005) @@ -1,4 +1,4 @@ -DOXYGEN Version 1.4.3_20050615 +DOXYGEN Version 1.4.3_20050623 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (15 June 2005) +Dimitri van Heesch (dimitri@stack.nl) (23 June 2005) @@ -1 +1 @@ -1.4.3-20050615 +1.4.3-20050623 @@ -448,9 +448,9 @@ static void startCodeLine() //lineAnchor.sprintf("l%05d",g_yyLineNr); Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr); - //printf("startCodeLine %d d=%p\n",g_yyLineNr,d); + //printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>"); //g_code->startLineNumber(); - if (!g_includeCodeFragment && d && d->isLinkableInProject()) + if (!g_includeCodeFragment && d) { g_currentDefinition = d; g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr); @@ -476,7 +476,7 @@ static void startCodeLine() g_sourceFileDef->getSourceFileBase(), lineAnchor); } - else + else if (d->isLinkableInProject()) { g_code->writeLineNumber(d->getReference(), d->getOutputFileBase(), diff --git a/src/commentscan.l b/src/commentscan.l index 9181776..ff6e603 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -327,6 +327,7 @@ static Protection protection; static bool xrefAppendFlag; static bool inGroupParamFound; static int braceCount; +static bool insidePre; //----------------------------------------------------------------------------- @@ -618,6 +619,7 @@ static inline void setOutput(OutputContext ctx) break; } } + inContext = ctx; switch(inContext) { @@ -876,8 +878,13 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-] if (inContext!=OutputBrief) { addOutput(yytext); + setOutput(OutputDoc); + } + else + { + setOutput(OutputDoc); + addOutput(yytext); } - setOutput(OutputDoc); lineCount(); } <Comment>"." { // potential end of a JavaDoc style comment @@ -2099,6 +2106,7 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, needNewEntry = FALSE; xrefKind = XRef_None; xrefAppendFlag = FALSE; + insidePre = FALSE; outputXRef.resize(0); setOutput( isBrief || isJavaDocStyle ? OutputBrief : OutputDoc ); briefEndsAtDot = isJavaDocStyle; diff --git a/src/defargs.l b/src/defargs.l index c452c47..00c862f 100644 --- a/src/defargs.l +++ b/src/defargs.l @@ -402,6 +402,16 @@ void stringToArgumentList(const char *argsString,ArgumentList* &al) { if (al==0) return; if (argsString==0) return; + + g_copyArgValue=0; + g_curArgDocs.resize(0); + g_curArgAttrib.resize(0); + g_curArgArray.resize(0); + g_argRoundCount = 0; + g_argSharpCount = 0; + g_argCurlyCount = 0; + g_lastDocChar = 0; + g_inputString = argsString; g_inputPosition = 0; g_curArgTypeName.resize(0); diff --git a/src/definition.cpp b/src/definition.cpp index 381159b..9b0ee16 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -227,10 +227,15 @@ void Definition::setDocumentation(const char *d,const char *docFile,int docLine, void Definition::setBriefDescription(const char *b,const char *briefFile,int briefLine) { if (b==0) return; + static QCString outputLanguage = Config_getEnum("OUTPUT_LANGUAGE"); + static bool needsDot = outputLanguage!="Japanese" && + outputLanguage!="Chinese" && + outputLanguage!="Korean"; + //fprintf(stderr,"Definition::setBriefDescription(%s,%s,%d)\n",b,briefFile,briefLine); m_brief=QCString(b).stripWhiteSpace(); int bl=m_brief.length(); - if (bl>0) // add punctuation if needed + if (bl>0 && needsDot) // add punctuation if needed { switch(m_brief.at(bl-1)) { diff --git a/src/doxygen.cpp b/src/doxygen.cpp index d2b4303..e45f91c 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -699,19 +699,22 @@ static void addClassToContext(Entry *root) //NamespaceDef *nd = 0; FileDef *fd = findFileDef(Doxygen::inputNameDict,root->fileName,ambig); - // see if the using statement was found inside a namespace or inside - // the global file scope. QCString scName; if (root->parent->section&Entry::SCOPE_MASK) { scName=root->parent->name; } + // name without parent's scope QCString fullName = root->name; - QCString qualifiedName = scName.isEmpty() ? root->name : scName+"::"+root->name; - - ClassDef *cd = getClass(qualifiedName); + // strip off any template parameters (but not those for specializations) + fullName=stripTemplateSpecifiersFromScope(fullName); + // name with scope + QCString qualifiedName = scName.isEmpty() ? fullName : scName+"::"+fullName; + + ClassDef *cd = getClass(qualifiedName); + 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); @@ -1624,7 +1627,7 @@ static MemberDef *addVariableToFile( for (mni.toFirst();(md=mni.current());++mni) { if ( - ((nd==0 && md->getFileDef() && + ((nd==0 && md->getNamespaceDef()==0 && md->getFileDef() && root->fileName==md->getFileDef()->absFilePath() ) // both variable names in the same file || (nd!=0 && md->getNamespaceDef()==nd) // both in same namespace @@ -1633,12 +1636,16 @@ static MemberDef *addVariableToFile( ) // variable already in the scope { + Debug::print(Debug::Variables,0, + " variable already found: scope=%s\n",md->getOuterScope()->name().data()); addMemberDocs(root,md,def,0,FALSE); md->setRefItems(root->sli); return md; } } } + Debug::print(Debug::Variables,0, + " new variable!\n"); // new global variable, enum value or typedef MemberDef *md=new MemberDef( root->fileName,root->startLine, @@ -1658,6 +1665,7 @@ static MemberDef *addVariableToFile( md->setDefinition(def); md->enableCallGraph(root->callGraph); md->setExplicitExternal(root->explicitExternal); + md->setOuterScope(fd); if (!root->explicitExternal) { md->setBodySegment(root->bodyLine,root->endBodyLine); @@ -2378,6 +2386,7 @@ static void buildFunctionList(Entry *root) if (md->briefDescription().isEmpty() && !root->brief.isEmpty()) { md->setBriefDescription(root->brief,root->briefFile,root->briefLine); + md->setArgsString(root->args); } else if (!md->briefDescription().isEmpty() && !root->brief.isEmpty() && mnd==rnd) { @@ -3100,16 +3109,20 @@ static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,co FileDef *fd=cd->getFileDef(); ClassDef *result=0; - if (context) + if (context && cd!=context) { result = getResolvedClass(context,0,name); - //printf("** Trying to find %s within context %s result=%s\n", - // name.data(),context->name().data(),result ? result->name().data() : "<none>"); } if (result==0) { result = getResolvedClass(cd,fd,name); } + //printf("** Trying to find %s within context %s class %s result=%s\n", + // name.data(), + // context ? context->name().data() : "<none>", + // cd ? cd->name().data() : "<none>", + // result ? result->name().data() : "<none>" + // ); return result; } @@ -3165,19 +3178,22 @@ static void findUsedClassesForClass(Entry *root, { type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs); } + + QCString typeName = resolveTypeDef(masterCd,usedClassName); + //printf("*** Found resolved class %s for %s\n",typeName.data(),usedClassName.data()); + + if (!typeName.isEmpty()) // if we could resolve the typedef, use + // the result as the class name. + { + usedClassName=typeName; + } + //printf(" template substitution gives=%s\n",type.data()); 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 - QCString typeName = resolveTypeDef(masterCd,usedClassName); - //printf("*** Found resolved class %s for %s\n",typeName.data(),usedClassName.data()); - - if (!typeName.isEmpty()) // if we could resolve the typedef, use - // the result as the class name. - { - usedClassName=typeName; - } + //QCString typeName = resolveTypeDef(masterCd,usedClassName); int sp=usedClassName.find('<'); if (sp==-1) sp=0; @@ -3767,6 +3783,7 @@ static void computeClassRelations() for (;(root=edi.current());++edi) { ClassDef *cd; + // strip any annonymous scopes first QCString bName=stripAnonymousNamespaceScope(root->name); bName=stripTemplateSpecifiersFromScope(bName); @@ -4010,12 +4027,15 @@ static void addMemberDocs(Entry *root, if (al) { - //printf("merging arguments (1)\n"); - mergeArguments(md->argumentList(),al,TRUE); + //printf("merging arguments (1) docs=%d\n",root->doc.isEmpty()); + if (!root->doc.isEmpty()) + { + mergeArguments(md->argumentList(),al,TRUE); + } } else { - if ( + if ( !root->doc.isEmpty() && matchArguments2( md->getOuterScope(), md->getFileDef(), md->argumentList(), rscope,rfd,root->argList, TRUE @@ -4088,16 +4108,14 @@ static void addMemberDocs(Entry *root, md->setMaxInitLines(root->initLines); } - //if (md->bodyCode().isEmpty() && !root->body.isEmpty()) /* no body yet */ - //{ - // md->setBody(root->body); - //} if (rfd) { - if ((md->getStartBodyLine()==-1 && root->bodyLine!=-1) || - (md->isVariable() && !root->explicitExternal)) + if ((md->getStartBodyLine()==-1 && root->bodyLine!=-1) + // || (md->isVariable() && !root->explicitExternal) + ) { + //printf("Setting new body segment [%d,%d]\n",root->bodyLine,root->endBodyLine); md->setBodySegment(root->bodyLine,root->endBodyLine); md->setBodyDef(rfd); } @@ -4107,8 +4125,6 @@ static void addMemberDocs(Entry *root, md->enableCallGraph(md->hasCallGraph() || root->callGraph); - //md->setDefFile(root->fileName); - //md->setDefLine(root->startLine); md->mergeMemberSpecifiers(root->memSpec); md->addSectionsToDefinition(root->anchors); addMemberToGroups(root,md); @@ -4182,8 +4198,10 @@ static bool findGlobalMember(Entry *root, { bool ambig; NamespaceDef *nd=md->getNamespaceDef(); + //printf("Namespace namespaceName=%s nd=%s\n", // namespaceName.data(),nd ? nd->name().data() : "<none>"); + FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); //printf("File %s\n",fd ? fd->name().data() : "<none>"); NamespaceSDict *nl = fd ? fd->getUsedNamespaces() : 0; @@ -6021,15 +6039,15 @@ static void addSourceReferences() for (mni.toFirst();(md=mni.current());++mni) { //printf("class member %s\n",md->name().data()); - ClassDef *cd=md->getClassDef(); FileDef *fd=md->getBodyDef(); - if (fd && cd && cd->isLinkableInProject() && md->getStartBodyLine()!=-1 && - md->isLinkableInProject()) + if (fd && + md->getStartBodyLine()!=-1 && + md->isLinkableInProject() && + fd->generateSourceFile()) { - Definition *d=cd; - if (d==0) d=md->getNamespaceDef(); - if (d==0) d=md->getFileDef(); - fd->addSourceRef(md->getStartBodyLine(),d,md); + //printf("Found member `%s' in file `%s' at line `%d' def=%s\n", + // md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data()); + fd->addSourceRef(md->getStartBodyLine(),md->getOuterScope(),md); } } } @@ -6040,22 +6058,18 @@ static void addSourceReferences() MemberDef *md=0; for (mni.toFirst();(md=mni.current());++mni) { - NamespaceDef *nd=md->getNamespaceDef(); FileDef *fd=md->getBodyDef(); - GroupDef *gd=md->getGroupDef(); - //printf("member %s fd=%p nd=%p gd=%p\n",md->name().data(),fd,nd,gd); - if (fd && md->getStartBodyLine()!=-1 && md->isLinkableInProject() && - ((nd && nd->isLinkableInProject()) || - (fd->isLinkableInProject()) || - (gd && gd->isLinkableInProject()) - ) + //printf("member %s body=[%d,%d] fd=%p\n",md->name().data(), + // md->getStartBodyLine(),md->getEndBodyLine(),fd); + if (fd && + md->getStartBodyLine()!=-1 && + md->isLinkableInProject() && + fd->generateSourceFile() ) { - //printf("Found member `%s' in file `%s' at line `%d'\n", - // md->name().data(),fd->name().data(),md->getStartBodyLine()); - Definition *d=gd!=0 ? (Definition *)gd : - (nd!=0 ? (Definition *)nd : (Definition *)fd); - fd->addSourceRef(md->getStartBodyLine(),d,md); + //printf("Found member `%s' in file `%s' at line `%d' def=%s\n", + // md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data()); + fd->addSourceRef(md->getStartBodyLine(),md->getOuterScope(),md); } } } diff --git a/src/filedef.cpp b/src/filedef.cpp index 351d83b..46e0b6b 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -762,6 +762,7 @@ void FileDef::insertNamespace(NamespaceDef *nd) void FileDef::addSourceRef(int line,Definition *d,MemberDef *md) { + //printf("FileDef::addSourceDef(%d,%p,%p)\n",line,d,md); if (d) { if (srcDefDict==0) srcDefDict = new QIntDict<Definition>(257); diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index a72dd65..9afde53 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -170,7 +170,7 @@ void LatexDocVisitor::visit(DocSymbol *s) case DocSymbol::Szlig: m_t << "\"s"; break; case DocSymbol::Cedil: m_t << "\\c{" << s->letter() << "}"; break; case DocSymbol::Ring: m_t << "\\" << s->letter() << s->letter(); break; - case DocSymbol::Nbsp: m_t << "\\ "; break; + case DocSymbol::Nbsp: m_t << "~"; break; default: err("Error: unknown symbol found\n"); } diff --git a/src/memberdef.h b/src/memberdef.h index 70c69ac..9f69892 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -185,6 +185,7 @@ class MemberDef : public Definition void setHasDocumentedReturnType(bool b) { m_hasDocumentedReturnType = b; } void setInheritsDocsFrom(MemberDef *md) { m_docProvider = md; } void setTagInfo(TagInfo *i); + void setArgsString(const char *as) { args = as; } // output generation void writeDeclaration(OutputList &ol, diff --git a/src/scanner.l b/src/scanner.l index ddd839b..810a79b 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -2175,6 +2175,8 @@ IDLATTR ("["[^\]]*"]"){BN}* } current->name.resize(0); current->args.resize(0); + current->brief.resize(0); + current->doc.resize(0); current->initializer.resize(0); current->bitfields.resize(0); int i=oldType.length(); @@ -2709,7 +2711,7 @@ IDLATTR ("["[^\]]*"]"){BN}* fullArgString=current->args.copy(); copyArgString=¤t->args; BEGIN( ReadFuncArgType ) ; - //printf(">>> Read function arguments!\n"); + //printf(">>> Read function arguments current->argList->count()=%d\n",current->argList->count()); } } /* @@ -4047,6 +4049,10 @@ IDLATTR ("["[^\]]*"]"){BN}* <DocBlock>"//" { // slashes in the middle of a comment block docBlock+=yytext; } +<DocBlock>"/*" { // start of a new comment in the + // middle of a comment block + docBlock+=yytext; + } <DocBlock>("@@"|"\\\\"){ID}/[^a-z_A-Z0-9] { // escaped command docBlock+=yytext; } diff --git a/src/translator_id.h b/src/translator_id.h index a0d4b83..bd292c2 100644 --- a/src/translator_id.h +++ b/src/translator_id.h @@ -21,7 +21,6 @@ /*! Indonesian translator based on Doxygen 1.4.2. - \version $Id$ \author Hendy Irawan <ceefour@gauldong.net> */ class TranslatorIndonesian : public Translator diff --git a/src/util.cpp b/src/util.cpp index 679e0d3..881988e 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -2685,21 +2685,19 @@ static QCString getCanonicalTypeForIdentifier( Definition *d,FileDef *fs,const QCString &word, QCString *tSpec) { - QCString symName,scope,result,templSpec; + QCString symName,scope,result,templSpec,tmpName; DefinitionList *defList=0; if (tSpec) templSpec = *tSpec; - if (word.findRev("::")!=-1 && !(scope=stripScope(word)).isEmpty()) + if (word.findRev("::")!=-1 && !(tmpName=stripScope(word)).isEmpty()) { - symName=word.mid(scope.length()+2); + symName=tmpName; } else { symName=word; } - //printf("symName=%s templSpec=%s\n",symName.data(),templSpec.data()); - if (!symName.isEmpty() && !templSpec.isEmpty() && (defList=Doxygen::symbolMap->find(symName+templSpec)) && defList->count()==1) // word without scope but with template specs @@ -2715,6 +2713,7 @@ static QCString getCanonicalTypeForIdentifier( // unique symbol in the symbol map { QCString ts; + //printf("unique symName=%s\n",symName.data()); result = resolveSymbolName(fs,defList->first(),ts)+templSpec; } else // symbol not unique, try to find the one in the right scope @@ -2730,11 +2729,19 @@ static QCString getCanonicalTypeForIdentifier( { cd = getResolvedClass(d,fs,word,&mType,0,TRUE); } + //printf("symbol=%s word=%s cd=%s d=%s fs=%s\n", + // symName.data(), + // word.data(), + // cd?cd->name().data():"<none>", + // d?d->name().data():"<none>", + // fs?fs->name().data():"<none>" + // ); //printf(">>>> word '%s' => '%s'\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():"<none>"); if (cd) // known type { - result = cd->qualifiedNameWithTemplateParameters(); + //result = cd->qualifiedNameWithTemplateParameters(); + result = removeRedundantWhiteSpace(cd->qualifiedName()+templSpec); if (cd->isTemplate()) { *tSpec=""; @@ -2799,6 +2806,8 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a //printf(" i=%d p=%d\n",i,p); canType += type.mid(pp,i-pp); + //printf("word=%s templSpec=%s\n",word.data(),templSpec.data()); + canType += getCanonicalTypeForIdentifier(d,fs,word,&templSpec); if (!templSpec.isEmpty()) // if we didn't use up the templSpec already // (i.e. type is not a template specialization) @@ -2825,8 +2834,8 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a } static bool matchArgument2( - Definition *srcScope,FileDef *srcFileScope,const Argument *srcA, - Definition *dstScope,FileDef *dstFileScope,const Argument *dstA + Definition *srcScope,FileDef *srcFileScope,Argument *srcA, + Definition *dstScope,FileDef *dstFileScope,Argument *dstA ) { //printf(">> match argument: %s::`%s|%s' (%s) <-> %s::`%s|%s' (%s)\n", @@ -2840,18 +2849,26 @@ static bool matchArgument2( NOMATCH return FALSE; } + QCString sSrcName=" "+srcA->name; + QCString sDstName=" "+dstA->name; + if (sSrcName==dstA->type.right(sSrcName.length())) + { // case "unsigned int" <-> "unsigned int i" + srcA->type+=sSrcName; + srcA->name=""; + } + else if (sDstName==srcA->type.right(sDstName.length())) + { // case "unsigned int i" <-> "unsigned int" + dstA->type+=sDstName; + dstA->name=""; + } if (srcA->canType.isEmpty()) { - Argument *thatSrcA = (Argument*)srcA; // since canType is a cached value - // of type we do not really change the argument, but the - // compiler does know that. - thatSrcA->canType = extractCanonicalType(srcScope,srcFileScope,srcA); + srcA->canType = extractCanonicalType(srcScope,srcFileScope,srcA); } if (dstA->canType.isEmpty()) { - Argument *thatDstA = (Argument*)dstA; - thatDstA->canType = extractCanonicalType(dstScope,dstFileScope,dstA); + dstA->canType = extractCanonicalType(dstScope,dstFileScope,dstA); } if (srcA->canType==dstA->canType) @@ -2911,7 +2928,7 @@ bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *sr MATCH return TRUE; } - + if (srcAl->count() != dstAl->count()) { NOMATCH @@ -3010,19 +3027,20 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwr } else if (!srcA->name.isEmpty() && !dstA->name.isEmpty()) { + //printf("srcA->name=%s dstA->name=%s\n",srcA->name.data(),dstA->name.data()); if (forceNameOverwrite) { - srcA->name = dstA->name.copy(); + srcA->name = dstA->name; } else { if (srcA->docs.isEmpty() && !dstA->docs.isEmpty()) { - srcA->name = dstA->name.copy(); + srcA->name = dstA->name; } else if (!srcA->docs.isEmpty() && dstA->docs.isEmpty()) { - dstA->name = srcA->name.copy(); + dstA->name = srcA->name; } } } |