UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SemanticFunction.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2// uLang Compiler Public API
3
4#pragma once
5
15
16#define UE_API VERSECOMPILER_API
17
18namespace uLang
19{
20
22{
23 Simple = 0x0, // function(:Type1,:Type2)
24 Qualified = 1<<1, // Prepends the scope `(/MyModule:)` (unless async or native) and then the name of the function
25 QualifiedParams = 1<<2, // Preform similar qualification of parameters
28};
29
30/* No longer used, but good ideas
31enum class EFunctionStringFlag : uint16_t
32{
33 // Name part - omitted or one of:
34 Name = 1<<0, // Prepend name of function
35 Qualified = 1<<1, // Prepends the scope `(/MyModule:)` and then the name of the function
36
37 // Type signature part - omitted or one of:
38 SigSimple = 1<<2, // Include just parentheses ()
39 SigTyped = 1<<3, // Include parentheses (), any parameter names and types and result type (param1 : Type1, param2 : Type2) : ResultType
40 SigDefaults = 1<<4, // Include parentheses (), any parameter names, types and defaults and result type (param1 : Type1, param2 : Type2 = default2 ) : ResultType
41
42 // Body - omitted or one of:
43 BodyIndicator = 1<<5, // {...} for uLang body and empty for atomic C++ body
44 Body = 1<<6, // full uLang body or empty for atomic C++ body
45
46 // Spacing - omitted (canonical with multi-line) or:
47 Inline = 1<<7, // try to have everything on one line
48
49 // Masks
50 Default_ = Qualified|SigDefaults|Body, // MyClass@function(param1 : Type1, param2 : Type2 = default2 ) : ResultType { }
51 DefaultUnnamed_ = SigDefaults|Body, // (param1 : Type1, param2 : Type2 = default2 ) : ResultType { }
52 DefaultIdent_ = Qualified|SigSimple, // MyClass@function()
53
54 Named_ = Name|Qualified,
55 Signature_ = SigSimple|SigTyped|SigDefaults,
56 Body_ = BodyIndicator|Body,
57 Unimplemented_ = SigTyped|SigDefaults|Body
58};
59*/
60
68
74class CFunction : public CDefinition, public CLogicalScope, public CCaptureScope
75{
76public:
77 static const CDefinition::EKind StaticDefinitionKind = CDefinition::EKind::Function;
79
82
84
85 const CFunctionType* _NegativeType = nullptr;
86
92
93 UE_API CFunction(const int32_t Index, const CSymbol& FunctionName, CScope& EnclosingScope);
94
95 UE_API int32_t Index() const;
96
97 //~ Begin CScope interface
98 virtual CSymbol GetScopeName() const override { return CNamed::GetName(); }
99 virtual const CDefinition* ScopeAsDefinition() const override { return this; }
100 //~ End CScope interface
101
113
115 {
116 const CFunction* I = this;
117 for (;;)
118 {
120 {
121 break;
122 }
124 if (!Next)
125 {
126 break;
127 }
128 I = Next;
129 }
130 return *I;
131 }
132
135
136 TSPtr<CExpressionBase> GetBodyAst() const { ULANG_ASSERTF(!GetIrNode(true), "Called AST function on when IR available"); return GetAstNode() ? GetAstNode()->Value() : nullptr; }
137
139
141
142 TSPtr<CExpressionBase> GetReturnTypeAst() const { ULANG_ASSERTF(!GetIrNode(true), "Called AST function on when IR available"); return GetAstNode() ? GetAstNode()->ValueDomain() : nullptr; }
143
144 TSPtr<CExpressionBase> GetDefineeAst() const { ULANG_ASSERTF(!GetIrNode(true), "Called AST function on when IR available"); return GetAstNode() ? GetAstNode()->Element() : nullptr; }
145
146 CExpressionBase* GetBodyIr() const { return GetIrNode()->Value(); }
147
149
151
153
154 SemanticRevision GetRevision() const { return CMath::Max(_SignatureRevision, _BodyRevision); }
155 SemanticRevision GetSignatureRevision() const { return _SignatureRevision; }
156 SemanticRevision GetBodyRevision() const { return _BodyRevision; }
157
169
172
173 /* Returns the qualifier in canonical form */
175
176 void MarkCoercion(const CFunction& CoercedFrom) { _CoercedOriginalFunction = &CoercedFrom; }
177
178 bool IsCoercion() const { return _CoercedOriginalFunction != nullptr; }
179
180 void MarkCoercedOverride() { _bCoercedOverride = true; }
181
182 bool IsCoercedOverride() const { return _bCoercedOverride; }
183
184 UE_API bool HasImplementation() const;
185
186 UE_API bool IsNative() const;
187
188 UE_API bool IsConstructor() const;
189
190 // CDefinition interface.
192 const CFunction* GetPrototypeDefinition() const { return static_cast<const CFunction*>(CDefinition::GetPrototypeDefinition()); }
193
196
198 UE_API CExprFunctionDefinition* GetIrNode(bool bForce = false) const;
199
200 virtual const CLogicalScope* DefinitionAsLogicalScopeNullable() const override { return this; }
201
202 virtual bool IsPersistenceCompatConstraint() const override { return false; }
203
204 virtual CCaptureScope* GetParentCaptureScope() const override
205 {
207 }
208
209 mutable bool _bIsAccessorOfSomeClassVar = false; // HACK: using mutable here to set this after the fact
210
211 UE_API bool CanBeCalledFromPredicts() const;
213
214private:
215 const int32_t _Index;
216
219 const CFunction* _CoercedOriginalFunction{nullptr};
220
224 bool _bCoercedOverride{false};
225
227 SemanticRevision _SignatureRevision;
228
230 SemanticRevision _BodyRevision;
231};
232
233} // namespace uLang
234
235#undef UE_API
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_API
Definition SColorGradingComponentViewer.h:12
#define ULANG_ASSERTF(expr, format,...)
Definition Common.h:290
Definition CaptureScope.h:13
Definition Definition.h:131
const CDefinition * GetPrototypeDefinition() const
Definition Definition.h:219
CScope & _EnclosingScope
Definition Definition.h:141
const CDefinition & GetBaseOverriddenDefinition() const
Definition Definition.h:206
EKind
Definition Definition.h:135
void SetPrototypeDefinition(const CDefinition &PrototypeDefinition)
Definition Definition.h:324
const CDefinition * GetOverriddenDefinition() const
Definition Definition.h:202
void SetOverriddenDefinition(const CDefinition &OverriddenDefinition)
Definition Definition.h:294
TDefinition & AsChecked()
Definition Definition.h:368
Definition Expression.h:2950
const TSPtr< CExpressionBase > & Value() const
Definition Expression.h:1273
const TSPtr< CExpressionBase > & ValueDomain() const
Definition Expression.h:1269
const TSPtr< CExpressionBase > & Element() const
Definition Expression.h:1261
Definition Expression.h:3221
Definition Expression.h:2918
Definition Expression.h:387
Definition SemanticTypes.h:1055
Definition SemanticFunction.h:75
virtual const CLogicalScope * DefinitionAsLogicalScopeNullable() const override
Definition SemanticFunction.h:200
UE_API const CFunction * GetPredictsCoercedOriginalFunction() const
Definition SemanticFunction.cpp:254
void SetOverriddenDefinition(const CFunction *OverriddenDefinition)
Definition SemanticFunction.h:103
void SetPrototypeDefinition(const CFunction &PrototypeDefinition)
Definition SemanticFunction.h:191
void SetOverriddenDefinition(const CFunction &OverriddenDefinition)
Definition SemanticFunction.h:102
static const CDefinition::EKind StaticDefinitionKind
Definition SemanticFunction.h:77
TSPtr< CExpressionBase > GetReturnTypeAst() const
Definition SemanticFunction.h:142
SSignature _Signature
Signature - parameter interface.
Definition SemanticFunction.h:81
const CFunctionType * _NegativeType
Definition SemanticFunction.h:85
UE_API bool IsConstructor() const
Definition SemanticFunction.cpp:225
SemanticRevision GetRevision() const
Definition SemanticFunction.h:154
UE_API TSPtr< CExprClassDefinition > GetBodyClassDefinitionAst() const
Definition SemanticFunction.cpp:57
UE_API bool CanBeCalledFromPredicts() const
Definition SemanticFunction.cpp:249
void MarkCoercedOverride()
Definition SemanticFunction.h:180
UE_API int32_t Index() const
Definition SemanticFunction.cpp:26
UE_API CExprFunctionDefinition * GetAstNode() const
Definition SemanticFunction.cpp:235
UE_API TSPtr< CExprInterfaceDefinition > GetBodyInterfaceDefinitionAst() const
Definition SemanticFunction.cpp:70
UE_API void SetIrNode(CExprFunctionDefinition *AstNode)
Definition SemanticFunction.cpp:240
UE_API void SetAstNode(CExprFunctionDefinition *AstNode)
Definition SemanticFunction.cpp:231
virtual CCaptureScope * GetParentCaptureScope() const override
Definition SemanticFunction.h:204
bool IsCoercedOverride() const
Definition SemanticFunction.h:182
UE_API void MapSignature(const CFunctionType &FuncType, SemanticRevision NextRevision)
Definition SemanticFunction.cpp:40
virtual const CDefinition * ScopeAsDefinition() const override
Definition SemanticFunction.h:99
UE_API CExprInterfaceDefinition * GetBodyInterfaceDefinitionIr() const
Definition SemanticFunction.cpp:95
const CFunction * GetPrototypeDefinition() const
Definition SemanticFunction.h:192
const CFunction & GetBaseCoercedOverriddenFunction() const
Definition SemanticFunction.h:114
UE_API CUTF8String GetDecoratedName(uint16_t StrFlags=uint16_t(EFunctionStringFlag::QualifiedVersion2)) const
Definition SemanticFunction.cpp:148
void MarkCoercion(const CFunction &CoercedFrom)
Definition SemanticFunction.h:176
UE_API CExprFunctionDefinition * GetIrNode(bool bForce=false) const
Definition SemanticFunction.cpp:244
EExtensionFieldAccessorKind _ExtensionFieldAccessorKind
Definition SemanticFunction.h:83
UE_API CUTF8String GetQualifier() const
Definition SemanticFunction.cpp:210
bool IsCoercion() const
Definition SemanticFunction.h:178
UE_API TOptional< const CClass * > GetMaybeClassScope() const
Definition SemanticFunction.cpp:107
virtual CSymbol GetScopeName() const override
Definition SemanticFunction.h:98
UE_API TOptional< const CNominalType * > GetMaybeContextType() const
Definition SemanticFunction.cpp:131
UE_API TOptional< const CModule * > GetMaybeModuleScope() const
Definition SemanticFunction.cpp:125
UE_API void SetSignature(SSignature &&Signature, SemanticRevision NextRevision)
Definition SemanticFunction.cpp:31
UE_API bool HasImplementation() const
Definition SemanticFunction.cpp:215
const CFunction * GetOverriddenDefinition() const
Definition SemanticFunction.h:104
UE_API bool IsNative() const
Definition SemanticFunction.cpp:220
TSPtr< CExpressionBase > GetDefineeAst() const
Definition SemanticFunction.h:144
const CFunction & GetBaseOverriddenDefinition() const
Definition SemanticFunction.h:109
CExpressionBase * GetBodyIr() const
Definition SemanticFunction.h:146
CExpressionBase * GetReturnTypeIr() const
Definition SemanticFunction.h:152
TArray< const CFunction * > _LowerIdenticalFunctions
Definition SemanticFunction.h:91
SemanticRevision GetSignatureRevision() const
Definition SemanticFunction.h:155
bool _bIsAccessorOfSomeClassVar
Definition SemanticFunction.h:209
TSPtr< CExpressionBase > GetBodyAst() const
Definition SemanticFunction.h:136
virtual bool IsPersistenceCompatConstraint() const override
Definition SemanticFunction.h:202
UE_API CExprClassDefinition * GetBodyClassDefinitionIr() const
Definition SemanticFunction.cpp:83
SemanticRevision GetBodyRevision() const
Definition SemanticFunction.h:156
Definition SemanticScope.h:242
static ULANG_FORCEINLINE constexpr T Max(const T A, const T B)
Returns higher value in a generic way.
Definition MathUtils.h:19
ULANG_FORCEINLINE const CSymbol & GetName() const
Definition Named.h:41
Definition SemanticScope.h:73
UE_API CCaptureScope * GetCaptureScope()
Definition SemanticScope.cpp:238
Symbol representing a text string with an associated id.
Definition Symbol.h:98
Definition Array.h:51
Definition SharedPointer.h:77
Definition VVMEngineEnvironment.h:23
EExtensionFieldAccessorKind
Definition SemanticFunction.h:63
uint32_t SemanticRevision
For storing revisions of functions, classes etc.
Definition Revision.h:11
EFunctionStringFlag
Definition SemanticFunction.h:22
U16 Index
Definition radfft.cpp:71
Definition Signature.h:17
Definition Optional.h:23