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; } } }