164ab3302SCarolineConcatto //===-- lib/Parser/tools.cpp ----------------------------------------------===//
264ab3302SCarolineConcatto //
364ab3302SCarolineConcatto // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
464ab3302SCarolineConcatto // See https://llvm.org/LICENSE.txt for license information.
564ab3302SCarolineConcatto // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
664ab3302SCarolineConcatto //
764ab3302SCarolineConcatto //===----------------------------------------------------------------------===//
864ab3302SCarolineConcatto 
964ab3302SCarolineConcatto #include "flang/Parser/tools.h"
1064ab3302SCarolineConcatto 
1164ab3302SCarolineConcatto namespace Fortran::parser {
1264ab3302SCarolineConcatto 
GetLastName(const Name & x)1364ab3302SCarolineConcatto const Name &GetLastName(const Name &x) { return x; }
1464ab3302SCarolineConcatto 
GetLastName(const StructureComponent & x)1564ab3302SCarolineConcatto const Name &GetLastName(const StructureComponent &x) {
1664ab3302SCarolineConcatto   return GetLastName(x.component);
1764ab3302SCarolineConcatto }
1864ab3302SCarolineConcatto 
GetLastName(const DataRef & x)1964ab3302SCarolineConcatto const Name &GetLastName(const DataRef &x) {
20*cd03e96fSPeter Klausler   return common::visit(
2164ab3302SCarolineConcatto       common::visitors{
2264ab3302SCarolineConcatto           [](const Name &name) -> const Name & { return name; },
2364ab3302SCarolineConcatto           [](const common::Indirection<StructureComponent> &sc)
2464ab3302SCarolineConcatto               -> const Name & { return GetLastName(sc.value()); },
2564ab3302SCarolineConcatto           [](const common::Indirection<ArrayElement> &sc) -> const Name & {
2664ab3302SCarolineConcatto             return GetLastName(sc.value().base);
2764ab3302SCarolineConcatto           },
2864ab3302SCarolineConcatto           [](const common::Indirection<CoindexedNamedObject> &ci)
2964ab3302SCarolineConcatto               -> const Name & { return GetLastName(ci.value().base); },
3064ab3302SCarolineConcatto       },
3164ab3302SCarolineConcatto       x.u);
3264ab3302SCarolineConcatto }
3364ab3302SCarolineConcatto 
GetLastName(const Substring & x)3464ab3302SCarolineConcatto const Name &GetLastName(const Substring &x) {
3564ab3302SCarolineConcatto   return GetLastName(std::get<DataRef>(x.t));
3664ab3302SCarolineConcatto }
3764ab3302SCarolineConcatto 
GetLastName(const Designator & x)3864ab3302SCarolineConcatto const Name &GetLastName(const Designator &x) {
39*cd03e96fSPeter Klausler   return common::visit(
4064ab3302SCarolineConcatto       [](const auto &y) -> const Name & { return GetLastName(y); }, x.u);
4164ab3302SCarolineConcatto }
4264ab3302SCarolineConcatto 
GetLastName(const ProcComponentRef & x)4364ab3302SCarolineConcatto const Name &GetLastName(const ProcComponentRef &x) {
4464ab3302SCarolineConcatto   return GetLastName(x.v.thing);
4564ab3302SCarolineConcatto }
4664ab3302SCarolineConcatto 
GetLastName(const ProcedureDesignator & x)4764ab3302SCarolineConcatto const Name &GetLastName(const ProcedureDesignator &x) {
48*cd03e96fSPeter Klausler   return common::visit(
4964ab3302SCarolineConcatto       [](const auto &y) -> const Name & { return GetLastName(y); }, x.u);
5064ab3302SCarolineConcatto }
5164ab3302SCarolineConcatto 
GetLastName(const Call & x)5264ab3302SCarolineConcatto const Name &GetLastName(const Call &x) {
5364ab3302SCarolineConcatto   return GetLastName(std::get<ProcedureDesignator>(x.t));
5464ab3302SCarolineConcatto }
5564ab3302SCarolineConcatto 
GetLastName(const FunctionReference & x)5664ab3302SCarolineConcatto const Name &GetLastName(const FunctionReference &x) { return GetLastName(x.v); }
5764ab3302SCarolineConcatto 
GetLastName(const Variable & x)5864ab3302SCarolineConcatto const Name &GetLastName(const Variable &x) {
59*cd03e96fSPeter Klausler   return common::visit(
6064ab3302SCarolineConcatto       [](const auto &indirection) -> const Name & {
6164ab3302SCarolineConcatto         return GetLastName(indirection.value());
6264ab3302SCarolineConcatto       },
6364ab3302SCarolineConcatto       x.u);
6464ab3302SCarolineConcatto }
6564ab3302SCarolineConcatto 
GetLastName(const AllocateObject & x)6664ab3302SCarolineConcatto const Name &GetLastName(const AllocateObject &x) {
67*cd03e96fSPeter Klausler   return common::visit(
6864ab3302SCarolineConcatto       [](const auto &y) -> const Name & { return GetLastName(y); }, x.u);
6964ab3302SCarolineConcatto }
7064ab3302SCarolineConcatto 
GetFirstName(const Name & x)714171f80dSpeter klausler const Name &GetFirstName(const Name &x) { return x; }
724171f80dSpeter klausler 
GetFirstName(const StructureComponent & x)734171f80dSpeter klausler const Name &GetFirstName(const StructureComponent &x) {
744171f80dSpeter klausler   return GetFirstName(x.base);
754171f80dSpeter klausler }
764171f80dSpeter klausler 
GetFirstName(const DataRef & x)774171f80dSpeter klausler const Name &GetFirstName(const DataRef &x) {
78*cd03e96fSPeter Klausler   return common::visit(
794171f80dSpeter klausler       common::visitors{
804171f80dSpeter klausler           [](const Name &name) -> const Name & { return name; },
814171f80dSpeter klausler           [](const common::Indirection<StructureComponent> &sc)
824171f80dSpeter klausler               -> const Name & { return GetFirstName(sc.value()); },
834171f80dSpeter klausler           [](const common::Indirection<ArrayElement> &sc) -> const Name & {
844171f80dSpeter klausler             return GetFirstName(sc.value().base);
854171f80dSpeter klausler           },
864171f80dSpeter klausler           [](const common::Indirection<CoindexedNamedObject> &ci)
874171f80dSpeter klausler               -> const Name & { return GetFirstName(ci.value().base); },
884171f80dSpeter klausler       },
894171f80dSpeter klausler       x.u);
904171f80dSpeter klausler }
914171f80dSpeter klausler 
GetFirstName(const Substring & x)924171f80dSpeter klausler const Name &GetFirstName(const Substring &x) {
934171f80dSpeter klausler   return GetFirstName(std::get<DataRef>(x.t));
944171f80dSpeter klausler }
954171f80dSpeter klausler 
GetFirstName(const Designator & x)964171f80dSpeter klausler const Name &GetFirstName(const Designator &x) {
97*cd03e96fSPeter Klausler   return common::visit(
984171f80dSpeter klausler       [](const auto &y) -> const Name & { return GetFirstName(y); }, x.u);
994171f80dSpeter klausler }
1004171f80dSpeter klausler 
GetFirstName(const ProcComponentRef & x)1014171f80dSpeter klausler const Name &GetFirstName(const ProcComponentRef &x) {
1024171f80dSpeter klausler   return GetFirstName(x.v.thing);
1034171f80dSpeter klausler }
1044171f80dSpeter klausler 
GetFirstName(const ProcedureDesignator & x)1054171f80dSpeter klausler const Name &GetFirstName(const ProcedureDesignator &x) {
106*cd03e96fSPeter Klausler   return common::visit(
1074171f80dSpeter klausler       [](const auto &y) -> const Name & { return GetFirstName(y); }, x.u);
1084171f80dSpeter klausler }
1094171f80dSpeter klausler 
GetFirstName(const Call & x)1104171f80dSpeter klausler const Name &GetFirstName(const Call &x) {
1114171f80dSpeter klausler   return GetFirstName(std::get<ProcedureDesignator>(x.t));
1124171f80dSpeter klausler }
1134171f80dSpeter klausler 
GetFirstName(const FunctionReference & x)1144171f80dSpeter klausler const Name &GetFirstName(const FunctionReference &x) {
1154171f80dSpeter klausler   return GetFirstName(x.v);
1164171f80dSpeter klausler }
1174171f80dSpeter klausler 
GetFirstName(const Variable & x)1184171f80dSpeter klausler const Name &GetFirstName(const Variable &x) {
119*cd03e96fSPeter Klausler   return common::visit(
1204171f80dSpeter klausler       [](const auto &indirect) -> const Name & {
1214171f80dSpeter klausler         return GetFirstName(indirect.value());
1224171f80dSpeter klausler       },
1234171f80dSpeter klausler       x.u);
1244171f80dSpeter klausler }
1254171f80dSpeter klausler 
GetCoindexedNamedObject(const DataRef & base)12664ab3302SCarolineConcatto const CoindexedNamedObject *GetCoindexedNamedObject(const DataRef &base) {
127*cd03e96fSPeter Klausler   return common::visit(
12864ab3302SCarolineConcatto       common::visitors{
12964ab3302SCarolineConcatto           [](const Name &) -> const CoindexedNamedObject * { return nullptr; },
13064ab3302SCarolineConcatto           [](const common::Indirection<CoindexedNamedObject> &x)
13164ab3302SCarolineConcatto               -> const CoindexedNamedObject * { return &x.value(); },
13264ab3302SCarolineConcatto           [](const auto &x) -> const CoindexedNamedObject * {
13364ab3302SCarolineConcatto             return GetCoindexedNamedObject(x.value().base);
13464ab3302SCarolineConcatto           },
13564ab3302SCarolineConcatto       },
13664ab3302SCarolineConcatto       base.u);
13764ab3302SCarolineConcatto }
GetCoindexedNamedObject(const Designator & designator)13864ab3302SCarolineConcatto const CoindexedNamedObject *GetCoindexedNamedObject(
13915fa287bSPete Steinfeld     const Designator &designator) {
140*cd03e96fSPeter Klausler   return common::visit(
141*cd03e96fSPeter Klausler       common::visitors{
14215fa287bSPete Steinfeld           [](const DataRef &x) -> const CoindexedNamedObject * {
14315fa287bSPete Steinfeld             return GetCoindexedNamedObject(x);
14415fa287bSPete Steinfeld           },
14515fa287bSPete Steinfeld           [](const Substring &x) -> const CoindexedNamedObject * {
146*cd03e96fSPeter Klausler             return GetCoindexedNamedObject(std::get<DataRef>(x.t));
14715fa287bSPete Steinfeld           },
14815fa287bSPete Steinfeld       },
14915fa287bSPete Steinfeld       designator.u);
15015fa287bSPete Steinfeld }
GetCoindexedNamedObject(const Variable & variable)15115fa287bSPete Steinfeld const CoindexedNamedObject *GetCoindexedNamedObject(const Variable &variable) {
152*cd03e96fSPeter Klausler   return common::visit(
15315fa287bSPete Steinfeld       common::visitors{
15415fa287bSPete Steinfeld           [](const common::Indirection<Designator> &designator)
15515fa287bSPete Steinfeld               -> const CoindexedNamedObject * {
15615fa287bSPete Steinfeld             return GetCoindexedNamedObject(designator.value());
15715fa287bSPete Steinfeld           },
15815fa287bSPete Steinfeld           [](const auto &) -> const CoindexedNamedObject * { return nullptr; },
15915fa287bSPete Steinfeld       },
16015fa287bSPete Steinfeld       variable.u);
16115fa287bSPete Steinfeld }
GetCoindexedNamedObject(const AllocateObject & allocateObject)16215fa287bSPete Steinfeld const CoindexedNamedObject *GetCoindexedNamedObject(
16364ab3302SCarolineConcatto     const AllocateObject &allocateObject) {
164*cd03e96fSPeter Klausler   return common::visit(
16564ab3302SCarolineConcatto       common::visitors{
16664ab3302SCarolineConcatto           [](const StructureComponent &x) -> const CoindexedNamedObject * {
16764ab3302SCarolineConcatto             return GetCoindexedNamedObject(x.base);
16864ab3302SCarolineConcatto           },
16964ab3302SCarolineConcatto           [](const auto &) -> const CoindexedNamedObject * { return nullptr; },
17064ab3302SCarolineConcatto       },
17164ab3302SCarolineConcatto       allocateObject.u);
17264ab3302SCarolineConcatto }
1731f879005STim Keith } // namespace Fortran::parser
174