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 
72  static gd::String GenerateEventsFunctionCode(
73  gd::Project& project,
74  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
75  const gd::EventsFunction& eventsFunction,
76  const gd::String& codeNamespace,
77  std::set<gd::String>& includeFiles,
78  bool compilationForRuntime = false);
79 
98  static gd::String GenerateBehaviorEventsFunctionCode(
99  gd::Project& project,
100  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
101  const gd::EventsBasedBehavior& eventsBasedBehavior,
102  const gd::EventsFunction& eventsFunction,
103  const gd::String& codeNamespace,
104  const gd::String& fullyQualifiedFunctionName,
105  const gd::String& onceTriggersVariable,
106  const gd::String& preludeCode,
107  std::set<gd::String>& includeFiles,
108  bool compilationForRuntime = false);
109 
132  static gd::String GenerateObjectEventsFunctionCode(
133  gd::Project& project,
134  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
135  const gd::EventsBasedObject& eventsBasedObject,
136  const gd::EventsFunction& eventsFunction,
137  const gd::String& codeNamespace,
138  const gd::String& fullyQualifiedFunctionName,
139  const gd::String& onceTriggersVariable,
140  const gd::String& preludeCode,
141  const gd::String& endingCode,
142  std::set<gd::String>& includeFiles,
143  bool compilationForRuntime = false);
144 
156  virtual gd::String GenerateEventsListCode(
157  gd::EventsList& events,
158  gd::EventsCodeGenerationContext& context) override;
159 
169  virtual gd::String GenerateConditionsListCode(
170  gd::InstructionsList& conditions,
171  gd::EventsCodeGenerationContext& context) override;
172 
177  virtual gd::String GenerateBooleanFullName(
178  const gd::String& boolName,
179  const gd::EventsCodeGenerationContext& context) override;
180 
185  virtual gd::String GenerateUpperScopeBooleanFullName(
186  const gd::String& boolName,
187  const gd::EventsCodeGenerationContext& context) override;
188 
192  virtual gd::String GenerateBooleanInitializationToFalse(
193  const gd::String& boolName,
194  const gd::EventsCodeGenerationContext& context) override;
195 
199  virtual gd::String GetObjectListName(
200  const gd::String& name,
201  const gd::EventsCodeGenerationContext& context) override;
202 
210  virtual gd::String GetCodeNamespaceAccessor() override {
211  return GetCodeNamespace() + ".";
212  };
213 
220  virtual gd::String GetCodeNamespace() override { return codeNamespace; };
221 
228  void SetCodeNamespace(const gd::String& codeNamespace_) {
229  codeNamespace = codeNamespace_;
230  };
231 
232  virtual gd::String GeneratePropertySetterWithoutCasting(
233  const gd::PropertiesContainer& propertiesContainer,
234  const gd::NamedPropertyDescriptor& property,
235  const gd::String& operandCode) override;
236 
237  protected:
238  virtual gd::String GenerateParameterCodes(
239  const gd::Expression& parameter,
240  const gd::ParameterMetadata& metadata,
241  gd::EventsCodeGenerationContext& context,
242  const gd::String& lastObjectName,
243  std::vector<std::pair<gd::String, gd::String> >*
244  supplementaryParametersTypes) override;
245 
246  virtual gd::String GenerateObjectFunctionCall(
247  gd::String objectListName,
248  const gd::ObjectMetadata& objMetadata,
249  const gd::ExpressionCodeGenerationInformation& codeInfo,
250  gd::String parametersStr,
251  gd::String defaultOutput,
252  gd::EventsCodeGenerationContext& context) override;
253 
254  virtual gd::String GenerateObjectBehaviorFunctionCall(
255  gd::String objectListName,
256  gd::String behaviorName,
257  const gd::BehaviorMetadata& autoInfo,
258  const gd::ExpressionCodeGenerationInformation& codeInfo,
259  gd::String parametersStr,
260  gd::String defaultOutput,
261  gd::EventsCodeGenerationContext& context) override;
262 
263  virtual gd::String GenerateFreeCondition(
264  const std::vector<gd::String>& arguments,
265  const gd::InstructionMetadata& instrInfos,
266  const gd::String& returnBoolean,
267  bool conditionInverted,
268  gd::EventsCodeGenerationContext& context) override;
269 
270  virtual gd::String GenerateObjectCondition(
271  const gd::String& objectName,
272  const gd::ObjectMetadata& objInfo,
273  const std::vector<gd::String>& arguments,
274  const gd::InstructionMetadata& instrInfos,
275  const gd::String& returnBoolean,
276  bool conditionInverted,
277  gd::EventsCodeGenerationContext& context) override;
278 
279  virtual gd::String GenerateBehaviorCondition(
280  const gd::String& objectName,
281  const gd::String& behaviorName,
282  const gd::BehaviorMetadata& autoInfo,
283  const std::vector<gd::String>& arguments,
284  const gd::InstructionMetadata& instrInfos,
285  const gd::String& returnBoolean,
286  bool conditionInverted,
287  gd::EventsCodeGenerationContext& context) override;
288 
289  virtual gd::String GenerateObjectAction(
290  const gd::String& objectName,
291  const gd::ObjectMetadata& objInfo,
292  const gd::String& functionCallName,
293  const std::vector<gd::String>& arguments,
294  const gd::InstructionMetadata& instrInfos,
295  gd::EventsCodeGenerationContext& context,
296  const gd::String& optionalAsyncCallbackName = "",
297  const gd::String& optionalAsyncCallbackId = "") override;
298 
299  virtual gd::String GenerateBehaviorAction(
300  const gd::String& objectName,
301  const gd::String& behaviorName,
302  const gd::BehaviorMetadata& autoInfo,
303  const gd::String& functionCallName,
304  const std::vector<gd::String>& arguments,
305  const gd::InstructionMetadata& instrInfos,
306  gd::EventsCodeGenerationContext& context,
307  const gd::String& optionalAsyncCallbackName = "",
308  const gd::String& optionalAsyncCallbackId = "") override;
309 
310  virtual gd::String GenerateGetBehaviorNameCode(
311  const gd::String& behaviorName) override;
312 
313  virtual gd::String GenerateGetVariable(
314  const gd::String& variableName,
315  const VariableScope& scope,
316  gd::EventsCodeGenerationContext& context,
317  const gd::String& objectName,
318  bool hasChild) override;
319 
320  virtual gd::String GenerateVariableAccessor(gd::String childName) override {
321  // This could be probably optimised by using `getChildNamed`.
322  return ".getChild(" + ConvertToStringExplicit(childName) + ")";
323  };
324 
325  virtual gd::String GenerateVariableBracketAccessor(
326  gd::String expressionCode) override {
327  // This uses `getChild` which allows to access a child
328  // with a number (an index, for an array) or a string (for a structure).
329  // This could be optimised, if the type of the accessed variable AND the
330  // type of the index is known, so that `getChildAt` (for an array, with an
331  // index) or `getChildNamed` (for a structure, with a name) is used instead.
332  return ".getChild(" + expressionCode + ")";
333  };
334 
335  virtual gd::String GenerateBadVariable() override {
336  return "gdjs.VariablesContainer.badVariable";
337  }
338 
339  virtual gd::String GeneratePropertyGetter(
340  const gd::PropertiesContainer& propertiesContainer,
341  const gd::NamedPropertyDescriptor& property,
342  const gd::String& type,
343  gd::EventsCodeGenerationContext& context) override;
344 
345  virtual gd::String GeneratePropertyGetterWithoutCasting(
346  const gd::PropertiesContainer& propertiesContainer,
347  const gd::NamedPropertyDescriptor& property) override;
348 
349  virtual gd::String GenerateParameterGetter(
350  const gd::ParameterMetadata& parameter,
351  const gd::String& type,
352  gd::EventsCodeGenerationContext& context) override;
353 
354  virtual gd::String GenerateParameterGetterWithoutCasting(
355  const gd::ParameterMetadata& parameter) override;
356 
357  virtual gd::String GenerateBadObject() override { return "null"; }
358 
359  virtual gd::String GenerateObject(
360  const gd::String& objectName,
361  const gd::String& type,
362  gd::EventsCodeGenerationContext& context) override;
363 
364  virtual gd::String GenerateNegatedPredicate(
365  const gd::String& predicate) const override {
366  return "!(" + predicate + ")";
367  };
368 
369  virtual gd::String GenerateObjectsDeclarationCode(
370  gd::EventsCodeGenerationContext& context) override;
371 
372  virtual gd::String GenerateAllInstancesGetterCode(
373  const gd::String& objectName, gd::EventsCodeGenerationContext& context);
374 
375  virtual gd::String GenerateProfilerSectionBegin(
376  const gd::String& section) override;
377  virtual gd::String GenerateProfilerSectionEnd(
378  const gd::String& section) override;
379 
380  virtual gd::String GenerateRelationalOperation(
381  const gd::String& relationalOperator,
382  const gd::String& lhs,
383  const gd::String& rhs) override;
384 
385  private:
386  static gd::String GenerateEventsListCompleteFunctionCode(
387  gdjs::EventsCodeGenerator& codeGenerator,
388  gd::String fullyQualifiedFunctionName,
389  gd::String functionArgumentsCode,
390  gd::String functionPreEventsCode,
391  const gd::EventsList& events,
392  gd::String functionPostEventsCode,
393  gd::String functionReturnCode);
394 
402  gd::String GenerateAllConditionsBooleanDeclarations();
403 
410  std::pair<gd::String, gd::String> GenerateAllObjectsDeclarationsAndResets(
411  unsigned int maxDepthLevelReached);
412 
419  gd::String GenerateEventsFunctionParameterDeclarationsList(
420  const gd::ParameterMetadataContainer& parameters,
421  int firstParameterIndex,
422  bool addsSceneParameter);
423 
429  gd::String GenerateFreeEventsFunctionContext(
430  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
431  const gd::EventsFunction& eventsFunction,
432  const gd::String& onceTriggersVariable);
433 
439  gd::String GenerateBehaviorEventsFunctionContext(
440  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
441  const gd::EventsBasedBehavior& eventsBasedBehavior,
442  const gd::EventsFunction& eventsFunction,
443  const gd::String& onceTriggersVariable,
444  const gd::String& thisObjectName,
445  const gd::String& thisBehaviorName);
446 
452  gd::String GenerateObjectEventsFunctionContext(
453  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
454  const gd::EventsBasedObject& eventsBasedObject,
455  const gd::EventsFunction& eventsFunction,
456  const gd::String& onceTriggersVariable,
457  const gd::String& thisObjectName);
458 
459  gd::String GenerateEventsFunctionReturn(
460  const gd::EventsFunction& eventFunction);
461 
465  EventsCodeGenerator(const gd::Project& project, const gd::Layout& layout);
466 
470  EventsCodeGenerator(
471  const gd::ProjectScopedContainers& projectScopedContainers);
472  virtual ~EventsCodeGenerator();
473 
474  gd::String codeNamespace;
476 
477  private:
483  gd::String GenerateEventsFunctionContext(
484  const gd::EventsFunctionsExtension& eventsFunctionsExtension,
485  const gd::EventsFunctionsContainer& eventsFunctionsContainer,
486  const gd::EventsFunction& eventsFunction,
487  const gd::String& onceTriggersVariable,
488  gd::String& objectsGettersMap,
489  gd::String& objectArraysMap,
490  gd::String& behaviorNamesMap,
491  const gd::String& thisObjectName = "",
492  const gd::String& thisBehaviorName = "");
493 };
494 
495 } // 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:210
virtual gd::String GetCodeNamespace() override
Get the namespace to be used to store code generated objects/values/functions.
Definition: EventsCodeGenerator.h:220
virtual gd::String GenerateEventsListCode(gd::EventsList &events, gd::EventsCodeGenerationContext &context) override
Generate code for executing an event list.
Definition: EventsCodeGenerator.cpp:1193
virtual gd::String GenerateConditionsListCode(gd::InstructionsList &conditions, gd::EventsCodeGenerationContext &context) override
Definition: EventsCodeGenerator.cpp:1226
virtual gd::String GenerateBooleanInitializationToFalse(const gd::String &boolName, const gd::EventsCodeGenerationContext &context) override
Set a boolean to false.
Definition: EventsCodeGenerator.cpp:1548
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:289
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:1537
void SetCodeNamespace(const gd::String &codeNamespace_)
Specify the code namespace to use, useful for functions as it is not autogenerated.
Definition: EventsCodeGenerator.h:228
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:193
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:1554
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:130
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:1098
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:104