UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SemanticClass.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
19
20#define UE_API VERSECOMPILER_API
21
22namespace uLang
23{
24
25// Forward declarations
26class CClassDefinition;
27
32class CClass : public CNominalType, public CLogicalScope
33{
34public:
35 static const ETypeKind StaticTypeKind = ETypeKind::Class;
36 static const CDefinition::EKind StaticDefinitionKind = CDefinition::EKind::Class;
37
38 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39 // Public data
43
45 // Flattened array of all interfaces this class inherits (including interfaces from its super-class).
46 // Not initially filled out -- cached after we've fully constructed the whole type hierarchy.
48
50
51 // Kept alive via _Definition's IrNode's (CExprClassDefinition) Members field.
52 // We don't hold a shared reference to this because the Ir tree has to be
53 // destroyed before the AST.
55
57
59
61
63
65
66 bool _bHasCyclesBroken{false};
67
68 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69 // Methods
70
71 // Construct a generalized positive class
75 CClass* Superclass = nullptr,
76 TArray<CInterface*>&& SuperInterfaces = {},
78 SEffectSet ConstructorEffects = EffectSets::ClassAndInterfaceDefault);
79
80 // Construct a positive class instantiation
81 UE_API CClass(
83 CClassDefinition*,
85 CClass* Superclass,
86 TArray<CInterface*>&& SuperInterfaces,
87 SEffectSet ConstructorEffects,
88 CClass* GeneralizedClass,
90
91 // Construct a negative class from a positive class
92 UE_API explicit CClass(CClass* PositiveClass);
93
95
96 UE_API const CTypeType* GetTypeType() const;
97
98 UE_API void SetSuperclass(CClass* SuperClass);
99
101 bool IsClass(const CClass& Class) const;
102
104 bool IsSubclassOf(const CClass& Superclass) const;
105
107 bool IsSuperclassOf(const CClass& Subclass) const;
108
110 UE_API bool ImplementsInterface(const CInterface& Interface) const;
111
114
115 bool IsNative() const { return Definition()->IsNative(); }
116
117 bool IsNativeRepresentation() const;
118
119 UE_API bool IsAbstract() const;
120
121 UE_API bool IsPersistent() const;
122
123 UE_API bool IsUnique() const;
124
126 UE_API bool HasConcreteAttribute() const;
127
129 UE_API const CClass* FindConcreteBase() const;
130
133
135 bool IsExplicitlyConcrete() const override { return FindConcreteBase() != nullptr; }
136
138 UE_API bool HasCastableAttribute() const;
139
142
144 bool IsExplicitlyCastable() const override { return FindExplicitlyCastableBase() != nullptr; }
145
148
150 UE_API bool HasFinalSuperAttribute() const;
151
152 // CScope interface
153 virtual CSymbol GetScopeName() const override { return Definition()->GetName(); }
154 virtual const CTypeBase* ScopeAsType() const override { return this; }
155 virtual const CDefinition* ScopeAsDefinition() const override { return Definition(); }
156 UE_API virtual SAccessLevel GetDefaultDefinitionAccessLevel() const override;
158 UE_API virtual void CreateNegativeFunction(const CFunction& PositiveFunction) const override;
159
160 // CLogicalScope interface.
162 const CSymbol& Name,
164 const SQualifier& Qualifier = SQualifier::Unknown(),
165 const CAstPackage* ContextPackage = nullptr,
167
168 // CTypeBase interface.
171 UE_API virtual EComparability GetComparability() const override;
173 UE_API bool IsPersistable() const override;
174 virtual void SetRevision(SemanticRevision Revision) override;
175 virtual bool CanBeCustomAccessorDataType() const override { return true; }
176 virtual bool CanBePredictsVarDataType() const override { return !IsStruct(); }
177
178 // CNominalType interface.
179 virtual const CDefinition* Definition() const override;
180
181 template<typename TFunc>
183 {
185 {
186 Func(Interface, nullptr, Interface);
187 }
189 {
190 Func(Class, Class, nullptr);
191 }
192 }
193
194 bool HasAttributeClass(const CClass* AttributeClass, const CSemanticProgram& Program) const;
195 bool HasAttributeSubclass(const CClass* AttributeClass, const CSemanticProgram& Program) const;
196
197 UE_API void AddAttribute(SAttribute) const;
198 TOptional<SAttribute> FindAttribute(const CClass* AttributeClass, const CSemanticProgram& Program) const;
199 bool HasCyclesBroken() const;
204}; // CClass
205
244
246{
247public:
249 : CInstantiatedType(Program, Polarity, Move(Arguments))
250 , _Class(&Class)
251 {
252 }
253
254 virtual bool CanBeCustomAccessorDataType() const override { return true; };
255
256protected:
257 UE_API virtual const CNormalType& CreateNormalType() const override;
258
259private:
260 const CClass* _Class;
261};
262
263// Eagerly instantiate a class.
265
267
268//=======================================================================================
269// CClass Inline Methods
270//=======================================================================================
271
272//---------------------------------------------------------------------------------------
273inline const CDefinition* CClass::Definition() const
274{
275 return _Definition;
276}
277
278//---------------------------------------------------------------------------------------
280{
281 // TODO-Verse: add _Subclasses
283}
284
285//---------------------------------------------------------------------------------------
287{
289 const CClass* RelatedClass = this;
290
291 do
292 {
293 if (SeenClasses.Contains(RelatedClass))
294 {
295 return false;
296 }
298
299 if (RelatedClass == &Class)
300 {
301 return true;
302 }
303
305 } while (RelatedClass);
306
307 return false;
308}
309
310//---------------------------------------------------------------------------------------
312{
314
316
317 while (RelatedClass)
318 {
319 if (RelatedClass == &Superclass)
320 {
321 return true;
322 }
323
325 }
326
327 return false;
328}
329
330//---------------------------------------------------------------------------------------
332{
334
335 while (RelatedClass)
336 {
337 if (RelatedClass == this)
338 {
339 return true;
340 }
341
343 }
344
345 return false;
346}
347
348//---------------------------------------------------------------------------------------
350{
351 CClass* Class = this;
352 do
353 {
354 ULANG_ENSUREF(Revision >= Class->GetRevision(), "Revision to be set must not be smaller than existing revisions.");
355 if (Class->GetRevision() == Revision)
356 {
357 break;
358 }
359
360 Class->CLogicalScope::SetRevision(Revision);
361 Class = Class->_Superclass;
362 } while (Class);
363}
364
365inline bool CClass::HasAttributeClass(const CClass* AttributeClass, const CSemanticProgram& Program) const
366{
367 return _Definition->HasAttributeClass(AttributeClass, Program);
368}
369
370inline bool CClass::HasAttributeSubclass(const CClass* AttributeClass, const CSemanticProgram& Program) const
371{
372 return _Definition->HasAttributeSubclass(AttributeClass, Program);
373}
374
379
381{
382 return _Definition->FindAttribute(AttributeClass, Program);
383}
384
385inline bool CClass::HasCyclesBroken() const
386{
388}
389
390} // namespace uLang
391
392#undef UE_API
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Num
Definition MetalRHIPrivate.h:234
#define UE_API
Definition SColorGradingComponentViewer.h:12
#define ULANG_ENSUREF(expr, format,...)
Definition Common.h:292
#define ULANG_ASSERT(expr)
Definition Common.h:285
#define ULANG_FORCEINLINE
Definition Common.h:188
Definition Array.h:670
Definition Expression.h:3494
Base class for everything that can have attributes attached to it (classes, expressions,...
Definition Attributable.h:51
UE_API bool HasAttributeClass(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition Attributable.cpp:89
UE_API bool HasAttributeSubclass(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition Attributable.cpp:94
UE_API void AddAttribute(SAttribute Attribute)
Definition Attributable.cpp:278
UE_API TOptional< SAttribute > FindAttribute(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition Attributable.cpp:209
Definition SemanticClass.h:207
CClassDefinition(const CSymbol &ClassName, CScope &EnclosingScope, CClass *Superclass=nullptr, TArray< CInterface * > &&SuperInterfaces={}, EStructOrClass StructOrClass=EStructOrClass::Class)
Definition SemanticClass.h:212
UE_API bool HasAttributeClass(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition Attributable.cpp:89
virtual const CLogicalScope * DefinitionAsLogicalScopeNullable() const override
Definition SemanticClass.h:238
virtual bool IsPersistenceCompatConstraint() const override
Definition SemanticClass.h:240
TOptional< SAccessLevel > _ConstructorAccessLevel
Definition SemanticClass.h:210
CAttributable _EffectAttributable
Definition SemanticClass.h:209
UE_API bool HasAttributeSubclass(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition Attributable.cpp:94
UE_API void SetIrNode(CExprClassDefinition *AstNode)
Definition SemanticClass.cpp:443
SAccessLevel DerivedConstructorAccessLevel() const
Definition SemanticClass.h:226
UE_API TArray< TSRef< CExpressionBase > > FindMembersWithPredictsAttribute(bool bIncludeSupers=false) const
Definition SemanticClass.cpp:407
UE_API CExprClassDefinition * GetAstNode() const
Definition SemanticClass.cpp:402
UE_API void SetAstNode(CExprClassDefinition *AstNode)
Definition SemanticClass.cpp:398
UE_API void AddAttribute(SAttribute Attribute)
Definition Attributable.cpp:278
UE_API CExprClassDefinition * GetIrNode(bool bForce=false) const
Definition SemanticClass.cpp:447
UE_API TOptional< SAttribute > FindAttribute(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition Attributable.cpp:209
Definition SemanticClass.h:33
UE_API bool HasFinalSuperAttribute() const
Does this class hold a <final_super> attribute?
Definition SemanticClass.cpp:184
virtual UE_API CUTF8String AsCodeRecursive(ETypeSyntaxPrecedence OuterPrecedence, TArray< const CFlowType * > &VisitedFlowTypes, bool bLinkable, ETypeStringFlag Flag) const override
Definition SemanticClass.cpp:208
bool HasCyclesBroken() const
Definition SemanticClass.h:385
virtual UE_API void CreateNegativeDataDefinition(const CDataDefinition &PositiveDataDefinition) const override
Definition SemanticClass.cpp:197
virtual UE_API SmallDefinitionArray FindDefinitions(const CSymbol &Name, EMemberOrigin Origin=EMemberOrigin::InheritedOrOriginal, const SQualifier &Qualifier=SQualifier::Unknown(), const CAstPackage *ContextPackage=nullptr, VisitStampType VisitStamp=GenerateNewVisitStamp()) const override
Definition SemanticClass.cpp:262
TArray< CInterface * > _AllInheritedInterfaces
Definition SemanticClass.h:47
UE_API bool IsUnique() const
Definition SemanticClass.cpp:98
const EStructOrClass _StructOrClass
Definition SemanticClass.h:41
TArray< CInterface * > _SuperInterfaces
Definition SemanticClass.h:44
UE_API bool ImplementsInterface(const CInterface &Interface) const
Determine if current class implements Interface
Definition SemanticClass.cpp:382
bool IsNativeRepresentation() const
Definition SemanticClass.cpp:72
virtual const CDefinition * ScopeAsDefinition() const override
Definition SemanticClass.h:155
UE_API bool IsPersistable() const override
Definition SemanticClass.cpp:377
bool IsExplicitlyCastable() const override
Is this class castable either by having a castable attribute or inheriting one.
Definition SemanticClass.h:144
CClassDefinition *const _Definition
Definition SemanticClass.h:40
void ForEachAncestorClassOrInterface(const TFunc &Func)
Definition SemanticClass.h:182
UE_API void SetSuperclass(CClass *SuperClass)
Definition SemanticClass.h:279
UE_API bool HasCastableAttribute() const
Does this class hold a castable attribute?
Definition SemanticClass.cpp:153
virtual const CTypeBase * ScopeAsType() const override
Definition SemanticClass.h:154
CClass * _GeneralizedClass
Definition SemanticClass.h:56
bool HasAttributeClass(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition SemanticClass.h:365
TArray< STypeVariableSubstitution > _TypeVariableSubstitutions
Definition SemanticClass.h:58
UE_API const CClass * FindInitialConcreteBase() const
Return topmost class in the inheritance chain that contains the concrete attribute or null.
Definition SemanticClass.cpp:140
static const CDefinition::EKind StaticDefinitionKind
Definition SemanticClass.h:36
bool _bHasCyclesBroken
Definition SemanticClass.h:66
SEffectSet _ConstructorEffects
Definition SemanticClass.h:49
bool HasAttributeSubclass(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition SemanticClass.h:370
virtual bool CanBePredictsVarDataType() const override
Definition SemanticClass.h:176
bool IsSuperclassOf(const CClass &Subclass) const
Determine if current class is a superclass / ancestor / parent of the specified Class (and not the sa...
Definition SemanticClass.h:331
bool IsStruct() const
Is this class a struct?
Definition SemanticClass.h:113
bool IsClass(const CClass &Class) const
Determine if current class is the same class or a subclass of the specified Class
Definition SemanticClass.h:286
UE_API bool HasFinalSuperBaseAttribute() const
Does this class hold a <final_super_base> attribute?
Definition SemanticClass.cpp:179
virtual UE_API SmallDefinitionArray FindInstanceMember(const CSymbol &Name, EMemberOrigin Origin, const SQualifier &Qualifier=SQualifier::Unknown(), const CAstPackage *ContextPackage=nullptr, VisitStampType VisitStamp=CScope::GenerateNewVisitStamp()) const override
Definition SemanticClass.cpp:272
UE_API void AddAttribute(SAttribute) const
Definition SemanticClass.h:375
UE_API bool HasConcreteAttribute() const
Does this class hold a concrete attribute?
Definition SemanticClass.cpp:122
TURefArray< CClass > _InstantiatedClasses
Definition SemanticClass.h:60
virtual const CDefinition * Definition() const override
Definition SemanticClass.h:273
TOptional< SAttribute > FindAttribute(const CClass *AttributeClass, const CSemanticProgram &Program) const
Definition SemanticClass.h:380
virtual bool CanBeCustomAccessorDataType() const override
Definition SemanticClass.h:175
virtual UE_API void CreateNegativeFunction(const CFunction &PositiveFunction) const override
Definition SemanticClass.cpp:203
virtual CSymbol GetScopeName() const override
Definition SemanticClass.h:153
UE_API const CTypeType * GetTypeType() const
Definition SemanticClass.cpp:66
UE_API const CNominalType * FindExplicitlyCastableBase() const
Return first class in the inheritance chain that contains the castable attribute. Otherwise null.
Definition SemanticClass.cpp:158
static const ETypeKind StaticTypeKind
Definition SemanticClass.h:35
virtual void SetRevision(SemanticRevision Revision) override
Definition SemanticClass.h:349
UE_API bool IsPersistent() const
Definition SemanticClass.cpp:92
CClass * _Superclass
Definition SemanticClass.h:42
UE_API bool IsAbstract() const
Definition SemanticClass.cpp:87
bool IsParametric() const
Definition SemanticClass.h:200
virtual UE_API EComparability GetComparability() const override
Definition SemanticClass.cpp:303
bool IsExplicitlyConcrete() const override
Is this class concrete either by having a concrete attribute or inheriting one.
Definition SemanticClass.h:135
CClass * _NegativeClass
Definition SemanticClass.h:64
TUPtr< CClass > _OwnedNegativeClass
Definition SemanticClass.h:62
TArray< CExprCodeBlock * > _IrBlockClauses
Definition SemanticClass.h:54
UE_API const CClass * FindConcreteBase() const
Return first class in the inheritance chain that contains the concrete attribute or null.
Definition SemanticClass.cpp:127
bool IsSubclassOf(const CClass &Superclass) const
Determine if current class is a subclass / descendant / child of the specified Class (and not the sam...
Definition SemanticClass.h:311
bool IsNative() const
Definition SemanticClass.h:115
virtual UE_API SAccessLevel GetDefaultDefinitionAccessLevel() const override
Definition SemanticClass.cpp:189
Definition DataDefinition.h:41
Definition Definition.h:131
UE_API bool IsNative() const
Definition Definition.cpp:106
EKind
Definition Definition.h:135
Definition Expression.h:2950
Definition SemanticFunction.h:75
Definition SemanticClass.h:246
virtual bool CanBeCustomAccessorDataType() const override
Definition SemanticClass.h:254
CInstantiatedClass(CSemanticProgram &Program, const CClass &Class, ETypePolarity Polarity, TArray< STypeVariableSubstitution > Arguments)
Definition SemanticClass.h:248
virtual UE_API const CNormalType & CreateNormalType() const override
Definition SemanticClass.cpp:452
Definition SemanticTypes.h:1228
Definition SemanticInterface.h:25
Definition SemanticScope.h:242
friend class CScope
Definition SemanticScope.h:313
ULANG_FORCEINLINE const CSymbol & GetName() const
Definition Named.h:41
Class defining instance and class objects.
Definition SemanticTypes.h:608
A normal type: a head normal form of types where the head is not a parametric type instantiation.
Definition SemanticTypes.h:217
Definition SemanticScope.h:73
static UE_API VisitStampType GenerateNewVisitStamp()
Generates a new stamp id.
Definition SemanticScope.cpp:562
Definition SemanticProgram.h:277
Symbol representing a text string with an associated id.
Definition Symbol.h:98
Base class for all types.
Definition SemanticTypes.h:138
CSemanticProgram & GetProgram() const
Definition SemanticTypes.h:143
Definition Array.h:51
Definition UniquePointerArray.h:16
Definition UniquePointer.h:15
Definition VVMEngineEnvironment.h:23
ETypeSyntaxPrecedence
Definition SemanticTypes.h:100
CClass * InstantiateClass(const CClass &Class, ETypePolarity Polarity, const TArray< STypeVariableSubstitution > &Substitutions)
Definition SemanticClass.cpp:566
uint32_t VisitStampType
Used to mark scopes already visited during a search.
Definition VisitStamp.h:11
ETypePolarity
Definition SemanticTypes.h:1131
ETypeKind
Definition SemanticTypes.h:92
EStructOrClass
Definition StructOrClass.h:8
uint32_t SemanticRevision
For storing revisions of functions, classes etc.
Definition Revision.h:11
ETypeStringFlag
Definition SemanticTypes.h:121
ULANG_FORCEINLINE TRemoveReference< T >::Type && Move(T &&Obj)
Definition References.h:86
EComparability
Definition SemanticTypes.h:113
EMemberOrigin
Specifies whether to find only member definitions originating in the current type,...
Definition MemberOrigin.h:10
void SetNegativeClassMemberDefinitionTypes(const CClass &PositiveClass)
Definition SemanticClass.cpp:581
Definition AccessLevel.h:15
Definition Attributable.h:20
Definition Effects.h:46
Information about a given qualifier.
Definition Definition.h:35
static SQualifier Unknown()
Definition Definition.h:81
Definition Optional.h:23