Subprograms::GenerationResult Subprograms::generate(ControlFlowGeneratorBase *mainGenerator , const QString &indentString) { QMap<Id, QString> declarations; QMap<Id, QString> implementations; Id toGen = firstToGenerate(); while (toGen != Id()) { mDiscoveredSubprograms[toGen] = true; const Id graphicalDiagramId = graphicalId(toGen); if (graphicalDiagramId.isNull()) { mErrorReporter.addError(QObject::tr("Graphical diagram instance not found")); return GenerationResult::fatalError; } const QString rawIdentifier = mRepo.name(toGen); const QString identifier = mNameNormalizer->convert(rawIdentifier); if (!checkIdentifier(identifier, rawIdentifier)) { return GenerationResult::fatalError; } ControlFlowGeneratorBase *generator = mainGenerator->cloneFor(graphicalDiagramId, true); auto readableGenerator = dynamic_cast<ReadableControlFlowGenerator *>(generator); semantics::SemanticTree *controlFlow = generator->generate(Id(), "@@unknown@@"); if (!controlFlow || (readableGenerator && readableGenerator->cantBeGeneratedIntoStructuredCode())) { return GenerationResult::error; } implementations[toGen] = controlFlow->toString(1, indentString); const QString forwardDeclaration = readSubprogramTemplate(toGen, "subprograms/forwardDeclaration.t"); declarations[toGen] = forwardDeclaration; toGen = firstToGenerate(); } obtainCode(declarations, implementations); return GenerationResult::success; }
bool Subprograms::generate(ControlFlowGeneratorBase *mainGenerator) { QMap<Id, QString> declarations; QMap<Id, QString> implementations; Id toGen = firstToGenerate(); while (toGen != Id()) { mDiscoveredSubprograms[toGen] = true; Id const graphicalDiagramId = graphicalId(toGen); if (graphicalDiagramId.isNull()) { mErrorReporter.addError(QObject::tr("Graphical diagram instance not found")); return false; } QString const rawIdentifier = mRepo.name(toGen); QString const identifier = mNameNormalizer->convert(rawIdentifier); if (!checkIdentifier(identifier, rawIdentifier)) { return false; } ControlFlowGeneratorBase *generator = mainGenerator->cloneFor(graphicalDiagramId); semantics::SemanticTree *controlFlow = generator->generate(); if (!controlFlow) { return false; } implementations[toGen] = controlFlow->toString(1); QString const forwardDeclaration = readSubprogramTemplate(toGen, "subprograms/forwardDeclaration.t"); declarations[toGen] = forwardDeclaration; toGen = firstToGenerate(); } mergeCode(declarations, implementations); return true; }