adawriter.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "adawriter.h"
00017
00018 #include <kdebug.h>
00019 #include <klocale.h>
00020 #include <kmessagebox.h>
00021 #include <qfile.h>
00022 #include <qregexp.h>
00023 #include <qtextstream.h>
00024
00025 #include "../umldoc.h"
00026 #include "../uml.h"
00027 #include "../classifier.h"
00028 #include "../enum.h"
00029 #include "../classifierlistitem.h"
00030 #include "../umlclassifierlistitemlist.h"
00031 #include "../umltemplatelist.h"
00032 #include "../folder.h"
00033 #include "../association.h"
00034 #include "../attribute.h"
00035 #include "../operation.h"
00036 #include "../template.h"
00037 #include "../umlnamespace.h"
00038
00039 const QString AdaWriter::defaultPackageSuffix = "_Holder";
00040
00041 AdaWriter::AdaWriter() {
00042 }
00043
00044 AdaWriter::~AdaWriter() {}
00045
00049 Uml::Programming_Language AdaWriter::getLanguage() {
00050 return Uml::pl_Ada;
00051 }
00052
00053
00054 bool AdaWriter::isOOClass(UMLClassifier *c) {
00055 Uml::Object_Type ot = c->getBaseType();
00056 if (ot == Uml::ot_Interface)
00057 return true;
00058 if (ot == Uml::ot_Enum)
00059 return false;
00060 if (ot != Uml::ot_Class) {
00061 kDebug() << "AdaWriter::isOOClass: unknown object type " << ot << endl;
00062 return false;
00063 }
00064 QString stype = c->getStereotype();
00065 if (stype == "CORBAConstant" || stype == "CORBATypedef" ||
00066 stype == "CORBAStruct" || stype == "CORBAUnion")
00067 return false;
00068
00069
00070 return true;
00071 }
00072
00073 QString AdaWriter::className(UMLClassifier *c, bool inOwnScope) {
00074
00075
00076
00077
00078 QString retval;
00079 QString className = cleanName(c->getName());
00080 UMLPackage *umlPkg = c->getUMLPackage();
00081 if (umlPkg == UMLApp::app()->getDocument()->getRootFolder(Uml::mt_Logical)) {
00082 if (! inOwnScope)
00083 retval = className + '.';
00084 retval.append("Object");
00085 } else {
00086 if (! inOwnScope)
00087 retval = umlPkg->getFullyQualifiedName(".") + '.';
00088 retval.append(className);
00089 }
00090 return retval;
00091 }
00092
00093 QString AdaWriter::packageName(UMLPackage *p) {
00094
00095
00096
00097
00098 UMLPackage *umlPkg = p->getUMLPackage();
00099 QString className = cleanName(p->getName());
00100 QString retval;
00101
00102 if (umlPkg == UMLApp::app()->getDocument()->getRootFolder(Uml::mt_Logical))
00103 umlPkg = NULL;
00104
00105 UMLClassifier *c = dynamic_cast<UMLClassifier*>(p);
00106 if (umlPkg == NULL) {
00107 retval = className;
00108 if (c == NULL || !isOOClass(c))
00109 retval.append(defaultPackageSuffix);
00110 } else {
00111 retval = umlPkg->getFullyQualifiedName(".");
00112 }
00113 return retval;
00114 }
00115
00116 void AdaWriter::computeAssocTypeAndRole(UMLClassifier *c,
00117 UMLAssociation *a,
00118 QString& typeName, QString& roleName) {
00119 UMLClassifier* assocEnd = dynamic_cast<UMLClassifier*>(a->getObject(Uml::B));
00120 if (assocEnd == NULL)
00121 return;
00122 const Uml::Association_Type assocType = a->getAssocType();
00123 if (assocType != Uml::at_Aggregation && assocType != Uml::at_Composition)
00124 return;
00125 const QString multi = a->getMulti(Uml::B);
00126 bool hasNonUnityMultiplicity = (!multi.isEmpty() && multi != "1");
00127 hasNonUnityMultiplicity &= !multi.contains(QRegExp("^1 *\\.\\. *1$"));
00128 roleName = cleanName(a->getRoleName(Uml::B));
00129 if (roleName.isEmpty())
00130 roleName = cleanName(a->getName());
00131 if (roleName.isEmpty()) {
00132 QString artificialName = cleanName(assocEnd->getName());
00133 if (hasNonUnityMultiplicity) {
00134 roleName = artificialName;
00135 roleName.append("_Vector");
00136 } else {
00137 roleName = "M_";
00138 roleName.append(artificialName);
00139 }
00140 }
00141 typeName = className(assocEnd, (assocEnd == c));
00142 if (hasNonUnityMultiplicity)
00143 typeName.append("_Array_Ptr");
00144 else if (assocType == Uml::at_Aggregation)
00145 typeName.append("_Ptr");
00146 }
00147
00148 void AdaWriter::writeClass(UMLClassifier *c) {
00149 if (!c) {
00150 kDebug() << "Cannot write class of NULL concept!" << endl;
00151 return;
00152 }
00153
00154 const bool isClass = !c->isInterface();
00155 QString classname = cleanName(c->getName());
00156 QString fileName = packageName(c).lower();
00157 fileName.replace('.', '-');
00158
00159
00160 fileName = overwritableName(c, fileName, ".ads");
00161 if (fileName.isEmpty()) {
00162 emit codeGenerated(c, false);
00163 return;
00164 }
00165
00166 QFile file;
00167 if (!openFile(file, fileName)) {
00168 emit codeGenerated(c, false);
00169 return;
00170 }
00171
00172
00173
00174 QTextStream ada(&file);
00175
00176 QString str;
00177 str = getHeadingFile(".ads");
00178 if (!str.isEmpty()) {
00179 str.replace(QRegExp("%filename%"), fileName);
00180 str.replace(QRegExp("%filepath%"), file.name());
00181 ada << str << endl;
00182 }
00183
00184
00185 UMLPackageList imports;
00186 findObjectsRelated(c, imports);
00187 if (imports.count()) {
00188 for (UMLPackage *con = imports.first(); con; con = imports.next()) {
00189 if (con->getBaseType() != Uml::ot_Datatype)
00190 ada << "with " << packageName(con) << "; " << m_endl;
00191 }
00192 ada << m_endl;
00193 }
00194
00195
00196 UMLTemplateList template_params = c->getTemplateList();
00197 if (template_params.count()) {
00198 ada << getIndent() << "generic" << m_endl;
00199 m_indentLevel++;
00200 for (UMLTemplate *t = template_params.first(); t; t = template_params.next()) {
00201 QString formalName = t->getName();
00202 QString typeName = t->getTypeName();
00203 if (typeName == "class") {
00204 ada << getIndent() << "type " << formalName << " is tagged private;"
00205 << m_endl;
00206 } else {
00207
00208 UMLClassifier *typeObj = t->getType();
00209 if (typeObj == NULL) {
00210 kError() << "AdaWriter::writeClass(template_param "
00211 << typeName << "): typeObj is NULL" << endl;
00212 ada << getIndent() << "type " << formalName << " is new " << typeName
00213 << " with private; -- CHECK: codegen error"
00214 << m_endl;
00215 } else if (typeObj->getBaseType() == Uml::ot_Datatype) {
00216 ada << getIndent() << formalName << " : " << typeName << ";"
00217 << m_endl;
00218 } else {
00219 ada << getIndent() << "type " << typeName << " is new "
00220 << formalName << " with private;" << m_endl;
00221 }
00222 }
00223 }
00224 m_indentLevel--;
00225 }
00226
00227
00228 QString pkg = packageName(c);
00229 ada << getIndent() << "package " << pkg << " is" << m_endl << m_endl;
00230 m_indentLevel++;
00231 if (c->getBaseType() == Uml::ot_Enum) {
00232 UMLEnum *ue = static_cast<UMLEnum*>(c);
00233 UMLClassifierListItemList litList = ue->getFilteredList(Uml::ot_EnumLiteral);
00234 uint i = 0;
00235 ada << getIndent() << "type " << classname << " is (" << m_endl;
00236 m_indentLevel++;
00237 for (UMLClassifierListItem *lit = litList.first(); lit; lit = litList.next()) {
00238 QString enumLiteral = cleanName(lit->getName());
00239 ada << getIndent() << enumLiteral;
00240 if (++i < litList.count())
00241 ada << "," << m_endl;
00242 }
00243 m_indentLevel--;
00244 ada << ");" << m_endl << m_endl;
00245 m_indentLevel--;
00246 ada << getIndent() << "end " << pkg << ";" << m_endl << m_endl;
00247 return;
00248 }
00249 if (! isOOClass(c)) {
00250 QString stype = c->getStereotype();
00251 if (stype == "CORBAConstant") {
00252 ada << getIndent() << "-- " << stype << " is Not Yet Implemented" << m_endl << m_endl;
00253 } else if(stype == "CORBAStruct") {
00254 if (isClass) {
00255 UMLAttributeList atl = c->getAttributeList();
00256 UMLAttribute *at;
00257 ada << getIndent() << "type " << classname << " is record" << m_endl;
00258 m_indentLevel++;
00259 for (at = atl.first(); at; at = atl.next()) {
00260 QString name = cleanName(at->getName());
00261 QString typeName = at->getTypeName();
00262 ada << getIndent() << name << " : " << typeName;
00263 QString initialVal = at->getInitialValue();
00264 if (initialVal.latin1() && ! initialVal.isEmpty())
00265 ada << " := " << initialVal;
00266 ada << ";" << m_endl;
00267 }
00268 m_indentLevel--;
00269 ada << getIndent() << "end record;" << m_endl << m_endl;
00270 }
00271 } else if(stype == "CORBAUnion") {
00272 ada << getIndent() << "-- " << stype << " is Not Yet Implemented" << m_endl << m_endl;
00273 } else if(stype == "CORBATypedef") {
00274 ada << getIndent() << "-- " << stype << " is Not Yet Implemented" << m_endl << m_endl;
00275 } else {
00276 ada << getIndent() << "-- " << stype << ": Unknown stereotype" << m_endl << m_endl;
00277 }
00278 m_indentLevel--;
00279 ada << getIndent() << "end " << pkg << ";" << m_endl << m_endl;
00280 return;
00281 }
00282
00283
00284 if (forceDoc() || !c->getDoc().isEmpty()) {
00285 ada << "--" << m_endl;
00286 ada << "-- class " << classname << endl;
00287 ada << formatDoc(c->getDoc(), "-- ");
00288 ada << m_endl;
00289 }
00290
00291 UMLClassifierList superclasses = c->getSuperClasses();
00292
00293 const QString name = className(c);
00294 ada << getIndent() << "type " << name << " is ";
00295 if (c->getAbstract())
00296 ada << "abstract ";
00297 if (superclasses.isEmpty()) {
00298 ada << "tagged ";
00299 } else {
00300
00301 UMLClassifier* parent = superclasses.first();
00302 ada << "new " << className(parent, false) << " with ";
00303 }
00304 ada << "private;" << m_endl << m_endl;
00305 ada << getIndent() << "type " << name << "_Ptr is access all " << name << "'Class;" << m_endl << m_endl;
00306 ada << getIndent() << "type " << name << "_Array is array (Positive range <>) of " << name << "_Ptr;" << m_endl << m_endl;
00307 ada << getIndent() << "type " << name << "_Array_Ptr is access " << name << "_Array;" << m_endl << m_endl;
00308
00309
00310 UMLAttributeList atl;
00311 if (isClass) {
00312 UMLAttributeList atpub;
00313 atpub.setAutoDelete(false);
00314
00315 atl = c->getAttributeList();
00316
00317 UMLAttribute *at;
00318 for (at = atl.first(); at; at = atl.next()) {
00319 if (at->getVisibility() == Uml::Visibility::Public)
00320 atpub.append(at);
00321 }
00322 if (forceSections() || atpub.count())
00323 ada << getIndent() << "-- Accessors for public attributes:" << m_endl << m_endl;
00324 for (at = atpub.first(); at; at = atpub.next()) {
00325 QString member = cleanName(at->getName());
00326 ada << getIndent() << "procedure Set_" << member << " (";
00327 if (! at->getStatic())
00328 ada << "Self : access " << name << "; ";
00329 ada << "To : " << at->getTypeName() << ");" << m_endl;
00330 ada << getIndent() << "function Get_" << member;
00331 if (! at->getStatic())
00332 ada << " (Self : access " << name << ")";
00333 ada << " return " << at->getTypeName() << ";" << m_endl
00334 << m_endl;
00335 }
00336 }
00337
00338
00339 UMLOperationList opl(c->getOpList());
00340 UMLOperationList oppub;
00341 oppub.setAutoDelete(false);
00342 UMLOperation *op;
00343 for (op = opl.first(); op; op = opl.next()) {
00344 if (op->getVisibility() == Uml::Visibility::Public)
00345 oppub.append(op);
00346 }
00347 if (forceSections() || oppub.count())
00348 ada << getIndent() << "-- Public methods:" << m_endl << m_endl;
00349 for (op = oppub.first(); op; op = oppub.next())
00350 writeOperation(op, ada);
00351
00352 m_indentLevel--;
00353 ada << getIndent() << "private" << m_endl << m_endl;
00354 m_indentLevel++;
00355
00356 UMLAssociationList aggregations = c->getAggregations();
00357 UMLAssociationList compositions = c->getCompositions();
00358
00359 ada << getIndent() << "type " << name << " is ";
00360 if (c->getAbstract())
00361 ada << "abstract ";
00362 if (superclasses.isEmpty()) {
00363 ada << "tagged ";
00364 } else {
00365
00366 UMLClassifier* parent = superclasses.first();
00367 ada << "new " << className(parent, false) << " with ";
00368 }
00369 ada << "record" << m_endl;
00370 m_indentLevel++;
00371
00372 if (forceSections() || !aggregations.isEmpty()) {
00373 ada << getIndent() << "-- Aggregations:" << m_endl;
00374 for (UMLAssociation *a = aggregations.first(); a; a = aggregations.next()) {
00375 if (c != a->getObject(Uml::A))
00376 continue;
00377 QString typeName, roleName;
00378 computeAssocTypeAndRole(c, a, typeName, roleName);
00379 ada << getIndent() << roleName << " : " << typeName << ";" << m_endl;
00380 }
00381 ada << endl;
00382 }
00383 if (forceSections() || !compositions.isEmpty()) {
00384 ada << getIndent() << "-- Compositions:" << m_endl;
00385 for (UMLAssociation *a = compositions.first(); a; a = compositions.next()) {
00386 if (c != a->getObject(Uml::A))
00387 continue;
00388 QString typeName, roleName;
00389 computeAssocTypeAndRole(c, a, typeName, roleName);
00390 ada << getIndent() << roleName << " : " << typeName << ";" << m_endl;
00391 }
00392 ada << endl;
00393 }
00394
00395 if (isClass && (forceSections() || atl.count())) {
00396 ada << getIndent() << "-- Attributes:" << m_endl;
00397 UMLAttribute *at;
00398 for (at = atl.first(); at; at = atl.next()) {
00399 if (at->getStatic())
00400 continue;
00401 ada << getIndent() << cleanName(at->getName()) << " : "
00402 << at->getTypeName();
00403 if (at && at->getInitialValue().latin1() && ! at->getInitialValue().isEmpty())
00404 ada << " := " << at->getInitialValue();
00405 ada << ";" << m_endl;
00406 }
00407 }
00408 bool haveAttrs = (isClass && atl.count());
00409 if (aggregations.isEmpty() && compositions.isEmpty() && !haveAttrs)
00410 ada << getIndent() << "null;" << m_endl;
00411 m_indentLevel--;
00412 ada << getIndent() << "end record;" << m_endl << m_endl;
00413 if (haveAttrs) {
00414 bool seen_static_attr = false;
00415 for (UMLAttribute *at = atl.first(); at; at = atl.next()) {
00416 if (! at->getStatic())
00417 continue;
00418 if (! seen_static_attr) {
00419 ada << getIndent() << "-- Static attributes:" << m_endl;
00420 seen_static_attr = true;
00421 }
00422 ada << getIndent();
00423 if (at->getVisibility() == Uml::Visibility::Private)
00424 ada << "-- Private: ";
00425 ada << cleanName(at->getName()) << " : " << at->getTypeName();
00426 if (at && at->getInitialValue().latin1() && ! at->getInitialValue().isEmpty())
00427 ada << " := " << at->getInitialValue();
00428 ada << ";" << m_endl;
00429 }
00430 if (seen_static_attr)
00431 ada << m_endl;
00432 }
00433
00434 UMLOperationList opprot;
00435 opprot.setAutoDelete(false);
00436 for (op = opl.first(); op; op = opl.next()) {
00437 if (op->getVisibility() == Uml::Visibility::Protected)
00438 opprot.append(op);
00439 }
00440 if (forceSections() || opprot.count())
00441 ada << getIndent() << "-- Protected methods:" << m_endl << m_endl;
00442 for (op = opprot.first(); op; op = opprot.next())
00443 writeOperation(op, ada);
00444
00445
00446
00447
00448
00449
00450
00451 UMLOperationList oppriv;
00452 oppriv.setAutoDelete(false);
00453 for (op = opl.first(); op; op = opl.next()) {
00454 const Uml::Visibility::Value vis = op->getVisibility();
00455 if (vis == Uml::Visibility::Private ||
00456 vis == Uml::Visibility::Implementation)
00457 oppriv.append(op);
00458 }
00459 if (forceSections() || oppriv.count())
00460 ada << getIndent() << "-- Private methods:" << m_endl << m_endl;
00461 for (op = oppriv.first(); op; op = oppriv.next())
00462 writeOperation(op, ada, true);
00463
00464 m_indentLevel--;
00465 ada << getIndent() << "end " << pkg << ";" << m_endl << m_endl;
00466 file.close();
00467 emit codeGenerated(c, true);
00468 }
00469
00470
00471 void AdaWriter::writeOperation(UMLOperation *op, QTextStream &ada, bool is_comment) {
00472 UMLAttributeList atl = op->getParmList();
00473 QString rettype = op->getTypeName();
00474 bool use_procedure = (rettype.isEmpty() || rettype == "void");
00475
00476 ada << getIndent();
00477 if (is_comment)
00478 ada << "-- ";
00479 if (use_procedure)
00480 ada << "procedure ";
00481 else
00482 ada << "function ";
00483 ada << cleanName(op->getName()) << " ";
00484 if (! (op->getStatic() && atl.count() == 0))
00485 ada << "(";
00486 UMLClassifier *parentClassifier = static_cast<UMLClassifier*>(op->getUMLPackage());
00487 if (! op->getStatic()) {
00488 ada << "Self : access " << className(parentClassifier);
00489 if (atl.count())
00490 ada << ";" << m_endl;
00491 }
00492 if (atl.count()) {
00493 uint i = 0;
00494 m_indentLevel++;
00495 for (UMLAttribute *at = atl.first(); at; at = atl.next()) {
00496 ada << getIndent();
00497 if (is_comment)
00498 ada << "-- ";
00499 ada << cleanName(at->getName()) << " : ";
00500 Uml::Parameter_Direction pk = at->getParmKind();
00501 if (pk == Uml::pd_Out)
00502 ada << "out ";
00503 else if (pk == Uml::pd_InOut)
00504 ada << "in out ";
00505 else
00506 ada << "in ";
00507 ada << at->getTypeName();
00508 if (! at->getInitialValue().isEmpty())
00509 ada << " := " << at->getInitialValue();
00510 if (++i < atl.count())
00511 ada << ";" << m_endl;
00512 }
00513 m_indentLevel--;
00514 }
00515 if (! (op->getStatic() && atl.count() == 0))
00516 ada << ")";
00517 if (! use_procedure)
00518 ada << " return " << rettype;
00519 if (op->getAbstract())
00520 ada << " is abstract";
00521 ada << ";" << m_endl << m_endl;
00522 }
00523
00524 QStringList AdaWriter::defaultDatatypes() {
00525 QStringList l;
00526 l.append("Boolean");
00527 l.append("Character");
00528 l.append("Positive");
00529 l.append("Natural");
00530 l.append("Integer");
00531 l.append("Short_Integer");
00532 l.append("Long_Integer");
00533 l.append("Float");
00534 l.append("Long_Float");
00535 l.append("Duration");
00536 l.append("String");
00537 return l;
00538 }
00539
00546 bool AdaWriter::isReservedKeyword(const QString & rPossiblyReservedKeyword) {
00547
00548 const QStringList keywords = reservedKeywords();
00549
00550 QStringList::ConstIterator it;
00551 for (it = keywords.begin(); it != keywords.end(); ++it)
00552 if ((*it).lower() == rPossiblyReservedKeyword.lower())
00553 return true;
00554
00555 return false;
00556 }
00557
00561 const QStringList AdaWriter::reservedKeywords() const {
00562
00563 static QStringList keywords;
00564
00565 if ( keywords.isEmpty() ) {
00566 keywords.append( "abort" );
00567 keywords.append( "abs" );
00568 keywords.append( "abstract" );
00569 keywords.append( "accept" );
00570 keywords.append( "access" );
00571 keywords.append( "aliased" );
00572 keywords.append( "all" );
00573 keywords.append( "and" );
00574 keywords.append( "Argument_Error" );
00575 keywords.append( "array" );
00576 keywords.append( "Assert_Failure" );
00577 keywords.append( "at" );
00578 keywords.append( "begin" );
00579 keywords.append( "body" );
00580 keywords.append( "Boolean" );
00581 keywords.append( "case" );
00582 keywords.append( "Character" );
00583 keywords.append( "constant" );
00584 keywords.append( "Constraint_Error" );
00585 keywords.append( "Conversion_Error" );
00586 keywords.append( "Data_Error" );
00587 keywords.append( "declare" );
00588 keywords.append( "delay" );
00589 keywords.append( "delta" );
00590 keywords.append( "Dereference_Error" );
00591 keywords.append( "Device_Error" );
00592 keywords.append( "digits" );
00593 keywords.append( "do" );
00594 keywords.append( "Duration" );
00595 keywords.append( "else" );
00596 keywords.append( "elsif" );
00597 keywords.append( "end" );
00598 keywords.append( "End_Error" );
00599 keywords.append( "entry" );
00600 keywords.append( "exception" );
00601 keywords.append( "exit" );
00602 keywords.append( "false" );
00603 keywords.append( "Float" );
00604 keywords.append( "for" );
00605 keywords.append( "function" );
00606 keywords.append( "generic" );
00607 keywords.append( "goto" );
00608 keywords.append( "if" );
00609 keywords.append( "in" );
00610 keywords.append( "Index_Error" );
00611 keywords.append( "Integer" );
00612 keywords.append( "is" );
00613 keywords.append( "Layout_Error" );
00614 keywords.append( "Length_Error" );
00615 keywords.append( "limited" );
00616 keywords.append( "Long_Float" );
00617 keywords.append( "Long_Integer" );
00618 keywords.append( "Long_Long_Float" );
00619 keywords.append( "Long_Long_Integer" );
00620 keywords.append( "loop" );
00621 keywords.append( "mod" );
00622 keywords.append( "Mode_Error" );
00623 keywords.append( "Name_Error" );
00624 keywords.append( "Natural" );
00625 keywords.append( "new" );
00626 keywords.append( "not" );
00627 keywords.append( "null" );
00628 keywords.append( "of" );
00629 keywords.append( "or" );
00630 keywords.append( "others" );
00631 keywords.append( "out" );
00632 keywords.append( "package" );
00633 keywords.append( "Pattern_Error" );
00634 keywords.append( "Picture_Error" );
00635 keywords.append( "Pointer_Error" );
00636 keywords.append( "Positive" );
00637 keywords.append( "pragma" );
00638 keywords.append( "private" );
00639 keywords.append( "procedure" );
00640 keywords.append( "Program_Error" );
00641 keywords.append( "protected" );
00642 keywords.append( "raise" );
00643 keywords.append( "range" );
00644 keywords.append( "record" );
00645 keywords.append( "rem" );
00646 keywords.append( "renames" );
00647 keywords.append( "requeue" );
00648 keywords.append( "return" );
00649 keywords.append( "reverse" );
00650 keywords.append( "select" );
00651 keywords.append( "separate" );
00652 keywords.append( "Short_Float" );
00653 keywords.append( "Short_Integer" );
00654 keywords.append( "Short_Short_Float" );
00655 keywords.append( "Short_Short_Integer" );
00656 keywords.append( "Status_Error" );
00657 keywords.append( "Storage_Error" );
00658 keywords.append( "String" );
00659 keywords.append( "subtype" );
00660 keywords.append( "Tag_Error" );
00661 keywords.append( "tagged" );
00662 keywords.append( "task" );
00663 keywords.append( "Tasking_Error" );
00664 keywords.append( "terminate" );
00665 keywords.append( "Terminator_Error" );
00666 keywords.append( "then" );
00667 keywords.append( "Time_Error" );
00668 keywords.append( "Translation_Error" );
00669 keywords.append( "true" );
00670 keywords.append( "type" );
00671 keywords.append( "until" );
00672 keywords.append( "Update_Error" );
00673 keywords.append( "use" );
00674 keywords.append( "Use_Error" );
00675 keywords.append( "when" );
00676 keywords.append( "while" );
00677 keywords.append( "Wide_Character" );
00678 keywords.append( "Wide_String" );
00679 keywords.append( "with" );
00680 keywords.append( "xor" );
00681 }
00682
00683 return keywords;
00684 }
00685
00686 #include "adawriter.moc"
This file is part of the documentation for umbrello Version 3.1.0.