Ejemplo n.º 1
0
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));
}
Ejemplo n.º 2
0
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));
}
Ejemplo n.º 3
0
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);
  }
}