6 #ifndef GDCORE_EXPRESSIONTYPEFINDER_H
7 #define GDCORE_EXPRESSIONTYPEFINDER_H
11 #include "GDCore/Events/Parsers/ExpressionParser2Node.h"
12 #include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
13 #include "GDCore/IDE/Events/ExpressionLeftSideTypeFinder.h"
14 #include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
15 #include "GDCore/Extensions/Metadata/MetadataProvider.h"
16 #include "GDCore/Extensions/Metadata/ObjectMetadata.h"
17 #include "GDCore/Extensions/Metadata/ParameterMetadata.h"
18 #include "GDCore/Project/ProjectScopedContainers.h"
23 class ObjectsContainer;
25 class ParameterMetadata;
26 class ExpressionMetadata;
57 platform, projectScopedContainers, rootType);
58 node.Visit(typeFinder);
68 : platform(platform_),
69 projectScopedContainers(projectScopedContainers_),
71 type(ExpressionTypeFinder::unknownType),
78 void OnVisitSubExpressionNode(SubExpressionNode& node)
override {
81 void OnVisitOperatorNode(OperatorNode& node)
override {
84 void OnVisitUnaryOperatorNode(UnaryOperatorNode& node)
override {
87 void OnVisitNumberNode(NumberNode& node)
override {
88 type = ExpressionTypeFinder::numberType;
90 void OnVisitTextNode(TextNode& node)
override {
91 type = ExpressionTypeFinder::stringType;
93 void OnVisitVariableNode(VariableNode& node)
override {
96 void OnVisitVariableAccessorNode(VariableAccessorNode& node)
override {
99 void OnVisitIdentifierNode(IdentifierNode& node)
override {
102 void OnVisitEmptyNode(EmptyNode& node)
override {
105 void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode& node)
override {
108 void OnVisitVariableBracketAccessorNode(
109 VariableBracketAccessorNode& node)
override {
110 if (child ==
nullptr) {
111 type = ExpressionTypeFinder::unknownType;
115 projectScopedContainers,
121 if (leftSideType == ExpressionTypeFinder::numberType
122 || leftSideType == ExpressionTypeFinder::stringType) {
126 type = ExpressionTypeFinder::numberOrStringType;
129 void OnVisitFunctionCallNode(FunctionCallNode& node)
override {
130 if (child ==
nullptr) {
132 platform, projectScopedContainers.GetObjectsContainersList(), node);
133 if (gd::MetadataProvider::IsBadExpressionMetadata(metadata)) {
137 type = metadata.GetReturnType();
142 gd::MetadataProvider::GetFunctionCallParameterMetadata(
144 projectScopedContainers.GetObjectsContainersList(),
147 if (parameterMetadata ==
nullptr || parameterMetadata->
GetType().
empty()) {
148 type = ExpressionTypeFinder::unknownType;
151 type = parameterMetadata->
GetType();
157 inline void VisitParent(ExpressionNode& node) {
159 if (node.parent !=
nullptr) {
160 node.parent->Visit(*
this);
162 else if (rootType == ExpressionTypeFinder::numberOrStringType) {
165 projectScopedContainers,
167 if (leftSideType == ExpressionTypeFinder::numberType
168 || leftSideType == ExpressionTypeFinder::stringType) {
186 ExpressionNode *child;
static const gd::String GetType(const gd::Platform &platform, const gd::ProjectScopedContainers &projectScopedContainers, gd::ExpressionNode &node)
Helper function to find the type of the node at the left side of operations.
Definition: ExpressionLeftSideTypeFinder.h:42
The interface for any worker class ("visitor" pattern) that want to interact with the nodes of a pars...
Definition: ExpressionParser2NodeWorker.h:36
Find the type of the expression or sub-expression that a given node represents.
Definition: ExpressionTypeFinder.h:45
static const gd::String GetType(const gd::Platform &platform, const gd::ProjectScopedContainers &projectScopedContainers, const gd::String &rootType, gd::ExpressionNode &node)
Helper function to find the type of the expression or sub-expression that a given node represents.
Definition: ExpressionTypeFinder.h:52
Holds references to variables, objects, properties and other containers.
Definition: ProjectScopedContainers.h:30
String represents an UTF8 encoded string.
Definition: String.h:31
bool empty() const
Returns true if the string is empty.
Definition: String.h:155
Definition: CommonTools.h:24
The base node, from which all nodes in the tree of an expression inherits from.
Definition: ExpressionParser2Node.h:93