Commit 15c353fe authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.5.6-20080626

parent e436cad9
DOXYGEN Version 1.5.6
DOXYGEN Version 1.5.6-20080626
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (17 May 2008)
Dimitri van Heesch (26 June 2008)
DOXYGEN Version 1.5.6
DOXYGEN Version 1.5.6_20080626
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) (17 May 2008)
Dimitri van Heesch (dimitri@stack.nl) (26 June 2008)
......@@ -20,7 +20,7 @@ doxygen_version_minor=5
doxygen_version_revision=6
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=NO
doxygen_version_mmn=20080626
bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......@@ -669,7 +669,7 @@ fi
echo -n " Generating src/lang_cfg.h..."
echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>);
chomp @l;
@allowed=(split(/,/,"NL,SE,CZ,FR,ID,IT,DE,JP,JE,ES,FI,RU,HR,PL,PT,HU,KR,KE,RO,SI,CN,NO,MK,BR,DK,SK,UA,GR,TW,SR,CA,LT,ZA,AR,FA"));
@allowed=(split(/,/,"NL,SE,CZ,FR,ID,IT,DE,JP,JE,ES,FI,RU,HR,PL,PT,HU,KR,KE,RO,SI,CN,NO,MK,BR,DK,SK,UA,GR,TW,SR,CA,LT,ZA,AR,FA,SC"));
foreach my $elem (@l){
$elem =~ tr/a-z/A-Z/;
$r=0;
......
......@@ -1261,8 +1261,9 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
HTML output directory. Running \c make will produce the docset in that
directory and running <code>make install</code> will install the docset in
<code>~/Library/Developer/Shared/Documentation/DocSets</code>
so that Xcode will find it at startup.
so that Xcode will find it at startup. See
<a href="http://developer.apple.com/tools/creatingdocsetswithdoxygen.html">
this article</a> for more information.
\anchor cfg_docset_feedname
<dt>\c DOCSET_FEEDNAME <dd>
......
......@@ -23,14 +23,14 @@ text fragments, generated by doxygen, can be produced in languages other
than English (the default). The output language is chosen through the
configuration file (with default name and known as Doxyfile).
Currently (version 1.5.5), 34 languages
Currently (version 1.5.6), 35 languages
are supported (sorted alphabetically):
Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese
Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean
(+En), Lithuanian, Macedonian, Norwegian, Persian, Polish, Portuguese,
Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and
Ukrainian..
Romanian, Russian, Serbian, SerbianCyrilic, Slovak, Slovene, Spanish,
Swedish, and Ukrainian..
The table of information related to the supported languages follows.
It is sorted by language alphabetically. The <b>Status</b> column
......@@ -193,7 +193,7 @@ when the translator was updated.
<td>Macedonian</td>
<td>Slave Jovanovski</td>
<td>slavejovanovski at yahoo dot com</td>
<td>1.5.04</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Norwegian</td>
......@@ -237,6 +237,12 @@ when the translator was updated.
<td>dmilos at email dot com</td>
<td>1.4.1</td>
</tr>
<tr bgcolor="#ffffff">
<td>SerbianCyrilic</td>
<td>Nedeljko Stefanovic</td>
<td>stenedjo at yahoo dot com</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Slovak</td>
<td>Stanislav Kudl&aacute;&#x010d;</td>
......@@ -339,7 +345,7 @@ when the translator was updated.
~ & Mindaugas Radzius & {\tt\tiny mindaugasradzius@takas.lt} & ~ \\
~ & Aidas Berukstis & {\tt\tiny aidasber@takas.lt} & ~ \\
\hline
Macedonian & Slave Jovanovski & {\tt\tiny slavejovanovski@yahoo.com} & 1.5.04 \\
Macedonian & Slave Jovanovski & {\tt\tiny slavejovanovski@yahoo.com} & up-to-date \\
\hline
Norwegian & Lars Erik Jordet & {\tt\tiny lejordet@gmail.com} & 1.4.6 \\
\hline
......@@ -356,6 +362,8 @@ when the translator was updated.
\hline
Serbian & Dejan Milosavljevic & {\tt\tiny dmilos@email.com} & 1.4.1 \\
\hline
SerbianCyrilic & Nedeljko Stefanovic & {\tt\tiny stenedjo@yahoo.com} & up-to-date \\
\hline
Slovak & Stanislav Kudl\'{a}\v{c} & {\tt\tiny skudlac@pobox.sk} & 1.2.18 \\
\hline
Slovene & Matja\v{z} Ostrover\v{s}nik & {\tt\tiny matjaz.ostroversnik@ostri.org} & 1.4.6 \\
......
......@@ -108,6 +108,9 @@ Alexandr Chelpanov: cav@cryptopro.ru
TranslatorSerbian
Dejan Milosavljevic: dmilos@email.com
TranslatorSerbianCyrilic
Nedeljko Stefanovic: stenedjo@yahoo.com
TranslatorSlovak
Stanislav Kudl&aacute;&ccaron;: skudlac@pobox.sk
......
(1.5.5)
(1.5.6)
Doxygen supports the following 34 languages (sorted alphabetically):
Doxygen supports the following 35 languages (sorted alphabetically):
Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese
Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean
(+En), Lithuanian, Macedonian, Norwegian, Persian, Polish, Portuguese,
Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and
Ukrainian.
Romanian, Russian, Serbian, SerbianCyrilic, Slovak, Slovene, Spanish,
Swedish, and Ukrainian.
Of them, 14 translators are up-to-date, 20 translators are based on
Of them, 16 translators are up-to-date, 19 translators are based on
some adapter class, and 2 are English based.
----------------------------------------------------------------------
......@@ -29,8 +29,10 @@ still may be some details listed even for them:
TranslatorGerman
TranslatorItalian
TranslatorKorean
TranslatorMacedonian
TranslatorPersian
TranslatorRussian
TranslatorSerbianCyrilic
TranslatorSpanish -- Change the base class to Translator.
----------------------------------------------------------------------
......@@ -39,9 +41,6 @@ obsolete at the end). The other info shows the estimation of Doxygen
version when the class was last updated and number of methods that
must be implemented to become up-to-date:
TranslatorMacedonian 1.5.04 22 methods to implement
Note: Change the base class to TranslatorAdapter_1_5_4.
TranslatorJapanese 1.5.4 22 methods to implement
TranslatorGreek 1.5.4 22 methods to implement
TranslatorFrench 1.5.4 22 methods to implement
......@@ -470,37 +469,6 @@ TranslatorLithuanian (TranslatorAdapter_1_4_6) 24 methods to implement
virtual QCString trSubprogramDocumentation()
TranslatorMacedonian (TranslatorAdapter_1_4_6) 22 methods to implement
--------------------
Implements 194 of the required methods.
Missing methods (should be implemented):
virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
virtual QCString trSubprograms()
virtual QCString trModulesListDescription(bool extractAll)
virtual QCString trModulesList()
virtual QCString trTypeConstraints()
virtual QCString trMemberFunctionDocumentationFortran()
virtual QCString trCompoundListDescriptionFortran()
virtual QCString trTypeDocumentation()
virtual QCString trModuleReference(const char * namespaceName)
virtual QCString trModulesMemberDescription(bool extractAll)
virtual QCString trModulesMembers()
virtual QCString trModulesIndex()
virtual QCString trCompoundListFortran()
virtual QCString trDataTypes()
virtual QCString trCompoundIndexFortran()
virtual QCString trSubprogram(bool first_capital, bool singular)
virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
virtual QCString trType(bool first_capital, bool singular)
virtual QCString trModule(bool first_capital, bool singular)
virtual QCString trCompoundMembersFortran()
virtual QCString trSubprogramDocumentation()
TranslatorNorwegian (TranslatorAdapter_1_4_6) 23 methods to implement
-------------------
......
......@@ -1285,69 +1285,71 @@ static void startFontClass(const char *s)
static void writeObjCMethodCall(ObjCCallCtx *ctx)
{
if (ctx==0) return;
if (ctx->methodName.isEmpty()) return;
const char *p = ctx->format.data();
//printf("writeObjCMethodCall(%s) obj=%s method=%s\n",
// ctx->format.data(),ctx->objectTypeOrName.data(),ctx->methodName.data());
char c;
if (!ctx->objectTypeOrName.isEmpty() && ctx->objectTypeOrName.at(0)!='$')
const char *p = ctx->format.data();
if (!ctx->methodName.isEmpty())
{
//printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(),
// ctx->methodName.data());
ClassDef *cd = g_theVarContext.findVariable(ctx->objectTypeOrName);
if (cd==0) // not a local variable
//printf("writeObjCMethodCall(%s) obj=%s method=%s\n",
// ctx->format.data(),ctx->objectTypeOrName.data(),ctx->methodName.data());
if (!ctx->objectTypeOrName.isEmpty() && ctx->objectTypeOrName.at(0)!='$')
{
if (ctx->objectTypeOrName=="self")
//printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(),
// ctx->methodName.data());
ClassDef *cd = g_theVarContext.findVariable(ctx->objectTypeOrName);
if (cd==0) // not a local variable
{
if (g_currentDefinition &&
g_currentDefinition->definitionType()==Definition::TypeClass)
if (ctx->objectTypeOrName=="self")
{
ctx->objectType = (ClassDef *)g_currentDefinition;
if (g_currentDefinition &&
g_currentDefinition->definitionType()==Definition::TypeClass)
{
ctx->objectType = (ClassDef *)g_currentDefinition;
}
}
}
else
{
ctx->objectType = getResolvedClass(
g_currentDefinition,
g_sourceFileDef,
ctx->objectTypeOrName,
&ctx->method);
}
//printf(" object is class? %p\n",ctx->objectType);
if (ctx->objectType) // found class
{
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
//printf(" yes->method=%s\n",ctx->method?ctx->method->name().data():"<none>");
}
else if (ctx->method==0) // search for class variable with the same name
{
//printf(" no\n");
//printf("g_currentDefinition=%p\n",g_currentDefinition);
if (g_currentDefinition &&
g_currentDefinition->definitionType()==Definition::TypeClass)
else
{
ctx->objectVar = ((ClassDef *)g_currentDefinition)->getMemberByName(ctx->objectTypeOrName);
//printf(" ctx->objectVar=%p\n",ctx->objectVar);
if (ctx->objectVar)
ctx->objectType = getResolvedClass(
g_currentDefinition,
g_sourceFileDef,
ctx->objectTypeOrName,
&ctx->method);
}
//printf(" object is class? %p\n",ctx->objectType);
if (ctx->objectType) // found class
{
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
//printf(" yes->method=%s\n",ctx->method?ctx->method->name().data():"<none>");
}
else if (ctx->method==0) // search for class variable with the same name
{
//printf(" no\n");
//printf("g_currentDefinition=%p\n",g_currentDefinition);
if (g_currentDefinition &&
g_currentDefinition->definitionType()==Definition::TypeClass)
{
ctx->objectType = stripClassName(ctx->objectVar->typeString());
//printf(" ctx->objectType=%p\n",ctx->objectType);
if (ctx->objectType)
ctx->objectVar = ((ClassDef *)g_currentDefinition)->getMemberByName(ctx->objectTypeOrName);
//printf(" ctx->objectVar=%p\n",ctx->objectVar);
if (ctx->objectVar)
{
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
//printf(" ctx->method=%p\n",ctx->method);
ctx->objectType = stripClassName(ctx->objectVar->typeString());
//printf(" ctx->objectType=%p\n",ctx->objectType);
if (ctx->objectType)
{
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
//printf(" ctx->method=%p\n",ctx->method);
}
}
}
}
}
}
else // local variable
{
//printf(" object is local variable\n");
if (cd!=VariableContext::dummyContext)
else // local variable
{
ctx->method = cd->getMemberByName(ctx->methodName);
//printf(" class=%p method=%p\n",cd,ctx->method);
//printf(" object is local variable\n");
if (cd!=VariableContext::dummyContext)
{
ctx->method = cd->getMemberByName(ctx->methodName);
//printf(" class=%p method=%p\n",cd,ctx->method);
}
}
}
}
......@@ -1653,8 +1655,8 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+
KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol")
KEYWORD ("add"|"asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"set"|"sizeof"|"static"|"struct"|"__super"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|KEYWORD_OBJC)
KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw")
KEYWORD ("add"|"asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"set"|"sizeof"|"static"|"struct"|"__super"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|{KEYWORD_OBJC})
FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"for"|"foreach"|"for each"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while")
TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string")
CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
......
......@@ -2486,7 +2486,7 @@ void closeGroup(Entry *e,const char *fileName,int)
if (g_memberGroupId!=DOX_NOGROUP) // end of member group
{
MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
if (info) // know group
if (info) // known group
{
info->doc = g_memberGroupDocs;
info->docFile = fileName;
......
......@@ -1423,8 +1423,8 @@ void Config::create()
"Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, \n"
"Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), \n"
"Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, \n"
"Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, \n"
"and Ukrainian.\n",
"Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, \n"
"Spanish, Swedish, and Ukrainian.\n",
"English"
);
#ifdef LANG_ZA
......@@ -1512,6 +1512,9 @@ void Config::create()
#ifdef LANG_SR
ce->addValue("Serbian");
#endif
#ifdef LANG_SC
ce->addValue("Serbian-Cyrilic");
#endif
#ifdef LANG_SK
ce->addValue("Slovak");
#endif
......@@ -2354,7 +2357,9 @@ void Config::create()
"HTML output directory. Running make will produce the docset in that \n"
"directory and running \"make install\" will install the docset in \n"
"~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find \n"
"it at startup.",
"it at startup. \n"
"See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html "
"for more information. \n",
FALSE
);
cb->addDependency("GENERATE_HTML");
......
......@@ -23,7 +23,7 @@
class ArgumentList;
extern void stringToArgumentList(const char *argsString,ArgumentList* &argList,
extern void stringToArgumentList(const char *argsString,ArgumentList* argList,
QCString *extraTypeChars=0);
#endif
......@@ -426,7 +426,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
* \param al a reference to resulting argument list pointer.
*/
void stringToArgumentList(const char *argsString,ArgumentList* &al,QCString *extraTypeChars)
void stringToArgumentList(const char *argsString,ArgumentList* al,QCString *extraTypeChars)
{
if (al==0) return;
if (argsString==0) return;
......
......@@ -468,6 +468,7 @@ static void detectNoDocumentedParams()
LockingPtr<ArgumentList> al = g_memberDef->argumentList();
LockingPtr<ArgumentList> declAl = g_memberDef->declArgumentList();
QString returnType = g_memberDef->typeString();
bool isPython = getLanguageFromFileName(g_memberDef->getDefFileName())==SrcLangExt_Python;
if (!g_memberDef->hasDocumentedParams() &&
g_hasParamCommand)
......@@ -489,7 +490,9 @@ static void detectNoDocumentedParams()
// see if all parameters have documentation
for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
{
if (!a->name.isEmpty() && a->type!="void")
if (!a->name.isEmpty() && a->type!="void" &&
!(isPython && a->name=="self")
)
{
allDoc = !a->docs.isEmpty();
}
......@@ -503,7 +506,9 @@ static void detectNoDocumentedParams()
Argument *a;
for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
{
if (!a->name.isEmpty() && a->type!="void")
if (!a->name.isEmpty() && a->type!="void" &&
!(isPython && a->name=="self")
)
{
allDoc = !a->docs.isEmpty();
}
......
......@@ -2350,28 +2350,8 @@ done:
return result;
}
//----------------------------------------------------------------------
// Searches the Entry tree for Variable documentation sections.
// If found they are stored in their class or in the global list.
static void buildVarList(EntryNav *rootNav)
static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
{
//printf("buildVarList(%s)\n",rootNav->name().data());
int isFuncPtr=-1;
if (!rootNav->name().isEmpty() &&
(rootNav->type().isEmpty() || compoundKeywordDict.find(rootNav->type())==0) &&
(
(rootNav->section()==Entry::VARIABLE_SEC // it's a variable
) ||
(rootNav->section()==Entry::FUNCTION_SEC && // or maybe a function pointer variable
(isFuncPtr=findFunctionPtr(rootNav->type()))!=-1
) ||
(rootNav->section()==Entry::FUNCTION_SEC && // class variable initialized by constructor
isVarWithConstructor(rootNav)
)
)
) // documented variable
{
rootNav->loadEntry(g_storage);
Entry *root = rootNav->entry();
......@@ -2493,44 +2473,6 @@ static void buildVarList(EntryNav *rootNav)
else
mtype=MemberDef::Variable;
#if 0 // does not work correctly
//static bool typedefHidesStruct = Config_getBool("TYPEDEF_HIDES_STRUCT");
if (typedefHidesStruct) // substitute names with typedef'ed names
{
QCString baseType = type;
baseType.stripPrefix("typedef ");
if (baseType.stripPrefix("enum "))
{
MemberName *mn=Doxygen::functionNameSDict->find(baseType.stripWhiteSpace());
MemberNameIterator mni(*mn);
MemberDef *md;
for (mni.toFirst();(md=mni.current());++mni)
{
if (md->isEnumerate())
{
md->setName(name);
md->setDefinition(name);
goto nextMember;
}
}
}
else
{
baseType.stripPrefix("struct ");
baseType.stripPrefix("union ");
{
ClassDef *typedefClass = Doxygen::classSDict->find(baseType);
if (typedefClass)
{
typedefClass->setName(name);
typedefClass->setClassName(name);
goto nextMember;
}
}
}
}
#endif
if (!root->relates.isEmpty()) // related variable
{
isRelated=TRUE;
......@@ -2606,9 +2548,61 @@ static void buildVarList(EntryNav *rootNav)
//printf("Inserting member in global scope %s!\n",scope.data());
addVariableToFile(rootNav,mtype,scope,name,FALSE,/*0,*/0);
}
nextMember:
nextMember:
rootNav->releaseEntry();
}
//----------------------------------------------------------------------
// Searches the Entry tree for typedef documentation sections.
// If found they are stored in their class or in the global list.
static void buildTypedefList(EntryNav *rootNav)
{
//printf("buildVarList(%s)\n",rootNav->name().data());
if (!rootNav->name().isEmpty() &&
rootNav->section()==Entry::VARIABLE_SEC &&
rootNav->type().find("typedef ")!=-1 // its a typedef
)
{
addVariable(rootNav);
}
if (rootNav->children())
{
EntryNavListIterator eli(*rootNav->children());
EntryNav *e;
for (;(e=eli.current());++eli)
{
if (e->section()!=Entry::ENUM_SEC)
{
buildTypedefList(e);
}
}
}
}
//----------------------------------------------------------------------
// Searches the Entry tree for Variable documentation sections.
// If found they are stored in their class or in the global list.
static void buildVarList(EntryNav *rootNav)
{
//printf("buildVarList(%s)\n",rootNav->name().data());
int isFuncPtr=-1;
if (!rootNav->name().isEmpty() &&
(rootNav->type().isEmpty() || compoundKeywordDict.find(rootNav->type())==0) &&
(
(rootNav->section()==Entry::VARIABLE_SEC // it's a variable
) ||
(rootNav->section()==Entry::FUNCTION_SEC && // or maybe a function pointer variable
(isFuncPtr=findFunctionPtr(rootNav->type()))!=-1
) ||
(rootNav->section()==Entry::FUNCTION_SEC && // class variable initialized by constructor
isVarWithConstructor(rootNav)
)
)
) // documented variable
{
addVariable(rootNav,isFuncPtr);
}
if (rootNav->children())
{
......@@ -4110,8 +4104,10 @@ static bool findClassRelation(
{
baseClassName.prepend(scopeName.left(scopeOffset)+"::");
}
baseClassName=stripTemplateSpecifiersFromScope
(removeRedundantWhiteSpace(baseClassName));
//QCString stripped;
//baseClassName=stripTemplateSpecifiersFromScope
// (removeRedundantWhiteSpace(baseClassName),TRUE,
// &stripped);
MemberDef *baseClassTypeDef=0;
QCString templSpec;
ClassDef *baseClass=getResolvedClass(explicitGlobalScope ? 0 : cd,
......@@ -9808,6 +9804,13 @@ void parseInput()
msg("Searching for enumerations...\n");
findEnums(rootNav);
// Since buildVarList calls isVarWithConstructor
// and this calls getResolvedClass we need to process
// typedefs first so the relations between classes via typedefs
// are properly resolved. See bug 536385 for an example.
msg("Searching for documented typedefs...\n");
buildTypedefList(rootNav);
msg("Searching for documented variables...\n");
buildVarList(rootNav);
......
......@@ -131,6 +131,9 @@
#ifdef LANG_MK
#include "translator_mk.h"
#endif
#ifdef LANG_SC
#include "translator_sc.h"
#endif
#endif // !ENGLISH_ONLY
#define L_EQUAL(a) !stricmp(langName,a)
......@@ -217,9 +220,7 @@ bool setTranslator(const char *langName)
#ifdef LANG_FI
else if (L_EQUAL("finnish"))
{
//theTranslator=new TranslatorFinnish;
theTranslator=new TranslatorEnglish;
err(obsoleteMsg);
theTranslator=new TranslatorDecoder(new TranslatorFinnish);
}
#endif
#ifdef LANG_RU
......@@ -330,6 +331,12 @@ bool setTranslator(const char *langName)
theTranslator=new TranslatorDecoder(new TranslatorSerbian);
}
#endif
#ifdef LANG_SC
else if (L_EQUAL("serbian-cyrilic"))
{
theTranslator=new TranslatorSerbian;
}
#endif
#ifdef LANG_CA
else if (L_EQUAL("catalan"))
{
......
......@@ -1808,7 +1808,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
Specifier lvirt=virtualness();
if (!isObjCMethod() &&
if ((!isObjCMethod() || isOptional() || isRequired()) &&
(protection()!=Public || lvirt!=Normal ||
isFriend() || isRelated() ||
(isInline() && Config_getBool("INLINE_INFO")) ||
......@@ -1855,13 +1855,18 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (isAssign()) sl.append("assign");
else if (isCopy()) sl.append("copy");
else if (isRetain()) sl.append("retain");
if (protection()==Protected) sl.append("protected");
else if (protection()==Private) sl.append("private");
else if (protection()==Package) sl.append("package");
if (lvirt==Virtual) sl.append("virtual");
else if (lvirt==Pure) sl.append("pure virtual");
if (isSignal()) sl.append("signal");
if (isSlot()) sl.append("slot");
if (!isObjCMethod())
{
if (protection()==Protected) sl.append("protected");
else if (protection()==Private) sl.append("private");
else if (protection()==Package) sl.append("package");
if (lvirt==Virtual) sl.append("virtual");
else if (lvirt==Pure) sl.append("pure virtual");
if (isSignal()) sl.append("signal");
if (isSlot()) sl.append("slot");
}
}
if (m_impl->classDef && m_impl->classDef!=container) sl.append("inherited");
}
......
......@@ -382,7 +382,9 @@ size_t portable_iconv (void *cd, const char** inbuf, size_t *inbytesleft,
// avoid a compile error, that is were the CASTNEEDED is for.
#if ((defined(_LIBICONV_VERSION) && (_LIBICONV_VERSION>=0x0109) && \
!((defined(_OS_MAC_) || defined(Q_OS_MACX) )&& (_LIBICONV_VERSION==0x010B))) \
|| defined(_OS_SOLARIS_))
|| defined(_OS_SOLARIS_) \
|| defined(_OS_NETBSD_) \
)
#define CASTNEEDED(x) (x)
#else
#define CASTNEEDED(x) (char **)(x)
......
......@@ -535,6 +535,16 @@ STARTDOCSYMS ^{B}"##"/[^#]
g_packageCommentAllowed = FALSE;
BEGIN( Import );
}
^{B}{IDENTIFIER}/{B}"="{B}"property" { // property
current->section = Entry::VARIABLE_SEC;
current->mtype = Property;
current->name = QCString(yytext).stripWhiteSpace();
current->fileName = yyFileName;
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
g_packageCommentAllowed = FALSE;
BEGIN(VariableDec);
}
^{B}{IDENTIFIER}/{B}"="[^=] { // variable
g_indent=computeIndent(yytext);
current->section = Entry::VARIABLE_SEC;
......@@ -1129,7 +1139,10 @@ STARTDOCSYMS ^{B}"##"/[^#]
BEGIN(TripleString);
}
"(" { // tuple
current->type = "tuple";
if (current->mtype!=Property)
{
current->type = "tuple";
}
current->initializer+=*yytext;
g_atomStart='(';
g_atomEnd=')';
......
......@@ -1254,10 +1254,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
<FindMembers>{B}*"explicit"{BN}+ { current->spec|=Entry::Explicit;
lineCount();
}
<FindMembers>{B}*"@required"{BN}+ { current->spec|=Entry::Required;
<FindMembers>{B}*"@required"{BN}+ { // Objective C 2.0 protocol required section
current->spec=(current->spec & ~Entry::Optional) | Entry::Required;
lineCount();
}
<FindMembers>{B}*"@optional"{BN}+ { current->spec|=Entry::Optional;
<FindMembers>{B}*"@optional"{BN}+ { // Objective C 2.0 protocol optional section
current->spec=(current->spec & ~Entry::Required) | Entry::Optional;
lineCount();
}
/*
......@@ -4064,6 +4066,11 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
current_root->addSubEntry(current);
current = new Entry ;
initEntry();
// Objective C 2.0: Required/Optional section
if (previous->spec & (Entry::Optional | Entry::Required))
{
current->spec |= previous->spec & (Entry::Optional|Entry::Required);
}
lastCurlyContext = FindMembers;
if ( *yytext == ',' )
{
......@@ -4754,7 +4761,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
<SkipRound>")" { if (--roundCount<=0)
BEGIN ( lastSkipRoundContext );
}
<Bases>","|">"|({BN}+"implements"{BN}*) { lineCount();
<Bases>","|(">"({BN}*"{")?)|({BN}+"implements"{BN}*) { lineCount();
if (insideProtocolList)
{
baseName+="-p";
......@@ -4785,7 +4792,14 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
if (*yytext=='>')
{ // end of a ObjC protocol list
insideProtocolList=FALSE;
unput('{'); // dummy start body
if (yyleng==1)
{
unput('{'); // dummy start body
}
else
{
yyless(1);
}
}
else
{
......
......@@ -1042,8 +1042,7 @@ class TranslatorEnglish : public Translator
" Used *m_usedClass;\n"
"};\n"
"\\endcode\n"
"If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
"is set to 240 this will result in the following graph:"
"This will result in the following graph:"
"<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
"<p>\n"
"The boxes in the above graph have the following meaning:\n"
......
......@@ -24,12 +24,15 @@
// 2007/12/09
// - Initial translation to Macedonian.
//
// 2008/05/22
// - Translation for 1.5.4.
//
//
#ifndef TRANSLATOR_MK_H
#define TRANSLATOR_MK_H
class TranslatorMacedonian : public TranslatorAdapter_1_4_6
class TranslatorMacedonian : public Translator
{
public:
......@@ -1558,7 +1561,207 @@ class TranslatorMacedonian : public TranslatorAdapter_1_4_6
virtual QCString trEnumerationValueDocumentation()
{ return "Документија на Набројувања"; }
//////////////////////////////////////////////////////////////////////////
// new since 1.5.4 (mainly for Fortran)
//////////////////////////////////////////////////////////////////////////
/*! header that is put before the list of member subprograms (Fortran). */
virtual QCString trMemberFunctionDocumentationFortran()
{ return "Документација на функции/процедури членови"; }
/*! This is put above each page as a link to the list of annotated data types (Fortran). */
virtual QCString trCompoundListFortran()
{ return "Список на Типови"; }
/*! This is put above each page as a link to all members of compounds (Fortran). */
virtual QCString trCompoundMembersFortran()
{ return "Членови"; }
/*! This is an introduction to the annotated compound list (Fortran). */
virtual QCString trCompoundListDescriptionFortran()
{ return "Список на типови со кратки описи:"; }
/*! This is an introduction to the page with all data types (Fortran). */
virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
{
QCString result="Список на сите ";
if (!extractAll)
{
result+="документирани ";
}
result+="членови на типови";
result+=" со врски до ";
if (!extractAll)
{
result+="документацијата за секој член:";
}
else
{
result+="типовите на кои што припаѓаат:";
}
return result;
}
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index (Fortran).
*/
virtual QCString trCompoundIndexFortran()
{ return "Попис на Типови"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all data types (Fortran).
*/
virtual QCString trTypeDocumentation()
{ return "Документација на Типови"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) subprograms (Fortran).
*/
virtual QCString trSubprograms()
{ return "Функции/Процедури"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for subprograms (Fortran)
*/
virtual QCString trSubprogramDocumentation()
{ return "Документација на Функции/Процедури"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds (Fortran)
*/
virtual QCString trDataTypes()
{ return "Типови"; }
/*! used as the title of page containing all the index of all modules (Fortran). */
virtual QCString trModulesList()
{ return "Попис на Модули"; }
/*! used as an introduction to the modules list (Fortran) */
virtual QCString trModulesListDescription(bool extractAll)
{
QCString result="Список на сите ";
if (!extractAll) result+="документирани ";
result+="модули со кратки описи:";
return result;
}
/*! used as the title of the HTML page of a module/type (Fortran) */
virtual QCString trCompoundReferenceFortran(const char *clName,
ClassDef::CompoundType compType,
bool isTemplate)
{
QCString result=(QCString)clName + " - Повикување на";
switch(compType)
{
case ClassDef::Class: result+=" Класа"; break;
case ClassDef::Struct: result+=" Тип"; break;
case ClassDef::Union: result+=" Унија"; break;
case ClassDef::Interface: result+=" Интерфејс"; break;
case ClassDef::Protocol: result+=" Протокол"; break;
case ClassDef::Category: result+=" Категорија"; break;
case ClassDef::Exception: result+=" Исклучок"; break;
}
if (isTemplate) result+=" Образец";
return result;
}
/*! used as the title of the HTML page of a module (Fortran) */
virtual QCString trModuleReference(const char *namespaceName)
{
QCString result=namespaceName;
result+=" - Содржина на Модул";
return result;
}
/*! This is put above each page as a link to all members of modules. (Fortran) */
virtual QCString trModulesMembers()
{ return "Членови на Модул"; }
/*! This is an introduction to the page with all modules members (Fortran) */
virtual QCString trModulesMemberDescription(bool extractAll)
{
QCString result="Список на сите ";
if (!extractAll) result+="документирани ";
result+="членови на модулот со врски до ";
if (extractAll)
{
result+="документацијата за секој член:";
}
else
{
result+="модулите на кои што припаѓаат:";
}
return result;
}
/*! This is used in LaTeX as the title of the chapter with the
* index of all modules (Fortran).
*/
virtual QCString trModulesIndex()
{ return "Попис на Модули"; }
/*! 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 trModule(bool first_capital, bool singular)
{
QCString result((first_capital ? "Модул" : "модул"));
if (!singular) result+="и";
return result;
}
/*! This is put at the bottom of a module documentation page and is
* followed by a list of files that were used to generate the page.
*/
virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
bool single)
{ // here s is one of " Module", " Struct" or " Union"
// single is true implies a single file
QCString result=(QCString)"Документацијата за ";
switch(compType)
{
case ClassDef::Class: result+="оваа класа"; break;
case ClassDef::Struct: result+="овој тип"; break;
case ClassDef::Union: result+="оваа унија"; break;
case ClassDef::Interface: result+="овој интерфејс"; break;
case ClassDef::Protocol: result+="овој протокол"; break;
case ClassDef::Category: result+="оваа категорија"; break;
case ClassDef::Exception: result+="овој исклучок"; break;
}
result+=" беше создадена од ";
if (single) result+="следнава датотека:"; else result+="следниве датотеки:";
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 trType(bool first_capital, bool singular)
{
QCString result((first_capital ? "Тип" : "тип"));
if (!singular) result+="ови";
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 trSubprogram(bool first_capital, bool singular)
{
QCString result((first_capital ? "Потпрограм" : "потпрограм"));
if (singular){
result+="а";
}else{
result+="и";
}
return result;
}
/*! C# Type Constraint list */
virtual QCString trTypeConstraints()
{
return "Ограничувања на Тип";
}
};
#endif
......@@ -674,8 +674,7 @@ class TranslatorDutch : public Translator
" Used *m_usedClass;\n"
"};\n"
"\\endcode\n"
"Als de \\c MAX_DOT_GRAPH_HEIGHT tag in the configuratie file "
"op 200 gezet is, zal het bestaande voorbeeld resulteren in de volgende graaf:"
"Dit voorbeeld zal resulteren in de volgende graaf:"
"<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
"<p>\n"
"De rechthoeken in the bovenstaande graaf hebben de volgende betekenis:\n"
......
This diff is collapsed.
This diff is collapsed.
......@@ -488,7 +488,8 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,Definition
*/
ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
MemberDef **pMemType,QCString *pTemplSpec,
QCString *pResolvedType)
QCString *pResolvedType,
ArgumentList *actTemplParams)
{
//printf("newResolveTypedef(md=%p,cachedVal=%p)\n",md,md->getCachedTypedefVal());
bool isCached = md->isTypedefValCached(); // value already cached
......@@ -509,7 +510,13 @@ ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
g_resolvedTypedefs.insert(qname,md); // put on the trace list
ClassDef *typeClass = md->getClassDef();
QCString type = md->typeString(); // get the "value" of the typedef
if (typeClass && typeClass->isTemplate() && actTemplParams->count()>0)
{
type = substituteTemplateArgumentsInString(type,
typeClass->templateArguments(),actTemplParams);
}
QCString typedefValue = type;
int tl=type.length();
int ip=tl-1; // remove * and & at the end
......@@ -947,7 +954,7 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,
if (newScope) // explicitScope is inside scope => newScope is the result
{
Definition *itemScope = item->getOuterScope();
//printf(" scope traversal successful %s<->%s!\n",item->getOuterScope()->name().data(),newScope->name().data());
//printf(" scope traversal successful %s<->%s!\n",itemScope->name().data(),newScope->name().data());
//if (newScope && newScope->definitionType()==Definition::TypeClass)
//{
// ClassDef *cd = (ClassDef *)newScope;
......@@ -975,7 +982,7 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,
//printf("scope(%s) is base class of newScope(%s)\n",
// scope->name().data(),newScope->name().data());
}
else
else
{
int i=-1;
if (newScope->definitionType()==Definition::TypeNamespace)
......@@ -1027,13 +1034,13 @@ int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,
i = isAccessibleFromWithExpScope(scope->getOuterScope(),fileScope,
item,explicitScopePart);
}
//printf("> result=%d\n",i);
//printf(" | result=%d\n",i);
result = (i==-1) ? -1 : i+2;
}
}
else // failed to resolve explicitScope
{
//printf("failed to resolve: scope=%s\n",scope->name().data());
//printf(" failed to resolve: scope=%s\n",scope->name().data());
if (scope->definitionType()==Definition::TypeNamespace)
{
NamespaceDef *nscope = (NamespaceDef*)scope;
......@@ -1083,6 +1090,7 @@ static void getResolvedSymbol(Definition *scope,
FileDef *fileScope,
Definition *d,
const QCString &explicitScopePart,
ArgumentList *actTemplParams,
int &minDistance,
ClassDef *&bestMatch,
MemberDef *&bestTypedef,
......@@ -1103,7 +1111,7 @@ static void getResolvedSymbol(Definition *scope,
g_visitedNamespaces.clear();
// test accessibility of definition within scope.
int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart);
//printf(" distance %s (%p) is %d\n",d->name().data(),d,distance);
//printf(" %s; distance %s (%p) is %d\n",scope->name().data(),d->name().data(),d,distance);
if (distance!=-1) // definition is accessible
{
// see if we are dealing with a class or a typedef
......@@ -1173,7 +1181,7 @@ static void getResolvedSymbol(Definition *scope,
QCString type;
minDistance=distance;
MemberDef *enumType = 0;
ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec,&type);
ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec,&type,actTemplParams);
if (cd) // type resolves to a class
{
//printf(" bestTypeDef=%p spec=%s type=%s\n",md,spec.data(),type.data());
......@@ -1248,8 +1256,17 @@ ClassDef *getResolvedClassRec(Definition *scope,
)
{
//printf("[getResolvedClassRec(%s,%s)\n",scope?scope->name().data():"<global>",n);
QCString name=n;
QCString name;
QCString explicitScopePart;
QCString strippedTemplateParams;
name=stripTemplateSpecifiersFromScope
(removeRedundantWhiteSpace(n),TRUE,
&strippedTemplateParams);
ArgumentList actTemplParams;
if (!strippedTemplateParams.isEmpty()) // template part that was stripped
{
stringToArgumentList(strippedTemplateParams,&actTemplParams);
}
int qualifierIndex = computeQualifiedIndex(name);
//printf("name=%s qualifierIndex=%d\n",name.data(),qualifierIndex);
......@@ -1354,7 +1371,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
int count=0;
for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition
{
getResolvedSymbol(scope,fileScope,d,explicitScopePart,
getResolvedSymbol(scope,fileScope,d,explicitScopePart,&actTemplParams,
minDistance,bestMatch,bestTypedef,bestTemplSpec,
bestResolvedType);
}
......@@ -1363,7 +1380,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
{
//printf(" name is unique\n");
Definition *d = (Definition *)di;
getResolvedSymbol(scope,fileScope,d,explicitScopePart,
getResolvedSymbol(scope,fileScope,d,explicitScopePart,&actTemplParams,
minDistance,bestMatch,bestTypedef,bestTemplSpec,
bestResolvedType);
}
......@@ -3127,9 +3144,10 @@ static QCString getCanonicalTypeForIdentifier(
{
result = mType->qualifiedName();
}
else
else // fallback
{
resolvedType = resolveTypeDef(d,word);
//printf("typedef [%s]->[%s]\n",word.data(),resolvedType.data());
if (resolvedType.isEmpty()) // not known as a typedef either
{
result = word;
......@@ -5476,6 +5494,7 @@ QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
}
else if (pLastScopeStripped)
{
//printf(" last stripped scope '%s'\n",fullName.mid(i,e-i).data());
*pLastScopeStripped=fullName.mid(i,e-i);
}
p=e;
......
......@@ -330,7 +330,8 @@ bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n);
ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
MemberDef **pMemType=0,QCString *pTemplSpec=0,
QCString *pResolvedType=0);
QCString *pResolvedType=0,
ArgumentList *actTemplParams=0);
QCString parseCommentAsText(const QString &doc,const QCString &fileName,int lineNr);
......
......@@ -234,8 +234,8 @@ void addSignals(const char* str,int line, Entry *e,const char *comment=0)
VhdlDocGen::getSigName(ql,str,bufio);
int count = ql.count();
QCString brief = current->brief;
QCString doc = current->doc;
QCString brief = current->brief;
QCString doc = current->doc;
Entry *tmpEntry = current;
current = new Entry;
initEntry(current);
......@@ -257,55 +257,67 @@ void addSignals(const char* str,int line, Entry *e,const char *comment=0)
current->brief.resize(0);
current->doc.resize(0);
for (int k=1;k<count;k++)
if (genPort!=3) // not a unit
{
//printf("adding '%s' '%s'\n",ql.at(0)->data(),ql.at(k)->data());
Entry *pTemp=new Entry;
initEntry(pTemp);
pTemp->startLine = line;
pTemp->bodyLine = line;
pTemp->name = ql.at(k)->data();
pTemp->section = Entry::VARIABLE_SEC;
pTemp->brief = brief;
pTemp->doc = doc;
QCString stSpec = ql.at(0)->data();
if (genPort==1)
{
pTemp->spec = VhdlDocGen::PORT;
stSpec.stripPrefix(bufio.data());
stSpec=stSpec.stripWhiteSpace();
pTemp->args = stSpec;
pTemp->type = bufio;
}
else if (genPort==2) // found record
{
pTemp->spec = VhdlDocGen::RECORD;
pTemp->type = stSpec;
pTemp->name.prepend(VhdlDocGen::getRecordNumber());
}
else
for (int k=1;k<count;k++)
{
pTemp->spec = VhdlDocGen::GENERIC;
pTemp->type = stSpec;
}
addSubEntry(e,pTemp);
}// for
/* found a unit */
if (genPort==3)
//printf("adding '%s' '%s'\n",ql.at(0)->data(),ql.at(k)->data());
Entry *pTemp=new Entry;
initEntry(pTemp);
pTemp->startLine = line;
pTemp->bodyLine = line;
pTemp->name = ql.at(k)->data();
pTemp->section = Entry::VARIABLE_SEC;
pTemp->brief = brief;
pTemp->doc = doc;
pTemp->mGrpId = current->mGrpId; // copy member group id
QCString stSpec = ql.at(0)->data();
if (genPort==1) // found port
{
pTemp->spec = VhdlDocGen::PORT;
stSpec.stripPrefix(bufio.data());
stSpec=stSpec.stripWhiteSpace();
pTemp->args = stSpec;
pTemp->type = bufio;
addSubEntry(e,pTemp);
}
else if (genPort==2) // found record
{
pTemp->spec = VhdlDocGen::RECORD;
pTemp->type = stSpec;
pTemp->name.prepend(VhdlDocGen::getRecordNumber());
delete current;
current = new Entry(*pTemp); // make a deep copy of pTemp
newEntry(); // add it to lastCompound and make a new current
delete pTemp;
}
else
{
pTemp->spec = VhdlDocGen::GENERIC;
pTemp->type = stSpec;
addSubEntry(e,pTemp);
}
}// for
}
else // found a unit
{
Entry *pTemp=new Entry;
initEntry(pTemp);
QCString tt(str);
QStringList ql=QStringList::split("=",tt,FALSE);
pTemp->spec=VhdlDocGen::UNITS;
pTemp->section=Entry::VARIABLE_SEC;
pTemp->startLine=line;
pTemp->bodyLine=line;
pTemp->type=(QCString)ql[1];
pTemp->name=(QCString)ql[0].stripWhiteSpace();
pTemp->spec = VhdlDocGen::UNITS;
pTemp->section = Entry::VARIABLE_SEC;
pTemp->startLine = line;
pTemp->bodyLine = line;
pTemp->brief = brief; // adds brief description to the unit member
pTemp->doc = doc; // adds doc to the unit member
pTemp->type = ql[1];
pTemp->name = ql[0].stripWhiteSpace();
pTemp->name.prepend(VhdlDocGen::getRecordNumber());
addSubEntry(e,pTemp);
delete current;
current = new Entry(*pTemp); // make a deep copy
newEntry(); // add it to lastCompound
delete pTemp;
}
}
......@@ -561,8 +573,11 @@ ENDFUNC {B}*"end"{BR}+"function"{BR}+{FUNCNAME}{BR}*[;]
FUNCIMPURE "impure"|"pure"
FUNCPROC ^{B}*{FUNCIMPURE}*{BR}*("function"|"procedure"){B}*
ARCHITECTURE ("architecture"){BR}+{NAME}{BR}*("of")
POST "postponed"
PROCESS ({BR}*{FUNCNAME}{B}*[:]{BR}*{POST}{BR}("process"){BR}*{PROTO})|("process"){BR}*("("){BR}*{PROTO}|[^a-zA-Z]("process"){CR}|[^a-zA-Z]("process"){BR}+("is")
/* Removed due to bug 538239
POST "postponed"
PROCESS ({BR}*{FUNCNAME}{B}*[:]{BR}*({POST}{BR}+)?("process"){BR}*{PROTO})|("process"){BR}*("("){BR}*{PROTO}|[^a-zA-Z]("process"){CR}|[^a-zA-Z]("process"){BR}+("is")
*/
PROCESS ({B}*{FUNCNAME}{B}*:{BR}*)?({B}*("postponed"){BR}+)?{B}*("process"){BR}*{PROTO}
ENDPROCESS ("end"){BR}*("process")
LIBUSE ^{B}*("use"|"library"){BR}+
......@@ -614,6 +629,7 @@ ALLID [^;()\t ]
//addSubEntry(current,pEntry);
current->startLine=yyLineNr;
current->bodyLine=yyLineNr;
newEntry(); // adds the unit to the lastCompound
genPort=3;
BEGIN(ParseRecord);
}
......@@ -915,9 +931,7 @@ ALLID [^;()\t ]
current->section=Entry::VARIABLE_SEC;
current->spec=VhdlDocGen::RECORD;
addText(vhdlscanYYtext,vhdlscanYYleng);
addSubEntry(current_root,current);
current = new Entry;
initEntry(current);
newEntry(); // adds the record to the last compound
BEGIN(ParseRecord);
}
......@@ -932,10 +946,18 @@ ALLID [^;()\t ]
BEGIN(Start);
}
<ParseRecord>[a-z_][^\n;]* { // parse record body
<ParseRecord>[a-z_A-Z0-9][^\n;]*";"({B}*{COMMENT})* { // parse record body
lineCount();
QCString comment;
QCString zz(vhdlscanYYtext);
addSignals(zz.data(),yyLineNr,current);
if (zz.contains("--!"))
{
QStringList ql=QStringList::split("--!",zz,FALSE);
comment = ql[1];
zz = ql[0];
}
initEntry(current);
addSignals(zz,yyLineNr,current,comment);
addText(vhdlscanYYtext,vhdlscanYYleng);
BEGIN(ParseRecord);
}
......@@ -1094,10 +1116,11 @@ ALLID [^;()\t ]
current->section=Entry::VARIABLE_SEC;
current->type+=qcs.data();
if ((current->spec==VhdlDocGen::SIGNAL ||
if ((current->spec==VhdlDocGen::SIGNAL ||
current->spec==VhdlDocGen::CONSTANT ||
current->spec==VhdlDocGen::TYPE ||
current->spec==VhdlDocGen::SUBTYPE
current->spec==VhdlDocGen::TYPE ||
current->spec==VhdlDocGen::SUBTYPE ||
current->spec==VhdlDocGen::SHAREDVARIABLE
) &&
qcs.stripPrefix(","))
{
......@@ -1105,7 +1128,8 @@ ALLID [^;()\t ]
ql.setAutoDelete(TRUE);
QCString buffer;
if (current->spec==VhdlDocGen::SUBTYPE ||
current->spec==VhdlDocGen::TYPE)
current->spec==VhdlDocGen::TYPE
)
{
VhdlDocGen::getSigTypeName(ql,qcs.data(),buffer);
}
......@@ -1316,7 +1340,6 @@ ALLID [^;()\t ]
{
//printf("no ; or --: pos=%d semi=%d\n",pos,semi);
}
int diff=openCount-closeCount;
if (diff<0)
{
......
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