예제 #1
0
	void ClassCheck::checkInterfaceParams(
		const ClassDefPtr& pClassDef,
		const InterfaceDefPtr& pInterfaceDef,
		const StaticContextPtr& pRootCtx,
		const LogPtr& pLog) const
	{
		const map<const wstring, FormalParamDefPtr>& ifaceFormalParams =
			pInterfaceDef->getFormalParametersMap();

		const map<const wstring, FormalParamDefPtr>& classFormalParams =
			pClassDef->getFormalParametersMap();

		if (ifaceFormalParams.empty())
		{
			return;
		}

		map<const wstring, FormalParamDefPtr>::const_iterator iit;
		map<const wstring, FormalParamDefPtr>::const_iterator cit;

		for (iit = ifaceFormalParams.begin(); iit != ifaceFormalParams.end(); iit++)
		{
			const FormalParamDefPtr& pIfaceParam = (*iit).second;
			cit = classFormalParams.find(pIfaceParam->getParamName());
			if (cit == classFormalParams.end())
			{
				boost::wformat f(L"Interface parameter %1% not found.");
				f % pIfaceParam->getParamName();
				pLog->log(*pClassDef, msg::ErrAnaClassDef_MissingIfaceParam, f.str());
				continue;
			}

			const FormalParamDefPtr& pClassParam = (*cit).second;

			if (!SemanticAnalysis::isTypeAssignableFrom(
					pClassParam->getType(),
					pIfaceParam->getType(),
					pRootCtx))
			{
				boost::wformat f(
					L"Can't convert from %1% to %2% at class parameter %3% defined on interface %4%.");
				f % pIfaceParam->getType()->toString() % 
					pClassParam->getType()->toString() % 
					pIfaceParam->getParamName() %
					pInterfaceDef->getClassName();
				pLog->log(*pClassDef, msg::ErrAnaClassDef_IfaceParamIncompTypes, f.str());
				continue;
			}
		}

		for (cit = classFormalParams.begin(); cit != classFormalParams.end(); cit++)
		{
			const wstring& classParamName = (*cit).first;

			iit = ifaceFormalParams.find(classParamName);
			if (iit == ifaceFormalParams.end())
			{
				boost::wformat f(L"Class parameter %1% not defined on interface %2%.");
				f % classParamName % pInterfaceDef->getClassName();
				pLog->log(*pClassDef, msg::ErrAnaClassDef_ClassParamNotFoundIface, f.str());
				continue;
			}
		}
	}