umbrello API Documentation

adawriter.cpp

00001 /***************************************************************************
00002  *                        adawriter.cpp  -  description                    *
00003  *                           -------------------                           *
00004  *  Based on javawriter.cpp by Luis De la Parra Blum                       *
00005  *  copyright            : (C) 2002 by Oliver Kellogg                      *
00006  *    (C) 2003-2007 Umbrello UML Modeller Authors <uml-devel@uml.sf.net>   *
00007  ***************************************************************************
00008  *                                                                         *
00009  *   This program is free software; you can redistribute it and/or modify  *
00010  *   it under the terms of the GNU General Public License as published by  *
00011  *   the Free Software Foundation; either version 2 of the License, or     *
00012  *   (at your option) any later version.                                   *
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     // CORBAValue, CORBAInterface, and all empty/unknown stereotypes are
00069     // assumed to be OO classes.
00070     return true;
00071 }
00072 
00073 QString AdaWriter::className(UMLClassifier *c, bool inOwnScope) {
00074     // If the class has an enclosing package then it is assumed that
00075     // the class name is the type name; if the class does not have an
00076     // enclosing package then the class name acts as the Ada package
00077     // name.
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     // If the class has an enclosing package then it is assumed that
00095     // the class name is the type name; if the class does not have an
00096     // enclosing package then the class name acts as the Ada package
00097     // name.
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     //find an appropriate name for our file
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     // Start generating the code.
00173 
00174     QTextStream ada(&file);
00175     //try to find a heading file(license, comments, etc)
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     // Import referenced classes.
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     // Generate generic formals.
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                 // Check whether it's a data type.
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     // Here comes the package proper.
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     // Write class Documentation if non-empty or if force option set.
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         // FIXME: Multiple inheritance is not yet supported
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     // Generate accessors for public attributes.
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     // Generate public operations.
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         // FIXME: Multiple inheritance is not yet supported
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     // Generate protected operations.
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     // Generate private operations.
00446     // These are currently only generated as comments in the private part
00447     // of the spec.
00448     // Once umbrello supports the merging of automatically generated and
00449     // hand written code sections, private operations should be generated
00450     // into the package body.
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()) //FIXME gcc warning
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"
KDE Logo
This file is part of the documentation for umbrello Version 3.1.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Jun 26 08:07:54 2007 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003