Example #1
0
void SourceFileGenerator::generateCode_AdditionalMethod(FILE* file, MethodNode* methodNode, int indentation)
{
	ClassNode* classNode = static_cast<ClassNode*>(methodNode->m_enclosing);

	generateCode_TemplateHeader(file, classNode, indentation);


	writeStringToFile("inline ", file, indentation);

	std::string typeName;
	GetClassName(typeName, classNode);


	writeStringToFile(typeName.c_str(), file);

	if(0 != methodNode->m_passing)
	{
		generateCode_Token(file, methodNode->m_passing, 0);
	}
	writeStringToFile(g_strSpaces, 1, file);
	writeStringToFile(typeName.c_str(), file);
	writeStringToFile("::", file);

	generateCode_Identify(file, methodNode->m_name, 0);

	generateCode_Token(file, methodNode->m_leftParenthesis, 0);
	std::vector<std::pair<TokenNode*, ParameterNode*>> parameterNodes;
	methodNode->collectParameterNodes(parameterNodes);
	size_t parameterCount = parameterNodes.size();
	for(size_t i = 0; i < parameterCount; ++i)
	{
		if(parameterNodes[i].first)
		{
			generateCode_Token(file, parameterNodes[i].first, 0);
		}
		generateCode_Parameter(file, parameterNodes[i].second, methodNode, 0);
	}
	generateCode_Token(file, methodNode->m_rightParenthesis, 0);
	writeStringToFile("\n", file);
	char buf[512];
	writeStringToFile("{\n", file, indentation);
	if("NewArray" == methodNode->m_name->m_str)
	{
		if(classNode->isValueType())
		{
			sprintf_s(buf, "return new_array<%s>(count);\n", typeName.c_str());
		}
		else
		{
			sprintf_s(buf, "return new_array<::pafcore::RefCountObject<%s>>(count);\n", typeName.c_str());
		}
		writeStringToFile(buf, file, indentation + 1);
	}
	else if("NewArrayARC" == methodNode->m_name->m_str)
	{
		sprintf_s(buf, "return new_array<::pafcore::AtomicRefCountObject<%s>>(count);\n", typeName.c_str());
		writeStringToFile(buf, file, indentation + 1);
	}
	else
	{
		if("New" == methodNode->m_name->m_str || "Clone" == methodNode->m_name->m_str)
		{
			if(classNode->isValueType())
			{
				sprintf_s(buf, "return new %s(", typeName.c_str());
			}
			else
			{
				sprintf_s(buf, "return new ::pafcore::RefCountObject<%s>(", typeName.c_str());
			}
		}
		else
		{
			assert("NewARC" == methodNode->m_name->m_str || "CloneARC" == methodNode->m_name->m_str);
			sprintf_s(buf, "return new ::pafcore::AtomicRefCountObject<%s>(", typeName.c_str());
		}
		writeStringToFile(buf, file, indentation + 1);
		for(size_t i = 0; i < parameterCount; ++i)
		{
			if(i != 0)
			{
				writeStringToFile(", ", file);
			}
			writeStringToFile(parameterNodes[i].second->m_name->m_str.c_str(), file);
		}
		writeStringToFile(");\n", file);
	}
	writeStringToFile("}\n\n", file, indentation);
}