LCOV - code coverage report
Current view: top level - src/utils - SyntaxTree.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 8601ad Lines: 109 110 99.1 %
Date: 2025-07-18 13:27:08 Functions: 13 14 92.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //* This file is part of the MOOSE framework
       2             : //* https://mooseframework.inl.gov
       3             : //*
       4             : //* All rights reserved, see COPYRIGHT for full restrictions
       5             : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
       6             : //*
       7             : //* Licensed under LGPL 2.1, please see LICENSE for details
       8             : //* https://www.gnu.org/licenses/lgpl-2.1.html
       9             : 
      10             : #include "SyntaxTree.h"
      11             : 
      12             : #include "InputParameters.h"
      13             : #include "MooseUtils.h"
      14             : #include "Parser.h"
      15             : 
      16             : #include <algorithm>
      17             : #include <cctype>
      18             : 
      19       63306 : SyntaxTree::SyntaxTree(bool use_long_names)
      20       63306 :   : SyntaxFormatterInterface(), _use_long_names(use_long_names)
      21             : {
      22       63306 : }
      23             : 
      24       63306 : SyntaxTree::~SyntaxTree() = default;
      25             : 
      26             : void
      27     3052777 : SyntaxTree::insertNode(std::string syntax,
      28             :                        const std::string & action,
      29             :                        bool is_action_params,
      30             :                        InputParameters * params)
      31             : {
      32     3052777 :   if (!_root)
      33       31678 :     _root = std::make_unique<TreeNode>("", *this);
      34             : 
      35     3052777 :   _root->insertNode(syntax, action, is_action_params, params);
      36     3052777 : }
      37             : 
      38             : std::string
      39       31678 : SyntaxTree::print(const std::string & search_string)
      40             : {
      41       31678 :   bool found = false;
      42       31678 :   std::string output;
      43             : 
      44             :   // Clear the list of "seen" parameters before printing the tree
      45       31678 :   _params_printed.clear();
      46             : 
      47       31678 :   if (_root)
      48       31678 :     output = _root->print(-1, search_string, found);
      49             : 
      50       31678 :   if (found)
      51       63356 :     return preamble() + output + postscript();
      52             :   else
      53           0 :     return "";
      54       31678 : }
      55             : 
      56             : void
      57    17035014 : SyntaxTree::seenIt(const std::string & prefix, const std::string & item)
      58             : {
      59    17035014 :   _params_printed.insert(prefix + item);
      60    17035014 : }
      61             : 
      62             : bool
      63    61418174 : SyntaxTree::haveSeenIt(const std::string & prefix, const std::string & item) const
      64             : {
      65    61418174 :   return _params_printed.find(prefix + item) != _params_printed.end();
      66             : }
      67             : 
      68      677761 : SyntaxTree::TreeNode::TreeNode(const std::string & name,
      69             :                                SyntaxTree & syntax_tree,
      70             :                                const std::string * action,
      71             :                                InputParameters * params,
      72      677761 :                                TreeNode * parent)
      73      677761 :   : _name(name), _parent(parent), _syntax_tree(syntax_tree)
      74             : {
      75      677761 :   if (action)
      76      455195 :     _action_params.emplace(*action, std::make_unique<InputParameters>(*params));
      77      677761 : }
      78             : 
      79      677761 : SyntaxTree::TreeNode::~TreeNode() = default;
      80             : 
      81             : void
      82     3923770 : SyntaxTree::TreeNode::insertNode(std::string & syntax,
      83             :                                  const std::string & action,
      84             :                                  bool is_action_params,
      85             :                                  InputParameters * params)
      86             : {
      87     3923770 :   std::string::size_type pos = syntax.find_first_of("/");
      88     3923770 :   std::string item;
      89     3923770 :   bool is_leaf = true;
      90             : 
      91     3923770 :   item = syntax.substr(0, pos);
      92     3923770 :   if (pos != std::string::npos)
      93             :   {
      94      870993 :     syntax = syntax.substr(pos + 1);
      95      870993 :     is_leaf = false;
      96             :   }
      97             : 
      98     3923770 :   bool node_created = false;
      99     3923770 :   if (_children.find(item) == _children.end())
     100             :   {
     101     1292166 :     _children[item] = std::make_unique<TreeNode>(
     102     1292166 :         item, _syntax_tree, is_leaf && is_action_params ? &action : NULL, params, this);
     103      646083 :     if (is_leaf && !is_action_params)
     104       44450 :       _children[item]->insertParams(action, is_action_params, params);
     105      646083 :     node_created = true;
     106             :   }
     107             : 
     108     3923770 :   if (!is_leaf)
     109      870993 :     _children[item]->insertNode(syntax, action, is_action_params, params);
     110     3052777 :   else if (!node_created)
     111     2553132 :     _children[item]->insertParams(action, is_action_params, params);
     112     3923770 : }
     113             : 
     114             : void
     115     2597582 : SyntaxTree::TreeNode::insertParams(const std::string & action,
     116             :                                    bool is_action_params,
     117             :                                    InputParameters * params)
     118             : {
     119     2597582 :   if (is_action_params)
     120     1977988 :     _action_params.emplace(action, std::make_unique<InputParameters>(*params));
     121             :   else
     122      619594 :     _moose_object_params.emplace(action, std::make_unique<InputParameters>(*params));
     123     2597582 : }
     124             : 
     125             : std::string
     126      733372 : SyntaxTree::TreeNode::print(short depth, const std::string & search_string, bool & found)
     127             : {
     128      733372 :   std::string doc = "";
     129      733372 :   std::string long_name(getLongName());
     130      733372 :   std::string name(_syntax_tree.isLongNames() ? long_name : _name);
     131      733372 :   std::string out;
     132             : 
     133      733372 :   if (depth < 0)
     134             :   {
     135      313720 :     for (const auto & c_it : _children)
     136             :     {
     137      282042 :       bool local_found = false;
     138      282042 :       std::string local_out(c_it.second->print(depth + 1, search_string, local_found));
     139      282042 :       found |= local_found; // Update the current frame's found variable
     140      282042 :       if (local_found)
     141      281318 :         out += local_out;
     142      282042 :     }
     143       31678 :     return out;
     144             :   }
     145             : 
     146             :   // GlobalParamsAction is special - we need to just always print it out
     147             :   // if (_name == "GlobalParamsAction")
     148             :   //   found = true;
     149             : 
     150      701694 :   std::string indent((depth + 1) * 2, ' ');
     151             : 
     152             :   std::multimap<std::string, std::unique_ptr<InputParameters>>::const_iterator it =
     153      701694 :       _moose_object_params.begin();
     154             :   do
     155             :   {
     156      857994 :     bool local_found = false;
     157      857994 :     std::string local_out;
     158             : 
     159             :     // Compare the block name, if it's matched we are going to pass an empty search string
     160             :     // which means match ALL parameters
     161      857994 :     std::string local_search_string;
     162      857994 :     if (MooseUtils::wildCardMatch(name, search_string))
     163      834943 :       found = true;
     164             :     else
     165       23051 :       local_search_string = search_string;
     166             : 
     167      857994 :     if (it != _moose_object_params.end())
     168      675161 :       doc = it->second->getClassDescription();
     169      857994 :     local_out += _syntax_tree.printBlockOpen(name, depth, doc);
     170             : 
     171     5208760 :     for (const auto & a_it : _action_params)
     172     4350766 :       if (a_it.first != "EmptyAction")
     173             :       {
     174     8701412 :         local_out += _syntax_tree.printParams(
     175     8701412 :             name, long_name, *(a_it.second), depth, local_search_string, local_found);
     176     4350706 :         found |= local_found; // Update the current frame's found variable
     177             :         // DEBUG
     178             :         // Moose::out << "\n" << indent << "(" << ait->first << ")";
     179             :         // DEBUG
     180             :       }
     181             : 
     182      857994 :     if (it != _moose_object_params.end())
     183             :     {
     184     1350322 :       local_out += _syntax_tree.printParams(
     185     1350322 :           name, long_name, *it->second, depth, local_search_string, local_found);
     186      675161 :       found |= local_found;
     187             :       // DEBUG
     188             :       // Moose::out << "\n" << indent << "{" << it->first << "}";
     189             :       // DEBUG
     190             :     }
     191             : 
     192      857994 :     local_out += _syntax_tree.preTraverse(depth);
     193             : 
     194     1277646 :     for (const auto & c_it : _children)
     195             :     {
     196      419652 :       bool child_found = false;
     197      419652 :       std::string child_out(c_it.second->print(depth + 1, local_search_string, child_found));
     198      419652 :       found |= child_found; // Update the current frame's found variable
     199             : 
     200      419652 :       if (child_found)
     201      397325 :         local_out += child_out;
     202      419652 :     }
     203             : 
     204      857994 :     local_out += _syntax_tree.printBlockClose(name, depth);
     205             : 
     206      857994 :     if (found)
     207      834943 :       out += local_out;
     208             : 
     209             :     // If there are no moose object params then we have to be careful about how we
     210             :     // increment the iterator.  We only want to increment if we aren't already
     211             :     // at the end.
     212      857994 :   } while (it != _moose_object_params.end() && ++it != _moose_object_params.end());
     213             : 
     214      701694 :   return out;
     215      733372 : }
     216             : 
     217             : std::string
     218     1881071 : SyntaxTree::TreeNode::getLongName(const std::string & delim) const
     219             : {
     220     1881071 :   if (_parent)
     221     2295398 :     return _parent->getLongName(delim) + delim + _name;
     222             :   else
     223      733372 :     return _name;
     224             : }
     225             : 
     226             : bool
     227      733372 : SyntaxTree::isLongNames() const
     228             : {
     229      733372 :   return _use_long_names;
     230             : }

Generated by: LCOV version 1.14