https://mooseframework.inl.gov
Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
MooseServer Class Reference

#include <MooseServer.h>

Inheritance diagram for MooseServer:
[legend]

Classes

struct  CheckState
 Helper for storing the state for a single document. More...
 

Public Member Functions

 MooseServer (MooseApp &moose_app)
 
virtual ~MooseServer ()=default
 
std::shared_ptr< wasp::lsp::Connection > getConnection ()
 Get read / write connection - specific to this server implemention. More...
 
MooseAppgetCheckApp ()
 Public interface for writable check app reference with error checks. More...
 
void setDistPlotNumPoints (std::size_t num_points)
 Override number of discrete points in continuous distribution plots. More...
 

Private Types

using SortedLocationNodes = std::set< wasp::HITNodeView, std::function< bool(const wasp::HITNodeView &, const wasp::HITNodeView &)> >
 SortedLocationNodes - type alias for set of nodes sorted by location. More...
 

Private Member Functions

bool parseDocumentForDiagnostics (wasp::DataArray &diagnosticsList)
 Parse document for diagnostics - specific to this server implemention. More...
 
void addResourcesForDocument ()
 Add paths from includes and FileName parameters for client to watch. More...
 
void getFileNameTypeValues (std::set< std::string > &filename_vals, wasp::HITNodeView parent)
 Recursively walk input to gather all FileName type parameter values. More...
 
bool gatherDocumentCompletionItems (wasp::DataArray &completionItems, bool &is_incomplete, int line, int character)
 Gather document completion items - specific to this server implemention. More...
 
void getExistingInput (wasp::HITNodeView parent_node, std::set< std::string > &existing_params, std::set< std::string > &existing_subblocks)
 Get names of parameters and subblocks specified in given input node. More...
 
void getAllValidParameters (InputParameters &valid_params, const std::string &object_path, const std::string &object_type, std::set< std::string > &obj_act_tasks)
 Get all global parameters, action parameters, and object parameters. More...
 
void getActionParameters (InputParameters &valid_params, const std::string &object_path, std::set< std::string > &obj_act_tasks)
 Get all action parameters using requested object path to collection. More...
 
void getObjectParameters (InputParameters &valid_params, std::string object_type, const std::set< std::string > &obj_act_tasks)
 Get all object parameters using requested object path to collection. More...
 
bool addParametersToList (wasp::DataArray &completionItems, const InputParameters &valid_params, const std::set< std::string > &existing_params, int replace_line_beg, int replace_char_beg, int replace_line_end, int replace_char_end, const std::string &filtering_prefix)
 Add parameters that were previously gathered to list for completion. More...
 
bool addSubblocksToList (wasp::DataArray &completionItems, const std::string &object_path, int replace_line_beg, int replace_char_beg, int replace_line_end, int replace_char_end, const std::string &filtering_prefix, bool request_on_block_decl)
 Add subblocks to completion list for request path, line, and column. More...
 
bool addValuesToList (wasp::DataArray &completionItems, const InputParameters &valid_params, const std::set< std::string > &existing_params, const std::set< std::string > &existing_subblocks, const std::string &param_name, const std::set< std::string > &obj_act_tasks, const std::string &object_path, int replace_line_beg, int replace_char_beg, int replace_line_end, int replace_char_end)
 Add parameter values to completion list for request line and column. More...
 
template<typename MooseEnumType >
void getEnumsAndDocs (MooseEnumType &moose_enum_param, std::map< std::string, std::string > &options_and_descs)
 Fill map of all options and descriptions if parameter is moose enum. More...
 
void addObjectsFromWarehouses (const std::string &param_type, std::map< std::string, std::string > &options_and_descs)
 Supplement completion list with objects in warehouses if applicable. More...
 
bool gatherDocumentDefinitionLocations (wasp::DataArray &definitionLocations, int line, int character)
 Gather definition locations - specific to this server implemention. More...
 
void getInputLookupDefinitionNodes (SortedLocationNodes &location_nodes, const std::string &clean_type, const std::string &val_string)
 Get set of nodes from associated path lookups matching value string. More...
 
bool addLocationNodesToList (wasp::DataArray &defsOrRefsLocations, const SortedLocationNodes &location_nodes)
 Add set of nodes sorted by location to definition or reference list. More...
 
bool getHoverDisplayText (std::string &display_text, int line, int character)
 Get hover display text - logic specific to this server implemention. More...
 
bool gatherDocumentReferencesLocations (wasp::DataArray &referencesLocations, int line, int character, bool include_declaration)
 Gather references locations - specific to this server implemention. More...
 
void getNodesByValueAndTypes (SortedLocationNodes &match_nodes, wasp::HITNodeView view_parent, const std::string &target_value, const std::set< std::string > &target_types)
 Recursively walk input to gather all nodes matching value and types. More...
 
bool gatherDocumentFormattingTextEdits (wasp::DataArray &formattingTextEdits, int tab_size, bool insert_spaces)
 Gather formatting text edits - specific to this server implemention. More...
 
std::string formatDocument (wasp::HITNodeView parent, std::size_t &prev_line, std::size_t level)
 Recursively walk down whole nodeview tree while formatting document. More...
 
bool gatherDocumentSymbols (wasp::DataArray &documentSymbols)
 Gather document symbols - specific to this server implemention. More...
 
bool traverseParseTreeAndFillSymbols (wasp::HITNodeView view_parent, wasp::DataObject &data_parent)
 Recursively fill document symbols from the given node. More...
 
int getCompletionItemKind (const InputParameters &valid_params, const std::string &param_name, const std::string &clean_type, bool is_param)
 Get completion item kind value that client may use for icon in list. More...
 
int getDocumentSymbolKind (wasp::HITNodeView symbol_node)
 Get document symbol kind value that client may use for outline icon. More...
 
std::string getRequiredParamsText (const std::string &subblock_path, const std::string &subblock_type, const std::set< std::string > &existing_params, const std::string &indent_spaces)
 Get required parameter completion text list for given subblock path. More...
 
bool gatherExtensionResponses (wasp::DataArray &extensionResponses, const std::string &extensionMethod, int line, int character)
 Gather extension responses - specific to this server implemention. More...
 
bool gatherPlottingResponses (wasp::DataArray &plotting_responses, int line, int character)
 Build CustomPlot extension responses when method name is plotting. More...
 
void buildFuncPlotResponse (wasp::DataArray &plotting_responses, FEProblemBase &problem, const std::string &object_name, const std::string &object_type)
 Gather function data, build CustomPlot object, and add to responses. More...
 
void buildDistPlotResponses (wasp::DataArray &plotting_responses, FEProblemBase &problem, const std::string &object_name, const std::string &object_type)
 Compute PDF and CDF, build CustomPlot objects, and add to responses. More...
 
void buildLineGraphPlot (wasp::CustomPlot &plot_object, const std::string &plot_title, const std::string &x_axis_label, const std::string &y_axis_label, const std::vector< double > &graph_keys, const std::vector< double > &graph_vals)
 Build CustomPlot graph with provided keys, values, and plot title. More...
 
bool connectionRead (wasp::DataObject &object)
 Read from connection into object - specific to this server's connection. More...
 
bool connectionWrite (wasp::DataObject &object)
 Write object json to connection - specific to this server's connection. More...
 
bool rootIsValid () const
 
const hit::Node * queryRoot () const
 
const hit::Node & getRoot () const
 
const CheckStatequeryCheckState () const
 
CheckStatequeryCheckState ()
 
const MooseAppqueryCheckApp () const
 
MooseAppqueryCheckApp ()
 
const ParserqueryCheckParser () const
 
ParserqueryCheckParser ()
 

Private Attributes

MooseApp_moose_app
 _moose_app - reference to parent application that owns this server More...
 
std::map< std::string, CheckState_check_state
 _check_state - map from document paths to state (parser, app, text) More...
 
std::shared_ptr< wasp::lsp::IOStreamConnection > _connection
 _connection - shared pointer to this server's read / write iostream More...
 
std::map< std::string, std::set< std::string > > _syntax_to_subblocks
 _syntax_to_subblocks - map of syntax paths to valid subblocks More...
 
std::map< std::string, std::set< std::string > > _type_to_input_paths
 _type_to_input_paths - map of parameter types to lookup paths More...
 
std::map< std::string, std::set< std::string > > _input_path_to_types
 _type_to_input_paths - map of lookup paths to parameter types More...
 
std::size_t _formatting_tab_size
 _formatting_tab_size - number of indent spaces for formatting More...
 
std::size_t _dist_plot_num_points
 _dist_plot_num_points - distribution plot sampling resolution More...
 
double _dist_plot_quantile_bound
 _dist_plot_quantile_bound - epsilon to bound plot range tails More...
 

Detailed Description

Definition at line 29 of file MooseServer.h.

Member Typedef Documentation

◆ SortedLocationNodes

using MooseServer::SortedLocationNodes = std::set<wasp::HITNodeView, std::function<bool(const wasp::HITNodeView &, const wasp::HITNodeView &)> >
private

SortedLocationNodes - type alias for set of nodes sorted by location.

Definition at line 61 of file MooseServer.h.

Constructor & Destructor Documentation

◆ MooseServer()

MooseServer::MooseServer ( MooseApp moose_app)

Definition at line 51 of file MooseServer.C.

52  : _moose_app(moose_app),
53  _connection(std::make_shared<wasp::lsp::IOStreamConnection>(this)),
57 {
58  // add all implemented server capabilities to notify client in initialize
59  enableFullSync();
60  enableSymbols();
61  enableCompletion();
62  enableDefinition();
63  enableReferences();
64  enableFormatting();
65  enableHover();
66  enableExtension("plotting");
67  enableExtension("watcherRegistration");
68 }
double _dist_plot_quantile_bound
_dist_plot_quantile_bound - epsilon to bound plot range tails
Definition: MooseServer.h:522
std::shared_ptr< wasp::lsp::IOStreamConnection > _connection
_connection - shared pointer to this server&#39;s read / write iostream
Definition: MooseServer.h:492
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
std::size_t _formatting_tab_size
_formatting_tab_size - number of indent spaces for formatting
Definition: MooseServer.h:512
std::size_t _dist_plot_num_points
_dist_plot_num_points - distribution plot sampling resolution
Definition: MooseServer.h:517

◆ ~MooseServer()

virtual MooseServer::~MooseServer ( )
virtualdefault

Member Function Documentation

◆ addLocationNodesToList()

bool MooseServer::addLocationNodesToList ( wasp::DataArray &  defsOrRefsLocations,
const SortedLocationNodes location_nodes 
)
private

Add set of nodes sorted by location to definition or reference list.

Parameters
defsOrRefsLocations- data array of locations objects to fill
location_nodes- set of nodes that have locations to be added
Returns
- true if filling of location objects completed successfully

Definition at line 1261 of file MooseServer.C.

Referenced by gatherDocumentDefinitionLocations(), and gatherDocumentReferencesLocations().

1263 {
1264  bool pass = true;
1265 
1266  // walk over set of sorted nodes provided to add and build locations list
1267  for (const auto & location_nodes_iter : location_nodes)
1268  {
1269  // add file scheme prefix onto front of file path to build location uri
1270  auto location_uri = wasp::lsp::m_uri_prefix + location_nodes_iter.node_pool()->stream_name();
1271 
1272  // add file uri with zero based line and column range to locations list
1273  defsOrRefsLocations.push_back(wasp::DataObject());
1274  wasp::DataObject * location = defsOrRefsLocations.back().to_object();
1275  pass &= wasp::lsp::buildLocationObject(*location,
1276  errors,
1277  location_uri,
1278  location_nodes_iter.line() - 1,
1279  location_nodes_iter.column() - 1,
1280  location_nodes_iter.last_line() - 1,
1281  location_nodes_iter.last_column());
1282  }
1283 
1284  return pass;
1285 }

◆ addObjectsFromWarehouses()

void MooseServer::addObjectsFromWarehouses ( const std::string &  param_type,
std::map< std::string, std::string > &  options_and_descs 
)
private

Supplement completion list with objects in warehouses if applicable.

Parameters
param_type- parameter type string to pick suitable warehouse
options_and_descs- map to fill with options and descriptions

Definition at line 1039 of file MooseServer.C.

Referenced by addValuesToList().

1041 {
1042  // get check app of document and return with no items if its build failed
1043  auto app_ptr = queryCheckApp();
1044  if (!app_ptr)
1045  return;
1046 
1047  // get problem from action warehouse and return without any items if null
1048  std::shared_ptr<FEProblemBase> & problem = app_ptr->actionWarehouse().problemBase();
1049  if (!problem)
1050  return;
1051 
1052  if (param_type == "NonlinearVariableName")
1053  {
1054  for (const auto i : make_range(problem->numNonlinearSystems()))
1055  for (const auto & nls_var_name : problem->getNonlinearSystemBase(i).getVariableNames())
1056  options_and_descs[nls_var_name] = "from NonlinearSystem VariableWarehouse";
1057  }
1058  else if (param_type == "AuxVariableName")
1059  {
1060  for (const auto & aux_var_name : problem->getAuxiliarySystem().getVariableNames())
1061  options_and_descs[aux_var_name] = "from AuxiliarySystem VariableWarehouse";
1062  }
1063  else if (param_type == "VariableName")
1064  {
1065  for (const auto i : make_range(problem->numNonlinearSystems()))
1066  for (const auto & nls_var_name : problem->getNonlinearSystemBase(i).getVariableNames())
1067  options_and_descs[nls_var_name] = "from NonlinearSystem VariableWarehouse";
1068  for (const auto & aux_var_name : problem->getAuxiliarySystem().getVariableNames())
1069  options_and_descs[aux_var_name] = "from AuxiliarySystem VariableWarehouse";
1070  }
1071  else if (param_type == "MaterialPropertyName")
1072  {
1073  const auto & mat_prop_registry = problem->getMaterialPropertyRegistry();
1074  const std::vector<std::string> mat_prop_names(mat_prop_registry.idsToNamesBegin(),
1075  mat_prop_registry.idsToNamesEnd());
1076  for (const auto & mat_prop_name : mat_prop_names)
1077  options_and_descs[mat_prop_name] = "from MaterialPropertyRegistry";
1078  }
1079  else if (param_type == "MaterialName")
1080  {
1081  for (const auto & material : problem->getMaterialWarehouse().getObjects())
1082  options_and_descs[material->name()] = "from MaterialWarehouse";
1083  }
1084  else if (param_type == "FunctionName")
1085  {
1086  for (const auto & function : problem->getFunctionWarehouse().getObjects())
1087  options_and_descs[function->name()] = "from FunctionWarehouse";
1088  }
1089  else if (param_type == "OutputName")
1090  {
1091  for (const auto & output_name : app_ptr->getOutputWarehouse().getOutputNames<Output>())
1092  options_and_descs[output_name] = "from OutputWarehouse";
1093  for (const auto & reserved_name : app_ptr->getOutputWarehouse().getReservedNames())
1094  options_and_descs[reserved_name] = "from reserved names in OutputWarehouse";
1095  }
1096  else if (param_type == "UserObjectName")
1097  {
1098  std::vector<UserObject *> user_objects;
1099  problem->theWarehouse()
1100  .query()
1101  .condition<AttribSystem>("UserObject")
1102  .condition<AttribThread>(0)
1103  .queryIntoUnsorted(user_objects);
1104  for (const auto & user_object : user_objects)
1105  options_and_descs[user_object->name()] = "from UserObjectWarehouse";
1106  }
1107 }
Based class for output objects.
Definition: Output.h:43
const MooseApp * queryCheckApp() const
Definition: MooseServer.C:2074
IntRange< T > make_range(T beg, T end)

◆ addParametersToList()

bool MooseServer::addParametersToList ( wasp::DataArray &  completionItems,
const InputParameters valid_params,
const std::set< std::string > &  existing_params,
int  replace_line_beg,
int  replace_char_beg,
int  replace_line_end,
int  replace_char_end,
const std::string &  filtering_prefix 
)
private

Add parameters that were previously gathered to list for completion.

Parameters
completionItems- list of completion objects to be filled out
valid_params- all valid parameters to add to completion list
existing_params- set of parameters already existing in input
replace_line_beg- start line of autocompletion replace range
replace_char_beg- start column of autocomplete replace range
replace_line_end- end line of autocomplete replacement range
replace_char_end- end column of autocompletion replace range
filtering_prefix- beginning text to filter list if not empty
Returns
- true if filling of completion items completed successfully

Definition at line 649 of file MooseServer.C.

Referenced by gatherDocumentCompletionItems().

657 {
658  bool pass = true;
659 
660  // walk over collection of all valid parameters and build completion list
661  for (const auto & valid_params_iter : valid_params)
662  {
663  const std::string & param_name = valid_params_iter.first;
664  bool deprecated = valid_params.isParamDeprecated(param_name);
665  bool is_private = valid_params.isPrivate(param_name);
666 
667  // filter out parameters that are deprecated, private, or already exist
668  if (deprecated || is_private || existing_params.count(param_name))
669  continue;
670 
671  // filter out parameters that do not begin with prefix if one was given
672  if (param_name.rfind(filtering_prefix, 0) != 0)
673  continue;
674 
675  // process parameter description and type to use in input default value
676  std::string dirty_type = valid_params.type(param_name);
677  std::string clean_type = MooseUtils::prettyCppType(dirty_type);
678  std::string basic_type = JsonSyntaxTree::basicCppType(clean_type);
679  std::string doc_string = valid_params.getDocString(param_name);
680  MooseUtils::escape(doc_string);
681 
682  // use basic type to decide if parameter is array and quotes are needed
683  bool is_array = basic_type.compare(0, 6, "Array:") == 0;
684 
685  // remove any array prefixes from basic type string and leave base type
686  pcrecpp::RE("(Array:)*(.*)").GlobalReplace("\\2", &basic_type);
687 
688  // prepare clean cpp type string to be used for key to find input paths
689  pcrecpp::RE(".+<([A-Za-z0-9_' ':]*)>.*").GlobalReplace("\\1", &clean_type);
690 
691  // decide completion item kind that client may use to display list icon
692  int complete_kind = getCompletionItemKind(valid_params, param_name, clean_type, true);
693 
694  // default value for completion to be built using parameter information
695  std::string default_value;
696 
697  // first if parameter default is set then use it to build default value
698  if (valid_params.isParamValid(param_name))
699  {
700  default_value = JsonSyntaxTree::buildOutputString(valid_params_iter);
701  default_value = MooseUtils::trim(default_value);
702  }
703 
704  // otherwise if parameter has coupled default then use as default value
705  else if (valid_params.hasDefaultCoupledValue(param_name))
706  {
707  std::ostringstream oss;
708  oss << valid_params.defaultCoupledValue(param_name);
709  default_value = oss.str();
710  }
711 
712  // switch 1 to true or 0 to false if boolean parameter as default value
713  if (basic_type == "Boolean" && default_value == "1")
714  default_value = "true";
715  else if (basic_type == "Boolean" && default_value == "0")
716  default_value = "false";
717 
718  // wrap default value with single quotes if it exists and type is array
719  std::string array_quote = is_array && !default_value.empty() ? "'" : "";
720 
721  // choose format of insertion text based on if client supports snippets
722  int text_format;
723  std::string insert_text;
724  if (client_snippet_support && !default_value.empty())
725  {
726  text_format = wasp::lsp::m_text_format_snippet;
727  insert_text = param_name + " = " + array_quote + "${1:" + default_value + "}" + array_quote;
728  }
729  else
730  {
731  text_format = wasp::lsp::m_text_format_plaintext;
732  insert_text = param_name + " = " + array_quote + default_value + array_quote;
733  }
734  // finally build full insertion from parameter name, quote, and default
735 
736  // add parameter label, insert text, and description to completion list
737  completionItems.push_back(wasp::DataObject());
738  wasp::DataObject * item = completionItems.back().to_object();
739  pass &= wasp::lsp::buildCompletionObject(*item,
740  errors,
741  param_name,
742  replace_line_beg,
743  replace_char_beg,
744  replace_line_end,
745  replace_char_end,
746  insert_text,
747  complete_kind,
748  "",
749  doc_string,
750  false,
751  false,
752  text_format);
753  }
754 
755  return pass;
756 }
static std::string buildOutputString(const std::iterator_traits< InputParameters::iterator >::value_type &p)
std::string trim(const std::string &str, const std::string &white_space=" \\\)
Standard scripting language trim function.
static std::string basicCppType(const std::string &cpp_type)
Utilities for making sense of c++ types.
int getCompletionItemKind(const InputParameters &valid_params, const std::string &param_name, const std::string &clean_type, bool is_param)
Get completion item kind value that client may use for icon in list.
Definition: MooseServer.C:1734
void escape(std::string &str)
Definition: MooseUtils.C:207
std::string prettyCppType(const std::string &cpp_type)
Definition: MooseUtils.C:1140

◆ addResourcesForDocument()

void MooseServer::addResourcesForDocument ( )
private

Add paths from includes and FileName parameters for client to watch.

Definition at line 263 of file MooseServer.C.

Referenced by parseDocumentForDiagnostics().

264 {
265  // return without any resources added for document if parser root is null
266  auto root_ptr = queryRoot();
267  if (!root_ptr)
268  return;
269  auto & root = *root_ptr;
270 
271  // return without document resources added if client does not watch files
272  if (!client_watcher_support)
273  return;
274 
275  // get input parse tree root node to be used for gathering resource files
276  wasp::HITNodeView view_root = root.getNodeView();
277  std::set<std::string> include_paths, filename_vals, resource_uris;
278 
279  // gather paths of include inputs and add to resource uris if files exist
280  view_root.node_pool()->descendant_include_paths(include_paths);
281  for (const auto & include_path : include_paths)
282  {
283  auto normalized = std::filesystem::path(include_path).lexically_normal().string();
284  if (MooseUtils::checkFileReadable(normalized, false, false, false))
285  resource_uris.insert(wasp::lsp::prefixUriScheme(normalized));
286  }
287 
288  // gather paths of FileName types and add to resource uris if files exist
289  getFileNameTypeValues(filename_vals, view_root);
290  for (const auto & filename_val : filename_vals)
291  {
292  auto input_path = wasp::lsp::removeUriScheme(document_path);
293  auto input_base = std::filesystem::path(input_path).parent_path();
294  auto fname_path = std::filesystem::path(filename_val);
295  auto fname_absl = fname_path.is_absolute() ? fname_path : (input_base / fname_path);
296  auto normalized = fname_absl.lexically_normal().string();
297  if (MooseUtils::checkFileReadable(normalized, false, false, false))
298  resource_uris.insert(wasp::lsp::prefixUriScheme(normalized));
299  }
300 
301  // add collection of all gathered paths as resources for current document
302  setResourcesForBase(document_path, resource_uris);
303 }
void getFileNameTypeValues(std::set< std::string > &filename_vals, wasp::HITNodeView parent)
Recursively walk input to gather all FileName type parameter values.
Definition: MooseServer.C:306
bool checkFileReadable(const std::string &filename, bool check_line_endings, bool throw_on_unreadable, bool check_for_git_lfs_pointer)
Definition: MooseUtils.C:254
const hit::Node * queryRoot() const
Definition: MooseServer.C:2032

◆ addSubblocksToList()

bool MooseServer::addSubblocksToList ( wasp::DataArray &  completionItems,
const std::string &  object_path,
int  replace_line_beg,
int  replace_char_beg,
int  replace_line_end,
int  replace_char_end,
const std::string &  filtering_prefix,
bool  request_on_block_decl 
)
private

Add subblocks to completion list for request path, line, and column.

Parameters
completionItems- list of completion objects to be filled out
object_path- full node path where autocomplete was requested
replace_line_beg- start line of autocompletion replace range
replace_char_beg- start column of autocomplete replace range
replace_line_end- end line of autocomplete replacement range
replace_char_end- end column of autocompletion replace range
filtering_prefix- beginning text to filter list if not empty
Returns
- true if filling of completion items completed successfully

Definition at line 759 of file MooseServer.C.

Referenced by gatherDocumentCompletionItems().

767 {
768  Syntax & syntax = _moose_app.syntax();
769 
770  // set used to prevent reprocessing syntax paths for more than one action
771  std::set<std::string> syntax_paths_processed;
772 
773  // build map of all syntax paths to names for subblocks and save to reuse
774  if (_syntax_to_subblocks.empty())
775  {
776  for (const auto & syntax_path_iter : syntax.getAssociatedActions())
777  {
778  std::string syntax_path = "/" + syntax_path_iter.first;
779 
780  // skip current syntax path if already processed for different action
781  if (!syntax_paths_processed.insert(syntax_path).second)
782  continue;
783 
784  // walk backward through syntax path adding subblock names to parents
785  for (std::size_t last_sep; (last_sep = syntax_path.find_last_of("/")) != std::string::npos;)
786  {
787  std::string subblock_name = syntax_path.substr(last_sep + 1);
788  syntax_path = syntax_path.substr(0, last_sep);
789  _syntax_to_subblocks[syntax_path].insert(subblock_name);
790  }
791  }
792  }
793 
794  // get registered syntax from object path using map of paths to subblocks
795  std::string registered_syntax = syntax.isAssociated(object_path, nullptr, _syntax_to_subblocks);
796 
797  bool pass = true;
798 
799  // walk over subblock names if found or at root and build completion list
800  if (!registered_syntax.empty() || object_path == "/")
801  {
802  // choose format of insertion text based on if client supports snippets
803  int text_format = client_snippet_support ? wasp::lsp::m_text_format_snippet
804  : wasp::lsp::m_text_format_plaintext;
805 
806  for (const auto & subblock_name : _syntax_to_subblocks[registered_syntax])
807  {
808  // filter subblock if it does not begin with prefix and one was given
809  if (subblock_name != "*" && subblock_name.rfind(filtering_prefix, 0) != 0)
810  continue;
811 
812  std::string doc_string;
813  std::string insert_text;
814  int complete_kind;
815 
816  // build required parameter list for each block to use in insert text
817  const std::string full_block_path = object_path + "/" + subblock_name;
818  const std::string req_params = getRequiredParamsText(full_block_path, "", {}, " ");
819 
820  // customize description and insert text for star and named subblocks
821  if (subblock_name == "*")
822  {
823  doc_string = "custom user named block";
824  insert_text = (request_on_block_decl ? "" : "[") +
825  (filtering_prefix.size() ? filtering_prefix : "block_name") + "]" +
826  req_params + "\n " + (client_snippet_support ? "$0" : "") + "\n[]";
827  complete_kind = wasp::lsp::m_comp_kind_variable;
828  }
829  else
830  {
831  doc_string = "application named block";
832  insert_text = (request_on_block_decl ? "" : "[") + subblock_name + "]" + req_params +
833  "\n " + (client_snippet_support ? "$0" : "") + "\n[]";
834  complete_kind = wasp::lsp::m_comp_kind_struct;
835  }
836 
837  // add subblock name, insert text, and description to completion list
838  completionItems.push_back(wasp::DataObject());
839  wasp::DataObject * item = completionItems.back().to_object();
840  pass &= wasp::lsp::buildCompletionObject(*item,
841  errors,
842  subblock_name,
843  replace_line_beg,
844  replace_char_beg,
845  replace_line_end,
846  replace_char_end,
847  insert_text,
848  complete_kind,
849  "",
850  doc_string,
851  false,
852  false,
853  text_format);
854  }
855  }
856 
857  return pass;
858 }
const std::multimap< std::string, ActionInfo > & getAssociatedActions() const
Return all Syntax to Action associations.
Definition: Syntax.C:374
std::string getRequiredParamsText(const std::string &subblock_path, const std::string &subblock_type, const std::set< std::string > &existing_params, const std::string &indent_spaces)
Get required parameter completion text list for given subblock path.
Definition: MooseServer.C:1803
Syntax & syntax()
Returns a writable reference to the syntax object.
Definition: MooseApp.h:230
std::string isAssociated(const std::string &real_id, bool *is_parent, const std::map< std::string, std::set< std::string >> &alt_map={}) const
Method for determining whether a piece of syntax is associated with an Action an optional syntax map ...
Definition: Syntax.C:251
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
Holding syntax for parsing input files.
Definition: Syntax.h:21
std::map< std::string, std::set< std::string > > _syntax_to_subblocks
_syntax_to_subblocks - map of syntax paths to valid subblocks
Definition: MooseServer.h:497

◆ addValuesToList()

bool MooseServer::addValuesToList ( wasp::DataArray &  completionItems,
const InputParameters valid_params,
const std::set< std::string > &  existing_params,
const std::set< std::string > &  existing_subblocks,
const std::string &  param_name,
const std::set< std::string > &  obj_act_tasks,
const std::string &  object_path,
int  replace_line_beg,
int  replace_char_beg,
int  replace_line_end,
int  replace_char_end 
)
private

Add parameter values to completion list for request line and column.

Parameters
completionItems- list of completion objects to be filled out
valid_params- all valid parameters used for value completion
existing_params- set of parameters already existing in input
existing_subblocks- active and inactive subblock name values
param_name- name of input parameter for value autocompletion
obj_act_tasks- tasks to verify object type with valid syntax
object_path- full node path where autocomplete was requested
replace_line_beg- start line of autocompletion replace range
replace_char_beg- start column of autocomplete replace range
replace_line_end- end line of autocomplete replacement range
replace_char_end- end column of autocompletion replace range
Returns
- true if filling of completion items completed successfully

Definition at line 861 of file MooseServer.C.

Referenced by gatherDocumentCompletionItems().

872 {
873  Syntax & syntax = _moose_app.syntax();
874  Factory & factory = _moose_app.getFactory();
875 
876  // get clean type for path associations and basic type for boolean values
877  std::string dirty_type = valid_params.type(param_name);
878  std::string clean_type = MooseUtils::prettyCppType(dirty_type);
879  std::string basic_type = JsonSyntaxTree::basicCppType(clean_type);
880 
881  // remove any array prefixes from basic type string and replace with base
882  pcrecpp::RE("(Array:)*(.*)").GlobalReplace("\\2", &basic_type);
883 
884  // prepare clean cpp type string to be used for a key to find input paths
885  pcrecpp::RE(".+<([A-Za-z0-9_' ':]*)>.*").GlobalReplace("\\1", &clean_type);
886 
887  // decide completion item kind that client may use to display a list icon
888  int complete_kind = getCompletionItemKind(valid_params, param_name, clean_type, false);
889 
890  // map used to gather options and descriptions for value completion items
891  std::map<std::string, std::string> options_and_descs;
892 
893  // first if parameter name is active or inactive then use input subblocks
894  if (param_name == "active" || param_name == "inactive")
895  for (const auto & subblock_name : existing_subblocks)
896  options_and_descs[subblock_name] = "subblock name";
897 
898  // otherwise if parameter type is boolean then use true and false strings
899  else if (basic_type == "Boolean")
900  {
901  options_and_descs["true"];
902  options_and_descs["false"];
903  }
904 
905  // otherwise if parameter type is one of the enums then use valid options
906  else if (valid_params.have_parameter<MooseEnum>(param_name))
907  getEnumsAndDocs(valid_params.get<MooseEnum>(param_name), options_and_descs);
908  else if (valid_params.have_parameter<MultiMooseEnum>(param_name))
909  getEnumsAndDocs(valid_params.get<MultiMooseEnum>(param_name), options_and_descs);
910  else if (valid_params.have_parameter<ExecFlagEnum>(param_name))
911  getEnumsAndDocs(valid_params.get<ExecFlagEnum>(param_name), options_and_descs);
912  else if (valid_params.have_parameter<std::vector<MooseEnum>>(param_name))
913  getEnumsAndDocs(valid_params.get<std::vector<MooseEnum>>(param_name)[0], options_and_descs);
914 
915  // otherwise if parameter name is type then use all verified object names
916  else if (param_name == "type")
917  {
918  // walk over entire set of objects that have been registered in factory
919  for (const auto & objects_iter : factory.registeredObjects())
920  {
921  const std::string & object_name = objects_iter.first;
922  const InputParameters & object_params = objects_iter.second->buildParameters();
923 
924  // build required parameter list for each block to use in insert text
925  std::string req_params = getRequiredParamsText(object_path, object_name, existing_params, "");
926  req_params += req_params.size() ? "\n" + std::string(client_snippet_support ? "$0" : "") : "";
927 
928  // check if object has registered base parameter that can be verified
929  if (!object_params.hasBase())
930  continue;
931  const std::string & moose_base = object_params.getBase();
932 
933  // walk over gathered MooseObjectAction tasks and add if base matches
934  for (const auto & obj_act_task : obj_act_tasks)
935  {
936  if (!syntax.verifyMooseObjectTask(moose_base, obj_act_task))
937  continue;
938  std::string type_description = object_params.getClassDescription();
939  MooseUtils::escape(type_description);
940  options_and_descs[object_name + req_params] = type_description;
941  break;
942  }
943  }
944  }
945 
946  // otherwise if parameter type has any associated syntax then use lookups
947  else
948  {
949  // build map of parameter types to input lookup paths and save to reuse
950  if (_type_to_input_paths.empty())
951  {
952  for (const auto & associated_types_iter : syntax.getAssociatedTypes())
953  {
954  const std::string & type = associated_types_iter.second;
955  const std::string & path = associated_types_iter.first;
956  _type_to_input_paths[type].insert(path);
957  }
958  }
959 
960  // check for input lookup paths that are associated with parameter type
961  const auto & input_path_iter = _type_to_input_paths.find(clean_type);
962 
963  if (input_path_iter != _type_to_input_paths.end())
964  {
965  wasp::HITNodeView view_root = getRoot().getNodeView();
966 
967  // walk over all syntax paths that are associated with parameter type
968  for (const auto & input_path : input_path_iter->second)
969  {
970  // use wasp siren to gather all input values at current lookup path
971  wasp::SIRENInterpreter<> selector;
972  if (!selector.parseString(input_path))
973  continue;
974  wasp::SIRENResultSet<wasp::HITNodeView> results;
975  std::size_t count = selector.evaluate(view_root, results);
976 
977  // walk over results and add each input value found at current path
978  for (std::size_t i = 0; i < count; i++)
979  if (results.adapted(i).type() == wasp::OBJECT)
980  options_and_descs[results.adapted(i).name()] = "from /" + input_path;
981  }
982  }
983 
984  // warehouse based completion is unavailable if problem failed to build
985  // input lookup based completion works even when problem fails to build
986  // so warehouse completion supplements lookups rather than replacing it
987  addObjectsFromWarehouses(clean_type, options_and_descs);
988  }
989 
990  // choose format of insertion text based on if client has snippet support
991  int text_format = client_snippet_support ? wasp::lsp::m_text_format_snippet
992  : wasp::lsp::m_text_format_plaintext;
993 
994  bool pass = true;
995 
996  // walk over pairs of options with descriptions and build completion list
997  for (const auto & option_and_desc : options_and_descs)
998  {
999  const std::string & insert_text = option_and_desc.first;
1000  const std::string & option_name = insert_text.substr(0, insert_text.find('\n'));
1001  const std::string & description = option_and_desc.second;
1002 
1003  // add option name, insertion range, and description to completion list
1004  completionItems.push_back(wasp::DataObject());
1005  wasp::DataObject * item = completionItems.back().to_object();
1006  pass &= wasp::lsp::buildCompletionObject(*item,
1007  errors,
1008  option_name,
1009  replace_line_beg,
1010  replace_char_beg,
1011  replace_line_end,
1012  replace_char_end,
1013  insert_text,
1014  complete_kind,
1015  "",
1016  description,
1017  false,
1018  false,
1019  text_format);
1020  }
1021 
1022  return pass;
1023 }
const std::multimap< std::string, std::string > & getAssociatedTypes() const
Get a multimap of registered associations of syntax with type.
Definition: Syntax.C:368
std::map< std::string, std::set< std::string > > _type_to_input_paths
_type_to_input_paths - map of parameter types to lookup paths
Definition: MooseServer.h:502
A MultiMooseEnum object to hold "execute_on" flags.
Definition: ExecFlagEnum.h:21
std::string getRequiredParamsText(const std::string &subblock_path, const std::string &subblock_type, const std::set< std::string > &existing_params, const std::string &indent_spaces)
Get required parameter completion text list for given subblock path.
Definition: MooseServer.C:1803
Generic factory class for build all sorts of objects.
Definition: Factory.h:28
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const hit::Node & getRoot() const
Definition: MooseServer.C:2101
bool hasBase() const
Syntax & syntax()
Returns a writable reference to the syntax object.
Definition: MooseApp.h:230
const std::string & getBase() const
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition: MooseApp.h:406
void addObjectsFromWarehouses(const std::string &param_type, std::map< std::string, std::string > &options_and_descs)
Supplement completion list with objects in warehouses if applicable.
Definition: MooseServer.C:1039
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:54
const auto & registeredObjects() const
Returns a reference to the map from names to RegistryEntryBase pointers.
Definition: Factory.h:147
static std::string basicCppType(const std::string &cpp_type)
Utilities for making sense of c++ types.
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
std::string type(const std::string &name) const
Prints the type of the requested parameter by name.
Holding syntax for parsing input files.
Definition: Syntax.h:21
bool verifyMooseObjectTask(const std::string &base, const std::string &task) const
Returns a Boolean indicating whether a task is associated with on of the MOOSE pluggable systems (BAS...
Definition: Syntax.C:334
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
std::string getClassDescription() const
Returns the class description.
int getCompletionItemKind(const InputParameters &valid_params, const std::string &param_name, const std::string &clean_type, bool is_param)
Get completion item kind value that client may use for icon in list.
Definition: MooseServer.C:1734
void getEnumsAndDocs(MooseEnumType &moose_enum_param, std::map< std::string, std::string > &options_and_descs)
Fill map of all options and descriptions if parameter is moose enum.
Definition: MooseServer.C:1027
void escape(std::string &str)
Definition: MooseUtils.C:207
std::string prettyCppType(const std::string &cpp_type)
Definition: MooseUtils.C:1140

◆ buildDistPlotResponses()

void MooseServer::buildDistPlotResponses ( wasp::DataArray &  plotting_responses,
FEProblemBase problem,
const std::string &  object_name,
const std::string &  object_type 
)
private

Compute PDF and CDF, build CustomPlot objects, and add to responses.

Parameters
plotting_responses- array to be filled by CustomPlot objects
problem- problem to query warehouses when building plot data
object_name- name of request object to use for problem query
object_type- type of request object to use in title for plot

Definition at line 1922 of file MooseServer.C.

Referenced by gatherPlottingResponses().

1926 {
1927  // get distribution from problem that is registered for given object name
1928  const Distribution & dist = problem.getDistribution(object_name);
1929 
1930  // pick plot x-range using quantiles to be generic for distribution types
1931  const double min_x = dist.quantile(_dist_plot_quantile_bound);
1932  const double max_x = dist.quantile(1.0 - _dist_plot_quantile_bound);
1933  const double del_x = (max_x - min_x) / (_dist_plot_num_points - 1);
1934 
1935  // return without any plots added if any calculated values are not finite
1936  if (!std::isfinite(min_x) || !std::isfinite(max_x) || max_x <= min_x || !std::isfinite(del_x))
1937  return;
1938 
1939  // use uniform grid of x-axis graph keys to sample plot values for y-axis
1940  std::vector<double> graph_keys(_dist_plot_num_points);
1941  std::vector<double> pdf_values(_dist_plot_num_points);
1942  std::vector<double> cdf_values(_dist_plot_num_points);
1943 
1944  // calculate PDF values and CDF values for each key within range of graph
1945  for (std::size_t i = 0; i < _dist_plot_num_points; i++)
1946  {
1947  graph_keys[i] = min_x + (i * del_x);
1948  pdf_values[i] = dist.pdf(graph_keys[i]);
1949  cdf_values[i] = dist.cdf(graph_keys[i]);
1950 
1951  // return without any plots added if any PDF or CDF value is not finite
1952  if (!std::isfinite(pdf_values[i]) || !std::isfinite(cdf_values[i]))
1953  return;
1954  }
1955 
1956  // lambda to build CustomPlot object for distribution and add to response
1957  auto add_dist_to_plot = [&](const std::string & dist_type, const std::vector<double> & graph_vals)
1958  {
1959  std::string plot_title = object_name + " " + object_type + " " + dist_type + " Distribution";
1960  std::string x_axis_label = "x values";
1961  std::string y_axis_label = dist_type + " values";
1962  wasp::CustomPlot plot_object;
1963  buildLineGraphPlot(plot_object, plot_title, x_axis_label, y_axis_label, graph_keys, graph_vals);
1964  plotting_responses.push_back(wasp::serializeCustomPlot(plot_object));
1965  };
1966 
1967  // build CustomPlot object for PDF values, serialize, and add to response
1968  add_dist_to_plot("PDF", pdf_values);
1969 
1970  // build CustomPlot object for CDF values, serialize, and add to response
1971  add_dist_to_plot("CDF", cdf_values);
1972 }
virtual Real pdf(const Real &x) const =0
Compute the probability with given probability distribution function (PDF) at x.
virtual Distribution & getDistribution(const std::string &name)
double _dist_plot_quantile_bound
_dist_plot_quantile_bound - epsilon to bound plot range tails
Definition: MooseServer.h:522
All Distributions should inherit from this class.
Definition: Distribution.h:18
void buildLineGraphPlot(wasp::CustomPlot &plot_object, const std::string &plot_title, const std::string &x_axis_label, const std::string &y_axis_label, const std::vector< double > &graph_keys, const std::vector< double > &graph_vals)
Build CustomPlot graph with provided keys, values, and plot title.
Definition: MooseServer.C:1975
virtual Real cdf(const Real &x) const =0
Compute the cumulative probability with given cumulative probability distribution (CDF) at x...
std::size_t _dist_plot_num_points
_dist_plot_num_points - distribution plot sampling resolution
Definition: MooseServer.h:517
virtual Real quantile(const Real &y) const =0
Compute the inverse CDF (quantile function) value for given variable value y.

◆ buildFuncPlotResponse()

void MooseServer::buildFuncPlotResponse ( wasp::DataArray &  plotting_responses,
FEProblemBase problem,
const std::string &  object_name,
const std::string &  object_type 
)
private

Gather function data, build CustomPlot object, and add to responses.

Parameters
plotting_responses- array to be filled by CustomPlot objects
problem- problem to query warehouses when building plot data
object_name- name of request object to use for problem query
object_type- type of request object to use in title for plot

Definition at line 1890 of file MooseServer.C.

Referenced by gatherPlottingResponses().

1894 {
1895  // get function from problem and return with no plots added if wrong type
1896  const auto * pw_func = dynamic_cast<const PiecewiseBase *>(&problem.getFunction(object_name));
1897  if (!pw_func)
1898  return;
1899 
1900  // return without adding plot response objects when function size is zero
1901  if (pw_func->functionSize() == 0)
1902  return;
1903 
1904  // walk over piecewise function and gather keys and values for line graph
1905  std::vector<double> graph_keys, graph_vals;
1906  for (std::size_t i = 0; i < pw_func->functionSize(); i++)
1907  {
1908  graph_keys.push_back(pw_func->domain(i));
1909  graph_vals.push_back(pw_func->range(i));
1910  }
1911 
1912  // build CustomPlot object from function data then serialize for response
1913  std::string plot_title = object_name + " " + object_type + " Function";
1914  std::string x_axis_label = "abscissa values";
1915  std::string y_axis_label = "ordinate values";
1916  wasp::CustomPlot plot_object;
1917  buildLineGraphPlot(plot_object, plot_title, x_axis_label, y_axis_label, graph_keys, graph_vals);
1918  plotting_responses.push_back(wasp::serializeCustomPlot(plot_object));
1919 }
Function base which provides a piecewise approximation to a specified (x,y) point data set...
Definition: PiecewiseBase.h:20
void buildLineGraphPlot(wasp::CustomPlot &plot_object, const std::string &plot_title, const std::string &x_axis_label, const std::string &y_axis_label, const std::vector< double > &graph_keys, const std::vector< double > &graph_vals)
Build CustomPlot graph with provided keys, values, and plot title.
Definition: MooseServer.C:1975
virtual Function & getFunction(const std::string &name, const THREAD_ID tid=0)

◆ buildLineGraphPlot()

void MooseServer::buildLineGraphPlot ( wasp::CustomPlot &  plot_object,
const std::string &  plot_title,
const std::string &  x_axis_label,
const std::string &  y_axis_label,
const std::vector< double > &  graph_keys,
const std::vector< double > &  graph_vals 
)
private

Build CustomPlot graph with provided keys, values, and plot title.

Parameters
plot_object- CustomPlot object to be built into line graph
plot_title- title for plot composed of block name and type
x_axis_label- label for x-axis of plot dependent upon type
y_axis_label- label for y-axis of plot dependent upon type
graph_keys- x values of function or distribution for graph
graph_vals- y values of function or distribution for graph

Definition at line 1975 of file MooseServer.C.

Referenced by buildDistPlotResponses(), and buildFuncPlotResponse().

1981 {
1982  // axis ranges
1983  double min_key = *std::min_element(graph_keys.begin(), graph_keys.end());
1984  double max_key = *std::max_element(graph_keys.begin(), graph_keys.end());
1985  double min_val = *std::min_element(graph_vals.begin(), graph_vals.end());
1986  double max_val = *std::max_element(graph_vals.begin(), graph_vals.end());
1987 
1988  // widen extents
1989  double pad_factor = 0.05;
1990  double pad_x_axis = (max_key - min_key) * pad_factor;
1991  double pad_y_axis = (max_val - min_val) * pad_factor;
1992  if (pad_y_axis == 0)
1993  pad_y_axis = pad_factor;
1994  min_key -= pad_x_axis;
1995  max_key += pad_x_axis;
1996  min_val -= pad_y_axis;
1997  max_val += pad_y_axis;
1998 
1999  // plot setup
2000  plot_object.title().text(plot_title);
2001  plot_object.title().font().pointsize(18);
2002  plot_object.title().visible(true);
2003  plot_object.legend().visible(false);
2004 
2005  // plot x-axis
2006  plot_object.x1Axis().label(x_axis_label);
2007  plot_object.x1Axis().rangeMin(min_key);
2008  plot_object.x1Axis().rangeMax(max_key);
2009  plot_object.x1Axis().scaleType(wasp::CustomPlot::stLinear);
2010  plot_object.x1Axis().labelType(wasp::CustomPlot::ltNumber);
2011  plot_object.x1Axis().labelFont().pointsize(18);
2012  plot_object.x1Axis().tickLabelFont().pointsize(16);
2013 
2014  // plot y-axis
2015  plot_object.y1Axis().label(y_axis_label);
2016  plot_object.y1Axis().rangeMin(min_val);
2017  plot_object.y1Axis().rangeMax(max_val);
2018  plot_object.y1Axis().scaleType(wasp::CustomPlot::stLinear);
2019  plot_object.y1Axis().labelType(wasp::CustomPlot::ltNumber);
2020  plot_object.y1Axis().labelFont().pointsize(18);
2021  plot_object.y1Axis().tickLabelFont().pointsize(16);
2022 
2023  // graph series
2024  auto line_graph = std::make_shared<wasp::CustomPlot::Graph>();
2025  line_graph->keys() = graph_keys;
2026  line_graph->values() = graph_vals;
2027  line_graph->scatterShape(wasp::CustomPlot::ssDisc);
2028  plot_object.series().push_back(line_graph);
2029 }

◆ connectionRead()

bool MooseServer::connectionRead ( wasp::DataObject &  object)
inlineprivate

Read from connection into object - specific to this server's connection.

Parameters
object- reference to object to be read into
Returns
- true if the read from the connection completed successfully

Definition at line 421 of file MooseServer.h.

421 { return _connection->read(object, errors); }
std::shared_ptr< wasp::lsp::IOStreamConnection > _connection
_connection - shared pointer to this server&#39;s read / write iostream
Definition: MooseServer.h:492

◆ connectionWrite()

bool MooseServer::connectionWrite ( wasp::DataObject &  object)
inlineprivate

Write object json to connection - specific to this server's connection.

Parameters
object- reference to object with contents to write to connection
Returns
- true if the write to the connection completed successfully

Definition at line 428 of file MooseServer.h.

428 { return _connection->write(object, errors); }
std::shared_ptr< wasp::lsp::IOStreamConnection > _connection
_connection - shared pointer to this server&#39;s read / write iostream
Definition: MooseServer.h:492

◆ formatDocument()

std::string MooseServer::formatDocument ( wasp::HITNodeView  parent,
std::size_t &  prev_line,
std::size_t  level 
)
private

Recursively walk down whole nodeview tree while formatting document.

Parameters
parent- nodeview for recursive tree traversal starting point
prev_line- line of last print for blanks and inline comments
level- current level in document tree to use for indentation
Returns
- formatted string that gets appended to each recursive call

Definition at line 1559 of file MooseServer.C.

Referenced by gatherDocumentFormattingTextEdits().

1560 {
1561  // build string of newline and indentation spaces from level and tab size
1562  std::string newline_indent = "\n" + std::string(level * _formatting_tab_size, ' ');
1563 
1564  // lambda to format include data by replacing consecutive spaces with one
1565  auto collapse_spaces = [](std::string string_copy)
1566  {
1567  pcrecpp::RE("\\s+").Replace(" ", &string_copy);
1568  return string_copy;
1569  };
1570 
1571  // formatted string that will be built recursively by appending each call
1572  std::string format_string;
1573 
1574  // walk over all children of this node context and build formatted string
1575  for (const auto i : make_range(parent.child_count()))
1576  {
1577  // walk must be index based to catch file include and skip its children
1578  wasp::HITNodeView child = parent.child_at(i);
1579 
1580  // get declarator to address shorthand syntax object with no declarator
1581  auto decl = child.child_count_by_name("decl") ? child.first_child_by_name("decl").data() : "";
1582 
1583  // add blank line if necessary after previous line and before this line
1584  std::string blank = child.line() > prev_line + 1 ? "\n" : "";
1585 
1586  // format include directive with indentation and collapse extra spacing
1587  if (child.type() == wasp::FILE)
1588  format_string += blank + newline_indent + MooseUtils::trim(collapse_spaces(child.data()));
1589 
1590  // format normal comment with indentation and inline comment with space
1591  else if (child.type() == wasp::COMMENT)
1592  format_string += (child.line() == prev_line ? " " : blank + newline_indent) +
1593  MooseUtils::trim(child.data());
1594 
1595  // pass object with no declarator through without increased indentation
1596  else if (child.type() == wasp::OBJECT && decl.empty())
1597  format_string += formatDocument(child, prev_line, level);
1598 
1599  // format object recursively with indentation and without legacy syntax
1600  else if (child.type() == wasp::OBJECT)
1601  format_string += blank + newline_indent + "[" + decl + "]" +
1602  formatDocument(child, prev_line, level + 1) + newline_indent + "[]";
1603 
1604  // format keyed value with indentation and calling reusable hit methods
1605  else if (child.type() == wasp::KEYED_VALUE || child.type() == wasp::ARRAY)
1606  {
1607  const std::string assign = wasp::is_override(child) ? child.child_at(1).data() : "=";
1608  const std::string prefix = newline_indent + decl + " " + assign + " ";
1609 
1610  const std::string render_val = hit::extractValue(child.data());
1611  std::size_t val_column = child.child_count() > 2 ? child.child_at(2).column() : 0;
1612  std::size_t prefix_len = prefix.size() - 1;
1613 
1614  format_string += blank + prefix + hit::formatValue(render_val, val_column, prefix_len);
1615  }
1616 
1617  // set previous line reference used for blank lines and inline comments
1618  prev_line = child.last_line();
1619  }
1620 
1621  // return formatted text string that gets appended to each recursive call
1622  return format_string;
1623 }
std::string trim(const std::string &str, const std::string &white_space=" \\\)
Standard scripting language trim function.
IntRange< T > make_range(T beg, T end)
std::size_t _formatting_tab_size
_formatting_tab_size - number of indent spaces for formatting
Definition: MooseServer.h:512
std::string formatDocument(wasp::HITNodeView parent, std::size_t &prev_line, std::size_t level)
Recursively walk down whole nodeview tree while formatting document.
Definition: MooseServer.C:1559

◆ gatherDocumentCompletionItems()

bool MooseServer::gatherDocumentCompletionItems ( wasp::DataArray &  completionItems,
bool &  is_incomplete,
int  line,
int  character 
)
private

Gather document completion items - specific to this server implemention.

Parameters
completionItems- data array of completion item objects to fill
is_incomplete- flag indicating if the completions are complete
line- line to be used for completions gathering logic
character- column to be used for completions gathering logic
Returns
- true if the gathering of items completed successfully

Definition at line 362 of file MooseServer.C.

366 {
367  auto root_ptr = queryRoot();
368 
369  // add only root level blocks to completion list when parser root is null
370  if (!root_ptr)
371  return addSubblocksToList(completionItems, "/", line, character, line, character, "", false);
372  auto & root = *root_ptr;
373 
374  // lambdas that will be used for checking completion request context type
375  auto is_request_in_open_block = [](wasp::HITNodeView request_context) {
376  return request_context.type() == wasp::OBJECT || request_context.type() == wasp::DOCUMENT_ROOT;
377  };
378  auto is_request_on_param_decl = [](wasp::HITNodeView request_context)
379  {
380  return request_context.type() == wasp::DECL && request_context.has_parent() &&
381  (request_context.parent().type() == wasp::KEYED_VALUE ||
382  request_context.parent().type() == wasp::ARRAY);
383  };
384  auto is_request_on_block_decl = [](wasp::HITNodeView request_context)
385  {
386  return request_context.type() == wasp::DECL && request_context.has_parent() &&
387  request_context.parent().type() == wasp::OBJECT;
388  };
389 
390  // get document tree root used to find node under request line and column
391  wasp::HITNodeView view_root = root.getNodeView();
392  wasp::HITNodeView request_context;
393 
394  // find node under request location if it is not past all defined content
395  if (line + 1 < (int)view_root.last_line() ||
396  (line + 1 == (int)view_root.last_line() && character <= (int)view_root.last_column()))
397  request_context = wasp::findNodeUnderLineColumn(view_root, line + 1, character + 1);
398 
399  // otherwise find last node in document with last line and column of tree
400  else
401  {
402  request_context =
403  wasp::findNodeUnderLineColumn(view_root, view_root.last_line(), view_root.last_column());
404 
405  // change context to be parent block or grandparent if block terminator
406  wasp::HITNodeView object_context = request_context;
407  while (object_context.type() != wasp::OBJECT && object_context.has_parent())
408  object_context = object_context.parent();
409  if (request_context.type() == wasp::OBJECT_TERM && object_context.has_parent())
410  object_context = object_context.parent();
411  request_context = object_context;
412  }
413 
414  // change context to equal sign if it is preceding node and in open block
415  if (is_request_in_open_block(request_context))
416  {
417  wasp::HITNodeView backup_context = request_context;
418  for (int backup_char = character; backup_context == request_context && --backup_char > 0;)
419  backup_context = wasp::findNodeUnderLineColumn(request_context, line + 1, backup_char + 1);
420  if (backup_context.type() == wasp::ASSIGN || backup_context.type() == wasp::OVERRIDE_ASSIGN)
421  request_context = backup_context;
422  }
423 
424  // use request context type to set up replacement range and prefix filter
425  int replace_line_beg = line;
426  int replace_char_beg = character;
427  int replace_line_end = line;
428  int replace_char_end = character;
429  std::string filtering_prefix;
430  if (request_context.type() == wasp::DECL || request_context.type() == wasp::VALUE)
431  {
432  // completion on existing block name, parameter name, or value replaces
433  replace_line_beg = request_context.line() - 1;
434  replace_char_beg = request_context.column() - 1;
435  replace_line_end = request_context.last_line() - 1;
436  replace_char_end = request_context.last_column();
437  filtering_prefix = request_context.data();
438 
439  // empty block name columns are same as bracket so bump replace columns
440  if (is_request_on_block_decl(request_context) && filtering_prefix.empty())
441  {
442  replace_char_beg++;
443  replace_char_end++;
444  }
445  }
446 
447  // get name of request context direct parent node so it can be used later
448  const auto & parent_name = request_context.has_parent() ? request_context.parent().name() : "";
449 
450  // get object context and value of type parameter for request if provided
451  wasp::HITNodeView object_context = request_context;
452  while (object_context.type() != wasp::OBJECT && object_context.has_parent())
453  object_context = object_context.parent();
454  if (is_request_on_block_decl(request_context))
455  object_context = object_context.parent();
456  const std::string & object_path = object_context.path();
457  wasp::HITNodeView type_node = object_context.first_child_by_name("type");
458  const std::string & object_type =
459  type_node.is_null() ? "" : wasp::strip_quotes(hit::extractValue(type_node.data()));
460 
461  // get set of all parameter and subblock names already specified in input
462  std::set<std::string> existing_params, existing_subblocks;
463  getExistingInput(object_context, existing_params, existing_subblocks);
464 
465  // set used to gather all parameters valid from object context of request
466  InputParameters valid_params = emptyInputParameters();
467 
468  // set used to gather MooseObjectAction tasks to verify object parameters
469  std::set<std::string> obj_act_tasks;
470 
471  // get set of global parameters, action parameters, and object parameters
472  getAllValidParameters(valid_params, object_path, object_type, obj_act_tasks);
473 
474  bool pass = true;
475 
476  // add gathered parameters to completion list with input range and prefix
477  if (is_request_in_open_block(request_context) || is_request_on_param_decl(request_context))
478  pass &= addParametersToList(completionItems,
479  valid_params,
480  existing_params,
481  replace_line_beg,
482  replace_char_beg,
483  replace_line_end,
484  replace_char_end,
485  filtering_prefix);
486 
487  // add all valid subblocks to completion list with input range and prefix
488  if (is_request_in_open_block(request_context) || is_request_on_param_decl(request_context) ||
489  is_request_on_block_decl(request_context))
490  pass &= addSubblocksToList(completionItems,
491  object_path,
492  replace_line_beg,
493  replace_char_beg,
494  replace_line_end,
495  replace_char_end,
496  filtering_prefix,
497  is_request_on_block_decl(request_context));
498 
499  // add valid parameter value options to completion list using input range
500  if ((request_context.type() == wasp::VALUE || request_context.type() == wasp::ASSIGN ||
501  request_context.type() == wasp::OVERRIDE_ASSIGN) &&
502  valid_params.getParametersList().count(parent_name))
503  pass &= addValuesToList(completionItems,
504  valid_params,
505  existing_params,
506  existing_subblocks,
507  parent_name,
508  obj_act_tasks,
509  object_path,
510  replace_line_beg,
511  replace_char_beg,
512  replace_line_end,
513  replace_char_end);
514 
515  is_incomplete = !pass;
516 
517  return pass;
518 }
std::set< std::string > getParametersList() const
bool addValuesToList(wasp::DataArray &completionItems, const InputParameters &valid_params, const std::set< std::string > &existing_params, const std::set< std::string > &existing_subblocks, const std::string &param_name, const std::set< std::string > &obj_act_tasks, const std::string &object_path, int replace_line_beg, int replace_char_beg, int replace_line_end, int replace_char_end)
Add parameter values to completion list for request line and column.
Definition: MooseServer.C:861
bool addParametersToList(wasp::DataArray &completionItems, const InputParameters &valid_params, const std::set< std::string > &existing_params, int replace_line_beg, int replace_char_beg, int replace_line_end, int replace_char_end, const std::string &filtering_prefix)
Add parameters that were previously gathered to list for completion.
Definition: MooseServer.C:649
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()
void getAllValidParameters(InputParameters &valid_params, const std::string &object_path, const std::string &object_type, std::set< std::string > &obj_act_tasks)
Get all global parameters, action parameters, and object parameters.
Definition: MooseServer.C:539
bool addSubblocksToList(wasp::DataArray &completionItems, const std::string &object_path, int replace_line_beg, int replace_char_beg, int replace_line_end, int replace_char_end, const std::string &filtering_prefix, bool request_on_block_decl)
Add subblocks to completion list for request path, line, and column.
Definition: MooseServer.C:759
void ErrorVector unsigned int
const hit::Node * queryRoot() const
Definition: MooseServer.C:2032
void getExistingInput(wasp::HITNodeView parent_node, std::set< std::string > &existing_params, std::set< std::string > &existing_subblocks)
Get names of parameters and subblocks specified in given input node.
Definition: MooseServer.C:521

◆ gatherDocumentDefinitionLocations()

bool MooseServer::gatherDocumentDefinitionLocations ( wasp::DataArray &  definitionLocations,
int  line,
int  character 
)
private

Gather definition locations - specific to this server implemention.

Parameters
definitionLocations- data array of locations objects to fill
line- line to be used for locations gathering logic
character- column to be used for locations gathering logic
Returns
- true if the gathering of locations completed successfully

Definition at line 1110 of file MooseServer.C.

1113 {
1114  Factory & factory = _moose_app.getFactory();
1115 
1116  // return without any definition locations added when parser root is null
1117  auto root_ptr = queryRoot();
1118  if (!root_ptr)
1119  return true;
1120  auto & root = *root_ptr;
1121 
1122  // find hit node for zero based request line and column number from input
1123  wasp::HITNodeView view_root = root.getNodeView();
1124  wasp::HITNodeView request_context =
1125  wasp::findNodeUnderLineColumn(view_root, line + 1, character + 1);
1126 
1127  // return without any definition locations added when node not value type
1128  if (request_context.type() != wasp::VALUE)
1129  return true;
1130 
1131  // get name of parameter node parent of value and value string from input
1132  std::string param_name = request_context.has_parent() ? request_context.parent().name() : "";
1133  std::string val_string = request_context.last_as_string();
1134 
1135  // add source code location if type parameter with registered object name
1136  if (param_name == "type" && factory.isRegistered(val_string))
1137  {
1138  // get file path and line number of source code registering object type
1139  FileLineInfo file_line_info = factory.getLineInfo(val_string);
1140 
1141  // return without any definition locations added if file cannot be read
1142  if (!file_line_info.isValid() ||
1143  !MooseUtils::checkFileReadable(file_line_info.file(), false, false, false))
1144  return true;
1145 
1146  // add file scheme prefix to front of file path to build definition uri
1147  auto location_uri = wasp::lsp::m_uri_prefix + file_line_info.file();
1148 
1149  // add file uri and zero based line and column range to definition list
1150  definitionLocations.push_back(wasp::DataObject());
1151  wasp::DataObject * location = definitionLocations.back().to_object();
1152  return wasp::lsp::buildLocationObject(*location,
1153  errors,
1154  location_uri,
1155  file_line_info.line() - 1,
1156  0,
1157  file_line_info.line() - 1,
1158  1000);
1159  }
1160 
1161  // get object context and value of type parameter for request if provided
1162  wasp::HITNodeView object_context = request_context;
1163  while (object_context.type() != wasp::OBJECT && object_context.has_parent())
1164  object_context = object_context.parent();
1165  const std::string & object_path = object_context.path();
1166  wasp::HITNodeView type_node = object_context.first_child_by_name("type");
1167  const std::string & object_type =
1168  type_node.is_null() ? "" : wasp::strip_quotes(hit::extractValue(type_node.data()));
1169 
1170  // set used to gather all parameters valid from object context of request
1171  InputParameters valid_params = emptyInputParameters();
1172 
1173  // set used to gather MooseObjectAction tasks to verify object parameters
1174  std::set<std::string> obj_act_tasks;
1175 
1176  // get set of global parameters, action parameters, and object parameters
1177  getAllValidParameters(valid_params, object_path, object_type, obj_act_tasks);
1178 
1179  // set used to gather nodes from input lookups custom sorted by locations
1180  SortedLocationNodes location_nodes(
1181  [](const wasp::HITNodeView & l, const wasp::HITNodeView & r)
1182  {
1183  const std::string & l_file = l.node_pool()->stream_name();
1184  const std::string & r_file = r.node_pool()->stream_name();
1185  return (l_file < r_file || (l_file == r_file && l.line() < r.line()) ||
1186  (l_file == r_file && l.line() == r.line() && l.column() < r.column()));
1187  });
1188 
1189  // gather all lookup path nodes matching value if parameter name is valid
1190  for (const auto & valid_params_iter : valid_params)
1191  {
1192  if (valid_params_iter.first == param_name)
1193  {
1194  // get cpp type and prepare string for use as key finding input paths
1195  std::string dirty_type = valid_params.type(param_name);
1196  std::string clean_type = MooseUtils::prettyCppType(dirty_type);
1197  pcrecpp::RE(".+<([A-Za-z0-9_' ':]*)>.*").GlobalReplace("\\1", &clean_type);
1198 
1199  // get set of nodes from associated path lookups matching input value
1200  getInputLookupDefinitionNodes(location_nodes, clean_type, val_string);
1201  break;
1202  }
1203  }
1204 
1205  // add parameter declarator to set if none were gathered by input lookups
1206  if (location_nodes.empty() && request_context.has_parent() &&
1207  request_context.parent().child_count_by_name("decl"))
1208  location_nodes.insert(request_context.parent().first_child_by_name("decl"));
1209 
1210  // add locations to definition list using lookups or parameter declarator
1211  return addLocationNodesToList(definitionLocations, location_nodes);
1212 }
bool isRegistered(const std::string &obj_name) const
Returns a Boolean indicating whether an object type has been registered.
Definition: Factory.h:152
void getInputLookupDefinitionNodes(SortedLocationNodes &location_nodes, const std::string &clean_type, const std::string &val_string)
Get set of nodes from associated path lookups matching value string.
Definition: MooseServer.C:1215
Generic factory class for build all sorts of objects.
Definition: Factory.h:28
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
int line() const
Definition: FileLineInfo.C:23
FileLineInfo getLineInfo(const std::string &name) const
Gets file and line information where an object was initially registered.
Definition: Factory.C:284
InputParameters emptyInputParameters()
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition: MooseApp.h:406
std::set< wasp::HITNodeView, std::function< bool(const wasp::HITNodeView &, const wasp::HITNodeView &)> > SortedLocationNodes
SortedLocationNodes - type alias for set of nodes sorted by location.
Definition: MooseServer.h:61
void getAllValidParameters(InputParameters &valid_params, const std::string &object_path, const std::string &object_type, std::set< std::string > &obj_act_tasks)
Get all global parameters, action parameters, and object parameters.
Definition: MooseServer.C:539
Holds file and line information.
Definition: FileLineInfo.h:18
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
std::string file() const
Definition: FileLineInfo.C:29
bool isValid() const
Definition: FileLineInfo.C:17
bool addLocationNodesToList(wasp::DataArray &defsOrRefsLocations, const SortedLocationNodes &location_nodes)
Add set of nodes sorted by location to definition or reference list.
Definition: MooseServer.C:1261
bool checkFileReadable(const std::string &filename, bool check_line_endings, bool throw_on_unreadable, bool check_for_git_lfs_pointer)
Definition: MooseUtils.C:254
const hit::Node * queryRoot() const
Definition: MooseServer.C:2032
std::string prettyCppType(const std::string &cpp_type)
Definition: MooseUtils.C:1140

◆ gatherDocumentFormattingTextEdits()

bool MooseServer::gatherDocumentFormattingTextEdits ( wasp::DataArray &  formattingTextEdits,
int  tab_size,
bool  insert_spaces 
)
private

Gather formatting text edits - specific to this server implemention.

Parameters
formattingTextEdits- data array of text edit objects to fill
tab_size- value of the size of a tab in spaces for formatting
insert_spaces- flag indicating whether to use spaces for tabs
Returns
- true if the gathering of text edits completed successfully

Definition at line 1510 of file MooseServer.C.

1513 {
1514  // strip scheme prefix from document uri if it exists for parse file path
1515  std::string parse_file_path = document_path;
1516  pcrecpp::RE("(.*://)(.*)").Replace("\\2", &parse_file_path);
1517 
1518  // input check expanded any brace expressions in cached tree so reprocess
1519  std::stringstream input_errors, input_stream(getDocumentText());
1520  wasp::DefaultHITInterpreter interpreter(input_errors);
1521 
1522  // return without adding any formatting text edits if input parsing fails
1523  if (!interpreter.parseStream(input_stream, parse_file_path))
1524  return true;
1525 
1526  // return without adding any formatting text edits if parser root is null
1527  if (interpreter.root().is_null())
1528  return true;
1529 
1530  // get input root node line and column range to represent entire document
1531  wasp::HITNodeView view_root = interpreter.root();
1532  int document_start_line = view_root.line() - 1;
1533  int document_start_char = view_root.column() - 1;
1534  int document_last_line = view_root.last_line() - 1;
1535  int document_last_char = view_root.last_column();
1536 
1537  // set number of spaces for indentation and build formatted document text
1538  _formatting_tab_size = tab_size;
1539  std::size_t starting_line = view_root.line() - 1;
1540  std::string document_format = formatDocument(view_root, starting_line, 0);
1541 
1542  // remove beginning newline character from formatted document text string
1543  document_format.erase(0, 1);
1544 
1545  // add formatted text with whole line and column range to formatting list
1546  formattingTextEdits.push_back(wasp::DataObject());
1547  wasp::DataObject * item = formattingTextEdits.back().to_object();
1548  bool pass = wasp::lsp::buildTextEditObject(*item,
1549  errors,
1550  document_start_line,
1551  document_start_char,
1552  document_last_line,
1553  document_last_char,
1554  document_format);
1555  return pass;
1556 }
std::size_t _formatting_tab_size
_formatting_tab_size - number of indent spaces for formatting
Definition: MooseServer.h:512
std::string formatDocument(wasp::HITNodeView parent, std::size_t &prev_line, std::size_t level)
Recursively walk down whole nodeview tree while formatting document.
Definition: MooseServer.C:1559

◆ gatherDocumentReferencesLocations()

bool MooseServer::gatherDocumentReferencesLocations ( wasp::DataArray &  referencesLocations,
int  line,
int  character,
bool  include_declaration 
)
private

Gather references locations - specific to this server implemention.

Parameters
referencesLocations- data array of locations objects to fill
line- line to be used for locations gathering logic
character- column to be used for locations gathering logic
include_declaration- flag indicating declaration inclusion
Returns
- true if the gathering of locations completed successfully

Definition at line 1391 of file MooseServer.C.

1395 {
1396  Syntax & syntax = _moose_app.syntax();
1397 
1398  // return without adding any reference locations when parser root is null
1399  auto root_ptr = queryRoot();
1400  if (!root_ptr)
1401  return true;
1402  auto & root = *root_ptr;
1403 
1404  // find hit node for zero based request line and column number from input
1405  wasp::HITNodeView view_root = root.getNodeView();
1406  wasp::HITNodeView request_context =
1407  wasp::findNodeUnderLineColumn(view_root, line + 1, character + 1);
1408 
1409  // return without adding any references when request not block declarator
1410  if ((request_context.type() != wasp::DECL && request_context.type() != wasp::DOT_SLASH &&
1411  request_context.type() != wasp::LBRACKET && request_context.type() != wasp::RBRACKET) ||
1412  !request_context.has_parent() || request_context.parent().type() != wasp::OBJECT)
1413  return true;
1414 
1415  // get input path and block name of declarator located at request context
1416  const std::string & block_path = request_context.parent().path();
1417  const std::string & block_name = request_context.parent().name();
1418 
1419  // build map from input lookup paths to parameter types and save to reuse
1420  if (_input_path_to_types.empty())
1421  for (const auto & associated_types_iter : syntax.getAssociatedTypes())
1422  {
1423  const std::string & path = associated_types_iter.first;
1424  const std::string & type = associated_types_iter.second;
1425  _input_path_to_types[path].insert(type);
1426  }
1427 
1428  // get registered syntax from block path with map of input paths to types
1429  bool is_parent;
1430  std::string registered_syntax = syntax.isAssociated(block_path, &is_parent, _input_path_to_types);
1431 
1432  // return without adding any references if syntax has no types associated
1433  if (is_parent || !_input_path_to_types.count(registered_syntax))
1434  return true;
1435 
1436  // get set of parameter types which are associated with registered syntax
1437  const std::set<std::string> & target_types = _input_path_to_types.at(registered_syntax);
1438 
1439  // set used to gather nodes collected by value custom sorted by locations
1440  SortedLocationNodes match_nodes(
1441  [](const wasp::HITNodeView & l, const wasp::HITNodeView & r)
1442  {
1443  const std::string & l_file = l.node_pool()->stream_name();
1444  const std::string & r_file = r.node_pool()->stream_name();
1445  return (l_file < r_file || (l_file == r_file && l.line() < r.line()) ||
1446  (l_file == r_file && l.line() == r.line() && l.column() < r.column()));
1447  });
1448 
1449  // walk input recursively and gather all nodes that match value and types
1450  getNodesByValueAndTypes(match_nodes, view_root, block_name, target_types);
1451 
1452  // return without adding any references if no nodes match value and types
1453  if (match_nodes.empty())
1454  return true;
1455 
1456  // add request context node to set if declaration inclusion was specified
1457  if (include_declaration && request_context.parent().child_count_by_name("decl"))
1458  match_nodes.insert(request_context.parent().first_child_by_name("decl"));
1459 
1460  // add locations to references list with nodes that match value and types
1461  return addLocationNodesToList(referencesLocations, match_nodes);
1462 }
const std::multimap< std::string, std::string > & getAssociatedTypes() const
Get a multimap of registered associations of syntax with type.
Definition: Syntax.C:368
std::map< std::string, std::set< std::string > > _input_path_to_types
_type_to_input_paths - map of lookup paths to parameter types
Definition: MooseServer.h:507
Syntax & syntax()
Returns a writable reference to the syntax object.
Definition: MooseApp.h:230
std::set< wasp::HITNodeView, std::function< bool(const wasp::HITNodeView &, const wasp::HITNodeView &)> > SortedLocationNodes
SortedLocationNodes - type alias for set of nodes sorted by location.
Definition: MooseServer.h:61
void getNodesByValueAndTypes(SortedLocationNodes &match_nodes, wasp::HITNodeView view_parent, const std::string &target_value, const std::set< std::string > &target_types)
Recursively walk input to gather all nodes matching value and types.
Definition: MooseServer.C:1465
std::string isAssociated(const std::string &real_id, bool *is_parent, const std::map< std::string, std::set< std::string >> &alt_map={}) const
Method for determining whether a piece of syntax is associated with an Action an optional syntax map ...
Definition: Syntax.C:251
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
Holding syntax for parsing input files.
Definition: Syntax.h:21
bool addLocationNodesToList(wasp::DataArray &defsOrRefsLocations, const SortedLocationNodes &location_nodes)
Add set of nodes sorted by location to definition or reference list.
Definition: MooseServer.C:1261
const hit::Node * queryRoot() const
Definition: MooseServer.C:2032

◆ gatherDocumentSymbols()

bool MooseServer::gatherDocumentSymbols ( wasp::DataArray &  documentSymbols)
private

Gather document symbols - specific to this server implemention.

Parameters
documentSymbols- data array of symbols data objects to fill
Returns
- true if the gathering of symbols completed successfully

Definition at line 1626 of file MooseServer.C.

1627 {
1628  // return prior to starting document symbol tree when parser root is null
1629  auto root_ptr = queryRoot();
1630  if (!root_ptr)
1631  return true;
1632  auto & root = *root_ptr;
1633 
1634  wasp::HITNodeView view_root = root.getNodeView();
1635 
1636  bool pass = true;
1637 
1638  // walk over all children of root node context and build document symbols
1639  for (const auto i : make_range(view_root.child_count()))
1640  {
1641  // walk must be index based to catch file include and skip its children
1642  wasp::HITNodeView view_child = view_root.child_at(i);
1643 
1644  // set up name, zero based line and column range, kind, and detail info
1645  std::string name = view_child.name();
1646  int line = view_child.line() - 1;
1647  int column = view_child.column() - 1;
1648  int last_line = view_child.last_line() - 1;
1649  int last_column = view_child.last_column();
1650  int symbol_kind = getDocumentSymbolKind(view_child);
1651  std::string detail =
1652  !view_child.first_child_by_name("type").is_null()
1653  ? wasp::strip_quotes(hit::extractValue(view_child.first_child_by_name("type").data()))
1654  : "";
1655 
1656  // build document symbol object from node child info and push to array
1657  documentSymbols.push_back(wasp::DataObject());
1658  wasp::DataObject * data_child = documentSymbols.back().to_object();
1659  pass &= wasp::lsp::buildDocumentSymbolObject(*data_child,
1660  errors,
1661  (name.empty() ? "void" : name),
1662  detail,
1663  symbol_kind,
1664  false,
1665  line,
1666  column,
1667  last_line,
1668  last_column,
1669  line,
1670  column,
1671  last_line,
1672  last_column);
1673 
1674  // call method to recursively fill document symbols for each node child
1675  pass &= traverseParseTreeAndFillSymbols(view_child, *data_child);
1676  }
1677 
1678  return pass;
1679 }
std::string name(const ElemQuality q)
int getDocumentSymbolKind(wasp::HITNodeView symbol_node)
Get document symbol kind value that client may use for outline icon.
Definition: MooseServer.C:1765
bool traverseParseTreeAndFillSymbols(wasp::HITNodeView view_parent, wasp::DataObject &data_parent)
Recursively fill document symbols from the given node.
Definition: MooseServer.C:1682
IntRange< T > make_range(T beg, T end)
const hit::Node * queryRoot() const
Definition: MooseServer.C:2032

◆ gatherExtensionResponses()

bool MooseServer::gatherExtensionResponses ( wasp::DataArray &  extensionResponses,
const std::string &  extensionMethod,
int  line,
int  character 
)
private

Gather extension responses - specific to this server implemention.

Parameters
extensionResponses- data array of custom responses to fill
extensionMethod- name for current extension request method
line- zero-based line to use for logic of custom extension
character- zero-based column for logic of custom extension
Returns
- true if request successfully handled with response built

Definition at line 1833 of file MooseServer.C.

1837 {
1838  // use appropriate method to fill response based on extension method name
1839  bool pass = true;
1840  if (extensionMethod == "plotting")
1841  pass = gatherPlottingResponses(extensionResponses, line, character);
1842  return pass;
1843 }
bool gatherPlottingResponses(wasp::DataArray &plotting_responses, int line, int character)
Build CustomPlot extension responses when method name is plotting.
Definition: MooseServer.C:1846

◆ gatherPlottingResponses()

bool MooseServer::gatherPlottingResponses ( wasp::DataArray &  plotting_responses,
int  line,
int  character 
)
private

Build CustomPlot extension responses when method name is plotting.

Parameters
plotting_responses- array for CustomPlot responses to fill
line- zero-based line to use for logic of custom extension
character- zero-based column for logic of custom extension
Returns
- true if request successfully handled with response built

Definition at line 1846 of file MooseServer.C.

Referenced by gatherExtensionResponses().

1847 {
1848  // return without adding any plot response objects if parser root is null
1849  auto root_ptr = queryRoot();
1850  if (!root_ptr)
1851  return true;
1852  auto & root = *root_ptr;
1853 
1854  // find hit node for zero based request line and column number from input
1855  wasp::HITNodeView view_root = root.getNodeView();
1856  wasp::HITNodeView request_context =
1857  wasp::findNodeUnderLineColumn(view_root, line + 1, character + 1);
1858 
1859  // get object context and value of type parameter for request if provided
1860  wasp::HITNodeView object_context = request_context;
1861  while (object_context.type() != wasp::OBJECT && object_context.has_parent())
1862  object_context = object_context.parent();
1863  const std::string & object_name = object_context.name();
1864  wasp::HITNodeView type_node = object_context.first_child_by_name("type");
1865  const std::string & object_type =
1866  type_node.is_null() ? "" : wasp::strip_quotes(hit::extractValue(type_node.data()));
1867 
1868  // get check app of document and return with no plots if its build failed
1869  auto app_ptr = queryCheckApp();
1870  if (!app_ptr)
1871  return true;
1872 
1873  // get problem from action warehouse and return without any plots if null
1874  std::shared_ptr<FEProblemBase> & problem = app_ptr->actionWarehouse().problemBase();
1875  if (!problem)
1876  return true;
1877 
1878  // check problem to build function plot if request is from function block
1879  if (problem->hasFunction(object_name))
1880  buildFuncPlotResponse(plotting_responses, *problem, object_name, object_type);
1881 
1882  // check problem to build PDF and CDF plots if request is in distribution
1883  else if (problem->hasDistribution(object_name))
1884  buildDistPlotResponses(plotting_responses, *problem, object_name, object_type);
1885 
1886  return true;
1887 }
const MooseApp * queryCheckApp() const
Definition: MooseServer.C:2074
void buildDistPlotResponses(wasp::DataArray &plotting_responses, FEProblemBase &problem, const std::string &object_name, const std::string &object_type)
Compute PDF and CDF, build CustomPlot objects, and add to responses.
Definition: MooseServer.C:1922
void buildFuncPlotResponse(wasp::DataArray &plotting_responses, FEProblemBase &problem, const std::string &object_name, const std::string &object_type)
Gather function data, build CustomPlot object, and add to responses.
Definition: MooseServer.C:1890
const hit::Node * queryRoot() const
Definition: MooseServer.C:2032

◆ getActionParameters()

void MooseServer::getActionParameters ( InputParameters valid_params,
const std::string &  object_path,
std::set< std::string > &  obj_act_tasks 
)
private

Get all action parameters using requested object path to collection.

Parameters
valid_params- collection for filling action input parameters
object_path- full node path where autocomplete was requested
obj_act_tasks- set for adding in all MooseObjectAction tasks

Definition at line 551 of file MooseServer.C.

Referenced by getAllValidParameters().

554 {
555  Syntax & syntax = _moose_app.syntax();
556  ActionFactory & action_factory = _moose_app.getActionFactory();
557 
558  // get registered syntax path identifier using actual object context path
559  bool is_parent;
560  std::string registered_syntax = syntax.isAssociated(object_path, &is_parent);
561 
562  // use is_parent to skip action parameters when not explicitly registered
563  if (!is_parent)
564  {
565  // get action objects associated with registered syntax path identifier
566  auto action_range = syntax.getActions(registered_syntax);
567 
568  // traverse action objects for syntax to gather valid action parameters
569  for (auto action_iter = action_range.first; action_iter != action_range.second; action_iter++)
570  {
571  const std::string & action_name = action_iter->second._action;
572 
573  // use action name to get set of valid parameters from action factory
574  InputParameters action_params = action_factory.getValidParams(action_name);
575 
576  // gather all MooseObjectAction tasks for verifying object parameters
577  if (action_params.have_parameter<bool>("isObjectAction"))
578  {
579  if (action_params.get<bool>("isObjectAction"))
580  {
581  std::set<std::string> tasks_by_actions = action_factory.getTasksByAction(action_name);
582  obj_act_tasks.insert(tasks_by_actions.begin(), tasks_by_actions.end());
583  }
584 
585  // filter parameter from completion list as it is not used in input
586  action_params.remove("isObjectAction");
587  }
588 
589  // add parameters from action to full valid collection being gathered
590  valid_params += action_params;
591  }
592  }
593 }
std::pair< std::multimap< std::string, ActionInfo >::const_iterator, std::multimap< std::string, ActionInfo >::const_iterator > getActions(const std::string &syntax) const
Returns a pair of multimap iterators to all the ActionInfo objects associated with a given piece of s...
Definition: Syntax.C:328
InputParameters getValidParams(const std::string &name)
Definition: ActionFactory.C:94
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
std::set< std::string > getTasksByAction(const std::string &action) const
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
Syntax & syntax()
Returns a writable reference to the syntax object.
Definition: MooseApp.h:230
ActionFactory & getActionFactory()
Retrieve a writable reference to the ActionFactory associated with this App.
Definition: MooseApp.h:411
void remove(std::string_view)
Specialized factory for generic Action System objects.
Definition: ActionFactory.h:48
std::string isAssociated(const std::string &real_id, bool *is_parent, const std::map< std::string, std::set< std::string >> &alt_map={}) const
Method for determining whether a piece of syntax is associated with an Action an optional syntax map ...
Definition: Syntax.C:251
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
Holding syntax for parsing input files.
Definition: Syntax.h:21

◆ getAllValidParameters()

void MooseServer::getAllValidParameters ( InputParameters valid_params,
const std::string &  object_path,
const std::string &  object_type,
std::set< std::string > &  obj_act_tasks 
)
private

Get all global parameters, action parameters, and object parameters.

Parameters
valid_params- collection to fill with valid input parameters
object_path- full node path where autocomplete was requested
object_type- type of object where autocomplete was requested
obj_act_tasks- set for adding in all MooseObjectAction tasks

Definition at line 539 of file MooseServer.C.

Referenced by gatherDocumentCompletionItems(), gatherDocumentDefinitionLocations(), getFileNameTypeValues(), getHoverDisplayText(), getNodesByValueAndTypes(), and getRequiredParamsText().

543 {
544  // gather global parameters then action parameters then object parameters
545  valid_params += Moose::Builder::validParams();
546  getActionParameters(valid_params, object_path, obj_act_tasks);
547  getObjectParameters(valid_params, object_type, obj_act_tasks);
548 }
static InputParameters validParams()
Parameters that are processed directly by the Parser and are valid anywhere in the input...
Definition: Builder.C:121
void getObjectParameters(InputParameters &valid_params, std::string object_type, const std::set< std::string > &obj_act_tasks)
Get all object parameters using requested object path to collection.
Definition: MooseServer.C:596
void getActionParameters(InputParameters &valid_params, const std::string &object_path, std::set< std::string > &obj_act_tasks)
Get all action parameters using requested object path to collection.
Definition: MooseServer.C:551

◆ getCheckApp()

MooseApp & MooseServer::getCheckApp ( )

Public interface for writable check app reference with error checks.

Returns
- writable reference to check app for current input document

Definition at line 2088 of file MooseServer.C.

Referenced by parseDocumentForDiagnostics().

2089 {
2090  if (auto app_ptr = queryCheckApp())
2091  {
2092  auto & app = *app_ptr;
2093  mooseAssert(queryCheckParser(), "Should have a parser");
2094  mooseAssert(&app.parser() == queryCheckParser(), "Parser should be the app's parser");
2095  return app;
2096  }
2097  mooseError("MooseServer::getCheckApp(): App not available");
2098 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
const Parser * queryCheckParser() const
Definition: MooseServer.C:2061
const MooseApp * queryCheckApp() const
Definition: MooseServer.C:2074

◆ getCompletionItemKind()

int MooseServer::getCompletionItemKind ( const InputParameters valid_params,
const std::string &  param_name,
const std::string &  clean_type,
bool  is_param 
)
private

Get completion item kind value that client may use for icon in list.

Parameters
valid_params- valid parameters used for completion item kind
param_name- name of input parameter for completion item kind
clean_type- type to decide if reference completion item kind
is_param- boolean denoting if kind is for parameter or value
Returns
- enumerated kind value that client may use for icon in list

Definition at line 1734 of file MooseServer.C.

Referenced by addParametersToList(), and addValuesToList().

1738 {
1739  // set up completion item kind value that client may use for icon in list
1740  auto associated_types = _moose_app.syntax().getAssociatedTypes();
1741  if (is_param && valid_params.isParamRequired(param_name) &&
1742  !valid_params.isParamValid(param_name))
1743  return wasp::lsp::m_comp_kind_event;
1744  else if (param_name == "active" || param_name == "inactive")
1745  return wasp::lsp::m_comp_kind_class;
1746  else if (clean_type == "bool")
1747  return wasp::lsp::m_comp_kind_interface;
1748  else if (valid_params.have_parameter<MooseEnum>(param_name) ||
1749  valid_params.have_parameter<MultiMooseEnum>(param_name) ||
1750  valid_params.have_parameter<ExecFlagEnum>(param_name) ||
1751  valid_params.have_parameter<std::vector<MooseEnum>>(param_name))
1752  return is_param ? wasp::lsp::m_comp_kind_enum : wasp::lsp::m_comp_kind_enum_member;
1753  else if (param_name == "type")
1754  return wasp::lsp::m_comp_kind_type_param;
1755  else if (std::find_if(associated_types.begin(),
1756  associated_types.end(),
1757  [&](const auto & entry)
1758  { return entry.second == clean_type; }) != associated_types.end())
1759  return wasp::lsp::m_comp_kind_reference;
1760  else
1761  return is_param ? wasp::lsp::m_comp_kind_keyword : wasp::lsp::m_comp_kind_value;
1762 }
const std::multimap< std::string, std::string > & getAssociatedTypes() const
Get a multimap of registered associations of syntax with type.
Definition: Syntax.C:368
A MultiMooseEnum object to hold "execute_on" flags.
Definition: ExecFlagEnum.h:21
Syntax & syntax()
Returns a writable reference to the syntax object.
Definition: MooseApp.h:230
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:54
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
bool isParamRequired(const std::string &name) const
Returns a boolean indicating whether the specified parameter is required or not.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another, i.e.

◆ getConnection()

std::shared_ptr<wasp::lsp::Connection> MooseServer::getConnection ( )
inline

Get read / write connection - specific to this server implemention.

Returns
- shared pointer to the server's read / write connection

Definition at line 40 of file MooseServer.h.

40 { return _connection; }
std::shared_ptr< wasp::lsp::IOStreamConnection > _connection
_connection - shared pointer to this server&#39;s read / write iostream
Definition: MooseServer.h:492

◆ getDocumentSymbolKind()

int MooseServer::getDocumentSymbolKind ( wasp::HITNodeView  symbol_node)
private

Get document symbol kind value that client may use for outline icon.

Parameters
symbol_node- node that will be added to symbol tree for kind
Returns
- enumerated kind value that client may use for outline icon

Definition at line 1765 of file MooseServer.C.

Referenced by gatherDocumentSymbols(), and traverseParseTreeAndFillSymbols().

1766 {
1767  // lambdas that check if parameter is a boolean or number for symbol kind
1768  auto is_boolean = [](wasp::HITNodeView symbol_node)
1769  {
1770  bool convert;
1771  std::istringstream iss(MooseUtils::toLower(symbol_node.last_as_string()));
1772  return (iss >> std::boolalpha >> convert && !iss.fail());
1773  };
1774  auto is_number = [](wasp::HITNodeView symbol_node)
1775  {
1776  double convert;
1777  std::istringstream iss(symbol_node.last_as_string());
1778  return (iss >> convert && iss.eof());
1779  };
1780 
1781  // set up document symbol kind value that client may use for outline icon
1782  if (symbol_node.type() == wasp::OBJECT)
1783  return wasp::lsp::m_symbol_kind_struct;
1784  else if (symbol_node.type() == wasp::FILE)
1785  return wasp::lsp::m_symbol_kind_file;
1786  else if (symbol_node.type() == wasp::ARRAY)
1787  return wasp::lsp::m_symbol_kind_array;
1788  else if (symbol_node.type() == wasp::KEYED_VALUE && symbol_node.name() == std::string("type"))
1789  return wasp::lsp::m_symbol_kind_type_param;
1790  else if (symbol_node.type() == wasp::KEYED_VALUE && is_boolean(symbol_node))
1791  return wasp::lsp::m_symbol_kind_boolean;
1792  else if (symbol_node.type() == wasp::KEYED_VALUE && is_number(symbol_node))
1793  return wasp::lsp::m_symbol_kind_number;
1794  else if (symbol_node.type() == wasp::KEYED_VALUE)
1795  return wasp::lsp::m_symbol_kind_key;
1796  else if (symbol_node.type() == wasp::VALUE)
1797  return wasp::lsp::m_symbol_kind_string;
1798  else
1799  return wasp::lsp::m_symbol_kind_property;
1800 }
bool convert(const std::string &str, T &value, const bool throw_on_failure)
Takes the string representation of a value and converts it to the value.
std::string toLower(std::string name)
Convert supplied string to lower case.

◆ getEnumsAndDocs()

template<typename MooseEnumType >
void MooseServer::getEnumsAndDocs ( MooseEnumType &  moose_enum_param,
std::map< std::string, std::string > &  options_and_descs 
)
private

Fill map of all options and descriptions if parameter is moose enum.

Parameters
moose_enum_param- parameter to get documentation and options
options_and_descs- map to fill with options and descriptions

Definition at line 1027 of file MooseServer.C.

Referenced by addValuesToList(), and getHoverDisplayText().

1029 {
1030  // get map that contains any documentation strings provided for each item
1031  const auto & enum_docs = moose_enum_param.getItemDocumentation();
1032 
1033  // walk over enums filling map with options and any provided descriptions
1034  for (const auto & item : moose_enum_param.items())
1035  options_and_descs[item.name()] = enum_docs.count(item) ? enum_docs.at(item) : "";
1036 }

◆ getExistingInput()

void MooseServer::getExistingInput ( wasp::HITNodeView  parent_node,
std::set< std::string > &  existing_params,
std::set< std::string > &  existing_subblocks 
)
private

Get names of parameters and subblocks specified in given input node.

Parameters
parent_node- object node context under which to gather input
existing_params- set to fill with parameter names from input
existing_subblocks- set to fill with subblock names in input

Definition at line 521 of file MooseServer.C.

Referenced by gatherDocumentCompletionItems().

524 {
525  // gather names of all parameters and subblocks provided in input context
526  for (auto itr = parent_node.begin(); itr != parent_node.end(); itr.next())
527  {
528  auto child_node = itr.get();
529 
530  // add key value or array type as parameter and object type as subblock
531  if (child_node.type() == wasp::KEYED_VALUE || child_node.type() == wasp::ARRAY)
532  existing_params.insert(child_node.name());
533  else if (child_node.type() == wasp::OBJECT)
534  existing_subblocks.insert(child_node.name());
535  }
536 }

◆ getFileNameTypeValues()

void MooseServer::getFileNameTypeValues ( std::set< std::string > &  filename_vals,
wasp::HITNodeView  parent 
)
private

Recursively walk input to gather all FileName type parameter values.

Parameters
filename_vals- set to fill up with FileName parameter values
parent- nodeview for recursive tree traversal starting point

Definition at line 306 of file MooseServer.C.

Referenced by addResourcesForDocument().

307 {
308  // cache set of FileName types for parameters that contain resource files
309  static const std::set<std::string> filename_types = {
310  "FileName", "FileNameNoExtension", "MeshFileName", "MatrixFileName"};
311 
312  // walk over children in tree and skip any nodes that are not object type
313  for (const auto & child : parent)
314  {
315  if (child.type() == wasp::OBJECT)
316  {
317  // get object context path and object type value of node if it exists
318  wasp::HITNodeView object_node = child;
319  const std::string object_path = object_node.path();
320  wasp::HITNodeView type_node = object_node.first_child_by_name("type");
321  const std::string object_type =
322  type_node.is_null() ? "" : wasp::strip_quotes(hit::extractValue(type_node.data()));
323 
324  // gather global, action, and object parameters for context of object
325  InputParameters valid_params = emptyInputParameters();
326  std::set<std::string> obj_act_tasks;
327  getAllValidParameters(valid_params, object_path, object_type, obj_act_tasks);
328 
329  // walk over children and skip any nodes that are not parameter types
330  for (const auto & child : object_node)
331  {
332  if (child.type() == wasp::KEYED_VALUE || child.type() == wasp::ARRAY)
333  {
334  // get name of node to use for finding in set of valid parameters
335  wasp::HITNodeView param_node = child;
336  std::string param_name = param_node.name();
337 
338  // add parameter values to collection if valid with FileName type
339  if (valid_params.getParametersList().count(param_name))
340  {
341  // get parameter type and prepare to check if in FileName types
342  std::string dirty_type = valid_params.type(param_name);
343  std::string clean_type = MooseUtils::prettyCppType(dirty_type);
344  pcrecpp::RE(".+<([A-Za-z0-9_' ':]*)>.*").GlobalReplace("\\1", &clean_type);
345 
346  // add parameter values to set if type is one of FileName types
347  if (filename_types.count(clean_type))
348  for (const auto & child : param_node)
349  if (child.type() == wasp::VALUE)
350  filename_vals.insert(child.to_string());
351  }
352  }
353  }
354 
355  // recurse deeper into input and continue search since node is object
356  getFileNameTypeValues(filename_vals, object_node);
357  }
358  }
359 }
std::set< std::string > getParametersList() const
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()
void getAllValidParameters(InputParameters &valid_params, const std::string &object_path, const std::string &object_type, std::set< std::string > &obj_act_tasks)
Get all global parameters, action parameters, and object parameters.
Definition: MooseServer.C:539
void getFileNameTypeValues(std::set< std::string > &filename_vals, wasp::HITNodeView parent)
Recursively walk input to gather all FileName type parameter values.
Definition: MooseServer.C:306
std::string type(const std::string &name) const
Prints the type of the requested parameter by name.
std::string prettyCppType(const std::string &cpp_type)
Definition: MooseUtils.C:1140

◆ getHoverDisplayText()

bool MooseServer::getHoverDisplayText ( std::string &  display_text,
int  line,
int  character 
)
private

Get hover display text - logic specific to this server implemention.

Parameters
display_text- string reference to add hover text for display
line- zero-based line to use for finding node and hover text
character- zero-based column for finding node and hover text
Returns
- true if display text was added or left empty without error

Definition at line 1288 of file MooseServer.C.

1289 {
1290  Factory & factory = _moose_app.getFactory();
1291  Syntax & syntax = _moose_app.syntax();
1292 
1293  // return and leave display text as empty string when parser root is null
1294  auto root_ptr = queryRoot();
1295  if (!root_ptr)
1296  return true;
1297  auto & root = *root_ptr;
1298 
1299  // find hit node for zero based request line and column number from input
1300  wasp::HITNodeView view_root = root.getNodeView();
1301  wasp::HITNodeView request_context =
1302  wasp::findNodeUnderLineColumn(view_root, line + 1, character + 1);
1303 
1304  // return and leave display text as empty string when not on key or value
1305  if ((request_context.type() != wasp::DECL && request_context.type() != wasp::VALUE) ||
1306  !request_context.has_parent() ||
1307  (request_context.parent().type() != wasp::KEYED_VALUE &&
1308  request_context.parent().type() != wasp::ARRAY))
1309  return true;
1310 
1311  // get name of parameter node and value string that is specified in input
1312  std::string paramkey = request_context.parent().name();
1313  std::string paramval = request_context.last_as_string();
1314 
1315  // get object context path and object type value for request if it exists
1316  wasp::HITNodeView object_context = request_context;
1317  while (object_context.type() != wasp::OBJECT && object_context.has_parent())
1318  object_context = object_context.parent();
1319  const std::string object_path = object_context.path();
1320  wasp::HITNodeView type_node = object_context.first_child_by_name("type");
1321  const std::string object_type =
1322  type_node.is_null() ? "" : wasp::strip_quotes(hit::extractValue(type_node.data()));
1323 
1324  // gather global, action, and object parameters in request object context
1325  InputParameters valid_params = emptyInputParameters();
1326  std::set<std::string> obj_act_tasks;
1327  getAllValidParameters(valid_params, object_path, object_type, obj_act_tasks);
1328 
1329  // use class description as display text when request is valid type value
1330  if (request_context.type() == wasp::VALUE && paramkey == "type" && factory.isRegistered(paramval))
1331  {
1332  const InputParameters & object_params = factory.getValidParams(paramval);
1333  if (object_params.hasBase())
1334  {
1335  const std::string & moose_base = object_params.getBase();
1336  for (const auto & obj_act_task : obj_act_tasks)
1337  {
1338  if (syntax.verifyMooseObjectTask(moose_base, obj_act_task))
1339  {
1340  display_text = object_params.getClassDescription();
1341  MooseUtils::escape(display_text);
1342  break;
1343  }
1344  }
1345  }
1346  }
1347 
1348  // use item documentation as display text when request is enum type value
1349  else if (request_context.type() == wasp::VALUE)
1350  {
1351  std::map<std::string, std::string> options_and_descs;
1352  if (valid_params.have_parameter<MooseEnum>(paramkey))
1353  getEnumsAndDocs(valid_params.get<MooseEnum>(paramkey), options_and_descs);
1354  else if (valid_params.have_parameter<MultiMooseEnum>(paramkey))
1355  getEnumsAndDocs(valid_params.get<MultiMooseEnum>(paramkey), options_and_descs);
1356  else if (valid_params.have_parameter<ExecFlagEnum>(paramkey))
1357  getEnumsAndDocs(valid_params.get<ExecFlagEnum>(paramkey), options_and_descs);
1358  else if (valid_params.have_parameter<std::vector<MooseEnum>>(paramkey))
1359  getEnumsAndDocs(valid_params.get<std::vector<MooseEnum>>(paramkey)[0], options_and_descs);
1360  if (options_and_descs.count(paramval))
1361  {
1362  display_text = options_and_descs.find(paramval)->second;
1363  MooseUtils::escape(display_text);
1364  }
1365  }
1366 
1367  // use parameter documentation as display text when request is valid name
1368  else if (request_context.type() == wasp::DECL && valid_params.getParametersList().count(paramkey))
1369  {
1370  display_text = valid_params.getDocString(paramkey);
1371  MooseUtils::escape(display_text);
1372 
1373  // add units information to hover text if it is specified for parameter
1374  std::string doc_units = valid_params.getDocUnit(paramkey);
1375  if (!doc_units.empty())
1376  display_text += "\n\nUnits: " + doc_units;
1377 
1378  // add range information to hover text if it is specified for parameter
1379  if (valid_params.isRangeChecked(paramkey))
1380  {
1381  std::string doc_range = valid_params.rangeCheckedFunction(paramkey);
1382  if (!doc_range.empty())
1383  display_text += "\n\nRange: " + doc_range;
1384  }
1385  }
1386 
1387  return true;
1388 }
bool isRangeChecked(const std::string &param_name) const
Return whether a parameter has a range check.
A MultiMooseEnum object to hold "execute_on" flags.
Definition: ExecFlagEnum.h:21
bool isRegistered(const std::string &obj_name) const
Returns a Boolean indicating whether an object type has been registered.
Definition: Factory.h:152
std::set< std::string > getParametersList() const
Generic factory class for build all sorts of objects.
Definition: Factory.h:28
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
InputParameters getValidParams(const std::string &name) const
Get valid parameters for the object.
Definition: Factory.C:68
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
bool hasBase() const
Syntax & syntax()
Returns a writable reference to the syntax object.
Definition: MooseApp.h:230
const std::string & getBase() const
InputParameters emptyInputParameters()
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition: MooseApp.h:406
std::string getDocString(const std::string &name) const
Returns the documentation string for the specified parameter name.
std::string getDocUnit(const std::string &name) const
Returns the documentation unit string for the specified parameter name.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:54
void getAllValidParameters(InputParameters &valid_params, const std::string &object_path, const std::string &object_type, std::set< std::string > &obj_act_tasks)
Get all global parameters, action parameters, and object parameters.
Definition: MooseServer.C:539
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
Holding syntax for parsing input files.
Definition: Syntax.h:21
bool verifyMooseObjectTask(const std::string &base, const std::string &task) const
Returns a Boolean indicating whether a task is associated with on of the MOOSE pluggable systems (BAS...
Definition: Syntax.C:334
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
std::string getClassDescription() const
Returns the class description.
void getEnumsAndDocs(MooseEnumType &moose_enum_param, std::map< std::string, std::string > &options_and_descs)
Fill map of all options and descriptions if parameter is moose enum.
Definition: MooseServer.C:1027
std::string rangeCheckedFunction(const std::string &name) const
Return the range check function for any parameter (empty string if it is not range checked) ...
const hit::Node * queryRoot() const
Definition: MooseServer.C:2032
void escape(std::string &str)
Definition: MooseUtils.C:207

◆ getInputLookupDefinitionNodes()

void MooseServer::getInputLookupDefinitionNodes ( SortedLocationNodes location_nodes,
const std::string &  clean_type,
const std::string &  val_string 
)
private

Get set of nodes from associated path lookups matching value string.

Parameters
location_nodes- set to fill with lookup nodes matching value
clean_type- cpp type string used for key finding input paths
val_string- specified value used for gathering input lookups

Definition at line 1215 of file MooseServer.C.

Referenced by gatherDocumentDefinitionLocations().

1218 {
1219  Syntax & syntax = _moose_app.syntax();
1220 
1221  // build map from parameter types to input lookup paths and save to reuse
1222  if (_type_to_input_paths.empty())
1223  {
1224  for (const auto & associated_types_iter : syntax.getAssociatedTypes())
1225  {
1226  const std::string & type = associated_types_iter.second;
1227  const std::string & path = associated_types_iter.first;
1228  _type_to_input_paths[type].insert(path);
1229  }
1230  }
1231 
1232  // find set of input lookup paths that are associated with parameter type
1233  const auto & input_path_iter = _type_to_input_paths.find(clean_type);
1234 
1235  // return without any definition locations added when no paths associated
1236  if (input_path_iter == _type_to_input_paths.end())
1237  return;
1238 
1239  // get root node from input to use in input lookups with associated paths
1240  wasp::HITNodeView view_root = getRoot().getNodeView();
1241 
1242  // walk over all syntax paths that are associated with parameter type
1243  for (const auto & input_path : input_path_iter->second)
1244  {
1245  // use wasp siren to gather all nodes from current lookup path in input
1246  wasp::SIRENInterpreter<> selector;
1247  if (!selector.parseString(input_path))
1248  continue;
1249  wasp::SIRENResultSet<wasp::HITNodeView> results;
1250  std::size_t count = selector.evaluate(view_root, results);
1251 
1252  // walk over results and add nodes that have name matching value to set
1253  for (std::size_t i = 0; i < count; i++)
1254  if (results.adapted(i).type() == wasp::OBJECT && results.adapted(i).name() == val_string &&
1255  results.adapted(i).child_count_by_name("decl"))
1256  location_nodes.insert(results.adapted(i).first_child_by_name("decl"));
1257  }
1258 }
const std::multimap< std::string, std::string > & getAssociatedTypes() const
Get a multimap of registered associations of syntax with type.
Definition: Syntax.C:368
std::map< std::string, std::set< std::string > > _type_to_input_paths
_type_to_input_paths - map of parameter types to lookup paths
Definition: MooseServer.h:502
const hit::Node & getRoot() const
Definition: MooseServer.C:2101
Syntax & syntax()
Returns a writable reference to the syntax object.
Definition: MooseApp.h:230
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
Holding syntax for parsing input files.
Definition: Syntax.h:21

◆ getNodesByValueAndTypes()

void MooseServer::getNodesByValueAndTypes ( SortedLocationNodes match_nodes,
wasp::HITNodeView  view_parent,
const std::string &  target_value,
const std::set< std::string > &  target_types 
)
private

Recursively walk input to gather all nodes matching value and types.

Parameters
match_nodes- set to fill with nodes matching value and types
view_parent- nodeview used to start recursive tree traversal
target_value-
target_types-

Definition at line 1465 of file MooseServer.C.

Referenced by gatherDocumentReferencesLocations().

1469 {
1470  // walk over children of context to gather nodes matching value and types
1471  for (const auto & view_child : view_parent)
1472  {
1473  // check for parameter type match if node is value matching target data
1474  if (view_child.type() == wasp::VALUE && view_child.to_string() == target_value)
1475  {
1476  // get object context path and object type value of node if it exists
1477  wasp::HITNodeView object_context = view_child;
1478  while (object_context.type() != wasp::OBJECT && object_context.has_parent())
1479  object_context = object_context.parent();
1480  const std::string object_path = object_context.path();
1481  wasp::HITNodeView type_node = object_context.first_child_by_name("type");
1482  const std::string object_type =
1483  type_node.is_null() ? "" : wasp::strip_quotes(hit::extractValue(type_node.data()));
1484 
1485  // gather global, action, and object parameters for context of object
1486  InputParameters valid_params = emptyInputParameters();
1487  std::set<std::string> obj_act_tasks;
1488  getAllValidParameters(valid_params, object_path, object_type, obj_act_tasks);
1489 
1490  // get name from parent of current value node which is parameter node
1491  std::string param_name = view_child.has_parent() ? view_child.parent().name() : "";
1492 
1493  // get type of parameter and prepare string to check target set match
1494  std::string dirty_type = valid_params.type(param_name);
1495  std::string clean_type = MooseUtils::prettyCppType(dirty_type);
1496  pcrecpp::RE(".+<([A-Za-z0-9_' ':]*)>.*").GlobalReplace("\\1", &clean_type);
1497 
1498  // add input node to collection if its type is also in set of targets
1499  if (target_types.count(clean_type))
1500  match_nodes.insert(view_child);
1501  }
1502 
1503  // recurse deeper into input to search for matches if node has children
1504  if (!view_child.is_leaf())
1505  getNodesByValueAndTypes(match_nodes, view_child, target_value, target_types);
1506  }
1507 }
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()
void getNodesByValueAndTypes(SortedLocationNodes &match_nodes, wasp::HITNodeView view_parent, const std::string &target_value, const std::set< std::string > &target_types)
Recursively walk input to gather all nodes matching value and types.
Definition: MooseServer.C:1465
void getAllValidParameters(InputParameters &valid_params, const std::string &object_path, const std::string &object_type, std::set< std::string > &obj_act_tasks)
Get all global parameters, action parameters, and object parameters.
Definition: MooseServer.C:539
std::string type(const std::string &name) const
Prints the type of the requested parameter by name.
std::string prettyCppType(const std::string &cpp_type)
Definition: MooseUtils.C:1140

◆ getObjectParameters()

void MooseServer::getObjectParameters ( InputParameters valid_params,
std::string  object_type,
const std::set< std::string > &  obj_act_tasks 
)
private

Get all object parameters using requested object path to collection.

Parameters
valid_params- collection for filling object input parameters
object_type- type of object where autocomplete was requested
obj_act_tasks- tasks to verify object type with valid syntax

Definition at line 596 of file MooseServer.C.

Referenced by getAllValidParameters().

599 {
600  Syntax & syntax = _moose_app.syntax();
601  Factory & factory = _moose_app.getFactory();
602 
603  // use type parameter default if it exists and is not provided from input
604  if (object_type.empty() && valid_params.have_parameter<std::string>("type") &&
605  !valid_params.get<std::string>("type").empty())
606  {
607  object_type = valid_params.get<std::string>("type");
608 
609  // make type parameter not required in input since it has default value
610  valid_params.makeParamNotRequired("type");
611  }
612 
613  // check if object type has been registered to prevent unregistered error
614  if (factory.isRegistered(object_type))
615  {
616  // use object type to get set of valid parameters registered in factory
617  InputParameters object_params = factory.getValidParams(object_type);
618 
619  // check if object has base associated with any MooseObjectAction tasks
620  if (object_params.hasBase())
621  {
622  const std::string & moose_base = object_params.getBase();
623 
624  for (const auto & obj_act_task : obj_act_tasks)
625  {
626  if (syntax.verifyMooseObjectTask(moose_base, obj_act_task))
627  {
628  // add parameters from object to valid collection if base matches
629  valid_params += object_params;
630  break;
631  }
632  }
633  }
634  }
635 
636  // make parameters from list of those set by action not required in input
637  if (valid_params.have_parameter<std::vector<std::string>>("_object_params_set_by_action"))
638  {
639  auto names = valid_params.get<std::vector<std::string>>("_object_params_set_by_action");
640  for (const auto & name : names)
641  valid_params.makeParamNotRequired(name);
642 
643  // filter parameter from completion list since it is not used for input
644  valid_params.remove("_object_params_set_by_action");
645  }
646 }
bool isRegistered(const std::string &obj_name) const
Returns a Boolean indicating whether an object type has been registered.
Definition: Factory.h:152
Generic factory class for build all sorts of objects.
Definition: Factory.h:28
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
InputParameters getValidParams(const std::string &name) const
Get valid parameters for the object.
Definition: Factory.C:68
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
bool hasBase() const
Syntax & syntax()
Returns a writable reference to the syntax object.
Definition: MooseApp.h:230
const std::string & getBase() const
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition: MooseApp.h:406
void remove(std::string_view)
void makeParamNotRequired(const std::string &name)
Changes the parameter to not be required.
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
Holding syntax for parsing input files.
Definition: Syntax.h:21
bool verifyMooseObjectTask(const std::string &base, const std::string &task) const
Returns a Boolean indicating whether a task is associated with on of the MOOSE pluggable systems (BAS...
Definition: Syntax.C:334

◆ getRequiredParamsText()

std::string MooseServer::getRequiredParamsText ( const std::string &  subblock_path,
const std::string &  subblock_type,
const std::set< std::string > &  existing_params,
const std::string &  indent_spaces 
)
private

Get required parameter completion text list for given subblock path.

Parameters
subblock_path- subblock path for finding required parameters
subblock_type- subblock type for finding required parameters
existing_params- set of parameters already existing in input
indent_spaces- indentation to be added before each parameter
Returns
- list of required parameters to use in subblock insert text

Definition at line 1803 of file MooseServer.C.

Referenced by addSubblocksToList(), and addValuesToList().

1807 {
1808  // gather global, action, and object parameters in request object context
1809  InputParameters valid_params = emptyInputParameters();
1810  std::set<std::string> obj_act_tasks;
1811  getAllValidParameters(valid_params, subblock_path, subblock_type, obj_act_tasks);
1812 
1813  // walk over collection of all parameters and build text of ones required
1814  std::string required_param_text;
1815  std::size_t param_index = 1;
1816  for (const auto & valid_params_iter : valid_params)
1817  {
1818  // skip parameter if deprecated, private, defaulted, optional, existing
1819  const std::string & param_name = valid_params_iter.first;
1820  if (!valid_params.isParamDeprecated(param_name) && !valid_params.isPrivate(param_name) &&
1821  !valid_params.isParamValid(param_name) && valid_params.isParamRequired(param_name) &&
1822  !existing_params.count(param_name))
1823  {
1824  std::string tab_stop = client_snippet_support ? "$" + std::to_string(param_index++) : "";
1825  required_param_text += "\n" + indent_spaces + param_name + " = " + tab_stop;
1826  }
1827  }
1828 
1829  return required_param_text;
1830 }
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()
void getAllValidParameters(InputParameters &valid_params, const std::string &object_path, const std::string &object_type, std::set< std::string > &obj_act_tasks)
Get all global parameters, action parameters, and object parameters.
Definition: MooseServer.C:539

◆ getRoot()

const hit::Node & MooseServer::getRoot ( ) const
private
Returns
The root node from the check parser for the current document path, with error checking on if it exists

Definition at line 2101 of file MooseServer.C.

Referenced by addValuesToList(), and getInputLookupDefinitionNodes().

2102 {
2103  if (auto root_ptr = queryRoot())
2104  return *root_ptr;
2105  mooseError("MooseServer::getRoot(): Root not available");
2106 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
const hit::Node * queryRoot() const
Definition: MooseServer.C:2032

◆ parseDocumentForDiagnostics()

bool MooseServer::parseDocumentForDiagnostics ( wasp::DataArray &  diagnosticsList)
private

Parse document for diagnostics - specific to this server implemention.

Parameters
diagnosticsList- data array of diagnostics data objects to fill
Returns
- true if completed successfully - does not indicate parse fail

Definition at line 71 of file MooseServer.C.

72 {
73  // Reset old parsers and applications if we have them
74  if (const auto it = _check_state.find(document_path); it != _check_state.end())
75  _check_state.erase(it);
76 
77  // strip prefix from document uri if it exists to get parse file path
78  std::string parse_file_path = document_path;
79  pcrecpp::RE("(.*://)(.*)").Replace("\\2", &parse_file_path);
80 
81  bool pass = true;
82 
83  // Adds a single diagnostic
84  const auto diagnostic = [this, &diagnosticsList, &pass](const std::string & message,
85  const int start_line,
86  const int start_column,
87  const std::optional<int> end_line = {},
88  const std::optional<int> end_column = {})
89  {
90  diagnosticsList.push_back(wasp::DataObject());
91  auto & diagnostic = *diagnosticsList.back().to_object();
92  pass &= wasp::lsp::buildDiagnosticObject(diagnostic,
93  errors,
94  start_line,
95  start_column,
96  end_line ? *end_line : start_line,
97  end_column ? *end_column : start_column,
98  1,
99  "moose_srv",
100  "check_inp",
101  message);
102  };
103 
104  // Adds a diagnostic on line zero
105  const auto zero_line_diagnostic = [&diagnostic](const std::string & message)
106  { diagnostic(message, 0, 0); };
107 
108  // Adds a diagnostic from a hit node, if the context of the hit node is valid
109  const auto hit_node_diagnostic = [&zero_line_diagnostic, &diagnostic, &parse_file_path](
110  const hit::Node * const node, const std::string & message)
111  {
112  // No node, root node, wrong file, or no line information: line zero diagnostic
113  if (!node || node->isRoot() || node->filename() != parse_file_path || !node->line() ||
114  !node->column())
115  zero_line_diagnostic(message);
116  // Have file and line context, diagnostic there
117  else
118  diagnostic(message, node->line() - 1, node->column() - 1);
119  };
120 
121  // Adds a diagnostic from a hit::ErrorMessage if the context is valid
122  const auto hit_error_message_diagnostic =
123  [&diagnostic, &zero_line_diagnostic, &parse_file_path](const hit::ErrorMessage & err)
124  {
125  // Has a filename
126  if (err.filename)
127  {
128  // For the open file
129  if (*err.filename == parse_file_path)
130  {
131  // Has line information that is valid
132  if (err.lineinfo && err.lineinfo->start_line && err.lineinfo->start_column &&
133  err.lineinfo->end_line && err.lineinfo->end_column)
134  {
135  diagnostic(err.message,
136  err.lineinfo->start_line - 1,
137  err.lineinfo->start_column - 1,
138  err.lineinfo->end_line - 1,
139  err.lineinfo->end_column - 1);
140  return;
141  }
142  }
143  // Has a file but not for this file, no diagnostic
144  else
145  return;
146  }
147 
148  // Don't have a filename, or have a filename that is this file without line info
149  zero_line_diagnostic(err.prefixed_message);
150  };
151 
152  // Runs a try catch loop with the given action, collecting diagnostics
153  // from the known exceptions; returns a bool that is true if we executed
154  // without throwing anything
155  const auto try_catch = [&hit_error_message_diagnostic,
156  &hit_node_diagnostic,
157  &zero_line_diagnostic](const auto & action) -> bool
158  {
159  Moose::ScopedThrowOnError scoped_throw_on_error;
160 
161  try
162  {
163  action();
164  }
165  // Will be thrown from the Parser while building the tree or
166  // by the builder while building the input parameters
167  catch (Parser::Error & err)
168  {
169  for (const auto & error_message : err.error_messages)
170  hit_error_message_diagnostic(error_message);
171  }
172  // Will be thrown by mooseError() when _throw_on_error is set
173  // to true, hopefully with hit node context
174  catch (MooseRuntimeError & err)
175  {
176  hit_node_diagnostic(err.getNode(), err.what());
177  }
178  // General catch all for everything else without context
179  catch (std::exception & err)
180  {
181  zero_line_diagnostic(err.what());
182  }
183 
184  // continue to build app if parsing fails and run app if building fails
185  // so that problem is there for plotting and warehouse based completion
186  return true;
187  };
188 
189  // Setup command line (needed by the Parser)
190  auto command_line = std::make_unique<CommandLine>(_moose_app.commandLine()->getArguments());
191  if (command_line->hasArgument("--language-server"))
192  command_line->removeArgument("--language-server");
193  command_line->addArgument("--check-input");
194  command_line->addArgument("--error-unused");
195  command_line->addArgument("--error");
196  command_line->addArgument("--color=off");
197  command_line->addArgument("--disable-perf-graph-live");
198  command_line->parse();
199 
200  // Setup the parser that will be used in the app
201  auto parser = std::make_shared<Parser>(parse_file_path, document_text);
202  mooseAssert(parser->getInputFileNames()[0] == parse_file_path, "Should be consistent");
203  parser->setCommandLineParams(command_line->buildHitParams());
204  parser->setThrowOnError(true);
205 
206  // Try to parse the document
207  const bool parse_success = try_catch([&parser]() { parser->parse(); });
208  // If the Parser has a valid root, store it because we can use it
209  // in the future (hover text etc with a partially complete document)
210  CheckState * state = nullptr;
211  if (auto parser_root_ptr = parser->queryRoot();
212  parser_root_ptr && !parser_root_ptr->getNodeView().is_null())
213  {
214  auto it_inserted_pair = _check_state.emplace(document_path, parser);
215  mooseAssert(it_inserted_pair.second, "Should not already exist");
216  state = &it_inserted_pair.first->second;
217  }
218  // We have no root or an empty document, nothing else to do
219  else
220  return true;
221 
222  // Failed to parse, don't bother building the app. But... we might
223  // have a root node at least!
224  if (!parse_success)
225  return pass;
226 
227  // Setup application options (including the Parser that succeeded)
228  InputParameters app_params = _moose_app.parameters();
229  app_params.set<std::shared_ptr<Parser>>("_parser") = parser;
230  app_params.set<std::shared_ptr<CommandLine>>("_command_line") = std::move(command_line);
231 
232  // Try to instantiate the application
233  std::unique_ptr<MooseApp> app = nullptr;
234  const auto do_build_app = [this, &app_params, &app]()
235  {
238  app_params,
239  _moose_app.getCommunicator()->get());
240  };
241  if (!try_catch(do_build_app))
242  {
243  if (app)
244  app.reset();
245  return pass;
246  }
247 
248  // Store the app
249  state->app = std::move(app);
250 
251  // Run the application, which will run the Builder
252  const auto do_run_app = [this]() { getCheckApp().run(); };
253  if (!try_catch(do_run_app))
254  state->app.reset(); // destroy if we failed to build
255 
256  // add all resource files of document that will be registered with client
258 
259  return pass;
260 }
OStreamProxy err
void addResourcesForDocument()
Add paths from includes and FileName parameters for client to watch.
Definition: MooseServer.C:263
std::shared_ptr< CommandLine > commandLine() const
Get the command line.
Definition: MooseApp.h:423
static const std::string main_app_name
The name for the "main" moose application.
Definition: AppFactory.h:68
MooseApp & getCheckApp()
Public interface for writable check app reference with error checks.
Definition: MooseServer.C:2088
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:131
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
virtual void run()
Run the application.
Definition: MooseApp.C:1827
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
static std::unique_ptr< MooseApp > create(const std::string &app_type, const std::vector< std::string > &cli_args={})
Create an app with no input and command line arguments.
Definition: AppFactory.C:64
const std::string & type() const
Get the type of this class.
Definition: MooseBase.h:93
static AppFactory & instance()
Get the instance of the AppFactory.
Definition: AppFactory.C:20
MooseApp & _moose_app
_moose_app - reference to parent application that owns this server
Definition: MooseServer.h:482
Scoped helper for setting Moose::_throw_on_error during this scope.
Definition: Moose.h:295
Exception to be thrown whenever we have _throw_on_error set and a mooseError() is emitted...
Definition: MooseError.h:117
const std::shared_ptr< libMesh::Parallel::Communicator > getCommunicator() const
Definition: MooseApp.h:1032
std::map< std::string, CheckState > _check_state
_check_state - map from document paths to state (parser, app, text)
Definition: MooseServer.h:487

◆ queryCheckApp() [1/2]

const MooseApp * MooseServer::queryCheckApp ( ) const
private
Returns
The check app for the current document path, if any

Definition at line 2074 of file MooseServer.C.

Referenced by addObjectsFromWarehouses(), gatherPlottingResponses(), getCheckApp(), and queryRoot().

2075 {
2076  if (auto state = queryCheckState())
2077  return state->app.get();
2078  return nullptr;
2079 }
const CheckState * queryCheckState() const
Definition: MooseServer.C:2048

◆ queryCheckApp() [2/2]

MooseApp * MooseServer::queryCheckApp ( )
private

Definition at line 2082 of file MooseServer.C.

2083 {
2084  return const_cast<MooseApp *>(std::as_const(*this).queryCheckApp());
2085 }
Base class for MOOSE-based applications.
Definition: MooseApp.h:108

◆ queryCheckParser() [1/2]

const Parser * MooseServer::queryCheckParser ( ) const
private
Returns
The check parser for the current document path, if any

Definition at line 2061 of file MooseServer.C.

Referenced by getCheckApp(), and queryRoot().

2062 {
2063  const auto state = queryCheckState();
2064  return state ? state->parser.get() : nullptr;
2065 }
const CheckState * queryCheckState() const
Definition: MooseServer.C:2048

◆ queryCheckParser() [2/2]

Parser * MooseServer::queryCheckParser ( )
private

Definition at line 2068 of file MooseServer.C.

2069 {
2070  return const_cast<Parser *>(std::as_const(*this).queryCheckParser());
2071 }
Class for parsing input files.
Definition: Parser.h:87

◆ queryCheckState() [1/2]

const MooseServer::CheckState * MooseServer::queryCheckState ( ) const
private
Returns
The check state for the current document path, if any

Definition at line 2048 of file MooseServer.C.

Referenced by queryCheckApp(), and queryCheckParser().

2049 {
2050  const auto it = _check_state.find(document_path);
2051  return it == _check_state.end() ? nullptr : &it->second;
2052 }
std::map< std::string, CheckState > _check_state
_check_state - map from document paths to state (parser, app, text)
Definition: MooseServer.h:487

◆ queryCheckState() [2/2]

MooseServer::CheckState * MooseServer::queryCheckState ( )
private

Definition at line 2055 of file MooseServer.C.

2056 {
2057  return const_cast<MooseServer::CheckState *>(std::as_const(*this).queryCheckState());
2058 }
Helper for storing the state for a single document.
Definition: MooseServer.h:440

◆ queryRoot()

const hit::Node * MooseServer::queryRoot ( ) const
private
Returns
The root node from the check parser for the current document path, if any

Definition at line 2032 of file MooseServer.C.

Referenced by addResourcesForDocument(), gatherDocumentCompletionItems(), gatherDocumentDefinitionLocations(), gatherDocumentReferencesLocations(), gatherDocumentSymbols(), gatherPlottingResponses(), getHoverDisplayText(), and getRoot().

2033 {
2034  if (const auto parser_ptr = queryCheckParser())
2035  {
2036 #ifndef NDEBUG
2037  if (const auto app_ptr = queryCheckApp())
2038  mooseAssert(&app_ptr->parser() == parser_ptr, "App should have this parser");
2039 #endif
2040  if (const auto root_ptr = parser_ptr->queryRoot())
2041  if (!root_ptr->getNodeView().is_null())
2042  return root_ptr;
2043  }
2044  return nullptr;
2045 }
const Parser * queryCheckParser() const
Definition: MooseServer.C:2061
const MooseApp * queryCheckApp() const
Definition: MooseServer.C:2074

◆ rootIsValid()

bool MooseServer::rootIsValid ( ) const
private
Returns
Whether or not the root is valid

Will be true if the app is valid, the root is not nullptr, and the root node view is not null

◆ setDistPlotNumPoints()

void MooseServer::setDistPlotNumPoints ( std::size_t  num_points)
inline

Override number of discrete points in continuous distribution plots.

Used by plotting unit test to lower sampling resolution for testing.

Parameters
num_points- number of discrete points for distribution plots

Definition at line 53 of file MooseServer.h.

53 { _dist_plot_num_points = num_points; }
std::size_t _dist_plot_num_points
_dist_plot_num_points - distribution plot sampling resolution
Definition: MooseServer.h:517

◆ traverseParseTreeAndFillSymbols()

bool MooseServer::traverseParseTreeAndFillSymbols ( wasp::HITNodeView  view_parent,
wasp::DataObject &  data_parent 
)
private

Recursively fill document symbols from the given node.

Parameters
view_parent- nodeview used in recursive tree traversal
data_parent- data object with array of symbol children
Returns
- true if no problems with this level of the resursion

Definition at line 1682 of file MooseServer.C.

Referenced by gatherDocumentSymbols().

1684 {
1685  // return without adding any children if parent node is file include type
1686  if (wasp::is_nested_file(view_parent))
1687  return true;
1688 
1689  bool pass = true;
1690 
1691  // walk over all children of this node context and build document symbols
1692  for (const auto i : make_range(view_parent.child_count()))
1693  {
1694  // walk must be index based to catch file include and skip its children
1695  wasp::HITNodeView view_child = view_parent.child_at(i);
1696 
1697  // set up name, zero based line and column range, kind, and detail info
1698  std::string name = view_child.name();
1699  int line = view_child.line() - 1;
1700  int column = view_child.column() - 1;
1701  int last_line = view_child.last_line() - 1;
1702  int last_column = view_child.last_column();
1703  int symbol_kind = getDocumentSymbolKind(view_child);
1704  std::string detail =
1705  !view_child.first_child_by_name("type").is_null()
1706  ? wasp::strip_quotes(hit::extractValue(view_child.first_child_by_name("type").data()))
1707  : "";
1708 
1709  // build document symbol object from node child info and push to array
1710  wasp::DataObject & data_child = wasp::lsp::addDocumentSymbolChild(data_parent);
1711  pass &= wasp::lsp::buildDocumentSymbolObject(data_child,
1712  errors,
1713  (name.empty() ? "void" : name),
1714  detail,
1715  symbol_kind,
1716  false,
1717  line,
1718  column,
1719  last_line,
1720  last_column,
1721  line,
1722  column,
1723  last_line,
1724  last_column);
1725 
1726  // call method to recursively fill document symbols for each node child
1727  pass &= traverseParseTreeAndFillSymbols(view_child, data_child);
1728  }
1729 
1730  return pass;
1731 }
std::string name(const ElemQuality q)
int getDocumentSymbolKind(wasp::HITNodeView symbol_node)
Get document symbol kind value that client may use for outline icon.
Definition: MooseServer.C:1765
bool traverseParseTreeAndFillSymbols(wasp::HITNodeView view_parent, wasp::DataObject &data_parent)
Recursively fill document symbols from the given node.
Definition: MooseServer.C:1682
IntRange< T > make_range(T beg, T end)

Member Data Documentation

◆ _check_state

std::map<std::string, CheckState> MooseServer::_check_state
private

_check_state - map from document paths to state (parser, app, text)

Definition at line 487 of file MooseServer.h.

Referenced by parseDocumentForDiagnostics(), and queryCheckState().

◆ _connection

std::shared_ptr<wasp::lsp::IOStreamConnection> MooseServer::_connection
private

_connection - shared pointer to this server's read / write iostream

Definition at line 492 of file MooseServer.h.

Referenced by connectionRead(), connectionWrite(), and getConnection().

◆ _dist_plot_num_points

std::size_t MooseServer::_dist_plot_num_points
private

_dist_plot_num_points - distribution plot sampling resolution

Definition at line 517 of file MooseServer.h.

Referenced by buildDistPlotResponses(), and setDistPlotNumPoints().

◆ _dist_plot_quantile_bound

double MooseServer::_dist_plot_quantile_bound
private

_dist_plot_quantile_bound - epsilon to bound plot range tails

Definition at line 522 of file MooseServer.h.

Referenced by buildDistPlotResponses().

◆ _formatting_tab_size

std::size_t MooseServer::_formatting_tab_size
private

_formatting_tab_size - number of indent spaces for formatting

Definition at line 512 of file MooseServer.h.

Referenced by formatDocument(), and gatherDocumentFormattingTextEdits().

◆ _input_path_to_types

std::map<std::string, std::set<std::string> > MooseServer::_input_path_to_types
private

_type_to_input_paths - map of lookup paths to parameter types

Definition at line 507 of file MooseServer.h.

Referenced by gatherDocumentReferencesLocations().

◆ _moose_app

MooseApp& MooseServer::_moose_app
private

◆ _syntax_to_subblocks

std::map<std::string, std::set<std::string> > MooseServer::_syntax_to_subblocks
private

_syntax_to_subblocks - map of syntax paths to valid subblocks

Definition at line 497 of file MooseServer.h.

Referenced by addSubblocksToList().

◆ _type_to_input_paths

std::map<std::string, std::set<std::string> > MooseServer::_type_to_input_paths
private

_type_to_input_paths - map of parameter types to lookup paths

Definition at line 502 of file MooseServer.h.

Referenced by addValuesToList(), and getInputLookupDefinitionNodes().


The documentation for this class was generated from the following files: