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 
225  static void
226  RenameParameter(gd::Project &project,
227  gd::ProjectScopedContainers &projectScopedContainers,
228  gd::EventsFunction &eventsFunction,
229  const gd::ObjectsContainer &parameterObjectsContainer,
230  const gd::String &oldParameterName,
231  const gd::String &newParameterName);
232 
236  static void
237  ChangeParameterType(gd::Project &project,
238  gd::ProjectScopedContainers &projectScopedContainers,
239  gd::EventsFunction &eventsFunction,
240  const gd::ObjectsContainer &parameterObjectsContainer,
241  const gd::String &parameterName);
242 
251  static void MoveEventsFunctionParameter(
252  gd::Project& project,
253  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
254  const gd::String& functionName,
255  std::size_t oldIndex,
256  std::size_t newIndex);
257 
266  static void MoveBehaviorEventsFunctionParameter(
267  gd::Project& project,
268  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
269  const gd::EventsBasedBehavior& eventsBasedBehavior,
270  const gd::String& functionName,
271  std::size_t oldIndex,
272  std::size_t newIndex);
273 
282  static void MoveObjectEventsFunctionParameter(
283  gd::Project& project,
284  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
285  const gd::EventsBasedObject& eventsBasedObject,
286  const gd::String& functionName,
287  std::size_t oldIndex,
288  std::size_t newIndex);
289 
298  static void RenameEventsBasedBehaviorProperty(
299  gd::Project& project,
300  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
301  const gd::EventsBasedBehavior& eventsBasedBehavior,
302  const gd::String& oldPropertyName,
303  const gd::String& newPropertyName);
304 
313  static void RenameEventsBasedBehaviorSharedProperty(
314  gd::Project& project,
315  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
316  const gd::EventsBasedBehavior& eventsBasedBehavior,
317  const gd::String& oldPropertyName,
318  const gd::String& newPropertyName);
319 
328  static void RenameEventsBasedObjectProperty(
329  gd::Project& project,
330  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
331  const gd::EventsBasedObject& eventsBasedObject,
332  const gd::String& oldPropertyName,
333  const gd::String& newPropertyName);
334 
339  static void ChangeEventsBasedBehaviorPropertyType(
340  gd::Project &project,
341  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
342  const gd::EventsBasedBehavior &eventsBasedBehavior,
343  const gd::String &propertyName);
344 
349  static void ChangeEventsBasedObjectPropertyType(
350  gd::Project &project,
351  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
352  const gd::EventsBasedObject &eventsBasedObject,
353  const gd::String &propertyName);
354 
359  static void AddBehaviorAndRequiredBehaviors(gd::Project& project,
360  gd::Object& object,
361  const gd::String& behaviorType,
362  const gd::String& behaviorName);
367  static void AddRequiredBehaviorsFor(gd::Project& project,
368  gd::Object& object,
369  const gd::String& behaviorName);
370 
375  static std::vector<gd::String> FindDependentBehaviorNames(
376  const gd::Project& project,
377  const gd::Object& object,
378  const gd::String& behaviorName);
379 
383  static std::vector<gd::String> GetBehaviorsWithType(const gd::Object& object,
384  const gd::String& type);
385 
390  static std::vector<gd::UnfilledRequiredBehaviorPropertyProblem>
391  FindInvalidRequiredBehaviorProperties(const gd::Project& project);
392 
398  static bool
399  FixInvalidRequiredBehaviorProperties(gd::Project& project);
400 
408  static void RenameEventsBasedBehavior(
409  gd::Project& project,
410  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
411  const gd::String& oldBehaviorName,
412  const gd::String& newBehaviorName);
413 
421  static void MoveEventsBasedBehavior(
422  gd::Project &project,
423  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
424  const gd::String &oldExtensionName, const gd::String &newExtensionName,
425  const gd::String &oldBehaviorName, const gd::String &newBehaviorName);
426 
431  static void UpdateBehaviorNameInEventsBasedBehavior(
432  gd::Project &project,
433  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
434  gd::EventsBasedBehavior &eventsBasedBehavior,
435  const gd::String &sourceBehaviorName);
436 
444  static void RenameEventsBasedObject(
445  gd::Project &project,
446  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
447  const gd::String &oldObjectName, const gd::String &newObjectName);
448 
456  static void MoveEventsBasedObject(
457  gd::Project &project,
458  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
459  const gd::String &oldExtensionName, const gd::String &newExtensionName,
460  const gd::String &oldObjectName, const gd::String &newObjectName);
461 
466  static void UpdateObjectNameInEventsBasedObject(
467  gd::Project &project,
468  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
469  gd::EventsBasedObject &eventsBasedObject,
470  const gd::String &sourceObjectName);
471 
475  static void RenameLayout(gd::Project &project, const gd::String &oldName,
476  const gd::String &newName);
480  static void RenameExternalLayout(gd::Project &project,
481  const gd::String &oldName,
482  const gd::String &newName);
486  static void RenameExternalEvents(gd::Project &project,
487  const gd::String &oldName,
488  const gd::String &newName);
489 
493  static void RenameLayerInScene(gd::Project &project, gd::Layout &scene,
494  const gd::String &oldName,
495  const gd::String &newName);
496 
500  static void RenameLayerInEventsBasedObject(
501  gd::Project &project,
502  gd::EventsFunctionsExtension &eventsFunctionsExtension,
503  gd::EventsBasedObject &eventsBasedObject, const gd::String &oldName,
504  const gd::String &newName);
505 
509  static void RenameLayerEffectInScene(gd::Project &project, gd::Layout &scene,
510  gd::Layer &layer,
511  const gd::String &oldName,
512  const gd::String &newName);
513 
517  static void RenameLayerEffectInEventsBasedObject(
518  gd::Project &project,
519  gd::EventsFunctionsExtension &eventsFunctionsExtension,
520  gd::EventsBasedObject &eventsBasedObject, gd::Layer &layer,
521  const gd::String &oldName, const gd::String &newName);
522 
526  static void RenameObjectAnimationInScene(gd::Project &project,
527  gd::Layout &scene,
528  gd::Object &object,
529  const gd::String &oldName,
530  const gd::String &newName);
531 
535  static void RenameObjectAnimationInEventsBasedObject(
536  gd::Project &project,
537  gd::EventsFunctionsExtension &eventsFunctionsExtension,
538  gd::EventsBasedObject &eventsBasedObject, gd::Object &object,
539  const gd::String &oldName, const gd::String &newName);
540 
544  static void RenameObjectPointInScene(gd::Project &project, gd::Layout &scene,
545  gd::Object &object,
546  const gd::String &oldName,
547  const gd::String &newName);
548 
552  static void RenameObjectPointInEventsBasedObject(
553  gd::Project &project,
554  gd::EventsFunctionsExtension &eventsFunctionsExtension,
555  gd::EventsBasedObject &eventsBasedObject, gd::Object &object,
556  const gd::String &oldName, const gd::String &newName);
557 
561  static void RenameObjectEffectInScene(gd::Project &project, gd::Layout &scene,
562  gd::Object &object,
563  const gd::String &oldName,
564  const gd::String &newName);
565 
569  static void RenameObjectEffectInEventsBasedObject(
570  gd::Project &project,
571  gd::EventsFunctionsExtension &eventsFunctionsExtension,
572  gd::EventsBasedObject &eventsBasedObject, gd::Object &object,
573  const gd::String &oldName, const gd::String &newName);
574 
581  static void ObjectOrGroupRenamedInScene(gd::Project &project,
582  gd::Layout &scene,
583  const gd::String &oldName,
584  const gd::String &newName,
585  bool isObjectGroup);
586 
593  static void ObjectRemovedInScene(gd::Project &project, gd::Layout &scene,
594  const gd::String &objectName);
595 
604  static void BehaviorsAddedToObjectInScene(gd::Project &project,
605  gd::Layout &layout,
606  const gd::String &objectName);
607 
614  static void ObjectRemovedInEventsBasedObject(
615  gd::Project& project,
616  gd::EventsBasedObject& eventsBasedObject,
617  const gd::String& objectName);
618 
624  static void RemoveEventsBasedObjectVariant(
625  gd::Project& project,
626  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
627  gd::EventsBasedObject& eventsBasedObject,
628  const gd::String& variantName);
629 
635  static void ObjectOrGroupRenamedInEventsBasedObject(
636  gd::Project& project,
637  const gd::ProjectScopedContainers &projectScopedContainers,
638  gd::EventsBasedObject& eventsBasedObject,
639  const gd::String& oldName,
640  const gd::String& newName,
641  bool isObjectGroup);
642 
648  static void ObjectOrGroupRenamedInEventsFunction(
649  gd::Project& project,
650  const gd::ProjectScopedContainers &projectScopedContainers,
651  gd::EventsFunction& eventsFunction,
652  const gd::ObjectsContainer &targetedObjectsContainer,
653  const gd::String& oldName,
654  const gd::String& newName,
655  bool isObjectGroup);
656 
662  static void ObjectRemovedInEventsFunction(
663  gd::Project& project,
664  gd::EventsFunction& eventsFunction,
665  const gd::String& objectName);
666 
673  static void GlobalObjectOrGroupRenamed(gd::Project& project,
674  const gd::String& oldName,
675  const gd::String& newName,
676  bool isObjectGroup);
677 
684  static void GlobalObjectRemoved(gd::Project& project,
685  const gd::String& objectName);
686 
694  void BehaviorsAddedToGlobalObject(gd::Project &project,
695  const gd::String &objectName);
696 
701  static std::set<gd::String> GetAllObjectTypesUsingEventsBasedBehavior(
702  const gd::Project& project,
703  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
704  const gd::EventsBasedBehavior& eventsBasedBehavior);
705 
711  static void EnsureBehaviorEventsFunctionsProperParameters(
712  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
713  const gd::EventsBasedBehavior& eventsBasedBehavior);
714 
719  static void EnsureObjectEventsFunctionsProperParameters(
720  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
721  const gd::EventsBasedObject& eventsBasedObject);
722 
726  static void RemoveLayerInScene(gd::Project &project, gd::Layout &scene,
727  const gd::String &layerName);
728 
732  static void MergeLayersInScene(gd::Project &project, gd::Layout &scene,
733  const gd::String &originLayerName,
734  const gd::String &targetLayerName);
735 
739  static void
740  RemoveLayerInEventsBasedObject(gd::EventsBasedObject &eventsBasedObject,
741  const gd::String &layerName);
742 
746  static void
747  MergeLayersInEventsBasedObject(gd::EventsBasedObject &eventsBasedObject,
748  const gd::String &originLayerName,
749  const gd::String &targetLayerName);
750 
754  static void
755  RenameLeaderboards(gd::Project &project,
756  const std::map<gd::String, gd::String> &leaderboardIdMap);
757 
761  static std::set<gd::String> FindAllLeaderboardIds(gd::Project &project);
762 
767  static size_t GetLayoutAndExternalLayoutLayerInstancesCount(
768  gd::Project &project, gd::Layout &layout, const gd::String &layerName);
769 
778  static void UpdateBehaviorsSharedData(gd::Project &project);
779 
780  virtual ~WholeProjectRefactorer(){};
781 
782  private:
783  static void ObjectOrGroupRenamedInScene(gd::Project &project,
784  gd::Layout &scene,
785  const gd::ObjectsContainer &targetedObjectsContainer,
786  const gd::String &oldName,
787  const gd::String &newName,
788  bool isObjectGroup);
789  static std::vector<gd::String> GetAssociatedExternalLayouts(
790  gd::Project& project, gd::Layout& layout);
791  static std::vector<gd::String>
792  GetAssociatedExternalLayouts(gd::Project &project,
793  const gd::String &layoutName);
794  static std::vector<gd::String>
795  GetAssociatedExternalEvents(gd::Project &project,
796  const gd::String &layoutName);
797 
798  static void DoRenameEventsFunction(gd::Project& project,
799  const gd::EventsFunction& eventsFunction,
800  const gd::String& oldFullType,
801  const gd::String& newFullType,
802  const gd::ProjectBrowser& projectBrowser);
803 
804  static void DoRenameBehavior(gd::Project& project,
805  const gd::String& oldBehaviorType,
806  const gd::String& newBehaviorType,
807  const gd::ProjectBrowser& projectBrowser);
808 
809  static void DoRenameObject(gd::Project& project,
810  const gd::String& oldObjectType,
811  const gd::String& newObjectType,
812  const gd::ProjectBrowser& projectBrowser);
813 
822  static void RenameEventsFunctionsExtension(
823  gd::Project& project,
824  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
825  const gd::String& oldName,
826  const gd::String& newName,
827  const gd::ProjectBrowser& projectBrowser);
828 
836  static void MoveEventsBasedBehavior(
837  gd::Project &project,
838  const gd::String &oldExtensionName,
839  const gd::String &newExtensionName,
840  const gd::EventsBasedBehavior &eventsBasedBehavior,
841  const gd::String &oldBehaviorName,
842  const gd::String &newBehaviorName,
843  const gd::ProjectBrowser &projectBrowser);
844 
852  static void MoveEventsBasedObject(
853  gd::Project &project,
854  const gd::String &oldExtensionName, const gd::String &newExtensionName,
855  const gd::EventsBasedObject &eventsBasedObject,
856  const gd::String &oldObjectName, const gd::String &newObjectName,
857  const gd::ProjectBrowser &projectBrowser);
858 
859  static void FindDependentBehaviorNames(
860  const gd::Project& project,
861  const gd::Object& object,
862  const gd::String& behaviorName,
863  std::unordered_set<gd::String>& dependentBehaviorNames);
864 
865  static std::shared_ptr<VariablesRenamingChangesetNode>
866  ComputeChangesetForVariable(const gd::Variable &oldVariable,
867  const gd::Variable &newVariable);
868 
869  static bool HasAnyVariableTypeChanged(const gd::Variable &oldVariable,
870  const gd::Variable &newVariable);
871 
872  static const gd::String behaviorObjectParameterName;
873  static const gd::String parentObjectParameterName;
874 
876 };
877 
878 } // 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:39
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