xref: /llvm-project/flang/lib/Parser/tools.cpp (revision 8f01ecaeb8e537511718c4df123fb92633d9f73d)
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) {
20cd03e96fSPeter 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) {
39cd03e96fSPeter 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) {
48cd03e96fSPeter 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) {
59cd03e96fSPeter 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) {
67cd03e96fSPeter 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) {
78cd03e96fSPeter 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) {
97cd03e96fSPeter 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) {
106cd03e96fSPeter 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) {
119cd03e96fSPeter 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 
GetFirstName(const EntityDecl & x)126*8f01ecaeSPeter Klausler const Name &GetFirstName(const EntityDecl &x) {
127*8f01ecaeSPeter Klausler   return std::get<ObjectName>(x.t);
128*8f01ecaeSPeter Klausler }
129*8f01ecaeSPeter Klausler 
GetCoindexedNamedObject(const DataRef & base)13064ab3302SCarolineConcatto const CoindexedNamedObject *GetCoindexedNamedObject(const DataRef &base) {
131cd03e96fSPeter Klausler   return common::visit(
13264ab3302SCarolineConcatto       common::visitors{
13364ab3302SCarolineConcatto           [](const Name &) -> const CoindexedNamedObject * { return nullptr; },
13464ab3302SCarolineConcatto           [](const common::Indirection<CoindexedNamedObject> &x)
13564ab3302SCarolineConcatto               -> const CoindexedNamedObject * { return &x.value(); },
13664ab3302SCarolineConcatto           [](const auto &x) -> const CoindexedNamedObject * {
13764ab3302SCarolineConcatto             return GetCoindexedNamedObject(x.value().base);
13864ab3302SCarolineConcatto           },
13964ab3302SCarolineConcatto       },
14064ab3302SCarolineConcatto       base.u);
14164ab3302SCarolineConcatto }
GetCoindexedNamedObject(const Designator & designator)14264ab3302SCarolineConcatto const CoindexedNamedObject *GetCoindexedNamedObject(
14315fa287bSPete Steinfeld     const Designator &designator) {
144cd03e96fSPeter Klausler   return common::visit(
145cd03e96fSPeter Klausler       common::visitors{
14615fa287bSPete Steinfeld           [](const DataRef &x) -> const CoindexedNamedObject * {
14715fa287bSPete Steinfeld             return GetCoindexedNamedObject(x);
14815fa287bSPete Steinfeld           },
14915fa287bSPete Steinfeld           [](const Substring &x) -> const CoindexedNamedObject * {
150cd03e96fSPeter Klausler             return GetCoindexedNamedObject(std::get<DataRef>(x.t));
15115fa287bSPete Steinfeld           },
15215fa287bSPete Steinfeld       },
15315fa287bSPete Steinfeld       designator.u);
15415fa287bSPete Steinfeld }
GetCoindexedNamedObject(const Variable & variable)15515fa287bSPete Steinfeld const CoindexedNamedObject *GetCoindexedNamedObject(const Variable &variable) {
156cd03e96fSPeter Klausler   return common::visit(
15715fa287bSPete Steinfeld       common::visitors{
15815fa287bSPete Steinfeld           [](const common::Indirection<Designator> &designator)
15915fa287bSPete Steinfeld               -> const CoindexedNamedObject * {
16015fa287bSPete Steinfeld             return GetCoindexedNamedObject(designator.value());
16115fa287bSPete Steinfeld           },
16215fa287bSPete Steinfeld           [](const auto &) -> const CoindexedNamedObject * { return nullptr; },
16315fa287bSPete Steinfeld       },
16415fa287bSPete Steinfeld       variable.u);
16515fa287bSPete Steinfeld }
GetCoindexedNamedObject(const AllocateObject & allocateObject)16615fa287bSPete Steinfeld const CoindexedNamedObject *GetCoindexedNamedObject(
16764ab3302SCarolineConcatto     const AllocateObject &allocateObject) {
168cd03e96fSPeter Klausler   return common::visit(
16964ab3302SCarolineConcatto       common::visitors{
17064ab3302SCarolineConcatto           [](const StructureComponent &x) -> const CoindexedNamedObject * {
17164ab3302SCarolineConcatto             return GetCoindexedNamedObject(x.base);
17264ab3302SCarolineConcatto           },
17364ab3302SCarolineConcatto           [](const auto &) -> const CoindexedNamedObject * { return nullptr; },
17464ab3302SCarolineConcatto       },
17564ab3302SCarolineConcatto       allocateObject.u);
17664ab3302SCarolineConcatto }
1771f879005STim Keith } // namespace Fortran::parser
178