Beispiel #1
0
void writeMethodReflectionCode(const CppMethod * cppMethod, BuilderWriter * writer, CodeBlock * codeBlock,
										   const std::string & methodName)
{
	size_t arity = cppMethod->getArity();
	bool hasDefaultValue = (arity > 0 && cppMethod->paramHasDefaultValue(arity - 1));

	std::string s;

	if(cppMethod->isOverloaded()) {
		s = Poco::format("%s(\"%s\", (%s)(&%s%s))",
			writer->getReflectionAction("_method"),
			methodName,
			cppMethod->getTextOfPointeredType(),
			getReflectionScope(cppMethod),
			methodName,
			string(hasDefaultValue ? "" : ";")
		);
	}
	else {
		s = Poco::format("%s(\"%s\", &%s%s)",
			writer->getReflectionAction("_method"),
			methodName,
			getReflectionScope(cppMethod),
			methodName,
			string(hasDefaultValue ? "" : ";")
		);
	}
	codeBlock->appendLine(s);

	if(hasDefaultValue) {
		writeMethodDefaultParameterReflection(cppMethod, codeBlock->appendBlock(cbsIndent));
		codeBlock->appendLine(";");
	}
}
Beispiel #2
0
void BuilderEnum::doWriteMetaData(BuilderWriter * writer)
{
	const CppEnum * cppEnum = this->getCppEnum();
	CodeBlock * codeBlock = writer->getParentReflectionCodeBlock(cppEnum);

	string enumTypeName;
	string enumName;

	if(cppEnum->isAnonymous()) {
		enumName = Poco::format("AnonymousEnum_%d", cppEnum->getIndexInCategory());
		enumTypeName = "long long";
	}
	else {
		enumName = cppEnum->getName();
		enumTypeName = getReflectionScope(cppEnum, true) + enumName;
	}

	std::string s = Poco::format("%s<%s>(\"%s\")",
		writer->getReflectionAction("_enum"),
		enumTypeName,
		enumName
	);

	codeBlock->appendLine(s);

	string scope = getReflectionScope(cppEnum, false);
	CodeBlock * valueBlock = codeBlock->appendBlock(cbsIndent);
	const CppEnum::ValueListType * valueList = cppEnum->getValueList();
	for(CppEnum::ValueListType::const_iterator it = valueList->begin(); it != valueList->end(); ++it) {
		s = Poco::format("._element(\"%s\", %s%s)", it->getName(), scope, it->getName());
		valueBlock->appendLine(s);
	}
	codeBlock->appendLine(";");
}
Beispiel #3
0
void writeMethodReflectionCode(const CppMethod * cppMethod, BuilderWriter * writer, CodeBlock * codeBlock,
										   const string & methodName)
{
	size_t arity = cppMethod->getArity();
	bool hasDefaultValue = (arity > 0 && cppMethod->paramHasDefaultValue(arity - 1));

	string s, t;

	s = Poco::format("%s(\"%s\"",
		writer->getReflectionAction("_method"),
		methodName);
	t = Poco::format("&%s%s)%s",
		getReflectionScope(cppMethod, false),
		methodName,
		getInvokablePolicyText(cppMethod, true)
	);
	if(cppMethod->isOverloaded()) {
		if(cppMethod->isArityUnique()) {
			s = Poco::format("%s, cpgf::selectFunctionByArity%d(%s)", s, (int)(cppMethod->getArity()), t);
		}
		else {
			if(cppMethod->hasTemplateDependentParam()) {
				getLogger().warn(
					Poco::format("Function %s is overloaded and has template dependent argument, meta data can't be generated.\n",
					cppMethod->getTextOfPointeredType(true))
				);
//				return;
			}
			s = Poco::format("%s, (%s)(%s)", s, cppMethod->getTextOfPointeredType(true), t);
		}
	}
	else {
		s = Poco::format("%s, %s", s, t);
	}

	if(! hasDefaultValue) {
		s.append(";");
	}
	codeBlock->appendLine(s);

	if(hasDefaultValue) {
		writeMethodDefaultParameterReflection(cppMethod, codeBlock->appendBlock(cbsIndent));
		codeBlock->appendLine(";");
	}
}