void ClassScope::addTraitAlias(TraitAliasStatementPtr aliasStmt) { assert(Option::WholeProgram); const string &traitName = aliasStmt->getTraitName(); const string &origMethName = aliasStmt->getMethodName(); const string &newMethName = aliasStmt->getNewMethodName(); string origName = traitName.empty() ? "(null)" : traitName; origName += "::" + origMethName; m_traitAliases.push_back(std::pair<string, string>(newMethName, origName)); }
void ClassScope::TMIOps::addTraitAlias(ClassScope* cs, TraitAliasStatementPtr stmt, ClassScopePtr traitCls) { auto const& traitName = stmt->getTraitName(); auto const& origMethName = stmt->getMethodName(); auto const& newMethName = stmt->getNewMethodName(); auto origName = traitName.empty() ? "(null)" : traitName; origName += "::" + origMethName; cs->m_traitAliases.push_back(std::make_pair(newMethName, origName)); }
void ClassScope::applyTraitAliasRule(AnalysisResultPtr ar, TraitAliasStatementPtr stmt) { assert(Option::WholeProgram); const string traitName = toLower(stmt->getTraitName()); const string origMethName = toLower(stmt->getMethodName()); const string newMethName = toLower(stmt->getNewMethodName()); // Get the trait's "class" ClassScopePtr traitCls; if (traitName.empty()) { traitCls = findSingleTraitWithMethod(ar, origMethName); } else { traitCls = ar->findClass(traitName); } if (!traitCls || !(traitCls->isTrait())) { stmt->analysisTimeFatal( Compiler::UnknownTrait, Strings::TRAITS_UNKNOWN_TRAIT, traitName.empty() ? origMethName.c_str() : traitName.c_str() ); } // Keep record of alias rule addTraitAlias(stmt); // Get the method std::set<ClassScopePtr> visitedTraits; MethodStatementPtr methStmt = findTraitMethod(ar, traitCls, origMethName, visitedTraits); if (!methStmt) { stmt->analysisTimeFatal( Compiler::UnknownTraitMethod, Strings::TRAITS_UNKNOWN_TRAIT_METHOD, origMethName.c_str() ); } if (origMethName == newMethName) { setImportTraitMethodModifiers(origMethName, traitCls, stmt->getModifiers()); } else { // Insert renamed entry into the set of methods to be imported TraitMethod traitMethod(traitCls, methStmt, stmt->getModifiers(), stmt, stmt->getNewMethodName()); addImportTraitMethod(traitMethod, newMethName); } }