#include "SingleDeclarationSymbolVisitor.h"
namespace objcgen {
static bool should_always_collect(const SymbolProperty property)
{
switch (property) {
case SymbolProperty::None:
return true;
case SymbolProperty::TypeArgument:
case SymbolProperty::TupleItem:
case SymbolProperty::FunctionParametersTuple:
case SymbolProperty::FunctionReturnType:
return true;
case SymbolProperty::Base:
case SymbolProperty::Member:
case SymbolProperty::AliasTarget:
case SymbolProperty::ParameterType:
case SymbolProperty::ReturnType:
return false;
default:
assert(false);
return false;
}
}
static bool should_disable_recursion(const SymbolProperty property)
{
switch (property) {
case SymbolProperty::None:
return false;
case SymbolProperty::Member:
return false;
case SymbolProperty::TypeArgument:
case SymbolProperty::Base:
case SymbolProperty::TupleItem:
case SymbolProperty::FunctionParametersTuple:
case SymbolProperty::FunctionReturnType:
case SymbolProperty::AliasTarget:
case SymbolProperty::ParameterType:
case SymbolProperty::ReturnType:
return true;
default:
assert(false);
return false;
}
}
void SingleDeclarationSymbolVisitor::visit_impl(
FileLevelSymbol* owner, FileLevelSymbol* value, const SymbolProperty property)
{
if (!allow_recurse_) {
if (should_always_collect(property)) {
assert(dynamic_cast<TypeLikeSymbol*>(value));
visit_impl(owner, value, property, true);
recurse(value);
return;
}
return;
}
visit_impl(owner, value, property, !allow_recurse_);
if (initial_allow_recurse_ && should_disable_recursion(property)) {
assert(allow_recurse_);
allow_recurse_ = false;
recurse(value);
allow_recurse_ = true;
} else {
recurse(value);
}
}
}