GDevelop JS Platform
Platform for developing HTML5/Javascript based games with GDevelop
EventsCodeGenerator.h
1 /*
2  * GDevelop JS Platform
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 <string>
10 #include <vector>
11 
12 #include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
13 #include "GDCore/Events/Event.h"
14 #include "GDCore/Events/InstructionsList.h"
15 namespace gd {
16 class ObjectsContainer;
17 class EventsFunctionsContainer;
18 class EventsFunction;
19 class EventsBasedBehavior;
20 class EventsBasedObject;
21 class ObjectMetadata;
22 class BehaviorMetadata;
23 class InstructionMetadata;
24 class ExpressionCodeGenerationInformation;
25 class EventsCodeGenerationContext;
26 class ProjectScopedContainers;
27 class ParameterMetadataContainer;
28 } // namespace gd
29 
30 namespace gdjs {
31 
38 class EventsCodeGenerator : public gd::EventsCodeGenerator {
39  public:
51  static gd::String GenerateLayoutCode(const gd::Project& project,
52  const gd::Layout& scene,
53  const gd::String& codeNamespace,
54  std::set<gd::String>& includeFiles,
55  gd::DiagnosticReport& diagnosticReport,
56  bool compilationForRuntime = false);
57 
71  static gd::String GenerateEventsFunctionCode(
72  gd::Project& project,
73  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
74  const gd::EventsFunction& eventsFunction,
75  const gd::String& codeNamespace,
76  std::set<gd::String>& includeFiles,
77  bool compilationForRuntime = false);
78 
97  static gd::String GenerateBehaviorEventsFunctionCode(
98  gd::Project& project,
99  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
100  const gd::EventsBasedBehavior& eventsBasedBehavior,
101  const gd::EventsFunction& eventsFunction,
102  const gd::String& codeNamespace,
103  const gd::String& fullyQualifiedFunctionName,
104  const gd::String& onceTriggersVariable,
105  const gd::String& preludeCode,
106  std::set<gd::String>& includeFiles,
107  bool compilationForRuntime = false);
108 
130  static gd::String GenerateObjectEventsFunctionCode(
131  gd::Project& project,
132  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
133  const gd::EventsBasedObject& eventsBasedObject,
134  const gd::EventsFunction& eventsFunction,
135  const gd::String& codeNamespace,
136  const gd::String& fullyQualifiedFunctionName,
137  const gd::String& onceTriggersVariable,
138  const gd::String& preludeCode,
139  const gd::String& endingCode,
140  std::set<gd::String>& includeFiles,
141  bool compilationForRuntime = false);
142 
154  virtual gd::String GenerateEventsListCode(
155  gd::EventsList& events, gd::EventsCodeGenerationContext& context) override;
156 
166  virtual gd::String GenerateConditionsListCode(
167  gd::InstructionsList& conditions,
168  gd::EventsCodeGenerationContext& context) override;
169 
174  virtual gd::String GenerateBooleanFullName(
175  const gd::String& boolName,
176  const gd::EventsCodeGenerationContext& context) override;
177 
182  virtual gd::String GenerateUpperScopeBooleanFullName(
183  const gd::String& boolName,
184  const gd::EventsCodeGenerationContext& context) override;
185 
189  virtual gd::String GenerateBooleanInitializationToFalse(
190  const gd::String& boolName,
191  const gd::EventsCodeGenerationContext& context) override;
192 
196  virtual gd::String GetObjectListName(
197  const gd::String& name, const gd::EventsCodeGenerationContext& context) override;
198 
206  virtual gd::String GetCodeNamespaceAccessor() override {
207  return GetCodeNamespace() + ".";
208  };
209 
216  virtual gd::String GetCodeNamespace() override { return codeNamespace; };
217 
224  void SetCodeNamespace(const gd::String& codeNamespace_) {
225  codeNamespace = codeNamespace_;
226  };
227 
228  virtual gd::String GeneratePropertySetterWithoutCasting(
229  const gd::PropertiesContainer &propertiesContainer,
230  const gd::NamedPropertyDescriptor &property,
231  const gd::String &operandCode) override;
232 
233  protected:
234  virtual gd::String GenerateParameterCodes(
235  const gd::Expression& parameter,
236  const gd::ParameterMetadata& metadata,
237  gd::EventsCodeGenerationContext& context,
238  const gd::String& lastObjectName,
239  std::vector<std::pair<gd::String, gd::String> >*
240  supplementaryParametersTypes) override;
241 
242  virtual gd::String GenerateObjectFunctionCall(
243  gd::String objectListName,
244  const gd::ObjectMetadata& objMetadata,
245  const gd::ExpressionCodeGenerationInformation& codeInfo,
246  gd::String parametersStr,
247  gd::String defaultOutput,
248  gd::EventsCodeGenerationContext& context) override;
249 
250  virtual gd::String GenerateObjectBehaviorFunctionCall(
251  gd::String objectListName,
252  gd::String behaviorName,
253  const gd::BehaviorMetadata& autoInfo,
254  const gd::ExpressionCodeGenerationInformation& codeInfo,
255  gd::String parametersStr,
256  gd::String defaultOutput,
257  gd::EventsCodeGenerationContext& context) override;
258 
259  virtual gd::String GenerateFreeCondition(
260  const std::vector<gd::String>& arguments,
261  const gd::InstructionMetadata& instrInfos,
262  const gd::String& returnBoolean,
263  bool conditionInverted,
264  gd::EventsCodeGenerationContext& context) override;
265 
266  virtual gd::String GenerateObjectCondition(
267  const gd::String& objectName,
268  const gd::ObjectMetadata& objInfo,
269  const std::vector<gd::String>& arguments,
270  const gd::InstructionMetadata& instrInfos,
271  const gd::String& returnBoolean,
272  bool conditionInverted,
273  gd::EventsCodeGenerationContext& context) override;
274 
275  virtual gd::String GenerateBehaviorCondition(
276  const gd::String& objectName,
277  const gd::String& behaviorName,
278  const gd::BehaviorMetadata& autoInfo,
279  const std::vector<gd::String>& arguments,
280  const gd::InstructionMetadata& instrInfos,
281  const gd::String& returnBoolean,
282  bool conditionInverted,
283  gd::EventsCodeGenerationContext& context) override;
284 
285  virtual gd::String GenerateObjectAction(
286  const gd::String& objectName,
287  const gd::ObjectMetadata& objInfo,
288  const gd::String& functionCallName,
289  const std::vector<gd::String>& arguments,
290  const gd::InstructionMetadata& instrInfos,
291  gd::EventsCodeGenerationContext& context,
292  const gd::String& optionalAsyncCallbackName = "") override;
293 
294  virtual gd::String GenerateBehaviorAction(
295  const gd::String& objectName,
296  const gd::String& behaviorName,
297  const gd::BehaviorMetadata& autoInfo,
298  const gd::String& functionCallName,
299  const std::vector<gd::String>& arguments,
300  const gd::InstructionMetadata& instrInfos,
301  gd::EventsCodeGenerationContext& context,
302  const gd::String& optionalAsyncCallbackName = "") override;
303 
304  virtual gd::String GenerateGetBehaviorNameCode(
305  const gd::String& behaviorName) override;
306 
307  virtual gd::String GenerateGetVariable(
308  const gd::String& variableName,
309  const VariableScope& scope,
310  gd::EventsCodeGenerationContext& context,
311  const gd::String& objectName,
312  bool hasChild) override;
313 
314  virtual gd::String GenerateVariableAccessor(gd::String childName) override {
315  // This could be probably optimised by using `getChildNamed`.
316  return ".getChild(" + ConvertToStringExplicit(childName) + ")";
317  };
318 
319  virtual gd::String GenerateVariableBracketAccessor(
320  gd::String expressionCode) override {
321  // This uses `getChild` which allows to access a child
322  // with a number (an index, for an array) or a string (for a structure).
323  // This could be optimised, if the type of the accessed variable AND the type of the index is known,
324  // so that `getChildAt` (for an array, with an index) or `getChildNamed` (for a structure, with a name)
325  // is used instead.
326  return ".getChild(" + expressionCode + ")";
327  };
328 
329  virtual gd::String GenerateBadVariable() override {
330  return "gdjs.VariablesContainer.badVariable";
331  }
332 
333  virtual gd::String GeneratePropertyGetter(const gd::PropertiesContainer& propertiesContainer,
334  const gd::NamedPropertyDescriptor& property,
335  const gd::String& type,
336  gd::EventsCodeGenerationContext& context) override;
337 
338  virtual gd::String GeneratePropertyGetterWithoutCasting(
339  const gd::PropertiesContainer &propertiesContainer,
340  const gd::NamedPropertyDescriptor &property) override;
341 
342  virtual gd::String GenerateParameterGetter(const gd::ParameterMetadata& parameter,
343  const gd::String& type,
344  gd::EventsCodeGenerationContext& context) override;
345 
346  virtual gd::String GenerateParameterGetterWithoutCasting(
347  const gd::ParameterMetadata &parameter) override;
348 
349  virtual gd::String GenerateBadObject() override { return "null"; }
350 
351  virtual gd::String GenerateObject(const gd::String& objectName,
352  const gd::String& type,
353  gd::EventsCodeGenerationContext& context) override;
354 
355  virtual gd::String GenerateNegatedPredicate(const gd::String& predicate) const override {
356  return "!(" + predicate + ")";
357  };
358 
359  virtual gd::String GenerateObjectsDeclarationCode(
360  gd::EventsCodeGenerationContext& context) override;
361 
362  virtual gd::String GenerateAllInstancesGetterCode(
363  const gd::String& objectName, gd::EventsCodeGenerationContext& context);
364 
365  virtual gd::String GenerateProfilerSectionBegin(const gd::String& section) override;
366  virtual gd::String GenerateProfilerSectionEnd(const gd::String& section) override;
367 
368  virtual gd::String GenerateRelationalOperation(
369  const gd::String& relationalOperator,
370  const gd::String& lhs,
371  const gd::String& rhs) override;
372 
373  private:
374  static gd::String GenerateEventsListCompleteFunctionCode(
375  gdjs::EventsCodeGenerator& codeGenerator,
376  gd::String fullyQualifiedFunctionName,
377  gd::String functionArgumentsCode,
378  gd::String functionPreEventsCode,
379  const gd::EventsList& events,
380  gd::String functionPostEventsCode,
381  gd::String functionReturnCode);
382 
390  gd::String GenerateAllConditionsBooleanDeclarations();
391 
398  std::pair<gd::String, gd::String> GenerateAllObjectsDeclarationsAndResets(
399  unsigned int maxDepthLevelReached);
400 
407  gd::String GenerateEventsFunctionParameterDeclarationsList(
408  const gd::ParameterMetadataContainer& parameters,
409  int firstParameterIndex,
410  bool addsSceneParameter);
411 
417  gd::String GenerateFreeEventsFunctionContext(
418  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
419  const gd::EventsFunction &eventsFunction,
420  const gd::String& onceTriggersVariable);
421 
427  gd::String GenerateBehaviorEventsFunctionContext(
428  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
429  const gd::EventsBasedBehavior& eventsBasedBehavior,
430  const gd::EventsFunction &eventsFunction,
431  const gd::String& onceTriggersVariable,
432  const gd::String& thisObjectName,
433  const gd::String& thisBehaviorName);
434 
440  gd::String GenerateObjectEventsFunctionContext(
441  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
442  const gd::EventsBasedObject& eventsBasedObject,
443  const gd::EventsFunction &eventsFunction,
444  const gd::String& onceTriggersVariable,
445  const gd::String& thisObjectName);
446 
447  gd::String GenerateEventsFunctionReturn(
448  const gd::EventsFunction& eventFunction);
449 
453  EventsCodeGenerator(const gd::Project& project, const gd::Layout& layout);
454 
458  EventsCodeGenerator(const gd::ProjectScopedContainers& projectScopedContainers);
459  virtual ~EventsCodeGenerator();
460 
461  gd::String codeNamespace;
463 
464  private:
470  gd::String GenerateEventsFunctionContext(
471  const gd::EventsFunctionsExtension &eventsFunctionsExtension,
472  const gd::EventsFunctionsContainer &eventsFunctionsContainer,
473  const gd::EventsFunction &eventsFunction,
474  const gd::String &onceTriggersVariable,
475  gd::String &objectsGettersMap,
476  gd::String &objectArraysMap,
477  gd::String &behaviorNamesMap,
478  const gd::String &thisObjectName = "",
479  const gd::String &thisBehaviorName = "");
480 };
481 
482 } // namespace gdjs
The class being responsible for generating JavaScript code from events.
Definition: EventsCodeGenerator.h:38
virtual gd::String GetCodeNamespaceAccessor() override
Get the namespace to be used to store code generated objects/values/functions, with the extra "dot" a...
Definition: EventsCodeGenerator.h:206
virtual gd::String GetCodeNamespace() override
Get the namespace to be used to store code generated objects/values/functions.
Definition: EventsCodeGenerator.h:216
virtual gd::String GenerateEventsListCode(gd::EventsList &events, gd::EventsCodeGenerationContext &context) override
Generate code for executing an event list.
Definition: EventsCodeGenerator.cpp:1150
virtual gd::String GenerateConditionsListCode(gd::InstructionsList &conditions, gd::EventsCodeGenerationContext &context) override
Definition: EventsCodeGenerator.cpp:1183
virtual gd::String GenerateBooleanInitializationToFalse(const gd::String &boolName, const gd::EventsCodeGenerationContext &context) override
Set a boolean to false.
Definition: EventsCodeGenerator.cpp:1507
static gd::String GenerateObjectEventsFunctionCode(gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension, const gd::EventsBasedObject &eventsBasedObject, const gd::EventsFunction &eventsFunction, const gd::String &codeNamespace, const gd::String &fullyQualifiedFunctionName, const gd::String &onceTriggersVariable, const gd::String &preludeCode, const gd::String &endingCode, std::set< gd::String > &includeFiles, bool compilationForRuntime=false)
Definition: EventsCodeGenerator.cpp:258
virtual gd::String GenerateUpperScopeBooleanFullName(const gd::String &boolName, const gd::EventsCodeGenerationContext &context) override
Generate the full name for accessing to a boolean variable used for conditions.
Definition: EventsCodeGenerator.cpp:1496
void SetCodeNamespace(const gd::String &codeNamespace_)
Specify the code namespace to use, useful for functions as it is not autogenerated.
Definition: EventsCodeGenerator.h:224
static gd::String GenerateBehaviorEventsFunctionCode(gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension, const gd::EventsBasedBehavior &eventsBasedBehavior, const gd::EventsFunction &eventsFunction, const gd::String &codeNamespace, const gd::String &fullyQualifiedFunctionName, const gd::String &onceTriggersVariable, const gd::String &preludeCode, std::set< gd::String > &includeFiles, bool compilationForRuntime=false)
Definition: EventsCodeGenerator.cpp:174
virtual gd::String GenerateBooleanFullName(const gd::String &boolName, const gd::EventsCodeGenerationContext &context) override
Generate the full name for accessing to a boolean variable used for conditions.
Definition: EventsCodeGenerator.cpp:1513
static gd::String GenerateEventsFunctionCode(gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension, const gd::EventsFunction &eventsFunction, const gd::String &codeNamespace, std::set< gd::String > &includeFiles, bool compilationForRuntime=false)
Definition: EventsCodeGenerator.cpp:125
virtual gd::String GetObjectListName(const gd::String &name, const gd::EventsCodeGenerationContext &context) override
Get the full name for accessing to a list of objects.
Definition: EventsCodeGenerator.cpp:1055
static gd::String GenerateLayoutCode(const gd::Project &project, const gd::Layout &scene, const gd::String &codeNamespace, std::set< gd::String > &includeFiles, gd::DiagnosticReport &diagnosticReport, bool compilationForRuntime=false)
Definition: EventsCodeGenerator.cpp:99