UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SemanticScope.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
18
19#define UE_API VERSECOMPILER_API
20
21namespace uLang
22{
23struct SAccessLevel;
24struct SQualifier;
25class CAstPackage;
26class CAstCompilationUnit;
27class CCaptureControlScope;
28class CControlScope;
29class CClass;
30class CClassDefinition;
31class CDataDefinition;
32class CEnumeration;
33class CEnumerator;
34class CFunction;
35class CInterface;
36class CLogicalScope;
37class CModule;
38class CModulePart;
39class CModuleAlias;
40class CSnippet;
41class CSemanticAnalyzerImpl;
42class CSemanticProgram;
43class CScopedAccessLevelDefinition;
44class CTypeBase;
45class CTypeAlias;
46class CTypeScope;
47class CTypeType;
48class CTypeVariable;
49
61
66
68
72class CScope
73{
74public:
75 enum class EKind : uint8_t
76 {
77 Program,
79 Module,
81 Snippet,
82 Class,
84 ControlScope, // A nested scope within a function body
86 Type,
88 };
89
90 static UE_API const char* KindToCString(EKind Kind);
91
93 UE_API virtual ~CScope();
94
95 // Delete the generated move/copy constructors so that they don't require full definitions of the types referenced by TSRefArray.
96 CScope(const CScope&) = delete;
97 CScope(CScope&&) = delete;
98
99 virtual CSymbol GetScopeName() const = 0;
100 virtual const CTypeBase* ScopeAsType() const { return nullptr; }
101 virtual const CDefinition* ScopeAsDefinition() const { return nullptr; }
102
104
108 UE_API const CScope* GetScopeOfKind(EKind) const;
111 UE_API const CModule* GetModule() const;
113 UE_API const CModulePart* GetModulePart() const;
117 UE_API const CSnippet* GetSnippet() const;
119 UE_API const CCaptureScope* GetCaptureScope() const;
122
124 UE_API const CScope& GetParametricTypeScope() const;
125
127 UE_API const CLogicalScope& GetLogicalScope() const;
128 ULANG_FORCEINLINE CLogicalScope& GetLogicalScope() { return const_cast<CLogicalScope&>(static_cast<const CScope*>(this)->GetLogicalScope()); }
129
131 virtual const CLogicalScope* AsLogicalScopeNullable() const { return nullptr; }
132 virtual CLogicalScope* AsLogicalScopeNullable() { return nullptr; }
133
134 ULANG_FORCEINLINE bool IsLogicalScope() const { return AsLogicalScopeNullable() != nullptr; }
135
136 const CLogicalScope* GetEnclosingClassOrInterface() const { return const_cast<CScope*>(this)->GetEnclosingClassOrInterface(); }
138
139 // Check if this module is the same or a child of another
140 UE_API bool IsSameOrChildOf(const CScope* Other) const;
141
142 // Determines if this is either a function body or a nested scope within a function body
144
145 // Determines if inside a type scope, ignoring control scope
146 UE_API bool IsInsideTypeScope() const;
147
148 // Determines if this is a module or snippet scope.
150
151 // Determines if the definitions in this scope are built-in.
152 UE_API bool IsBuiltInScope() const;
153
154 UE_API CModule& CreateModule(const CSymbol& ModuleName);
156 UE_API CEnumeration& CreateEnumeration(const CSymbol& EnumerationName);
157 UE_API CInterface& CreateInterface(const CSymbol& InterfaceName, const TArray<CInterface*>& SuperInterfaces = {});
158 UE_API TSRef<CFunction> CreateFunction(const CSymbol FunctionName);
164 UE_API TSRef<CTypeVariable> CreateTypeVariable(const CSymbol Name, const CTypeBase* NegativeType, const CTypeBase* PositiveType);
167
168 // Using declarations
171
172 // Add a local context to infer from a using declaration - return nullptr if added and conflicting context if type/value domain was already previously added
173 UE_API const CDataDefinition* AddUsingInstance(const CDataDefinition* UsingContext);
175
178
181
183
185
187
189
192
193 // Determines whether this scope was authored by Epic
194 UE_API bool IsAuthoredByEpic() const;
195
196 // Determines whether this scope can access Epic-internal definitions.
197 // This differs from IsAuthoredByEpic by allowing packages with Scope=InternalUser to access epic-internal definitions.
198 UE_API bool CanAccessEpicInternal() const;
199
200protected:
202 friend class CDefinition;
203 friend class CDataDefinition;
204 // Returns whether some definition is accessible from this scope.
205 // When checking accessibility, you probably want to use CDefinition::IsAccessibleFrom
206 // instead of this.
208
209 // If we are a program, module etc.
211
212 // The enclosing scope for this scope
214
215 // The semantic program these types belongs to
217
218 // `using` declarations referring to other scopes / modules
220
221 // `using` declarations referring to implied contexts / receivers
223
224 // Nested control scopes
226
227 // Nested type scopes
229
230private:
231 template <typename T>
232 static T* GetScopeOfKind(T* This, EKind Kind);
233
234 template <typename T, typename U>
235 static T* GetCaptureScope(U* This);
236};
237
241class CLogicalScope : public CScope
242{
243public:
244
246 UE_API virtual ~CLogicalScope();
247
248 // Delete the generated move/copy constructors so that they don't require full definitions of the types referenced by TSRefArray.
249 CLogicalScope(const CLogicalScope&) = delete;
251
255
256 const TArray<TSRef<CDefinition>>& GetDefinitions() const { return _Definitions; }
258
259 template<typename FilterClass>
261
263 const CSymbol& Name,
265 const SQualifier& Qualifier = SQualifier::Unknown(),
266 const CAstPackage* ContextPackage = nullptr,
268
269 template<typename FilterClass>
270 FilterClass* FindFirstDefinitionOfKind(
271 const CSymbol& Name,
273 const SQualifier& Qualifier = SQualifier::Unknown(),
274 const CAstPackage* ContextPackage = nullptr,
276
279
280 // If this scope has the given visit stamp, return false.
281 // Otherwise, mark this scope with the visit stamp and return true.
282 // Use CScope::GenerateNewVisitStamp to get a new visit stamp.
284 {
285 ULANG_ASSERTF(VisitStamp >= _LastVisitStamp, "Guard against situations where this is used in a nested context.");
286
288 {
289 return false;
290 }
291 else
292 {
294 return true;
295 }
296 }
297
298 // Allocates an ordinal for the next definition in this scope.
300 {
301 return _NextDefinitionOrdinal++;
302 }
303
306
307 // CScope interface.
308 virtual const CLogicalScope* AsLogicalScopeNullable() const override { return this; }
309 virtual CLogicalScope* AsLogicalScopeNullable() override { return this; }
310
312
313 friend class CScope;
314
316
317protected:
319 SemanticRevision _CumulativeRevision = 1; // Initialize semantic revision to 1 to trigger full rebuild on first compile
320
321 // To make sure we don't visit the same scope twice during an iteration
323
324private:
325 // All definitions in this scope.
326 TArray<TSRef<CDefinition>> _Definitions;
327
328 // These definition references depend on the _Definitions array to manage lifetimes:
329 // All the definitions mapped by name since that's how we often look them up
330 TMap<CSymbol, SmallDefinitionArray> _DefinitionNameMap;
331 // A collection of the _Definitions that are also logical scopes
332 TArray<const CLogicalScope*> _LogicalSubScopes;
333
334 // The next ordinal to assign to definitions within this scope.
335 int32_t _NextDefinitionOrdinal{ 0 };
336};
337
338template<typename FilterClass>
343
344template<typename FilterClass>
346{
347 SmallDefinitionArray Definitions = FindDefinitions(Name, Origin, Qualifier, ContextPackage, VisitStamp);
348 for (CDefinition* Definition : Definitions)
349 {
350 if (FilterClass* Result = Definition->AsNullable<FilterClass>())
351 {
352 return Result;
353 }
354 }
355 return nullptr;
356}
357
358};
359
360#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_FORCEINLINE
Definition Common.h:188
#define ULANG_ASSERTF(expr, format,...)
Definition Common.h:290
Definition Array.h:670
Definition Expression.h:3560
Definition Expression.h:3494
Definition CaptureScope.h:13
Definition SemanticClass.h:207
Definition SemanticClass.h:33
Definition DataDefinition.h:41
Definition Definition.h:131
Definition SemanticFunction.h:75
Definition SemanticScope.h:242
int32_t AllocateNextDefinitionOrdinal()
Definition SemanticScope.h:299
UE_API EIterateResult IterateRecurseLogicalScopes(const TFunction< EVisitResult(const CLogicalScope &)> &Functor) const
Iterates through all the logical scopes nested inside this scope.
Definition SemanticScope.cpp:810
SemanticRevision _CumulativeRevision
When anything in this class (methods, data members etc.) or its subclasses was last modified/deleted.
Definition SemanticScope.h:319
virtual UE_API ~CLogicalScope()
Definition SemanticScope.cpp:799
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
Definition SemanticScope.cpp:836
FilterClass * FindFirstDefinitionOfKind(const CSymbol &Name, EMemberOrigin Origin=EMemberOrigin::InheritedOrOriginal, const SQualifier &Qualifier=SQualifier::Unknown(), const CAstPackage *ContextPackage=nullptr, VisitStampType VisitStamp=GenerateNewVisitStamp()) const
Definition SemanticScope.h:345
TMap< CSymbol, SmallDefinitionArray > & GetDefinitionNameMap()
Definition SemanticScope.h:257
CLogicalScope(const CLogicalScope &)=delete
UE_API SQualifier AsQualifier() const
Definition SemanticScope.cpp:887
TFilteredDefinitionRange< FilterClass > GetDefinitionsOfKind() const
Definition SemanticScope.h:339
virtual UE_API void SetRevision(SemanticRevision Revision)
Definition SemanticScope.cpp:864
const TArray< TSRef< CDefinition > > & GetDefinitions() const
Definition SemanticScope.h:256
CLogicalScope(EKind Kind, CScope *Parent, CSemanticProgram &Program)
Definition SemanticScope.h:245
ULANG_FORCEINLINE bool TryMarkVisited(VisitStampType VisitStamp) const
Definition SemanticScope.h:283
CLogicalScope(CLogicalScope &&)=delete
void AddDefinitionToLogicalScope(TSRef< CDefinition > &&NewDefinition)
Definition SemanticScope.cpp:905
virtual const CLogicalScope * AsLogicalScopeNullable() const override
Iff this scope is a logical scope, return it a pointer to it. Otherwise, return null.
Definition SemanticScope.h:308
UE_API const CDefinition * FindOverrideFor(const CDefinition &Definition) const
Get the matching override definition in this class for the argument, if there is any.
Definition SemanticScope.cpp:875
virtual CLogicalScope * AsLogicalScopeNullable() override
Definition SemanticScope.h:309
SemanticRevision GetRevision() const
Definition SemanticScope.h:278
VisitStampType _LastVisitStamp
Definition SemanticScope.h:322
Definition SemanticProgram.h:150
Definition SemanticProgram.h:89
Definition SemanticScope.h:73
TSRef< CCaptureControlScope > CreateNestedCaptureControlScope()
Definition SemanticScope.cpp:549
UE_API SResolvedDefinitionArray ResolveDefinition(const CSymbol &Name, const SQualifier &Qualifier=SQualifier::Unknown(), const CAstPackage *ContextPackage=nullptr) const
Look for a definition in this scope and all parent scopes and aliases.
Definition SemanticScope.cpp:452
virtual UE_API ~CScope()
Definition SemanticScope.cpp:33
UE_API TSRef< CModuleAlias > CreateModuleAlias(const CSymbol Name)
Definition SemanticScope.cpp:404
UE_API const CModule * GetModule() const
Definition SemanticScope.cpp:158
virtual SAccessLevel GetDefaultDefinitionAccessLevel() const
Definition SemanticScope.h:103
UE_API TSRef< CTypeVariable > CreateTypeVariable(const CSymbol Name, const CTypeBase *NegativeType, const CTypeBase *PositiveType)
Definition SemanticScope.cpp:397
bool IsModuleOrSnippet() const
Definition SemanticScope.h:149
static UE_API const char * KindToCString(EKind Kind)
Definition SemanticScope.cpp:770
UE_API const CLogicalScope & GetLogicalScope() const
Get the innermost logical scope that is or contains this scope.
Definition SemanticScope.cpp:264
const TArray< const CDataDefinition * > & GetUsingInstances() const
Definition SemanticScope.h:174
friend class CSemanticAnalyzerImpl
Definition SemanticScope.h:201
UE_API CEnumeration & CreateEnumeration(const CSymbol &EnumerationName)
Definition SemanticScope.cpp:356
UE_API TSRef< CFunction > CreateFunction(const CSymbol FunctionName)
Definition SemanticScope.cpp:364
virtual void CreateNegativeDataDefinition(const CDataDefinition &PositiveDataDefinition) const
Definition SemanticScope.h:162
UE_API CAstPackage * GetPackage() const
Definition SemanticScope.cpp:189
CScope * _Parent
Definition SemanticScope.h:213
UE_API TSRef< CScopedAccessLevelDefinition > CreateScopedAccessLevelDefinition(TOptional< CSymbol > ClassName)
Definition SemanticScope.cpp:338
virtual const CDefinition * ScopeAsDefinition() const
Definition SemanticScope.h:101
UE_API bool CanAccessEpicInternal() const
Definition SemanticScope.cpp:764
TArray< const CLogicalScope * > _UsingScopes
Definition SemanticScope.h:219
UE_API CClassDefinition & CreateClass(const CSymbol &ClassName, CClass *Superclass=nullptr, TArray< CInterface * > &&SuperInterfaces={}, EStructOrClass StructOrClass=EStructOrClass::Class)
Definition SemanticScope.cpp:330
UE_API const CModulePart * GetModulePart() const
Definition SemanticScope.cpp:179
TArray< const CDataDefinition * > _UsingInstances
Definition SemanticScope.h:222
virtual void CreateNegativeFunction(const CFunction &PositiveFunction) const
Definition SemanticScope.h:159
ULANG_FORCEINLINE CSemanticProgram & GetProgram() const
Definition SemanticScope.h:121
ULANG_FORCEINLINE bool IsLogicalScope() const
Definition SemanticScope.h:134
void AddUsingScope(const CLogicalScope *UsingScope)
Definition SemanticScope.h:169
CScope(CScope &&)=delete
UE_API TSRef< CControlScope > CreateNestedControlScope()
Definition SemanticScope.cpp:543
UE_API bool IsInsideTypeScope() const
Definition SemanticScope.cpp:305
UE_API TSRef< CTypeAlias > CreateTypeAlias(const CSymbol Name)
Definition SemanticScope.cpp:390
UE_API bool IsSameOrChildOf(const CScope *Other) const
Definition SemanticScope.cpp:292
static UE_API void ResolvedDefnsAppend(SResolvedDefinitionArray *ResolvedDefns, const SmallDefinitionArray &Definitions)
Definition SemanticScope.cpp:434
ULANG_FORCEINLINE EKind GetKind() const
Definition SemanticScope.h:105
UE_API CInterface & CreateInterface(const CSymbol &InterfaceName, const TArray< CInterface * > &SuperInterfaces={})
Definition SemanticScope.cpp:348
CScope(const CScope &)=delete
const CLogicalScope * GetEnclosingClassOrInterface() const
Definition SemanticScope.h:136
const TArray< const CLogicalScope * > & GetUsingScopes() const
Definition SemanticScope.h:170
UE_API const TSPtr< CSymbolTable > & GetSymbols() const
Definition SemanticScope.cpp:248
UE_API const CScope & GetParametricTypeScope() const
If this is a parametric type, get the scope of those parameters; otherwise returns this scope.
Definition SemanticScope.cpp:253
EKind
Definition SemanticScope.h:76
virtual const CLogicalScope * AsLogicalScopeNullable() const
Iff this scope is a logical scope, return it a pointer to it. Otherwise, return null.
Definition SemanticScope.h:131
ULANG_FORCEINLINE CScope * GetParentScope() const
Definition SemanticScope.h:106
UE_API CAstCompilationUnit * GetCompilationUnit() const
Definition SemanticScope.cpp:205
UE_API CModule & CreateModule(const CSymbol &ModuleName)
Definition SemanticScope.cpp:321
UE_API CCaptureScope * GetCaptureScope()
Definition SemanticScope.cpp:238
virtual CLogicalScope * AsLogicalScopeNullable()
Definition SemanticScope.h:132
TSRefArray< CControlScope > _NestedControlScopes
Definition SemanticScope.h:225
UE_API CUTF8String GetScopePath(uLang::UTF8Char SeparatorChar='.', EPathMode Mode=EPathMode::Default) const
Definition SemanticScope.cpp:60
const TSRefArray< CControlScope > & GetNestedControlScopes() const
Definition SemanticScope.h:186
CSemanticProgram & _Program
Definition SemanticScope.h:216
CScope(EKind Kind, CScope *Parent, CSemanticProgram &Program)
Definition SemanticScope.h:92
ULANG_FORCEINLINE CLogicalScope & GetLogicalScope()
Definition SemanticScope.h:128
TSRefArray< CTypeScope > _NestedTypeScopes
Definition SemanticScope.h:228
UE_API const CSnippet * GetSnippet() const
Definition SemanticScope.cpp:211
UE_API CScope * GetScopeOfKind(EKind)
Definition SemanticScope.cpp:50
UE_API TSRef< CTypeScope > CreateNestedTypeScope()
Definition SemanticScope.cpp:556
UE_API bool IsAuthoredByEpic() const
Definition SemanticScope.cpp:753
UE_API bool CanAccess(const CDefinition &Definition, const SAccessLevel &DefinitionAccessLevel) const
Definition SemanticScope.cpp:652
virtual CSymbol GetScopeName() const =0
UE_API TSRef< CDataDefinition > CreateDataDefinition(const CSymbol VarName)
Definition SemanticScope.cpp:376
static UE_API VisitStampType GenerateNewVisitStamp()
Generates a new stamp id.
Definition SemanticScope.cpp:562
static UE_API void ResolvedDefnsAppendWithContext(SResolvedDefinitionArray *ResolvedDefns, const SmallDefinitionArray &Definitions, const CDataDefinition *Context)
Definition SemanticScope.cpp:443
UE_API const CDataDefinition * AddUsingInstance(const CDataDefinition *UsingContext)
Definition SemanticScope.cpp:411
EKind _Kind
Definition SemanticScope.h:210
bool IsControlScope() const
Definition SemanticScope.h:143
UE_API bool IsBuiltInScope() const
Definition SemanticScope.cpp:315
virtual const CTypeBase * ScopeAsType() const
Definition SemanticScope.h:100
Definition SemanticProgram.h:277
Definition SemanticProgram.h:179
Symbol representing a text string with an associated id.
Definition Symbol.h:98
Base class for all types.
Definition SemanticTypes.h:138
Definition Array.h:51
Filters a range of definitions to only include definitions of the kind corresponding to FilterClass.
Definition FilteredDefinitionRange.h:16
Definition Function.h:839
Definition Map.h:13
Definition SharedPointerArray.h:21
Definition SharedPointer.h:77
Definition VVMEngineEnvironment.h:23
EIterateResult
Iteration result returned from an iteration.
Definition Common.h:345
uint32_t VisitStampType
Used to mark scopes already visited during a search.
Definition VisitStamp.h:11
EStructOrClass
Definition StructOrClass.h:8
EPathMode
Definition SemanticScope.h:67
uint32_t SemanticRevision
For storing revisions of functions, classes etc.
Definition Revision.h:11
uint8_t UTF8Char
UTF-8 octet.
Definition Unicode.h:20
EVisitResult
Result returned from a visitor functor indicating how to continue or to quit early.
Definition Common.h:337
EMemberOrigin
Specifies whether to find only member definitions originating in the current type,...
Definition MemberOrigin.h:10
Definition VstNode.h:1131
TNodeType * AsNullable()
Definition VstNode.h:211
Definition AccessLevel.h:15
Information about a given qualifier.
Definition Definition.h:35
static SQualifier Unknown()
Definition Definition.h:81
Definition SemanticScope.h:54
SResolvedDefinition(CDefinition *Definition, const CDataDefinition *Context)
Definition SemanticScope.h:59
SResolvedDefinition(CDefinition *Definition)
Definition SemanticScope.h:58
CDefinition * _Definition
Definition SemanticScope.h:55
const CDataDefinition * _Context
Definition SemanticScope.h:56
Definition Optional.h:23