GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
WholeProjectRefactorer.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-2016 Florian Rival ([email protected]). All rights
4  * reserved. This project is released under the MIT License.
5  */
6 #pragma once
7 
8 #include <set>
9 #include <unordered_set>
10 #include <unordered_map>
11 #include <vector>
12 #include "GDCore/String.h"
13 namespace gd {
14 class Platform;
15 class Project;
16 class Layout;
17 class Layer;
18 class Object;
19 class String;
20 class EventsFunctionsExtension;
21 class EventsFunction;
22 class ObjectsContainer;
23 class VariablesContainer;
24 class EventsBasedBehavior;
25 class EventsBasedObject;
26 class ArbitraryEventsWorker;
27 class ArbitraryObjectsWorker;
28 class ArbitraryEventsFunctionsWorker;
29 class ArbitraryEventsWorkerWithContext;
30 class ArbitraryEventBasedBehaviorsWorker;
31 class ArbitraryBehaviorSharedDataWorker;
32 class Behavior;
33 class BehaviorMetadata;
34 class UnfilledRequiredBehaviorPropertyProblem;
35 class ProjectBrowser;
36 class SerializerElement;
37 } // namespace gd
38 
39 namespace gd {
40 
42  std::unordered_set<gd::String> removedVariableNames;
43  std::unordered_map<gd::String, gd::String> oldToNewVariableNames;
44 
45  bool HasRemovedVariables() { return !removedVariableNames.empty(); }
46 
47  VariablesChangeset& ClearRemovedVariables() { removedVariableNames.clear(); return *this; }
48 };
49 
58 class GD_CORE_API WholeProjectRefactorer {
59  public:
60 
64  static VariablesChangeset ComputeChangesetForVariablesContainer(
65  gd::Project &project,
66  const gd::SerializerElement &oldSerializedVariablesContainer,
67  const gd::VariablesContainer &newVariablesContainer);
68 
73  static void ApplyRefactoringForVariablesContainer(
74  gd::Project &project,
75  const gd::VariablesContainer &newVariablesContainer,
76  const gd::VariablesChangeset& changeset);
77 
86  static void RenameEventsFunctionsExtension(
87  gd::Project& project,
88  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
89  const gd::String& oldName,
90  const gd::String& newName);
91 
96  static void UpdateExtensionNameInEventsBasedBehavior(
97  gd::Project& project,
98  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
99  gd::EventsBasedBehavior& eventsBasedBehavior,
100  const gd::String& sourceExtensionName);
101 
109  static void RenameEventsFunction(
110  gd::Project& project,
111  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
112  const gd::String& oldFunctionName,
113  const gd::String& newFunctionName);
114 
123  static void RenameBehaviorEventsFunction(
124  gd::Project& project,
125  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
126  const gd::EventsBasedBehavior& eventsBasedBehavior,
127  const gd::String& oldFunctionName,
128  const gd::String& newFunctionName);
129 
138  static void RenameObjectEventsFunction(
139  gd::Project& project,
140  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
141  const gd::EventsBasedObject& eventsBasedObject,
142  const gd::String& oldFunctionName,
143  const gd::String& newFunctionName);
144 
153  static void MoveEventsFunctionParameter(
154  gd::Project& project,
155  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
156  const gd::String& functionName,
157  std::size_t oldIndex,
158  std::size_t newIndex);
159 
168  static void MoveBehaviorEventsFunctionParameter(
169  gd::Project& project,
170  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
171  const gd::EventsBasedBehavior& eventsBasedBehavior,
172  const gd::String& functionName,
173  std::size_t oldIndex,
174  std::size_t newIndex);
175 
184  static void MoveObjectEventsFunctionParameter(
185  gd::Project& project,
186  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
187  const gd::EventsBasedObject& eventsBasedObject,
188  const gd::String& functionName,
189  std::size_t oldIndex,
190  std::size_t newIndex);
191 
200  static void RenameEventsBasedBehaviorProperty(
201  gd::Project& project,
202  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
203  const gd::EventsBasedBehavior& eventsBasedBehavior,
204  const gd::String& oldPropertyName,
205  const gd::String& newPropertyName);
206 
215  static void RenameEventsBasedBehaviorSharedProperty(
216  gd::Project& project,
217  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
218  const gd::EventsBasedBehavior& eventsBasedBehavior,
219  const gd::String& oldPropertyName,
220  const gd::String& newPropertyName);
221 
230  static void RenameEventsBasedObjectProperty(
231  gd::Project& project,
232  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
233  const gd::EventsBasedObject& eventsBasedObject,
234  const gd::String& oldPropertyName,
235  const gd::String& newPropertyName);
236 
241  static void AddBehaviorAndRequiredBehaviors(gd::Project& project,
242  gd::Object& object,
243  const gd::String& behaviorType,
244  const gd::String& behaviorName);
249  static void AddRequiredBehaviorsFor(gd::Project& project,
250  gd::Object& object,
251  const gd::String& behaviorName);
252 
257  static std::vector<gd::String> FindDependentBehaviorNames(
258  const gd::Project& project,
259  const gd::Object& object,
260  const gd::String& behaviorName);
261 
265  static std::vector<gd::String> GetBehaviorsWithType(const gd::Object& object,
266  const gd::String& type);
267 
272  static std::vector<gd::UnfilledRequiredBehaviorPropertyProblem>
273  FindInvalidRequiredBehaviorProperties(const gd::Project& project);
274 
280  static bool
281  FixInvalidRequiredBehaviorProperties(gd::Project& project);
282 
290  static void RenameEventsBasedBehavior(
291  gd::Project& project,
292  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
293  const gd::String& oldBehaviorName,
294  const gd::String& newBehaviorName);
295 
303  static void RenameEventsBasedObject(
304  gd::Project& project,
305  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
306  const gd::String& oldObjectName,
307  const gd::String& newObjectName);
308 
312  static void RenameLayout(gd::Project &project, const gd::String &oldName,
313  const gd::String &newName);
317  static void RenameExternalLayout(gd::Project &project,
318  const gd::String &oldName,
319  const gd::String &newName);
323  static void RenameExternalEvents(gd::Project &project,
324  const gd::String &oldName,
325  const gd::String &newName);
329  static void RenameLayer(gd::Project &project, gd::Layout &layout,
330  const gd::String &oldName, const gd::String &newName);
331 
335  static void RenameLayerEffect(gd::Project &project, gd::Layout &layout,
336  gd::Layer &layer, const gd::String &oldName,
337  const gd::String &newName);
338 
342  static void RenameObjectAnimation(gd::Project &project, gd::Layout &layout,
343  gd::Object &object,
344  const gd::String &oldName,
345  const gd::String &newName);
346 
350  static void RenameObjectPoint(gd::Project &project, gd::Layout &layout,
351  gd::Object &object, const gd::String &oldName,
352  const gd::String &newName);
353 
357  static void RenameObjectEffect(gd::Project &project, gd::Layout &layout,
358  gd::Object &object, const gd::String &oldName,
359  const gd::String &newName);
360 
367  static void ObjectOrGroupRenamedInLayout(gd::Project& project,
368  gd::Layout& layout,
369  const gd::String& oldName,
370  const gd::String& newName,
371  bool isObjectGroup);
372 
379  static void ObjectOrGroupRemovedInLayout(gd::Project& project,
380  gd::Layout& layout,
381  const gd::String& objectName,
382  bool isObjectGroup,
383  bool removeEventsAndGroups = true);
384 
391  static void ObjectOrGroupRemovedInEventsBasedObject(
392  gd::Project& project,
393  gd::EventsBasedObject& eventsBasedObject,
394  gd::ObjectsContainer& globalObjectsContainer,
395  gd::ObjectsContainer& objectsContainer,
396  const gd::String& objectName,
397  bool isObjectGroup,
398  bool removeEventsAndGroups);
399 
405  static void ObjectOrGroupRenamedInEventsBasedObject(
406  gd::Project& project,
407  gd::ObjectsContainer& globalObjectsContainer,
408  gd::EventsBasedObject& eventsBasedObject,
409  const gd::String& oldName,
410  const gd::String& newName,
411  bool isObjectGroup);
412 
418  static void ObjectOrGroupRenamedInEventsFunction(
419  gd::Project& project,
420  gd::EventsFunction& eventsFunction,
421  gd::ObjectsContainer& globalObjectsContainer,
422  gd::ObjectsContainer& objectsContainer,
423  const gd::String& oldName,
424  const gd::String& newName,
425  bool isObjectGroup);
426 
432  static void ObjectOrGroupRemovedInEventsFunction(
433  gd::Project& project,
434  gd::EventsFunction& eventsFunction,
435  gd::ObjectsContainer& globalObjectsContainer,
436  gd::ObjectsContainer& objectsContainer,
437  const gd::String& objectName,
438  bool isObjectGroup,
439  bool removeEventsAndGroups = true);
440 
447  static void GlobalObjectOrGroupRenamed(gd::Project& project,
448  const gd::String& oldName,
449  const gd::String& newName,
450  bool isObjectGroup);
451 
458  static void GlobalObjectOrGroupRemoved(gd::Project& project,
459  const gd::String& objectName,
460  bool isObjectGroup,
461  bool removeEventsAndGroups = true);
462 
467  static std::set<gd::String> GetAllObjectTypesUsingEventsBasedBehavior(
468  const gd::Project& project,
469  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
470  const gd::EventsBasedBehavior& eventsBasedBehavior);
471 
477  static void EnsureBehaviorEventsFunctionsProperParameters(
478  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
479  const gd::EventsBasedBehavior& eventsBasedBehavior);
480 
485  static void EnsureObjectEventsFunctionsProperParameters(
486  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
487  const gd::EventsBasedObject& eventsBasedObject);
488 
492  static void RemoveLayer(gd::Project &project, gd::Layout &layout,
493  const gd::String &layerName);
494 
498  static void MergeLayers(gd::Project &project, gd::Layout &layout,
499  const gd::String &originLayerName,
500  const gd::String &targetLayerName);
501 
506  static size_t GetLayoutAndExternalLayoutLayerInstancesCount(
507  gd::Project &project, gd::Layout &layout, const gd::String &layerName);
508 
509  virtual ~WholeProjectRefactorer(){};
510 
511  private:
512  static std::vector<gd::String> GetAssociatedExternalLayouts(
513  gd::Project& project, gd::Layout& layout);
514  static std::vector<gd::String>
515  GetAssociatedExternalLayouts(gd::Project &project,
516  const gd::String &layoutName);
517  static std::vector<gd::String>
518  GetAssociatedExternalEvents(gd::Project &project,
519  const gd::String &layoutName);
520 
521  static void DoRenameEventsFunction(gd::Project& project,
522  const gd::EventsFunction& eventsFunction,
523  const gd::String& oldFullType,
524  const gd::String& newFullType,
525  const gd::ProjectBrowser& projectBrowser);
526 
527  static void DoRenameBehavior(gd::Project& project,
528  const gd::String& oldBehaviorType,
529  const gd::String& newBehaviorType,
530  const gd::ProjectBrowser& projectBrowser);
531 
532  static void DoRenameObject(gd::Project& project,
533  const gd::String& oldObjectType,
534  const gd::String& newObjectType,
535  const gd::ProjectBrowser& projectBrowser);
536 
545  static void RenameEventsFunctionsExtension(
546  gd::Project& project,
547  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
548  const gd::String& oldName,
549  const gd::String& newName,
550  const gd::ProjectBrowser& projectBrowser);
551 
552  static void FindDependentBehaviorNames(
553  const gd::Project& project,
554  const gd::Object& object,
555  const gd::String& behaviorName,
556  std::unordered_set<gd::String>& dependentBehaviorNames);
557 
558  static const gd::String behaviorObjectParameterName;
559  static const gd::String parentObjectParameterName;
560 
562 };
563 
564 } // namespace gd
Represents a behavior that is implemented with events.
Definition: EventsBasedBehavior.h:31
Represents an object that is implemented with events.
Definition: EventsBasedObject.h:29
Events that can be generated as a stand-alone function, and used as a condition, action or expression...
Definition: EventsFunction.h:39
Hold a list of Events Functions (gd::EventsFunction) and Events Based Behaviors.
Definition: EventsFunctionsExtension.h:38
Represents a layer of a layout.
Definition: Layer.h:91
Represent a layout ( also called a scene ) of a project.
Definition: Layout.h:39
Represent an object of a platform.
Definition: Object.h:37
Used as a base class for classes that will own objects (see gd::Object).
Definition: ObjectsContainer.h:36
Expose a subset of the project to workers.
Definition: ProjectBrowser.h:29
Base class representing a project (game), including all resources, scenes, objects,...
Definition: Project.h:50
A generic container that can represent a value ( containing a string, double, bool or int),...
Definition: SerializerElement.h:37
String represents an UTF8 encoded string.
Definition: String.h:31
Class defining a container for gd::Variable.
Definition: VariablesContainer.h:30
Tool functions to do refactoring on the whole project after changes like deletion or renaming of an o...
Definition: WholeProjectRefactorer.h:58
Definition: CommonTools.h:24
Definition: WholeProjectRefactorer.h:41