GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
ExpressionCodeGenerator.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-present Florian Rival ([email protected]). All rights
4  * reserved. This project is released under the MIT License.
5  */
6 #if defined(GD_IDE_ONLY)
7 #ifndef GDCORE_ExpressionCodeGenerator_H
8 #define GDCORE_ExpressionCodeGenerator_H
9 
10 #include <memory>
11 #include <vector>
12 #include "GDCore/Events/Parsers/ExpressionParser2Node.h"
13 #include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
14 #include "GDCore/String.h"
15 namespace gd {
16 class Expression;
17 class ObjectsContainer;
18 class Platform;
19 class ParameterMetadata;
20 class ExpressionMetadata;
21 class EventsCodeGenerationContext;
22 class EventsCodeGenerator;
23 } // namespace gd
24 
25 namespace gd {
26 
36  public:
37  ExpressionCodeGenerator(const gd::String &rootType_,
38  const gd::String &rootObjectName_,
39  EventsCodeGenerator& codeGenerator_,
41  : rootType(rootType_), rootObjectName(rootObjectName_), codeGenerator(codeGenerator_), context(context_){};
42  virtual ~ExpressionCodeGenerator(){};
43 
58  static gd::String GenerateExpressionCode(EventsCodeGenerator& codeGenerator,
60  const gd::String& type,
61  const gd::Expression& expression,
62  const gd::String& objectName = "");
63 
64  const gd::String& GetOutput() { return output; };
65 
66  protected:
67  void OnVisitSubExpressionNode(SubExpressionNode& node) override;
68  void OnVisitOperatorNode(OperatorNode& node) override;
69  void OnVisitUnaryOperatorNode(UnaryOperatorNode& node) override;
70  void OnVisitNumberNode(NumberNode& node) override;
71  void OnVisitTextNode(TextNode& node) override;
72  void OnVisitVariableNode(VariableNode& node) override;
73  void OnVisitVariableAccessorNode(VariableAccessorNode& node) override;
74  void OnVisitVariableBracketAccessorNode(
75  VariableBracketAccessorNode& node) override;
76  void OnVisitIdentifierNode(IdentifierNode& node) override;
77  void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode& node) override;
78  void OnVisitFunctionCallNode(FunctionCallNode& node) override;
79  void OnVisitEmptyNode(EmptyNode& node) override;
80 
81  private:
82  gd::String GenerateFreeFunctionCode(
83  const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
84  const ExpressionMetadata& expressionMetadata);
85  gd::String GenerateObjectFunctionCode(
86  const gd::String& type,
87  const gd::String& objectName,
88  const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
89  const ExpressionMetadata& expressionMetadata);
90  gd::String GenerateBehaviorFunctionCode(
91  const gd::String& type,
92  const gd::String& objectName,
93  const gd::String& behaviorName,
94  const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
95  const ExpressionMetadata& expressionMetadata);
96  gd::String GenerateParametersCodes(
97  const std::vector<std::unique_ptr<ExpressionNode>>& parameters,
98  const ExpressionMetadata& expressionMetadata,
99  size_t initialParameterIndex);
100  gd::String GenerateDefaultValue(const gd::String& type);
101  static std::vector<gd::Expression> PrintParameters(
102  const std::vector<std::unique_ptr<ExpressionNode>>& parameters);
103 
104  gd::String output;
105  gd::String objectNameToUseForVariableAccessor;
106  EventsCodeGenerator& codeGenerator;
108  const gd::String rootType;
109  const gd::String rootObjectName;
110 };
111 
112 } // namespace gd
113 
114 #endif // GDCORE_ExpressionCodeGenerator_H
115 #endif
Used to manage the context when generating code for events.
Definition: EventsCodeGenerationContext.h:27
Internal class used to generate code from events.
Definition: EventsCodeGenerator.h:40
Generate code for a parsed expression.
Definition: ExpressionCodeGenerator.h:35
Class representing an expression used as a parameter of a gd::Instruction. This class is nothing more...
Definition: Expression.h:30
Describe user-friendly information about an expression, its parameters and the function name as well ...
Definition: ExpressionMetadata.h:47
The interface for any worker class ("visitor" pattern) that want to interact with the nodes of a pars...
Definition: ExpressionParser2NodeWorker.h:36
String represents an UTF8 encoded string.
Definition: String.h:31
Definition: CommonTools.h:24
An empty node, used when parsing failed/a syntax error was encountered and any other node could not m...
Definition: ExpressionParser2Node.h:416
A function call node (either free function, object function or object behavior function)....
Definition: ExpressionParser2Node.h:364
An identifier node, usually representing an object or a variable with an optional function name or ch...
Definition: ExpressionParser2Node.h:197
A number node. For example: "123". Its type is always "number".
Definition: ExpressionParser2Node.h:154
The name of a function to call on an object or the behavior For example: "MyObject....
Definition: ExpressionParser2Node.h:314
An operator node. For example: "lhs + rhs".
Definition: ExpressionParser2Node.h:122
Definition: ExpressionParser2Node.h:108
A text node. For example: "Hello World". Its type is always "string".
Definition: ExpressionParser2Node.h:170
A unary operator node. For example: "-2".
Definition: ExpressionParser2Node.h:138
A direct accessor to a child variable. Example: MyChild in MyVariable.MyChild.
Definition: ExpressionParser2Node.h:275
A bracket accessor to a child variable. Example: ["MyChild"] (in MyVariable["MyChild"]).
Definition: ExpressionParser2Node.h:293
A variable, or object variable, with bracket accessor or at least 2 "dot" accessors.
Definition: ExpressionParser2Node.h:254