Commit d497898d authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.4.3-20050623

parent f160c0c8
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)
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.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(),
......
......@@ -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);
}
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;
......
......@@ -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);
......
......@@ -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))
{
......
......@@ -699,16 +699,19 @@ 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;
// 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);
......@@ -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,11 +3178,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)!=-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());
......@@ -3179,6 +3188,13 @@ static void findUsedClassesForClass(Entry *root,
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);
int sp=usedClassName.find('<');
if (sp==-1) sp=0;
int si=usedClassName.findRev("::",sp);
......@@ -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");
//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);
}
}
}
......
......@@ -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);
......
......@@ -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");
}
......
......@@ -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,
......
......@@ -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=&current->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;
}
......
......@@ -21,7 +21,6 @@
/*!
Indonesian translator based on Doxygen 1.4.2.
\version $Id$
\author Hendy Irawan <ceefour@gauldong.net>
*/
class TranslatorIndonesian : public Translator
......
......@@ -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)
......@@ -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;
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment