https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Syntax.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "Syntax.h"
11#include "MooseUtils.h"
12
13#include "libmesh/simple_range.h"
14
15#include <algorithm>
16
17Syntax::Syntax() : _actions_to_syntax_valid(false) {}
18
19void
20Syntax::registerTaskName(const std::string & task, bool should_auto_build)
21{
22 if (_registered_tasks.count(task) > 0)
23 return;
24 _tasks.addItem(task);
25 _registered_tasks[task] = should_auto_build;
26}
27
28void
29Syntax::registerTaskName(const std::string & task,
30 const std::string & moose_object_type,
31 bool should_auto_build)
32{
33 auto range = _moose_systems_to_tasks.equal_range(moose_object_type);
34 for (auto it = range.first; it != range.second; ++it)
35 if (it->second == task)
36 return;
37
38 if (_registered_tasks.find(task) != _registered_tasks.end())
39 mooseError("A ", task, " is already registered. Do you need to use appendTaskName instead?");
40
41 registerTaskName(task, should_auto_build);
42 _moose_systems_to_tasks.insert(std::make_pair(moose_object_type, task));
43}
44
45void
46Syntax::appendTaskName(const std::string & task,
47 const std::string & moose_object_type,
48 bool deprecated)
49{
50 if (_registered_tasks.find(task) == _registered_tasks.end())
51 mooseError("A ", task, " is not a registered task name.");
52
53 if (!deprecated)
54 _moose_systems_to_tasks.insert(std::make_pair(moose_object_type, task));
55 else
56 _deprecated_list_moose_systems_to_tasks.insert(std::make_pair(moose_object_type, task));
57}
58
59void
60Syntax::addDependency(const std::string & task, const std::string & pre_req)
61{
62 if (_registered_tasks.find(task) == _registered_tasks.end())
63 mooseError("A ", task, " is not a registered task name.");
64
65 _tasks.insertDependency(task, pre_req);
66}
67
68void
69Syntax::addDependencySets(const std::string & action_sets)
70{
71 std::vector<std::string> sets, prev_names, tasks;
72 MooseUtils::tokenize(action_sets, sets, 1, "()");
73
74 for (unsigned int i = 0; i < sets.size(); ++i)
75 {
76 tasks.clear();
77 MooseUtils::tokenize(sets[i], tasks, 0, ", ");
78 for (unsigned int j = 0; j < tasks.size(); ++j)
79 {
80 // Each line should depend on each item in the previous line
81 for (unsigned int k = 0; k < prev_names.size(); ++k)
82 addDependency(tasks[j], prev_names[k]);
83 }
84 // Copy the the current items to the previous items for the next iteration
85 std::swap(tasks, prev_names);
86 }
87}
88
89void
90Syntax::deleteTaskDependencies(const std::string & task)
91{
92 if (_registered_tasks.find(task) == _registered_tasks.end())
93 mooseError("A ", task, " is not a registered task name.");
94
96}
97
98void
103
104const std::vector<std::string> &
106{
107 try
108 {
109 return _tasks.getSortedValues();
110 }
112 {
113 const auto & cycle = e.getCyclicDependencies();
114 mooseError("Cyclic dependencies detected: ", MooseUtils::join(cycle, " <- "));
115 }
116}
117
118const std::vector<std::vector<std::string>> &
123
124bool
125Syntax::hasTask(const std::string & task) const
126{
127 return (_registered_tasks.find(task) != _registered_tasks.end());
128}
129
130bool
131Syntax::isActionRequired(const std::string & task) const
132{
133 mooseDeprecated("Syntax::isActionRequired is deprecated, use shouldAutoBuild() instead");
134 return shouldAutoBuild(task);
135}
136
137bool
138Syntax::shouldAutoBuild(const std::string & task) const
139{
140 auto map_pair = _registered_tasks.find(task);
141 mooseAssert(map_pair != _registered_tasks.end(), std::string("Unregistered task: ") + task);
142
143 return map_pair->second;
144}
145
146void
147Syntax::registerActionSyntax(const std::string & action,
148 const std::string & syntax,
149 const std::string & task,
150 const std::string & file,
151 int line)
152{
153 auto range = _syntax_to_actions.equal_range(syntax);
154 for (auto it = range.first; it != range.second; ++it)
155 if (it->second._action == action && it->second._task == task)
156 return;
157
158 _syntax_to_actions.insert(std::make_pair(syntax, ActionInfo{action, task}));
159 _syntax_to_line.addInfo(syntax, action, task, file, line);
161}
162
163void
164Syntax::replaceActionSyntax(const std::string & action,
165 const std::string & syntax,
166 const std::string & task,
167 const std::string & file,
168 int line)
169{
170 _syntax_to_actions.erase(syntax);
171 registerActionSyntax(action, syntax, task, file, line);
172}
173
174void
175Syntax::removeAllActionsForSyntax(const std::string & syntax)
176{
177 _syntax_to_actions.erase(syntax);
178}
179
180void
181Syntax::deprecateActionSyntax(const std::string & syntax)
182{
183 const std::string message = "\"[" + syntax + "]\" is deprecated.";
184 deprecateActionSyntax(syntax, message);
185}
186
187void
188Syntax::deprecateActionSyntax(const std::string & syntax, const std::string & message)
189{
190 _deprecated_syntax.insert(std::make_pair(syntax, message));
191}
192
193std::string
195{
196 auto it = _deprecated_syntax.find(syntax);
197
198 if (it != _deprecated_syntax.end())
199 return it->second;
200 else
201 mooseError("The action syntax ", syntax, " is not deprecated");
202}
203
204bool
205Syntax::isDeprecatedSyntax(const std::string & syntax) const
206{
207 return _deprecated_syntax.find(syntax) != _deprecated_syntax.end();
208}
209
210std::vector<std::string>
211Syntax::getSyntaxByAction(const std::string & action, const std::string & task)
212{
213 // See if the reverse multimap has been built yet, if not build it now
215 {
216 std::transform(_syntax_to_actions.begin(),
217 _syntax_to_actions.end(),
218 std::inserter(_actions_to_syntax, _actions_to_syntax.begin()),
219 [](const std::pair<std::string, ActionInfo> pair)
220 {
221 return std::make_pair(pair.second._action,
222 std::make_pair(pair.first, pair.second._task));
223 });
225 }
226
227 std::vector<std::string> syntax;
228 auto it_pair = _actions_to_syntax.equal_range(action);
229 for (const auto & syntax_pair : as_range(it_pair))
230 // If task is blank, return all syntax, otherwise filter by task
231 if (task == "" || syntax_pair.second.second == task)
232 syntax.emplace_back(syntax_pair.second.first);
233
234 return syntax;
235}
236
237std::vector<std::string>
238Syntax::getNonDeprecatedSyntaxByAction(const std::string & action, const std::string & task)
239{
240 auto syntaxes = getSyntaxByAction(action, task);
241 for (auto syntax_it = begin(syntaxes); syntax_it != end(syntaxes);)
242 {
243 if (isDeprecatedSyntax(*syntax_it))
244 syntax_it = syntaxes.erase(syntax_it);
245 else
246 ++syntax_it;
247 }
248 return syntaxes;
249}
250
251std::string
252Syntax::isAssociated(const std::string & real_id,
253 bool * is_parent,
254 const std::map<std::string, std::set<std::string>> & alt_map) const
255{
256 // if non-empty alt_map was provided then traverse its syntax instead of _syntax_to_actions
257 std::set<std::string> syntax_to_traverse;
258 if (!alt_map.empty())
259 std::transform(alt_map.begin(),
260 alt_map.end(),
261 std::inserter(syntax_to_traverse, syntax_to_traverse.end()),
262 [](auto pair) { return pair.first; });
263 else
264 std::transform(_syntax_to_actions.begin(),
265 _syntax_to_actions.end(),
266 std::inserter(syntax_to_traverse, syntax_to_traverse.end()),
267 [](auto pair) { return pair.first; });
268
275 bool local_is_parent;
276 if (is_parent == nullptr)
277 is_parent = &local_is_parent; // Just so we don't have to keep checking below when we want to
278 // set the value
279 std::vector<std::string> real_elements, reg_elements;
280 std::string return_value;
281
282 MooseUtils::tokenize(real_id, real_elements);
283
284 *is_parent = false;
285 for (auto it = syntax_to_traverse.rbegin(); it != syntax_to_traverse.rend(); ++it)
286 {
287 std::string reg_id = *it;
288 if (reg_id == real_id)
289 {
290 *is_parent = false;
291 return reg_id;
292 }
293 reg_elements.clear();
294 MooseUtils::tokenize(reg_id, reg_elements);
295 if (real_elements.size() <= reg_elements.size())
296 {
297 bool keep_going = true;
298 for (unsigned int j = 0; keep_going && j < real_elements.size(); ++j)
299 {
300 if (real_elements[j] != reg_elements[j] && reg_elements[j] != std::string("*"))
301 keep_going = false;
302 }
303 if (keep_going)
304 {
305 if (real_elements.size() < reg_elements.size() && !*is_parent)
306 {
307 // We found a parent, the longest parent in fact but we need to keep
308 // looking to make sure that the real thing isn't registered
309 *is_parent = true;
310 return_value = reg_id;
311 }
312 else if (real_elements.size() == reg_elements.size())
313 {
314 *is_parent = false;
315 return reg_id;
316 }
317 }
318 }
319 }
320
321 if (*is_parent)
322 return return_value;
323 else
324 return "";
325}
326
327std::pair<std::multimap<std::string, Syntax::ActionInfo>::const_iterator,
328 std::multimap<std::string, Syntax::ActionInfo>::const_iterator>
329Syntax::getActions(const std::string & syntax) const
330{
331 return _syntax_to_actions.equal_range(syntax);
332}
333
334bool
335Syntax::verifyMooseObjectTask(const std::string & base, const std::string & task) const
336{
337 auto iters = _moose_systems_to_tasks.equal_range(base);
338
339 for (const auto & task_it : as_range(iters))
340 if (task == task_it.second)
341 return true;
342
343 iters = _deprecated_list_moose_systems_to_tasks.equal_range(base);
344 for (const auto & task_it : as_range(iters))
345 if (task == task_it.second)
346 {
347 std::string object_tasks = "";
348 for (const auto & other_task : as_range(_moose_systems_to_tasks.equal_range(base)))
349 object_tasks += (object_tasks == "" ? "" : " ") + other_task.second;
350
352 "Adding objects from system '" + base + "' through task '" + task +
353 "' is deprecated. This object should only be added from task(s): " + object_tasks +
354 ". This is likely caused by adding objects in a block they no longer belong to. For "
355 "example, FunctorMaterials should no longer be added in the [Materials] block.");
356 return true;
357 }
358
359 return false;
360}
361
362void
363Syntax::registerSyntaxType(const std::string & syntax, const std::string & type)
364{
365 _associated_types.insert(std::make_pair(syntax, type));
366}
367
368const std::multimap<std::string, std::string> &
370{
371 return _associated_types;
372}
373
374const std::multimap<std::string, Syntax::ActionInfo> &
379
381Syntax::getLineInfo(const std::string & syntax,
382 const std::string & action,
383 const std::string & task) const
384{
385 return _syntax_to_line.getInfo(syntax, action, task);
386}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
void mooseDeprecated(Args &&... args)
Emit a deprecated code/feature message with the given stringified, concatenated args.
Definition MooseError.h:363
const std::vector< T > & getCyclicDependencies() const
void addItem(const T &value)
Add an independent item to the set.
void clear()
Clear Items from the resolver.
const std::vector< T > & getSortedValues()
This function also returns dependency resolved values but with a simpler single vector interface.
void insertDependency(const T &key, const T &value)
Insert a dependency pair - the first value or the "key" depends on the second value or the "value".
void deleteDependenciesOfKey(const T &key)
Removes dependencies of the given key.
const std::vector< std::vector< T > > & getSortedValuesSets()
Returns a vector of sets that represent dependency resolved values.
void addInfo(const std::string &key0, const std::string &file, int line)
Associate a key with file/line info.
FileLineInfo getInfo(const std::string &key0) const
Get file/line info for a key.
Holds file and line information.
void registerActionSyntax(const std::string &action, const std::string &syntax, const std::string &task="", const std::string &file="", int line=-1)
Registration function for associating Moose Actions with syntax.
Definition Syntax.C:147
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:329
DependencyResolver< std::string > _tasks
The dependency resolver.
Definition Syntax.h:232
const std::multimap< std::string, ActionInfo > & getAssociatedActions() const
Return all Syntax to Action associations.
Definition Syntax.C:375
std::map< std::string, bool > _registered_tasks
The list of registered tasks and a flag indicating whether or not they should be auto-built.
Definition Syntax.h:221
void addDependencySets(const std::string &action_sets)
Adds all dependencies in a single call.
Definition Syntax.C:69
void registerTaskName(const std::string &task, bool should_auto_build=false)
Method to register a new task.
Definition Syntax.C:20
const std::vector< std::vector< std::string > > & getSortedTaskSet()
Get a list of serialized tasks in a correct dependency order.
Definition Syntax.C:119
bool _actions_to_syntax_valid
Boolean indicating whether the _actions_to_syntax map is built and valid and synced.
Definition Syntax.h:245
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:252
void registerSyntaxType(const std::string &syntax, const std::string &type)
Register a type with a block.
Definition Syntax.C:363
std::multimap< std::string, std::string > _moose_systems_to_tasks
The list of Moose system objects to tasks. This map indicates which tasks are allowed to build certai...
Definition Syntax.h:224
std::vector< std::string > getNonDeprecatedSyntaxByAction(const std::string &action, const std::string &task="")
Retrieve the non-deprecated syntax associated with the passed in action type string.
Definition Syntax.C:238
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:335
void addDependency(const std::string &task, const std::string &pre_req)
Definition Syntax.C:60
FileLineInfo getLineInfo(const std::string &syntax, const std::string &action, const std::string &task) const
Gets the file and line where the syntax/action/task combo was registered.
Definition Syntax.C:381
const std::multimap< std::string, std::string > & getAssociatedTypes() const
Get a multimap of registered associations of syntax with type.
Definition Syntax.C:369
std::multimap< std::string, std::pair< std::string, std::string > > _actions_to_syntax
The ActionInfo (Action+task) to syntax associations (built only when needed) Action -> (Syntax,...
Definition Syntax.h:239
void deprecateActionSyntax(const std::string &syntax)
This method deprecates previously registered syntax.
Definition Syntax.C:181
void replaceActionSyntax(const std::string &action, const std::string &syntax, const std::string &task, const std::string &file="", int line=-1)
Registration function that replaces existing Moose Actions with a completely new action Note: This fu...
Definition Syntax.C:164
bool isDeprecatedSyntax(const std::string &syntax) const
Returns a Boolean indicating whether the syntax has been deprecated through a call to deprecateAction...
Definition Syntax.C:205
const std::vector< std::string > & getSortedTask()
Get a list of serialized tasks in a correct dependency order.
Definition Syntax.C:105
std::multimap< std::string, std::string > _deprecated_list_moose_systems_to_tasks
A list of Moose system objects to tasks that are deprecated for these systems.
Definition Syntax.h:229
std::string deprecatedActionSyntaxMessage(const std::string syntax)
Returns the deprecation message for a given syntax that has been deprecated by deprecateActionSyntax.
Definition Syntax.C:194
std::vector< std::string > getSyntaxByAction(const std::string &action, const std::string &task="")
Retrieve the syntax associated with the passed in action type string.
Definition Syntax.C:211
bool shouldAutoBuild(const std::string &task) const
Returns a Boolean indicating whether MOOSE should attempt to automatically create an Action to satisf...
Definition Syntax.C:138
void deleteTaskDependencies(const std::string &task)
Deletes or removes the dependencies that this task depends on.
Definition Syntax.C:90
bool hasTask(const std::string &task) const
Returns a Boolean indicating whether or not a task is registered with the syntax object.
Definition Syntax.C:125
std::map< std::string, std::string > _deprecated_syntax
The list of deprecated syntax items and the associated deprecated message.
Definition Syntax.h:248
std::multimap< std::string, ActionInfo > _syntax_to_actions
The syntax object to ActionInfo (Action+task) associations.
Definition Syntax.h:235
void removeAllActionsForSyntax(const std::string &syntax)
De-registers all actions associated with a given syntax.
Definition Syntax.C:175
void appendTaskName(const std::string &task, const std::string &moose_object_type, bool deprecated)
Method to associate another "allowed" pluggable MOOSE system to an existing registered task.
Definition Syntax.C:46
std::multimap< std::string, std::string > _associated_types
Syntax/Type association.
Definition Syntax.h:242
void clearTaskDependencies()
Clears all tasks from the system object.
Definition Syntax.C:99
Syntax()
Definition Syntax.C:17
bool isActionRequired(const std::string &task) const
Returns a Boolean indicating whether the specified task is required.
Definition Syntax.C:131
FileLineInfoMap _syntax_to_line
Definition Syntax.h:250
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...