brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · ed6d194 Raw
188 lines · cpp
1//===-- lib/Parser/tools.cpp ----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "flang/Parser/tools.h"10 11namespace Fortran::parser {12 13const Name &GetLastName(const Name &x) { return x; }14 15const Name &GetLastName(const StructureComponent &x) {16  return GetLastName(x.component);17}18 19const Name &GetLastName(const DataRef &x) {20  return common::visit(21      common::visitors{22          [](const Name &name) -> const Name & { return name; },23          [](const common::Indirection<StructureComponent> &sc)24              -> const Name & { return GetLastName(sc.value()); },25          [](const common::Indirection<ArrayElement> &sc) -> const Name & {26            return GetLastName(sc.value().base);27          },28          [](const common::Indirection<CoindexedNamedObject> &ci)29              -> const Name & { return GetLastName(ci.value().base); },30      },31      x.u);32}33 34const Name &GetLastName(const Substring &x) {35  return GetLastName(std::get<DataRef>(x.t));36}37 38const Name &GetLastName(const Designator &x) {39  return common::visit(40      [](const auto &y) -> const Name & { return GetLastName(y); }, x.u);41}42 43const Name &GetLastName(const ProcComponentRef &x) {44  return GetLastName(x.v.thing);45}46 47const Name &GetLastName(const ProcedureDesignator &x) {48  return common::visit(49      [](const auto &y) -> const Name & { return GetLastName(y); }, x.u);50}51 52const Name &GetLastName(const Call &x) {53  return GetLastName(std::get<ProcedureDesignator>(x.t));54}55 56const Name &GetLastName(const FunctionReference &x) { return GetLastName(x.v); }57 58const Name &GetLastName(const Variable &x) {59  return common::visit(60      [](const auto &indirection) -> const Name & {61        return GetLastName(indirection.value());62      },63      x.u);64}65 66const Name &GetLastName(const AllocateObject &x) {67  return common::visit(68      [](const auto &y) -> const Name & { return GetLastName(y); }, x.u);69}70 71const Name &GetFirstName(const Name &x) { return x; }72 73const Name &GetFirstName(const StructureComponent &x) {74  return GetFirstName(x.base);75}76 77const Name &GetFirstName(const DataRef &x) {78  return common::visit(79      common::visitors{80          [](const Name &name) -> const Name & { return name; },81          [](const common::Indirection<StructureComponent> &sc)82              -> const Name & { return GetFirstName(sc.value()); },83          [](const common::Indirection<ArrayElement> &sc) -> const Name & {84            return GetFirstName(sc.value().base);85          },86          [](const common::Indirection<CoindexedNamedObject> &ci)87              -> const Name & { return GetFirstName(ci.value().base); },88      },89      x.u);90}91 92const Name &GetFirstName(const Substring &x) {93  return GetFirstName(std::get<DataRef>(x.t));94}95 96const Name &GetFirstName(const Designator &x) {97  return common::visit(98      [](const auto &y) -> const Name & { return GetFirstName(y); }, x.u);99}100 101const Name &GetFirstName(const ProcComponentRef &x) {102  return GetFirstName(x.v.thing);103}104 105const Name &GetFirstName(const ProcedureDesignator &x) {106  return common::visit(107      [](const auto &y) -> const Name & { return GetFirstName(y); }, x.u);108}109 110const Name &GetFirstName(const Call &x) {111  return GetFirstName(std::get<ProcedureDesignator>(x.t));112}113 114const Name &GetFirstName(const FunctionReference &x) {115  return GetFirstName(x.v);116}117 118const Name &GetFirstName(const Variable &x) {119  return common::visit(120      [](const auto &indirect) -> const Name & {121        return GetFirstName(indirect.value());122      },123      x.u);124}125 126const Name &GetFirstName(const EntityDecl &x) {127  return std::get<ObjectName>(x.t);128}129 130const CoindexedNamedObject *GetCoindexedNamedObject(const DataRef &base) {131  return common::visit(132      common::visitors{133          [](const Name &) -> const CoindexedNamedObject * { return nullptr; },134          [](const common::Indirection<CoindexedNamedObject> &x)135              -> const CoindexedNamedObject * { return &x.value(); },136          [](const auto &x) -> const CoindexedNamedObject * {137            return GetCoindexedNamedObject(x.value().base);138          },139      },140      base.u);141}142const CoindexedNamedObject *GetCoindexedNamedObject(143    const Designator &designator) {144  return common::visit(145      common::visitors{146          [](const DataRef &x) -> const CoindexedNamedObject * {147            return GetCoindexedNamedObject(x);148          },149          [](const Substring &x) -> const CoindexedNamedObject * {150            return GetCoindexedNamedObject(std::get<DataRef>(x.t));151          },152      },153      designator.u);154}155const CoindexedNamedObject *GetCoindexedNamedObject(const Variable &variable) {156  return common::visit(157      common::visitors{158          [](const common::Indirection<Designator> &designator)159              -> const CoindexedNamedObject * {160            return GetCoindexedNamedObject(designator.value());161          },162          [](const auto &) -> const CoindexedNamedObject * { return nullptr; },163      },164      variable.u);165}166const CoindexedNamedObject *GetCoindexedNamedObject(167    const AllocateObject &allocateObject) {168  return common::visit(169      common::visitors{170          [](const StructureComponent &x) -> const CoindexedNamedObject * {171            return GetCoindexedNamedObject(x.base);172          },173          [](const auto &) -> const CoindexedNamedObject * { return nullptr; },174      },175      allocateObject.u);176}177 178bool CheckForSingleVariableOnRHS(const AssignmentStmt &assignmentStmt) {179  return Unwrap<Designator>(std::get<Expr>(assignmentStmt.t)) != nullptr;180}181 182const Name *GetDesignatorNameIfDataRef(const Designator &designator) {183  const auto *dataRef{std::get_if<DataRef>(&designator.u)};184  return dataRef ? std::get_if<Name>(&dataRef->u) : nullptr;185}186 187} // namespace Fortran::parser188