auto &details{typeSymbol.get<DerivedTypeDetails>()};
PutAttrs(decls_ << "type", typeSymbol.attrs(), ","s, ""s);
if (const DerivedTypeSpec * extends{typeSymbol.GetParentTypeSpec()}) {
- PutLower(decls_ << ",extends(", extends->typeSymbol().name().ToString())
- << ')';
+ PutLower(decls_ << ",extends(", extends->typeSymbol()) << ')';
}
PutLower(decls_ << "::", typeSymbol);
auto &typeScope{*typeSymbol.scope()};
if (x.sequence_) {
os << " sequence";
}
- if (!x.components_.empty()) {
+ if (!x.componentNames_.empty()) {
os << " components:";
- for (auto name : x.components_) {
+ for (auto name : x.componentNames_) {
os << ' ' << name.ToString();
}
}
const DerivedTypeSpec *Symbol::GetParentTypeSpec(const Scope *scope) const {
if (const Symbol * parentComponent{GetParentComponent(scope)}) {
const auto &object{parentComponent->get<ObjectEntityDetails>()};
- const DerivedTypeSpec *spec{object.type()->AsDerived()};
- CHECK(spec != nullptr);
- return spec;
+ return &object.type()->derivedTypeSpec();
} else {
return nullptr;
}
void DerivedTypeDetails::add_component(const Symbol &symbol) {
if (symbol.test(Symbol::Flag::ParentComp)) {
- CHECK(components_.empty());
+ CHECK(componentNames_.empty());
}
- components_.push_back(symbol.name());
+ componentNames_.push_back(symbol.name());
}
std::list<SourceName> DerivedTypeDetails::OrderParameterNames(
SymbolList DerivedTypeDetails::OrderComponents(const Scope &scope) const {
SymbolList result;
- for (SourceName name : components_) {
+ for (SourceName name : componentNames_) {
auto iter{scope.find(name)};
if (iter != scope.cend()) {
const Symbol &symbol{*iter->second};
if (symbol.test(Symbol::Flag::ParentComp)) {
CHECK(result.empty());
const DerivedTypeSpec &spec{
- *symbol.get<ObjectEntityDetails>().type()->AsDerived()};
+ symbol.get<ObjectEntityDetails>().type()->derivedTypeSpec()};
result = spec.typeSymbol().get<DerivedTypeDetails>().OrderComponents(
*spec.scope());
}
}
const Symbol *DerivedTypeDetails::GetParentComponent(const Scope &scope) const {
- if (!components_.empty()) {
- SourceName extends{components_.front()};
+ if (!componentNames_.empty()) {
+ SourceName extends{componentNames_.front()};
auto iter{scope.find(extends)};
if (iter != scope.cend()) {
const Symbol &symbol{*iter->second};