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)1764ab3302SCarolineConcattostd::optional<Success> StartNewSubprogram::Parse(ParseState &state) { 1864ab3302SCarolineConcatto if (auto *ustate{state.userState()}) { 1964ab3302SCarolineConcatto ustate->NewSubprogram(); 2064ab3302SCarolineConcatto } 2164ab3302SCarolineConcatto return Success{}; 2264ab3302SCarolineConcatto } 2364ab3302SCarolineConcatto Parse(ParseState & state)2464ab3302SCarolineConcattostd::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)3764ab3302SCarolineConcattoEndDoStmtForCapturedLabelDoStmt::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)5264ab3302SCarolineConcattostd::optional<Success> EnterNonlabelDoConstruct::Parse(ParseState &state) { 5364ab3302SCarolineConcatto if (auto *ustate{state.userState()}) { 5464ab3302SCarolineConcatto ustate->EnterNonlabelDoConstruct(); 5564ab3302SCarolineConcatto } 5664ab3302SCarolineConcatto return {Success{}}; 5764ab3302SCarolineConcatto } 5864ab3302SCarolineConcatto Parse(ParseState & state)5964ab3302SCarolineConcattostd::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)7164ab3302SCarolineConcattostd::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)8264ab3302SCarolineConcattostd::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 Klauslerstd::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