bool ClassNode::hasOverrideMethod(TemplateArguments* templateArguments) { std::vector<MemberNode*> memberNodes; m_memberList->collectMemberNodes(memberNodes); size_t count = memberNodes.size(); for(size_t i = 0; i < count; ++i) { MemberNode* memberNode = memberNodes[i]; if(snt_method == memberNode->m_nodeType) { MethodNode* methodNode = static_cast<MethodNode*>(memberNode); if(methodNode->m_override) { return true; } } } std::vector<TypeNameNode*> baseTypeNameNodes; m_baseList->collectTypeNameNodes(baseTypeNameNodes); count = baseTypeNameNodes.size(); for(size_t i = 0; i < count; ++i) { TypeNameNode* typeNameNode = baseTypeNameNodes[i]; TypeNode* typeNode = typeNameNode->getActualTypeNode(templateArguments); if (typeNode->isTemplateClassInstance()) { TemplateClassInstanceTypeNode* templateClassInstanceTypeNode = static_cast<TemplateClassInstanceTypeNode*>(typeNode); if (templateClassInstanceTypeNode->m_classNode->hasOverrideMethod(&templateClassInstanceTypeNode->m_templateClassInstanceNode->m_templateArguments)) { return true; } } else { assert(typeNode->isClass() && !typeNode->isTemplateClass()); ClassTypeNode* classTypeNode = static_cast<ClassTypeNode*>(typeNode); if (classTypeNode->m_classNode->hasOverrideMethod(0)) { return true; } } } return false; }
void ClassNode::collectOverrideMethods(std::vector<MethodNode*>& methodNodes, TemplateArguments* templateArguments) { std::vector<MemberNode*> memberNodes; m_memberList->collectMemberNodes(memberNodes); size_t count = memberNodes.size(); for(size_t i = 0; i < count; ++i) { MemberNode* memberNode = memberNodes[i]; if(snt_method == memberNode->m_nodeType) { MethodNode* methodNode = static_cast<MethodNode*>(memberNode); if(methodNode->m_override) { methodNodes.push_back(methodNode); } } } std::vector<TypeNameNode*> baseTypeNameNodes; m_baseList->collectTypeNameNodes(baseTypeNameNodes); count = baseTypeNameNodes.size(); for(size_t i = 0; i < count; ++i) { TypeNameNode* typeNameNode = baseTypeNameNodes[i]; TypeNode* typeNode = typeNameNode->getActualTypeNode(templateArguments); if (typeNode->isTemplateClassInstance()) { TemplateClassInstanceTypeNode* templateClassInstanceTypeNode = static_cast<TemplateClassInstanceTypeNode*>(typeNode); templateClassInstanceTypeNode->m_classNode->collectOverrideMethods(methodNodes, &templateClassInstanceTypeNode->m_templateClassInstanceNode->m_templateArguments); } else { assert(typeNode->isClass() && !typeNode->isTemplateClass()); ClassTypeNode* classTypeNode = static_cast<ClassTypeNode*>(typeNode); classTypeNode->m_classNode->collectOverrideMethods(methodNodes, 0); } } }