From Mike Wittman, updates to support new protected method support
This commit is contained in:
parent
267079e4d8
commit
9fa317c550
@ -47,6 +47,193 @@ bool type_order(const Type *v1, const Type *v2)
|
||||
return v1->getQualifiedName().compare(v2->getQualifiedName()) < 0;
|
||||
}
|
||||
|
||||
void print_method(const MethodInfo &mi)
|
||||
{
|
||||
std::cout << "\t ";
|
||||
|
||||
// display if the method is virtual
|
||||
if (mi.isVirtual())
|
||||
std::cout << "virtual ";
|
||||
|
||||
// display the method's return type if defined
|
||||
if (mi.getReturnType().isDefined())
|
||||
std::cout << mi.getReturnType().getQualifiedName() << " ";
|
||||
else
|
||||
std::cout << "[UNDEFINED TYPE] ";
|
||||
|
||||
// display the method's name
|
||||
std::cout << mi.getName() << "(";
|
||||
|
||||
// display method's parameters
|
||||
const ParameterInfoList ¶ms = mi.getParameters();
|
||||
for (ParameterInfoList::const_iterator k=params.begin(); k!=params.end(); ++k)
|
||||
{
|
||||
// get the ParameterInfo object that describes the
|
||||
// current parameter
|
||||
const ParameterInfo &pi = **k;
|
||||
|
||||
// display the parameter's modifier
|
||||
if (pi.isIn())
|
||||
std::cout << "IN";
|
||||
if (pi.isOut())
|
||||
std::cout << "OUT";
|
||||
if (pi.isIn() || pi.isOut())
|
||||
std::cout << " ";
|
||||
|
||||
// display the parameter's type name
|
||||
if (pi.getParameterType().isDefined())
|
||||
std::cout << pi.getParameterType().getQualifiedName();
|
||||
|
||||
// display the parameter's name if defined
|
||||
if (!pi.getName().empty())
|
||||
std::cout << " " << pi.getName();
|
||||
|
||||
if ((k+1)!=params.end())
|
||||
std::cout << ", ";
|
||||
}
|
||||
std::cout << ")";
|
||||
if (mi.isConst())
|
||||
std::cout << " const";
|
||||
if (mi.isPureVirtual())
|
||||
std::cout << " = 0";
|
||||
std::cout << "\n";
|
||||
}
|
||||
|
||||
void print_type(const Type &type)
|
||||
{
|
||||
// ignore pointer types and undefined types
|
||||
if (!type.isDefined() || type.isPointer() || type.isReference())
|
||||
return;
|
||||
|
||||
// print the type name
|
||||
std::cout << type.getQualifiedName() << "\n";
|
||||
|
||||
// check whether the type is abstract
|
||||
if (type.isAbstract()) std::cout << "\t[abstract]\n";
|
||||
|
||||
// check whether the type is atomic
|
||||
if (type.isAtomic()) std::cout << "\t[atomic]\n";
|
||||
|
||||
// check whether the type is an enumeration. If yes, display
|
||||
// the list of enumeration labels
|
||||
if (type.isEnum())
|
||||
{
|
||||
std::cout << "\t[enum]\n";
|
||||
std::cout << "\tenumeration values:\n";
|
||||
const EnumLabelMap &emap = type.getEnumLabels();
|
||||
for (EnumLabelMap::const_iterator j=emap.begin(); j!=emap.end(); ++j)
|
||||
{
|
||||
std::cout << "\t\t" << j->second << " = " << j->first << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
// if the type has one or more base types, then display their
|
||||
// names
|
||||
if (type.getNumBaseTypes() > 0)
|
||||
{
|
||||
std::cout << "\tderived from: ";
|
||||
for (int j=0; j<type.getNumBaseTypes(); ++j)
|
||||
{
|
||||
const Type &base = type.getBaseType(j);
|
||||
if (base.isDefined())
|
||||
std::cout << base.getQualifiedName() << " ";
|
||||
else
|
||||
std::cout << "[undefined type] ";
|
||||
}
|
||||
std::cout << "\n";
|
||||
}
|
||||
|
||||
// display a list of public methods defined for the current type
|
||||
const MethodInfoList &mil = type.getMethods();
|
||||
if (!mil.empty())
|
||||
{
|
||||
std::cout << "\t* public methods:\n";
|
||||
for (MethodInfoList::const_iterator j=mil.begin(); j!=mil.end(); ++j)
|
||||
{
|
||||
// get the MethodInfo object that describes the current
|
||||
// method
|
||||
const MethodInfo &mi = **j;
|
||||
|
||||
print_method(mi);
|
||||
}
|
||||
}
|
||||
|
||||
// display a list of protected methods defined for the current type
|
||||
const MethodInfoList &bmil = type.getMethods(Type::PROTECTED_FUNCTIONS);
|
||||
if (!bmil.empty())
|
||||
{
|
||||
std::cout << "\t* protected methods:\n";
|
||||
for (MethodInfoList::const_iterator j=bmil.begin(); j!=bmil.end(); ++j)
|
||||
{
|
||||
// get the MethodInfo object that describes the current
|
||||
// method
|
||||
const MethodInfo &mi = **j;
|
||||
|
||||
print_method(mi);
|
||||
}
|
||||
}
|
||||
|
||||
// display a list of properties defined for the current type
|
||||
const PropertyInfoList &pil = type.getProperties();
|
||||
if (!pil.empty())
|
||||
{
|
||||
std::cout << "\t* properties:\n";
|
||||
for (PropertyInfoList::const_iterator j=pil.begin(); j!=pil.end(); ++j)
|
||||
{
|
||||
// get the PropertyInfo object that describes the current
|
||||
// property
|
||||
const PropertyInfo &pi = **j;
|
||||
|
||||
std::cout << "\t ";
|
||||
|
||||
std::cout << "{";
|
||||
std::cout << (pi.canGet()? "G": " ");
|
||||
std::cout << (pi.canSet()? "S": " ");
|
||||
std::cout << (pi.canCount()? "C": " ");
|
||||
std::cout << (pi.canAdd()? "A": " ");
|
||||
std::cout << "} ";
|
||||
|
||||
// display the property's name
|
||||
std::cout << pi.getName();
|
||||
|
||||
// display the property's value type if defined
|
||||
std::cout << " (";
|
||||
if (pi.getPropertyType().isDefined())
|
||||
std::cout << pi.getPropertyType().getQualifiedName();
|
||||
else
|
||||
std::cout << "UNDEFINED TYPE";
|
||||
std::cout << ") ";
|
||||
|
||||
// check whether the property is an array property
|
||||
if (pi.isArray())
|
||||
{
|
||||
std::cout << " [ARRAY]";
|
||||
}
|
||||
|
||||
// check whether the property is an indexed property
|
||||
if (pi.isIndexed())
|
||||
{
|
||||
std::cout << " [INDEXED]\n\t\t indices:\n";
|
||||
|
||||
const ParameterInfoList &ind = pi.getIndexParameters();
|
||||
|
||||
// print the list of indices
|
||||
int num = 1;
|
||||
for (ParameterInfoList::const_iterator k=ind.begin(); k!=ind.end(); ++k, ++num)
|
||||
{
|
||||
std::cout << "\t\t " << num << ") ";
|
||||
const ParameterInfo &par = **k;
|
||||
std::cout << par.getParameterType().getQualifiedName() << " " << par.getName();
|
||||
std::cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "\n";
|
||||
}
|
||||
}
|
||||
std::cout << "\n" << std::string(75, '-') << "\n";
|
||||
}
|
||||
|
||||
void print_types()
|
||||
{
|
||||
// get the map of types that have been reflected
|
||||
@ -65,169 +252,7 @@ void print_types()
|
||||
// details for each type
|
||||
for (TypeList::const_iterator i=types.begin(); i!=types.end(); ++i)
|
||||
{
|
||||
// ignore pointer types and undefined types
|
||||
if (!(*i)->isDefined() || (*i)->isPointer() || (*i)->isReference())
|
||||
continue;
|
||||
|
||||
// print the type name
|
||||
std::cout << (*i)->getQualifiedName() << "\n";
|
||||
|
||||
// check whether the type is abstract
|
||||
if ((*i)->isAbstract()) std::cout << "\t[abstract]\n";
|
||||
|
||||
// check whether the type is atomic
|
||||
if ((*i)->isAtomic()) std::cout << "\t[atomic]\n";
|
||||
|
||||
// check whether the type is an enumeration. If yes, display
|
||||
// the list of enumeration labels
|
||||
if ((*i)->isEnum())
|
||||
{
|
||||
std::cout << "\t[enum]\n";
|
||||
std::cout << "\tenumeration values:\n";
|
||||
const EnumLabelMap &emap = (*i)->getEnumLabels();
|
||||
for (EnumLabelMap::const_iterator j=emap.begin(); j!=emap.end(); ++j)
|
||||
{
|
||||
std::cout << "\t\t" << j->second << " = " << j->first << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
// if the type has one or more base types, then display their
|
||||
// names
|
||||
if ((*i)->getNumBaseTypes() > 0)
|
||||
{
|
||||
std::cout << "\tderived from: ";
|
||||
for (int j=0; j<(*i)->getNumBaseTypes(); ++j)
|
||||
{
|
||||
const Type &base = (*i)->getBaseType(j);
|
||||
if (base.isDefined())
|
||||
std::cout << base.getQualifiedName() << " ";
|
||||
else
|
||||
std::cout << "[undefined type] ";
|
||||
}
|
||||
std::cout << "\n";
|
||||
}
|
||||
|
||||
// display a list of methods defined for the current type
|
||||
const MethodInfoList &mil = (*i)->getMethods();
|
||||
if (!mil.empty())
|
||||
{
|
||||
std::cout << "\t* methods:\n";
|
||||
for (MethodInfoList::const_iterator j=mil.begin(); j!=mil.end(); ++j)
|
||||
{
|
||||
// get the MethodInfo object that describes the current
|
||||
// method
|
||||
const MethodInfo &mi = **j;
|
||||
|
||||
std::cout << "\t ";
|
||||
|
||||
// display if the method is virtual
|
||||
if (mi.isVirtual())
|
||||
std::cout << "virtual ";
|
||||
|
||||
// display the method's return type if defined
|
||||
if (mi.getReturnType().isDefined())
|
||||
std::cout << mi.getReturnType().getQualifiedName() << " ";
|
||||
else
|
||||
std::cout << "[UNDEFINED TYPE] ";
|
||||
|
||||
// display the method's name
|
||||
std::cout << mi.getName() << "(";
|
||||
|
||||
// display method's parameters
|
||||
const ParameterInfoList ¶ms = mi.getParameters();
|
||||
for (ParameterInfoList::const_iterator k=params.begin(); k!=params.end(); ++k)
|
||||
{
|
||||
// get the ParameterInfo object that describes the
|
||||
// current parameter
|
||||
const ParameterInfo &pi = **k;
|
||||
|
||||
// display the parameter's modifier
|
||||
if (pi.isIn())
|
||||
std::cout << "IN";
|
||||
if (pi.isOut())
|
||||
std::cout << "OUT";
|
||||
if (pi.isIn() || pi.isOut())
|
||||
std::cout << " ";
|
||||
|
||||
// display the parameter's type name
|
||||
if (pi.getParameterType().isDefined())
|
||||
std::cout << pi.getParameterType().getQualifiedName();
|
||||
|
||||
// display the parameter's name if defined
|
||||
if (!pi.getName().empty())
|
||||
std::cout << " " << pi.getName();
|
||||
|
||||
if ((k+1)!=params.end())
|
||||
std::cout << ", ";
|
||||
}
|
||||
std::cout << ")";
|
||||
if (mi.isConst())
|
||||
std::cout << " const";
|
||||
if (mi.isPureVirtual())
|
||||
std::cout << " = 0";
|
||||
std::cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
// display a list of properties defined for the current type
|
||||
const PropertyInfoList &pil = (*i)->getProperties();
|
||||
if (!pil.empty())
|
||||
{
|
||||
std::cout << "\t* properties:\n";
|
||||
for (PropertyInfoList::const_iterator j=pil.begin(); j!=pil.end(); ++j)
|
||||
{
|
||||
// get the PropertyInfo object that describes the current
|
||||
// property
|
||||
const PropertyInfo &pi = **j;
|
||||
|
||||
std::cout << "\t ";
|
||||
|
||||
std::cout << "{";
|
||||
std::cout << (pi.canGet()? "G": " ");
|
||||
std::cout << (pi.canSet()? "S": " ");
|
||||
std::cout << (pi.canCount()? "C": " ");
|
||||
std::cout << (pi.canAdd()? "A": " ");
|
||||
std::cout << "} ";
|
||||
|
||||
// display the property's name
|
||||
std::cout << pi.getName();
|
||||
|
||||
// display the property's value type if defined
|
||||
std::cout << " (";
|
||||
if (pi.getPropertyType().isDefined())
|
||||
std::cout << pi.getPropertyType().getQualifiedName();
|
||||
else
|
||||
std::cout << "UNDEFINED TYPE";
|
||||
std::cout << ") ";
|
||||
|
||||
// check whether the property is an array property
|
||||
if (pi.isArray())
|
||||
{
|
||||
std::cout << " [ARRAY]";
|
||||
}
|
||||
|
||||
// check whether the property is an indexed property
|
||||
if (pi.isIndexed())
|
||||
{
|
||||
std::cout << " [INDEXED]\n\t\t indices:\n";
|
||||
|
||||
const ParameterInfoList &ind = pi.getIndexParameters();
|
||||
|
||||
// print the list of indices
|
||||
int num = 1;
|
||||
for (ParameterInfoList::const_iterator k=ind.begin(); k!=ind.end(); ++k, ++num)
|
||||
{
|
||||
std::cout << "\t\t " << num << ") ";
|
||||
const ParameterInfo &par = **k;
|
||||
std::cout << par.getParameterType().getQualifiedName() << " " << par.getName();
|
||||
std::cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "\n";
|
||||
}
|
||||
}
|
||||
std::cout << "\n" << std::string(75, '-') << "\n";
|
||||
print_type(**i);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user