mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
Refactoring: remove code duplication introduced in the previous patch.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51757 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
09b51c348c
commit
2b7bcb4e8d
@ -520,6 +520,61 @@ void processOptionProperties (const DagInit* d, ToolProperties* t,
|
||||
std::for_each(B, d->arg_end(), CollectOptionProperties(t, o));
|
||||
}
|
||||
|
||||
/// AddOption - A function object wrapper for
|
||||
/// processOptionProperties. Used by CollectProperties and
|
||||
/// CollectPropertiesFromOptionList.
|
||||
class AddOption {
|
||||
private:
|
||||
GlobalOptionDescriptions& OptDescs_;
|
||||
ToolProperties* ToolProps_;
|
||||
|
||||
public:
|
||||
explicit AddOption(GlobalOptionDescriptions& OD, ToolProperties* TP = 0)
|
||||
: OptDescs_(OD), ToolProps_(TP)
|
||||
{}
|
||||
|
||||
void operator()(const Init* i) {
|
||||
const DagInit& d = InitPtrToDag(i);
|
||||
checkNumberOfArguments(&d, 2);
|
||||
|
||||
const OptionType::OptionType Type =
|
||||
getOptionType(d.getOperator()->getAsString());
|
||||
const std::string& Name = InitPtrToString(d.getArg(0));
|
||||
|
||||
GlobalOptionDescription OD(Type, Name);
|
||||
if (Type != OptionType::Alias) {
|
||||
processOptionProperties(&d, ToolProps_, OD);
|
||||
if (ToolProps_) {
|
||||
ToolProps_->OptDescs[Name].Type = Type;
|
||||
ToolProps_->OptDescs[Name].Name = Name;
|
||||
}
|
||||
}
|
||||
else {
|
||||
OD.Help = InitPtrToString(d.getArg(1));
|
||||
}
|
||||
OptDescs_.insertDescription(OD);
|
||||
}
|
||||
|
||||
private:
|
||||
OptionType::OptionType getOptionType(const std::string& T) const {
|
||||
if (T == "alias_option")
|
||||
return OptionType::Alias;
|
||||
else if (T == "switch_option")
|
||||
return OptionType::Switch;
|
||||
else if (T == "parameter_option")
|
||||
return OptionType::Parameter;
|
||||
else if (T == "parameter_list_option")
|
||||
return OptionType::ParameterList;
|
||||
else if (T == "prefix_option")
|
||||
return OptionType::Prefix;
|
||||
else if (T == "prefix_list_option")
|
||||
return OptionType::PrefixList;
|
||||
else
|
||||
throw "Unknown option type: " + T + '!';
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/// CollectProperties - Function object for iterating over a list of
|
||||
/// tool property records.
|
||||
class CollectProperties {
|
||||
@ -560,15 +615,15 @@ public:
|
||||
propertyHandlers_["out_language"] = &CollectProperties::onOutLanguage;
|
||||
propertyHandlers_["output_suffix"] = &CollectProperties::onOutputSuffix;
|
||||
propertyHandlers_["parameter_option"]
|
||||
= &CollectProperties::onParameter;
|
||||
= &CollectProperties::addOption;
|
||||
propertyHandlers_["parameter_list_option"] =
|
||||
&CollectProperties::onParameterList;
|
||||
propertyHandlers_["prefix_option"] = &CollectProperties::onPrefix;
|
||||
&CollectProperties::addOption;
|
||||
propertyHandlers_["prefix_option"] = &CollectProperties::addOption;
|
||||
propertyHandlers_["prefix_list_option"] =
|
||||
&CollectProperties::onPrefixList;
|
||||
&CollectProperties::addOption;
|
||||
propertyHandlers_["sink"] = &CollectProperties::onSink;
|
||||
propertyHandlers_["switch_option"] = &CollectProperties::onSwitch;
|
||||
propertyHandlers_["alias_option"] = &CollectProperties::onAlias;
|
||||
propertyHandlers_["switch_option"] = &CollectProperties::addOption;
|
||||
propertyHandlers_["alias_option"] = &CollectProperties::addOption;
|
||||
|
||||
staticMembersInitialized_ = true;
|
||||
}
|
||||
@ -650,47 +705,11 @@ private:
|
||||
toolProps_.setSink();
|
||||
}
|
||||
|
||||
void onAlias (const DagInit* d) {
|
||||
// Just forwards to the AddOption function object. Somewhat
|
||||
// non-optimal, but avoids code duplication.
|
||||
void addOption (const DagInit* d) {
|
||||
checkNumberOfArguments(d, 2);
|
||||
// We just need a GlobalOptionDescription for the aliases.
|
||||
optDescs_.insertDescription
|
||||
(GlobalOptionDescription(OptionType::Alias,
|
||||
InitPtrToString(d->getArg(0)),
|
||||
InitPtrToString(d->getArg(1))));
|
||||
}
|
||||
|
||||
void onSwitch (const DagInit* d) {
|
||||
addOption(d, OptionType::Switch);
|
||||
}
|
||||
|
||||
void onParameter (const DagInit* d) {
|
||||
addOption(d, OptionType::Parameter);
|
||||
}
|
||||
|
||||
void onParameterList (const DagInit* d) {
|
||||
addOption(d, OptionType::ParameterList);
|
||||
}
|
||||
|
||||
void onPrefix (const DagInit* d) {
|
||||
addOption(d, OptionType::Prefix);
|
||||
}
|
||||
|
||||
void onPrefixList (const DagInit* d) {
|
||||
addOption(d, OptionType::PrefixList);
|
||||
}
|
||||
|
||||
/// Helper functions
|
||||
|
||||
// Add an option of type t
|
||||
void addOption (const DagInit* d, OptionType::OptionType t) {
|
||||
checkNumberOfArguments(d, 2);
|
||||
const std::string& Name = InitPtrToString(d->getArg(0));
|
||||
GlobalOptionDescription OD(t, Name);
|
||||
|
||||
toolProps_.OptDescs[Name].Type = t;
|
||||
toolProps_.OptDescs[Name].Name = Name;
|
||||
processOptionProperties(d, &toolProps_, OD);
|
||||
optDescs_.insertDescription(OD);
|
||||
AddOption(optDescs_, &toolProps_)(d);
|
||||
}
|
||||
|
||||
};
|
||||
@ -723,46 +742,6 @@ void CollectToolProperties (RecordVector::const_iterator B,
|
||||
}
|
||||
}
|
||||
|
||||
/// AddOption - A helper function object used by
|
||||
/// CollectPropertiesFromOptionList.
|
||||
// TOFIX: this largely duplicates CollectProperties::addOption, find a
|
||||
// way to merge them.
|
||||
class AddOption {
|
||||
private:
|
||||
GlobalOptionDescriptions& OptDescs_;
|
||||
|
||||
public:
|
||||
explicit AddOption(GlobalOptionDescriptions& OD) : OptDescs_(OD)
|
||||
{}
|
||||
|
||||
void operator()(Init* i) {
|
||||
const DagInit& d = InitPtrToDag(i);
|
||||
checkNumberOfArguments(&d, 2);
|
||||
const std::string& Type = d.getOperator()->getAsString();
|
||||
const std::string& Name = InitPtrToString(d.getArg(0));
|
||||
GlobalOptionDescription OD(AddOption::getType(Type), Name);
|
||||
if (OD.Type != OptionType::Alias)
|
||||
processOptionProperties(&d, 0, OD);
|
||||
OptDescs_.insertDescription(OD);
|
||||
}
|
||||
|
||||
OptionType::OptionType getType(const std::string& T) const {
|
||||
if (T == "alias_option")
|
||||
return OptionType::Alias;
|
||||
else if (T == "switch_option")
|
||||
return OptionType::Switch;
|
||||
else if (T == "parameter_option")
|
||||
return OptionType::Parameter;
|
||||
else if (T == "parameter_list_option")
|
||||
return OptionType::ParameterList;
|
||||
else if (T == "prefix_option")
|
||||
return OptionType::Prefix;
|
||||
else if (T == "prefix_list_option")
|
||||
return OptionType::PrefixList;
|
||||
else
|
||||
throw "Unknown option type: " + T + '!';
|
||||
}
|
||||
};
|
||||
|
||||
/// CollectPropertiesFromOptionList - Gather information about
|
||||
/// *global* option properties from the OptionList.
|
||||
|
Loading…
Reference in New Issue
Block a user