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 <memory>
13 #include "GDCore/String.h"
14 #include "GDCore/Project/Variable.h"
15 
16 namespace gd {
17 class Platform;
18 class Project;
19 class Layout;
20 class Layer;
21 class Object;
22 class ObjectGroup;
23 class String;
24 class EventsFunctionsExtension;
25 class EventsFunction;
26 class ObjectsContainer;
27 class VariablesContainer;
28 class EventsBasedBehavior;
29 class EventsBasedObject;
30 class Behavior;
31 class UnfilledRequiredBehaviorPropertyProblem;
32 class ProjectBrowser;
33 class SerializerElement;
34 class ProjectScopedContainers;
35 class InitialInstancesContainer;
36 struct VariablesRenamingChangesetNode;
37 } // namespace gd
38 
39 namespace gd {
40 
42  std::unordered_map<gd::String, gd::String> oldToNewVariableNames;
43  std::unordered_map<gd::String, std::shared_ptr<gd::VariablesRenamingChangesetNode>>
44  modifiedVariables;
45 };
46 
48  std::unordered_set<gd::String> removedVariableNames;
49 
55  std::unordered_set<gd::String> typeChangedVariableNames;
56  std::unordered_set<gd::String> valueChangedVariableNames;
57  std::unordered_set<gd::String> addedVariableNames;
58 
59  bool HasRemovedVariables() { return !removedVariableNames.empty(); }
60 
61  VariablesChangeset& ClearRemovedVariables() { removedVariableNames.clear(); return *this; }
62 };
63 
72 class GD_CORE_API WholeProjectRefactorer {
73  public:
74 
78  static VariablesChangeset ComputeChangesetForVariablesContainer(
79  const gd::SerializerElement &oldSerializedVariablesContainer,
80  const gd::VariablesContainer &newVariablesContainer);
81 
86  static void ApplyRefactoringForVariablesContainer(
87  gd::Project &project, gd::VariablesContainer &variablesContainer,
88  const gd::VariablesChangeset &changeset,
89  const gd::SerializerElement &originalSerializedVariables);
90 
95  static void ApplyRefactoringForObjectVariablesContainer(
96  gd::Project &project, gd::VariablesContainer &objectVariablesContainer,
97  gd::InitialInstancesContainer &initialInstancesContainer,
98  const gd::String &objectName, const gd::VariablesChangeset &changeset,
99  const gd::SerializerElement &originalSerializedVariables);
100 
105  static void ApplyRefactoringForGroupVariablesContainer(
106  gd::Project &project, gd::ObjectsContainer &globalObjectsContainer,
107  gd::ObjectsContainer &objectsContainer,
108  gd::InitialInstancesContainer &initialInstancesContainer,
109  const gd::VariablesContainer &groupVariablesContainer,
110  const gd::ObjectGroup &objectGroup,
111  const gd::VariablesChangeset &changeset,
112  const gd::SerializerElement &originalSerializedVariables);
113 
122  static void RenameEventsFunctionsExtension(
123  gd::Project& project,
124  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
125  const gd::String& oldName,
126  const gd::String& newName);
127 
132  static void UpdateExtensionNameInExtension(
133  gd::Project &project,
134  gd::EventsFunctionsExtension &eventsFunctionsExtension,
135  const gd::String &sourceExtensionName);
136 
141  static void UpdateExtensionNameInEventsBasedBehavior(
142  gd::Project &project,
143  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
144  gd::EventsBasedBehavior &eventsBasedBehavior,
145  const gd::String &sourceExtensionName);
146 
151  static void UpdateExtensionNameInEventsBasedObject(
152  gd::Project &project,
153  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
154  gd::EventsBasedObject &eventsBasedObject,
155  const gd::String &sourceExtensionName);
156 
164  static void RenameEventsFunction(
165  gd::Project& project,
166  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
167  const gd::String& oldFunctionName,
168  const gd::String& newFunctionName);
169 
177  static void MoveEventsFunction(
178  gd::Project &project,
179  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
180  const gd::String &oldExtensionName, const gd::String &newExtensionName,
181  const gd::String &oldFunctionName, const gd::String &newFunctionName);
182 
191  static void RenameBehaviorEventsFunction(
192  gd::Project& project,
193  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
194  const gd::EventsBasedBehavior& eventsBasedBehavior,
195  const gd::String& oldFunctionName,
196  const gd::String& newFunctionName);
197 
206  static void RenameObjectEventsFunction(
207  gd::Project& project,
208  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
209  const gd::EventsBasedObject& eventsBasedObject,
210  const gd::String& oldFunctionName,
211  const gd::String& newFunctionName);
212 
220  static void
221  RenameParameter(gd::Project &project,
222  gd::ProjectScopedContainers &projectScopedContainers,
223  gd::EventsFunction &eventsFunction,
224  const gd::ObjectsContainer &parameterObjectsContainer,
225  const gd::String &oldParameterName,
226  const gd::String &newParameterName);
227 
231  static void
232  ChangeParameterType(gd::Project &project,
233  gd::ProjectScopedContainers &projectScopedContainers,
234  gd::EventsFunction &eventsFunction,
235  const gd::ObjectsContainer &parameterObjectsContainer,
236  const gd::String &parameterName);
237 
246  static void MoveEventsFunctionParameter(
247  gd::Project& project,
248  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
249  const gd::String& functionName,
250  std::size_t oldIndex,
251  std::size_t newIndex);
252 
261  static void MoveBehaviorEventsFunctionParameter(
262  gd::Project& project,
263  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
264  const gd::EventsBasedBehavior& eventsBasedBehavior,
265  const gd::String& functionName,
266  std::size_t oldIndex,
267  std::size_t newIndex);
268 
277  static void MoveObjectEventsFunctionParameter(
278  gd::Project& project,
279  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
280  const gd::EventsBasedObject& eventsBasedObject,
281  const gd::String& functionName,
282  std::size_t oldIndex,
283  std::size_t newIndex);
284 
293  static void RenameEventsBasedBehaviorProperty(
294  gd::Project& project,
295  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
296  const gd::EventsBasedBehavior& eventsBasedBehavior,
297  const gd::String& oldPropertyName,
298  const gd::String& newPropertyName);
299 
308  static void RenameEventsBasedBehaviorSharedProperty(
309  gd::Project& project,
310  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
311  const gd::EventsBasedBehavior& eventsBasedBehavior,
312  const gd::String& oldPropertyName,
313  const gd::String& newPropertyName);
314 
323  static void RenameEventsBasedObjectProperty(
324  gd::Project& project,
325  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
326  const gd::EventsBasedObject& eventsBasedObject,
327  const gd::String& oldPropertyName,
328  const gd::String& newPropertyName);
329 
334  static void ChangeEventsBasedBehaviorPropertyType(
335  gd::Project &project,
336  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
337  const gd::EventsBasedBehavior &eventsBasedBehavior,
338  const gd::String &propertyName);
339 
344  static void ChangeEventsBasedObjectPropertyType(
345  gd::Project &project,
346  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
347  const gd::EventsBasedObject &eventsBasedObject,
348  const gd::String &propertyName);
349 
354  static void AddBehaviorAndRequiredBehaviors(gd::Project& project,
355  gd::Object& object,
356  const gd::String& behaviorType,
357  const gd::String& behaviorName);
362  static void AddRequiredBehaviorsFor(gd::Project& project,
363  gd::Object& object,
364  const gd::String& behaviorName);
365 
370  static std::vector<gd::String> FindDependentBehaviorNames(
371  const gd::Project& project,
372  const gd::Object& object,
373  const gd::String& behaviorName);
374 
378  static std::vector<gd::String> GetBehaviorsWithType(const gd::Object& object,
379  const gd::String& type);
380 
385  static std::vector<gd::UnfilledRequiredBehaviorPropertyProblem>
386  FindInvalidRequiredBehaviorProperties(const gd::Project& project);
387 
393  static bool
394  FixInvalidRequiredBehaviorProperties(gd::Project& project);
395 
403  static void RenameEventsBasedBehavior(
404  gd::Project& project,
405  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
406  const gd::String& oldBehaviorName,
407  const gd::String& newBehaviorName);
408 
416  static void MoveEventsBasedBehavior(
417  gd::Project &project,
418  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
419  const gd::String &oldExtensionName, const gd::String &newExtensionName,
420  const gd::String &oldBehaviorName, const gd::String &newBehaviorName);
421 
426  static void UpdateBehaviorNameInEventsBasedBehavior(
427  gd::Project &project,
428  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
429  gd::EventsBasedBehavior &eventsBasedBehavior,
430  const gd::String &sourceBehaviorName);
431 
439  static void RenameEventsBasedObject(
440  gd::Project &project,
441  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
442  const gd::String &oldObjectName, const gd::String &newObjectName);
443 
451  static void MoveEventsBasedObject(
452  gd::Project &project,
453  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
454  const gd::String &oldExtensionName, const gd::String &newExtensionName,
455  const gd::String &oldObjectName, const gd::String &newObjectName);
456 
461  static void UpdateObjectNameInEventsBasedObject(
462  gd::Project &project,
463  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
464  gd::EventsBasedObject &eventsBasedObject,
465  const gd::String &sourceObjectName);
466 
470  static void RenameLayout(gd::Project &project, const gd::String &oldName,
471  const gd::String &newName);
475  static void RenameExternalLayout(gd::Project &project,
476  const gd::String &oldName,
477  const gd::String &newName);
481  static void RenameExternalEvents(gd::Project &project,
482  const gd::String &oldName,
483  const gd::String &newName);
484 
488  static void RenameLayerInScene(gd::Project &project, gd::Layout &scene,
489  const gd::String &oldName,
490  const gd::String &newName);
491 
495  static void RenameLayerInEventsBasedObject(
496  gd::Project &project,
497  gd::EventsFunctionsExtension &eventsFunctionsExtension,
498  gd::EventsBasedObject &eventsBasedObject, const gd::String &oldName,
499  const gd::String &newName);
500 
504  static void RenameLayerEffectInScene(gd::Project &project, gd::Layout &scene,
505  gd::Layer &layer,
506  const gd::String &oldName,
507  const gd::String &newName);
508 
512  static void RenameLayerEffectInEventsBasedObject(
513  gd::Project &project,
514  gd::EventsFunctionsExtension &eventsFunctionsExtension,
515  gd::EventsBasedObject &eventsBasedObject, gd::Layer &layer,
516  const gd::String &oldName, const gd::String &newName);
517 
521  static void RenameObjectAnimationInScene(gd::Project &project,
522  gd::Layout &scene,
523  gd::Object &object,
524  const gd::String &oldName,
525  const gd::String &newName);
526 
530  static void RenameObjectAnimationInEventsBasedObject(
531  gd::Project &project,
532  gd::EventsFunctionsExtension &eventsFunctionsExtension,
533  gd::EventsBasedObject &eventsBasedObject, gd::Object &object,
534  const gd::String &oldName, const gd::String &newName);
535 
539  static void RenameObjectPointInScene(gd::Project &project, gd::Layout &scene,
540  gd::Object &object,
541  const gd::String &oldName,
542  const gd::String &newName);
543 
547  static void RenameObjectPointInEventsBasedObject(
548  gd::Project &project,
549  gd::EventsFunctionsExtension &eventsFunctionsExtension,
550  gd::EventsBasedObject &eventsBasedObject, gd::Object &object,
551  const gd::String &oldName, const gd::String &newName);
552 
556  static void RenameObjectEffectInScene(gd::Project &project, gd::Layout &scene,
557  gd::Object &object,
558  const gd::String &oldName,
559  const gd::String &newName);
560 
564  static void RenameObjectEffectInEventsBasedObject(
565  gd::Project &project,
566  gd::EventsFunctionsExtension &eventsFunctionsExtension,
567  gd::EventsBasedObject &eventsBasedObject, gd::Object &object,
568  const gd::String &oldName, const gd::String &newName);
569 
576  static void ObjectOrGroupRenamedInScene(gd::Project &project,
577  gd::Layout &scene,
578  const gd::String &oldName,
579  const gd::String &newName,
580  bool isObjectGroup);
581 
588  static void ObjectRemovedInScene(gd::Project &project, gd::Layout &scene,
589  const gd::String &objectName);
590 
599  static void BehaviorsAddedToObjectInScene(gd::Project &project,
600  gd::Layout &layout,
601  const gd::String &objectName);
602 
609  static void ObjectRemovedInEventsBasedObject(
610  gd::Project& project,
611  gd::EventsBasedObject& eventsBasedObject,
612  const gd::String& objectName);
613 
619  static void ObjectOrGroupRenamedInEventsBasedObject(
620  gd::Project& project,
621  const gd::ProjectScopedContainers &projectScopedContainers,
622  gd::EventsBasedObject& eventsBasedObject,
623  const gd::String& oldName,
624  const gd::String& newName,
625  bool isObjectGroup);
626 
632  static void ObjectOrGroupRenamedInEventsFunction(
633  gd::Project& project,
634  const gd::ProjectScopedContainers &projectScopedContainers,
635  gd::EventsFunction& eventsFunction,
636  const gd::ObjectsContainer &targetedObjectsContainer,
637  const gd::String& oldName,
638  const gd::String& newName,
639  bool isObjectGroup);
640 
646  static void ObjectRemovedInEventsFunction(
647  gd::Project& project,
648  gd::EventsFunction& eventsFunction,
649  const gd::String& objectName);
650 
657  static void GlobalObjectOrGroupRenamed(gd::Project& project,
658  const gd::String& oldName,
659  const gd::String& newName,
660  bool isObjectGroup);
661 
668  static void GlobalObjectRemoved(gd::Project& project,
669  const gd::String& objectName);
670 
678  void BehaviorsAddedToGlobalObject(gd::Project &project,
679  const gd::String &objectName);
680 
685  static std::set<gd::String> GetAllObjectTypesUsingEventsBasedBehavior(
686  const gd::Project& project,
687  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
688  const gd::EventsBasedBehavior& eventsBasedBehavior);
689 
695  static void EnsureBehaviorEventsFunctionsProperParameters(
696  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
697  const gd::EventsBasedBehavior& eventsBasedBehavior);
698 
703  static void EnsureObjectEventsFunctionsProperParameters(
704  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
705  const gd::EventsBasedObject& eventsBasedObject);
706 
710  static void RemoveLayerInScene(gd::Project &project, gd::Layout &scene,
711  const gd::String &layerName);
712 
716  static void MergeLayersInScene(gd::Project &project, gd::Layout &scene,
717  const gd::String &originLayerName,
718  const gd::String &targetLayerName);
719 
723  static void
724  RemoveLayerInEventsBasedObject(gd::EventsBasedObject &eventsBasedObject,
725  const gd::String &layerName);
726 
730  static void
731  MergeLayersInEventsBasedObject(gd::EventsBasedObject &eventsBasedObject,
732  const gd::String &originLayerName,
733  const gd::String &targetLayerName);
734 
738  static void
739  RenameLeaderboards(gd::Project &project,
740  const std::map<gd::String, gd::String> &leaderboardIdMap);
741 
745  static std::set<gd::String> FindAllLeaderboardIds(gd::Project &project);
746 
751  static size_t GetLayoutAndExternalLayoutLayerInstancesCount(
752  gd::Project &project, gd::Layout &layout, const gd::String &layerName);
753 
762  static void UpdateBehaviorsSharedData(gd::Project &project);
763 
764  virtual ~WholeProjectRefactorer(){};
765 
766  private:
767  static void ObjectOrGroupRenamedInScene(gd::Project &project,
768  gd::Layout &scene,
769  const gd::ObjectsContainer &targetedObjectsContainer,
770  const gd::String &oldName,
771  const gd::String &newName,
772  bool isObjectGroup);
773  static std::vector<gd::String> GetAssociatedExternalLayouts(
774  gd::Project& project, gd::Layout& layout);
775  static std::vector<gd::String>
776  GetAssociatedExternalLayouts(gd::Project &project,
777  const gd::String &layoutName);
778  static std::vector<gd::String>
779  GetAssociatedExternalEvents(gd::Project &project,
780  const gd::String &layoutName);
781 
782  static void DoRenameEventsFunction(gd::Project& project,
783  const gd::EventsFunction& eventsFunction,
784  const gd::String& oldFullType,
785  const gd::String& newFullType,
786  const gd::ProjectBrowser& projectBrowser);
787 
788  static void DoRenameBehavior(gd::Project& project,
789  const gd::String& oldBehaviorType,
790  const gd::String& newBehaviorType,
791  const gd::ProjectBrowser& projectBrowser);
792 
793  static void DoRenameObject(gd::Project& project,
794  const gd::String& oldObjectType,
795  const gd::String& newObjectType,
796  const gd::ProjectBrowser& projectBrowser);
797 
806  static void RenameEventsFunctionsExtension(
807  gd::Project& project,
808  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
809  const gd::String& oldName,
810  const gd::String& newName,
811  const gd::ProjectBrowser& projectBrowser);
812 
820  static void MoveEventsBasedBehavior(
821  gd::Project &project,
822  const gd::String &oldExtensionName,
823  const gd::String &newExtensionName,
824  const gd::EventsBasedBehavior &eventsBasedBehavior,
825  const gd::String &oldBehaviorName,
826  const gd::String &newBehaviorName,
827  const gd::ProjectBrowser &projectBrowser);
828 
836  static void MoveEventsBasedObject(
837  gd::Project &project,
838  const gd::String &oldExtensionName, const gd::String &newExtensionName,
839  const gd::EventsBasedObject &eventsBasedObject,
840  const gd::String &oldObjectName, const gd::String &newObjectName,
841  const gd::ProjectBrowser &projectBrowser);
842 
843  static void FindDependentBehaviorNames(
844  const gd::Project& project,
845  const gd::Object& object,
846  const gd::String& behaviorName,
847  std::unordered_set<gd::String>& dependentBehaviorNames);
848 
849  static std::shared_ptr<VariablesRenamingChangesetNode>
850  ComputeChangesetForVariable(const gd::Variable &oldVariable,
851  const gd::Variable &newVariable);
852 
853  static bool HasAnyVariableTypeChanged(const gd::Variable &oldVariable,
854  const gd::Variable &newVariable);
855 
856  static const gd::String behaviorObjectParameterName;
857  static const gd::String parentObjectParameterName;
858 
860 };
861 
862 } // 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:32
Events that can be generated as a stand-alone function, and used as a condition, action or expression...
Definition: EventsFunction.h:38
Hold a list of Events Functions (gd::EventsFunction) and Events Based Behaviors.
Definition: EventsFunctionsExtension.h:42
Defines a container of gd::InitialInstances.
Definition: InitialInstancesContainer.h:39
Represents a layer of a layout.
Definition: Layer.h:91
Represent a layout ( also called a scene ) of a project.
Definition: Layout.h:41
Represents an object group.
Definition: ObjectGroup.h:28
Represent an object of a platform.
Definition: Object.h:39
Used as a base class for classes that will own objects (see gd::Object).
Definition: ObjectsContainer.h:38
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:52
Holds references to variables, objects, properties and other containers.
Definition: ProjectScopedContainers.h:36
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:33
Defines a variable which can be used by an object, a layout or a project.
Definition: Variable.h:29
Class defining a container for gd::Variable.
Definition: VariablesContainer.h:29
Tool functions to do refactoring on the whole project after changes like deletion or renaming of an o...
Definition: WholeProjectRefactorer.h:72
Definition: CommonTools.h:24
Definition: WholeProjectRefactorer.h:47
std::unordered_set< gd::String > typeChangedVariableNames
Definition: WholeProjectRefactorer.h:55
Definition: WholeProjectRefactorer.h:41