xref: /llvm-project/flang/lib/Parser/user-state.cpp (revision c14cf92b5a1cb13a33786291604c24a42e51b8eb)
164ab3302SCarolineConcatto //===-- lib/Parser/user-state.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/user-state.h"
1064ab3302SCarolineConcatto #include "stmt-parser.h"
1164ab3302SCarolineConcatto #include "type-parsers.h"
1264ab3302SCarolineConcatto #include "flang/Parser/parse-state.h"
1364ab3302SCarolineConcatto #include <optional>
1464ab3302SCarolineConcatto 
1564ab3302SCarolineConcatto namespace Fortran::parser {
1664ab3302SCarolineConcatto 
Parse(ParseState & state)1764ab3302SCarolineConcatto std::optional<Success> StartNewSubprogram::Parse(ParseState &state) {
1864ab3302SCarolineConcatto   if (auto *ustate{state.userState()}) {
1964ab3302SCarolineConcatto     ustate->NewSubprogram();
2064ab3302SCarolineConcatto   }
2164ab3302SCarolineConcatto   return Success{};
2264ab3302SCarolineConcatto }
2364ab3302SCarolineConcatto 
Parse(ParseState & state)2464ab3302SCarolineConcatto std::optional<CapturedLabelDoStmt::resultType> CapturedLabelDoStmt::Parse(
2564ab3302SCarolineConcatto     ParseState &state) {
2664ab3302SCarolineConcatto   static constexpr auto parser{statement(indirect(Parser<LabelDoStmt>{}))};
2764ab3302SCarolineConcatto   auto result{parser.Parse(state)};
2864ab3302SCarolineConcatto   if (result) {
2964ab3302SCarolineConcatto     if (auto *ustate{state.userState()}) {
3064ab3302SCarolineConcatto       ustate->NewDoLabel(std::get<Label>(result->statement.value().t));
3164ab3302SCarolineConcatto     }
3264ab3302SCarolineConcatto   }
3364ab3302SCarolineConcatto   return result;
3464ab3302SCarolineConcatto }
3564ab3302SCarolineConcatto 
3664ab3302SCarolineConcatto std::optional<EndDoStmtForCapturedLabelDoStmt::resultType>
Parse(ParseState & state)3764ab3302SCarolineConcatto EndDoStmtForCapturedLabelDoStmt::Parse(ParseState &state) {
3864ab3302SCarolineConcatto   static constexpr auto parser{
3964ab3302SCarolineConcatto       statement(indirect(construct<EndDoStmt>("END DO" >> maybe(name))))};
4064ab3302SCarolineConcatto   if (auto enddo{parser.Parse(state)}) {
4164ab3302SCarolineConcatto     if (enddo->label) {
4264ab3302SCarolineConcatto       if (const auto *ustate{state.userState()}) {
4364ab3302SCarolineConcatto         if (ustate->IsDoLabel(enddo->label.value())) {
4464ab3302SCarolineConcatto           return enddo;
4564ab3302SCarolineConcatto         }
4664ab3302SCarolineConcatto       }
4764ab3302SCarolineConcatto     }
4864ab3302SCarolineConcatto   }
4964ab3302SCarolineConcatto   return std::nullopt;
5064ab3302SCarolineConcatto }
5164ab3302SCarolineConcatto 
Parse(ParseState & state)5264ab3302SCarolineConcatto std::optional<Success> EnterNonlabelDoConstruct::Parse(ParseState &state) {
5364ab3302SCarolineConcatto   if (auto *ustate{state.userState()}) {
5464ab3302SCarolineConcatto     ustate->EnterNonlabelDoConstruct();
5564ab3302SCarolineConcatto   }
5664ab3302SCarolineConcatto   return {Success{}};
5764ab3302SCarolineConcatto }
5864ab3302SCarolineConcatto 
Parse(ParseState & state)5964ab3302SCarolineConcatto std::optional<Success> LeaveDoConstruct::Parse(ParseState &state) {
6064ab3302SCarolineConcatto   if (auto ustate{state.userState()}) {
6164ab3302SCarolineConcatto     ustate->LeaveDoConstruct();
6264ab3302SCarolineConcatto   }
6364ab3302SCarolineConcatto   return {Success{}};
6464ab3302SCarolineConcatto }
6564ab3302SCarolineConcatto 
66*c14cf92bSPeter Klausler // These special parsers for bits of DEC STRUCTURE capture the names of
67*c14cf92bSPeter Klausler // their components and nested structures in the user state so that
68*c14cf92bSPeter Klausler // references to these fields with periods can be recognized as special
69*c14cf92bSPeter Klausler // cases.
70*c14cf92bSPeter Klausler 
Parse(ParseState & state)7164ab3302SCarolineConcatto std::optional<Name> OldStructureComponentName::Parse(ParseState &state) {
7264ab3302SCarolineConcatto   if (std::optional<Name> n{name.Parse(state)}) {
7364ab3302SCarolineConcatto     if (const auto *ustate{state.userState()}) {
7464ab3302SCarolineConcatto       if (ustate->IsOldStructureComponent(n->source)) {
7564ab3302SCarolineConcatto         return n;
7664ab3302SCarolineConcatto       }
7764ab3302SCarolineConcatto     }
7864ab3302SCarolineConcatto   }
7964ab3302SCarolineConcatto   return std::nullopt;
8064ab3302SCarolineConcatto }
8164ab3302SCarolineConcatto 
Parse(ParseState & state)8264ab3302SCarolineConcatto std::optional<DataComponentDefStmt> StructureComponents::Parse(
8364ab3302SCarolineConcatto     ParseState &state) {
8464ab3302SCarolineConcatto   static constexpr auto stmt{Parser<DataComponentDefStmt>{}};
8564ab3302SCarolineConcatto   std::optional<DataComponentDefStmt> defs{stmt.Parse(state)};
8664ab3302SCarolineConcatto   if (defs) {
8764ab3302SCarolineConcatto     if (auto *ustate{state.userState()}) {
88*c14cf92bSPeter Klausler       for (const auto &item : std::get<std::list<ComponentOrFill>>(defs->t)) {
89*c14cf92bSPeter Klausler         if (const auto *decl{std::get_if<ComponentDecl>(&item.u)}) {
90*c14cf92bSPeter Klausler           ustate->NoteOldStructureComponent(std::get<Name>(decl->t).source);
91*c14cf92bSPeter Klausler         }
9264ab3302SCarolineConcatto       }
9364ab3302SCarolineConcatto     }
9464ab3302SCarolineConcatto   }
9564ab3302SCarolineConcatto   return defs;
9664ab3302SCarolineConcatto }
97*c14cf92bSPeter Klausler 
Parse(ParseState & state)98*c14cf92bSPeter Klausler std::optional<StructureStmt> NestedStructureStmt::Parse(ParseState &state) {
99*c14cf92bSPeter Klausler   std::optional<StructureStmt> stmt{Parser<StructureStmt>{}.Parse(state)};
100*c14cf92bSPeter Klausler   if (stmt) {
101*c14cf92bSPeter Klausler     if (auto *ustate{state.userState()}) {
102*c14cf92bSPeter Klausler       for (const auto &entity : std::get<std::list<EntityDecl>>(stmt->t)) {
103*c14cf92bSPeter Klausler         ustate->NoteOldStructureComponent(std::get<Name>(entity.t).source);
104*c14cf92bSPeter Klausler       }
105*c14cf92bSPeter Klausler     }
106*c14cf92bSPeter Klausler   }
107*c14cf92bSPeter Klausler   return stmt;
108*c14cf92bSPeter Klausler }
1091f879005STim Keith } // namespace Fortran::parser
110