コード例 #1
0
ファイル: subprograms.cpp プロジェクト: DenisTravin/qreal
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;
}
コード例 #2
0
ファイル: subprograms.cpp プロジェクト: timbog/qreal
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;
}