void CSharpWriter::writeOverridesRecursive(UMLClassifierList *superclasses, QTextStream &cs) { // oplist for implemented abstract operations UMLOperationList opabstract; opabstract.setAutoDelete(false); UMLClassifier *obj; for (obj = superclasses->first(); obj; obj = superclasses->next()) { if (!obj->isInterface() && obj->hasAbstractOps()) { // collect abstract ops UMLOperationList opl(obj->getOpList()); for (UMLOperation *op = opl.first(); op ; op = opl.next()) { if (op->getAbstract()) { opabstract.append(op); } } // write abstract implementations cs << m_endl << m_container_indent << m_indentation << "#region " << obj->getName() << " members" << m_endl << m_endl; writeOperations(opabstract,cs,false,true,true); cs << m_container_indent << m_indentation << "#endregion" << m_endl << m_endl; opabstract.clear(); } // Recurse to parent superclasses UMLClassifierList superRecursive = obj->getSuperClasses(); UMLClassifierList *superRecursivePtr =& superRecursive; if (superRecursivePtr->count() > 0) { writeOverridesRecursive(superRecursivePtr, cs); } } }
/** * update the start and end text for this hierarchicalcodeblock. */ void CPPHeaderClassDeclarationBlock::updateContent () { CPPHeaderCodeDocument *parentDoc = dynamic_cast<CPPHeaderCodeDocument*>(getParentDocument()); UMLClassifier *c = parentDoc->getParentClassifier(); QString endLine = UMLApp::app()->commonPolicy()->getNewLineEndingChars(); bool isInterface = parentDoc->parentIsInterface(); // a little shortcut QString CPPHeaderClassName = CodeGenerator::cleanName(c->name()); bool forceDoc = UMLApp::app()->commonPolicy()->getCodeVerboseDocumentComments(); // COMMENT //check if class is abstract.. it should have abstract methods if(!isInterface && c->isAbstract() && !c->hasAbstractOps()) { getComment()->setText(QLatin1String("******************************* Abstract Class ****************************") + endLine + CPPHeaderClassName + QLatin1String(" does not have any pure virtual methods, but its author") + endLine + QLatin1String(" defined it as an abstract class, so you should not use it directly.") + endLine + QLatin1String(" Inherit from it instead and create only objects from the derived classes") + endLine + QLatin1String("*****************************************************************************")); } else { if(isInterface) getComment()->setText(QLatin1String("Interface ") + CPPHeaderClassName + endLine + c->doc()); else getComment()->setText(QLatin1String("Class ") + CPPHeaderClassName + endLine + c->doc()); } if(forceDoc || !c->doc().isEmpty()) getComment()->setWriteOutText(true); else getComment()->setWriteOutText(false); // Now set START/ENDING Text QString startText; /* */ /* if(parentDoc->parentIsInterface()) startText.append(QLatin1String("interface ")); else */ startText.append(QLatin1String("class ")); startText.append(CPPHeaderClassName); // write inheritances out UMLClassifierList superclasses = c->findSuperClassConcepts(); int nrof_superclasses = superclasses.count(); // write out inheritance int i = 0; if(nrof_superclasses >0) startText.append(QLatin1String(" : ")); foreach (UMLClassifier* concept, superclasses) { startText.append(Uml::Visibility::toString(concept->visibility()) + QLatin1Char(' ') + CodeGenerator::cleanName(concept->name())); if(i != (nrof_superclasses-1)) startText.append(QLatin1String(", ")); i++; }